From patchwork Mon Mar 6 22:02:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162446 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 757F2C64EC4 for ; Mon, 6 Mar 2023 22:08:40 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwa-0006SC-7D; Mon, 06 Mar 2023 17:04:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwY-0006PN-3a for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:30 -0500 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwT-0006nv-Sr for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:29 -0500 Received: by mail-pl1-x629.google.com with SMTP id i10so12065717plr.9 for ; Mon, 06 Mar 2023 14:04:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140264; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=RWP/2kCpSB46CivaMD7MPcbRO0hHoZv0vKKzTF/veqA=; b=cBaKTPa5cpoLXucbCjWp1M8XnwS4DlbdHHXBNRVFxfjuju4ahJ7CpZwnjUKTcSxb4w cALmwzLPmbSd7lGrupOnIt3vkFHHhaxopNCFnLDNtziQsmw/6ossaUtxh4Kq64RGEyGe 751NId8uDtSNy1/X6/dmEDXbMWtSrutWaTJUQL05J3evWNS9967ktX/5D4G+AAFnQe8P 46kJ4RCIe/iq3Av38gdm8g7Bz+vrj4qORJqduLBfIoGIrYIZdpjgh+G64pjNgOD5sU3s QgCCRNmxWt3DAieDFbMWs75Mga3kDKN7f2RLD7l3CSbWc4tbPzDWU0wVPT+ywVgV3Iwa bNwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140264; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RWP/2kCpSB46CivaMD7MPcbRO0hHoZv0vKKzTF/veqA=; b=Uar+uzvhBJqco7NamxeXwBW8ewkAt9FE6/84u44kJtLY2YLeySKikt0FKcQx+jYgfV 3sHRwkNdpyookyt2ZkzSOlQf8xz0gVllz0kQansqGU5XKsn4Y/FN2f59Pf0WmdyVtaJM LzMFARIdJLWC4djO/kjPdcAOFPgB75EXUjYzVoGBylrK9xFvpYLJx2ys91NPBbP18e7J m5cJ0yk5VZFUQvii1sGqyRkMb6nXIwDQ1XM3FWkvoyMeOihj8kSzbygLrgkAKzdktdrZ m+XzgBUzca1Oyv14EEy9pHXsbqQXltE3sA/1LorDl7Aq1D0N1qP5e1d7SEbEEqQvKBcf heww== X-Gm-Message-State: AO0yUKXWVvIvObTSXLCoPBWXq0PKrBuyoUmmZ8nB3kIt0VFQvRMt7OFB AXrmkTqFLFEhTjdK+SF0OQjfpw== X-Google-Smtp-Source: AK7set/RejL/3XNrN+TVb3rzYDGTsRKz5Vp171NvN8ammBxfj750mvvOApNVrWGMsfXptu21y4MUyA== X-Received: by 2002:a05:6a20:8e28:b0:cd:7fcf:11a6 with SMTP id y40-20020a056a208e2800b000cd7fcf11a6mr12018828pzj.48.1678140264346; Mon, 06 Mar 2023 14:04:24 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id g9-20020aa78189000000b0061a942c8b62sm3565506pfi.43.2023.03.06.14.04.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:24 -0800 (PST) Subject: [PULL 01/22] target/riscv: implement Zicboz extension Date: Mon, 6 Mar 2023 14:02:38 -0800 Message-Id: <20230306220259.7748-2-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Christoph Muellner , Richard Henderson , Philipp Tomsich , Daniel Henrique Barboza , Weiwei Li , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::629; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x629.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Christoph Muellner The RISC-V base cache management operation (CBO) ISA extension has been ratified. It defines three extensions: Cache-Block Management, Cache-Block Prefetch and Cache-Block Zero. More information about the spec can be found at [1]. Let's start by implementing the Cache-Block Zero extension, Zicboz. It uses the cbo.zero instruction that, as with all CBO instructions that will be added later, needs to be implemented in an overlap group with the LQ instruction due to overlapping patterns. cbo.zero throws a Illegal Instruction/Virtual Instruction exception depending on CSR state. This is also the case for the remaining cbo instructions we're going to add next, so create a check_zicbo_envcfg() that will be used by all Zicbo[mz] instructions. [1] https://github.com/riscv/riscv-CMOs/blob/master/specifications/cmobase-v1.0.1.pdf Reviewed-by: Richard Henderson Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Reviewed-by: Weiwei Li Message-ID: <20230224132536.552293-3-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 4 ++ target/riscv/cpu.h | 2 + target/riscv/helper.h | 3 + target/riscv/insn32.decode | 10 ++- target/riscv/insn_trans/trans_rvzicbo.c.inc | 30 +++++++++ target/riscv/op_helper.c | 68 +++++++++++++++++++++ target/riscv/translate.c | 1 + 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 target/riscv/insn_trans/trans_rvzicbo.c.inc diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 5bc0005cc7..ab6c127859 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -75,6 +75,7 @@ struct isa_ext_data { static const struct isa_ext_data isa_edata_arr[] = { ISA_EXT_DATA_ENTRY(h, false, PRIV_VERSION_1_12_0, ext_h), ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_10_0, ext_v), + ISA_EXT_DATA_ENTRY(zicboz, true, PRIV_VERSION_1_12_0, ext_icboz), ISA_EXT_DATA_ENTRY(zicond, true, PRIV_VERSION_1_12_0, ext_zicond), ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr), ISA_EXT_DATA_ENTRY(zifencei, true, PRIV_VERSION_1_10_0, ext_ifencei), @@ -1167,6 +1168,9 @@ static Property riscv_cpu_extensions[] = { DEFINE_PROP_BOOL("zhinx", RISCVCPU, cfg.ext_zhinx, false), DEFINE_PROP_BOOL("zhinxmin", RISCVCPU, cfg.ext_zhinxmin, false), + DEFINE_PROP_BOOL("zicboz", RISCVCPU, cfg.ext_icboz, true), + DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), + DEFINE_PROP_BOOL("zmmul", RISCVCPU, cfg.ext_zmmul, false), /* Vendor-specific custom extensions */ diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 665b4c60b0..73c9832fb7 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -434,6 +434,7 @@ struct RISCVCPUConfig { bool ext_zkt; bool ext_ifencei; bool ext_icsr; + bool ext_icboz; bool ext_zicond; bool ext_zihintpause; bool ext_smstateen; @@ -486,6 +487,7 @@ struct RISCVCPUConfig { char *vext_spec; uint16_t vlen; uint16_t elen; + uint16_t cboz_blocksize; bool mmu; bool pmp; bool epmp; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index 0497370afd..ce165821b8 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -97,6 +97,9 @@ DEF_HELPER_FLAGS_2(fcvt_h_l, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fcvt_h_lu, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fclass_h, TCG_CALL_NO_RWG_SE, tl, env, i64) +/* Cache-block operations */ +DEF_HELPER_2(cbo_zero, void, env, tl) + /* Special functions */ DEF_HELPER_2(csrr, tl, env, int) DEF_HELPER_3(csrw, void, env, int, tl) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index fb537e922e..a471adcea0 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -179,7 +179,15 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r # *** RV128I Base Instruction Set (in addition to RV64I) *** ldu ............ ..... 111 ..... 0000011 @i -lq ............ ..... 010 ..... 0001111 @i +{ + [ + # *** RV32 Zicboz Standard Extension *** + cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm + ] + + # *** RVI128 lq *** + lq ............ ..... 010 ..... 0001111 @i +} sq ............ ..... 100 ..... 0100011 @s addid ............ ..... 000 ..... 1011011 @i sllid 000000 ...... ..... 001 ..... 1011011 @sh6 diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/insn_trans/trans_rvzicbo.c.inc new file mode 100644 index 0000000000..feabc28342 --- /dev/null +++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc @@ -0,0 +1,30 @@ +/* + * RISC-V translation routines for the RISC-V CBO Extension. + * + * Copyright (c) 2021 Philipp Tomsich, philipp.tomsich@vrull.eu + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2 or later, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#define REQUIRE_ZICBOZ(ctx) do { \ + if (!ctx->cfg_ptr->ext_icboz) { \ + return false; \ + } \ +} while (0) + +static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a) +{ + REQUIRE_ZICBOZ(ctx); + gen_helper_cbo_zero(cpu_env, cpu_gpr[a->rs1]); + return true; +} diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index 9c0b91c88f..d0217b6a98 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -3,6 +3,7 @@ * * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu * Copyright (c) 2017-2018 SiFive, Inc. + * Copyright (c) 2022 VRULL GmbH * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -123,6 +124,73 @@ target_ulong helper_csrrw_i128(CPURISCVState *env, int csr, return int128_getlo(rv); } + +/* + * check_zicbo_envcfg + * + * Raise virtual exceptions and illegal instruction exceptions for + * Zicbo[mz] instructions based on the settings of [mhs]envcfg as + * specified in section 2.5.1 of the CMO specification. + */ +static void check_zicbo_envcfg(CPURISCVState *env, target_ulong envbits, + uintptr_t ra) +{ +#ifndef CONFIG_USER_ONLY + if ((env->priv < PRV_M) && !get_field(env->menvcfg, envbits)) { + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + } + + if (riscv_cpu_virt_enabled(env) && + (((env->priv < PRV_H) && !get_field(env->henvcfg, envbits)) || + ((env->priv < PRV_S) && !get_field(env->senvcfg, envbits)))) { + riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, ra); + } + + if ((env->priv < PRV_S) && !get_field(env->senvcfg, envbits)) { + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + } +#endif +} + +void helper_cbo_zero(CPURISCVState *env, target_ulong address) +{ + RISCVCPU *cpu = env_archcpu(env); + uint16_t cbozlen = cpu->cfg.cboz_blocksize; + int mmu_idx = cpu_mmu_index(env, false); + uintptr_t ra = GETPC(); + void *mem; + + check_zicbo_envcfg(env, MENVCFG_CBZE, ra); + + /* Mask off low-bits to align-down to the cache-block. */ + address &= ~(cbozlen - 1); + + /* + * cbo.zero requires MMU_DATA_STORE access. Do a probe_write() + * to raise any exceptions, including PMP. + */ + mem = probe_write(env, address, cbozlen, mmu_idx, ra); + + if (likely(mem)) { + memset(mem, 0, cbozlen); + } else { + /* + * This means that we're dealing with an I/O page. Section 4.2 + * of cmobase v1.0.1 says: + * + * "Cache-block zero instructions store zeros independently + * of whether data from the underlying memory locations are + * cacheable." + * + * Write zeros in address + cbozlen regardless of not being + * a RAM page. + */ + for (int i = 0; i < cbozlen; i++) { + cpu_stb_mmuidx_ra(env, address + i, 0, mmu_idx, ra); + } + } +} + #ifndef CONFIG_USER_ONLY target_ulong helper_sret(CPURISCVState *env) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index a8d516ca3e..fa8bd79cef 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -1105,6 +1105,7 @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc) #include "insn_trans/trans_rvb.c.inc" #include "insn_trans/trans_rvzicond.c.inc" #include "insn_trans/trans_rvzawrs.c.inc" +#include "insn_trans/trans_rvzicbo.c.inc" #include "insn_trans/trans_rvzfh.c.inc" #include "insn_trans/trans_rvk.c.inc" #include "insn_trans/trans_privileged.c.inc" From patchwork Mon Mar 6 22:02:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162430 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 506D9C61DA4 for ; Mon, 6 Mar 2023 22:06:36 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwb-0006Tr-MB; Mon, 06 Mar 2023 17:04:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwY-0006Pe-2S for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:30 -0500 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwV-0006o4-FR for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:29 -0500 Received: by mail-pj1-x1029.google.com with SMTP id cp7-20020a17090afb8700b0023756229427so14632429pjb.1 for ; Mon, 06 Mar 2023 14:04:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140266; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=US+5OoBQkoCZJIuGPRy29aaMfRBm+JA5f0rSBQf0uH4=; b=BjOJzGXu/rIgaEHRCk+bCaGJCT+XTrPfMsbe3ibARoqtv8jmkBdSjY1QM/zwGHkiCd 0Scx4hSKRDCx1MDmKniziq0/MZI7/YZMNFhmNaMijHVuBLtrvdNYqw1bcoXWsGvWIZI1 w4QXCTQn2uSXe+E6B/Tufd7BUJv7y6X3RB3pUDHAVLSwhpjZoX+cUuknZDJrQaqm33n8 uLzpTuQ/HY1WbIi1yFBKtrK8rMWru46YIFLPqz+zGlfRW/sgA0uwQGju124D/T/niTgK WRwIxNI8gCn7DiTixJCltYocX33mUMnawDhPdGmRkw8+GMZvoqm7cGW7l6snpH7veUyd ENEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140266; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=US+5OoBQkoCZJIuGPRy29aaMfRBm+JA5f0rSBQf0uH4=; b=RGzRY539jclJ8wV33FP6wmGt1cS8Idyd4Qgd8IEo7FjvEsgtXLUPij3ZEMda7Gl4hX +0S8Jwv2/KwchPxJwe5+Mta49l2gbMgJJvqg6Ir/MfC8SjNsCCXLyb7Pc5MTXxJmPuhn fmq5CpKfyDd7fk+DUOa/c8Z9mwhJH8CLG6+akHREU92Tb8CI7j5Rx8l7XmbYjxLhth4I Qykyl7j5XCKgBaLwakolv4xJpWvYJo/0U02zB0OA7b6ClUrGUij5J/wqsvnoFL70YWhs hW4qFj9aW2Y5g+qO9keHY5u1JF+iphE+S878Sma3/UF7OqK06Lxsnuomu+Ztzy5p0O/4 /OcA== X-Gm-Message-State: AO0yUKX/IDyEL9A0fqaKFutXexKZmlcU6sT02jshZkYMzRjFhO3MUuh0 7qLoGux9UbvOGgojx/8DWm4gjQ== X-Google-Smtp-Source: AK7set9uR6zM2X4wDaDrTH3akPANfHnQpsbY28jWjnrA0tswnA/tyEdE5e5po4ZJ9tNr/Ocubs92KQ== X-Received: by 2002:a17:903:1c9:b0:19e:6fd5:f4fa with SMTP id e9-20020a17090301c900b0019e6fd5f4famr12423835plh.69.1678140265493; Mon, 06 Mar 2023 14:04:25 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id km11-20020a17090327cb00b0019a75ea08e5sm7202627plb.33.2023.03.06.14.04.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:25 -0800 (PST) Subject: [PULL 02/22] target/riscv: implement Zicbom extension Date: Mon, 6 Mar 2023 14:02:39 -0800 Message-Id: <20230306220259.7748-3-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Christoph Muellner , Richard Henderson , Weiwei Li , Philipp Tomsich , Daniel Henrique Barboza , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1029.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Christoph Muellner Zicbom is the Cache-Block Management extension defined in the already ratified RISC-V Base Cache Management Operation (CBO) ISA extension [1]. The extension contains three instructions: cbo.clean, cbo.flush and cbo.inval. All of them must be implemented in the same group as LQ and cbo.zero due to overlapping patterns. All these instructions can throw a Illegal Instruction/Virtual Instruction exception, similar to the existing cbo.zero. The same check_zicbo_envcfg() is used to handle these exceptions. Aside from that, these instructions also need to handle page faults and guest page faults. This is done in a new check_zicbom_access() helper. As with Zicboz, the cache block size for Zicbom is also configurable. Note that the spec determines that Zicbo[mp] and Zicboz can have different cache sizes (Section 2.7 of [1]), so we also include a 'cbom_blocksize' to go along with the existing 'cboz_blocksize'. They are set to the same size, so unless users want to play around with the settings both sizes will be the same. [1] https://github.com/riscv/riscv-CMOs/blob/master/specifications/cmobase-v1.0.1.pdf Reviewed-by: Richard Henderson Reviewed-by: Weiwei Li Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Message-ID: <20230224132536.552293-4-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 3 + target/riscv/cpu.h | 2 + target/riscv/helper.h | 2 + target/riscv/insn32.decode | 5 ++ target/riscv/insn_trans/trans_rvzicbo.c.inc | 27 +++++++++ target/riscv/op_helper.c | 67 +++++++++++++++++++++ 6 files changed, 106 insertions(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index ab6c127859..3e8f21a47d 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -75,6 +75,7 @@ struct isa_ext_data { static const struct isa_ext_data isa_edata_arr[] = { ISA_EXT_DATA_ENTRY(h, false, PRIV_VERSION_1_12_0, ext_h), ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_10_0, ext_v), + ISA_EXT_DATA_ENTRY(zicbom, true, PRIV_VERSION_1_12_0, ext_icbom), ISA_EXT_DATA_ENTRY(zicboz, true, PRIV_VERSION_1_12_0, ext_icboz), ISA_EXT_DATA_ENTRY(zicond, true, PRIV_VERSION_1_12_0, ext_zicond), ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr), @@ -1168,6 +1169,8 @@ static Property riscv_cpu_extensions[] = { DEFINE_PROP_BOOL("zhinx", RISCVCPU, cfg.ext_zhinx, false), DEFINE_PROP_BOOL("zhinxmin", RISCVCPU, cfg.ext_zhinxmin, false), + DEFINE_PROP_BOOL("zicbom", RISCVCPU, cfg.ext_icbom, true), + DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64), DEFINE_PROP_BOOL("zicboz", RISCVCPU, cfg.ext_icboz, true), DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 73c9832fb7..b5b5425b99 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -434,6 +434,7 @@ struct RISCVCPUConfig { bool ext_zkt; bool ext_ifencei; bool ext_icsr; + bool ext_icbom; bool ext_icboz; bool ext_zicond; bool ext_zihintpause; @@ -487,6 +488,7 @@ struct RISCVCPUConfig { char *vext_spec; uint16_t vlen; uint16_t elen; + uint16_t cbom_blocksize; uint16_t cboz_blocksize; bool mmu; bool pmp; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index ce165821b8..37b54e0991 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -98,6 +98,8 @@ DEF_HELPER_FLAGS_2(fcvt_h_lu, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fclass_h, TCG_CALL_NO_RWG_SE, tl, env, i64) /* Cache-block operations */ +DEF_HELPER_2(cbo_clean_flush, void, env, tl) +DEF_HELPER_2(cbo_inval, void, env, tl) DEF_HELPER_2(cbo_zero, void, env, tl) /* Special functions */ diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index a471adcea0..282e41aa3e 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -181,6 +181,11 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r ldu ............ ..... 111 ..... 0000011 @i { [ + # *** RV32 Zicbom Standard Extension *** + cbo_clean 0000000 00001 ..... 010 00000 0001111 @sfence_vm + cbo_flush 0000000 00010 ..... 010 00000 0001111 @sfence_vm + cbo_inval 0000000 00000 ..... 010 00000 0001111 @sfence_vm + # *** RV32 Zicboz Standard Extension *** cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm ] diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/insn_trans/trans_rvzicbo.c.inc index feabc28342..7df9c30b58 100644 --- a/target/riscv/insn_trans/trans_rvzicbo.c.inc +++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc @@ -16,12 +16,39 @@ * this program. If not, see . */ +#define REQUIRE_ZICBOM(ctx) do { \ + if (!ctx->cfg_ptr->ext_icbom) { \ + return false; \ + } \ +} while (0) + #define REQUIRE_ZICBOZ(ctx) do { \ if (!ctx->cfg_ptr->ext_icboz) { \ return false; \ } \ } while (0) +static bool trans_cbo_clean(DisasContext *ctx, arg_cbo_clean *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_clean_flush(cpu_env, cpu_gpr[a->rs1]); + return true; +} + +static bool trans_cbo_flush(DisasContext *ctx, arg_cbo_flush *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_clean_flush(cpu_env, cpu_gpr[a->rs1]); + return true; +} + +static bool trans_cbo_inval(DisasContext *ctx, arg_cbo_inval *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_inval(cpu_env, cpu_gpr[a->rs1]); + return true; +} + static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a) { REQUIRE_ZICBOZ(ctx); diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index d0217b6a98..84ee018f7d 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -191,6 +191,73 @@ void helper_cbo_zero(CPURISCVState *env, target_ulong address) } } +/* + * check_zicbom_access + * + * Check access permissions (LOAD, STORE or FETCH as specified in + * section 2.5.2 of the CMO specification) for Zicbom, raising + * either store page-fault (non-virtualized) or store guest-page + * fault (virtualized). + */ +static void check_zicbom_access(CPURISCVState *env, + target_ulong address, + uintptr_t ra) +{ + RISCVCPU *cpu = env_archcpu(env); + int mmu_idx = cpu_mmu_index(env, false); + uint16_t cbomlen = cpu->cfg.cbom_blocksize; + void *phost; + int ret; + + /* Mask off low-bits to align-down to the cache-block. */ + address &= ~(cbomlen - 1); + + /* + * Section 2.5.2 of cmobase v1.0.1: + * + * "A cache-block management instruction is permitted to + * access the specified cache block whenever a load instruction + * or store instruction is permitted to access the corresponding + * physical addresses. If neither a load instruction nor store + * instruction is permitted to access the physical addresses, + * but an instruction fetch is permitted to access the physical + * addresses, whether a cache-block management instruction is + * permitted to access the cache block is UNSPECIFIED." + */ + ret = probe_access_flags(env, address, cbomlen, MMU_DATA_LOAD, + mmu_idx, true, &phost, ra); + if (ret != TLB_INVALID_MASK) { + /* Success: readable */ + return; + } + + /* + * Since not readable, must be writable. On failure, store + * fault/store guest amo fault will be raised by + * riscv_cpu_tlb_fill(). PMP exceptions will be caught + * there as well. + */ + probe_write(env, address, cbomlen, mmu_idx, ra); +} + +void helper_cbo_clean_flush(CPURISCVState *env, target_ulong address) +{ + uintptr_t ra = GETPC(); + check_zicbo_envcfg(env, MENVCFG_CBCFE, ra); + check_zicbom_access(env, address, ra); + + /* We don't emulate the cache-hierarchy, so we're done. */ +} + +void helper_cbo_inval(CPURISCVState *env, target_ulong address) +{ + uintptr_t ra = GETPC(); + check_zicbo_envcfg(env, MENVCFG_CBIE, ra); + check_zicbom_access(env, address, ra); + + /* We don't emulate the cache-hierarchy, so we're done. */ +} + #ifndef CONFIG_USER_ONLY target_ulong helper_sret(CPURISCVState *env) From patchwork Mon Mar 6 22:02:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162445 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 826BBC6FD1A for ; Mon, 6 Mar 2023 22:08:40 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwa-0006Sp-RV; Mon, 06 Mar 2023 17:04:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwZ-0006R9-2z for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:31 -0500 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwW-0006oH-Co for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:30 -0500 Received: by mail-pj1-x1029.google.com with SMTP id y2so11289860pjg.3 for ; Mon, 06 Mar 2023 14:04:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140267; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=od8NCbufkDb5gUqPx2kp94RSNhCnehuQbOwnqQsEv5c=; b=dNHEcIrcpv20IqHbf70FgXLFMcGeYA+JY/7Wv5JwbYg0CWgUoNHA0+5tOMcWZRwZJp cSlJNmNliaEFjUC5itm0utbXLuLwEOj3nM0VqpsdHYLw/BzrPa7nCSNgahZ8oBS7DtPU aVt6K897tXkuiWOgINXpFZ2YtBz8A5hy2eZj3avriVP0MNdZMn7uafCtm/LHSGCIF2pv jr2m404+a+g/AhwPzJuNqr0Jwx47hMa/SUd+L8fBCBEkqI82TjLSDjHoMzGShgN31MrS ZN+m/mcESjDQgpzyLU83KpXVs879pKkAtgQS8mogpUfBiF/HeoCLm+pf2/QzKV0DzrYS z7tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140267; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=od8NCbufkDb5gUqPx2kp94RSNhCnehuQbOwnqQsEv5c=; b=cKza+bx6j6oC/pTKsWFywvw41u1whV/RJRli7D5YxPwUVfXVuJ1prEHvx4Cji56yvW X8d0eiud9Ur0JVpUIsj8R668lEIV05Dij2qHrAVx1g5OEjKbGM4hdN/p+VxAOxKAV5+O jNdrby67AN5sy4CSZgtCJTfIATWg3LzlSNJfkp38g5Bipu8/qdJHyEvG/pEICSs11L3D DKzAqji4xkSeMQa/IjiVBmu7Ye8AoyDusDVdPJqjzU6sSMIn6+lhpe7tP5C1EpR7/u/o PrzzQWg+ydDY4ZCndnQDMBlzrYBBn5VWREe779xLtDI9PamzydIWdU4RSpn8x1fiCEhA Vfjw== X-Gm-Message-State: AO0yUKWzLQFX/ifgzkqSrFcXvVQYAHpr+3pC/E+i55E/MG99wxvj7aHa vVJskZ/rNfTaCKU4Uw1sMeMIow== X-Google-Smtp-Source: AK7set+QgAnraCJACFnueJZsEjK2HU7JR9QMn6lzDxiVB1DAMmcEz4XZLBg17zSrcTGqiwmcJvm3vw== X-Received: by 2002:a17:902:dac8:b0:19a:9833:6f8 with SMTP id q8-20020a170902dac800b0019a983306f8mr15538080plx.35.1678140266871; Mon, 06 Mar 2023 14:04:26 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id p4-20020a170902780400b00192b23b8451sm7101574pll.108.2023.03.06.14.04.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:26 -0800 (PST) Subject: [PULL 03/22] target/riscv: add Zicbop cbo.prefetch{i, r, m} placeholder Date: Mon, 6 Mar 2023 14:02:40 -0800 Message-Id: <20230306220259.7748-4-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Christoph Muellner , Philipp Tomsich , Daniel Henrique Barboza , Richard Henderson , Weiwei Li , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1029.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Christoph Muellner The cmo.prefetch instructions are nops for QEMU (no emulation of the memory hierarchy, no illegal instructions, no permission faults, no traps). Add a comment noting where they would be decoded in case cbo.prefetch instructions become relevant in the future. Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Reviewed-by: Richard Henderson Reviewed-by: Weiwei Li Message-ID: <20230224132536.552293-5-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/insn32.decode | 1 + 1 file changed, 1 insertion(+) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 282e41aa3e..73d5d1b045 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -134,6 +134,7 @@ addi ............ ..... 000 ..... 0010011 @i slti ............ ..... 010 ..... 0010011 @i sltiu ............ ..... 011 ..... 0010011 @i xori ............ ..... 100 ..... 0010011 @i +# cbo.prefetch_{i,r,m} instructions are ori with rd=x0 and not decoded. ori ............ ..... 110 ..... 0010011 @i andi ............ ..... 111 ..... 0010011 @i slli 00000. ...... ..... 001 ..... 0010011 @sh From patchwork Mon Mar 6 22:02:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162439 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D40B2C64EC4 for ; Mon, 6 Mar 2023 22:07:51 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwd-0006Vl-Us; Mon, 06 Mar 2023 17:04:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwa-0006Sh-LU for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:32 -0500 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwX-0006of-AS for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:32 -0500 Received: by mail-pl1-x62d.google.com with SMTP id n6so12091252plf.5 for ; Mon, 06 Mar 2023 14:04:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140268; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=QloEwsr5BkemagEysCPfIB5DRHvIdaBMSjfI8BNJNQg=; b=ZnT0yRfLG2VAHrCgmtFMMrLB1ReFBo3enBxLnW2Ds8rubKYE83CCoNidh6IYzOCNmO QUxQ99JMuveCM0KZnqP1zRIYOE/fH59rF9vb4ska8j0tnr5XaUmY6tX6cs+TNlV92Bzb drGE33d4iGKuULOvhZ5J7A3hEoOxVNyGmnw7xTKTKd1H5oY7fy6ZrGNTDTTR4C4pzUiD XhYITs4NSIWMM1Vv/Aahs58WXFilPkwI6KpzJfiteD/0QRrMS1LDGk87FsZK9QK8CGTr G7r1fiOH96kYICsJBJFy5ZT81sDoDivlZodSWJQaEe3sSf9Dph04wHlghRTBh06Yo0LS 22lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140268; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QloEwsr5BkemagEysCPfIB5DRHvIdaBMSjfI8BNJNQg=; b=R7q35W+yQle7Ki/B3VvT3TBdYbGZTvfQ+jM2Snrb59qi6PZ9ARDKic4qH1ZKCWakfM mKIgNZNp9RVlmx6HmskMvnREz/Kof5YaJ5eTbh+gTG2I4OcI2v+j2jrJY/RKzNn1hQNx mNSVK+wt6qOp8uNoYRI85Os64Nm1upMcArAct6MiBFJesZ2geTZ64k5tf1AZtnZa9Oh1 NzGMOSqhJHE1dZfsO9psEgY/joajwY+/Pss9gTCTzKt8jHFnr3KBQA6Uu2T1v6D3DcKR jcJq7cTDcYvgJ9uHLx8rNHAamEmFKUfXVdDtsZKIRzjhjkeuOi+dAILO9qyX3Fu0Lnfh KcPQ== X-Gm-Message-State: AO0yUKVdWqg0AEb6n9VSeiOqs5+LNolxyA3+KvwJ933ljQO2SDfRwBj+ +s+d6j0mV0R9ds/wCICdNLgtyQ== X-Google-Smtp-Source: AK7set8hGRfwLg4elq/ztg+OqJDi5YdHmKsUIndBuz4qFZcnz1FZceVxgHNd/MvF6gxOHz6kKfIgiw== X-Received: by 2002:a17:903:2788:b0:19e:78b7:2f4e with SMTP id jw8-20020a170903278800b0019e78b72f4emr10942791plb.46.1678140267949; Mon, 06 Mar 2023 14:04:27 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id ky14-20020a170902f98e00b0019ee042602bsm56661plb.92.2023.03.06.14.04.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:27 -0800 (PST) Subject: [PULL 04/22] hw/riscv/virt.c: add cbo[mz]-block-size fdt properties Date: Mon, 6 Mar 2023 14:02:41 -0800 Message-Id: <20230306220259.7748-5-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Anup Patel , Andrew Jones , Daniel Henrique Barboza , Bin Meng , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Anup Patel The cbom-block-size fdt property property is used to inform the OS about the blocksize in bytes for the Zicbom cache operations. Linux documents it in Documentation/devicetree/bindings/riscv/cpus.yaml as: riscv,cbom-block-size: $ref: /schemas/types.yaml#/definitions/uint32 description: The blocksize in bytes for the Zicbom cache operations. cboz-block-size has the same role but for the Zicboz extension, i.e. informs the size in bytes for Zicboz cache operations. Linux support for it is under review/approval in [1]. Patch 3 of that series describes cboz-block-size as: riscv,cboz-block-size: $ref: /schemas/types.yaml#/definitions/uint32 description: The blocksize in bytes for the Zicboz cache operations. [1] https://lore.kernel.org/all/20230224162631.405473-1-ajones@ventanamicro.com/ Cc: Andrew Jones Signed-off-by: Anup Patel Signed-off-by: Daniel Henrique Barboza Reviewed-by: Bin Meng Message-ID: <20230302091406.407824-2-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 4f8191860b..7f70fa11a1 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -249,6 +249,17 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket, name = riscv_isa_string(cpu_ptr); qemu_fdt_setprop_string(ms->fdt, cpu_name, "riscv,isa", name); g_free(name); + + if (cpu_ptr->cfg.ext_icbom) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbom-block-size", + cpu_ptr->cfg.cbom_blocksize); + } + + if (cpu_ptr->cfg.ext_icboz) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cboz-block-size", + cpu_ptr->cfg.cboz_blocksize); + } + qemu_fdt_setprop_string(ms->fdt, cpu_name, "compatible", "riscv"); qemu_fdt_setprop_string(ms->fdt, cpu_name, "status", "okay"); qemu_fdt_setprop_cell(ms->fdt, cpu_name, "reg", From patchwork Mon Mar 6 22:02:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162433 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 62BADC6FD1B for ; Mon, 6 Mar 2023 22:07:05 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwc-0006UV-Hy; Mon, 06 Mar 2023 17:04:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwa-0006SE-54 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:32 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwY-0006oz-FZ for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:31 -0500 Received: by mail-pl1-x62a.google.com with SMTP id p20so12036783plw.13 for ; Mon, 06 Mar 2023 14:04:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140269; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=w2GsuBqezAObm8K6pvzmGWqlGyI6qx54Ha8z5VsFlJI=; b=XF6aVZiFaDSCfpv5i6wpSJrbo1wnAk4Lg/YKTGAvUNFcnLLFpgYn9j44C25MAnRuKX 8KCV+rP2Z97dav/lxzZBLrcCwGWto0kC0i/0wZURYB2Qw5trGhIKMBDqeaO3n6KXmsUp pgbKlJ3X5AQ20+tBo0tO5XWp5Tuj9ZiQgW8JuXX7mqug/umxWE4VE6mowBEpJhJYTyJT IafQ5KHov2DSR3kj2kQLLJUhV6mp7N5EKqMIsuza4PPX9S8pEK0UmOKxFk+u7E0Bwl/s jeI7/JYSX+/4um8n6GfhQOcV/1Yf/VvyfcfXKYcFxcUevlaytfUbdAlad1IBnHS8MzZB M8OQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140269; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=w2GsuBqezAObm8K6pvzmGWqlGyI6qx54Ha8z5VsFlJI=; b=XSER1KA3GQitwrdk0VtrpdClhjxVCaH/ddJKyzioDyKNuUOWJXqPphmDcl1WcVvIkU vIkIZVkq5UFDVz4QcU61Vyjx9aCH8QicdJKbNpuoOa7M6SCI+6hxq70+pJ/t81YTujMa +7Va8E4JhN2/5QedIMNk4cbcx09j9ex63j/sfJHXYMagVGroMbQ7cw1JSgeGyQjifsPh w1uEl+1YBNbdS+vuDHGZp1yM7rPO5HAcN25oxwKI6nXcQF867YYsd9STCL6ANMFwW6+r zpmYbjCW2TY0n3Rk7E6Ksg8BBjJvmsdXRWOPslLxEayh4qZDMFqEFaBhmhvqg7bNnnBH FO5g== X-Gm-Message-State: AO0yUKWcGv+q2z+0XgVgqf6Fx2DUksPV7YpapOwhir2BW2/YF262n0fa I+6TTQb60hNc25X1xrYiAM7T+w== X-Google-Smtp-Source: AK7set86m3SSi3ZuVxAuZrx9wDlNf0KSiK8B16jm2xwyheb+OYFz3XtHidI/Gt1Fudk4Kp6TCPeDAA== X-Received: by 2002:a17:90a:e7c6:b0:234:8950:6d1f with SMTP id kb6-20020a17090ae7c600b0023489506d1fmr13217071pjb.11.1678140269144; Mon, 06 Mar 2023 14:04:29 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id h9-20020a17090acf0900b00219752c8ea5sm6336914pju.37.2023.03.06.14.04.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:28 -0800 (PST) Subject: [PULL 05/22] disas/riscv Fix ctzw disassemble Date: Mon, 6 Mar 2023 14:02:42 -0800 Message-Id: <20230306220259.7748-6-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Ivan Klokov , Weiwei Li , Daniel Henrique Barboza , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62a; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Ivan Klokov Due to typo in opcode list, ctzw is disassembled as clzw instruction. Signed-off-by: Ivan Klokov Fixes: 02c1b569a15b ("disas/riscv: Add Zb[abcs] instructions") Reviewed-by: Weiwei Li Reviewed-by: Daniel Henrique Barboza Message-ID: <20230217151459.54649-1-ivan.klokov@syntacore.com> Signed-off-by: Palmer Dabbelt --- disas/riscv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/disas/riscv.c b/disas/riscv.c index ddda687c13..54455aaaa8 100644 --- a/disas/riscv.c +++ b/disas/riscv.c @@ -1645,7 +1645,7 @@ const rv_opcode_data opcode_data[] = { { "max", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 }, { "maxu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 }, { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, - { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, + { "ctzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, { "cpopw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, { "slli.uw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 }, { "add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 }, From patchwork Mon Mar 6 22:02:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162424 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CE860C61DA4 for ; Mon, 6 Mar 2023 22:05:06 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwc-0006UT-AN; Mon, 06 Mar 2023 17:04:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwb-0006TI-2N for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:33 -0500 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwZ-0006pS-Gh for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:32 -0500 Received: by mail-pj1-x1029.google.com with SMTP id bo22so11289171pjb.4 for ; Mon, 06 Mar 2023 14:04:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140270; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=KiJB/Wjm1656LF+Iv/fNcQLwW8gCy5nvZ76GiHAmyoM=; b=psBqCLXNc1orSAcLWeyzFe70VmPToSPCdESCoYy37Yr24ewU2u9bjYr3iM2Bgz6OjQ ycvNVXuBDcwH+IhVvkpbclOP8dAIPCGVoyKqMQ5q2KrSvoykhrXHsZ3YYr6sr+aXSqq3 bKN09IrHZ3kwTq9lYXAtDbB0U19t7BbU1J1i7sLhaHAdRHknMwHUfAO83D+KuLhPIKVe UKFnonJjlPYlsCC7JAB94J/4aLyQKWfiNyrtVtA1X8AMw9TdhF2eUqJIehF+w1HYmF8q LQqNB+PPfngo030Rjit4oONEStHOMHTFY5487bTHafZ+UuJm4/CoKi9/hYwbHKuglv58 CZXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140270; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KiJB/Wjm1656LF+Iv/fNcQLwW8gCy5nvZ76GiHAmyoM=; b=bDSSTmvrrf8z8BCnhPj1+4FXAEzrqfXshCH2nq04Lx/fMLYl9xARzzB+1DvZDvak9g kWPFKSGHVtXupSDxrMHmQvBR5ZyUFv28tQjr2FnGCp6ExZ+z0M4d+sOihBEpLwhlMX5I rLlYYP7o856c1F3gxdR7xOUO2GLFCjWtjX1KSeigXBM/kmwT7v6Sr6p2adbb9bDh021W lkorSE+jHfDUBMtdeWi2AtxZ1bhPgYB6BSX/ufG8jclGJLHMR4pdqM+WfSskf0OuxLyw S6eI6+dDlLH1B9+qn54XyqEeZAKDQsxfnZ9f1sygllYaUDqAjZOGDldZu7jHHJiJqBHM OTFA== X-Gm-Message-State: AO0yUKVE1GFEEARe8UjjatQInxQ5mHm9OEDYnROpOAy0oGH/Uo7X/yJa AO5qLbBWkyurAUcQAN39M10nnU7Z4oJzDKynnaQ= X-Google-Smtp-Source: AK7set9Y18aPr7HqX1C2SCqTId+HMlMsrXq4ceZ5hsB4XFE7o9PFNFczJgHxu6QE4V/3XmJmnQCk9w== X-Received: by 2002:a17:90b:4c48:b0:23a:cded:5f3 with SMTP id np8-20020a17090b4c4800b0023acded05f3mr1887492pjb.49.1678140270313; Mon, 06 Mar 2023 14:04:30 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id t19-20020a17090a951300b002367325203fsm8149021pjo.50.2023.03.06.14.04.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:29 -0800 (PST) Subject: [PULL 06/22] target/riscv: cpu: Implement get_arch_id callback Date: Mon, 6 Mar 2023 14:02:43 -0800 Message-Id: <20230306220259.7748-7-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Mayuresh Chitale , Anup Patel , Daniel Henrique Barboza , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1029.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Mayuresh Chitale Implement the callback for getting the architecture-dependent CPU ID ie mhartid. Signed-off-by: Mayuresh Chitale Signed-off-by: Anup Patel Reviewed-by: Daniel Henrique Barboza Message-ID: <20230303065055.915652-2-mchitale@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 3e8f21a47d..0ad8f94a42 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -1301,6 +1301,13 @@ static const char *riscv_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname) } #ifndef CONFIG_USER_ONLY +static int64_t riscv_get_arch_id(CPUState *cs) +{ + RISCVCPU *cpu = RISCV_CPU(cs); + + return cpu->env.mhartid; +} + #include "hw/core/sysemu-cpu-ops.h" static const struct SysemuCPUOps riscv_sysemu_ops = { @@ -1355,6 +1362,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data) cc->disas_set_info = riscv_cpu_disas_set_info; #ifndef CONFIG_USER_ONLY cc->sysemu_ops = &riscv_sysemu_ops; + cc->get_arch_id = riscv_get_arch_id; #endif cc->gdb_arch_name = riscv_gdb_arch_name; cc->gdb_get_dynamic_xml = riscv_gdb_get_dynamic_xml; From patchwork Mon Mar 6 22:02:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162436 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7AEE8C6FD1A for ; Mon, 6 Mar 2023 22:07:25 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwf-0006Zm-Of; Mon, 06 Mar 2023 17:04:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwc-0006UW-Pj for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:34 -0500 Received: from mail-pj1-x102c.google.com ([2607:f8b0:4864:20::102c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwa-0006pt-Tc for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:34 -0500 Received: by mail-pj1-x102c.google.com with SMTP id ce8-20020a17090aff0800b0023a61cff2c6so219387pjb.0 for ; Mon, 06 Mar 2023 14:04:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140271; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=mbqFcrDJKQyMd5mS2b0pUWsHV6dPfEh5r93Laun+DQc=; b=SCBt6FqDujAydx5nRG0uohOYNxI+QmURBeowSsrRd0awl2yXPEsyCGzqWaDpw/j7UO CYAAOgd5V1Mv06MGxu4YcinYZ6Gt2yM6xNfXEXQWosJJZmqbQgSArnv0s+n0F4yJqjxm 1MJOeLjt0K3yRkssxVMrrfqafaMfY+HIrjQWiKr4tRbqzgPFxW6+fa4DgdJv5SlEMsfg mXpCG+GcuRu0LrO9rnS4j+oUWQJyXiqscJdltQ5CzVM4mpBWJ00PRU1+TmimjNhX4acr GDqe5ggRYEcNRi0uqAyTyPLE6NFpf8UBt4olx6cO4Vsy8lR3xaIgZzGXkrU7DM4346cs SEDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140271; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mbqFcrDJKQyMd5mS2b0pUWsHV6dPfEh5r93Laun+DQc=; b=j8Vwo5pnvyWZxTRczVWIqtOANMLH4ZRdxYm2bCYlZFyqRNHwjFrAWqRt5xp33rvDlt TRw7O910O9bm6ztfUSrkzAuFhSpir3ZLXMQzWsd1mAQc1LpYdH6QJhQ3LOWrjrEuOtcL o1ApVMEYhx9I4slvgb00vfkJWnNvQHGui+QVMZSQ0p0jwpQf+sSpMdR97IR2NNlam9wg xxwetQ95yi0lo74m5qXuGP1Pib0IBfV5m0IU0YFdN/yOn7WAK1AXF6NNMXRzZprlwGet qGBnyv1bHux+MTAhsgj5ATjnqW8wZv9zyvMd15wK1vjIPHyLRqO4vtgKlwSB+L69qBjy eLCw== X-Gm-Message-State: AO0yUKWRW35b8M41FD3TpUKjkLaoU69Z3bcDl9ytkgvqy4ZbR0QbbNcz ITclv6dCc7AOHJjDsEEb6/U11w== X-Google-Smtp-Source: AK7set+k0rcnVkX/AnahiQH5ck9EzFxz4qWwnAUxGlkugTuam6WXVIVOFHjkU0U0WGxOdJyL3J5syw== X-Received: by 2002:a17:90b:1c87:b0:234:d78:9b4c with SMTP id oo7-20020a17090b1c8700b002340d789b4cmr12700523pjb.18.1678140271427; Mon, 06 Mar 2023 14:04:31 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id y31-20020a63181f000000b004f27761a9e7sm6438336pgl.12.2023.03.06.14.04.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:31 -0800 (PST) Subject: [PULL 07/22] hw: intc: Use cpu_by_arch_id to fetch CPU state Date: Mon, 6 Mar 2023 14:02:44 -0800 Message-Id: <20230306220259.7748-8-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Mayuresh Chitale , Anup Patel , Daniel Henrique Barboza , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::102c; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x102c.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Mayuresh Chitale Qemu_get_cpu uses the logical CPU id assigned during init to fetch the CPU state. However APLIC, IMSIC and ACLINT contain registers and states which are specific to physical hart Ids. The hart Ids in any given system might be sparse and hence calls to qemu_get_cpu need to be replaced by cpu_by_arch_id which performs lookup based on the sparse physical hart IDs. Signed-off-by: Mayuresh Chitale Signed-off-by: Anup Patel Reviewed-by: Daniel Henrique Barboza Message-ID: <20230303065055.915652-3-mchitale@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/intc/riscv_aclint.c | 16 ++++++++-------- hw/intc/riscv_aplic.c | 4 ++-- hw/intc/riscv_imsic.c | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c index eee04643cb..b466a6abaf 100644 --- a/hw/intc/riscv_aclint.c +++ b/hw/intc/riscv_aclint.c @@ -130,7 +130,7 @@ static uint64_t riscv_aclint_mtimer_read(void *opaque, hwaddr addr, addr < (mtimer->timecmp_base + (mtimer->num_harts << 3))) { size_t hartid = mtimer->hartid_base + ((addr - mtimer->timecmp_base) >> 3); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -173,7 +173,7 @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr, addr < (mtimer->timecmp_base + (mtimer->num_harts << 3))) { size_t hartid = mtimer->hartid_base + ((addr - mtimer->timecmp_base) >> 3); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -231,7 +231,7 @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr, /* Check if timer interrupt is triggered for each hart. */ for (i = 0; i < mtimer->num_harts; i++) { - CPUState *cpu = qemu_get_cpu(mtimer->hartid_base + i); + CPUState *cpu = cpu_by_arch_id(mtimer->hartid_base + i); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { continue; @@ -292,7 +292,7 @@ static void riscv_aclint_mtimer_realize(DeviceState *dev, Error **errp) s->timecmp = g_new0(uint64_t, s->num_harts); /* Claim timer interrupt bits */ for (i = 0; i < s->num_harts; i++) { - RISCVCPU *cpu = RISCV_CPU(qemu_get_cpu(s->hartid_base + i)); + RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(s->hartid_base + i)); if (riscv_cpu_claim_interrupts(cpu, MIP_MTIP) < 0) { error_report("MTIP already claimed"); exit(1); @@ -372,7 +372,7 @@ DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size, sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr); for (i = 0; i < num_harts; i++) { - CPUState *cpu = qemu_get_cpu(hartid_base + i); + CPUState *cpu = cpu_by_arch_id(hartid_base + i); RISCVCPU *rvcpu = RISCV_CPU(cpu); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; riscv_aclint_mtimer_callback *cb = @@ -407,7 +407,7 @@ static uint64_t riscv_aclint_swi_read(void *opaque, hwaddr addr, if (addr < (swi->num_harts << 2)) { size_t hartid = swi->hartid_base + (addr >> 2); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -430,7 +430,7 @@ static void riscv_aclint_swi_write(void *opaque, hwaddr addr, uint64_t value, if (addr < (swi->num_harts << 2)) { size_t hartid = swi->hartid_base + (addr >> 2); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -545,7 +545,7 @@ DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base, sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr); for (i = 0; i < num_harts; i++) { - CPUState *cpu = qemu_get_cpu(hartid_base + i); + CPUState *cpu = cpu_by_arch_id(hartid_base + i); RISCVCPU *rvcpu = RISCV_CPU(cpu); qdev_connect_gpio_out(dev, i, diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c index cfd007e629..cd7efc4ad4 100644 --- a/hw/intc/riscv_aplic.c +++ b/hw/intc/riscv_aplic.c @@ -833,7 +833,7 @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp) /* Claim the CPU interrupt to be triggered by this APLIC */ for (i = 0; i < aplic->num_harts; i++) { - RISCVCPU *cpu = RISCV_CPU(qemu_get_cpu(aplic->hartid_base + i)); + RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(aplic->hartid_base + i)); if (riscv_cpu_claim_interrupts(cpu, (aplic->mmode) ? MIP_MEIP : MIP_SEIP) < 0) { error_report("%s already claimed", @@ -966,7 +966,7 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size, if (!msimode) { for (i = 0; i < num_harts; i++) { - CPUState *cpu = qemu_get_cpu(hartid_base + i); + CPUState *cpu = cpu_by_arch_id(hartid_base + i); qdev_connect_gpio_out_named(dev, NULL, i, qdev_get_gpio_in(DEVICE(cpu), diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c index 4d4d5b50ca..fea3385b51 100644 --- a/hw/intc/riscv_imsic.c +++ b/hw/intc/riscv_imsic.c @@ -316,8 +316,8 @@ static const MemoryRegionOps riscv_imsic_ops = { static void riscv_imsic_realize(DeviceState *dev, Error **errp) { RISCVIMSICState *imsic = RISCV_IMSIC(dev); - RISCVCPU *rcpu = RISCV_CPU(qemu_get_cpu(imsic->hartid)); - CPUState *cpu = qemu_get_cpu(imsic->hartid); + RISCVCPU *rcpu = RISCV_CPU(cpu_by_arch_id(imsic->hartid)); + CPUState *cpu = cpu_by_arch_id(imsic->hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; imsic->num_eistate = imsic->num_pages * imsic->num_irqs; @@ -413,7 +413,7 @@ DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode, uint32_t num_pages, uint32_t num_ids) { DeviceState *dev = qdev_new(TYPE_RISCV_IMSIC); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); uint32_t i; assert(!(addr & (IMSIC_MMIO_PAGE_SZ - 1))); From patchwork Mon Mar 6 22:02:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162429 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 08042C61DA4 for ; Mon, 6 Mar 2023 22:06:31 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwh-0006fE-Dv; Mon, 06 Mar 2023 17:04:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwd-0006VG-A7 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:35 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwb-0006oz-DD for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:35 -0500 Received: by mail-pl1-x62a.google.com with SMTP id p20so12036902plw.13 for ; Mon, 06 Mar 2023 14:04:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140272; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=LLk5MjQxWqWUwFhPTSIibV1K6q+m6IrRjjb/wMuUX4M=; b=0zYWOIYH+DBo3z57wwOjjOsX7dM9dQqjq9xwbyVv3OXzLeYstqUeR38IjTGld0+ZyX ntkd7Ly8huf+UanzVlHJjY2etHBEq4QfCdYymX5x+bOcnALEuFkHPm+X2Z+ve2/Cfuv5 w6PWEiST5k7t/P85O7MiXLgbSAVjlWoxAtrf0M4jVKcncaid1+iRT1FgvVKgPc0P7g0n 5vTsSXWuE6+0ojCe7cfPpNhH34ZK3cnRsVpS6WJ5A7rC/mdxhZqKJGvxZKhiTacoiDu+ VmJTrX0nuOejEcaDglhJRLBJ8FyLI8ZFQqHeKtCHR407ejAnLud3GXmY78UOI+bjz1f8 VedA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140272; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LLk5MjQxWqWUwFhPTSIibV1K6q+m6IrRjjb/wMuUX4M=; b=XTEayXNNS7rtMFkuZZYCU6AneHde2GAMr/V4fLrvCBeibXB7AT4qlCb5APJ5AWzXuY yMc63ujJ34tSMpv2x+KIA9Bo7I/fM/ktrtZE9CgO84Kz/o8u59Y+BUplwJEaykd0W2ga /hLbWoPs1cEbrumsoogRGSKu3QeoheK9vn6zCtKFVtz7k0oIgTBtNk3/n+aYyBRMg51R 1gnEd5p9lXlsDXgAeJylq/fCtmSWuTCicNT2DtFJR520MxisgJwxpp2Rq5K921PzMVA6 hD93HDA1awMP1cz6wRd8eF4DT6XAhGpXPMfGNiirNV20oftlkDz1Fl7rN2eWg1CNRXvT gDXA== X-Gm-Message-State: AO0yUKXOHSxeXc/qhHMc5457TUYeGYYLgN/++LdJq7nDrGDMW7/bN/k2 ut0yLgA7C0Gw5FcLLlMl6qpALg== X-Google-Smtp-Source: AK7set/b7KPpusAKYfkDCI8sIuqXhGoybWlj79GVCaRJnP+0Bxw+0en4d25KkPYVx/rUKCdWr1DnjQ== X-Received: by 2002:a17:903:283:b0:19e:b9f8:1fca with SMTP id j3-20020a170903028300b0019eb9f81fcamr6704665plr.10.1678140272623; Mon, 06 Mar 2023 14:04:32 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id lc5-20020a170902fa8500b0019a7bb18f98sm7235846plb.48.2023.03.06.14.04.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:32 -0800 (PST) Subject: [PULL 08/22] gitlab/opensbi: Move to docker:stable Date: Mon, 6 Mar 2023 14:02:45 -0800 Message-Id: <20230306220259.7748-9-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Palmer Dabbelt , Bin Meng From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62a; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org The OpenSBI build has been using docker:19.03.1, which appears to be old enough that v2 of the manifest is no longer supported. Something has started serving us those manifests, resulting in errors along the lines of $ docker build --cache-from $IMAGE_TAG --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $IMAGE_TAG .gitlab-ci.d/opensbi Step 1/7 : FROM ubuntu:18.04 18.04: Pulling from library/ubuntu mediaType in manifest should be 'application/vnd.docker.distribution.manifest.v2+json' not 'application/vnd.oci.image.manifest.v1+json' This moves to docker:stable, as was suggested by the template. It also adds the python3 package via apt, as OpenSBI requires that to build. Reviewed-by: Bin Meng Message-ID: <20230303202448.11911-2-palmer@rivosinc.com> Signed-off-by: Palmer Dabbelt --- .gitlab-ci.d/opensbi.yml | 4 ++-- .gitlab-ci.d/opensbi/Dockerfile | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.d/opensbi.yml b/.gitlab-ci.d/opensbi.yml index 04ed5a3ea1..9a651465d8 100644 --- a/.gitlab-ci.d/opensbi.yml +++ b/.gitlab-ci.d/opensbi.yml @@ -42,9 +42,9 @@ docker-opensbi: extends: .opensbi_job_rules stage: containers - image: docker:19.03.1 + image: docker:stable services: - - docker:19.03.1-dind + - docker:stable-dind variables: GIT_DEPTH: 3 IMAGE_TAG: $CI_REGISTRY_IMAGE:opensbi-cross-build diff --git a/.gitlab-ci.d/opensbi/Dockerfile b/.gitlab-ci.d/opensbi/Dockerfile index 4ba8a4de86..5ccf4151f4 100644 --- a/.gitlab-ci.d/opensbi/Dockerfile +++ b/.gitlab-ci.d/opensbi/Dockerfile @@ -15,6 +15,7 @@ RUN apt update \ ca-certificates \ git \ make \ + python3 \ wget \ && \ \ From patchwork Mon Mar 6 22:02:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162426 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EDC4BC6FD1E for ; Mon, 6 Mar 2023 22:05:08 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwn-0006uH-LV; Mon, 06 Mar 2023 17:04:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwl-0006lY-CI for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:43 -0500 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwe-0006of-Fx for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:43 -0500 Received: by mail-pl1-x62d.google.com with SMTP id n6so12091542plf.5 for ; Mon, 06 Mar 2023 14:04:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140276; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=RJdZcvi+p2u9CUf9I8MEakH/uCGdZyLOxM9eUu+tmPA=; b=DGPN79TAK41C6smI8/rupjWAyh3ZchrAt0eEfGR+74k1ZTi9UOzc2dHbW2WZsjgqx1 K4gnXokziuDzLv/ejIL5NpSfqoE7kLtxkHwrbkDBlkVUnhvd/3R2swASSia1IP/SUjsU WscQv3wOirEvpDLpP44pdLV9S0cXi5CkuMLVPU1cnMbkBxTmvCAj/uQ8c3jeRmfOayIq QJ8iY+qXnJzWocF4Y72TKzVfTfUFBjUpc5ZvwuXIbES/2OdeVEBOmbhnVOUE4A4wISv9 pVufElSWSDHhvMctOkWK+vnc0KDpKj/A1I7IOaT7VlWyHt2vViyhyDMmepCJk/VUETLD wjeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140276; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RJdZcvi+p2u9CUf9I8MEakH/uCGdZyLOxM9eUu+tmPA=; b=2dEBQwwBOqjnxSugwiBhqFgWWvpjdgQIJ+4o18i3QiUr/wLixOK98UXCrupPAf/rHz gYc8CVZbRlIBGCy9cqyDXqSt2Ld2s3ev18HvHiTCb+u+nVa9LnYxkpQ2cUIMUPUPtmIY WZlgDb+Pj8hKwnN0p34P8zPardQYtAiMheeLAmpvZ+fHwGDv9mMCLHXgSKNTkm+nGrdb seipArWp+ch02MzhIMICfbJfb4iqhN5VQuMVpWr2DW0t5WX/kRRTvuwg5Rr86q96Xeqo TU/Z51ODbw0XkfXqpyJR4qQ5qU/Sbz44/AhIzNyzEgCtlKLg3/KHKG6frXQ/UelmSGzx 0JEA== X-Gm-Message-State: AO0yUKUgC4c930DiiNFa7sP3u1LhJGb6L/dJxbJcEiPT6X+Xc/Bf4rpx pnOzRVRcEnTgn+y0aJWZYAAhYA== X-Google-Smtp-Source: AK7set8LdeMy4Fk4eZ/3NOQ2n2di8KvxpcHxR9yXFMbS1Q/BcPUBdTUy3G0r3PLxuBX/gWCeWRu6xQ== X-Received: by 2002:a17:902:ecd2:b0:194:5c63:364c with SMTP id a18-20020a170902ecd200b001945c63364cmr16276875plh.62.1678140274591; Mon, 06 Mar 2023 14:04:34 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id ka3-20020a170903334300b0019e21d2ed2esm7220990plb.88.2023.03.06.14.04.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:33 -0800 (PST) Subject: [PULL 09/22] roms/opensbi: Upgrade from v1.1 to v1.2 Date: Mon, 6 Mar 2023 14:02:46 -0800 Message-Id: <20230306220259.7748-10-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Bin Meng , Alistair Francis , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Bin Meng Upgrade OpenSBI from v1.1 to v1.2 and the pre-built bios images. The v1.2 release includes the following commits: 994c8cf lib: sbi_timer: Added a conditional wait function which can timeout caa5eea lib: sbi: add check for ipi device for hsm start 0374ccf lib: sbi_hart: Shorten the code to set MPV bit 4e21cca lib: utils/serial: Update Shakti UART based on latest implementation 88b790f lib: sbi: Fix sbi_snprintf 1545afd lib: sbi: Fix counter index sanity check 83db3af lib: sbi: Add the bound check for events during config match 860a376 lib: sbi: Fix possible buffer overrun in counter validation 11c0008 lib: sbi: Fix fw_event_map initialization 8e86b23 lib: utils/fdt: Factor out common uart node code 7d28d3b lib: utils/serial: Initialize platform_uart_data to zero 7198e1d lib: serial: Clean up coding style in sifive-uart.c f272035 lib: utils/serial: Ensure baudrate is non-zero before using b9edf49 lib: sbi: Fix printf handling of long long 422f0e0 scripts: Add Kconfiglib v14.1.0 under scripts directory 662e631 Makefile: Add initial kconfig support for each platform de80e93 Makefile: Compile lib/utils sources separately for each platform 26bbff5 lib: utils/serial: Use kconfig for enabling/disabling drivers 2adc94b lib: utils/reset: Use kconfig for enabling/disabling drivers 3e76a60 lib: utils/sys: Use kconfig for enabling/disabling drivers 013dbb3 lib: utils/timer: Use kconfig for enabling/disabling drivers 76af9d4 lib: utils/ipi: Use kconfig for enabling/disabling drivers 0b1cf2f lib: utils/irqchip: Use kconfig for enabling/disabling drivers b126ce4 lib: utils/i2c: Use kconfig for enabling/disabling drivers 5616aa4 lib: utils/gpio: Use kconfig for enabling/disabling drivers 68d7b85 lib: utils/fdt: Use kconfig for enabling/disabling d514a8f platform: generic: Use kconfig for enabling/disabling overrides bc317a3 platform: generic: Use kconfig to set platform version and default name eccb9df platform: Remove redundant config.mk from all platforms 0723bab docs: Update documentation for kconfig support a6a8557 Makefile: Fix typo related to object.mk 9529e36 include: Add mstatus[h].GVA encodings 1fbe777 lib: sbi_trap: Save mstatus[h].GVA in trap->gva 1c4ce74 lib: sbi: Set gva when creating sbi_trap_info 5a0ca09 lib: sbi_trap: Set hypervisor CSRs for HS-mode a69eb6c lib: sbi_trap: Set hstatus.GVA when going to HS-mode 111afc1 lib: sbi_illegal_insn: Fix FENCE.TSO emulation infinite trap loop adf44b5 lib: sbi: Use the official extension name for AIA M-mode CSRs cbaa9b0 lib: utils: serial: Add Cadence UART driver 622cc5f include: Remove sideleg and sedeleg a90cf6b lib: sbi_pmu: Remove "event_idx" member from struct sbi_pmu_fw_event 1664d0e lib: sbi_pmu: Replace sbi_pmu_ctr_read() with sbi_pmu_ctr_fw_read() e238459 lib: sbi_pmu: Firmware counters are always 64 bits wide c9b388d lib: sbi_pmu: Simplify FW counters to reduce memory usage d10c1f4 lib: sbi_pmu: Add custom PMU device operations ee69f8e lib: sbi: Print platform PMU device at boot-time 5019fd1 include: sbi: Reduce includes in sbi_pmu.h d32b0a9 docs: pmu: fix Unmatched example typo 19664f6 docs: pmu: extend bindings example for Unmatched 37a0d83 lib: sbi_trap: Add helper to get GVA in sbi_trap_regs 46e744a lib: sbi_misaligned_ldst: Set GVA if not emulating 8ce486a lib: utils/fdt: Fix DT parsing in fdt_pmu_setup() 49372f2 lib: sbi: Fix sbi_strnlen wrong count decrement 7f09fba lib: utils/serial: add semihosting support 7105c18 docs/firmware: Update FW_JUMP documentation 3f3d401 docs: Fix some typos e54cb32 lib: sbi_pmu: move pmu irq information into pmu itself c316fa3 lib: sbi_hart: move hart_features struct to a public location 4f2acb5 lib: sbi_platform: expose hart_features to extension_init callback 2f63f24 platform: generic: add extensions_init handler and platform-override b6e520b platform: generic: allwinner: add support for c9xx pmu 98aa127 include: sbi: Fix typo in comment 11d14ae lib: sbi: Fix typo in comment 60b78fe include: sbi: Fix grammar in comment dcdaf30 lib: sbi: Add sbi_domain_root_add_memrange() API bd7ef41 platform: andes/ae350: Remove enabling cache from an350_final_init 9899b59 platform: andes/ae350: Use kconfig to set platform version and default name 88f58a3 platform: andes/ae350: Use fdt serial driver ef9f02e lib: utils/timer: Add Andes fdt timer support 8234fc1 lib: utils/reset: Add Andes fdt reset driver support 127a3f2 platform: andes/ae350: Use fdt irqchip driver 6f3258e platform: andes/ae350: Add fw_platform_init for platform initialization ce7c490 lib: utils/ipi: Add Andes fdt ipi driver support c8683c5 platform: andes/ae350: Add AE350 domain support d682a0a docs: andes-ae350.md: Update ae350 documentation for fdt driver support 0fee0bf Makefile: Add cscope support 51acd49 docs/firmware: update the document 9d54f43 Makefile: Add rules for carray sources in lib/sbi 56bed1a lib: sbi_ecall: Generate extensions list with carray 22f38ee lib: sbi_ecall: Add Kconfig option for each extension 85cf56c lib: utils/fdt: Remove redundant code 21ba418 lib: utils/fdt: Simplified code 8e9966c docs: fix some typos 7b29264 lib: utils/serial: Fix semihosting compile error using LLVM 14f5c4c lib: sbi_ecall: Split up sbi_ecall_replace 8e63716 firmware: payloads: Optimize usage of "ALIGN" 1b0d71b platform: generic/allwinner: Remove unused header files 9a740f5 platform: generic/allwinner: Remove ghostly type cast ba32021 Makefile: replace `echo` with `printf` for compatibility 49b0e35 Makefile: bugfix for handling platform paths 74e2029 lib: sbi: Simplified mmio match checking fc82e84 lib: sbi: Fix is_region_valid() f8eec91 lib: simplify fdt_parse_plmt_node() cc54184 lib: simplify fdt_parse_plicsw_node() e9bc7f1 lib: fix fdt_parse_plmt_node() 5daa0ef lib: fix fdt_parse_plicsw_node() 1f6866e lib: simplify fdt_translate_address() ad2ac29 lib: fix fdt_parse_aclint_node() cfbabb9 firmware: Minor optimization for relocate a36d455 platform: generic/andes: Enable generic platform support for AE350 6cd4b9b docs: platform: Update AE350 and generic platform documentation d3fcff7 docs: andes-ae350.md: fix watchdog nodename in dts example 4640d04 scripts/create-binary-archive.sh: remove andes/ae350 build directory e977512 lib: utils: Add fdt_fixup_node() helper function e1a0cb0 gitignore: add vim swap files ed8b8f5 platform: generic: Make use of fdt_match_node() 8b00be6 lib: fix is_region_valid() c2be214 lib: fix __fdt_parse_region() 7b08778 lib: fix irqchip_plic_update_hartid_table cb568b9 lib: sbi: Synchronize PMP settings with virtual memory system 506928a scripts: use env to invoke bash 64e8b9f lib: utils: serial: Add Renesas SCIF driver 0021b43 lib: utils: serial: Add FDT driver for Renesas SCIF 6840902 lib: utils/irqchip: Add compatible string for Andestech NCEPLIC100 8b1617d platform: generic: Add Renesas RZ/Five initial support 7a3354a docs: platform: Add documentation for Renesas RZ/Five SoC 34da663 lib: utils/irqchip: plic: Fix the off-by-one error in priority save/restore helpers 8509e46 lib: utils/irqchip: plic: Ensure no out-of-bound access in priority save/restore helpers 91c8a7d lib: utils/irqchip: plic: Fix the off-by-one error in plic_context_init() fabbc00 lib: utils/irqchip: plic: Fix the off-by-one error in context save/restore helpers 9a2eeb4 lib: utils/irqchip: plic: Ensure no out-of-bound access in context save/restore helpers a8ee82c lib: utils/ipi: mswi: add T-Head C9xx CLINT compatible ca7810a lib: utils/timer: mtimer: add a quirk for lacking mtime register b848d87 lib: utils/timer: mtimer: add T-Head C9xx CLINT compatible 391ec85 docs: pmu: fix binding example 0412460 docs: pmu: update a reference to a deprecated property name d5d12a9 docs: pmu: Update the pmu doc with removal of mcountinhbit restriction 6b5188c include: Bump-up version to 1.2 Signed-off-by: Bin Meng Reviewed-by: Alistair Francis Message-id: <20230207044003.3669059-1-bmeng@tinylab.org> Signed-off-by: Alistair Francis Message-ID: <20230303202448.11911-3-palmer@rivosinc.com> Signed-off-by: Palmer Dabbelt --- .../opensbi-riscv32-generic-fw_dynamic.bin | Bin 117704 -> 123072 bytes .../opensbi-riscv64-generic-fw_dynamic.bin | Bin 115344 -> 121800 bytes roms/opensbi | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/opensbi-riscv32-generic-fw_dynamic.bin b/pc-bios/opensbi-riscv32-generic-fw_dynamic.bin index 81bab1adc97bbe9b376f3bfe4da98cdfcf3ade7a..6a8425885c7dd0263391637b665c83d04684c68a 100644 GIT binary patch literal 123072 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 literal 117704 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%0AjLQjZPi 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⪚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 IP#&-NU*?h>$^ZZW diff --git a/pc-bios/opensbi-riscv64-generic-fw_dynamic.bin b/pc-bios/opensbi-riscv64-generic-fw_dynamic.bin index 5eb0a743260b47e07e674db3728d6ba4125847c0..80bdbf2170037541848cf96a6ff71bacea91baf7 100644 GIT binary patch literal 121800 zcmbrn3tUvy_Bg)JoH=tC1VslK6fATClFCRxG|da@FiB}#3rYLdMURNj#E=Y&8^drI z2UMUV9uT^rT|l|_b}7eulgg2fpuHt?Q2^l8`)HFgW`qVF)s+CB3CmS$)AVbykvk~g|;H%N2`!vCSMdC?} zKktaz0`KVghd9GZ#l8b{jcmw$G3RrRqCd$Pq-!#U?tACHziEPRQDFzfPvDDP)6y`G z@Ru<%)tf_Ol#97>=V*+(;+g7P8(p0}NEzTOx+WX_^&RK8%`(e#&-RTiJ@R*nqAPcp z`Ix>jD45nq*pS~m^>v`abzQsoIE{qt>n)mKS2WqxvS|5`+7;U48a*x9V|lO|a#gOb zw@m9osO4112yRuI6ez@%1+K*}7|F5fEF}tIUD5C22FE;GExVV)PW)S1*mGLjHOSO&MJcPr{G8Q1##~baHe^E{#Iow4s$_gs%-$b%zC2TTW5c zmapNTh1x4{%aalPi419iPf`11lW9wI@}Oy+`dut%dHX($PQH+PZhC(4cgYdiLak5ZN=n{Fy z6cj9c^#Ky@Oh>~0>1beFNMt0czB2`p-+4=r=Hn^1RQilthUpn{uTK13#}toHuPgXV zuU6T0S(Bn=^o?=t6MOFK-``Z;QhD{g8y~bE?mXJ_N&md&C~Ne!#W$DSUTR<7`_jOb z=2q+VYqxIRx!q;&>m3{jVJKt^PJh@C%p>|ShB7?HQ}lF3Mu#x8A%v&>Ry>gK@W$ZH zp(!&{=cLgy85hG$-i4mUC=IiCCH*+#YIvM?rDrpv472%B^c=>`Fo$=epJ3b#Pw?*a zTxPUkEA4$#A&!gt+ z=Ti&x3-nQxPOqb$)IUir)Gwr>_0iN*`lqO;^-oia^oyv)`o+{U`e%}3P-sTFlfUNJ zc?*kqd#KAwi~7)@N$axOa;gk|xdn%i%c~jbX|WmUxIY~I>f&Z`%pVueb)JrNpo{0r z&U72=`HH7Ssqj<_&aws!ME5SXLyzBFe(fde%I0)sa!|x= zfo*4tm97Z-j^^6JX^v6K3_(h!GV?4S&D&7>^OQgLdMs6v#OOFv8*M?3U))8>1RAvI|3s@tGfd!`(>+H`a+v-i-<_ZWvQO-A5veyZDQW6?lw}mB*@#6 zocC04av=1jnw6;<8!6FDA%nTT6MvTp7t}Xz5tyik@&9Ew%VCO(gA+^aSujN~0u=<$mTz@*a7(TP8Tteo3<}DrXu! zWtqf$Px_0tcr)MMtz$jm=Kaifm>%5QoG?DdA`Vr#%eln+@YTZAAWw;dVLc{cBmhRtn4RrYfVw}Ew+}eV$%6Jxwt2L>khfE$w~P_^@2A%?uo|>;kmJJmIq)GT?>@bj zf}EI@kfUJkbCeG`?Y=wWr6=olpwD;5D(Q*OKB(9GL;gftMAQ5r6U?&(J_-gEGfD?f ztl5A+L7jkSQ`!Fj?cR9pC~9+jpJR*nBXbJBjMd*>GW$x)F$0y1atiSfHA7fR`9)mn+UMHmK=k$J!_noH5v>FjGVI7}F9hXx6)9lq!ihrcpk+MFV;7Dm7Ug1cUJ@mFC#XMxH zmfDiwtoP5hnDkVYV=hqI@1QQf72i2>nI*QE(ye;!4@V-$PH90d>PBc`cwpezbAlHm z6B;j4;$c`@4=dg|4D=S&AB9zG%BsitNGcZr&Rqu~m7{TG4HH;>6d{aK`lfZ3{6U#BIdJ`ZjjlwYfS%Q)5z{o2NvZbGY zMWQb`J~DL5DqK4}gS>}acr9L`_Q%V}TiD%cuDRZI)@GGjA)C?@(7EKQqCdKQ@r|V| z%bU`X`a9?~*GeBDu95mmG{A`dAd|~g$_0@bv6BSm9TlgUc5v_48p2)uXtPpQnH`d2 zN6Px>ESbpZ7}l�fBO{lX1qldR~}Qh2_SG;hoP zEwa=rYv--ozfQJ(GRQ|6>613^zq+`8Nl(^|@|K3CrJc*$U%HX*@quYZ_HXw!T^7u} zV=U?jLZJh3++MqaS}2Ul?0YGzfnUx8Z?;Xg8p1RC8ZwL8o+#xFn$XTZUS4oY)vZPw zFBijk`m3zPSxb3a`(JKhJYFv0SUXforQBIc(yOsQP}-~Y=%1o6avu`;+&16e&Pu@I$O9|=jgwtM2-%%s=bF*10kx|YyUigX0fm&hRan?H2 zit&4Eq#m4f#y2%6i$5pAzAo?#{hpE13JN5jT*~-!ZWmA?w~tNxMNo&KPYUvyrM{lB z3goU@-0LZ^17@il($hC9kf4U1y8to(j9kIU4pxeqDi+;4M)XnYJut2V0{U(3?_70` z6~~B5`t^u%VrTW*+H0&%?2%)9NfYu;hTae_L7k@4U4{>peqZfQo*Hp`67+tA8hYO^ zzrJLvzTOA;fXBIBYYPs3wlZ^4EwxakR?6`BQ+0cyvm&29p}vG$!t3ixUdJPznQCp{ zpCsFIW!1d3``60WX@UQ^Z6M!xn9ji{`vT}DBR@mLv{71#FJwl*e3-HduUmAO)!i{m z;2m{Z;!fZV+HCZr>Lu=IKCJMQQq6W(62sBsf`iT*nqUk1pIYAR zqymo}Oo@u|t9{#?61&qZwHLRxGBY`8K`_jWD`39qfwJC!qbIm@cj1uM_Z z+4S+&{9lb8Ok+m+veS5U2i#C}N-Ow#nMJi9n5gUf?~X$}3WH3NOdPQg)@S+qr%XBf zPKm3bAF~4d)bOiP1o#n2Fs3Pxo6pFKjY`Bl7e*Dc3@ZBKlily;$_MW)adB1vFYRy4 zB%4S4tb22v+@DlCCnd-@jn|(Geadu}(vp=z2`k0?eAeP)9+diE%Br+j+#0;HN~*lTBzkUUbG0R^k48Z7@S@IJ5Q=*iA8;J87eXOw_y&{He>qC5iW=>Hpeck5g6p5CX!fPmn|Y` zO^HPqoE!b z3v~cvNbjQV=mk2^6}`n$+S$fy5i&I;92Ix5pX@1FS<-Z`yn&^Slvul&YbleN70@^6 zf{fdB0XbJA&?`mR+K0Y(u16`L6>{cPW=%7OLx18vg`My_Cyp~8j~>|9;!ixLyeaKa z6%~3|L-7jg#KphL1UxTOHcx48=(*CQu$K3q?fk0!;*IaF{@Aj*e_hYZok*D$rwRSA zhZ2HJGj@=jeU%wyj33aY#YGx8NY{p+WYXd$lXP?Ven^ic>D%FNL0U=Dz2VsmcZxv+ z;p!h?HF96{H$%cAszKyB%;Qw9nLWZ*FSLZ$1b6m)0_P*YafZM}RIxjQxQ+pj+6~lH z`*Ug^80Dj$`hH;f@uvoSA1S@UFV3>H-+#>DzX)bc#(1BsNl2f+gom@hLwCQn54at3 zIYRmHE+`pB55}beE!z(D<9-p;YM3u7(M3iHZ?Q+kY>@j4=NHGZ)bSjPOWZG(ceeIc zr-&3DcdJ5`%~P%gSkLw=ZbmnM)pN1)yY?S%T)EoXa=q#0el)f+Q#0qot`AJf4+AH{GrN6Q zH#D#m*3T}OJymGwbOTFkGjKXG{3JWDbRS8t2;UFse3ITA{uZQ7B%K9k~e(i?-2#!fH1U^j_yFqWZ_j?->GrMZn>mN`RtI^zI zLH!i6FIP{1zEzq&5qc*e%*z3v**kYb|GPVS?P=&WuJ5?Zh+b2>-|e*q=(V&Lq<-Vr zME1Cr%QU;;82~5Ut)MA9p8TJt@Tl{3jJi@dWlF8ITW<4 z&;f1;Yui?eZkuK+&P4FKYOx*(_1!}^bA4_4Xp2eNx!G)AUS@7yZZRl3BOz_cRo*G9 z;r4(|6WU^5?p{Mf-$-d`ZtP_nM9uz0YH|(M+6D|Py_sc|^tO`LwzdCy&#lgMWo0(- zwM#SS)2_prnwc$~c$H3zD>f<+C1~b!c5-XXQ&b`&8;D9<8kxbZYDKj(=CNr@CzEvZ zj46;FOVYPzjDxh2qtx4J>~V#4-E)3goR0~l5mW2L_u@ydy1u0{)pgtTbA0-1jdOKa53H3(>j;A+d+8yiPjU@e6U0SmHaonRsT-j;*b2i@ za+<@K`8k$c_QnMr#x9nFWH}hF#5H~Sh2bM3%^6)>W*b`~1TPl$W?b4~*b&9g@E#iV z=3z09<3ac9!>}l$@R8ae)57C4=8B@7K79=7oKO2n>qqeD4pmEYt%PgmcHwKCLQcpok|_I zx8*@d&*{8FhsnEP-;IfRoI}hM`~;e%M_~jfMoRam%XH7~_`KZz3 z#o}6Mmuc^KfGTSu<|E`|%L?TD{Lh{c_65q7eOdILZy8%L zB(?FpA5hd)oCOwcEPLyi9PaB1wD#*6rnH*gI8N5<+A$S{8q7-CvWsnnQ`dS+Hrr|l zliTUA%uZO#GA%NuwV1sGGIg=55?R)Fx9GKtL2Fy(Pn{l!Q#Gv`RE^$$DnQ!RPA<#-ahVbnqHo#AIWe(r+jau{_=SZmW?o_qkl?7&hY z_ciQh%kY!sH2Xan1w>B3GeiwsRI%)H*&r>@FjERo;dyMyXFtL9nsQ7w{0p;TJNq#e zg;#PVNN4A&Y7a}N2fcPS<4-|-iOn_itjvx@=06x){nx+Y$=Hgm9v<~sPycq*Te4fv zV;br|KX`R%i8cWm})%B-0Od}9+KIn z&^qUs#n9S-Yf{$yL8@*zhlX6IeX!KkVxT_PWGws&=dKNc|RzKVXzM5 zZBn*UTIrMsE7a8rh2ek#(FdX^i``{NC60&H$3-?x)C=R-xmc!$9uSOevuC?_N7k;H zE9#>Lyg}a(VA-Yk#drQ#wz^wQS&AwKtK%-h?rm+vCj&v$LQU#=ylUxY?t;FPtUD_} z->}S~u>#FZ9h~<4>pCO-W#g%QEEVI~F2YxWF|p&@r?^+F3Yf=Zta7Ke33->y=U%nT z_*KQ3@)HM3zVZ~dUKsi^FaO*O9we=P(B8g~7G?;`98jg$>8Ygy&kcI2n0DH%?jIUZ zPiF>poZgYyyq}!oDJ?$5J0yIf)gbhQX>VXkBpyzvlc+IXFHCgmiMF>%yu&mtZjto7 z$h*?i@j%3FTTFZ+uk$g<5qGfyWvH9gSbD*8swshsErs(?a$aJv8rETzBFg%F^iCbu z-X<6J$jK`01w1QO)DLBN;WLl^tr_B8R$6@(54f_2MJb)7nIR4={iYsH`+sYLK9$Ra zZ$wJswQ;IMFFUzh3?O^OKGyO!V8Obly3|NT@6pUrAgTRWpN2W$vYgJhOcqz1%|Z(OWId9rMnow4jz=FHeu=bpqqYyn1eM1qbdbg z3qQ0^uI7P0rfi;= z4b)`^mD>D*$I?f$5tAt8Fp<^lUc{~LmTNxjLpDE;ah%LmE<&pW)50NYA?ylZoe9X& zYeRS)RdfpMExuR}v`=a22pk$dGw)xwgrBz#pPFrc=iRC3AMVcG;W=W^F^H~*lZLVz z%{p-RX>S{17@o2I0(KGYgtsyNlvO@Fi=?zPzs9!umll12@tBhaD1(Nw(!4Cjwn178 z-bC0&ikOr<=GGh>V$U#eU(OTbp`N~bL&QPdHhab?L(HL z!w&tPA<90)WgQ0oNUfdATg{b5od1KvvJk@7A!P$DyVA(B@8+5Z@k$`^NUD8818xWI zJ4`)pjb(5BJs8}WLx@W{B>NrAiCqp%727pb&05jXf`sn`g?$K@H=rIE|89C4vg~zY zIXKrksZ{E1+|#&!p|@SS|9^Vh{bVKKQP3Xf!BJhnZx(pMvzCd&+D?fJc;;XWm!!jT z*toXglg#xu4WS^}r!N4nl=n>7W5{5Z4`Ck{{TCVH*gEb)B~sX-pz&-iZEpA)y@y((~9Atxvp+IPUacelmUu|NDVEkRoeEqaL-@Lh`j z@3e%3#Z$v`a@cN0X>XdBZQkGhQs>I{tj_Wq4Oh>$eATqHe|gX98|mJaIn#FF)!b*4 zlAP)9TCj;$zU|AS#NOBOFlen7fZm{2HepFtIjmEvWw6Rc+ma%pCRssJ?B&)Mp<`@u zM77vQPPb`0HFN&nGpSj~l*^?rY)R?!Q!nYYtHD15JXI=8F8M!0y6NBlF30dP#=KN> zg?|ZbZuhsQed(Km(;4Dz$4E`~_c$?fTuN!ozvy<{my$M;*ej)Vxx)~yL`UjD?~eA> zgZ?%LTMDsGS&1sMOOmTIJ7v}1tfINyO7z5mj3SJeAy%`okxO{XHF5Cwcqzt0PxAaf z)bOif_yb^{Qa9I#O0Ywil-+4WH#$rSwxOmYF&oy??1t-Dvt4Ndt$8N(6h7qz<$zBQ zc-gQrflZ$qvaDAYqAZe4I6woQUN_;COsq6k8xtcr(2y_TGm0uR)4t>vV5)}gq5=H= zEqL7(jWT2~v)13URA74u1-2^1jer*9(eVJtPJk^KE1C<}mn2f!qr35rSQ0PUZ{`*- zP@Xgo;amiEW2x-=pRk|M@OqB(q@2JXA;&VZXF4EH4Rz4riQgX;KR+eqVHyHjB>T~L zt*!mhZ<9e2l&`f#c&wn#B=uEIs%IrImbDsta{$Sf%!XYzaFg9mae)+%Ayi2zTnw6>?5lt}t=CCG8jQ zl#Q1Q+Xl?3#Of1$RnfV)1=}>SEP$;81=k$>ICJpaC%ZLOa?rDL+d+q8HZk9WJpuQ-}Bb5@LnBhd;mt$wK%2dfdmue8nZ;@etjFJizM!$rBy{O2*VwCl(>T9_-~A zoif;IR_i|xVSB;*lpS|iwEPTnVuXz{8KH3_pD|yC{TZZED~(}V@E4$L?av&+W$(mg z@3^<@aFtZ{FmJHDiA(?Wn_$(wZz3H%?hmv-Q;mHJH`e0OY-Ompl;K_>b9vAkIPozvYB-poTWqfBBa!R z1*KQ5vs`~*Xt;IK=z#ZYfBo*)EyL@b)VA2WZ8IFj9Dj8G@3oIV2Q;`78rBmUaQpc0 zfQBRv)9~9CN_!gk0j<1X27ie7q!qV+#|8wmfV8&Ks0BKVxc-WDIT+;Z)KU+tj|elEXh1`Tz5)$?aS&Qs{QUBPja&2d^P6zuBTof}o)92Vv@{`?Urg?ZQ zN*KUeDVZ1bmb1JhKcbm>HE7`8-j;ZQt)LR2l<#>t&~Zh(C;LYza8q|5XpR04Qz-SfiUSc4A8aSOIdTWlzsJZ0Z1iTlEg0 z+|A8YxY`izM(KmNt~NLoYO3I5)5;mwfevp6QY*lBSW)hAmY=&9TUSmz8Duo+7%exk zTdq=Oc8O2JUbW-tdE*ZlLU*7acZ2UuM8xxzMv!G}w)UT{H(+m^2){V|rpN;8(6!}R z7kSu`gCib2%i|LL7B%pec}zd09jP@hzpFPV`f{^Uwis5nwAkA<6E^SfX=wlI>cy6< z{_@VVHxMOm!+T%$8-^pUC@34K>ZvRu+9Qvuum*n8HN%J5=qo~5>0(TWy~Ec2r)G(= z^hNm1wO@drP0}|>(;N8I3#~~}Tgta6Qd`$Xtt(%r1fKezIeyx?7Wi(KR!pNA{C3mZ zobe6sE45rf8!Ft)jqbj?N)&EZYAqAH2ff#othIP`4|=ZjUQK_*ppt|c;z^O?zLjw; zZ8A%dVgUAh*)$$JZd_D~ESb$OemSMxSfhlU)pEV9?~HkOv-fJj$jj#Pg;polConFX z;u!718sAs0opSCPSQmi2B^nby{2&v{nOt_8LVD9y&TV(56aT?wInxzKxy&}Xgj4Z3 zx67GsdmsF)9q;QufpX;KSy)=d9(r_u;-u~T&_9P)5WKF=(%PEdX}VSeJ5SU7O{Z(7 z;^&{PnIFT?Kbc>*_!N5Wc}>+pw5)aoyn8fX^Wj1C$Y~XWd||!M(|nAd9R8Daw)5}&E6Bt> z$$)JgyiE32e87!y#g=1+N&KGpmj@Z~d6qt8LWV;oO7qb*bleP2cyB7eZ$Tfpn?8i~ zg3s*!mzhaCU87P4gGY??Zj7K(`qi3hFeXmf+HLt#&ZhjZ8r-{1Ee~1y!+8(kk{PMG zry_1FJFznJZ2`PtgRgCxB0!661PeDLFY$4ZkM% z4fIS7jPWqQSDLC8kJPOywtEvF)tk#Ca@#M-K=YaowRZ<1pkrXdDWQ#(*^4o~ly-RZ zNqZXL=3UDDvIdux7I&YTiB5yIsnpwKmqxVk{B#E$4>;(6UqZ(N9RV?Z_*+85o0tNr zc1_hc9=Jx}iyu&7<908kfDVseQw99+`9>BPcjj;(hQ`rmkaZRcLY$_+HOf%KoL}ngdz24(l*kZ$Uj3 zEY~ITkBS*ah&Wkj`Ll8m%b_MM__a=7h($H& z?bQS?_yv0~f~Q`iRLW;9lds{G(z#A5)?ayj-W%XSzXh+Du=0DHmrIxd*Duuw>IsN9 zOwz$BGv^TXo=yl+{1}!WhKmnn>N3^dGtqes&JJEyaeAEn^bp{ z&57&JIO@9v_5BHOWrZ6gT((`pRkS;C6J!#u^=Hs(JwbnzDgP+mQSL2Axwo9SWkV9K zKeQv}almChS|i~aZ#de2!-;F{chK7k^o9ej;-e%9xBj|>``L9Tu796{UJKA03b^b? zuQ}+w=AajLT#;}ypcPikH`qoMB6$ianoVW=$9Q0lQdIJI1 zt;b1klY`zSCvMp_2fbedy$=AcdykXeA071m=)|?QI_NzQ^iGC8rVFkGJJdK~5IE;;DE3dUYFm7~Z+X@d*mbdN96U?HZmnAQ{_xwFcoUe>AHv2R^ZzhJ9k)5{G?{i1#G%TMM-K za{1>zOw{Z2XPqSh<{sx6ORt;DgQw+dAgQ{nX)=VnApVr$BbMQIy4>}YGK6mj+p+VD zRFEMg8WMjXG;AHF!DR#uPAv8^!Fv6_V^w_X%kif^hIkN4`$w3=t*XD^%N3m~S*Vp5o7~6cWFK}h18e}1ra%zJuJt7?Mhx#u{lJn~gVJ3t%BAa`0{h8}woHU*H z!7%1^fG6^NFz$uRC2!VUcH)jauZz&jhKl;SA`9k@vn{r&rf5v7q$xGCVA=MxBk;c^ zIwYt5#&+WT6Tok)Pyn`=e5urFJk}iHvr$76_9Y$ZNjl9Wl6B5{5Y9z;Ra>}c7!Nhr zOz7E9ZO3P^%1qG&(&CY8JE&+boAodpRU&+bq7SFB97ve{UZ$<-nM1s8uiDO*v`ak(b`hw}IU$n`8)lYLfZsWIn--ojs}U<0!Jqt;t<>X1I6IG0r@%;M_>;EM zycoJX)2%2czEk&oOS)Sj7!YC-QLA*H9FteicektUg`N<1dn) z87|fTxUIBZSDP5lQY;^+V(TaRo&w>Q<)a`i^E?$Eh(HppKM!wRD1}P#q^ukwoG?Aw z&zN1`Mj9IZQMKYQ@=>$YrQDK}`HW>x*`UhBMFtjqzaH!b@&=w0(6&Q`mgGQ>HwxQ8 z>V2c|XMyztxjFES5Oi+ zy8iA{2do<<5QXsZCh$ADXB8OU4{-VU=OAW0SoN+9Dd;SjuwMpRoRtWoGN44M3={b4 zLnOxU_{rmlX>5JC*YbdE5$WDyIF|GRH_;!lXm?`adPBVte3a!N(SFkd5^kSH-r4uB z+I-!6+0(PRYxNMp^H_r*m-pg0o`k2Erwym&2-A1^3m;?eF9L4yYnKtEdr5lJWi(rT z1NG)&dm?ojTetPXMNyL;PBBwCQ?Y`VTQ)8Hr94TorFB)*+VZuEbyv2{dwu`wvNsZ7 zghH>gnsm_Wu<`7>@N3d>$nLUJ$Bnnk1=fSs=y9GO{Vw@Ur!^UNG=8DQBcMACpD%#3 zU;czSd+9RPk3^a+Z!84s3AURw?A4^Zq7`Ny$J(MGhYaZdojQ!j(=XWkBJNYM!89&i zqrZ;c)%T&X3n!RWY&^V+pzUTjFV5u}D!_8k{up<;LJrXaXN$8~ID@piaa<$#3a~OY za2Mvo{|Jq(l=Dn7u(jC8#vFVH?UxdD+NGfV@J#k^ ze;?K<|0V*@6L^BaDgsLh%p)+Jz$60W35+2yg1}$`{Rs3R5E0m3Man1eJb@<&tRk?K zz&rxe2}~j|p1>FaBM1y8(2qbwVAC92GMbLzd6GUsU=@L-1m+Q#PGAy&@dU;Y7(rk# zfqn#f%q3+K*!~2eoWS!0o*=M_z)}M92uvq1iNJUQV+f2OFql9;0zC*s1h$hJnFrL5|0wV|vCeV*S4+0T^ z?IEOm0?!k8g1{;QO9{*)FrC080^!#L!cecygVy`7YM8)@DPDz1Qrm; z6PQ9^0)epvY6%P@(4RntKr0@zc?|B8ybB~%LptWkS8#Ozytzg3Dgo8MxZ}| z<8jaAF$CK2oXfKkc!9t=0uK>bMqmMfJb@_$CJ-1)pq9We0{sabPas2}oz!TR=qIp_ zz(WL<5m-PVPhbjx2?WLxs3kCrKs%v%JSmeQ(2nO^o|V801lAFFh`=%e3kc*1Od&9V zz*qvc1cnjlPvCe083OHi&gEGNyg*3W69|kYP)lGKf&K)JCy*h~ zj^|vSmB0%G))9D!z%l|02;>P&Auxf!SOT>Kh7ssb;CKQV0_}uvR>HRn1lAFFh`=%e z3kc*1Od&9Vz*qvc1cnjl4-jTE&0Vi>!@grnZ)COLxU$8aOWJWVbhW>e zE?6_E>fH&{!5!6|TOj5P$q()rh~?7zWWA5`+UkN>s+z5eP%RHa1LH~jm%iGnrQpoc zUUOtIUk<;2IznlG>zTF!WFB0@rar+cA5p`>9YSmnswEbHl-OpFLZE$XE8MUpa`6qx z%IdVsy=S^`dV03D;c)ha&nk^RvHl3#tROz`ai8LFxUWfpQj2gKHB}7Aqk_DB40!g= zuHL;0wD7h&*LHwE21NK~Qq4LzRk7VNTYK(pSH={jsVai6E1|USz^eXxHaYnI7Fagr zc9}|N9}>2zQGtaqs9psx!7QFl`z|f6THTG(cIGQwnME}MM8kpw$GkJjm5GIxrIFT2 za=gomF{spasy05AhHA@%P-zzqOg|4#>3uEOW4|81GYadr}8bMT$Wu{g$NO3N4A z<0~MB{Lw>YQQ$M?k6SSklhF<1N|-9GeF(5u{~q=*?*F}9iO2W`97CKxqT{g7UkKk8 zfwkmLUW2`R404G~e2e{e0OKhXD5!y*AzfXF^E!-|Llps<82Qzp70H ztDdoY=-&Z$g$m*jQ+HL{TM-8*MbAiF-Fp%2$K#j-9{-3gnAyMTLrNEDS zp0LLd#Fs0bwBnd^F%B$Mhbml#--%1H1wgT|WF?o=hzi$p3073NiF>sIm2j4##zDPq z%Bs2iF#fFCNH8hcJFF$Ecf$#^#Ja<> zqg86zlvODt3Rt3Cc}5L%K^#d0*z=5Vi<65T*M8S4&^y6*g|DR${MTHXU96ZEe7yiXGf|7OC!Iq)x7-Ve|HknUNK06qgQV6&52YHh(SO%)xK zg6_&AHBK}0nmnJ?1owLA!LPShKJu&vQLHfDOSbl2R=LXiqO+D51x02rj-|$4LLRkX z{~cqOHOFy(v7^Pt@+=WfS8z{=(s7PaKf690v`3Z6b}SxYUPT8iIrZ}y_?@r-hx z+}8f4HSNOwyPiLIMh`zp-pQt$z#b7yIpHb)IcW_kJ&Px~T&^ z_IB!2#tTC@2CYcPHHnV%9y^dNKf1dl0$ZSn<)!KV!Gznxd`peRT!ZuJ8p8||*dCQE zJwvJ3%bpe>z7P87Q#g5l1AW%gCnjReMExR&R_N1Db@m+WPAvCnI9=S>>xj_{Coy^| zR^Bgp@bgjCduC9vxrG+cIx=*al7Z;GUR%?-++ix5G|=HDh2ft19VdSnGgAG!#gS$_ zT1Ji}DW@X(Z8P){wx24<7@N~6X$@ekNf^dI=VJ`k(Ne&I7UI^;0qfaatcrQFa9^`d zS_mJo_5o`lhUxf|_4t3UEpXnYU z4;K_heqfv-%8bFU{BzR*uol=pk!aNd*B*=(n9Kp&iA~v95-4dJ&as`SIY;?}&vrD^ zUjqGc+x%cO$Z#iy&JE+t+!p#OE;INQ7}@<$@{fSOoaxt^@%!Lc4y=c<4DX*Q9{vXN z1pDh?PaSOYMigFC_F*07l*di3j5Iz2k3U}E8~H&d9+eNS!}E}nG50m#=r4$LgXlL< zQQ_JB@sd;DPAHC`b%U548r?)m}Yx3pHlz->thl-6p7 z+mKe?n`^78*-dGC&5ky>F{5!C;!{W)@>x%)r>Z9J-ftw_KcB&vCte|#CE!m0t^I@b z2%>SNZy54T`X>C1-9q@Y;iIJAU!!#FnM35>vh%jG-_D)3UhH*?OVDd!wDy1p*Cy<3 z4I{KC#r!+?UBAKK;KV=pd-&w`KdF3MMEY8cd*S$R%T2uf>vB)5c9uK#kc#oBeIL9i z_8q70t}*XrN;=S@`j0m0b!*}Sso+|tULZb`S*0kc#MK{YV4w?wD^46 z9f@3go{G}yDuTe^#Ae8 zL%;JSUK8*M2_iF6%r2@dreF1{0zBv@mvZjq@))(RgE?V`13RAd8qA)VB)*y6Y3MU8d!zrL^Y+yd5FonuMlY!4M)j#f_khx2t zCx=gAW{B#wfFR&b{jC@l(M#-7Q;Z8P6(+n2t0{CJV^v$w5lT0tynmk-Mf!kpXMJw{M8G2ES2 znGdTSsx;y^;0?Rgihc+OkFYVSLxFH+#Ph*r zsF7#02Gt|q6`FJw6-H9^Y2k&n_&%xM<_=p4r-RJ*PPbE*#G0jHtx{IY(i<JOrDZD-~8tULq572{H2ab(e9a(JjLCPHNWS|n_6=mR` z=n3~CFI=9@JYDb~E?enpsDSfJT0bfQ4?{I7Y|^ARLK@SHb9~^eTy#oPdJSUGAO@YC zh>9BKW;b`vz;fwL=evQfW5)H7eBkVC9R+mI(K*Lk(q@5=O#A&mTYQy+vt8Fwvkn{^ z)f=(7o}*nyzhnYhX#G?Fs^P}E%D5th$FPP;&ke?8EdPH`_1s zx`A*_X)l7eDrG-@yRSx~oLZQ69Q&M-mdNx^X^$&&#(#nHxcgmY4LLaVk_mVKzCu`r zf9FTbMCG6%3M~AB;_6G;6fQ^BTf=#|B7!YDP2NQ3P|;r=lG^?qfy=bsRJ3`tBHczxyqiTeN0OXTK^{2Xm`s0DJmJKFPU_R=zvBvmb8L zQ+zW3`oPPQ#Dins6{%Q?f;$pNcMkYJS)9A3e{5;_u8>zx(Gzop%)z0MXHU^w^5^KU zdwdiM`rX{KgO<(bK+gsd$meQx0a?BGacEGE>lNf(L+_618sw1DMgN(wH4qip1opg4 zmDM@)Zf@rwwQ!l)@}ivhm{ICZ{m4Wwqg8?KUEP=pH1-&%f;WIEJAnOURi>5QU?pL$kt_jGRRfE0lB`%< zLMF_rQ2|QoNzOfs<(OAlZo*-T{>&4p);x&7o;>RCP_Y91#k;%4aBBu8>UB8JM+`(y zyyK%*qhrQag!5I957@8V9OT?rj{=VV0{hAs6`L;O66+OW06sIcj&W7Y*yBA9pBbbY zo`f1AYv|9w&o(mD0_VH~u ztNHQ`*n1!28a|VQwkKF&+0)u@IG{v$M1e%ugGd)rkr-M;%6RIyb-^qK)GvLa!bkdx1 zh^~JCXpUhy3R9cT;yNG=UK;5PHwvuo_qMl=mpi}ZkL#Zmm8je-NXHxJc zi^V=Mbp^Jjzf{rSK_SAf2Jzmzr$&=o-LW#er}y^X)oe)~-q+2bKaLGrwpr1M&)3L1`l_@aPc?bB`*s2+Xw4i? zh(~a1iRL}7dftHc?H3f8C?E@;e#sfD{ZBQOnP3TNdh=aO^}MwK{FPN$7q!e0yN0~o zTJX0cOT?#?kJrOZh6taoO*#4nMQ!+N=eJIdmZjU8{!|R>(g2Q_r?fB|KY~0h=C<{( zkXJJDt9#n9kjNEpjI4EJJANvV+5u-kXbCR4<^$Y{`$b!D`j$zAc5FxZd%s7MXN&h$ zU%1T^xDo0}k3BOjYk!ssbPJkLuou9W_x~GH;SX(A`(tmDI*4R=vwLJ2_m-du`mle( z8C<`>EEteV`eqPzuS#b*#YP5Mzm`g~)+#Erwz zmCo2v>DEt53wPoDjvo;|#W+hDdm3bKwi06Xxm5FAnNHHdz&RpfA3GZE64}myg&_72 zVobyJKUOPTOn_U4W}qO5u60RN!HFXz){4fS(tjq&hP&5;zZp+a2u>%SL=}W7uE{h0Z29Eg^Et8Ha!Zbt0+{~HgmHt zx37NZlPbEM<`;t;PI0ss}@z-rg*8syoe=5m9iZz8o=)_bX(1;P0yfZa4L~FRlRi#Rc&mGR2@>I zH1p=oQ*K9JQ`iG;F19XdzS#d=&ySr~+FNg2zj~_$P55}@G!tiJAFMQi=by`5*wbv; z#qf80;Do|*KZ^Gp4ccY!moCG(+^xNG9FTjMqPZcBR=ynek7FsZl}WB!uCIz-Te;SCUF)`}*UMj5ywSQLYGe7v zMZjM}s8Ye@$o&jQ$T-ZY7yrKw}l-s!YzE0P&3QzRHB!6TD-%Db|+d2J{#P<-tt!YAg}GMIsPRW zFP_GC{c$^99OIJ%H$d$OrMNA}RL9tjk@)^Ym2o1zXHkHNq#P66L#heg(k)B~fmlJq zM{+oSXM$$d4H;(aKp}g4DHYQ*BpBfqhk_d@XwQ3ali;^pv)57w8dt&Hy#ZM-@fXD_Jg0JpXx$R-t1RY`>P8V_((+HW!tI_v z8SxCmwK=0^VSl@cYqTU4_p2Gavy?4__VT!IsOa7Cm(DUzL;18A1a)O!7uAmdj{8lc zM8l0@!KWW$f53vDco|iDeGl`!d+4x;TX+_tEAYATo%E75s%|6VRP4Br?yVH3U`Go~ zx=iAeb`N+iz!<}~WeLm)*$Nwu`~uw3`8oOZ_|0l4o%rCp+nV{M( zun@5$xoL$q=JtYR>YlgEc8Egk8Htx*f~a|rJe6QMhuEpn5H*$E=63CrR0p32_;y2} z$pwESdO^#xqPCgprBpzwvp1PsTl>H7IHQDz{lVvL*uO!x5%1NwRkNTK&emFuK%Wh_ z7R~`*ab0iHn2sR=}-j7#HqJyCseX z3VHucy~m}}82IwhYkITv1b;`Q{h6!oHPTa^9{Alhp2(N@E`)#^i{Y;r1ev5g-+Fse zt+)Vo`pi#ni%KZfboxQiqqo0#elfof_a*kf=v85HAon6pV;-urG{|h5MK}4 zE8pJ1YcKqozY=#};-%aA>A*8%2Xx!Fam{TWn9`pLDs$G}G{9RtpBD327pj84?4a@M zMe9V(9QYd)ftpa*nP`!22Z0;kQXSOd^cW&*4m5n{wR#Lc;Ms>Zf!ZeHjWj zEYR@xT_&oZf_@nF#W_P@&RFg(cA_|ojDr_wvr++n-$Rm%@8`x>c+=Bz)*lB8T>S)y zcUZ!o%S*sf*!+`%0(P517wT{!Gv70@THS$E+q;J57IIrJx^Z1zu$L()uGhsKOC8n@ z*?suVZ9#n>x&yaZ&MjCGWvd#~NeAYv7axb3vxA-+cmaIty|7MOx}OaHJrT{rKd*zo zeXxXCD4nsM=?dC0%L;#+Kv5XK>(<$XThZ+}lArUc6M9r3M=yMCvb+xLUT_!S82*-_`C1ESnW} z%aB(Gx5b;X_*}dLZKr(KTfBPiIPf_MzbqE;tJeO{ugCF~_4_xhxAY0)-D6g ztpAU_caMvzTKmBFo|(Oe;gW+R4ulqlK-ybTidLF|I*gEd%vZdfF6dUt%CtkiW#x%+ z*fS1jfCCN)B-&ANI+;pJX@#grYFhzxTetw_dU%x&d zW6xe|J$qfA^{nT4)^jO%-La;ziBX1rb-8onih2A+-&wJ>I753mjHSL*%^j@Co4JY5 zWc}BjHyjFO10Oq}Z1KylloIXI$t$iqL6;ZoyxVUyQ1lRQM0xsHr|ft+=B>fdH115Z z`Tzsr({KI7SGKetGohsUG5U*RCGX|YjIVh{E@MC{RCJFBV*&vVR^4rg)E-gD`HjJGiM0FRVxx2KbQ?C;}DROC~Z%HrQhiI4Z z9780Y6{;h!a~E*FVxl{rK}HJ!qahJTdx^eK82_Vnr1;x2xtN?ywLc4#6xG)fD(^+!gV zN}Q~xekP|7ksW99+^Tn((2+k=Y~MQRtzT`_5wuoAW=44a{J6`64!lj z`V$tfS;nYzN~Glq>qZkDYkbZ}PB789DfLZpMl6nvJh{(D%+vtHOwDc`P^8W`lfj6Yz_(?7@>6SQ6ZMjWKag$ zFjkAz(0Hdcjl5$Vo=)>|8WrU=vI}LhmmOT5w~Qa?C>+>j18u=Mc3ZUc+0X~P!y0!@ zf*8kx_+rXG_h#xdyRM6CM~9uXm8{OA93RcSlgse~i4_YVb}TL3ZXUv(mO+XYtaO5H zO4@Ed`^gjh3dc{Cq5n`)p@`d0Zjq1K*TZ{`$ceP`E|kRBF^r{;XjD8jA&}dTU&xK; zjXx=9L}yq-?h0hkL#!99_edL8TpquJQj4-2W0iuIS6#;LC`ql0wtm$I9%l~=Hw{wj z#wis-Y@luk6%vHCS>%iHyx8(%tNV9J%V*0af2{awsb$wnW7U32e)=-(nGgw(ZIXo+ zE2#RdPZkJc`K0@{L-Zztluqs^B)eBJc4CUx^GCK=zBr=sA+s=(e>x2}`^(9w3@`HW zS#_I>$usveFuiIZO};jfA7OqE(Q~;mm6ZQl(uWm^yUlenBDs8@BU?iXcoIvf#AN@L22%r0>&PguS=Vii^ebmsWNF46-dzRa1b z6ms<9o3&g=l}vtmKSq9t->qyCzC9|Zerv`jr0zr>JV5Skti-}jx<{k~!pr2Wy$GAq z#!><~1GjXM{zQf5kv=`ycz2)3dL6rk8`3>B=*uagKO&Zj zS!~cthFF)?@42wXui{oXf}07P0n-&v=yCPOKimoralX?z-@Q=Tz5WnK94m#TYQp4 zx2x_d$xK`^XC@B`r22)D?8J2kxa5(H$jw_DwG<*~)Pzx*X1(yFqt>P8;SJ-JImb~Q z-eH{S=(o%6EaV*cx*;#4PDzxqABx|s9Hh@Pb(u|oDd+35!#{SaM1 zcT7%kZS8;TV)-RZgJv7;5gZzy1Yb|I;(Z{n zv0sA9t(O&v$(f2s5o^BuS#^-KI%)f53^%<&mVBH;ycg&1NewbFCb1lEc>QGC^fBD& zI?5Hfc4^R{>&Iy*UUoAvxuJ7riFKIFH(C`Wb&kFXW#3O1(hR@ zZy*^h@c)?ZAmot9AmsbGxeuAIlt?$Hv+bl1FSu@5xPG0|kyqE5JSh?~Pb7o=EXRBt z9#C_CzXHq`U>-Y&Y^B!?V-N1AL2pSko~6@1K(9B$hqGs&c9hmF02!GVn#(!MX9m@+HYm_kokzJmpK&qrw2vOLR3HUjf{PR8ow)jd_JkIQRS&& z4Y>E6^R1xL8w9@Gb?ZCWvhs#)DCp}~iljr?E094P_j5z>?-_DWhks6+>va{N_YD`$ zyLe{8Ba1z$|5kO7M9MIh))f+tD|AG28cJmKMfGjA;mE7KdsCu4HQ^?SHh8eqh8l>+ zVzGKD?qqVIUn#)r;9rqKhA+BXbw49mcDEle(YhhXF_GMNDn`gWm#m%|iF=Vd8W!J%Xoi;_BE63PRolW2}8pDvX@6LfK* zI{Fz+An5IMFPYuM_4T5xQ;~lWQSmjotQ>FU$a_zfhm|kWwBSA#&+Ee0k!Qp-@S?K9 zvhX}ic(#ODmhov>m-sMC7$3WP^-e1LddF15D(?11YN0yv6_UNEL$`D~VA9;2GgLV& zipa0!6!~=#HbvyuIN{e#SQU|9j|#t9opwbXQGD2sKWsOx;K*8$QQgYHs2|0sGKEnK zGZX#T3U0eFW}#HgxRoXjN)GfI!6}N-r=mw!jN5J^u=ubQKdj&+h-$YsA>r;21KdiZ z2POvwIw7WndV(0@)`lA34l&HFH00srz(<`B6Cd&fG19F~bufYGHZSTZw;Fqbk^`S{ zLZyN{L5+56lhW6{pE|eFqCUxi;#{}VMDOIl*PRfHRGuI%a%&T!bceXutu&fR4t(DUF-74CVv1WEO6CrccPkB{ zk^`5IaP%+!yC-Ow-Sr)7*pJ*{<7t#xg#8b#UFTrR3z2TVc&O$v_UGfvHz1C zSd9GA#sA|8(pIT-VZBNYqFdt#jnCFS|oxq%s>j6LfAQ)^DaKNNTBe zCOh37Qh-#pik%AjHWKSM#S^3usdhd)*&R}tR947N0$m%4^_%1gQlwOSH9OHAQj}Dd z%Z>*v8|mm%Jl+$eXsLD<8}ANDCzV;*aiC!%9S;}BdV(}bs$Ia2b%&H7m3_*N2JIT@ zc(8c1CrF7>Z5tcy4r#7bmdB0)%^K+lC?4er(juw$Dt07+3dPUan8Bfqs zq}uuHF!z4(QduE86m*KL-%wAGGNsz9*{9thoA)S)Sve}0~qeeQ^#U8nUYN>W1`=C3d8mVk88weUT(h*!7=&4T)Qte#! zu5-UpDqF+i)NdK-=v&;!6C~>SZW?7}d%O3Ek;-ydHE7iH4*z1cCrE0k_NT0H&b#Az zK+kfV^nuS~{k%Ov3z2HuSTFZ}g-K<3EDJjIJl2o(1SwLgy^2-1LyD5hvRN7E)bm(B znI}lm-L<(w_V4bHbW+(`_9M`#=egkGk32z|B-PGkKX8YXAeF6Q-v^y~p6gruz9&eD zQf({yKkks`N@Y3hyP#9gbN zb8ijmX;+P`+MlAiDaR?xed`r>_kK^k$5m>n&7Nbe z4X3g%-&>2i<6bKkwSJ7Y#Bx9F6!WHmB9p`SUY)i11v2l}3c)vv9y#5(@9^L9XK!5nLynJTzk zUPk)L(%F}FrR1qE`V&x^jT4M$Zn1jDp)ZzVa&&8NmnL*;6V=@-b_d!UUw57CtuU-L zbh7eiQtudIxd1N(oke^Uxj8#X9`e|w2{8upTs{nW$P)$#&liUw4|#&W@O*O^@{lK} zgy+^_&OGG9`0$^O-!r$5Mt5V5BbWV!l=s9dom85~o&zP{3J&<(ib>*ZLPH9O-D3)y zB-LKUo*}Th%hc1QvTXKrazMgXhnlJK0O`?0sdgcI(jC%VscbEK98`QOB$(qKAcZZG zYUi>?UE^oQNj-aCs$pY)Ob%GQ6?YOxR!kymvfV_+=)y0YJ(0JA?wm0uZ29r!!i-@Cpry`4ZBa{&Y#95OJ7-KN%gm9= z^4Yzh=UW}xulKH)L~6P93XpDv6-l+T**$KM)WuTSYWDkEIUBa}v5u@$-!FHLk@TwP z7?Z=cqJ?lL(Bdd$cilC{%pFqcr|j3s0Xw!j9^CP@=Na20)nCo-ybGGTLMpYfU){>7 z*y^xu_{!6a9Y<~FjAgRh-Nu=DN-A5$ZUuec>UikuEuJu=T3Yvf_MZag_rQuPQfUEe zPY$Tr>Ih^$_dLc1X%yLP@!ex=luC2hjkj_dw>q*mZ1glnYFqahKV{dukCBneGTHUu zLAN>jeO=^fjOuMJS_u65^nTbMDAmYi3z7o@wmJGRg`US5g6}&qBa>Zo_c+6((kwRj zR!-P9N8yImp2is|jb#m+?LN*ZsjPrqg)?oNBk=20p0Gb!s-44TxbX*BE}MEQ zXYMvf_J&kXGqwn|o!FnnE^`}a=3=P~j&tBiw{Z`D-RTK4Qo7fjD`4C2#{T6}X(8K| z9Kdhmf|xs=$C%kY3ND9jxqFN`Qt4{8=~hn8Hg461CQoB5>K+Fqus__#xIrq*V*dbV zx{d4qb%UodZk0x{h7~wLLgjkW{;#DPdF*vivTewwal`XC_edkjVz1pj&I+k?6?+Ag zY#aCKhFVYKJT8qTpS|op&QnrZAxk(_%>UPyJYj#eRC_gB?FLDGMJmf>f4!Ac1MKIl zr+)R+s|KllCi{yUEJQPPVIQ}Oa04ydxQD(zlRb%WJPRA1ghj3uQ6d&rKlvHqRu(q& zY87oxlDp%sKYN!CBeAXE^*d9EpYV3ea~6(ok|7?_iY8gs0jZUSnFQ~nUX{$np6_6j zQ*^AtzeakO{1_G4`kvL?{PBU~(E2&FDULIv+a%Rv___UaBQ&~Sw=1=pgX`hqKtvP0<6@^JX@QKP&Q@4noEc+$q!l9 z?(%TeNyJR5?;4y=4@PFc7l{{&ahEr5>jz8G6~6yHBrl&D^4@$p->iT)s-MG=n+J=& zdo8Vr&p;UZwc89oK4%20(-_0WpXEDzDWU&ATi@H!Wr#Qrt5jdAq%MLEjclhJnR#ux zGOLPGY$#itFqhb3i8fbS!A|bQQ8{!has(AUe4Y-2^-JGI%4I(VpNZ2Vb|PD)I8Wmw z3pw~x0s```$KF5lIPuF6Gj@mV)xa(SSpZVL{Drg${ch9f=a1O5WF5>O$zi=p>xl)l zamR*aVyA0`ufrBwHdkW49BnPt!cupLX(KWKXYK8G$+76lJ@$?SCgRwSDp532h$I!s zCt1zr6q3zT6&F-Qa6cT@Ob;J&1cxEVU|eK5aI|MGOJXH!>w~eR4ty>*(Qam9SL&Y2 zL8eAnrIa0}!?4?e5QlKi%6+-XL5SC3IkwDpD-4UBJZ@3S!Yu=tZEbaR=%aQGHl7n^Bxt9)R#ZEMlcz>{&yFQ~r z@W7}7rV2BZG<%l~nOZ4MsbX!x=wZ!xnS$&%o7-{0# z?~SGD@D4$aiji@^foJ7;hjWuvf{!ySs%7E4%r>ZK=~*l8|E zK%|@=aYzPR+#)myJ=9MlmgFLaFyZkzg@?DK`o+Q`x#&VE9j3av^0K?dFYMiGkhPYt zSggfg&{$J7EjN?}W`mgtJevUp^z&pv2PV?;3G!H;vh8(}E6Yd{^|AKj%v==i=88TREiONU`egblu1(Whr&X@YcTYJL+mu zZ%^Bm&i%>|&%!Gb!cQBtfH1+&1ca5n0^8~ z59bRruWs}v7&Cf_WbG__3;yWu608Xwc@TJa6%;W~=IX;*8y&{fkgt=>kzx<{V+9}P z92UQYC^k%^EUp7y6Y!9SkAQ$1{0wns`AOIz%WqDB-%x5{8JCO9aM;g=v0s#Osq^X9 zDJx6K@4T|cDPNS{m{N$$i_Z25&i3Qc9=>E3EaY4z5dn-l8TA%3JQ5g1`zYR`M^r|{ z1-;!K`pjh#8?+rZY@OhNI_ont(un2$0F0}2xRKJp4r{%VUiF>w2{YHLN!AUolu?sY zowU5&{v3fQKm$}aXkYR!Xo&18H=-4-L)_1;jcV++cOJQT^!B+cY|X~@LoFv8PGA4^ zGNm$>B9q^Y3RvS>dVOJh!nQJfWvp?8k_!H-j^f_XG?N?LWaE~fp|j2%vCazb zrkqk_yb|%?1#umj=jykX#65~}$BN9h~7@=y!aBapJP3`%Z^vs@`^PBa(DD-tWJUxVQ zwh7~G6UK>nve|ByhxI8BUs*t6eTorVpFw1hl&;!YWyIH<_?Z(AbG9-5s_1X-@-??x zXx;YoEvds+)GvDNOKWp5#ic6ySeqZCG{23YPB|>_o>nv!CaG|iH7iTr11H8JN~W>O zd*wWh36_JYm4QL?tPFW7eXx+_%vFK?mB^d-Ad}>$vpmo}ZR7d)@I_yq0e6BGHlIIU`Z<=QF{=ntSO`*>WMZ}Zr zrqIZDTY=jx7~h#4#dr5DOX#s9tEwq09VUsW8ODKp z=H*eoWJR0EiWbc#-x!>JqK>SnpWZUwVXM2AHGb|6&0k-H4{>TEB7*ng(*3A)@Sbf` z*lZMa&Q`a~yn-$s60m`uoj)XDLriGo=M*R?_G_&T9F;nzRGc%1S$Tb3JUziMA*k$o zMM>Se^yV^^(os-%jlAV2(52n*HkFrV2{jvc5J=9^08?Ju?^i}j_z4HU)BF{y|KW$! z0H23^M7T@8vyi!z8zv;+iF|4C4poxl)4G+%!g+}gX=V8?gjej(K5*UM~;NL?;f zW8YX95d+if7rkI67aq`;~krD?X;!U+4*<=S2CCb!{Q*8luCxwhT6} z6V`QQtZKX?zv{OCcte@ZOi^~MU{WF-hNvWf@J-R?d0au2T9Xh#^|uUQ9$;K`BK}Tl ztc#B-f)^LoWTq3t9{#*1l@KW(`xc>lSPfNba}Rv3n#LG)VrJ>dCg9ru(k~I8eF#3c z3HaQCOt~UHFBkBcM+RsCU!31;t53P`**l;iKESa{z_B~(@5-#xBB;XjbxPtX3P~lN z%tstBujku!!rL8qOJ;EMZ}3dR9wuXP?%|f1d=S~gpw7tDIT92)@?9}oXG&SYpt8;L zEQq~S)y^U&pSjn%c-PFB-y$>PkKCNndWhemoxU6*{}Qnq>+}_Z1IG^cl2IilhPox( z9C$?<$1zm08um)KL3m`2rm>}$Bsnxx`~@ub!>%_vOkj zJ+=+(**2CB4q)iu1jgm70{-}bpj2#@xJ5X>VVA?@-_LSzPkU#{E~IuzNoIdRr@ zE-x{8b0Ak3VUv{`0o_qCaUHa{so@@fLU-@9Un&E4Ho6_1N~Ao^4}$ z#Flr>R7B37^f>a*dTh@6&%f&I@5%yhut~t`aiw0~5>^*`MamOc@D)+iVy&u94qvFz z%I9+6Js@Ct!Q3c4&Q&Twk5g9`01ZuDcYL62`hptdosg0Bd}I#p%({OSyz`PCdApIj z*e}UpscU~^j;mgBgnDT1rR0c^p}Dom5s^c4uZ4cglAIQ@(63-0g;IZIvRXToXkj!I z^d+n_2K^_T*ti{EN_wp*CN9?_1xGh&Q1-FXHO+jcetYpoXr+0k3`OH zU1oDUFt_9Rj?k@x>4Rm&W9YQmq1n_d$F~^Ybv}-_uD9h0`IhhXG^c2-H}UYjHc~#q zn?g*0-;#ngsuX63>M=Ql7ZOKe#P)QJ7jiKw(MzSG&B`iTnb^TAH1dP8iB_wZMfPCz z(cJn)DTF6ILVREDp8>ffZ4k}tPZN&j>o!?^Vs*Sdb$+WHGP`k@qIGiKtYhnvE^0#~ z&&ooFw#wA{n4_U1RYJ4}D`E_mDDTMR^KkFB`lK!U*7PyC7hG>o+Hx1pI4mFLO@(ez z%K9Hz@h0>t$Onk^i3}>@dR0={9HWG8gmJ9d+39M<=ug_tTrftZO-H1Yl*~u$sn6bY zmBAzHuX*4M)24s1kCY-0_i%V&AuB=~#gxj2DcVZ-CiLtZM3ZWYMwSGM^z4b%$Z8-w zWo3|en@bt}nF~w6<>SWpnX`yx)`~SlEbGWt$b_kg_}?mvLMi$^bmolm3tG&!Ms;3;dQ3H&3v#W+E$f>_XmqtdTmXV!bm0hz^*EesoxQ;-#!HN&NN2)u>#^^=hT= zuj3;cJ}vfxe8ih^;0LIy7i`|x9lH?9G+yHi+{5mWf8$McBwR9){SeMG-u07?KW#^x zBJM}VyL&IREwgco#Xc`#FASnzDzhU~>DV^yX~>0aEaJzZcTs~aQ74eqrR|#wR;EZ^ zzv$Taapfb}uoxmKq1@kY5qoktn)GDd&sy|E{@k@uhIrBot{nLfp7o|kL{ZX{`bp|A z(9NOy+sK=sqogMm#MI-w7t=wl;w)^ABfYtSYz96Q?>)fVQQg*F0gf2Zy&ZGg{%G7G zetXh`cFRkpVw?G~h}z+txrmn?0nOJtcDQ73cy$qZUCis@v?1u0-xH~D)m3@8qQe-L z+Afb$v?DhAV3!R3??DK8@NNhp!+JsxV-}=Ph_bB*HE5?}?Ws>#Ts=az%qT-#5c1k9 z+WEM3N}?Aygmp-5XJTnR=6KSgA)s3Ah$Gq#nwFw|g1}z?u58Jr`9$mR@Aa|B|L#5} z4)57VqVxFkc`E94Hw0?je+a?v9taa$5V&KE%nCM~auXRy zVTw-wgV=wad6nSorxQIJgVEz|qWn}D`TxH=6O=LtQFBr|H6qq5qFpUx1RrxPXsSk;G!zl4;U8ZxrWY0BRi1w1PA@8&ChwH;<@-eMVz>HF z^{j76&-=}bLj-NP7c%{Xc+p{Ei=_!QB!-@-p%-X(-Q&w01adCdG4&~BpMB&RbWfJe z`z zs~Ls}QV$V~>V{K7)>=_NKM1o01~Y49GfQ6l`M^frHgDB_T%W zM#{a0^Bc|0tpk*y>Sia8=e}l}G_Ex>#QLLF6-8R*azQ$cS0xpyE=K?4S|#3wc!?z% z#*Fu;sJOe{$MtC46B2>>l2VSW$t2de3l8!%yx07|OH3$LBYZKq?^KG+S1zYgc0`3z zrOtjl)eTj^0XejNnRS%&J|hV8b>#l@wTbP=ZBrV}N=WJAS1sus&EjkUM#?5>HXtiG z_lf-OHd*PGV_w_+v4*x^s8^L{Jh0%bs&n$KJmiLFp``-KaR^Q%_ z6LHfJ;W(`96#ID>ZZg9CU#q_pmq=s}t`f6)U#zqVJF>EAxnpHHv-h6emRzY2SCi~T z@yQSy)BTJ{N6zO0%wo24*Uk09eD9P-;J)h!q*vVbTv9#RM?Ke|#z}cR%>Q)($9t@q zq23D@2LI07Z@MDlF}QpE39PRRN5XJhe8DdDx#ym$tLgJ%zofu1BLYrQvH&`ZkG0!4 zWt9xJh~9|hK89pOCMz!Pd3lbKBJ#cXM$GyqM-3NVxN^IRUvSR$$yzvj01$oK~^oaIvTGZey}4`eG3)( z=ouN^Y?Ng43h8HfB|6*;t-AkC? z3)WMq6zRvuzs5PWQX<9Cm)(u=>;6|NrTq5pHhj7PRLXsh?megMW^pvkDe~>mk^V>TZpZ49xb6-_OqqGdhX z--12@u^SL;LOZlXN$fd7B5h3=*Us3tZ>^ph*%N+p=F~`}ibrGzR`&8fLxd~SAZDb2 zL=M+Ns=__-H_%G9*C+P67CQ7ForKS4#F-Gj-xJ=_X#yQL)XBuv3HzShh=o4h+*V)o zmkaA5_lfzr+{WBvyqM2~B5Jp?D7qYR{U?<#fIW)qKhh^6Tatcd&f1a+e!in40WxLu zqM6)SMo}hXQ&HZP6QN}LPCov{C zkw&eGl=2QCzNO2GVsbSVC}>Y0O&Y)1{8y6a53z&jmHV`KBY)O1!!XturJ^SDJYrmS zHIniHDo5SzP6Ansb1BA1k8#FHS{mTWL`nGJ6pF|)Z2QFP&~QVVIfQ6y_EcnJo6qSP z1$y58&AxEnsRyx$a^!)}4)LK|TdDfQkZ~C2MN&(g?+ss&sL}O_8O?-qCh`oTj0rcX zWMqxqHYm5C4_fizj`DBgHtYj0%FwYQh2LZ>^`cVfafDiDC+%7tTGW>opEV4kpW!!4 ze-+1s`zsv_PqzytTu@T5a+>`j8=6@wa5;ptIj$@RcZ*nOn{CbHCNSdfCj^_Gjh7Eq zo32X{a8uOA!6w88L;UAYy=B^Kz&7t|KcB=L2=ZuT%3RyekmA!n&$V0pj<{@dMt`vW z1KEd{-kiu^S|Z5pV!P8)J8HJr?y+pUWqzZ^XMfu{6S;SV?5A#cUR8m6^~mGFuhbxt zk06>V2oxe^cKj_kgqk<)~QNxK`b3S%}k%jur@Uz9!;>#M4inD zeYA~oK{=2iLODMCKZY_Gcf%HMCvT<8txsI|v#Ly7)4BOr&vX8zxVaQ8Ld3i@en)s6 z@Fa3lZ#gpe8e-{KE0Zz`?Qlk5l#!Wz*ni_^@&sMgzM5`q$yYXZF?vJ?f43R&M7x^B8g*sMxdmrO@g2@HKvm(2 z{SB)n+#$=ObY&z{YjD8g9=iCYQLv$CBK)c->$vJNyL;9pJL7+m@uMS$|EY{09U0X_ z#$Ti!N_K=Ku0!rgl|N)r{te0}1V--FChY<2BsO*d*;)1K;|~BITev9=YEH(et>+>j zMN=}1nR{c}lQ#|rFK_E242R}SC9Q44+2ws`thj6Sx>30&`M{WR#-I83b_0o77y5N$ zr(-qKp=}2aj9lS6JYP=2eTst4krZ=@$ zc`73qA=*lsO6egX-kMg|?96*v+^y9g`5z?ObYrRhf#l5h zJ`$o{edMae{#C4%@_`(4Xg6~+s{=VNCa}AFCMie!TdH0i{k|~I(;K`KD*DA}PCMzx zYBQ}t&j|g4=?1aH~d3~OU!FO8O!p#;A!F+v8JY2NZ98KYU!0=1QAGf2!kElzy-uy9bWDzs%s zf4`azC-gc~)MJ1@@ZGmg>9AFGx<)c@qH{jpbdEHk+WVFAa71Pmv1#6fLwqV%udbdi zjB;v&S4@TVG;&0M8d`0s^1XdEh+}w4=sDiYPod}er&DRoX$AT!^c4L<34YCHQCCh{ zp2*lM^c=O(^FA@l#}Lk%^wfIFM3M1=&eHig4B)WzgpB;tCYr!X$jI+&q7pLVGN45P zwL!j(*TA7HcSXLco$nqk_R<1cN1|cXAOCWX$Wb7=6qS@hQN!i1?2!+llhvUg5&Y8L z!XA(t`xuA7_6Suqayk9~KmUI}4|lK2!pJToSvip!8udElB1@p;v5P6WelC@7Lw1DK zEbuQF`|1QJg66%&)I0TZJv5!M0hCb}h5BI>N`;;HQbzu26Ez_t0hWFb9H%3!rqjP0 zA|TN!O4&c2w3@>GxreH}K4n4v2$foYhWVUCuGnOQOAZWsT7UAu8ZTE zS;F0mbQ*1Gw58FOMq65H>-sVs0eko6TA5tWqh=0j?m*2A_pMnG>*%O$nURoCIx9g} z`bxq(Wl;&U%H}4#_6sW_IPw)lm;3p?QQFXE0>!A%MAY8AFl~h1`jG_|B|S1-Gyk<59}wKWJs>n+$!E&h4;a&A@_p|CUXp zX*z;iP{pD)Egy%SHm=7`3naZ3=Zf^6?9}pD?C?(HiZn9R2zDREEu4qFhaEl+JA7P^ z9qw#P+PUVMn_r22Eym;(GpxEeSi-ALye>uMBz_|or)^K`x7R<`Zh0aNdYJmKgZ*L> zriB(=qpaWx$hjAsCvpXZW)ZGn$o#W{Mwvv3%*V`-zx1FD`h0~q73>pFadi=Lqyq)# z7Exu@4iYkl3znszZ|9GlXuzza-vU+u`-U9|1d*1fsH>b0oKo_ zT_-U)g@xT>Gh-FJXxDi>L0HoS5#O*AgZuKJjwgV1`>7G>wUi;^`Pg%*Sg-j_R3RjQ zI;t=&Z?FGj=Tb+Q#>V71V^~w_(D1K1xqXP}*c?UW)oa-O$UF7$H98DZLtrD4^X>0+ z@#gO&od45SWwn9_!F^hhn`DxQ#dLk+<;g8mZ_jLa^?HgrbfBWmZh6{5Fp+%yd>y{t zhHOEXgs;Q?+Bk53Tj;>-Hm+R3T76R6HuA3$n}~*ot5q-3VH@I^c#fJY=N?F4IF(Lr z9GKch$~U4$7koS%edcyKSY&^U5c6q*7Hs&LPaJZupp+XRtx+4)jd zkZ^wE93ttGx?Gh4_~lr8yWP=W)!s1$S?tEHEW0`7rc*k^T_0vGG#r-H4Qp?5FXH@* z5OSXPZKhmvw-j^dE@Sb?Y8o1j?2)SdxHHB5f5iTF?yn87SRPKtn;=m(T)1xM9SKb5 z(gb%&YKc=XBjv<;8dlMW^*yOqWxgta8lrkOCOnV(pFFBRtWmjHdGLcEUKjO~GOFjc zt{3z#>*vefAi33a7$bS((wm6dB2LG$(pQN7=V=SccZz8JUAW1V87s$vN=^YKe-~L0 z=k(wOP6*t-@vsz`E)reQWide7IPdfImyCY>UPN;yNj>~4usAq6C2H;eR!r2%G zIsm)}&YuEKii&q@e(>!!Vjm1 z@Ly4!mr6GM-_>RS_oVqJtHCK?0TZ$rRueTn@(PMs1;su+S;zf_@ikWNN1uK|pKha1 zmwWVy%ogFtcAJOO!O(=$Vfj3A&Az+ITV9EbQ^=Jm|6wTF4(!33xhS{Do%Jsi`LkeH z7=lCd>gLdbsva1@M#gZzsuX~Qldlg>uc0^%2Z|>bPW1^mG2N)RjQfD~5$JffpedP@ zv3tTnWI?2um1LYQd~{*sI|;5CASH&eqvx*|G6<5naqLy$#2gD=WD2-~cWL8+Id}1H z(#gYhfzLaDJ{}PJh`f?A!V?j^O88{RJn#dUrx~Bn;g05t7Qat}mEb%UD`|4qWho;* z5cI0er4tg6m$s=8=d44kYWhxy5ll1zL<=yxW!`O5`_b#?s$Xq?qv7rANJnFNdd1GP z=hD7k0nD+(-$Mt=2K~Uw7sFn}E-;Z;!LMaQ=L$;^(6$!%_o(LjIpmF<9aBgh{|VfW z3S^VnNIaw(9lampATKVPrWE0H z{R2ITW@N4&ys!ea(RXnx=>Zo6`guX2;Be}NhOD6s6FkXtZ}XQH5P8nwx8Y956vuN}tl_X4%YPMbpKuSuix^L^-&Yad_-zDtAh(7a0Y2SgCMiPwRTsx%axRPc)t5 zmz>2(-sTuLykm%O6pj8|f9IxA?~4p^xT{ml+iD7%3-+5>!jVY3YMzhj%S zFn#6W=`n>m7p1`&0qrE@K=kQ&2SBXzv z^sCrC;{NX1H8?%yNQqBQ^hrM7gq#Lq4#K^Fs$(dUV`{-nf~%L_C0>|fhWg3Q{PbiG zI;q4?yXDz~+8snE8P-)FU54!G3}wS_ddTplIMmVK^ z7pbj8YvWs7^A+Bn;`MaeFw@R7P$lft`m^s;U>_lWeLo#!hCBbsxxVniOXZ=FcFL%a z1D`wtd@|%jJ-q3GgYJ4b0S9L_E4HbKha|T`B|8%hEZ`M5#he=Q{|yt6Ay>oi7wEG% z_ayHX@q6V=xCe;XesxXG{Z}-G0)++*s^~y@|K8p?`?Ifv; z){)=$&<;?Ijwv+gF%4Y-IGPNnCI64e?9}ja108nA%q4H8?B-yLlDb-kyqq>A)e z!N|i!W{YsYlBD*(ec?+;X++ur7l|*t1}PphlpIDMlD?3Cn}XLf-74c4Z;BZd8gl!SBm%FanC1L@HmJ- z+jGNjVO0OJp(od}Ly`C0Fy61!_+R^5o+`Wf@&G5L7ipL2GT{_b!_h?1| zdx$%#VnPSV+t-eXycB3cbp7XqV$C$WWV5v?^Uo9d>R6-im`q|GME|8?R%1_oZSgv7;J9rYMjQ^)G4-Dz!g>>yNs{ILW)IBz<7Q@F|pDC54G8DHbjU$;h-M? z#vib!Iwp%F?I~+tozfv>KXPR&Bsq|ftq}D6X`KG(S5dwdsRLvD$~C0q=oI=8tGLFMv6``hiQhPc6b+`KT_uZSPSbq%CTn7n8rJJjdqD+4H^Vf#MYk(}3A zF~dc#VZ|bN9T?I6?sw7(PraVvWx71M!PSeM-~fANIs0+P)sKvt$II=h*sIZh$v}VZ z1bYWi(7iPdWDIcwNRJu@GOivS%Mg0>#O=0l{`+k1^*os)Q{N@7a{b14T3x$}?5TR*NSR4lCwR0 zo_JPg91l8T4BOv65jmD$JL6iNOY?~Z7r_wh+U_+ISJAa%l5|Va{O=5@6?d~=hYMc(AfDK=l9G%2Ytbux%ei|uT~NBP0xt3e#T+@iX}&| ze_D~>{KIBn3-;sf7H(#Pw^i^JZBTykqHs&lY8klBm;3d$mvNIXGL;%PkMF+YBHBSB z3lQsOspeb-1z^@Q>KkI3Wa8s6VvjBq1DOC^%`DZPV zrlC!SR)@&Au)hsUZRKA7T;|AquQ~X1AINW*)8xlb*i#3Ug4$D&eQ~O&nFcavJiI8| zsUzPtPU+Y|ycTPA#0Zv|{bmhUhEVTlci9+y?mqFp93_IZpB#Y*LRuxVfg^$t?6%#0S-Kr^U3lK5VC~*&4%FE6 zlnwr`$Txgz*BV~A-7?igthNw~Af-MsWFlnG2N|`o6rQ&51YKqWZKu>j@%CZn0Xd+6 zhf*~6#`?85*RP+Ga(!uE$@OA-V+C8Vf*&;Z#tMetZlUA2$ql|_$7p;Tl(st3jV2PpSjKeBdY4c*r7BH<=A zt6|qP?KJ(WjeGMKL^7Hd!>!yT&z~9;jnwFLpM7K`szK}g9OGMWOZ1{=M(9fmCiAgx z5Up_jw4mshr50ma|7b0>2|gs|0%CWE7$+~oj0%+A^mE5l_B~oeAG* zyd%q(lr5e)pV(Fi>u)zdVIonaT-iiL7?snIM>I+q{XNzss* z{tQD8fx&3W>LhBZw!~IRThIJJ4bdi1Pd!?~9*^$OmLRKp39JG%`sS|186+=gYX-6Z zDkul6XL#CoR-gI7xcUwb@S>l8o#eb94(o#Po>Lhc0EPhi`mx zQi+>qE1?VoPQSh4UWQ9SxOh4f&C$f$$O*ncqpW_xp4y>><<7vs`B_Qa$IXxQd+D2f zFTcd^3tU{N=j!Sn>9Yhom8*KB&(fvPW>tkeGmE=k7xL{me&5$`p+;?8$XAO{V|G=@ zSMQ?6+f@&J{XX|w-9zNt27PW~zkRBC27O0@hGiSbyXA?&RnsVMWeHnB4YT>~<0Eq4 zvf^gau*&gHRVS|>u+MKEJ&xD;v!r%zV!o-lO9N{Z>(m_gfj8b= z5Z;_t5?Gd1B$jOIo}pGcg)-iKaFWTm-&`80AI^;%!MzyVCCXS z+}W9_cii}){W%lYR7+*=JF{G5B3#|y$?8G(Q&&v}_ScWEJ)gt3@?(5F^an!aKOxj%e%cSpq`*vKRW5paM)~ZOo zv(fZ-wtmsVTAZYd$^_{|)DjWS$C9KmRelS5=5I@wMr!bC4WG(D6Yx{Pq^x>c=V%+$ zQSg>5NXXu+b7)%IdA%dEwS9SFLg_FQUG|(w9K9p?Y(qsEfu#p5r36a``TtnKr1L*7 zPeg>QgqMW;%CdkMe>&@t%P@B&eoY%FFRM0++G)$>{3`p6DctAH*jG;)W8BC__j`{- zTPj(7fZERHRdQFMUse`=(l4pwj)=2lUixw0uSVnwCl=qDwkPVF!;$~sSMePUCH-mOz zKd(Gk5K~wQ4XTp6yh%oU$wb)x-_ts-9;Weeo!!7v%l7xH?B;r`g9V8&U` zBvB?W>vAt&O;fX+>)52Q@=8V4N<(b_PZ7^yWut6_vI#Wo3V4aLpE#~;>P*h`ib~$v zH_GAI1fL;LQPQ(T{!!p+1aCBP#9PeW_3AgZTr4xhcK@!!Zvl72S$R6{RXrXJw=1yUlD2cd^dvW!(tn6)Nvj?zbk^H}0tjuC9jNZ7QWY zhGFl^x#}}4?g!;uzrIYL#hVZDu_bT?0?l1rOOcGs{M-`UkrO&h=q_lrOru2B(*XEK z_wE254rwZ-vJR_$@5jX`OY|*NV@6(`BVbdfi|2i0&f)~Jru}jIHL-o_ZDLV#sCsfs zirNnS^2fLAX;0M<8RDB`T87A5{7+20HB}`87XFIZ487s=()M@n6>|=mCY$mOE>A31 z)Gw;v47p~}3*Yp==*S-0rL7R;v~TLw46bt|3Mh`w>|AfY2(cEPF~#a0Hg0S zD_j1Nlc+yzO|}E*A2~ToylSb?q818XHNCHN2F}X2RS5mxWg}-Ua8;=F z$ee<`QlCA4ecir%e0`bt^;fOGy1uSjNP2>=<7-2bE9oX%o6T74MXeD=7+R#o>EiIe z-}l8C=s9Cy2f0evpZ1k!%w(ZXE!8T6`*P{qWRtp((P6btp(Jl+vWiw=Lan5>A`a%nlg~eOz!HDI` zoq#q;hZ|I?5FRd~H2hjq&)X039y+GR`R9ASb*}lresi-B4Z@(~_o-)*=%5Cx*s~S; z)N`%M2r4U_Q96>FAf1XMCp69m3p`_KrS<<9vj?paw>RTIh}rWazW42Tx<|~O!+5j% zv5p=wdkz6=T3VVIv&V1kJu!RKiLd|PWA+do*u?8%zVXRdQYg_AZSxx9=LW840q)ka zwUBW?Q9wK*@^7BiJQgu8hj`m?_Q5*<`O}}ajH=$1OOG37Gw4s6uqGi54=|AAEtKKd z(QHITm{ah&|GZ(g+{-x`TwSFs^9p3P#3CR68uAs$Yw&fGbT6adAet8_@e4#V!cvug#f&-WtPF8z=HwtR3RZ)Ibw-mS`)9ELRl99FY(6 zq2iAAnI&RZQWc{gP{c8nUZc$`IE|MUaS$ANJ3BWVEtt3CFuB7e-i~}^@UmUTgx!_?)E2TYXc?S00vs=Y#vjiHIHJM|@Ud?53%( zGMLD(+zagnorM_7oOcdAql5HrPjJ*tt71{PUuo#z>_!4jh~~7gy^XwmsYmT{P=YaN>{$PIxyUOxg70x55!+H{Px7_DU=v7DQ=l@An;VrIc#3rErLfGBGS~W zsR{H!32zD3F6(2+)Yt}6;kMpNQL5uVE>T{k5cL{9oT2|5PUqIaA)V}_nYq8k=+7L} zD#@?9>$!KtC-beZ9l#n!*C<(wx_^W0jQP%0vEil?dZ!r$v$@q()S%)5j!TDC`6k$H z2a{7=!<*ah<;ez=i|r01teCCVaT%wmE#?75Xq)D0TZy*wg_GZ^9~$6 zs^6Q2V`wi(-pgz*`IOjZYM4dk%Tn&Dz3@M(o%|owe(%p~_ea0|#C~_8-yd4;>bHoQ zQqK$13wZV_i zi;mN-0bY39d)e^Unl@O?6xD}3oEeNehLhOOf;IP~Jr9#suyp!stD+zp_ThtEx61#k zX0G}#j=|~Y%#&g9>(h3(Mp@Ll8}!5?RJt)G_wCye)q9IYz61{w@mQMv+>YNz{f1dM;83h12mnb`4>z4RZhb~^ArzlBlH$6Exj~-13;&a z!1rf4rAfZkYw&9L8)=O2iAbUzV3%n}ua<%D6!m%6^0%)!n*rZo@w`B!kWk3US456s;`OPQQ>drY9zVLpV#@)h^89DG z4Lp9~Uv?h1oeB|hY%RHm%z%A4EQw`!KAvI4jYk|K6S4bHjnjs#`k2G+yqnB($kwQE zL*lCKc#Ubl-yPoK1i~f2QpAr@6C9h|;=(e~?w{D`AzQ?c%mX{qI1Bs0)9KFn{8hNM z{AI}v?8!Fq-GN_)Tmi=~oJHKga_p_P;Hu$NKK>;fUZ%C4t)lIDwtS2-{qtWo7h&g~ zv72X_X9H8?`LnCd8>F_Ct9N1icyuKPyUIe|l`4J5R4KT8hAge&g zu^&s6kJDDa{mq|cD1Ae>CiVK=xnE3&euc&&G|~sRFh1BbYxiQln*|Ekq&vt>Yw#Xy z5hC+7TZ-z{AwhO?E$UxN<1&@;IC=g3%H-xTIN%OOqkKfM9HK!KI%~AY2s0 zrLG2rB{`+WG=*8IS%D^QrBRbhwn*YW6<8{ZAph@q7P!30~#LP*SN#Qbl*7Ik1hWk{~M0mB1gZx zEV4sWZ6-=hR!R(ZukPO1S9DT+mv}4V)@V@;f&TqYU8y#A#y$`F4QrdG$-3V2E=#8$ zG^khH`eqjz+qJO0vFmJqyjZ`o_CamQ{2;2$)*Q+&1Kwd@ZaUkky5iYQ{L7caw6e3e z)0c)Ye7k18;aA+>6+HRduSdU4U)MEbt$0myQu|T5`1-rEfm23!j_^8$_rKFIUt?U* z8({lk6PttCt0Ql`0uINE44R)Yj_ADrd!aNn8!x>`+LH7b(Yv=V@WPYcB0&P%dolQp zGgr3eLmey2v0)=CN6A@F|9;e8OA9q;^>$GYC(ic1QEd>Io73uhQyjK1uNQ|Y6JPA= zHupt2M~`0ry$w1y$tp_4%9C4$6e;;>G$)o1MNjWr?^#_DvAEb)oL4nQJx+b!xsGf? zRhO0S3WNk&jSFA%=dSY@uRW$Jp_|xEPg&_FfjPKWcAtt>mhKXhW23P*%&KJ^zv_Bu zUkrwAm7l?3AS6r9h*!Xp|xM+XHhT(E;gZ+}z&nd_~;9oV4{JO9lhgquA*;DbR7z zT%0#^`{lGKhV&J#)7)TZ$vbhN{k9ZlfCVbI`ML z-dM!mZYjZ#O$@N*RA*Z7qD={Ypm@nd%w9QrnLi|WA-U)~WzDbfSn$pZvJ>vg8&&x> z>Y z(%g)*^Gx*afI(ONhmN}HfA8&(cKE!Ja!_?Zt;+|6J$ui5XpBXUNLn6z#4KZOitO}@gn_V5%h*)b@o^L((ah{0Zh<{*E^I!mV=^y zgg1plR=ncY&oMtiD!bUm@iAzJ>X6DtE`L z_=EVDAyMU9p9!zW+r9IpnxYPxsj~!>?keaX68YJK{ESnB?QW1mBJCEeH=7NPix-T6^EDmcF)AC>7|fz@bzA*5a#QZhJXwUX&I+%MsVzm+RK?1qmmDe zbM~cuUmotdO~Hu-ox$tKUIUep&Pgq@`p7@!kKP(lUbz;e(Jy?x(r?%F5jM*J)lRj7 znxHRO$syst&RGM+1zjI6 ztiZX8?hBF9nW|N4t-pDTB1=1Z5HIb+MOd{-;^FFqFfF3i^AXm5^umeCYuq$S$=tMC zF~04rWUkMGEo=MtIK@2yn7mT)I6y?uwWGOIgd=Ct=5q7NgT+ zq4!FIub0tapV8Uio4=U7VzB?+2``Y)n#Y$K21b_~>S|D9cmWcz zlFpT1E;iVI{k6023+Nx~&{uHUEG$^c-iO%h>(M8|5kn|y?ksYVgY)Gy#rGAQGh?o> zn&JJXJ7`o^yYwbLe8uAKg*`H%`*E?ilXv)vjOPr`83MjuK681svTluf2lOGMX1;KS z{KU_O(6(oKx+#4|oRsd^Ph+}OS_~Gj_Nh+qWO?lIoE@0scE+Pvm=^i}jXWJk}G-s>Z65t>b97_zl7%}V+gNX}-``yPqV~+-4m-y`w+U-v!%S%Nkvk;c z0*p?`Gto{#N;D0OJ*Etdt>f?Z;TrmS;pWFa?X2NIzV>4W7wv4lNqcOSscDe*%Mh1> z2fcE_pfAoo6(a@Xh{e<$V`>^nNwLvY3mK<;$Tlr!ZzwBP9w^Q`4zA9lIB%R;QgyWB zmFw&Jzuy*3E3QjT8J+4bmin958vJ{AG~Cuv^Kf;_3~*DrbnN2hs8^@uH9tn%1om=K z>ecb@|Kqi){60+?VULvZ6C%m1OG$MuyH4`zB)?8F>!|qv;+sRBGEXaa2`DBR3msH@0dN61-CP(3eX$7C~1*#pPZh!av&;3g=4Ls*!s9GJ{n7BrBa_{8j9jFX6o>nr(_>5TW z(?ykUROK8_+8Yk8l(YEP$Pw+FC`Vh)c^j&FL^o=4_PZY_&{BJJ80fk$WaNuv)q$12 zqVwwFEYgBsHADST>(J3z>)64B9d2!I2loyGbLSf#EzAg`HPXJu#i@(?jkn0bl~vv6 zLeplWk}-!d(8)#g#sR18RC?o(F~+tv1J>gjl`mj@ZhxsacBr^nK2kmD z?U$>3I$n7Owg}RpIa1rjIX$2`=$@?9SB{{08N*b-OFAs$!ryDY9h)i`-TONiGI{wB&dA2Y%c{yL84nMat` z!I>-3vlN_Rd%{{Lte*N09cK8gJpH{nyK}8}eMavFB+%&#IxJh?7%B@2>VtdP7p$J|W8L*Ek)?MH40M z!Lm=$yG?l1Q8G+r;Q_Pp~iGL7<& zF(-Jw{Yr7p;M4L;Qx;qE%Wi%3HnwAfjN^h@XS^!SJgan3HCOi=*Wd_AU%47O%DP{M ztow|e!*utbZ{@tc)4vEWjiTAP=suhU%9^ur78tEMV^?0%ychEwxR_quiHO?|;-KeCEMv}dTK1F(Q$#(lC58%tHX?iXu-5L@9a%?%ZB56Mj_)+ocpY!^D zo&$9-)!^sXNRpiH09)GkO|(nd11phM6K)Kg2ki72VYtD!moyhpua|2qwP;%SLD&SS zDdXJK5#n~{sX35eGH2kHJz~GSr)dq_dgii9;r48kCpcJpuS0RA0TL&S!WHAM{I?V> z@qZ%2wjK&;8V<(psi`qe8t;_Mn(T_L{$}y3vSz5v<+K zsKjW#QBDu5BiK`sv1RA;*gAtNvimCT0{`{cV3kG2w!zM0yYtt7J8!V<()3aHLk1=_ zVfvBYi@ufh^3K2w15)3Ab$C^XNRDO*Syg-adw~ekegbW}wvCe$cTQ;@^KteNLt}W0Klh29lHv z8bhVfmcQ;)Fyhr4+_j(#1ujj{LXFu%rW}*PXTa);jIi!>pH#0+tGwY^52xDot#Jh; z@wo2%4CU~la%kZ-J~uiR5Z7z1ah-XR$Cb4A-^|yB*0?sr^0?mK^~1kc#!anp#YBtx z`UsN1bV{t(B5FLljj-psIe9H{>niufw0Cpd7jums*tzwP`y~GlG47X;)VTkpF>uIR|n^Y`yP5U`-vsTIXAZE^Uu^ktOt1e;@t4!r`T0A7(Vr0545Nw z^xODqrgrM6^UGoDP0vj2vKUz9;*jU@+l~FMACha*J~1gxLx@Lv1$u|7YR{aq^?CI@ zoED6>J{j-f`!h$C@4|L&{V432(x1Y<0AJ`MwtskC>>^-KW@O}3y?-6|4^wSG^~AG} zRvo!^yy5#RCx1Ef^MwmPpHY0FJImb^Qk(-BnvnjvUM8hmMkr<%<-|7ZvCd$xb;dB7 z&1*GDJFwHbA9Zp@%W%0LwQ@%DaJd)r#c5i1{0E(<({Mrw3zkCt?J&dNHk<)PrQCtU4icX4y|a&hY>+uDDdi}C}c zan4?o-(`;y`70=19(U0A$K9v@7N*tD@qnGs5G{O`2W*FqU;faDhcY+dT}8KBlr2kM z`(4eZxh~Y#4&;Zg^e=+!=Z58|4gc3%T)o0^y1>1LFK$0bBOvs;LI&PTv zFU}T^tn^=h)|J=Yo?$$1pRZs#cus3SH9AxJxh@Ct{fk^&{nrB!@A5xt6;B#Bdu%Sf zusYZIz-s^3P64L|X@{RQZ1$+~T7KCO`ayE9)P|_X;y#G$HTTNXQ~&4v|LL*lO8nG> z_Y-EKkFtBYQ&o@FG#EE{z^Z(=5na@(+&vAD?!(x4YOB{Vnh%{%(|oAt=EJ}7`OxFN ze{nwaruooZ?^HOg4yQz%$d7u5_z$gDHoxaLVqzPvzTfKlK^Lg1%OwdAH@66hxUba(C4T^`tEQx|LPE)Jj(V zttfvbmA`7O%c1L(edu|Uf8XuSus-e#t9d4rJ-OBiWgk?JQ=#*D)Pd=l?X;WNzlEPf zC?qXBdjL2QgzbV#a_R71r0vXX~)PrZ^klqmx$SgwTKR+H4r<-6 z?d_nr9bmGX{bdc=0w$h`>GY8wIp2iddf~O~vXApd=8evMd3=|X%g1XEx%p|i&VG0s z>!+DI_~GTbpWiIZlzw&(yp!^9u1j2UAzSFkuPi--y6Ke(`?uO+mtL?9$U^-~_JenJ zRZ&N?Rj)GQlr~cB#;8`fbk(w90}@uB{Yx65QH_3Q!9s1L;y26RjMFBf;y%ln_Jb>z<2PQa(;YirmKCZ$;ijfmi~9&`UJlpF zFJ1*woX|3PomXYr%B#-c9M!6Kyy{*!t=6!89nBC`57uAN5(*9KA9uJEj)0Ca!~M&& zlT9X+yl9TW5PCfg3!MMJ^ef;#mhNSDzW3G=t@1;s!aNt{_!2E1@VQ&)_MdW?yBJ|-U6i!&eDItC8>Gq%QUSWB|9Xw7Xftgme3d7fZ~P6Q;XLNUI_>m76wST_t%H`Ud$prOyN#^B;%}ad7HWO_ z=cwVEUj3zo!!jktF5LxTNB-fYsj&;25 z{QqVh^V21l$$u-0Sz{^dyoz*c6hq_62Fy{||5dJAi&|6+p)c3%f z`y_GOvJEp<5br&F#mp7HCX>?v#0Pox`(bYg93Su*7gQZ|xlL_Nt`Zm{LY;H;Y+ zFy9-lmubU%qMqa`a#|A644%$R_0sjvo^;+kaE{KKhfcMgH|d5VFo*8{jiaFj89L6P z6&pE(j&s~OP!7XaOkjDWGr-IhUPq4@$lg8d7hL%upYmMH?Gcz)4a6ziJwKc{Rkp6k zS;@oSVqP7my5e_H#LK8foWgMr3fsR~_4zod;~l|^`A@=K)?u!9JWA9tZ>}gyW%Dl1 z#oAs~U3u${Vw`YDZhV~W9|507@ z=QF&vzR#Xb{06gm9(`F|)C@`Xs!3|Y_0B#gsGS+{L>xP8n;nn6X%6N>+XgX?gI<)G)S}ZPXqEH&M+9 z4I0xl-3K?DH_B_!R>KB`xw`?gS<`K*!~AvVa>IHi^-A0{nWqh*ly);(rE0o*r8RuO zQ@!g0E}NRhU7YySqvxlde(Z{%2~u$jGeQG%kb-B~v&KD;o!Bd6C!iy@wYT%WG;>8@F8WRglbkTubjCf%M70;M z_0WZ^hPDAWO7$~-=w>pE&%CE2ba}b^*dDUK*l2j!4ZD)s0Y#bjf? zJ!H__`e_}O=1+vU>FSmUbAWlysfrIqlKmJME_$@z*c z>~5R(ZJ5!1WSP(*u#DZJse3h ztN2cu*r7me%ljE4z%==fXUQL&_A9p--4cU$)P+`Sb6$q4$is+ zS>bQhKkodfm7_lKl;Xqtx@{ad`X!&|KrNEv3QMC39I{K0{W0;nJe1X?@)NHX89Xwll)`EjGtUO@4|ePx&;~3UJ9+ zihLN5U+Bc3|DWAL|2Kb(|0^EY&(~0u&y9GkE8k+u*$}Urf1z2BzdZmJGzRG26gHfg zJ%}1%`L%bH8ru4%P{u@e9tv@o3_m2aY! zK)3k*x6|&k8ak({#!=t$!fB4?{#7xMp1z2&)5!07PTxaT&9S1snI?3+k>vUNSt=|u zU23W}Cr7%S&J4TM?+(=M;7B8`4rgMGr#VYY`xzdDk<}+!v@?q7h9)7vY>DF4{ zbz1(QH(SF)hgAnxA8!q%6R6{D73mria=P&}ryAc_!t@qG-oCS!`=zTnup1BS?d$|L z(e{_lQ?6o%Fvaa4Pv!LeJeBCd)xj&js-9K)wWLJr{_<3lar~vLRla{}`ZC+gAu(8oGB}l`WCrwn(+fApghT>#L+=}KO z)gLm$PF?k?ov-x#^oK&C=V5>8e2M7C>thHW7j*f#Fv3n?ad5hdF$3!HUcyB9VGj67 zVS`KcF?fzvG4r*4AB7sI7}ce8vZ_?hNq15v+k~qcgkQL-lkf{yH449QRcGNBuBr;Z za8;A=3s-d!e&MRF!Y^FaP56bYx(mN>)egchT(zU{3s?0Je&MQ}gkQL7XWU|xs&hcivU4&n_s;lq|S9KG9;i~S!FI=^Q@C#S%DEz`zJ%nGlYA4|ruG(4ng{!E) zi1ueL+MoM{i}vS!;iCPyU$|(0?iViFpZkT2_UC@#qW!sFxM+Xw7cSbL`-O}4=YHX$ z{kdPbXn*b(F4~{_g^Tv*e&M41xnH=na>&<_WD$il^!*yB48nbAGjtM68+dr5qUJct zt*&RUd8a~;Eot$*^Dy-FK31ey17`(m*>2d)&YCsw=?3Mw-2)#BgiL=g<%_M5zX*Bz z%i<-_-tl-%11LO+f^@&i`*B*$i?i>_v09WtnOkk1UM`bn*}vYZyll7E4^!-yycKQ5 znUJRWutpFvc-=Fw7IfzR!X>p2eDsR%5|dI-I$c8OML3ky;O*s{v-Trr4IjL)b|l$b zK^`}IST2WYS2x~ETKCdIq4lu_a)A4K5;DEutK??U_~A5r)Q4-0N3e%W{zg$GgiX@mz`EhQz}Df~4L z%NrCPOyPG>coo9?TP;N;_fhzI56kNm-k-uP6#fIk`&likN`_H*k%#3~3hzhZw^8^B zga=wJ=_O6?A^a5&3nWl~*%(OSWQ(};JB0VOT9QlZDSWMm?M~TM!4B(2`<_G9^uG#^0QxQ2Ev(3fog!X>k!-78X>&8D2 zgx;b3H6yP$5MDX!aY&a%^4J)-pOk5+^kag zVh_ts3hzYWBPe_)!aHJgZ8lJNx`*W>3hzka_fdFh=s}deaSgFMEk$3Zl|xw>h-#J(!M~6ONMQ) zu353^w(SOHKQ!PJv<+Z($$Z!5S)8qPJMCmY`mVBknHr|O0t-j0Y)hXzcbBcYrvIC? zYsXGGiuUcT>0AEVlKv}5e{21eAB27z*T~)u8cI5zboALxp~~8k8GSmAC>ZH$f;H)0 zSLiMG8r2CB($CFUE_d`~QB`prt`>#3?y?^x-7cdQzfU>}O+xa#(1w@5-stW9i1g!Z zo3nI|Q_JgXN&TzjxlKK4;4gX3esDK*^)!X6q1~o=CJlXZ%{tQ7WCvI3{uh4xeX;Gg zG3~WkaoN_l7RJ7F~gRH+_(A#5qFipg-fhNIDo`r?{f+Xrms=`*xp$o)41UJgsVv;Wt>2v8-`+P%#TUEN|Ena!|}MZBPGn;?3N+ zqznS4Xlv6tH7uhFjBv&O9hX-M&Pcsmye9;FjQQvDf*3#TxxN0uF3PY?+O2z?czw_} z&=*+v(>Gw1DgFapUcw!q5i{Z+&M3J3GZMcj?y4O!?s$!UfPdq(N@^0Iz1z5Rk5+Q+ z7?$n%m(cUFZr=*|PjE+?Yct<)HfUeE!M;3R8LJlHt8MFrHUX!(zP9>izUwl+;f(#} z+I`-+=x6SM&ueaO%G%_$TE?fC%YTIxrE8f(a+S+h$pTD4vMubSw_jD-R&rUc@2y?2 zu#|R`WO1I}LXa&1p62PdtCi-fJYTQc%(j1Ra)EZ+-hwDUt?3)8 z8?U2FjGE6;%m=*eY892eFvnX_Loe3*#k{fCZ}v|oSgQBAWbZGn>U^}J=T84kgA7iq zxa;NO={eGSVBC4dzod_W=fbwJT8R)GW4Y7h)Zig_?gBN*(F7RwmwN1^mWAG-^#u?1 z+*>e5^V#ZDVAZ)xkcaJkp*2jF4fi)}#!-h8jsKw9)zy{v+gfvIVC%W!iF<)-)vHRs z8L$&t@ULN4+3kw6!|M;+VmnHcw6(@yuxJSzVBd^JE3NZJ2Wy36F_$@};XM`o(iGrQ zy{h@E+sbi!LTMFTcD_-`1-vx=;j$CG1Izi`F}*J3P1CA;E?;vC{b}pi@b9jZ<{2vA z!ItuM|Ch>_s4pK<>v{Pa)X^Zd)65DIzsVzc(Ai9*2fb%~Cr6aG4*Kcy?#_k0!!nHK zb6O|0SJPuy!Ck|9YU9;ToNCXdlXN>&(|ksA2Y#IDV++%AE_KQY(_XmbW1rdqHnNvF z(c78zCa>wsjP_|AoM=`V=|V4YXmp*#uX9S_RPgzybucXML9cU&!ai-8(%V~7VU&Q1 z!e;vpoD*xfZ8Z4*koP~;U<=C`b@vOJ^W~06)98~6y{6*Pg@HfOLe=+nh_&b>le{s5^_X3){n#=EChFv>3r^6PPStGQc=ere7?SNNw;y&XAyil9QZ!w7X z?m{o|e3#*!$sF81U25pUN`hOE7pgojUt%%+G+!+|+=0K6KZ;VUu|abMj{&bi5Cgp} zSVs36yIw8j?J)XV-VVNE2;F8QR z+-Xq1-+$ zz3(TRxcC;faeKhNZbraIFN6N_`(if84BLyZj^e9Y+>M@P*1p(Rh@aWJMcED_ox!hE zo!i@J40VBZS8t>hhOefdbME70d~iPOG~z`b@<=ZanXM++%ne^TFuJ>;cND$g zqgo=}E+mgPVR`t<`(7rUbpzkq$YwAa&vGXQ-hKMYBe<0|8TU_tEi$rE28)2ON#@%V zcSv{*N%J?|ER&^IZrv59s>^*;+{`)QW)7ACQ(>1VidhAu_L#9EoZa%ygiXMmbW2tP zy(>SJhiPg(H03E>zTM}zXPN=|{6}EhZP-($M#;S=4h&hN%?zU!>5hBD%rS$}J{E4d z6)#MvMX1K8uJ_{&Q2*QvyKjeVr!BTiSY30ShP!>Eyr264B(M$@A?%KsQ}$FrK{81JSPw^I_rs z2!v7alH2!BxT`y!%Pi#47)Slntv7nlG~D5l4b8(V{cpdZ`1fu=eeK3ea0jcC*Uby< z>Mtn+Rp`a3oVePK`#tvV4)=R>qfU2x$h)}Tqq{vS2Xy8HP+7UfM&q7AXrtSm*jqhT zR@?|OD%u^&yD@ezhEO4sq`Mn~MtP^UrwXSh>2*hDSULLSVaOstTk@FhPR55}=k~$V zO6J7D=(iTwaz>2w?$#SFjSalJC4Cq4Hk9igI?CRTlC4R4VY+?Yz$LGTXb+lP@5!Yaq0OWeb~3>R@?K|SSSV5qSBwus&OlgOrnjx! z+B06D;$`X%+u;$E!bfZbXlJ%M$(41Bx=$HsDmQqn7^ohDrk4A!wXUj9VedfuhqgPZ zcXIB|DSTlx-tUjbtb#Lt&4lwt*fcfnTa6k=iL0#6$11~J`xtiE`rsY*QpJ7@Z?y4pm)=<8B{ljS z*=2*yrz7ZtC@I$=g1Dw547Z$Y7J=R;-v3-!|0AtWy!RFC{&x5J77bR!<7->KV(>EW zrgtbOXP(a7i_yK0Mz<^%MmZ~26na!^xu}&9KUxswTESilQ@JqziBYwJ$~Jr{l_}si zWh#_qdI4|BkG7VH#UsmvxJZ{3t%H;b)f?=c^D(>P+lsGrW#aN_QZkLpsm*TDWREiD z(mIY=?-X8hjDY5?{ktJy@D*C?5?T=@!yM+@Gl$K4H0ROWH`PWnUv{DrG%P|-ScffkWX0>wk zf7r97nTORV;%72IetE2<1LHqa4lf@V-;wo^{jA0Y#{US*t6sNsbXwfqYo-VEd>1b1 zsa#m|G08@)fu)x`+?v;6E!k%1SDceEp~_diK(icA7j3bJ?9%cXy;ZNqj_iEAiQp0d z^ge zUimr3kv?8W+zfW_9N2)hPjzFnGhU4x%Q1q|Nb`xDM_>{5?~o%o=H_&eEV)k4fegQ! z6U|tVYlVjQ94BbaMa+wRC~lhFX1lWQzjiayoODv9m@qz!H2;k>k*kR8~4m0IrEwShV6LEL&*Jdu$JS?@w{ zLNC7bT%U`DkUJ+jN4M^QoC)m4(<{_b4Taf* zATw94EJuzmzQl8MlJ%Wiaku2G4EssSk+C@=AH7b@8ExkadYk26vdr*asnIg30rt~+ z!2+TSEY4?(bZa6u^u$}f&85bBvl<3KbJ{XP2JEa=b-LUbnDZibfpQN>){gFhggMF6 zAIL_{)S#As(0aKsjk+YkA>}uWgR>gP;bc->@pCinQyjzeZ~aI{6IzOL`!6GVY}g;x zB*BW98>=(N(~LaJP>qd)R!YnO>CNx38e0YnqNp*i4&};m+whzrhC?X3sseJyN3(HK~_q1Xl;bFlje zi>jkN0-kzlKmd9Ut2u6!kwyzR0PWa^lCM{pT|108*yTi;opdcX!!>9f#jVOWb27`E6)Sd=O)I)-p;P~@Kex_WG-DgsDT{MUscn#pO+CvU&pzyZf>JiAYP5Ro z#&!h<)(kgUM$mdluUa2I!Af|sphKoFgl!5Xg5V?1xgRvJg}NQvJz)| zmnBZam(4K@@9;;1p^r9kuJ4v5aR%+uB`30>UAQ*Su;m|x%$ByVUmkiyu7UT24KHaY zXY@Rjdmwu*W<2TxonN9ki00rGrS_@0;w%MQ+(^%Bnmd*8F`VA8%cQ;Kma}2tDbRd2 z#2e2baBlT4uE$*F@*RGA`WJzx`6ga0?A?v}`U>@R31{b1EH306as3wVS$F>c=emqgXrHXJjO|$j9$Z}_jqT)H{{oBjJuS_!R99E^ zkQ-($s&Bk!xLD<WFZD3B^Ppto~r~Y8vhn*yN3z_BUQ~Oe#jGtg9iQOIJF*u&4aOz;E zsTFkEp#CCHRo|_6WTh``@frGHCBs>b$p%;6+JM$ljC4k$URRD(*m>p@+pA_G1!_4e zFYATaNAE|O=(IumX4=J2YNVHONA}s4vom{j+wLy!+cG{vpu&d8kV z^rXYxv99cH9PaX>qFp%aL|Qj!RSUpskodf#hS=-R&uP#k#$Tjy-4!%H(>~?yT)eWm z8o2B&SRS|s>8z~3qdYS(>#9}|sG`oxo~RQR1eq*ldIawHE_*45Knu~u9?h*!7ur8MK2eiXdu^y<>?B$<9~bD!dTZNX(_2&}jJ?8N)Z z#LLXKs3BD4D-H9}Z`u!YOPq=iUR^fgB@Au}z1(&;F>Qd!53GX3^k@~*`MaB{j<(9G z_Ggl+yl&+!Yr29_()d;uY|U@mNg#Vg!W)4l0Yy0O^Xi|(PH z`@BFS4*%Nmx4g`4%A7T9ae*9>qm?$?~7kn#s%E&mJ|A7DH||Fvh*-r>%Fc{=u+G z*r&?p$~D_K=ooCU#a(mHI6rt3#iw0;*U2~-n&_7YtRXGnhgNI9ZikJRYNhlm>{UIh ztKz=nyIQ$Nqus2KfB0K<$JO$%W&sAp;Yr*WoHG7pI zCbQDTw75HBd9Hsx*VIp%gzQI8qmGY#N@8$z zt&Og;JI3(4?P^bG#?I<_nzv=Sy}G3T-)Y8_5+{6=UO>;^Tx~a_2_<`GnRwd;TEBwsM7w_hEKF-eI6iJ+!8fY`%ZLAqKy*FuR7Cwa+}i zf8@K+udoh&zw%#u|KL}PJGaX4e`;A`p^(v+{1(M$$k@&baa=M++f}#QVd+g(RA}J3 zzq;(>axXWx+ixqXF8f3I@_m^@+@UK&SUjqQ=K4Mv;H(_5si94SaBJVfPn8w{95G(% ztetcgXkGV-d%;g@cjeLzg_oPHnZ`-x5LlS{l0`-|OSN3OLdy=v=G ziy}ukyBV$ju6A!FXYKuEK+r}dIPImWIPTI2JE;44vIM#hR><5Ztb4#zF zHz!TQZO&Es9UA2q`nrDLbHjNV#_RgG^9ao%l7>>8W?0DDAZq~rf8n{^lH*4T#4cx2&Rs%snLCl>up#NR;!~Nmp=)}n*$C@oxck-Lf z<_P@3`OP2UBX}tL>25aP39tF_-%v7qM8qP*WqzFEidf`sUW9-2A4NeZii>_OGWVt5 z6mo}o5u8?1b03NwiQs?s^KqhloW*-DeZfd6A^fASDcU>9126svBV&y~cIoqoI~SSz z6BT(D(Wm&IxnB!8O(qiM1&2fowspgo-xcKNObKmHc zl%y21CF%}N$>@^f+NGiJ)cD!|JUlKTI;C9-YBippXe}~6{s!oxk`f~063sDjiIMSf zPe)%j>y)oa6DFCpq{NuGIcX`^r{d`*$492dB&8(q82@<&CP~_fkqObVl9_uC>w+!e zqoX5Jk*u|aMi)M2#G_Np4<@B0rV0v#r@1RF-;bR%);ubDUYsUV(S1LKRjLC8g_}dn zmiV+WPdmi(U{azrDL%S2E?qohCQoP$qpaw{Crt?dr{RxA&rV88bs*7wKRGrnH7aR- zVhaTiA03yHFh3H_GBVOCOUNtY9&_*lOZ)=SQCsLHQ%gJkA)YAn_>qF{QB)*q#7tAc z)aVpzTvDPSCc6HXC_%@OiV`Zixp_`>YHD2K9P@;+lSi1RKNLEV6ON=pu{Ihz$}v?| zKWL}c@KL-swh;01wT4ehiJRw`C4D%n07_i^>BA`~bU|u#B9#f7Y%Uqj(6CX!} zCq9{o)>mkbiO`bbqh_OG5tI-e6&)Wv2lG%rMwpnC2yHZq@?d15IT2MK8<`k|UYn4F zE|LllHFk1zN{l&rUUXtApX-U9#yL$Jn7Zc2rN$i~9Fm+9NwbwT zH6=|;rT)hA+=fg^h_hmnnv;n9#V18Z{f5RN+?q;-)kVVRL>&_8rzLV6MT_zyAE}tR z(~_xf>5u9~mJRcQep+u6o}fjhS)=d6unQh=cl-i#Lh8K8_!cj(LdW=6_+2dopr=}B z@v{%w&_^e0EurQFYbs_&YYT$MZ)L5aC@GQG%YO^8*`oU}ReU!`xYhyuduuRvBZWUw z`UeU;+dU{ssML2niGRzYtS^j1M{mGr~JcSD6cfM>uufM+087e%7?ayMp6_qIiKQ ze`2hgsZaNxF#REObfT6NMU$%~N<^>3MJGhYL_MX&&z_r_JTEc!$)uF|3l=^-M}|Ab z^Wfx1%@+R!ENIfF*P2rfaCr2yYt0V+5DSHY=g0KjNKJm7i2;}xhsz$N_d@g@2P+y;Ore)|D> z0}lNiG=N_K9lt_Z;l2ylhu_}=E&v(<&WADA0HOdP@V^ANFV0EvcPI+w$C`}drp7p) zFU%9eA9~1)Q${il8oWBh{*~wxZ|DOv_EarV(5W`g%8oowN2esQ$Pz12-V^OZ)bE7r zzuj}4xEyh3bm322C;mwexRLlx?Td3oa+1{=HyZ~vc2rJ?v_46tp-SS_!p<4jr;ClW z;?%->2%S{eaZ}Q#M9*QT-ImBidX67)8uM&05a@h>9+i|56`gV)j<@ER_{cfzq#zjy z;`^wiXkOW|k@LV3l1vC56=hk_5!)y}PD?eF8S49c$=$)4_xH)#){m@+ zL<|oz9g%6*jDyk~Is!*Ux3WY;{;oq8DbDV^DzwPNKB*XN(OOz+G}7XyY()vA!HPe0 zarW0&{8$)GyM0ATOk$40xf(bTJMy`B;waOxP62}a>OdepNe z%7P?Y=q6Ih1^9)l4DC=RC;Jc!Th2a=ekW8BL zYSAXJFD=?w;XW!{hz{bloqoGtAGJ{D*-Fd|Zu_*i54 zN4#-XOyxA*z@QP`o~0p^5IstSS<$QFtgM5w0A4i8Uke{Kim}A35ybTAdxwms4G)6o z1eOiBftM2$ z4&joI%)YZ&CyX5x`cP;XWl(km6cPB)>)|E8s+G^2oRG{i&r?SOvUo9(FfNN3nMg`m zDCQHh9JGA)GFxdmpx}hc(Blk)j~WmLWMs1=so7q{0;z&DB^jcMgC+-o7vjFjAlwK@u(1n zEFyby;v%L_v;#fWZ>%)|t9eQ)_6?lbhIHEC!D~!Qh(<7oC=>X*UN{;k&Ki52aBG?s zw?B-xK+PqxkNy;?X~f193iSi{RD(tP9bV z5+ah4!NG_|N4AQJONp~;^ZIG=*cdPljx{bOZeDaNA~hD9qJG-2;NT!eB-7*HMKW9v z7-nEm@}Lmz7$hP5Ex&CeLQ5G;Maj*wnZf!H!Z=q7$R7k=A}zEiNV~ zWmshJkU7DF2BKYJBcDu-V<|Y6J0@-LAe1z?B?VC*6gQ)b$ChwGKl-2NAkjMD?!n+A z30H9Y5PxE_wO`cyAmpnhuaw^f@reuiEl9R9Bt;W6pnq_1|CaCWN##9<+8_H2hpVi9 zY?6zKO2x#0c{U;neE8@THYXw8)_RRh)vO87hQen!v114#ET;gIJY^w%OU4@aYl*zJ@O=^plHyw^q#ye+ z79sD)EUqAHWI}R0ioI=QbMq#^hk$d!C7dHr7)5X=cK+Cy@yQSVWWKFeFmTcq^pify zM*{jVZ6R5*iWn!!*nBZW3t!tBgbe})do*Vya=N$#Yn;Z?Xl=JdEt6)w9U*u- zih3pl^`!nBi+Qkh+_JQ(Keh7M$3FUqxItnmMo?B#aQhg6E7TY^GqfGw*7$V0tLz_yW?AOf8&)L>=Q31Y3xAd7VPf3UHkHy~ zTVl8g32|&^NBtOcY(Ks__2bJH(Y3`BLq8HViTQwS#P#8hODQFz$b&!-P56{P7G3t6 zg<@ZcDhrClwyljHTUJLuZJ~sp&%eAg2VpQ^q_8rId=a1z)IWX(^amQ-iQzv4SK$8Og?O5?<5LA8*fy)P>2s2Ecx2cv>l_Eghm_c(hB9 zH8w6rj%V^?hM6B1#TNwfV`kx#1-{_ro|A_8B`6M~XhG0y-0?{~HCh|Aq)$moOKuY& z;&H(9TyQ*?0YPz5RMV|~K56pWM?bX2VbP+hV8sx05JQN^%_Bw<|Bl@aVnZSQ$nZQ) zpOBCi)KW=6-APka%Dm{PAilBURQOJZ_NT2?Q0qAJ7Y!#-3Doy!rI=@l3b8EcXW`cl z7&mS3I3EQiL?*Y)*KGZxG{wBa{50n}`q}y@GA8h7Ia)T-5@FWK8jIXVigkwOoz{IZ zc0N(&sK{Z#cMoKHN;V&}{zY_Lc!Qs31<|AlV;^MUE$I&##O4b}|3Ax50+vI^{6xji z>Br;d1>o^S#H1nK2)1+PD=Mdn5Zfk}PxgV_Pqb_$VuINeK>4R$7Z*jhuW~dI7YTic zj`KnQAnPy9&B=gCfM9?ppk{q@a|NITunLe2m;?w0cmir(ZEk++wdUp(fJDGVKz~3d zz|Z*p5Fp_7=4MyG1>imdjKc28#wtyCS&@OQM2S}8EHXK5r31+97<+h0+L}hKv(Rv z>RmTyR*^HAu?Vr_Vrwd^HEU|xY=t*>L@H8d=fj9pTDee+gj9zxtCm7tPz16h?EX zfPWAX!J68!79wKN=Dav<8$s7Abk*D1A(V&+Uf|>uan6f?)DJkuT`*Px0Jj1D0O$np z0(1cM26zKZfUbbs0V<#);1&Q)a83aF^W#pN|GNpFs{_^&-3H#ITgQ6uiBPIr}uu*H_QC) zNT;P;2e|EfMBRe`{1H8so&G3Y`i|;_(xH4(olssV-;__P6Dk+wjmnm8{NPLTse6r& zJsN)C{9FFtADwmEgDWGZuATV#fp^mbBEI$dwtVl@_l8e!_Cv7rQ=P8sCsy`b=42?H#*|KJ<*;wD9Fca~f?A&RU=2a&q$8MLS(TnDTR= z_kNr8^YFxxyQYj-clfX0FB?~p+xWgZ ziAK`Vx_rGqIvfz_|0G`SDP;UIKIua2J7V&Lhew6#BlsOZeK%&rLsNc-?1qCWz9|ol zykUAt=!6=gvV?(;oFaI5GVEV*W&NbnM`rr(=HLI%HP9k08k8(JTmL_o=0BhJ&?F>ClkV@)%kztLe~*5`zPY(sPWkPSwMDb@ep}Rk)hE}9|7s#PBfnV#H*4Vks~XTE zqZoTw-t+%n=7k(U#EsGmK0a88aWTIaH-&R~fg6rq@Xc?Wp2-#5IJrXQ9C{Z74{q>} z!Br`}X>ISI)eG>4-9i$Te{djKlOLh;9y9p_`aHHQzI`+MToP)&w zr``Xn>mv5O3*y>HZv3Z9-ZnnYZEwAQYa4pg_ur}kNYe!|*^vKM0ypFRKUD+#zFP=e z{h!L&ewhlm$5B@8`jr1!tWS|4onmyTeCF?~#|Il3p6*rYZ(lzD?((%}Cg)aC z!2K!@R!UZLzr0sX-p2h*SOzrSB0;)mr9Zk`r9Zl7b^L4L`+ms3m;8l&bODP$$vlwX zUv1|3K@cOY7yilrr2*ynKF=4+%+3FPw+6uPVSm3%cpU;GzYR!t3?dnZF1Wq-*~HsH z^3OV;y}RHBf8Se9oL+R?iC}aSeXQu;vOld6_zE391@Ux6x}EM+SUge=;a;Rmc&A{F z&xW7=o(E9;t2VdouYX1So}e#!o6|F5`VZrP@U!-}#Xl|bGgRcqS$wct;8(rPpqX(L`@4h!V{ZLUZKT&U$V!X(DyOZHPl%oE; zek8r;tNeSpJ_L8-{cDU4A0qIRbodQjIsJ4UUixRXgI}t{?;614S*63jau>%J=9sZcWZ_?poM7@>h@XrhUHXXiF%*SOq{IPd<|K6v=uiC=#6*_#S@E_CR z>;A&&Ww`7=Lj_*C5}&+~(-(>9lo!KM}8;i(?z+Gb@bA|pdGxN$7MYG1l>{{eVy>H(&78Q&g-*4 zho3I+MLPUaf#0OVZxi?u9sZoaZ`0v@#JW_b!;ca88Xf-FBfK5WB0gE(D*``BhcBAU z>C<)ij|IL&hrf3Ur$45{*9d&24nHWI)4PiN%KYRByr&NTiol2H@Dr!@}XQPdj*XJNUjje4~gbScjMK z4{Zk@(hh!1JNQZM;HS5PpVbaNwjF$OJNO0d;M3c|FKq|EsvUemJNTk@@SEDfm$ZZ5 z)(*a`9sIs_@D=UgkF|rZYzKd?9ej-r|M=^?f7a>nvR^4;f2QxxuI=DGb@)|c9LaN$ zjHj=lGwbLJgkOeB`Y{3@tfN0r!t*~=hktE2pNHjlGM@BYj-RBXuN3&{I{YeupQXb~ z`dA&lNYE$i@D&2TK!@KZ@Uq-8pW6gok&gb&cX)X>>F{0e=jD>$$#`l+{Ks_kAs_I0 ztWt;X`v#BaoDLr=@HIMofxy@4@cRT_5w6Tno$$Nr@O_JUx}G|Gtib!|@C5>I*5S_y zyex-Icc`EX*3sv^EBcQP@3V~OXN(TtSKwoH_yxkBtivA?@yl?TpAZpGfsTHY@E7Uu zp6`iv*Wo9Lc=qY=$ArH^hffjl$Z(mTSt6b~9lfilPer(r{#_A|443!?BA&iF`k}%f ztixXs@yKu)&r%W37#)3)z{l$F3xq#ehadVruQwSk$< zWjtjfo^3k%eFDEvhd(Cp=XCfw;jhu*4~TSSxJo!iGtiuly_yQe%pTO_a;p?{Zcq(-GejjjroesZ2;1$6akom6=_`W*)q8&V*U>*KV zfuF9!AN!Eg&(h(?eZ=ugb@*34=J-`Q{Feg1O@|LD<@9Ab{A_`j{0>>JkiYSEs?gCZ zZ*lxF9ll1;SL*PS1pPT3K3(8zbod&9uhZdY3BH|Kq$BgWZznHTUmgCTT^ujVA?YUx zx-mNX<02jzF6n3G@$#+qLE{$;p~N6z!Ioh5#i_qN)!{<~et`}@UEtGo_}L=eZ94or7kNJS>F_?k@cpg4Z;<({ z6m-XQ^pgZ%PKHZ*Mc~ir=>J^D)2-3rV`lJrmfy*E zti#K5M_(OY(g*AC1tMKpZkeBCK{s7TZ?5O%ou$Ly{U=^t`JIesn}~mvj=n(nr7P)6 z1inZ|U(~?U-K4{>xXSVJI~h-%NVh^qFa5{b!B^_=Lj^y!Mu+d!pO@E1gv)gM3cUPI z;+H

Bs2k3j}_;4!=p@V|Dm4f#0OV-!IZF(cx#`$&K3#{87x+y&{L>HccuI8mGvZu-OoyK$ z@Rd6JY=QR?_j$6s`$Bm9W*z>Rz)#oVzn{+OXX)_0#r(EZhhOj*r(dPRmkE4<4ln&h z?cn8oq|ASbpp&k|mkInfT|7U|iY}4V_iu>&{9o|*&G56{4@?N?^hnM%{ z$8>mk&tIv-%l*VT9bVq6*XZz)zgDNi%lmCb$Ro*q*dmXh!%I04PaR&$LHOwKQeMNX m!&iv=`Mx^5lm`jc;a7?Mk`UgH|&z?Q(f{HD;B3Q@@B$aIfV!j3HvWaPAp*QcX&;ydFi6ME>xUnpU zbpaJxaY5*c6rlXdDAG;MkcddTzT8UbJz!Z-GZ&TROT`mvu zPd@q}_;|R;Om9-inDN=5f<{PA*WXrFuR(&JXi)c|2-VQfhAaLFvBr+=SE~MjOl5>V zRZ$Oqbo~@gw?=Z{AYCgO9JQzyF^~)paWLpy@Eg*fo77rZK)W zP9%S0c${<@ci(v$)2@EHX19&5$sVF~5R0zOM*rCFjN2lzJojw>_|jwV2pqNEWENun z#vv804YwiR1&SYl3t3{PDN&4!*@-1el?+XhS(dIER>+_{vZ(3F?yFP^2$joZ*A0om z)G8`?l(cFL5)>?BL29v!MoX+FONxS78TwONRh~1%iqQkZ}zwsKgvo@M9_ z8b+}Oau@lv*XVQT`ELe~6(N2hwJ=yT7S*sDM8Tq);d}x{1q&Rrm6jUzdbm>6ij*NY z@5oLOF0YNgqH+`a<0>@ zR{~FBWr#?8cb>7cfG6?jH19WB79`*LzD~||j=P(-bVe|Jx7;{HOSrK$;+hNw=`0IS z@Gct3UmQyX|KmFH8(RZk#$R@!nxX6Hv$4UuX%zg14Xqhx{6!`#CGBR~L8l*mjt-^~MgF(!T{DDR z6q=mu957yqfpyW!}LfEC%cP6f+=VrM7nw=*?pxd*&l`2(5Y#j2PtF%UX42XCtd48MrWa! z8eL6zjqX{If`b-B)1TdMtxBT2gCbZ(16WT>r zMa`17vDfbFoYZ^&Kv{D|Th-;m*FNk#+I775(}4vok=Cdy%YI*eV}*TH-;0B-E$!B; zSFZnl^G3J5zi((Tn4yr(H|b@aibwQg45fRFr|21shz@3GT`*7kuAUnI@J7|{5ahV#yvUjz7X9E9)3kC_!T|4E*bf%C^XI;Au2)}K`qcOpcZNuQj4^U zw2_oXtD&CMK1nUsE~cWiQPdLc66z`KQ`A!JQfirY8TGXG>Evh>l9BF|uQ_JH;$q$& z;IoEh9ZGCL zdRU|ykG0&F?T%Q1tjB8}7DqY^j06lLc3D08o2T#oX72gsMb2Mz0lqFC@lnE^EoM1`I~^Ewe+7|Gw(Vi`F$Q>C)t&@Eb<9lP#9Y z5Y!#bwTIE1SSr#5Ntvq5b9@wULrH(3{JCv0R7nz};rNcRV>Db&2P&$!0@Hr=AQRZ>Wy=J0B?&< zS`{-mMGZc|CYS+?*-?4QkE)RRA`?l%^L!tBW{{Ig5l*WlLEFfvGfa!^yc*&ropOt~ zfzt?g^&ccY?$HzG**|%i&)I1)#Y1YmHAexzz)y}XJZX#I_RqD2S0@vCqzVnn;uyw9 zpk`VH3ckb^p10Z4EN4_uGPJ_t$=oFQbK1rXlVt+adF!EY6|+t*HKZr|E>;O;_Rq3~ z`#xxFS{J^HRs0CKy5{ini*;eHha zB6(92WvZl*&YbY>anla&9B<2O7F(j2wtNjY#xB#Dvk|Tbi3#GGG4x^AhmA}Q66hL$E_#vCReVb>K`yKKU!Yf4kNbreLah**v_R+Y z$~eAt@Eu`8&FiXo&XoxeeECdUxO=$G{X!i0A|?n%3sF>-BYg;qo(~dy8p0UH*O3kn z@|p`}-3-2Br!NmZC2x*a%|O3T3WN|5bH9TgLOLJUswoJ$;140=7#|@-t%vky<;DtM z@jHOOu-rJ|i^)Eu)%rvDOsJKBAOnmlf!-1Z6*E#t>EpA3K12~i`pt_V|6n{y6m>Y_ z=h&i4BXIA*zFZ#bey10~3Q%We|9;#=AA_}}D%?9Lhg((Zan30>1MoZD$QURgC2O`^ zD!v8jKZ2zkz@LE{u9lo}P%|(Jxj!t(A3{{6lbj*(czg;Pi4#568PWhD7aqhdB|Wj2 zVVvcGF)S$%`<5nFIa2rE3DOV1e$AsO)w>}6RP2l5N8($-H%X~j3-XWzZ#KsUrp zv-AZz#-{jCn@Y9H{{s_9+{iP*XHN*O_!(193a*C7E;{`DAA9^Hl!4TZ^;M9k7xbU0 z4*Ex*uMxOw&9+7`Am2fpp zffS$f!H;-G^PT;HIbytD8*))JLb<{;)5f1SPGCgFrc0D*FVy@Q z&E_MhjC8*^N+Y;ZH~V!;x&p36U0&9PCf@Q7zd`0sMk>}#!}F%rALr5>2lM9kP@44N zP5Cenf{fk6eKAJQ1w^rt7{i|>6v+;XboZyA&v*#@CC5gD_{HJe;Tu+S$c0x!fB#!q ztcdu++)Z;Wjk3o#%M}ulUvEIy^2?HesLo~AR`2-el_fH98b3GW%EY(+wbN&&`84 zmEfK(*vqx`AJle#b22m$Q4E#XRgETn7*%8sKLo+eNuz6`12;1w~f3% zb68KQjS?iDQp)&qZWmD@cYsa1ZB&G!PYd!|gu3>NgVjeJuJx3dK}Sm^HT`=fGAf|v zF2WoSE!U_IL{%nbHH+?UBicws7PRYt$RS(j{>#p`;%HGx_qHe}b;WI4XRXyqJ-UrA zZ$=Z7p*BpXAy31VUfoAh->>&1PYb^>Sq(Eu9MryVeq+g2ZKF5H0k?Cl+NO#YS7lDF zqZZ2*QW0){@*WR#&cvsCHI{J8d2M6KcHH8bY1YoNB+-`ExCQIV)`=3;Ab(soow?&a z?fH`A{I8rXKf~nYjr0cS3x08Uq@qLB?v5S;e$;6}GWzSZS?^0V3X)NNROu_YsPTT6 z1KOgRCD)MqbVF6<2Uf+GkjAVXuAIchO`(VW!Zu#@S@_&S*!j{IcXM2iETB-SazQ13 zFKYZ`(}=-QR4w|#?l%sXx3am_Qf zlGO6A_GRtUQyQZSssBKZQ80P9{`-xJFjSqg&!hlaIn&UZYnfO#?K76IXI1b2}$W+dxleQ;(OB+le6J>SfRY88>OU5DWt20+#9;p?d)S~l{ zYO?mclV&=|$+N*(YnW#`Om8*8zS*eP_i=0w;uDN|Ha)pi1Cq>07bp@e0!2d4-4r+- zN{wsU1g%?lw7prN>*$)8%IUkEX;o`f((`jSeX{k>TTaYrJQh{7WnDYdj7KD4ELwAU zZCkqg;mo4C8HVxK|2Qfv*ig2?A7oTz5Z1x5ZqVk%XL1fT@=;V2v&7gJh)jQjdd|(g zUje^zx7_==f<*cRvp6D{UqrQMt;sS(S@hB&TllF!?nwsCk*O&zI*7LHP8{UCWhg33 znDuyXJSRlIex&y6oL~05y<0rAv({NRlk4WD1nH;q+Vdex4Cg2{8AGHnhAhlyE#BrK zp@#h8(qgcbUf5jLoYfXE5Y@Y^YkB92YpX7&yCgpZy|@viSE>J*d)4m7EUwDr#`?R$ zSeN}FtesTbxW66}CkLV##-^@?#Z8q|`TpXj1eimWbKCmmZ07CxCLhk&-9;B?gJ!a+ z3Gq2~^*&s%*Y`-ixNjKmT(s&{ypIJ|V{dr2z({yIIgg#e8KvTiSV>&#mIbMzZLNt5 z)-U7BQdfgSi}l|QZ`N2g^b8bd%Vxl+?d$#k-UCS!`gUKrC1H#)o(TKqt%|8-;=LKB z`fJ|*E%<(3yEx5ke}1Fc`uq!KT-MPgeX%X8E#1WgD-~nTZ|CT$C8#QMy5U2^(d^kd z$yiqt-TACR1M{=pgp56@$ZFA5EI~%Lc^vn9lbaEC9@>0GC1|l&_FqO*3_5Q5yk7ZE zAXR?GTh~2oRL~;%H)cvv0Thyef0=;NsINRd!x#p7L2lRQG<{HmbO%9~w51Sni4W4; z6%TeVbG$%V#vtW83`&V{N~6pnkFxbx8uZad#ATlmL9Y;5N)q~0BBlQvT)CGy(bR~h zn`-*{5FenNn?Naj!zksfm6WpVM?|S(YU!gI%7VV?C-L$UdRxqvRIfhrRg}=Zv37Gz zM6HoQ?!r2%!45lgIxXf%EuMWv3d(3yD4>jTm|H00o9uB@HmlI!(g%KW+@yf^LI<)Z zN)~c|w@T7hf(}69-NaJ!a!y8a-c6$9fbbiiDMS;fH|vaYlL8qhOn|h4^KKtLH(T#=bGq$MJZO0vZ{vtz2Z5fK<^% z5x46ia*i#a|A~b8s@XZZU|MHbRn~NU7$ZVv_-E^UT%UQYT$b5ugxN1BYdNo++tvMP zrcLD=txMR6s&;azcDK3>rYLAZ*-_t6urhOv{`>g_FCfQ^ocXF zgR-Fa-yn4{OQ;KP0}DO#|5g{K&tU|}{Ct^!DEAhVJbvV;p@YcTqNb4kW|< z{iK-m4)Lho;evZdP0v;;1A2(oNWJ-=dq@I*+@yptgIdhpFB9c1%J7tD`9M7pejgF| zwQR6=S0qWcw8vGflO(ooTd=)syXf`S4GT7cbl1g$bZgjR3iFe;var6G{TYv~>wEgO zYHw!D44bb?5^om9zdUb7LoK%awX*kC0Gd$}uAKXAFSl(_%(?t7E?zkpfye$6`btU| z{aeW%SpM1|9sK-hL^KWVQqdkRSkZ`Lb{AS;obSWqyoHfD02{C4*5nmS0(6UDfi-Kx=P%*VWGJ*Q)f;^SWSs&V+fUD;Zk6 z{09kDEO9}>q*s31ZG5dC0gv7Cm5iu3i$yUVc(h83G{&%WQA@T3Mbw+#aBjtQ zHcsVUH~Wbu%KzdbGAbsb&rEN!U*l1D7L39!Uvi(B(pJE1AH<~|_Z4RQ#-ZSqYKqB8 zY2u!i-H&-U0`DI>;>|C_yefSQ(FZ@`5#prAa(_?PXC9dIy1bqBMw17^WvwvHFgZqP zGajV_Uw}6F5%f1GnT40${7-b1tB#ZL#LKLlCGNsI0a!DHC{=CUbOM~IbazYuUGa{# z2~rJbZ1bZ-#ob!9a#mNjEjs-lx-fB%Gz#=Y_hEm*xAav;gZ;UeD&3QzJ<@?sA?2*k zyEs?YUF0Qy9(E9uywI6_sVfylAQ9=I<&akwwFLHsy{36kPdj%$^QMeWfcofeL-bk$ z;;f&GxYtaGP5}2N6AEKt4k>9HONSXK-ONloJyS}h?B?k9u{ba0A=n#=EU~{0&~wCH zeJiA{t9 zm=}Y$UP1ke;B`H)vM?Y+Bd@s%Uw!Z;rSR8v=a&e7-E@A5@mDwbqGyY{&hXxh40S%Ily!3ubW=Zu6~ zF)zdfEgt&!BZV3+#VUdJDzZwPyIwRA#`9FWh>t7I6rVa&^0kL?>&4-J=ixo!&ia`! zi+?l#dc#m});t6?O-s}u@$ zpm_fo(1zTD47a9+-++`Bz?$e%CCX5=DDXH6`lIOB2ri}+4X#YiOHe6*S30oKZ>NUq z><}CGieX+B=ICNc<8a0Vxk-bxZ_YIBV@)%mH)K`#%3#(O+yTBbO@k}GZG=6-KRbpp zJhXYZS67(ISkp&%c5IuhI0k)Rx-Rt7J@bnK_|=guV%WbU-}#n(Q-_^9OT0sLN(bw` zuucH;UThGfpREr5CIWvw9d7^c{IyR|%!Ym}3z{HfXPUnL@BGOf{5^CJe<7H^3@_vN zQjy%`g_fBHS59Ix6tnm7tWwpF3>xLsek4d=&@Bjc0QwjM+5aZs{V$fZuUu#g8aHn? zlp5o|qrR|lr^fPo$4!CDGp_GBb{N7w3hyrPu4+wlIzI8FgK`wdacQEY+C`@AAk&CBK`|8g&-{v&>cs61Zgb?-o8g?Jz*7k^%AN9j&@2P)qVwu=kMfDrM+^)N(6uctq1zmbjc>kT?Z+viYWOqoRH`Q&DH{ z^gi6*guboQFoo| zSKRIf z_#ccC`!G&#P%-HFc6tZ0>~m5HW%Y!*hFZ9{rg!}3njZ666_HI4j_2A9a%MpmJZqUW zq7@NZ2JSU~(2_&{0Q;j)bRjatr7wbW>%#_YQJ^!6hjCxkewASw-@sk0Lh>B(U{!Wz zti`x!RQt!8?p3^?>!y}i9W8(SS)a|?^QNtMmZ>~i$QdOJ?K3#BZ;!>JLy+%(=B28J z@S+uX0o#VC|ISNrXe>3-A4fFrl=^ow-f!U@mUGATbu->`t-Y2$u_|YJE?&ENyGqIK z=FZ6%XzJkn_{-zu#NgJ$C`7vm_ON{-ujN@4{4yS|$M`5XgI7+r(xI7s-1;JPf-MfO zG4&&3W6yBfPUYNpdMCFSGsR*dhAjzAN&Q}{UJEDprO~=dgG>Hz;BMaiTLs{L6Q=yW zwv~SowDu3Qr~TU}1-mm$Hyo`r+28%t=r%bbzo&uLl-7R#~R^e z1s!Mv-A@iaYsfHR->U4AQm^S&_a-5cKUot-o8}j#I$xA*va^L*JL@?5?)qWYw_JNfcd*4x$5xQ^mH(WpJzmo>jpA|I5}Y=Z2^q$6i(tMqE%Lyz;X!eu7%baluR#(G@l zulY-Rq*}0|dBSo9R{3|G+B)R<#P4R%5yn=}J8OP?vt+=p7q2w&+$o$b`)oE!c@c~T z402fpXWB^#-cr2w=w!Lefec=A>W){%DNew6?D{`Na#<(qJPEvH%H#}RVvD9v_Xzej zc@go0-V!f_waCu&-2Z{ov%D5GcsF-~EQC{>GtKGlS=WRf*kKHo+L2M5+3!^fvxvO{ zTd#$u!_GEoC4FatO?8cPU5>(R8=@X^8uw0~&fQ_G|!u=dSe;>#yymWey z-k@RB+@v0{T$GSm$DZSHis8X$c*_E2fKp$Ljf$&^ldWq{joenTO|rdxedLCU4P&4@ zuuc~(gK;@6=0>g8=Ca;1o#(E7efd%wqOt}mx=gS)F=l6Lb;o2V2y9d`d#j4HYFuNg zpfmjBE4q)e(bt5tQz4iS`z>4N6DEbfCh`+}NHwqeS6msoFBBXJ}$# z$vVq~o*|Dl6W7uoGpHnfrs*>ix9&T{wRMOrMUug3rBawhEo~hGFbj*O^KgppB9~-| zz<|kym0xnZobHYfxLl{Z@l!}gTmd@rC>~qb&;ePj z?ZQi=PPp;7`ncNG{L+mpwJ`HE|Jr%Fb{hWfykdR~f7?!*Bk;FvW9?%6eSK-|Gx+=Z zMmWzE_TT~6BwfxuI9S@k%y-NxoK^*LKHQB)mxR>~Zkuk@nScXb#oA%4li*%yl2s5} z0iz_Ho)TG65Kv%KbtX}Zh0zV4y+`p2)?xnejQI3E(;;X#2I-5+>O;u?>}ou|7b!o& zZaIT|U_32UeuBRQ>nC1nyYRq`AOoCjicAS`V*Gw(H#bfO7HruJlkgL<0}ayS9VLCl zfOJO;l=9;%=%g9GV4T|Y7WRels)Rlwh2Kpj@0po|)3tJ`FPv`6rK-9^wKxQS+d6me z`vAvte7#>J#Cf!6a;+|mcb7Mrk@2-a#Jwr;8L9E*&A861GT$=7`L=kv!Puuj@@-*o zXW&BE($kzC?B-w%2%{IxUGKQ>R-kVz{;p~2fD=xRXYbRQGu_ix-ml;nrz!e&%T1}G z?{_Od>T<`a*-##=6r@ygUf5K;!c5Lnz^?&*1E<~!i1x*CQ@6_5o;Uh-GYN2}m=1BP zzjep)VV&k{?CG&_9s1#T=`GMAn-E6 zh3X-%I<7?O;^4)@!3+EnUObWmquntt%IY?OpG|xu=7^L2;39B!Z|*ql|84Hk%GGA4 zl(39O_^O^V?;?~lR?hYh%fl3KE(j&;_6Gocz>#OU5jz z({b7QC%BBQ5!}v%CrmS89MAd!a_T&V?+;K91?f$pWIwQSRh9x=pl1mI{mLUN^k=eG zWeH&oF+zws)aD!hu)t-fJ2#%0i|bE!RP64g^nX^MET3ibEuBVxET#(MOu#wVNz4}V z&YJC{jgNNZ_c-Ji0JNgQ4FauZjzAkZ$4OhhRG{?_16}J>`r}OT$FYudA9tktxRcfz zCD6u0Ibx>(E%Wiq0&QcMqx@k`TK^{<{5}T!-Vd~rkCOyiQ0Ea@NoG1}A4t_(NwB-vN{5}l)dI7D=cTRq1IQX66q_sZb;CCAEI{|2=-#PhJIrvpM zY5nIp_zeJl2>lu&B5<9C$0Ys2fyCHuM5;MUAV;|-v=H1KIo*4 zf7HS6MBtYJ+OdVNJLDVS;5WcYTmG3g>!4vc7fug4e+&d<$M#zzWGXI#r+zxc%>1qrwaEy2KCg)K2A&-B9tii5T+lcF8e9PUoeN~wXSP#J|;dxt9(tJF#YQF;O z#714H0b!lU=041O=6c*(I#U6geP0AT6+Q;jUi`7-jfNkcw4-?)1EA zpbLrO)QngzThxzj#w+;cSrBq6Z}#LCUErdAyf@>n!|jz*(KF;G8Q6z*Q0Gk21{%Wn zpu+QH@0Q*fSe0pcmKliRl@I=vv0VuFRUSNqgq_@o#cmWYS?3RRif_;0f7V(oAvis` z+;?3l^XZ!LL|-Fl-^?tF&a$vJd)@R7tZ*~qzA1@?RmkflajnR@(dwU6JW#f^V?v{R!?fl$Nd(Y8JOJ?s>*7 zV!WiyuNkb&iJjQm?*-cU?=dZUMo5V{Yby)zWhe(DQ9$au-=Ron7l7ZD368S zCJFV-?!tOF{VS*(g8PReUZeEAg`l;*uB`5bU-#FQAK~BV*Oedl!V1_I)?k6JCr7)# zj-@%$%g9;`dc{aD#Or*}6R$1dA`;92NK~?w34~SBg~HFEG!mmkgGxTr8mF*6^$xqU z7i`fNNS_z_E#$4@&wESkw~Z;?Va35=y80NTdd%-rL zUn%bDzgU;AIh;Kso9l0sfm~T-I_M|ZSoUrBHE6hTb~iXLz26RD?zB>i!+hzt$!|KX z%&;TR#YVBX&*-|RKYj`G6t{gbqdP6eHKuy+D{p<@Z6lV`-+x5l?j!C^KcYE`Yp8EG zK0TvO3zkinOv>~yikZfXE&Gf6xxX)_1dEC@`;_T2Bv=zgt{ZJn6pu&9yYhaYBQW!vv#;~C5!{s2Zfn1z6!JiQYfdROyQ(V;}@%IjjZafa*kiT8T>lu zb7v|=@cS6|W2Ly5WzJ#y9@w+Gaa(Gq#uAJs z7*0?{(3hY)K}4{#nxs$g0>M)Rs|l78%p;giFo|F+!Dxcv1XTom2_k~cb8*UO2F44- zeTrZ;!BT>G1k(v75sW1mO)#9Gil8q+_xU7Ef}QgS=L9bhJVmgYU@5^og6Ra42*whO zCKygoMbMX^J3&OSljPVe@K5j*!D@n~1oH@{6HFo)OE8*XI6)P`PQtT0NfQz5oJ060 zc!A(4g4F~|3FZ+@CzwPqmS8l&aDpm=z69L~B7&W>N%{mY5IjY&nqVoxJc8*2lL*EV zj3yXPP({#}pgTcCurrvXPw)c4Qv|CCmJ-Y(m`*T>U@XCCg5d;J1bqp*6GQ|%iQJlr z+%6D2MX;J+DZxB~=>(Gq#uAJs7*0?{&=>H3-<#S0b#G4i@xS$E-lFiwyKg=L?jbEm z&a>k_muDq-kzfPCBLvF{77*kKrVxxL7(-A^FqEJ_K~I7VK|Ahwc~*iK2{sTsLa>}* z0YRQ%3c+}SF$C2FLkap5WC&Vuo6Tczo#b64?goNK2$mBpAjlI;AsA0EhM<~YC_#UM zp15Z67=m`(=klxsFA{7Zc!Xd%!2*Ij!4!h=1Y-!Q35F8%C+JC#A!sK#S_S?IHV`~Q zu$*84L7rd=!FYl(1l0sX3EBzIo+M3%pdI(QJS)MA1RDq*Ay`hZfFMsWg+Cs3TOT>>W?o%_>`)=a8qPds%fx29_g1*fLs zL%D-7TzbE#Z#J*4DTtwJ*y?ck^V86vXK)|f-_+Jv{V6zw=&U`qoUef2Cyr6-KUzp( z>nNPVrhcPUJSvAnxyBf#*VH(=)P{o;jNR z^A}Zm?-+l$10_Ll|75mzaTvT#B0;G|xQxnb23DtXY3I1&OmN z9VOptpjtEmJltdw0Y5inj3H84Jq>Q|S3!C|!0Gg#oo&G>@O3yL6x&5|jeXd-Re=gD zj86WV0)3jrvuQu1t*lY>ptPO&5*f3!7S1}vlzO9iXQYgYfwHBM^1-SHtSMbqk3*%h z(RKlDE#pu$Gur3<)cT+ zBf+xFAD3=4C8HUk6)5Fu`!G3p1vF^-S2XJmY z4!J}myve>Fz<3x7B-G%};O=h3O*o2m=fHOHkF zaW7p!-hX*HoYIu6_E^IN9$@UdeOjhSrZAQ#*4-PITI&KLpilLT^J+a1 zFa^7iS8IO2cyNV*%Mc*dF*%bPkDC1A=9By1hqDHMa9b^h-sbsFcqs_%oHy>?_>D95 zrQJ)-e86dky%OQ5QL9N?aW_v>&SRb|Y~zqz(=+Uh`~MGTX)A&im(bGP7V+Jw-_4o4 zDIU(3?6iDB7%DnnBWXbN#}b6ckQ4gu@WB-|m%u{2TS6JG*MMcBG~%lo$q_^y#INYo@D)(2 z%s}XQa$~y52)8G+Z-QPF*DBZ}!8cv^W>IThV1y3ug^OAb1Wv&&RMeUuI38S3-c~~( zuGR4tK5%}4&}#Ai9cmLa3r5g<1#e|3tc6&5>i`RPb_a0IZ$Y0CO5S%7Tk#?BPPmhY z?>?sOeq?xhLA;~Rx$Q?~Mkq^=e%GC{%*SQ9id#cN{osn=ka(dEG<=;I#Px*;x5@ z1>$H|L@hZXdnm%_ibQo(!BEurWESvLCT=)rg1hmtgPh7K1k`2*nDT?_S^UMbw>IJ)$_LJrj zK6irKnfqolw$S{w?HMyplUi~G|I#lIq?S-oU>CPUJs4U$GiSA#T9RTGtWmHP3ZiBk zX6{;`|1@icj)PYM4uSq_NcQ$P@xbHPp{>%&aa{xQR1Mhgv<-5uaNh@hBO*ZyrSBT% zT+c~h+@;^%{rS+RnVcKw-oL=*I^AJpFNogW-8Dol9`p#vf-@zHV3{(9@uwuI`1Al|I5AQr`&_1P&l1rmSM%N1>xvNSfcSE#%OlB`94|JuWRW3be%!D>L zE$x*LKIq6!K^U9*=FW|n{%MT*Z0lH=l7fU3A@}BN-b?alckmuEycsra&}r zzqdkxPUzc_lLlhkv<}Hx6$^Kz+(2HpVT>LpXVXR8#zu)LfSik8lSyXoow#78Nu(EY zdJ=M4ZKl6~wwD=*m?tgwukHC6zFG8X=5=h>)Vcq2{$b-T53tnsK;8N&w>XIm-uaRt zWjc%g%+g7+u{CWiFW5Wbc)Bm(H9b}(vE;Q6=nhH|Zdr+0IBn3t_9(?3eQ%4!xDGzk z&Cl#PAU%=$F3JyD3^%2v=s?f`Dd!>?i{l8~4A-7;E1+JVUxR263yZ?aR{V3wn+x|HSB>P&b4VQxEN>=J)9fdDIb+0 z=!tvqJz(g6=YYFz8ou#;J)DQXnQq7VyTkcIU1Y?luS1bL3HQ!0fwu?F2)rF2ye&QH zh%G*CCS19=i~n52!ZPC!{Em_r?DtOaVkftKH8@`^9Y@_AGu#PVdIG0|IlpMu20c^zNBbWI zkI!%X7lQrLSsJwICIhx|IutPtZY08cTX5RNi-mVbIK^U$%sk*%l8oQ{!1R^}qys`4 z*7mV1wh`3+-;S@y* zE&m;y_g64mHfESkutnjP@l`|0bTPVnkBF@^Clfngyx)3fz`fa{ZF*K&mYm5P)T$?5 z_PM51iD_ks2mH%~7hoPZj(PMS6-!QMqUpPET#q&*vuF^<+?RD%%%IN)l_7Bu`-!8@ z*w1g4bYc5BG%@P30;DFFo}ONn8O2ZR^nuq#A;-BMv|F3|WshsH(={6uT4{ikx+s_rev6Xm!RkG>0UTy2YR zyqJQyphM#)kF0CKf?W^oN+0MmV!`gT&llcFq12yj`m-}9n6ZQtHrUsUKMfiR7T?(6 zQq6Z(SHjsDtmDHEuw&tUg&iF19%GIm#xRoqV|B($@o>X=CJHiD>0J`!u;LGnv7+(y z+AoAv+Me~WhBbAN`x<_6_T6}0J4fFRcQ`uG3p;U2unQ*ZxIgxx>F`>}48u_aya@Go zyw2pVRf;&79bT>I8fKoXfxBYRd&R+ugQ$jW4!7=}Z{jX@k(;?(n;miO_;!_LyyvhM z?g&G>hqGvGW2pRi8ing=^h-d3gd@%xdjgPrcmljSDc|%c>|Y|$d$zfo3pxMBG0Ti& zJ85Pi+*)OOhi4aXZ4AY2J|ZgI)WS|{)O`&1aXl??G57W0 zy|f^q&71vhEVD}N0l!CGS>AGK;D_E{x>`HiuU)--y$yMNvJqC0>8xLn0b4fDht_j` zPcgh+4B9c4`^_XVf@L)44L9u$!pS-VJ>)PB<*x4&<5O@NUgES>KT+zP<$m(v&M1$ua0TIzCtjp;JX5>3M%@pwPNZLAmBcNhFNapP(x z?UvA@+0H^PF9FMyQo~zTOF0>fB})~LnT%Rk&ecWq%1*o4XWa;I)=w0kSVM2!ZtEOA zkrGp2-UCnkd@-1(G#)0|GBcTN=)hz%l7ZUu3>c~SQ?$$pW6y9 zZ2vKwvpVt;zXn_{T&Y@l7EcN3@oR({=A*50cTs={q5@S6v!g2gNj(S)P z>*TjnVs4BID=%}zi--1eASI@*=EE$359R<)K?qfEgpqZBO3c!l$(ysT;a8N>-S2%x zDY5ym!7T#Xx`d~eWjW#{!#b=)7hsU+{H4h0YX#roeWQIEwm|wtbf|&BJq2vYTJQ9e z-%Sz|v?AD(@0QC9h*@g#hOeB5)*sGQfJ^S`nvDCA!Ux=LPpvaH#lf3JU&9-I0a>f~ znkExi@&1yPZ)t};Lah<^C7g@%wgKeSL;Bp+eW(@QsvLuuN78EBdFGM$S_OmKZuxAG zXPz!ZDxsqG#MYhRpOU+F(xyqkL-y5Ig39oxzaH07_gh@pMx_rx+m-}mcg8rZw!xCZ3S>t;&t^0jgxZ{27*HPrU68L;05 zT`8yQa37=L3>{;w^$tEZ0DZbH(BOjOm?l73vnpZ?9fB(>=1x5(!hApEyk9Y5mxJHT z5^com4qOskzIly8$_>ED)3@}Q^Mao{oe$Ut9)Tu@sW2rem2mhYEeU+~}BJjZA__xNG zg)jfV!JK|`e654Oze0XDyvS`Le8(){+A?_OG05PU=MPM-GiAc;p1J6NNeWUioSt|F z>U8+rGX4P6%KN|5M>2=g>?3oT8f1X&yoA>eN9?@tt7D09g9X3Bd<$MAfOl0V!d$VF znV{GS>#H$Ki*$iI$8!bj1YOupD#*Z}SHP+QtbmH9lW{R|C|uQM8J&uwb4~omvYkn*Z7nFsh-lYrG5z9T%+M#+DVG-P!Fz4 z-p~c+jOR@3B-7)h9ZaIlQVG0gN>-)u=ebFh6Y1$W>rZMpYoiz3cUu0|S9$Sx*5#ix zN?>j(bfJzGG7CKtY81ENHuO;wxAl@6*FAyawt%L8xYx~R(`xqjTcZ2nHGOy&=6-b3 zw2PfzusYIqYEuOrn6utA8}iMLk`MkBEU$=0RCpBvzj>;B__su5HM^Wye2MJ1&)b7? zAGgBWjgrFHrS;m#ybUd4<_y>X4;QlvRAahL)`B%XELF^~sHmePuEz5i`mBI6*j;Am zG46>ti z>rzk_&r3H!3Y5=!i+k@)Aucn|Q6G;&eH>f&w|iT3>-w?{Yxo7^6+Vksd$$hySjo$l zJ@#&fResbqRFS)uZ*f~4*$y-9`+Ia|H)OpHwX?o37IbV6-%hlQWv}y*kC{{cCcGAh zwR|Hdnk%m1w;bSQh@8VYZ`H$lFC1SF@4Vzn&w|yEFzz}0$xW1^BM0eYpk`- zaA~j512#9&X32dPdElU&HQ>7n@Mdiz%v%?K#N#{O*{tHZH@7g#xj%xYMCx)t3h#fz z{TeB&oOK)SQyPXXlcc?1-S=+4JN4AvI>80&%hs>qMH}$RD2_oxe0cpU5n9Ce@Tvgx zmjFjO`2a^f+z;d9fsJs>5a0Y8xnUjEnT|k82A9>k&>Upig2%znmsMm@k@VxPG_H4D zW#)QCHuMi!)cy)yZh}{ijB-x}nq4rK;R9DkE-z5N+m&dmeyN`Z%E^&~F?YAz8c9E5 z0%70yZX3)jPk*dyhxCXASYw-VY8dNm;pBera_ChQyt)DTK|lC#?rmLI4#h+nrO0LO zFocQzW+AqwB6xx0Ay`S5?*C1w4a)zLsb&JaevuMS6>|6uD}Jh_IAqWSeHYf#?+G?y zy zRJfjtx1z#L+-smG<}5``Lt2gV1WHKv@wzHLZ=K6VZc~G(Bn4iU1sh&tmgFZ#{7qau zXuQ{RNmh{%Ker{xwuZUT^7h*J_k=`@}^DOSTSv18)!XM`bOCb}H`2 zdTV?G-MtRK-ftJTtmIy@qhcx3Q7~kqRthbM2Bxbn?H4AYgPCo+#&|;Xm(oVW8T4fw#1HRy{apBVN|btmSs~l&$GP54D{6soTtWMs$1}) z6dr}}8^j6?)L~fTzWJt*SLVLz#;Kwf=ppS%mgks$co`2U@4SHllsa=@;c?T$Q9C%e zkDFv!&h$P*PBid&2EL7ks9W%Q#sLj?rE=sB4Q8qUQ-m3>~*xyLm@>vhazjSxg2(^$umcuh=F=gKK zgt7$gI)W6iKOP;NqlQraKpkZk(q~AVXz0fVWVaBxC4IbsP^+-y;LPQY)EakOIYRz^ zK=p9-U3Cd#F4(DW$GS3{f>x~z`5fLoyRZ_U&Cqa0lX7?63-s{v|2_22Iq47m8GXtK zJ-iLF9MfJr`A0rFULBzm_=tYmnXbJ?&bZg*A4!eT9uY=nzc^k~0%JEGb3HZOCbP>( zuQ{5T%?P`(_K%Jh6h?fg$0snVSKr-qaJ{Xx_O#Foa36Rus)DzbzI0&3$5#FHVang~ zG&8WHS@0ElIiak6^zaDftZgB$y}L>EDo*oPi{*J{Al^LUGh8)7iTkwSci@|hm$=P6 zajYy>@m zANQrO9aY&VeW7qOwx|xLG&d1m9!%^JJ^TuzNr|z%Y#zc=!|$GG{jqI4$bAU7+W~by zL|wrp5XK68!}{T64@TLlf6c{~|Jdq3tLt1_`ozO<9*leYPK{iDahMx|zks9RnoT01 z&nNsdTYP*^NjUEFa(pBB)EhVBZ=}YQAB0^4=#O9>IMX13RTsODJ#Bo0QnmvBl$b-DZp&)$bV^s z`47F3aHffR%MASw^Dp^B&m$Cp&*TFI=o=il{9#lR(pm60%&ViQh#c{H^udx#B4_KZ z(&t*H^GeW$EB7|Ro6XQ>;B8ji4&VQmv&}krz%RIH7g1;BQXWotqTmMD8R?H? zNO@3^kn+gB3hYd$g%U!V)R`D~k;YQ|OTq^An zJ}STC*g@>(euOf2X{f>MPZAz ze*pgO1KjQu_B3U8Ud)E~3dkGc(#1cUF~zTMN*BY6QFVA68PVHJHyk@_BsBw;qZfYN ziMh~0?p#)rm`Qy6nz~ zqlTVUu)hVYE$wEU@^H2sUf*vZ)|byT+{?qs(<40W=W)6R&f`3>EOKL`_!Dr$OeiYxte>>$eAKKs!+uZ6relX=ln`TEXfR!cM63~P>IW+JRJ zDV(|D%vT&4oBdXVvt}?4=Re#Hqr&&`h+QIc(}>@XkK@u1bJ6;3@i=Z%9VM0ojZvcp z>;%SIs$bt?<8$JAi@24C#%A*xpZH=^3FUcwUb;_>c%KyFzIA`=S)=Ydtap6RH%g9Y zJjm(#^eEte!f6YixtPPQR{Gk%+dv}w2=QkMt~C%z@Z@RjL{Y1+jZT}SeuOAIz1~x1 zPBFP*ylKJd#rM>ohNPW?hI@S<=1-}d;X~S>c{i2gZ&Hg>xy%Nq@0qy~ zH{j15#=l8J8cxGoO~JT-@FCx)6j5oD_<`9PF0nyIS`}ODsA4qc{63G=z>WAoFPD{Y zxh}F9dQ&4J!SQ?-_Fuu<)zS%UAE*0^W#mLYyZL|8T{<5ivxA7`Z-c%P;yIDLJvKXZ z5>-mnGM(CvIK)(up~$3S!WHr_l`@?1_n?RL&PAq}IL2}~{chhf<4r|eLWUxg>~ECc zaXv|Eoi+Vq0yn2#mQcwd_J{R*OubBuD=Wt@yk@#-&IImK9c7C?yXH+_mr+BEiqIh+ z_vM^>!N2(wk9YLLZy$l?wNu2Bv&2oXk4*?Z94h{jzl7K!a#>1`n%Q@R$RulKf2_We zo{&*tg}6Kcce@L9vV`D*?mC&M^WbR5>^3!Qcijo}&d`LIaO)`Cf9qR@ERH^8+?K;H z|2pj?PV&&c$PLj7dta3j>4+jt2Po>tO?B&nPHa<}bL%=2VnXp^6Uso-DYqQ9Tp3hG z`loXCAMj%?;=nBBLV10~Q4pUoA2wWrOGSze;7$Gg2U{MXb3kCCAX z83U1-4r#+<}OUA%-ot2`AHilcYbDl^Tw_4Q$Equg48(TRBeU`nP|z zQ5c~oQRaO4wDU<(mJ2RX2Sd*^toag3WR`-pTgYC5-YKytDYB77usc~|0tDiV{A_ee zdX&Khe4~JbgMS4I8CsMyH?Kl_Gg{Gp9FbAOl36OjdloXQGOs0g%nH>FSG22GMQiSn z}nueF;XpdGQ!#2XVM>g3qf~tW;k|Si|k=BzoKT zGt#cKpihF&BrC>hl_QKXc6H)B?J>sMl_t6;_{_0lJp7C!jB$2#!d>k##@m&~xg_|! zW5rnD>A$VLB{9=dlnJdhXtGscZ}TeuB@5QRcpd?>oX&DM4>y zA!?jLEqhFiRAyr5g3pb{`ptEO$wPw9VCUFl@{-CvV`qWC zjmG-TbcD%Yg3e=S*kcNm%C@jE;A^9?eld{Rfw(dIsdQypOn zm!LD*XnRbNQkjvR1Rgfp+`ll&5vCXkI-i|rk119v`JDOm!=lm;smcIsmMb__CN7xc2=sb3~eZP3AYzsRS ze2T2!P)C?DBlfk((;f*r zpMAj|(|)P!b2bQkimYFdBTR=SXcIfo9#gqgmdg$RpCaowz!9cO3HmeE-yYLNsVs|q z4m@hK*`v^*6i_WeZ(*Oc$5bPgZDoDHqeh#33w<2*sa}H4VIMp98>O<%EKdEF(Pr<$ zK8`R^W4d{ik?n2YCq^pEW<9{8#+W?|Jse^3kf1+jg>&AX&b@k;O7WOapm?EXJ zt?Z}ZQ)4*a!cQGxijkmm*pKZo#Y$zH*^j`d#&F(+A34GlCqWz8Kigx9m&&r)55cF# zaGr%9I>NL<+1OAM~&gsh3`7T zlp#T9vG3Sp%9hGDv5Uc@#&Eq07dygKAVF_s7usXmE|q1n3&EqtaQzD79AVlcL2qW~ z6HNAWzQ1SrTi{b<{oZnf?XU!GWarxVt6VC}X6JxUk@cJ72vem5{W&|+9@9msEQ6g1 zK1J4Vh9gYX5_B#bV~?puD$8T1gHMt5o9+lxy#$@bPPNC>D3xtuqrs=h`b9g!M2)ra zDQ+tpWsixG$}-s~@Tsv_zln}8c}UQk+41(6yri;xHXJ-^Eay`g?g*2=1f9)}wZ{}F zm6_Pl;89~aRpDqym_jA!4E8m9Ov9wI&)8SNqsDU26%KcVDO`fiV~5&fij>N>utUJ3 z#&UfNhd9C%BSCLsLkT8(I*;vHJ{WvzEY@$ZBW!UJ^j0>+zF+ZDStc6-K1J5g;eCIF z1ihJk?6$vBD$8ea*Z+vD-#|xwN|d0p*#Y)_;-xYZ>kmFf*3aJ&rVI%>gMH2(Q?^uw zSj*s3Wc{9XgsDJ+&SQP-F>RO1wy@sdQ)K z8`DqWHNeIF{eUd(sgTrF8^#Bxo@~$Ku&vZko3+ST8$@N@d=iR!WDgYusGq_OQQXf5 z1UbuYP6I3Z*r2za6`;-^fK^+M*)+`#O$a)S5zG#S7iBA7A-+dzPa~S%S_8cO`j#!P z9``@6^f8zX6O2{W~^rl})7S1p9qYZ0U zX|of8zSyd*T@%}_NA$3*m7*Pb8&`WB?888;GIX$V)Z7glQ)p2YGOv|s=6;OJI`59i zHL=jf%EMY%+U()va)e#zRW@v8THot}mh|FrdEe`Tj`U(JKG|tVE1%SmhIiA9IgkAZ znf0C&6)BbGvsb~x_do-2H8n<@N9aZ?d+0_3VnmWuLJZz`yt423zR>Q{V~-I*&bTqbg>S)U%Hyh|TOz30^Drn7x@Z zsWD_t_UXwOZIp#mC-h-pqOdkZr)>U=g{?M$BG^c2f(I{^8rc&Mv-v&dt=o^Ux6T+7 zxW00|piRaMKtG)UXmKx^^VwtTturQ+Wn@cbpR-56$@iF_{q{&|41u!i6)-&vERdj0 z>|r}h9)(g_F8kxd?CpE_D09}uAJ<#QNP5+Cj0u5zP=mYyV2l~;508y8W4~0I$sSDb z+P}x#Z~wQBXY8;9pUWP244X%}RJxh{=3#dE9`mN{-#D7FN8(yeS!f>+HRvoG_d<1yAtqcE|BkB_lYD$QYc zJj`y~W6s*X!_gS2z1?HXWdCYEMn)<#vR^>@+-vUtZGodPdhE4vLD1LdPosVx2_lcp zPw?{Ei^$(w9FNld#`=*^M(}rBt?w zO@uVM*WCNtL`Rg7*uCz!;j}+a{p+RD47NSNi{H!nF^?RNF{67FTn^jv_!zUL(p?KOK#6k2H!ctRMptF4vRye=9-c zv-iNs_HsVVeaGWGER7_Kz4Q1u%cat6_7*tVUM_R{El1<5l*aNod((cL7p1Zc_9i$P z=KtFpj;Oy{g3e{D?J#-VlFIVf-yUYyfcm*j7k_iqt9l9E$o|6)7vgx@sE^Ag(m=~z z&hy)=SusS~SzezG-yndY%^V+aa9>M+~QDHQFLxsJE80Q6FpEs_0)Qk+0S{E6kc}}p2P=+RW^c@Pn-V|hF z`)LM$mQSGkLrG2-;Ak#h^@w^y@*`I`!y&d;v1tcozH7_pNeTZYQ2Q6c_8uAK3aoz_>tD+HcmDuu zx%Dq&{Y#O*-8TEXlPr5m8{JM4e?H^ID%zwbR;^Pw1$x;u&Enw?;+ zwrAXfkPY-?eu^5txQK_p#WWTEJE<=wU0P8wz>hl@4m(3@)IOMr zSDn&`-r~T3j3jB% z+?==~M9xZ!d@UPU|A;lpFLWSwT3`4WElN9@lh79t!VKrunH~lr>sk$LxtQ%&wSksB z{o(U+?WiobM##QAy+O1%wdG(=bUJ8&Ro9Xcy+Sq&Htb6pp7LXg;mkgG@qj9Rdh;Ya z<@Lm;2e#b5LssfcN36%!J7eM}<5`Iq3tZ52*xuI8#e19*>If{>rCiHL~anGoc zr?EfP%?gZk#mifCB^%%oi`)sLCxbRd%5zWWBsdGvTHpyM3*u#_R|?i#5nz9I6qR&k zY)#2h*kmq?EiWNENy-Cm=O-Zaamfne11M5RU{rKAe{^?}TNLrGSX)5{_PxF3roDx4 z2W*4kt%&)9|JrGB9s^HckN&k|=9N;+!-}u7q}?m7&0oXw zHe&r5g3PWDgW$PiV&PM1TjAul4w%&71uEC~hv-JSQtP=>xtxsYZ8Ukwcw-4md320u z^#&hlY4X^Ya&Uw12E^RBz_?(=EgJXCs2Rw^2Rizeb77wGj0$*lHP#(#A39ks+98hn z+LvXhX|;r3sK5bfW574JsZ%DbV`$D@{C_BkM4?(0EX%Q+Kb!w?**W4H)jAu|yp)Y> z-x@lai|qwJP6IM1(pUjvHQ2RFSOK3#C&_a4#=FFKQ}+H0UiLBZ-V7Lh5>$AbLZ7<( zvUUgQOW)r~KS)+Wu`gTB<$rR%nXe{$b#kedF1{9Lb^8vCP4~gvH%s9AmAHDYd22%x zf%~dt<=i()md%YQSv~iw2J*|cZknq3Qmk9^g=Nq3E_kD*kQ0?{N8ZT;jK}U|_>nS6 z?PGc5T_5^$JA53ViMUBT|2p9_&}qq7zJu7&J&!SzjL=cU{^|>*_OnAuF0Dz{jj4q3 z2uX(B{m_PXf(^Kyz+>5F!-I&Xa$=26qRgGWH@{u<%OaT%uU1pEu7vk6zF7_nTZ8*o zy1}Nj4QWyGQA#TBkC8ODvC6e5$vC$Wwyuhn`TSsmB{A-kkd!gkjjgLGbscz+a>=$7 z=YzQc)m2YBwwA*d+duF1sA<6wzR(>^T+(Yy= zlzgCeyi0N#&ETViT!{n%qiYfT4O@gU!pbkJ+se<9@wG7|{R6fLULZCym7FekdS zeIWcoWD2vvrR7lRtPNigKgAZ+lt&`WMwh1TCG)L3Al_tMuS~4h%{6n=gxrv#=bFC# z!Yz_P%`*}sU$OO8+GJz%P>M5+kgH6H6t^nb-P8;|k{tYBga?U!ebQ*eQNZ8CL*=4q zxxgbY{95R>S`gjpu5r~c%Diy|{BVUawuwHK!WiN6lGSZj2zubx5T6mz?=rNZ#gg%Q z(g&p^9$rw**>(~IkG&s#{Xz?giD!$4S7e|g_ifmnG(6R^V%)FBW?zcisO)WQ{sX1D zJBm7QF-(Q8Xw#M@&N!`_l|+g%vhX5IuX0LTtkT0SFulUN?_wi^PwPsa-NJHwl}|q< zqFy}9EOApJ28N#(`I}Vd_uY~-p+0K(AX?7Gir$_}kmvDP&n3W z-7{&W#@U}x9UIIWmG`zqYp2oEo-h4TQC#;SMkve}>Rr3Jt(258(;5%iYHI!vSehxo z*X-{(zm~+V>o1j%5@uTKe$^kb@}GP{J>ToOULy8ohYVys)I;XGb?M5h3#%W8C$MnxK{K6Xb_{&%I<`)|Q z&*`fAe7D$`JRBKaxRk0s29{e_<-KM37+x&0U5oK8x2g||xUqmXE72YN=|NdHKv|DGdU6AiyN&;pczWuF_afBNCQwVuW7P6Fp_aL1pR`#L*Osp= zl@IGhC{W-b1&|sPts%)|& zc;9h6Ua{`ZVuy8K?O8X9e{!^SU;m39hyJS`YyS41w`%QgVLlh47pQttiIa;&)rC%> z@>mv<#V~56+PO{+@22s}*RtUuAW(UJ{4kQqk&4yeRF!!_3sct}?{KdszXn+rWMqVb zH+1*6{14vHAlEap<+?2~8|vBzEV987MMpxg$IzS`3BmqDb7~WULx<+v3HX5}SsdVh z;xW`ync$%wN^~wy!X*Un8JhDuyi|tf{L>zmNJYAmiu3snVmA`6CgRC)>ekttQm(MY z_ujpg=+m!8tX+2||2;Y~6Y*ti9vnS$Z{2u*yx<{}0H0Rky`=l$o{2=W(T!Bn*Z)p@ z&2-;SSx*y=-m2=ASY~R2oR(5_LOlj|9k;I*$-nDGbM6h0eeE|lgOCoLLom~vm7lkuG@N10`TJ5-PDyP>C3>h-v>|Fo zD-#v6K_x#an{PBa8D!5^|CWOs_QQ*koX?PRq-WkwTh`B0dAw#u?r(&Xk8YJ&Vmzi6 zC4JB;FG-=~!xgPKDcWLBZ(DrbyO_B|Wg}VwVn~Lblm)!{9elg5$aIU9)b33IuU?_Z zr+u3OLdD-i$hRg0yx5A2V~I?0a;r=}+=aSe3fQfb^*f&W9<6~8O!P1R)wh6iub{Fx zMhVRaW8QqA(^iAgTrgd}rW=+rhui?d#}y^Hb=b--nEvs{+&W~vp0lNblu|FrN4QXk zQ51TI@+>9&Brm{-NP_;h;=He)fYiljhI@2} z(gjbJ^DZ6D(fn_~d-&yxB|Y1`(lxmh9$RIR4kB2I@vD;FGhHP5fxus&r|_qyaj}e( zsTIE%3}2F%MWXIWlgGJ}SRGH(dl9V{@wbzYy1NV~Bz5~5p+Mcil=taql`B>qG$}`> z`Ht8ddP0RkJmX@CNt{-M*dW|bj7v8KwyiU9ij}?I00j=B-zY6YKKF@jNML{)+41v2 z?_xs?!_Jdzk>6c2G6izWir4Q?E*r%LMhLm-{i#=q3}R2F#FL(E`-MB<%&O5F=m9xx zw9pgKD2W(DdV-xW4!mjTF(HOb-?OAAUzH+m0JqWO$=QtaIChs9)BZ+nH?kYQER8-*%tH?Xukx6FSKGwmeAD zp$klEhuq!{>B`r3hb53f4T%)dOSA3BIf)u{R8i7kgY8Y<5>q`(JGn2iyDHlG$=j6V zZhQ)}mDJ8e(a0@>a_sk{b{#Ndzb8@}$zP4!w(a{;8Txo%{QZ0Oh1}=GUe}L%95OD* z2FaacWNv4O=7+>oK!n~-^t+Revc&jL<)$;_cGBs264c$9TY=Gr5)BX0{X#EZb`g5* z#Ih&)HL@=v(j|4ugB6{+prj7_`6`%dYuSD@E9N@ah%-vPWrGl9EH!qqO1X16a=I$> zC%9Ao$P%LTzyHXc3a9n@=Ih` z3M}nJH{3IJl!#rk$dB8r)R~kN@c<`%F>L5)7DoULL*h>B8QF6b$_0%3ITrY>#fV3RhAOQ=u~{5jkL zWuK$sCv8+j_h&xpdF$tV%wLvOlNi4iZ#K13?-6xPmd7@C&9iz{i*v4=PN+batb{z@ zEX-Anm1Z2w_Y^;Fn;pE?;>7)XbFI;ca}8-$a~|tiM~NDn@>O^<`bFw#&-G27*k_90 z5}yg9ye?8QFFKQtDl&1(Dj95(T&k%22_(7+Sz&QT<=IM#+yKO1#2iR+K-lO25sU*R z$x)<$C1bOu>}WBe$@AC{?U<3SV0uyS+%#qB+*UmJ`)ENlIR zjzom2MlwI7?>*N_8$8Xrnqq4^UP+Di(&R55r7oc|#uLnZByjgSpm5f3RIS3+2Y$m> zNAt%sn)QpJ*C1snbx6KM2lm`6axbQPF6qGgCH6gAQ)=IjH6`{mu&i`VY&>Fj1l`Q* zGo1P=U)WziACs+9i?0BPAYxQwhE(k0pdyntl8N-I?Q_ZpamCiwk|>>Sk*ZvU95DwF zWAE)6&dXVm7U_n0*m{$XbSCq0Qyb|?zMH+sw_nK|mHtB;*$;o;z9G_8WGwdY0h_j+ z7NU6=8ynn(`K&g^BCal=*It`veNPm3MBQ_bQ~0+3l?(0keY_68K?^QqKPOM_`l4j9 zr`xBIwgW~sdm~2Bm(osHjTf+>dnC38<&&{scM?v)jt?3GYm^vC}^L0xw@;MEXdaQAR~#S%(n& z)%Mmlqnh#&?o zPNUZw?!FE=^9+&6*rigGUC7Ie1er{%w_U22I9IIq-n62mrH!gy$J(yyN!}OW^oSYf zT#hUpp)2}C-bNPi<7kszJVh+a7^4e5)<$9m_(Z5?B~v8dN1i&FHqKJwRA6b}*~#?z zbYoK!y!Cxedg@Agzzc22JT78kCy7`>NB+lHLZDeUxLA20A7+Uwz3W_RrHA2`xNCQ` z6P-(nk~$92g4{u(*tnhHBa4zOp_MLjWcovnuP7svIMx!kwNo1j$tcvrU0yShCclv~ zOI-gBUidx34KY$WZM;dVq07he*e`7e_e1V?8TWr7pP>KFs3Chn;9z;m#x6#KSo|M0 zBid|Nvj~x#x}IBhWh~!e-80VRwy5xU-Njp+d|1r}lGn}GYh@2@#+qSxXKEtnw|MH? zV7Djtg#9;U!|>2y|57##4-M-f8?MM0M5LrIK9sG#v6RS$;!Gln0_4slBEN-)h7ySi zc_UV=7-Ey!Fayxu3|O>gm}*#Hk5Q04Dj%`r*Aiusw~?)gkX=7 zo!H4+&*Z>C)_r~%>-&=!+fR}cZSD4qu_?1H9NQb{lBi1K2(F9H@8Hu>%{vgG z`5slaF2Lgv72x>`&iPQ}?|ZVwmGrRYorn*pqys$e0`idn>Fz;M7Akx|z&Bq~ylYvn zS6t1vN4MH$iR~lYY&;6qc%BsX6ic!aGFE*m#0mM-2DPKN2o?T`Jos2kQ8M>-wGZdU z_;iyToO4+UR5%3(-TfIFFg;OWL`QQ zJh?)3$sq8Y@!m$HPBC6`wsIT%E8fq(>IX*z^+inMyj?sK4~PHW+sRMG5=QmyP-$Pwu%Y zC%Gn4CXb4h=^|IkbW!m#srEFXek^wKuyZ3|TcFa^b-`APCHE4MbE7Vex-{z2s0;di zyk$BVc7x5eGP#BaWHuo819JOQAN%y=xUPG9-)>$Tt$`P6K1BN zmQpz-%5=vyl&*X>B`;q^$&W9g2nK>l!h)={GHs@>o~1Z2UoM>Otvjxy<>hKxcVYys zD-Wj08xW~;a${aLPZigCqqa6Ek8z?F#Bye~7q{S&i|%+br8{Awrrbl{;_n#ByAA){wx>}4!DU+X2%g{F&`Xk zElU9zCYipNN>009Q}ZwEqN zDKWDGbz$H6dh?*j^XaerVU+V-N*jDADq4>fy4yr;(QqxWs(>8>r|3m_4vN-~VrNBc zFB!$Y8IdN~2@)-9K+rdx+)>2BY92=AT2w3|*w**ILkHp};nPTwtl2hs{e#$Ftx-as zUaPcLu)lmtE!+Jx(WB=LHDI8ktq3;K+!e-2JJHxH33-m@leeY%{x_Vb(1F{dnP`rR zmvhg=GMsayTsJVOjg;>IMAtP$8SWF`WoDg`=i8Yg(G&yxZ&T*^%60-r7jjBxylo)w zUNFf&;^=-$V7V#<=m)lH?IiPQ$ISDkn3Fa#A3P#MA8SK@t_br1%TnFIV{HKgv)as8 z6b&m&9?XpIo<}ls0YR`xtAG0eHwC9)@Uc$Jp?5Q7o4+-fKl{5Ek4&`4P2R3@J_a59 z$O1@u?c5*hVF@;Zj@IL*S-_^Ni|IFKR1>WQ^2);646#vTx-RB9 zdr@J|BO`)xxj*Mp{R(&mw;&gmq{MF360_D4-};51nfPL<3~|>>lu}D3NE8-9oq!;U?r{dLx}^=+=2_KZ{Uv?^X$1_M;_ZMKsg; z{^z+#46Cb1!f3NF+HWx0zdmKOgi{ssBj_;x8)E+}oAd8#IY6D#?31++GH`i0citDY zMMN(({ie9aVvpSGxT#EUUBxl<=x6k(0X@3eqeq0x6N&8mwjE%j|7ozEcH5fADk*c<@dlL_Xf`vmRF%!(?_S7& zSA+=tL@yxPYb|cjw~IDhL@$8UMTQ}%2U1>3`7srH7Fi;>C`P7oJJ#YhW&7mJDLeRg z_0W&iZ_UEngmXL%F4Dp|4|6jsR(5sFG&&z^Nt+Tl#d8|>lLFa?NM;dmk*cCJ+;AhO zqoxtJTylHM%eJ0jWM5R_3`-Nvu(UjKhNZ!_9U5Baa^b$1I9n;=>AxMl31?*3fkGeN zP6g+5UD+!1p)a`WFA9Zr8mGWJvHxbu(S7bu{EcPA4$JJe{ZYrvveH@l8)QEhz0qM# zc5M$R$fvH9n153I^Wsdm(law7OE1n`*{$J%{-=KH-)(wzX_r|!mqEz-m_+jPfN#27 zAe^Fp9P%wip7B{gM;c=>c5)*}lBy$KDrgJO2)A4OjvM&^Z{In%`Nt|{=hJ0A(4)u* z>uVQVI;S9GE3)$8!yQgk+ayQZy`9L4**V4^N8OCT|ize=6RM9xBqosM&Klv z&fpeJ)*!-oKE3B1I=@=ly|Q=7{{0}fLpT*kG;VUj!eV`LW}#2~|C6n1PcwrA{XzZK zzs-BF;7w8c9?i>^GUx%ZX(!g~#Hu~I#g=Qu__QR5XaLPWy&%c2F z%;^F&EXb4A3EmDF7<=&eOgc|(p!4#2(ZzMEAa{%VvAAvtowqrq`({^MHyiw8oqAfj z)=2heF|VPEmsC-^v$VluG?@zAV{ktrFZPz0m+u7>?4pPj`uNpSylw2k4~Y$WEcT~) zopUFFc~EL(>TzaSV!m#Szi3o=Q7Z-So*g%do_lV+{vOeD&%d|uR-y-V+(|<=Aa7{> z@@#NMCn8tCj-`#qTRk++Clrbu{0xEizi!4`a2xi+6h^_FRw~R{v%BV7_gmM!>H4eu z>MJ<6+su2-E zwKoyngPm z#C5cES-pN(XWbXN;~&zHd4#se87fLV7jfni zn&%Rl@dC`ij(K`=G-NKauinm=R#oH@bfh`ix$_F{C_T@Au}tg*<-;}@mB%{p5>fwl zPGC7{9TFFIrqsH<4n}Bwd9w^BK*wI?mJMmA=R|CYwDBFB693}01@hFbM(Pzt>?fhT z27EN|5jN%#brPa!&XEUF5wzId61}xL5Tz6P<>n4A&n>A@6YDv{#FgAn~}n$owL4UwHJN zob1c5y-^krT14qIld*r^gp9lz`v)F~p!cU!!Cq(Lb;6}M%Pxoi2UKvsk=m>1$t!G} zqD*nWgwwm=R(0%AKtUU&op>9W&?TNm-ZKeT8=fNawb#>TB$Iv6&DkzIz6VBj`_3j( zY&&vm3u{=ud9VR85iFcuHjw($lhugDtzx5c#S`!Cvwh2TLC4xXHPB$Kt5t}#YD|FF z_k=&b$qIkEDEXC>Vhy~r8EPr}yHx%J^4%t5`93CN#R@XkJVC~qmnOb((ShWZOTt1& zlJ8IO4seZ*ne^lxJdNzSI9t=L7Lz|A3r79gdOGk_GMBK6DoXY>D5=|}$n0urz^sb0 zScs5?X8h8gx3vGQg|Bf#6Kpbt7T(4!9y62>NS~5g$ZMclXLEF`4DB$mARH9n|Fo74 z&1`()_MzTRc390?ctzr6e65A-0TX_MU*KN|k6U|)$eBg_Sv|SC(%`YB#nOrsjv{>% z@0dNQhumS20UVgG-G&98&{p7TOL*5Ushz-&NIP8zNPc_mpq?%D|4PFBw3b9)E+V@V zd0n(TC3dIeWe?Ije6{zb9Y{gO-pr6R$nNmq=8n#mublUEdHBY%cX`XrZSe zOUqOhxCZ2n7FDmL7VhY-Ub+|Y_t#WddEV^$-6XG2QXNA()Mmfnt~I00n^L>(K-WPu zM9XW6_?OPegO0T(xxC1=^fyHrqlidV@PS0WJKRVKKSmGcJ(>MtEKg*& zfWeBkX@Aseh&1veVw&4-oNTuJ zA)K7-u@2GV5oi5By{@BH2RE6aeA&h>Ewpfil1l4sR6}US9L;oFR!oZ}zu06io8(3K zInIC$`wZl+hkRzgLpF+L6m-;8a%Zb9J&*6>83n8&9yu41eNTRUyHb>(zyrej|3Em@ z++^ErY^!$ZuY{kPH)}cs-_Y>27Z)`42<79O+}PDPo2#i)>^49i ztp2(NtwiCzip-bM{PTsxRt2Y1QBkrsSnLT0eE{gGq9}>10vS2sF2F8mfNsz1C>hz! zk45b&a&m&755Z{Z|eoPLHM|B)_y#)^&`DD@MKXEWQFjxThX6KzAj#rb}}?=bpvT_!NDZ- zsbiqr)~9P*g+2{#XbVejptwKXmYKJT>r8rl?Erm}tUW&nJ+2$r(eb8D){%XDy^!iavN%@8-V|DF+Oo#_+c{Nxi)!tp3-(3@azSEK0(hy%R|17H|e< zMaM|YTX!F~X8W>U)DC^X;A3t3vdk-TJ8>?^%4Y}o#}4Hx!0IX612<>e)2 zcbE16|03#2soB{Dy4Yinv{9t)l^)b&J>3PK9{-&6{McYyWAzSly4U)NdvbYY-!rFYM6QzrlWFZ9B0Pwp(Ps z5-w%hg_Fx*@LKc7R|?VIBS?Rh{chVJ`)30ZRwZQ5UP~lBovxpST}$@V>&Iv4S2v;` zkGP5P^y)_3|GH&VvU20!BOHXhFz7!@0a_pdYKyEk+Y)`7G5Ku zqaOIYGkoKh6YmWIVLsl|#*1(wa(>zJLyDfr;@Kr?pC*?PJ2LedSR#yBmY^HqCir#i zuTcL)tVE`MszqM;q!wbiu6`Enx`dqAGEENe^^Td^Xwj$RD$%?9C(g0T4`m9cZj1UB z;?uFRJePJ|FfzMDt4t%P8787xZ-aM1Fuk(W)Cc2B`sAIoITen~%44!V3T%8awQKG{%1_S`G;QerV@HlKE6en;fIzU7vR~ z-@4ZjYqf^5y#%S%7>%-`)Q`h`@%JVfv4b>b1tS)~W`)UHunYZBv?V`~#Ut0TpV<=X zKaQ@!?xXx?igG)H*(Dja)+G`zn}tvK*(^r>6!nW}$Mq-phqzL>-z{(Mt=c?-8oSxs z#T1NIl6SU@-8@4t$oQdgPSE$%ka^0r5Ko+_rS^U}L456^c(jQVtyQG_D2rg*R=@mo zQR?b5*g>ss8t#*3S3`2Z;D#1%ZoP|9@XD!Iel59B=x?NK# zoAgRFgyc3rUb-%(5gp;<8p3ON^QFw3v#QzmQXkylFsC29gcER33HU!%?}>B9gQ+KT z#=}pgojP-?)M=}K4@YzIY-4eQIrUG{)C=cQ$@Qe*+Em~ zgwzT0{mO6)RT*l#zmvUjwYul-=(#u4h{K`kwV@N<7KvE9h0Q)HlZGy;+>IT=$@8Uv?(HHEAn?3%v% zPuA~TR}o|vu8d)!1A0&d%@(NHKki-Qr8Mi>rD5&dtZSF|E52dA01)mA28wQ{k&^@cw^(9DeZneR|RYc?Tl?vqh$7lxo=E zL0|A|in7S`S~jR^7!y7o9?I2EwC1>W;FZT~Q>%Nl4eQ1y$5nUnAUyAs;UeYdbC1zJ z>iCT(_TkXS{G@d9iI)f9EpaSQ^BUc&j7w-Q@eet~Q>*Yj`c_(a@k{;ot zq{3D*#M&!6k{-dVpl+uLuQ+rGL-oJE@q!ZX%SNKxB6$3ci2D>q*FoaROY}n18<6LI znMzp=ueA;}EOQ3>EX`cPt!*CQ_r`Ze-+F^T>a!B>(RFnL`mDw-C(l{~sptN56d^5Vdvw->d+{!Yco7J_N*{s-FAyBkpe9bEIvpCMVACsPkg2rXyCx zvi0P*^>Mycvndy4G2&7UH@P0=gLB?D;>}U}nfZe%yudzx)NL_6iI4PT33N_eo*s64 zurM*ss-ZoV!%YGHN?ODd2LGDJFs!O-Hzq5bRO=Oe=*b;#8lCFLJzua_$+@<$ITPZq z{XC)ZYR3CUycTIQ&GGQ$6D(KEaR)jxH0Jv!+F#RiO|_u@%SVSN@6+R3^=*$lXOGO;Dh(2&~3OEs`7j-*tJ+3?+)GLHN_feAKu*0%3entfVYa^BHuMpk6T z(@`p2B*jlst>*;{$R=o-O%dwez3Cuo5v*Bpo4Y@+k1J*wnv7LVV}9PT&X2jaJwIkw z#Xn*W-Th(G7IW$%Cd#NtdbC6T7Z#C;j)SkPDE(QIZHQE3SfbKb`~c6zABveqDrA$2 zPhxP7`Z+%)(*liV+n|p8_ho&B9EOo*Rckx1F=w>4uaAo@fmK53biFuw^TVJA<)s9d z2Dp?GE*Wn3=kjBI{bhaJA!IQlnatKD%Df^x>C6E)Mc<3XLntSsdKh)Ul*74I_)XYy z)P*V96f;4$gAMmvMPf)4Z#quxV{7Su!tv+>e_O5!Xt^4`&}9 z_T6bBt4Z&y{A6`5BvR+eYfM>?5tAl<@=5`s9Ay(&!?`k@uU<(JS=GF0M3=?Ce=+&} zelxjGi7)7)Zi7US5l^|allc)_Dxe=#ayNI%h5fp)>LG2H3t+_gwv5? zKM~K#YR@Covh2j0wNZ^1MG_B9I17~nijYN`*bv!dA+fC|TUpYdv@+J@!_lWPQzrR# zWw_Xi3b{Og?QX|knUJ9zmJs7H3~v|W=StzTtMGfA=PlN?Rcmqc?pRFN~`r3xE| zUca2zFbr3}Q^8C!US2|}nwsT$CnK*^WTqL{JGpA3`h5;h*pxlS2$D;v$X zc6KIYI1NkK<2}q=vy;4{I0>z<@EnFWM8P*lv}~7b24c%SmI3ZlmD0PNtFCj=y$}gq zbhw-$ zs+(B6^~pKEOA5c0yH4{_VVi2HHQvR@@)ia?KOawctSYLht2o<>1}~PWl*sqyg>%I7 z!N%tc{FX;3Gf&@7*IN9zVoeLxn4Vi__TJfPTcZJsR>qPw>j!_0>Fu)`h&9Zq>KQGG z9!1a&k9$~@@=6Vn|Gzt@W{9qhzr;ivlbmH1|7(9U8k~EpoRixA;*z@PlzxUj_vHGx zG6m>z1MVa%#%=C*-JF%%De6ME&$9TJW|5bw9agW7S^O6t2V(ygrQ9!RocpU)j`oY+ zQbB99Q63BO)WH;ao8M=$`7XiFIk5>5-TdN7q&INW-<#kGPkJv>nqPc&g;uERYYGPM z*}aK2>W;J25EI#DeZYr(;;nqfQfpTerx3NqNi}B{N?ff-RJ%(%k!2r_X}C>~g9EGUPh1 zgC=bzVgw3M0~X~Uk$P(1-j;J6^Nqiuz0XN|mucB^q;=As^K!HY{9y@Iberj)CS9Qu zwOJTVK!F-(h1v6IEegC=l3j6r4=d-&@g{;%h7CVV6+0ac7e`CKpbg}loP?2zqePn+ zqpvsS&-$vmK0!8B8liC9B6!FfwwW;ST z1^FHK-NvQA_WV^`SGSXX@tN=d)<*J2Jr;$#T%(1Pr;4DVlAYTQCMDnyBR=OAP9M8x_E zb1}hJ5jOnm74#6p*y@8h^rYb?t>%Ir>)~G+!XW0CfzqBko0Y}oEXse!bMbIf&duy} zuC79saSOMqxHyGp4QT~8sy(ee-Z93%OLQaT9@~gBv!>*O4+cD78-wmg-=1DGmvdrz7uS_jLz20p%HG2bTq4^Wx0A*T$)-)1Gkuh&8h_z0?^$F( zwAluWN8G%kB&Murh0BN0ON*Aeyj%Nm)F(SWVLz>XKWbSJe`nD&w5CZuADx7eZ4;9S$5>CLi95ay#2+ft60;8O`$r98)11pPb66oYWM_v3j6Wdp3V@ z=4tX~O1$hMNYovQThOjBDpr(DF1bW3L#nTRjeF%3rb+PZZxnmFLrF@OSB->kcrVI? zKIp!`JD;9vbWJRK@OSy4UU=V|4sU%oAqs`XqhMl@eiq*Sr}I~SgSLb&ySC005c1as zvr~2}ZtoqW*KyCj(n#7JRMI%Jua#e3j=G$zI9yM z3*tWVSfCrO@7l&@3DUezB(E6-xt&%-(2~w&f%A zU9SkfPvW_E(ZTOxn|&6@O9;G=zy&?f=J%!wDpSDNYO5(g*u1H1QoUHu_Nz@V%eGIy zmq>|`BbIvU27>N1oY~~G&meeqA)=t9^_I20cd_y| zg*crflG+3QHiFKngX1i2iaVQf?nY=XpHnNzx4L^dkHk;O55F~Ar~)RkkyvmN?4lK? z|LT*zPH3+d{xDBx1-l^;``;xO)#V5BvDJeZ)Cf2Kckh;(# zl1slx?M{Ba0CiJrbt_PJsc>E!mAriDb=Qvk8~HUoxt^6{mW3|pvt~p|$=H%rUykT= z!$p~*%&5h9zBDE`|L)T<`npIPUS&QDn4>c_ev!xwPx-y4J%{>&u4A3ac55VZjfz=O zwl488=;i+rbi#iGz3N{>_d~zk#C~_8-=7#B>$fD4i9PT6sz=_0_a)I$yAAS#c=fE@ zdLYEGKF$)F{$&Uv9fG5Ue!Y{f$zK#uFhY3mw6{Sea*`+`O>ejPwGxXT-5@225mPfl zJ!Av1@fmIq`9RRg-(bUYFsUeoM3a$+6g60?-8XTrOmEq+7qM)5a^#GUH{Ip0<(rw&z{c3w9-WvtWCd zZft3B&-3OHr?W3LZ6iFwve#47P180$qg_6Jca3<^P_AhHr8eVhMA1YFL#rv2U2m9T{nPI&>LCa#O8tg}&a(55K$0 z&oI4~KZ_@Nw}4k)q%rds@Y*oKm1Z=5f#+AitL;=i?i+k?{^6c-qAdA$G{I4(mGXJD7wQ!FJ*e+qWDw zJMzPwb>D5xKm3JoOA>ELTT-;gwVJWK?VT;riNxY1u~^9qq=4^{72j7liSWV*eBjS- z2(KoBcC?L~S?@$oR&NIXaEboXgulj=Q(rO#meA$AFW!SLfX`ng=SFztM>@Psz#i?7 zt&05c={z&&-`1H{r=JMfa5Z@bEU|mFN%vt<*Dt<*YBe<_Z=582bH*)EE+9GA6R9C7 zFP+_OF!AUYAGs9obd}?NDdO=CsSrn|-$q^t-5c=R>x>MaD__pT%fnp$^vuv|7UMg(R=C>KdS(bP(@kAhecx5b+1=c0PlhT9iq!}%?y(D^wlbtj; z1<`Y!Igr8`*k^`p5c_mIm%JyweslGGtZ19~8@pMEd0aUT)?iD^Fq3V*RU@c8{EI!k zPHntWMHl6o@-WH`cTKwrK-<+t$#atz3Xzhp-2F%RHbwVr=U{(bh93sB)WjD@&{2QX z;{NN#JoS3&SNQR)+YEb+>)gg%tP?C`E{c1!+kXRg#!uC3SHHYFBy~Ps9B=S9lFe_s zHa(55$MS@-wVI11jkC+~k5C_p4SKfyPBrDp-Vds=#ResjLThjSsog3+?$Hf$gGUA8 z{4{abM`+gd6*xowNa}39Di``&(_}>4QzKH9s@LhS#^&wb0L%W+fz6i6<#mWrA?mNc zQ8Cb~BaS-aBKvPO7b{<)jc&)9|0iAP8n9=H`|nl`aU7ADg0ORY;ccZCcxD%&_hy0K zoBEcA7=(yO&D^y5SMe^;j3`-sg(z8~UZ6?ECic}v2E3?f8k-9W@gG-bG@+NK&y;se zCYGF(?3c6jLJQvnyWT{S`uyiy-+H5acEY8KW#W2wCMomg{=hAXcdOlr~^)XiQ+ zKg7FN&U;VR)_+K9w{%%5`yb%knc<{e)V^9bd}f441ah)d#yQ~spgZDgW4y@HgqsU~ zHfs3Z#KOM%63zqI6B0{y!6#>y-s*KDoCKSA*x1LW6Ym>X9;??u_ckwG>IXB~Hjdi& zg>meu^9Xp6&_n;P(4QBr^KiB9MVtV$LE+8ty!96C^N7#ZlhF{s`9E%bk>KDps@##( z^xWRg@8*Kz3-hdB@*Cn`wvy=Sm6nIaBMKJOPOr;C2VjeArO9|X~#)WWGe5Y1$ z@r`8N$T#!y+lW0C`p1yu-}S_XHi-YA3g^w|A<1~B=%wrp%d2K?_SN1#6S~hiFIeeA zpCVXZr;)LeSEnm!SPSY3v16}X`v85N$|%g4U$)@2qM59@s%mlgGs>~1FzO#EZ)bi#Ft}T2?<6C=6|KFt3vhRo% zj}9ig_RYP15kYny2LJN?u<}|}h{3F3j*(X=yuyt#)6B71kmblXkMUmLS@*Sem0Y(Z zsX6z1+io>~w(6X)TbJMd?#I;qhsfvrgaB{`BE5_$CMVR6oBDgizMIH;(1|6HUK-U( znGj)L&=Djj9W;rQ9bYFuhL~5QqLhz-c zLSKbN3U9FJ0^!p|g@zU-Psf}aDunOhd;XjJCA8kPUBm*vE8)F+m)UxL-$!ZX%h!an znzHV@K=NDv7NJe7x+UD>&-UjIId6x|<;MIwb z0!9yn{lUxaqzC3xOp6H+@QHp`#U`Og#GV~CtU7scQrnncU`q?N$uv$5nTcV<)L1E1rkTQIJ33BqJ-mqRp9;YI5m#e z$<#Q(UT0R{HShh=u)jW!FW# zA5Ui3B3}HRC7e1uZlU-sNQiHN?+dKo#dsLuadFdOKLs6ceUZWQq;|3>J&#`s+n}Y9 z7%SOzR(y9Y;feDeFYkD>wWRUQ+a<_0Fm#^a6Jl@QFV>A>#XgpvMjt0ILtuORh}c$& zrHdK#wDN0Wlg%)p;Bt@pX}Fl?&{s5JRduqjqO{QggKxHRT}@6p*gVLCqbXfb3Z?oD zXWD$k=D3Dac5Rotv9r@%^_NcJmgU>uomTxFCoE2Zyw9JZjdO6`fk*m2_lzJJhAplY zyKRHUd4O; zdZ(90IekmvtTsXCf2o32k+ESs#HOC~o1A3DbroV?$yp}EFpAoACEf4HoQPK#KJeeG zaRr_`n+#Ah(-p~|d^|X^sLovFfzdi>`lQ#JalW}K0Ny%S^ z=j>nu*3lW`#9IE>dPqy@l487VgVfC*m!o z`Xf9sV(^<+x*$avXSmb8rj6pMf9)B%xTajVNgE#m*IeLeYjan9^ayM0Mf<*;P8@jRwCPX?hd>O9GN}#GyM+9PTcLvS=8oVW#d;IVr&;Y%gyFd@^BWe{6U(Oq zDff?zO>I2~i`Lew`jC`^;AIxr1FtTFU1F=T^<-C3F1Kb_ud*qbg^(t@=E3jYCinP~ zn;z_t2nV)VB89zknF@QSg~GlO{?ad~5F5!jyYBzA_a<;zRonmYd7g*EBp8YViq%sH z7*`B6hpd}u0%BpN;?T_y4YY7~s8-Aznxgxrj;AEZWh{_#N7-jaDoG3Or* zS*kLp;*iU=TU$eZEGrt^!D?w4%>plO@iH$rc-`+}&>S4?iX3WT*$3W@P%3waP~|=s z?AY*eQrfw+b0V$LZ%*i=w}r7YiPB1rSFiIoE0*{+q=$rxIcDng`;Xh7T3x@VcHfon zst=w&dgkYoC(2{$pRY~0qBv=7)$XK`$DYM`+AfFgxYm>@OOI%Q}Lr|-#g z=xcvf@p=?9Sk<|cd&j>heHNz=^BDR{hj#XI4nkuxjb(BUvbTjrHX56Lnpe?zb$x*g zc0bL-x7a0a9V?Hy^d;<^pIGe1OE=lBBp34qx614(*$h**@+Y>ptyX)s+Qr#*z5Uw; zL$J#bW2bg%!J#ZR|0ycW!uXGMSMaK*ETIDw9)rFe1Q=7hyy8^#lL~kFf z>4E)AO6F%g1k2ZB)n9S4c3vAhZJx6|pgrfuELPIu6$a-Z`|Z#RSFDxX=9-oA3(ijz3(3GW3} zZjA^0vW5IRACiFEmT$V8;vMeLK5-gAla-aVX-cJ2}-Ng&zqvLsJO zr8$P}?v<@7tZC{5eQ-m&_xYcC5M``>G_j z-zhxF%D;LP`@WYQ+jt-Cqr8D#c(ZEk+J(Rai_%Wj9G!39_8@k)N=={bZtSZQFKn8) zm1JVu^}qLW-`?s~jMFgDH0R!aH)P|oEz2Pr2dj2?S4$gzg6s?Zp1bq5dU+N#qKfo+ z*dJeolQXBCsHXMQC&&&Uoe5;`a_L|^SutL(-{ac7SJFba)0cwmR{ES*JbLB6y_=Wd z?T(Cti)gPit&>47%lTtPyOcGqLS7BfoZ9u?>M_I+)HExHEJN@9t*tRq->1{l@@qmZ zni{?rR+p>Ggr2cXb>mVd-w`&tI?eIJ%+xPSa-+AxmUBI~L5&kW)e-OGmY2i!887GaI7NVxMl3U-72ywNV!82d=*n-uq{~mrv?^nGS}PY*kHBtP zqq_Ugq;y~LMY6PPUVa8Xcs{dJmRGlw2}mBGFX~lzs!Q97@9NjL;)3RC-xebxyneOh z#Fp1Fe`-sdIKH1aVfnfxC+wf$rQeeK-;!QPmMwH*NnIk*Gd73Y0vNXq3+dc3n z`@!-v^4*|w0mK2xqu=Mv5Ml9gh~e8$p?ALLx4lJcYu^ogYNK{*$)~~dFn8=meA4DS zbR|w{P7YmL@+vrl*Q@H<|Gd{^KhD#7@X~+B_vT(B`(eyrp5k2>{_E16muanjgs1h? z8A=OlvVZ>lsFrC}4&Z6!lLqSs&L;f%-f%_V8@x8ab6t=gYx|aT+-G3BR_xEyx!U(K zS8Vmmb=}$!j(5HSV}k;H4m-+!xN; zp2diZ^9ObfOTR{cX)t`fyj)tJp|Ok7qS1@q+3DNwX4)sId*b$Uv(MwS(GyE%lSVZ6 zT7fe(H!t8T={({}yC?iZf5tf{8cib(m(0aU5yykrlSP`|sfI0d z2739Ntjo=)m{4BdFresAXJvuI2M+FzLGTdTrMSXXy?lvKJZG8D{f3MShz20n2%g2?c z_0&e}b@8B@;A`h`yQ99>s^*mJoq0;{fAC+HYISp3JM4K{Rqq`C?`pWVIjw9HPwT<8 zsG*yvp<9O`1vu^Pp5xSB&QnO9C2O8+WgGG=x19ocwo|r{XT3hVt{lwqDs@o2HaIBI zae3CL=c+I=of=VP|WPS1HZ_ZP=r1b*}Kt zYslD?i#PwH{kNKRMWcrn9jr5anmrC$j81_ChwP2(cJ|M~EDS5)4yG+BoO zH}&T1bNiUq^T7pZn^Pop-0nILle0dnZ%QfVU7k{YZacE`+g3; zJAZ`sOI^2u92ZCT9G4DW#c0(x0jnGo>>%$_L)K@Rgk^tHlrIyrHfQu8zip@94biTS zZ&z^CFHn1WRJ-&i(!)BxNHe@A%ZEJi*W&d#DTX|UpBGgw$+JVcj!4(Ba#4DS*QzUy z^ZlR8(GE>=?d_`BO?CZbZiY{oQn1KVp=V@IBpnv@Lh6k;U4XtwdZO_BJO}EFl}p0& zy^2pentbM?<|wbDdpMtwVZ>ne9${A(Clox#L9+u3KTqd-Vn+6KzSo1DWxyh z^ro}4r(8oSUZ}akM&4d0PgaaAztUld3G=-45X=E`cc8~qIM-b2Fr=MYQMBXc&x`Wx z(tRrz@p^dXcq$cpCtWrKeUj8Qr7r3j%O{qu&tH3C+}}6;z0-@=;>N{qjGu&l?0%TW zM7vWoCMq^#qPu;NLObK%9gZ<^{&u6s(EFO^)-)#C&aE-GY|<3+F|l(4jfwTfqVctu zyJHr7sB@s#=6Xf_T(8x()vNrVw*pm`|9Qm_^-6)A9oC-tcl6$s>UDgZ4phCPLhEjK znsTX_@9?8(>bBFSm|>?gVlq!>Otm|c735WV-p=dI&x~FhzA<`j{?Rxo1RBxyZ*=zh ztR6PD?as;`RQZM1hI%{Ji%O3jt8h>co51^u%jXXNxw7v65WD%#l#tzH)-z)^(~N1$ z(TcX}cUU>3)|`FlJC^1xb^_ee3RYSEyQu$3S@($iimvJjs{LInDmtnssQwiz9lp6m z-8Y}N_gedzo!4jI*m;%yXpg!l)fiFt4fUA6+nogu?884`lEZo~InbTd@NYjQ?qHY9 zdU&vLw3TXU2J|#$Kto#2fXW9SgOo#Q)_=}sK;B<1FULIX2Iqm#znDx`8nFjFy+QWi zNWz0Q40?7C@L&fPRqn{HaVQ@3uDF^YCA zaK%|PSG(GToO9R(%f4#m5qq`A)vg)v4yxrlc)&9kyX#fD2RhChiYllY_uyO9o>9$p zXs>0%n;E>;(nze?({(01-_|SLCVLe-!Cz};4ULAKW0;;}0?Vf~VnfM%3p53pHP95y zW+yJO9;t?CV`^Mr)nUX-&l*CZ`K&2$sdmU%8Nac2%Vj*t7Z!$&BSIs|v>Fah(@*U7nqw{~qUzwSzoi zhfI1vNcV-c1FS1+C(pwp?F~EV@@n32EgD~A_;@9a4Hd!HuW1+Z3|W4k=Hw0WD$X^0 zk*7^*u%|kYHyDCi(-CnE5$yn=od8EZ`XpPMeBSs;j^{jkMT;44D9UqCRR7Q|2XpvU zkZwOh9R>d1#es3wX z5lZ?lZjJxVC?m5}#(Nd%Q)n+W-)~B1w_B|IF2R1@O{Z6VvV=4UG%qv+Gh6WG$4Zzq z0uNP7$tzTS`q!q7PLA_~X}?!hx_)1(DH!V;AroOAcQ&l(Sg>-6FH2_!!^8#Q3rL4N zX@RG`y>SnHx6P%Y6+_kf&d}$$tJ{OBl$FJ_n`{YsPeJyMVZ0Xw2QeLuIlw(~3rX91 z&XBa-(nDVwEaFgIOu?|N3;WryvW&c8KN~u6%0GNT7|WZ^SWH^re(0cK39GHcYo9Ek z(v)PeRc>=>Am$j(OTw9c3BKB@O5aCs0!JNjUEB!!Vl)TA${oD-WnN$MJm~WFOkFY! z;oPqu?i|OyMdmMbdv$Yh~b)yuH{YRuwdT-OjpLnh)V37sVaT&l0WTsYfwYj{;PWJ8R!$$^dSG?4HG>ps=y4c>RPj%(C{z#&?ZiTlCg6dtoqS-l#O?S_sdBON^;Q;1Aiv3f2QinQ2fy1zCE9~Io_7X<;YXvTL zHNA^7KF%{7ch>TqI>9@n;Z**q8}JKq)$~~&Jn7{h_sc1Aa8S~No+EF*C~M#>^b^Ez z^>V>@7o1pj8R|7~)fLp_l2^dVD~6uhSU-cd%)vYby;!`Lg9~7jJqG=ExF$q zm%Yp8|o`gMNu;x6#?&{O|g@>6zoG$Ua7;Dq1p! z$&j!(H$KO3B;SO5WEp?Re+0YiJ#mujoZ!UjW8h=)O{L0QK3x3^=X}Ltr!(nc?@ewS zbuMMZ?2_5eFPwXR#I%xW&T*A524nSL^-C7?M9xVcAI5w06(MRpjpx{L#@`Po z;_KwcX$&gL##+Wf$m^&-mD2qXl{6P$GbZQb{5iMaTi|3@b0mLXcDoRf{(ZlqUwQSw z?m%GaHuVh)0m|*=&LFC=>HmJ%5^0*>QJsDw79QJgXionXhg-(bOMybd&ud z|LS)5+g){~xfa=XQ!SJM8T~S^RE$%9R{wJLa~fs1PMz#D^1iNifKIR?)+A8J2EUuc(z4>Tc@vVc+c=lKpz47#Jr-$$r zTaIaMj63@^jd3gI%Q5a)Y4aE-N74trA)1J}l4j+5%`{kLD8+bP-S{c~AGr4iKB|xf zAS%ZYp_%1-`4MC167WnFolI!L;&hu~FZWmkz5iXXbg0Pl5cfx^HeL?oiN}YFfBhQU6TN&m1QNDKU^a!`0F0H52x19Tf&Fe@r46p8WN>%Ao;BCbS>V@u*1L)fm z0N+)Xi+I=S`3jMDxmN%vmHfS_!g?9)Oy8KP!Vl4vhAOk$2&YpSAy*o_(yoYg461uc zjuoS$<3q`x2~xVgKZ@s)bK|(e6|;7es$>=CVOnV^zRi-#6bS+23}Ji>!6> z-M^UIVjRwd?FgJGfIWJ5=PNf#a&t$(>nkKA`i8!B*Vr47JpSsmm*)|r@;tWRs0!G> zw<;{|e$s6u9GnFo1A1@+$e($Zj;9K2X z-B+K&fj-_>UkxE_n5YBMCG~#bIy|J=6aHZveD#C=Tl6WE_Ns7KFWIIL1ul&8H*6WB zD&v9DB>a$-c zxl6=Fi1t4r+MkE2LBvI<8bw@$s!7B}sM?9R2vt?YMX1_~xCm7T5f`EADB>biokU!O zsK8dE8-$l?-FqlD(WTC{wzfM^SB7n{yZ*1v_FrF5be+7 zB1HT1xCqhyJT5}CKaYzL?a$*PMEmo&2+{sLE<&_FkBboP&*LIQ`}4R6(f&LxLbN}R zi;%t@%{x!&G>u>GWk2O1tamkTf(5d^Kde#IT-*Jh{M^ep*k~mSmB+q=E!t;_6|3Lm z01Xn#W#7q@`@R6HX6MO%TjK#{XaDKydf?p%-}f0mgL`UMU}XpYgjXko|%qkj$OdczG0Vr%fvGmH&q3${Fkfu$01tXnxRDXFsNSs z1@>BoUiK|7b)*RySZi{Q9S^v z#^aiUI`Fb@v7mYwIc{0$>iu?zc4JL{qVfjS%45*Y_rL7BP*9!v2-faaxO%?<4<~CL zBC7j9HTWmZpgwfjH%(CO236xSS8tsAxVokfQIXfuV@I*N6>!-%Nl;Dy9Q-PD^iuen zR=>uNsK|HfmVaaCtlwqdKtbh?a=rYjtM~j6?fRM?L`5D~Bfiy)YLCml0fMUCM|6jL zux{Cp=Y1~wn#G+9>$Oa~9#z$^L)uwKR(L-}dh=Yp(cdnv=}u40ru4o6|L;eOi+&Lf zs(bTXy&H)CW}V1Uxe-BYj1l7u&;Qu|~hM;;IR1sOO z-aiokyAf45s0MEb|GR-3f+`nOjjyopS>KLsqdVm{(syE8DGR@U{FY(`l zsKP+?avAvF3EU7=KYd&k_~1=f@7=`z4n!3Ss(Zfx|2u#)f@&+M_TO;z-cI~)PgFsm z+VUy**Z#7vo1lvSpeiu&x~unA;=dbF4FOfe$Kbyk=E;KUX;9r&irYF|8_((2{gyv?Y$knSV1LQ&qy@!RGxpSpeYqJ@f)o^ffuxg}WX z_LYmU10-iWR@)ON%(mauk!0Ow^VB(0jZLStB{h2SMYdBEz90FCqns!D!_rPexEj=9 zyj$YHX^U5q4U_`t^&Wfex6hYk{WgWEA(X=JKTj6#$U7pLum<-vW~&u6d3JnZGS zpm7bT`oQUw&(ex1p*LE$?nu_+*4z0FskpSfJ}c^_Eqij(hfUn{?8L1Ve5Pn$KcbrZ z_DX{XWT@LSHD@QgtRPs}vCH@vK6nP@!UyQRtM0z=SrpmkgS`wpzr1m{`Yfs>k1(IX ze&5KfRk5!uS+9m0+@I+Rj}$>e+$Z9sboTlz?;)7uE&8p@AZNf`w!gYvQ$JE%8oUBj zJKob||E8TP)L#oa!*bpsSYqP+qbJv}X>Fa1BeII@>=m-)li`zVG!4i#!2YHBNcQ)E z+@I({gBmpGwTAFlmfT7UPU8>d<#Up}hV;sDfqjzWTgQfP|8-8(`qOVKE9UO~C1Z1@ zp`d1#vi-Day`8aOrd2sowR|j{O4FuYb5vur+8vHvzBX;PQ`|JI{Vqo>>!eax?^SAN z$4}1K?=75AdQx2PFFn(*V(GrmU+?UL({lDZ?sYH3S*!7f4Skl_RbZ8L>9w2db7B=u zxoW>Y=WRvHsf8cvmk)QjFfVCN97di)?anTr+!^PAV5z9K+r_HtFLGtQRJ3!q>2K7e z!oL%@>9FRj%_oJOhp#rDv20qln7)jW-)`NqY;iEgg~so~k9^y74u|{#+v*cIuh)bZ zKE813608#zWLNgi3hDAyw-YZlcAlvyUIQEgmRGW?K6G_e+J->QaFS~D@}cSb3!m?% zy}Fa^5k9|?R zxKP?SAPv!oGo#Bp}ueupjTPUk7QKY@L+@C4LYld&$-pnd0L6!(E|od2e<6lQ#$ zX69V~Vp?YhiFWxne20-=cg@L3Sst}qOaB_9_vH#tcsU!8r(C_EIXEeWQCT4;I(Mr` z-9#ZP^`kZB*|5b=rv{{c9ea3LnWBdw&y3CwpnOj2hR{CtjDfj|X`quKJ=74yPjh+S ztp?BEld;KBS+_G|fTMEtKUw>{0-$+3lw;D|ccQm*K6Lqo_)wJFSy6+|)-8{IW9Rb7 zZ?{yKcGh><>ecgMgK;4%4GfULUlPMW58?J@=bz?zl@=aFk8Zz&fg{KR@8X|O5qW^tgWv<%WtcRg$ zKDU=f(7&sye_huy4deoy7rrO``q_A>zI!Y4w0&U>v%a@tYEjP2nKb^J1~~Nca+4lF zmtG)CFN<+^d^o@B+q3yD-J6el1N!oNQ~jFn$-2RBJ$t*}-b*xIy=x%#?OWMgLIeBq zDrAfFX4S%%PxsymJMuRneRjBJXLAk%>y)Dv%a#;&uMqV_zI7!%#yoP z5S1b{eEThO_W7b};k`$iYU%N(Y8koO*s_+$vkT8t6?yL6MEd~ABAc|3Ko%25)~C6B zn8)jGzX`qq=JuaEDEBeE--FLU8uVzGh_94mzs}GMyKt)2>wjim9tT(Y_LOXD26v=Q!xdJLM|SYb)*(oJ`*?D439Iau3fn7KG!AJRX(;COR43 zQtWPcxqn}G-*Bvb)_Ex%Zg?41)xBldQ0Ha5Qumgz`wcZXcUb>IP1#9ld(^lUb;N1} zPC|Hgny26t1y143Gr2$KVsald&sZ=4D=6XfaDE2M+Y7vu!$^OZ!OIYzqp`u~5TYSWEFlZM>9ib?sP9-cq{X@M?FZP7Ur~SkYnU6_&<@993U> zPn5Puloq8^P`Y-zl=+)DpM6$vK5y9%KD#W2N2`i4>ba%RF@}C#lKJtb-DB5nqU-Hr zbH(?-FDD}et8hUo`~?j#WCZ(S^(Bj)IN8lk&(dizvawWPpJY^nw7P5XL!1K-gG=CH zaFb#R;(lbwP5}9i#j^_8u-FZ&6`!vF{nd@I)JPI%M#xS)bqG(@V9ob5^UlYfLi%*B zh5Xj;MLzvruQ;=_-W22jf2f_2R|uXO4-c#Z-~-v$XnK4myc)uf5z5H+PmzBk_?8XN zr*m@mNA;x>kw}Sr#1?gef93h%`F~wOD`%5 z-h|-O3x13|yP!W}-K($VER|I0YdHeAt{5J`9OL_7F|I4y$}hyB~Mi?jV_n(*jS!H`>F~?d$n^KbQ2#e``hvwMa)p zNoL0IerO+W?(-C@W7HzVG2->^e0YXg>;P-4s~5wThH+z_XPayzd1AQdbL7_pmJYCz znTZw6MK~M10V|rT*or22WH>S(Rzpy?pXR@UQ-4_RUffr;z#qatJ}wBKi#0jy$H1Bs zecwD6=dqn?o}K4n4{ICj@4)#+?9(`!8uB=nVCnuk%F z=S-Hji;f~blPo!p7nYp8d{A5XKg`$xFN`}LLJPqQ<7>3?M%Ia%y>Q|y&ON)s11?|T zbg)_7lzUC!CDqtcE;df1b0!%f+tD9?z|IL+A0FP(XnG1>VIM!GWQ^>GKI;vC$5_F{ z30Uesyoc{(HZ#_rK8+Kh8R(mbZ~~P47jvInAFu42^LC&%%-*rrob_s@qE*43(d&>q zVTDn%d||ImU2FeH&LO2J%U&sJi~T5xJMBy%LC7;)F+GLd6T&kwoi?R@-*@V1mj0(% zKMbKfK4<-3tK4LiU(xj{EF{}+H@Gh7s~%RW%AZ@-`~{s3Ie}z_ma@}_x&3pCUJJ$! zkzkA|kmIVt&YIu>)U*rziu`VFhu_Vw(7$%U_vVgOXkoN2#spfiBt8&N$Zp79_>9Ke zi{8QBdGwD*;Fp#9h-a5j3uk26n#oFziU-TrIOgg0r;l$7u5+poV|~G7clQ?R4>KmZ z#AoSG^GoKA&QABndSu$M?C7nZw!s`TOxx4O<@QFRql=5OA68Z`zPQY*^b_R+A8vhN z@F~B!=?}mzPp6EH&Pq{E8NC3e+k41E3JbrCi@f{u48Vv+0e6Ot|6?#Q$0tc9M2VPv7Ob1P6Yifgd_RO4|BlT2VIK9=pXR;Np}m^Euw>D9i?V`g1sTu5<5t*p z_rvhw5T47d8__q-eMzoqsE7MOCqqH!T=-Be80RELCs3L|X=?tKIT+wk_21|lhnRh^79X1O1PY&tI22-~$dmHUbZrA_186i4>_5hoLkN+(nrlkkR^XapQ; zUvT|8PT|61>g?-xz3Ftn6Q$I5>Hv%*zJ|i`tE|sKw^L+DdZY%j+|joeQttkDUpO7uXN0BiS8VxwL!#jU6v_ zez|lac354J{UGe<->%F@i7qbVB|1TL)%U*c>ENt9a6#@iD#CZH_0yn`ZxpZ6xrUFn zn7oIPZ?djevBH&E_g%Kgw>n~VyR)W8GwXW8w%J_6tMKMkp>!wHz}%F(PxockMyZ>~NUmrV!H3_hT& zz84nWh+|<_n>hx_5F-F_jkv=1XwloyBxAjK16s&~SfG2R)CZg~U&J@8{k)x%ETZTTa%<_tD9> zw0pC)iK;VN`tGasI4^f&9LFc!d&=OA`S0CV9n~kupVc^&5^b5ZvLdx##jJnb%-GXX zW`}=aHrA~_cTQPTbdccisax%gOr_t$?sr|FwC%qP;@~Houa7p6P7!UF*7Rx1IH{o#sl}sET0q=Iu!Y zdlo-p?>&URgy}fPn19kXH7@h)sV1o>yWUpwPhQAPPhywx2<$R`B3dzprJ}b`+f^ks zX5e&Fuzl%7fRLL= z2B8_Fl%4pDaYQy*PV@5Vj&FF?9IVfEGTF>gNRna_GGqi;%fNT+>3qm54mrk0=1w&{ z(&jG)gReI7dC&DZ7K3)>im?czH^~y~&*cG1NZvt@c)`GX!s=z(iHTkIG1Xyb1ZoYJA3)q)uso*K4h(TXqRH>+G-Q%-A;-qh5z<0-i`3$5`*6%E%aQzv%ZG;yNJba(Ph0A^6- zTWb7rEo6%*E&o0052js^A)!^s*p5E6E5&H~3Nj=lJEmQ*ok?NF!Ddnmn5|Is7dfN) zX#viF!E>F#7hf^V)0nlh@|Ww-T8fG0XVmMqBNsN8Imx8d4CH`52VH`gr(wRf8+D=? z8qMBGexcmRvZG#_Y+b(lv5dc=()&7>U}znS_B?))Nq!8!$Q_znmG=ILj&z2v{t<_z zigxa_kt}7?SIuWJMyU5}ZMfcge1_%S7V-)0E~Ig~e;&@a-0+(VFQ%D;kk7H~2exPU zW!}&V{Z#P$z!!^}Jp=B`dIqg<*U`JFBsa9v<4xlr3nTy4h88Ebr5`(!cP9J~;#+ZJ zFIH!+xA4eWmGzX3?y(go>k_zT)xb2Xc$(>UNwZ6mFt(-6k~_LMscM1yZZ8IOqWHq0EA9()$-a%^WtQWD(wQJ8i~dr5h{l;+yHi zq+Budc`0?gmnqkgm|vB1YmCeb3$6Wi#yU^Vn)hjK_|^S|8fo*FKXLa8?xp3lVZ8(P zCfWKl!z#k9)0q0N-%G=wOM|T!J5)PBlWwVj{b#H#)7mpi1HW6VY30~ye+O0?k0+L{ zlva#3F5&6$eZ14RN{K1^ytK9Gm+Kgr6;qITt?}%;8Y@IRknxppeA$zhg$bIYuuk7-*Tsee~p#Wd_7^?8Nb`yRAoippQEH|Cg&-PnO z>1j7M7)||PMSi}|VzSJ+cu4T@|ayd%IbF-_E*WZ@2j0rwH3U3HytE>ZN@ZvXlMX z$tmS&j_+k^yH(ibe|iV`D2F8dtGd;zbRBkQH=hIK65E^8jBzBjb^e|^&DX6b{fvF@HX!B>h{YLcoHbc z32D>qGQZk+Pq!NA@5;k}*OS0(v0Gfu&=rpXp?4`XM^6tfP@THN-x%i$eHK^estnD`G;Ec~3f=FJp#ki}J zw-QeBhik*Rl+R}_?oL^a%v;2Otj40n9hrvu1BZEENu0Zbo6}Z@!mo0JNH%S}9DX)q zQ)VNThkUh}9qC&K&Cn2SuY(JF26sPj@G1^r9?yt2D8%OZs(!6MkDUZg_T1|A!KFbX zT#Ij=Qq|D@ME*vQA79Md=YE*CG4qqT1xq_(?Yo(i?lsr%YAO*p z>+VckB(CsMy?jjTiWBhz=H7~vWe)9G8E}_4Ii7P8FFwu?gA z5lUx3Q#!UKId(AgR4eJgH=y=P8@sGfl-^k2ywIr4eZ)bgY@5c)?;bu*X?)PsE9mq? z!y{RC6-(OG%O~`_9=zXhR^H>h{_QwIqll!T9LF1Gv-UW$MY;34!+|>-xWj=v9Js@Q zI~=&ffjb-xWj=v9QZ%Z0e^pgmgkJ#y?WDy^HWLD31fzan!T;g6gQjA5%?ka z&5!UA{4Tq6Hk%(r)covkC>cH?;zguoewNaTc+uJXBL3(fB|#`ki!NU@_n>RK^MLt9 z1kI#oUrHUB;6J;3mMEWP={`zNFjC40fAlmZ`yfRS#g8yD)d&=q9*=nNMRPBrqR5N% zDE@Oi`_HbCu=wGA^EIl$m;^p~TL+mf$`lamvZ&E8QD za7sp(WNDR#?x(~}`ThHr_~_(TDX7(Wd7`z*xVYP(i%N`-v?Q2gED4cumKUOLS#&Db zsIXCHEioa+GBq{%)>J&-q`1hGn8f6Gp5pHpV3edC85tifnasjLtP3{X4~~vZLAKT= z8r}WjLq?A^Kc1MHkRm8>Kh;@jdOmbisCiiQ42vdn(LFzwG1Z2G?wbS6-f^kJU$9B% z@x%mcVqA1{TDo+Gj|pqOM@7-yA00g?653VuJ>k{mxX5^NtD zX_YnL6&+*_nB^TeOLW90x-ry}wm+m3Wqx9)pc@TFp~hx<)yG9ATP=wRf|%%fc}EF4 zj#QK&(T&Yhqf=5W2~*8sp<{-aCp;N6k`oT4O0hNw9cG&=t3TSI`Tj88+nR`Y{hIHO zO18|fEt38|V*q6?e){`#D`-|qbOO~0-9>+&daKqu^`K-ku(}vQ<77)6zXrh%q_^2c#9Q- z(9{H!FD@}M>Nhkt_pK>ZSzRK0%+n!}e`*59QL?B%%8`PRIW>uROF!a^tQ+2Y{jlBQ ze!Lc$YK{IYUb}$a{o`ht<5Olt#x+Gb3vJV5_xm&vfS$O}6lV{#ppQ<{n(mt8ttlA! ztW5}>zLm9xq9jM&s{BpFW^dhtDdM@QBDAuvzM@zIcsh|H9x3B}1-_36`-$)&5e^Vx ze;!%|y;aa#1-(_!TLryU(myPo8z{owya3kTyZ|YpJSn0)DI)z8k$#FuKSiXUBGR?x zr=ACt)8V~08wp1430h(l4W`~vB00qp9UmDJHC>CF z@_b6tjD*-}iODl(&3*wEBKXfXoyW(FHhX)`VmA^F-fUd>1BawTHyfV^L;;=yOaP1q zJP8N}1Of&D9s=|NtUY|Q@lC*Tz-xeofIL7Z;2(flfMh@%AOd@|20KWpx08RjY1RMk$0PF#51AGD4 z4EPZ64q!E)7_bbm2(SP!2k;8uMZiY%!%{#AU=`qXKq26tfO&vyKpNl$Knfrh&;!ri z59kKy1aJd51MC1dalaOD32+`z2`C2~1$+*Isn=N905i^J=*^opc-%va1!t{;4t7jz&C&$fHJ@* zfDM560BZqn0+s__11tpO0k)wZegW7F_z>_8U^So^une#WumCUz@CslCpg*1q0QdpA z1MUHM0NMjw0QLX{PzTy8fL{S;04D%H0uBNW0QLavj^KSmy=noM0OtXffO5c5!1sWC zfL(wu0iOXfk#+#y)93IW`628MxCh_?Xb*4!*aH+m9cZoqeg&KXoB;d?I0!fZ*aO%G z_yVvQ@FCzGz-mA-U>RT$U;$tb;1$4&0Q#m!K(xizoPCcqYjQ+#bYxUSLTWrAC_WSO ziD-f7f%!$;1B!Cs1m4@@t;3E#xUYZK@fP&9I6vL}Rk}E(_nHlE4z8*EBzHhAPD->| zEmJVjU{k&LNb5AS#cCcI{^XNfEd3q2*hnj+Zb-@&lIoLF*mOzKCr3|Zv$dwgM1Hmp zaT@a!On^zgh2Wi-92K4XS4_{$F>#SonWQTx!s7X;L}(27{AdPL7IG5JlcFLEI#O%I zS+o@Ml<1V1(a{NJS)d+&l-&bn%)HEhOxBV=k`W2fvydmIcq9cv(4R_ExTxsnDZMD) zE$AY}+>^6Hi%jrMF-Ome)>2cVkr$sODvBR99)9R*?AJqF%#J2$RZ$WWS)lM)Ic9XW zdKjKLD|yrX<_WGD9fD74kwnvd>KIZ|;Ins>H?nM^8%Z@6^Jk)yvnjzR9bNL& z-k3T6Azc{pj?;;Jo6;H0dYE@WpD3Dw+ot3%v!=3oYhmn3Z!J`WqeX~KWcYb&6IdAL zPwnKaj1ghD4Eg+B)WW8|V`f`NM_Z$rc8YQr`c=9dnP^TG`6VO2-;ON{b#3$Yff~p^09oL{S{{bPNF0@A*K2e%DI97!RPz zir{%DG!NsKtPWPp;#qsx;*o3w-j0a)=y+aFP}tm;dQSEnl`B+?N>WwJ%7X4GMwyt@ z1U4OKLkp$DbPN$f$ADD&T*SNz@GKw+kPUDK+ykh;gm2Jge3t-^0!9H|1e5|&aIX^K zxhwdVU&Xf_&;zgy@xy>K*MP6V_Y5!skOUY6+!p|EYgp*8peKVur~LYk_l3cZ%dMzLB`G|Dj2!W9^#YofT-swKuG#lwa)|5=&(10%AC2aO&* z$Q;ad>reoZt_eNqZ{Desn)@ZA85>KwA>2a|Q9L=|k}@UQhMw9p)*6r2Oisb~n=84H zR|`CJe5vu#xD6s%F5BnCeRM2~HCB|{_P#aMid7Xh$EW5J#m9RPscED>6cc%KOfp6R zKC*~xlo39Sjcoy$fY$&N|0lo*NCsGE;}wXHNKAqzAsR2BRWK^qV%28!)Z(D$Vww}H zCB`x%x*5UmM=}C`D5RhQy@DAw4>X(^VTbk8>5nACm`1^8{)RMvwF@-vN9wk3U zda^+=CMpF33C87!DCnJ|li3)CBoonK{?^1)44^CnOF~jAwS6R1mouXMnNrk0-l|~D zM2F$!nVMut^hd(7%dmJ-;>_se#2D(_qW&qMU<#sJ=#BhmMx{^^(UdRbM}I9b3Et-T zFVzZ(!Jn|40!rTG*|?U9A|BTgWPinbpOTyy*F+)XkjGepDX|b%d$P3rt&#Cbaj5pt zkjBP`0M7uDMMyYXpnH_SgOKYWnDIdb@gzPxD(HZzvwF%H>X8_azCvCg#cVmJNwVhyWB$HnogQuoiKMptf-miA0=_OT2UXqjRI@v$}|K z`isxGX#b>m7_wqN&TqD8;h&P|A0L|(uhF6&mZ)00&xpn2BE96unf|v8pZ z4;$7k60BH@gjB>nB#F}^*}IkqA1URyJYk(1ieKPEYPdMXsU;tkcX z%rMOcsih_-b)Qq%a$zDty+7(ZB?#!%Zh`)-MX2|QYk zJ_D%30_=rQ}OS7B{i6F`x75Q*L|GrGtV&g08Uqr_@3vdZa5RD28eVpBI z%74H^EMeRD@0BM$G6k}Hb9tiTruO7%^9t~EB4SdJZUmEr`4^AVLC@TmyaA3g{%Zw4R zF&Gk}BWBEqkBo@4TB1ZYOxl&xr-($z9my7SU-Z?~xM-0OFA)1qP;pRFOll&NFcQiP zS)u5Q(uCm8&}ho9EJ>DI7icOKXhu8=M2u@LuT_*+7B@l&N9;4o7;8;Qoucp_5s`wN z+0-v0g+5j`Xseb?9Z}#}`T6D;SyaxfR#_m*56N6tKwiGzsTHHA^5J8i6s@I1M@7(@ zG~?ARc=!j6reI>8!k{3S*Am6^CVY#Y z)r>~-$;UY|F4CI9rYe>w1T!E4MhH#|hGDTkDv@Vz+cEgl5fSVyv1Lm{EWYc!el6Qa z$M)uafg1CACMAm*Q3Up-#EblsS^MDq@&^2cUO@cr1~{=R{;vmu&VaiF&I4gLaV>*3 zxUd(It_WQLT|~Ss!g~NN055Ox+jnlu3jTWJ#UoLXZ})w3-Ru=FZgu=*Y{Jkl$BzH#k?~p9{ozLr-t4!+ zaIyUhTjJ_^ejjMP_*~?F?yt#z#R@WaUiYf3KxL_UKU8c8piR2B3X=n1|BqpB$Lrk z%5*%|{67kp1p1%Ex0bHV2iv zhJQpKHfA^@k>MZF%lkAxxt(8l*eFIO!#{dv?3mGGh(?BgL?1eeYdB^2NA!=63?5B1 zGW;X@ps-Lj#>nuG=y9J-+Zr1i<@D_~9=StuhXZ#w@OvB(>(>!{mHGE5`8~d#ecR+h zuYCLTY~B0z$rUR1z&=<4zEG<_0|F=@Ubvj&k+q}MWYpOfg|0xHsugRb7Dfpizbm#g16%O$A zO|e<#eICqPkUVo|rw8!huJn(1f^=XTBYT6&Azja%2S>NC8*txC8|7#+T zg@!bGSn4Zq$>Kfq_{nw*Z>R9zglzsCwtupHK*c#cu8RAP89d&kKUu}&Y_kApMv4q+ z-Hd*;hC@HOro&^3BK0tiYx(nX{xydddhnBz4f*_yMqVD=Vx-qa+_SZg#!~t3|E0ab z%k|%}U79WZ4n*2Pi&waax04h^_nTP$b6T#OdrYca_abC7WiGSwahmZc*?irFFfCD#OW6cp!!bG<@-;8chseS zK;Ub2_~U{PWjg-&VO(%Sz6(F&`QmZ*yN>@!IV@ zt0J9J9Un-$L-eC`_=SRR19klL7wPQM;qMmsg}Q#VPvAG}(xcED>!hHcwXS8m9|b+}GoUBO^WDFS zQY*?WJ|jxow)}p;tGwJ2e~-Wq)Zx?GbNWCXUdD&Ff=|-npZDkK%+le5dvSc44&O`A zm+SDgB3`Y-uRX~5D(}mBb$XbmuZVF(;wuMmyrT{uC+OXD_~!?5dJi3bp}-H+;p+uH zP=`Mu@WXZZK_cH#I{ff=c)k;K_#OY@_{lo_EP;>J;j_szhEKPT|= zIoThEi*e3Fgc85%QJ#*xFY%)+ygX$(`pMDeA;Cr-!4`>BHuoZk@EBN89;77HBpU?_^ax3`Q zR`5x!;AgdhPiqA~rxpCdR`7+b;EQ$mK`VLxT&u&&b}wxOzqu8BnGQckj!QcH0TGv> z>~GZqe^^KV&k|nFavgr?gM2)c&&hNS&*u1A9lhHN9IptuQ_`Oi^o}~bq<7QdYXyCP z4nMGxkGE2;mFXu5x>rY`b4{cp?@RhXkEYdOS=w}JMDNld64nIiXlXUnG1%8$e|D(Vc>+mmpz|&u=!U zf2{K=1azLFo3KZ+>-;a2EndXj#^-#LHea}pmb z@RENLA0X22Awr37znPau-j{eeE=hh%{ABU`1YJ5QA{}{O($D%kFK4liewmt{O(f$(O{$pNW4;|ht@Up*1`anT9P)FZO(98Rh-tk4A z?_?eQED?{@;WvwTk`7-h;_^9}exbmp>F9s_k=JXE4!=*}<#RHfv=@0fH|yvRi+Gt1 z@Anf=f0qtFs*>a7b29z4FY@$jb@U!W-=m07(x3R5r{k!@mkPXmPSS4{>G#ml?-KZd zI()gn2kP*ziS%db@L!%3{M6yA@3u>W>PL}!D_NdGK_^3r-z@OOx^%|=!qZ=?!|!@R zw2KZe<+?H*e&9=-ewPj}<+=kpyre&@!<$7qwK}{a^aC=K_3{vSM-fVV@C9BkHy!?= zUpZbrC+TBFz5{jiG9K6pUg|AmI)#F6f{xzD%=we1!#^bO@;RAKZ5pRvtD|>J7ww|M zdkFk49X>$d9fcl6rawaD>!!me+{e@Jp~LSI@c+oX*ez*>Qt~XC- zlny^m;AiRZ9|myxG#$Q7;5X~=kM-sBWjg#wfv?r!1I7ERyuqK7_01G`M;%_q-CDs* zeY8x+Ea+q?@c{zgLzm7gBY8RGeMw*Y3da||*|MCmLf=%Z!%KN?tq#9S%ri@Mc)3os zS%;VFHf1`zT({Y!!^?Gs13J81&pE8aOMaE>@N!%`qr=Pfw`v_;t_#)b@KWEeyw#F# za{b3qhnMR=ZaTbNukg^}<$8r#hnMSnJ#=`f&kfMwrs<+c)6|>tHaChXp#;u*NbN9@N(TIO^26yhdDaDT>o6C!^`#0LLFYN zcNOdK1I4<|S{;6l&?lDa@N)fXvkouUk;-& X-Patchwork-Id: 13162427 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 80233C61DA4 for ; Mon, 6 Mar 2023 22:05:49 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwj-0006jn-Ih; Mon, 06 Mar 2023 17:04:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwh-0006fr-FD for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:39 -0500 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwf-0006rH-BM for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:39 -0500 Received: by mail-pf1-x42e.google.com with SMTP id a7so6827327pfx.10 for ; Mon, 06 Mar 2023 14:04:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140276; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=Sw4cUZN+iUxpTBrMk/Qaqbs1F9cTtZOV/pb+ekV3IzM=; b=qSxz0nkjuOc455gdmKO0qRwkaZ3N2g4vvPYV8Sd6a7bDiHYKIyM9MvJ3cDvFBQDO1W sAz7Khc2tTDkRzdi/L/eV7xjwCGmazbco9S53SW65VemZmaBpX3FSp0Cax+/kWuN++bY kgnDR3YeJ/i4Bmauq0bx/yc9EHjQH9koadui0Hk/S1DYfMC7PUbizAPSStMWt4YIY3Kt eVN48EAGETTqqx/euf15Nv0x+VuHd6VRIL1F7265kWBwcTSNK4s1P5rUU+jgFksnojru HKfuQH+xT9heM30pVA1Zy9C4edvdVcFwYCRSh/FgueIuQvNmUJGRvXhKNU+cj11qa50I Pldg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140276; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Sw4cUZN+iUxpTBrMk/Qaqbs1F9cTtZOV/pb+ekV3IzM=; b=WfSp7ywOuMXCJx65bJYDAqTiGth88qqrikkHCbf/VgDU//qFzN89IJhe86v5kQTpOb 0uhqqAPhMENIlL3ZCARVVC1oU6KuFJreiYwsMzhAw8JTk99x49WmsxPzFPzemu9Y3J/d NcD5CJ8BLPk5e5HMpq64kFuM8G4I1e5558AloRRBzRn61ZGMpoGzJNhgnTXX3SWyEMKU sC/XYrksq8iCkMIfhJWvF4EIVU5E11hUGvEkabg1HLmgQpoMnDOsoq7t7CrbBIWsbdup D2AJoLiEuzPXAv6JqWjZ10N1HtDj8DawWKjC6uXiIXeA1jzQltWQ82i8qJlptiPEpEta Yt+g== X-Gm-Message-State: AO0yUKWpc/ROGLfwJuesI816YiM71OeyyP6NP8fN8/JV4WcoMnSC3FFS ejFk+QQ8z6BuL+RYsjaFUfLO1w== X-Google-Smtp-Source: AK7set/pMtvob2aZ+iNQ8Va8andmCM/eNspCN6DL1C1uwp19BBXQ/T+89qhVTeQbskreQIOhGKHfTQ== X-Received: by 2002:a62:1ad4:0:b0:5cf:4755:66d9 with SMTP id a203-20020a621ad4000000b005cf475566d9mr8515431pfa.24.1678140275846; Mon, 06 Mar 2023 14:04:35 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id m19-20020aa79013000000b005d62cd8a3c9sm6694028pfo.71.2023.03.06.14.04.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:35 -0800 (PST) Subject: [PULL 10/22] riscv: Pass Object to register_cpu_props instead of DeviceState Date: Mon, 6 Mar 2023 14:02:47 -0800 Message-Id: <20230306220259.7748-11-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Alexandre Ghiti , Alistair Francis , Frank Chang , Andrew Jones , Bin Meng , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::42e; envelope-from=palmer@rivosinc.com; helo=mail-pf1-x42e.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Alexandre Ghiti One can extract the DeviceState pointer from the Object pointer, so pass the Object for future commits to access other fields of Object. No functional changes intended. Signed-off-by: Alexandre Ghiti Reviewed-by: Alistair Francis Reviewed-by: Frank Chang Reviewed-by: Andrew Jones Reviewed-by: Bin Meng Message-ID: <20230303131252.892893-2-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 0ad8f94a42..1c4d8aaa74 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -220,7 +220,7 @@ static const char * const riscv_intr_names[] = { "reserved" }; -static void register_cpu_props(DeviceState *dev); +static void register_cpu_props(Object *obj); const char *riscv_cpu_get_trap_name(target_ulong cause, bool async) { @@ -258,7 +258,7 @@ static void riscv_any_cpu_init(Object *obj) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); #endif set_priv_version(env, PRIV_VERSION_1_12_0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); } #if defined(TARGET_RISCV64) @@ -267,7 +267,7 @@ static void rv64_base_cpu_init(Object *obj) CPURISCVState *env = &RISCV_CPU(obj)->env; /* We set this in the realise function */ set_misa(env, MXL_RV64, 0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); } @@ -276,7 +276,7 @@ static void rv64_sifive_u_cpu_init(Object *obj) { CPURISCVState *env = &RISCV_CPU(obj)->env; set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); } @@ -286,7 +286,7 @@ static void rv64_sifive_e_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; } @@ -331,7 +331,7 @@ static void rv128_base_cpu_init(Object *obj) CPURISCVState *env = &RISCV_CPU(obj)->env; /* We set this in the realise function */ set_misa(env, MXL_RV128, 0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); } @@ -341,7 +341,7 @@ static void rv32_base_cpu_init(Object *obj) CPURISCVState *env = &RISCV_CPU(obj)->env; /* We set this in the realise function */ set_misa(env, MXL_RV32, 0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); } @@ -350,7 +350,7 @@ static void rv32_sifive_u_cpu_init(Object *obj) { CPURISCVState *env = &RISCV_CPU(obj)->env; set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); } @@ -360,7 +360,7 @@ static void rv32_sifive_e_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; } @@ -371,7 +371,7 @@ static void rv32_ibex_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_11_0); cpu->cfg.mmu = false; cpu->cfg.epmp = true; @@ -383,7 +383,7 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; } @@ -398,7 +398,7 @@ static void riscv_host_cpu_init(Object *obj) #elif defined(TARGET_RISCV64) set_misa(env, MXL_RV64, 0); #endif - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); } #endif @@ -1210,11 +1210,12 @@ static Property riscv_cpu_extensions[] = { * properties and leave. env.misa_ext = 0 means that we want * all the default properties to be registered. */ -static void register_cpu_props(DeviceState *dev) +static void register_cpu_props(Object *obj) { - RISCVCPU *cpu = RISCV_CPU(OBJECT(dev)); + RISCVCPU *cpu = RISCV_CPU(obj); uint32_t misa_ext = cpu->env.misa_ext; Property *prop; + DeviceState *dev = DEVICE(obj); /* * If misa_ext is not zero, set cfg properties now to From patchwork Mon Mar 6 22:02:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162443 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B393FC6FD1A for ; Mon, 6 Mar 2023 22:08:16 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwm-0006ox-B5; Mon, 06 Mar 2023 17:04:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwj-0006kN-Nd for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:41 -0500 Received: from mail-pj1-x1033.google.com ([2607:f8b0:4864:20::1033]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwg-0006rT-51 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:40 -0500 Received: by mail-pj1-x1033.google.com with SMTP id oj5so11277177pjb.5 for ; Mon, 06 Mar 2023 14:04:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140277; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=e32/f4uJI8Xsh47JTD6oMpzp6kkZE6i5wkSH5g4r7LA=; b=WVvaF9wIUb+DPX3LzZ15A4/uvKgYZa+hVFueCMCJzGjtb006e/yc8qV6iNxDEWDI7f UPDIxtVzd9mdi6w3vQHnKdY3UbWkpMo4t+npQfFxXpZKmUFi9iy2780D62/J4vel+m89 v6X0d11Dk3iJdUhODNoCT1if4RqmTRbRcRLLNTftONb/CHkqOMVYMNmtnhzuvqSmoYVt M3fdab4Kpy37qELbMEpWAmHLUtzU0QMWDkbo5yT8L044vuHBkbPutUYTBzzOO82JzdKx jVA6EedqAXwKMAHj92udrbrBcjuxKs2K4hwPTLvGablqjm0ubDca7ocjG4qlavmRw7++ 1Vkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140277; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=e32/f4uJI8Xsh47JTD6oMpzp6kkZE6i5wkSH5g4r7LA=; b=4Ucp8Up/sslYKaNHN5XCJKADreUufr9vfbiu9q1HdZA/mvHODJ4s3AB8VVbwpKlYzA Fjh1d8aVP8qN6eHlryNM7LoVZPwJonQV57+gS6eFoCx21SDYe3Kjr2zzujQNhMfITwHX s09JU6GREsgw1dxKv/8PKrj6uiw93hEiuUc+/X7rxkx+A2GaqAwr1H+CF30LVauwy9+7 dJ1pksyV0hHxDtYEO6RAdJNYVOvZS/KdLCGbqx9Qgt8coTtsCvv3bazOUNN6ZmOmtnxb /NfVrMpMXqnl9LQclJABg++4vQNIpbqzykwddGDdal72mJDPNgrC5H0/620LGWpwyTgj XHyw== X-Gm-Message-State: AO0yUKVAgxGaNLVk46KFjdYS4yvqRNwwKv59wRe0lZX5vTimpt7y6Ynw 1iXBbWjZcY0voSkbSZfjNxk2Tw== X-Google-Smtp-Source: AK7set9AQHQ0I8eOaCqDopwHHneGgd8dDfmvrfmwLJRs3y8JVG4EGKrt5rZDNiYF28X2Bht9obN3Dw== X-Received: by 2002:a17:903:1103:b0:19e:8075:5545 with SMTP id n3-20020a170903110300b0019e80755545mr15307337plh.54.1678140276878; Mon, 06 Mar 2023 14:04:36 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id d13-20020a170903230d00b0019c13d032d8sm7160400plh.253.2023.03.06.14.04.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:36 -0800 (PST) Subject: [PULL 11/22] riscv: Change type of valid_vm_1_10_[32|64] to bool Date: Mon, 6 Mar 2023 14:02:48 -0800 Message-Id: <20230306220259.7748-12-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Alexandre Ghiti , Andrew Jones , Alistair Francis , Bin Meng , Frank Chang , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1033; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1033.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Alexandre Ghiti This array is actually used as a boolean so swap its current char type to a boolean and at the same time, change the type of validate_vm to bool since it returns valid_vm_1_10_[32|64]. Suggested-by: Andrew Jones Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Alistair Francis Reviewed-by: Bin Meng Reviewed-by: Frank Chang Message-ID: <20230303131252.892893-3-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/csr.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 3106f96212..d93d481bd6 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1141,16 +1141,16 @@ static const target_ulong hip_writable_mask = MIP_VSSIP; static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP; static const target_ulong vsip_writable_mask = MIP_VSSIP; -static const char valid_vm_1_10_32[16] = { - [VM_1_10_MBARE] = 1, - [VM_1_10_SV32] = 1 +static const bool valid_vm_1_10_32[16] = { + [VM_1_10_MBARE] = true, + [VM_1_10_SV32] = true }; -static const char valid_vm_1_10_64[16] = { - [VM_1_10_MBARE] = 1, - [VM_1_10_SV39] = 1, - [VM_1_10_SV48] = 1, - [VM_1_10_SV57] = 1 +static const bool valid_vm_1_10_64[16] = { + [VM_1_10_MBARE] = true, + [VM_1_10_SV39] = true, + [VM_1_10_SV48] = true, + [VM_1_10_SV57] = true }; /* Machine Information Registers */ @@ -1230,7 +1230,7 @@ static RISCVException read_mstatus(CPURISCVState *env, int csrno, return RISCV_EXCP_NONE; } -static int validate_vm(CPURISCVState *env, target_ulong vm) +static bool validate_vm(CPURISCVState *env, target_ulong vm) { if (riscv_cpu_mxl(env) == MXL_RV32) { return valid_vm_1_10_32[vm & 0xf]; @@ -2669,7 +2669,8 @@ static RISCVException read_satp(CPURISCVState *env, int csrno, static RISCVException write_satp(CPURISCVState *env, int csrno, target_ulong val) { - target_ulong vm, mask; + target_ulong mask; + bool vm; if (!riscv_cpu_cfg(env)->mmu) { return RISCV_EXCP_NONE; From patchwork Mon Mar 6 22:02:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162435 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C268DC61DA4 for ; Mon, 6 Mar 2023 22:07:24 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwm-0006pZ-Gf; Mon, 06 Mar 2023 17:04:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwl-0006lU-Bv for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:43 -0500 Received: from mail-pj1-x102a.google.com ([2607:f8b0:4864:20::102a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwh-0006rs-NN for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:42 -0500 Received: by mail-pj1-x102a.google.com with SMTP id h11-20020a17090a2ecb00b00237c740335cso10066863pjs.3 for ; Mon, 06 Mar 2023 14:04:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140278; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=wZX1Gf/M9wzc6uXPUobkwnWxwrZxb7bq0aPefOtNe3g=; b=oCOieO4WqHK+l/d+jry7hlPY98QWh0A+sMA0eBOkDXQ31iGFOLRzmR0JIa75FDjeM0 bdlOBJc7tYd9HJv26XJ2R1ZM32/8p1ZhuzGz+2THEHCYTqAH6tifmqXExijcoqGzw6zY h5+49MxqVQLEldYcvvslfXD+JZIjPgdrHRqu4iJFAQy14Phg0cWYbKM1Ims8mPI8YONh 9gwyl8FyIDlNf4mYLj16tmdNAVTg3FkZs8D0ZSsqY6pvgEr0e67OPQP8bvIa2Y+3NxwG mudi30eT4FFLQ8wLPySraWNKqK5f3yWRGUHTKyXqgCCnmYpaMB3SHOE0FiN100jWqf2T InRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140278; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wZX1Gf/M9wzc6uXPUobkwnWxwrZxb7bq0aPefOtNe3g=; b=tW0ytfY7A0H+Zn68untsKxeMtWtFZUqBcfBackTT3wu+qSEI0AQ99Q1o60N6C2Oo20 zC7hgEfgAj+P1jpSyWXUnuY3/PwGt/OKyOXZ8WnARPJ4nwpMFDMTo0xVG6eBKqIkwMOq +BME/RVx9Q+8FPk14ItaOuOjoGi9FIjfi0aNMWe8eHu6ixLJH99oOxFeOefbbWR3aPq6 /EIEEram8FIDdyUlPHr23WhB5RUFuli7mFTGtL8z1RK8W5Fd3PBtb+5HxqW0wJkwbXsa 8z/PA/0i0ykOaPe3BqJRexVw7mKIS93c5QZQHVP24apOgGKnf/yDyj0UFUFNRabv90HE 34pg== X-Gm-Message-State: AO0yUKXpi1N/kk5kF0PrInv9fb16dQR6sDKRuUJ6tGdE7zH0E/+Ho0MF nTEgIcV6cj950Od8TIxEfjbI8g== X-Google-Smtp-Source: AK7set+E9e7FP73uNPc0I5vddYBl5c+BM91+Hn8G99OegzE63wUFQfrV/H2AHpvxQE9S/fZyS83p1w== X-Received: by 2002:a17:902:f80f:b0:19c:df17:b724 with SMTP id ix15-20020a170902f80f00b0019cdf17b724mr10775327plb.58.1678140278332; Mon, 06 Mar 2023 14:04:38 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id ko4-20020a17090307c400b00186b7443082sm7167201plb.195.2023.03.06.14.04.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:38 -0800 (PST) Subject: [PULL 12/22] riscv: Allow user to set the satp mode Date: Mon, 6 Mar 2023 14:02:49 -0800 Message-Id: <20230306220259.7748-13-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Alexandre Ghiti , Ludovic Henry , Andrew Jones , Bin Meng , Alistair Francis , Frank Chang , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::102a; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x102a.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Alexandre Ghiti RISC-V specifies multiple sizes for addressable memory and Linux probes for the machine's support at startup via the satp CSR register (done in csr.c:validate_vm). As per the specification, sv64 must support sv57, which in turn must support sv48...etc. So we can restrict machine support by simply setting the "highest" supported mode and the bare mode is always supported. You can set the satp mode using the new properties "sv32", "sv39", "sv48", "sv57" and "sv64" as follows: -cpu rv64,sv57=on # Linux will boot using sv57 scheme -cpu rv64,sv39=on # Linux will boot using sv39 scheme -cpu rv64,sv57=off # Linux will boot using sv48 scheme -cpu rv64 # Linux will boot using sv57 scheme by default We take the highest level set by the user: -cpu rv64,sv48=on,sv57=on # Linux will boot using sv57 scheme We make sure that invalid configurations are rejected: -cpu rv64,sv39=off,sv48=on # sv39 must be supported if higher modes are # enabled We accept "redundant" configurations: -cpu rv64,sv48=on,sv57=off # Linux will boot using sv48 scheme And contradictory configurations: -cpu rv64,sv48=on,sv48=off # Linux will boot using sv39 scheme Co-Developed-by: Ludovic Henry Signed-off-by: Ludovic Henry Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Frank Chang Message-ID: <20230303131252.892893-4-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 214 +++++++++++++++++++++++++++++++++++++++++++++ target/riscv/cpu.h | 21 +++++ target/riscv/csr.c | 12 ++- 3 files changed, 240 insertions(+), 7 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 1c4d8aaa74..e1e8057836 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -28,6 +28,7 @@ #include "time_helper.h" #include "exec/exec-all.h" #include "qapi/error.h" +#include "qapi/visitor.h" #include "qemu/error-report.h" #include "hw/qdev-properties.h" #include "migration/vmstate.h" @@ -249,6 +250,82 @@ static void set_vext_version(CPURISCVState *env, int vext_ver) env->vext_ver = vext_ver; } +#ifndef CONFIG_USER_ONLY +static uint8_t satp_mode_from_str(const char *satp_mode_str) +{ + if (!strncmp(satp_mode_str, "mbare", 5)) { + return VM_1_10_MBARE; + } + + if (!strncmp(satp_mode_str, "sv32", 4)) { + return VM_1_10_SV32; + } + + if (!strncmp(satp_mode_str, "sv39", 4)) { + return VM_1_10_SV39; + } + + if (!strncmp(satp_mode_str, "sv48", 4)) { + return VM_1_10_SV48; + } + + if (!strncmp(satp_mode_str, "sv57", 4)) { + return VM_1_10_SV57; + } + + if (!strncmp(satp_mode_str, "sv64", 4)) { + return VM_1_10_SV64; + } + + g_assert_not_reached(); +} + +uint8_t satp_mode_max_from_map(uint32_t map) +{ + /* map here has at least one bit set, so no problem with clz */ + return 31 - __builtin_clz(map); +} + +const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit) +{ + if (is_32_bit) { + switch (satp_mode) { + case VM_1_10_SV32: + return "sv32"; + case VM_1_10_MBARE: + return "none"; + } + } else { + switch (satp_mode) { + case VM_1_10_SV64: + return "sv64"; + case VM_1_10_SV57: + return "sv57"; + case VM_1_10_SV48: + return "sv48"; + case VM_1_10_SV39: + return "sv39"; + case VM_1_10_MBARE: + return "none"; + } + } + + g_assert_not_reached(); +} + +/* Sets the satp mode to the max supported */ +static void set_satp_mode_default_map(RISCVCPU *cpu) +{ + bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; + + if (riscv_feature(&cpu->env, RISCV_FEATURE_MMU)) { + cpu->cfg.satp_mode.map |= (1 << (rv32 ? VM_1_10_SV32 : VM_1_10_SV57)); + } else { + cpu->cfg.satp_mode.map |= (1 << VM_1_10_MBARE); + } +} +#endif + static void riscv_any_cpu_init(Object *obj) { CPURISCVState *env = &RISCV_CPU(obj)->env; @@ -918,6 +995,87 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp) set_misa(env, env->misa_mxl, ext); } +#ifndef CONFIG_USER_ONLY +static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) +{ + bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; + const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; + uint8_t satp_mode_max; + + if (cpu->cfg.satp_mode.map == 0) { + if (cpu->cfg.satp_mode.init == 0) { + /* If unset by the user, we fallback to the default satp mode. */ + set_satp_mode_default_map(cpu); + } else { + /* + * Find the lowest level that was disabled and then enable the + * first valid level below which can be found in + * valid_vm_1_10_32/64. + */ + for (int i = 1; i < 16; ++i) { + if ((cpu->cfg.satp_mode.init & (1 << i)) && valid_vm[i]) { + for (int j = i - 1; j >= 0; --j) { + if (valid_vm[j]) { + cpu->cfg.satp_mode.map |= (1 << j); + break; + } + } + break; + } + } + } + } + + /* Make sure the configuration asked is supported by qemu */ + for (int i = 0; i < 16; ++i) { + if ((cpu->cfg.satp_mode.map & (1 << i)) && !valid_vm[i]) { + error_setg(errp, "satp_mode %s is not valid", + satp_mode_str(i, rv32)); + return; + } + } + + /* + * Make sure the user did not ask for an invalid configuration as per + * the specification. + */ + satp_mode_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); + + if (!rv32) { + for (int i = satp_mode_max - 1; i >= 0; --i) { + if (!(cpu->cfg.satp_mode.map & (1 << i)) && + (cpu->cfg.satp_mode.init & (1 << i)) && + valid_vm[i]) { + error_setg(errp, "cannot disable %s satp mode if %s " + "is enabled", satp_mode_str(i, false), + satp_mode_str(satp_mode_max, false)); + return; + } + } + } + + /* Finally expand the map so that all valid modes are set */ + for (int i = satp_mode_max - 1; i >= 0; --i) { + if (valid_vm[i]) { + cpu->cfg.satp_mode.map |= (1 << i); + } + } +} +#endif + +static void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp) +{ +#ifndef CONFIG_USER_ONLY + Error *local_err = NULL; + + riscv_cpu_satp_mode_finalize(cpu, &local_err); + if (local_err != NULL) { + error_propagate(errp, local_err); + return; + } +#endif +} + static void riscv_cpu_realize(DeviceState *dev, Error **errp) { CPUState *cs = CPU(dev); @@ -1017,6 +1175,12 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) } #endif + riscv_cpu_finalize_features(cpu, &local_err); + if (local_err != NULL) { + error_propagate(errp, local_err); + return; + } + riscv_cpu_register_gdb_regs_for_features(cs); qemu_init_vcpu(cs); @@ -1026,6 +1190,52 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) } #ifndef CONFIG_USER_ONLY +static void cpu_riscv_get_satp(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVSATPMap *satp_map = opaque; + uint8_t satp = satp_mode_from_str(name); + bool value; + + value = satp_map->map & (1 << satp); + + visit_type_bool(v, name, &value, errp); +} + +static void cpu_riscv_set_satp(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVSATPMap *satp_map = opaque; + uint8_t satp = satp_mode_from_str(name); + bool value; + + if (!visit_type_bool(v, name, &value, errp)) { + return; + } + + satp_map->map = deposit32(satp_map->map, satp, 1, value); + satp_map->init |= 1 << satp; +} + +static void riscv_add_satp_mode_properties(Object *obj) +{ + RISCVCPU *cpu = RISCV_CPU(obj); + + if (cpu->env.misa_mxl == MXL_RV32) { + object_property_add(obj, "sv32", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + } else { + object_property_add(obj, "sv39", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + object_property_add(obj, "sv48", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + object_property_add(obj, "sv57", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + object_property_add(obj, "sv64", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + } +} + static void riscv_cpu_set_irq(void *opaque, int irq, int level) { RISCVCPU *cpu = RISCV_CPU(opaque); @@ -1246,6 +1456,10 @@ static void register_cpu_props(Object *obj) for (prop = riscv_cpu_extensions; prop && prop->name; prop++) { qdev_property_add_static(dev, prop); } + +#ifndef CONFIG_USER_ONLY + riscv_add_satp_mode_properties(obj); +#endif } static Property riscv_cpu_properties[] = { diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index b5b5425b99..67ac665ff0 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -27,6 +27,7 @@ #include "qom/object.h" #include "qemu/int128.h" #include "cpu_bits.h" +#include "qapi/qapi-types-common.h" #define TCG_GUEST_DEFAULT_MO 0 @@ -401,6 +402,17 @@ struct RISCVCPUClass { ResettablePhases parent_phases; }; +/* + * map is a 16-bit bitmap: the most significant set bit in map is the maximum + * satp mode that is supported. + * + * init is a 16-bit bitmap used to make sure the user selected a correct + * configuration as per the specification. + */ +typedef struct { + uint16_t map, init; +} RISCVSATPMap; + struct RISCVCPUConfig { bool ext_i; bool ext_e; @@ -497,6 +509,10 @@ struct RISCVCPUConfig { bool misa_w; bool short_isa_string; + +#ifndef CONFIG_USER_ONLY + RISCVSATPMap satp_mode; +#endif }; typedef struct RISCVCPUConfig RISCVCPUConfig; @@ -798,9 +814,14 @@ enum riscv_pmu_event_idx { /* CSR function table */ extern riscv_csr_operations csr_ops[CSR_TABLE_SIZE]; +extern const bool valid_vm_1_10_32[], valid_vm_1_10_64[]; + void riscv_get_csr_ops(int csrno, riscv_csr_operations *ops); void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops); void riscv_cpu_register_gdb_regs_for_features(CPUState *cs); +uint8_t satp_mode_max_from_map(uint32_t map); +const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit); + #endif /* RISCV_CPU_H */ diff --git a/target/riscv/csr.c b/target/riscv/csr.c index d93d481bd6..ab566639e5 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1141,12 +1141,12 @@ static const target_ulong hip_writable_mask = MIP_VSSIP; static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP; static const target_ulong vsip_writable_mask = MIP_VSSIP; -static const bool valid_vm_1_10_32[16] = { +const bool valid_vm_1_10_32[16] = { [VM_1_10_MBARE] = true, [VM_1_10_SV32] = true }; -static const bool valid_vm_1_10_64[16] = { +const bool valid_vm_1_10_64[16] = { [VM_1_10_MBARE] = true, [VM_1_10_SV39] = true, [VM_1_10_SV48] = true, @@ -1232,11 +1232,9 @@ static RISCVException read_mstatus(CPURISCVState *env, int csrno, static bool validate_vm(CPURISCVState *env, target_ulong vm) { - if (riscv_cpu_mxl(env) == MXL_RV32) { - return valid_vm_1_10_32[vm & 0xf]; - } else { - return valid_vm_1_10_64[vm & 0xf]; - } + RISCVCPU *cpu = RISCV_CPU(env_cpu(env)); + + return (vm & 0xf) <= satp_mode_max_from_map(cpu->cfg.satp_mode.map); } static RISCVException write_mstatus(CPURISCVState *env, int csrno, From patchwork Mon Mar 6 22:02:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162440 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 410CDC61DA4 for ; Mon, 6 Mar 2023 22:07:55 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwp-0006wn-PU; Mon, 06 Mar 2023 17:04:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwn-0006sv-64 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:45 -0500 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwj-0006sG-CE for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:44 -0500 Received: by mail-pj1-x1030.google.com with SMTP id h17-20020a17090aea9100b0023739b10792so10096009pjz.1 for ; Mon, 06 Mar 2023 14:04:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140279; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=RtEMb8lrKhAjSOEsp8LnxthrVZGJCuGv8/ZX06Qg6QU=; b=6+5tigqm/giyCuGeyMJS80MN4QLs2SseZdbPFE0UABsibTl5bTek+1gXD4JhS2C5py ddCvcShr/40/M/D+NdsetwecqS1EG1sVJnLCycI2MgfD7AIA/Yc1rk0zlp8uiE5X2RH3 fjtroccJ8kVg2PalNhmQaOBm3TsjZWxVLHgzYi7mcMoqtlbpJVaD28ATftP6PveCx89G YKq1/q1q/3dE2MYtojgOPyY8NM4uGEl+g6m8lF1iVjCYMQ8Vs7ERzIUSC1W7JxqrwE2p qF1OWXpoyUYOa+jFss6gN96rsHjEnuwCaGfedfTYjVll6bZyoI3AOV8zATOYO6pYWk7d 5EWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140279; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RtEMb8lrKhAjSOEsp8LnxthrVZGJCuGv8/ZX06Qg6QU=; b=qtWnbHn4yWGV1R0sfVY5iZi7D+zgmKRoxMlNogPFB21yBYx6U4p6S2an0usAZQ1+2b JKkiNXDuwgv+HxRai5GEIxZI61RC0skeBK1zge53NqmnDL24h/j/6uTH3sODReNjNvFU 4ve7+L5m+nh9XLzK6Uoh8CSs78eEGg+NEqu9HuhuGFoo3eigPj72/rHhZtE7KnfBDn8m eO8/X3bqI7N0vzXmBvAo3SKqe5SRjOgD2mL1uFriafSBq4nzseWDkJcuSyKPhUf59994 7uXHQIyx48RshN+WpMOb829RQr+sn8cc7Ii2dYHHOhFgcbIXm3oTlY0iEq5i4j4nfQ6A /ozA== X-Gm-Message-State: AO0yUKWmeNPWqO3eT+tlF5I2NfSkNIcBDBU7K+jVC51mzvKdMvmT1BD9 ywHHKTcKx54NEHYiBchBC4jaDA== X-Google-Smtp-Source: AK7set+MxG0LffpEri8Pq/t9wQOnuuYHN8e7SHFhqYaWilaci95ORBigypSY1OTSAOS1GrAYPPUVOg== X-Received: by 2002:a17:902:d4cd:b0:19e:23c1:4c3d with SMTP id o13-20020a170902d4cd00b0019e23c14c3dmr15015152plg.2.1678140279389; Mon, 06 Mar 2023 14:04:39 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id i18-20020a170902eb5200b00198e6257921sm7132420pli.269.2023.03.06.14.04.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:39 -0800 (PST) Subject: [PULL 13/22] riscv: Introduce satp mode hw capabilities Date: Mon, 6 Mar 2023 14:02:50 -0800 Message-Id: <20230306220259.7748-14-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Alexandre Ghiti , Andrew Jones , Bin Meng , Frank Chang , Alistair Francis , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1030; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1030.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Alexandre Ghiti Currently, the max satp mode is set with the only constraint that it must be implemented in QEMU, i.e. set in valid_vm_1_10_[32|64]. But we actually need to add another level of constraint: what the hw is actually capable of, because currently, a linux booting on a sifive-u54 boots in sv57 mode which is incompatible with the cpu's sv39 max capability. So add a new bitmap to RISCVSATPMap which contains this capability and initialize it in every XXX_cpu_init. Finally: - valid_vm_1_10_[32|64] constrains which satp mode the CPU can use - the CPU hw capabilities constrains what the user may select - the user's selection then constrains what's available to the guest OS. Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Bin Meng Reviewed-by: Frank Chang Reviewed-by: Alistair Francis Message-ID: <20230303131252.892893-5-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 93 ++++++++++++++++++++++++++++++++++------------ target/riscv/cpu.h | 8 +++- 2 files changed, 75 insertions(+), 26 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index e1e8057836..1e97473af2 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -313,17 +313,24 @@ const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit) g_assert_not_reached(); } -/* Sets the satp mode to the max supported */ -static void set_satp_mode_default_map(RISCVCPU *cpu) +static void set_satp_mode_max_supported(RISCVCPU *cpu, + uint8_t satp_mode) { bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; + const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; - if (riscv_feature(&cpu->env, RISCV_FEATURE_MMU)) { - cpu->cfg.satp_mode.map |= (1 << (rv32 ? VM_1_10_SV32 : VM_1_10_SV57)); - } else { - cpu->cfg.satp_mode.map |= (1 << VM_1_10_MBARE); + for (int i = 0; i <= satp_mode; ++i) { + if (valid_vm[i]) { + cpu->cfg.satp_mode.supported |= (1 << i); + } } } + +/* Set the satp mode to the max supported */ +static void set_satp_mode_default_map(RISCVCPU *cpu) +{ + cpu->cfg.satp_mode.map = cpu->cfg.satp_mode.supported; +} #endif static void riscv_any_cpu_init(Object *obj) @@ -334,6 +341,13 @@ static void riscv_any_cpu_init(Object *obj) #elif defined(TARGET_RISCV64) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); #endif + +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), + riscv_cpu_mxl(&RISCV_CPU(obj)->env) == MXL_RV32 ? + VM_1_10_SV32 : VM_1_10_SV57); +#endif + set_priv_version(env, PRIV_VERSION_1_12_0); register_cpu_props(obj); } @@ -347,6 +361,9 @@ static void rv64_base_cpu_init(Object *obj) register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); +#endif } static void rv64_sifive_u_cpu_init(Object *obj) @@ -355,6 +372,9 @@ static void rv64_sifive_u_cpu_init(Object *obj) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39); +#endif } static void rv64_sifive_e_cpu_init(Object *obj) @@ -366,6 +386,9 @@ static void rv64_sifive_e_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif } static void rv64_thead_c906_cpu_init(Object *obj) @@ -395,6 +418,9 @@ static void rv64_thead_c906_cpu_init(Object *obj) cpu->cfg.ext_xtheadsync = true; cpu->cfg.mvendorid = THEAD_VENDOR_ID; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_SV39); +#endif } static void rv128_base_cpu_init(Object *obj) @@ -411,6 +437,9 @@ static void rv128_base_cpu_init(Object *obj) register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); +#endif } #else static void rv32_base_cpu_init(Object *obj) @@ -421,6 +450,9 @@ static void rv32_base_cpu_init(Object *obj) register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32); +#endif } static void rv32_sifive_u_cpu_init(Object *obj) @@ -429,6 +461,9 @@ static void rv32_sifive_u_cpu_init(Object *obj) set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32); +#endif } static void rv32_sifive_e_cpu_init(Object *obj) @@ -440,6 +475,9 @@ static void rv32_sifive_e_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif } static void rv32_ibex_cpu_init(Object *obj) @@ -451,6 +489,9 @@ static void rv32_ibex_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_11_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif cpu->cfg.epmp = true; } @@ -463,6 +504,9 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif } #endif @@ -999,8 +1043,9 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp) static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) { bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; - const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; - uint8_t satp_mode_max; + uint8_t satp_mode_map_max; + uint8_t satp_mode_supported_max = + satp_mode_max_from_map(cpu->cfg.satp_mode.supported); if (cpu->cfg.satp_mode.map == 0) { if (cpu->cfg.satp_mode.init == 0) { @@ -1013,9 +1058,10 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) * valid_vm_1_10_32/64. */ for (int i = 1; i < 16; ++i) { - if ((cpu->cfg.satp_mode.init & (1 << i)) && valid_vm[i]) { + if ((cpu->cfg.satp_mode.init & (1 << i)) && + (cpu->cfg.satp_mode.supported & (1 << i))) { for (int j = i - 1; j >= 0; --j) { - if (valid_vm[j]) { + if (cpu->cfg.satp_mode.supported & (1 << j)) { cpu->cfg.satp_mode.map |= (1 << j); break; } @@ -1026,37 +1072,36 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) } } - /* Make sure the configuration asked is supported by qemu */ - for (int i = 0; i < 16; ++i) { - if ((cpu->cfg.satp_mode.map & (1 << i)) && !valid_vm[i]) { - error_setg(errp, "satp_mode %s is not valid", - satp_mode_str(i, rv32)); - return; - } + satp_mode_map_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); + + /* Make sure the user asked for a supported configuration (HW and qemu) */ + if (satp_mode_map_max > satp_mode_supported_max) { + error_setg(errp, "satp_mode %s is higher than hw max capability %s", + satp_mode_str(satp_mode_map_max, rv32), + satp_mode_str(satp_mode_supported_max, rv32)); + return; } /* * Make sure the user did not ask for an invalid configuration as per * the specification. */ - satp_mode_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); - if (!rv32) { - for (int i = satp_mode_max - 1; i >= 0; --i) { + for (int i = satp_mode_map_max - 1; i >= 0; --i) { if (!(cpu->cfg.satp_mode.map & (1 << i)) && (cpu->cfg.satp_mode.init & (1 << i)) && - valid_vm[i]) { + (cpu->cfg.satp_mode.supported & (1 << i))) { error_setg(errp, "cannot disable %s satp mode if %s " "is enabled", satp_mode_str(i, false), - satp_mode_str(satp_mode_max, false)); + satp_mode_str(satp_mode_map_max, false)); return; } } } /* Finally expand the map so that all valid modes are set */ - for (int i = satp_mode_max - 1; i >= 0; --i) { - if (valid_vm[i]) { + for (int i = satp_mode_map_max - 1; i >= 0; --i) { + if (cpu->cfg.satp_mode.supported & (1 << i)) { cpu->cfg.satp_mode.map |= (1 << i); } } diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 67ac665ff0..638e47c75a 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -404,13 +404,17 @@ struct RISCVCPUClass { /* * map is a 16-bit bitmap: the most significant set bit in map is the maximum - * satp mode that is supported. + * satp mode that is supported. It may be chosen by the user and must respect + * what qemu implements (valid_1_10_32/64) and what the hw is capable of + * (supported bitmap below). * * init is a 16-bit bitmap used to make sure the user selected a correct * configuration as per the specification. + * + * supported is a 16-bit bitmap used to reflect the hw capabilities. */ typedef struct { - uint16_t map, init; + uint16_t map, init, supported; } RISCVSATPMap; struct RISCVCPUConfig { From patchwork Mon Mar 6 22:02:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162437 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7C5FFC64EC4 for ; Mon, 6 Mar 2023 22:07:28 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwo-0006wJ-RJ; Mon, 06 Mar 2023 17:04:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwm-0006pf-EJ for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:44 -0500 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwj-0006o4-CF for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:44 -0500 Received: by mail-pj1-x1029.google.com with SMTP id cp7-20020a17090afb8700b0023756229427so14633046pjb.1 for ; Mon, 06 Mar 2023 14:04:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140280; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=Wlc9g6KD2LM0ddX3th0tOXGUo8tsCbK+gfNej91LZN4=; b=kZ70qK4zJde8jI/9dOyj4YJ7dNwAPEFNItH19wyCUC2uFNf1qi/GALtPqvm9esWCwe 3YHbuYvzY6EediOjg9wJ0JzxdN2OQPwLad1sfUrmDpxjkOKAuLJSD9Ca+Um7K7nUdtZi eHKRUnLUEwNXeQ3FSJ0pV0+CcZvolJUKmNFQZfCqPGXu/qFoBxASVBrZ/a8uXbw1odlZ 319iP6ZapOv13781YzSyGxV2D1rIxXWfba1esAMC+GmjO28FmOjcS7DmYVtxh1ooCZKJ UVgAI6lzWimlaEGbXYiBaqOETSr09besf92KoLE1w2C/Z28W7OHty0CinUz6byKP4dnr ldEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140280; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Wlc9g6KD2LM0ddX3th0tOXGUo8tsCbK+gfNej91LZN4=; b=dgUGo7CDSpq6+0pxjqJKDmv0dYRR8u/AGAHYVapO+Mt1QXgkRl/wP8dyzqGfMFXFyj OMNqIjjjYGTTpV9jl0TTdaWiPPIam3p/BvAc3hn4INsBOMhSaNZ4F21R4wYNxE+cDwyB vmfPlfvcV3GJa6y2M61bciPly0E1olbH3ghaZorcubnklTZ7mzRruVw5RCtoALZQ8qO8 fmjzt6e+2NLauC0CSUSUoxhBVfktt1kK1Gd1LvauFWlAQSHIUTBOOukGyiX8xXYCvs/N hQBw9o2p2MF16TcCnRTKVzJm8bYW1yXjZpFwaxtWkWP6wEbkpemi2N8FeoZtJ798/P+C p0hw== X-Gm-Message-State: AO0yUKVDpoz5JUVxWO6qvAcMJrFk/IZjsSS2PDlO98puv6p94Q5/IjBM I8U9Qo0pQZJh8lqeGkZBjTR6Tg== X-Google-Smtp-Source: AK7set+JLV2xCpawa4aIXDHzdTpzNfS6IXHOKo2etX7cu4lVD+ka8xriYAoIOfEiLXEaDa6kv1ti7A== X-Received: by 2002:a05:6a20:a111:b0:cc:7967:8a71 with SMTP id q17-20020a056a20a11100b000cc79678a71mr13162785pzk.59.1678140280479; Mon, 06 Mar 2023 14:04:40 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id t13-20020aa7938d000000b0058837da69edsm6655813pfe.128.2023.03.06.14.04.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:40 -0800 (PST) Subject: [PULL 14/22] riscv: Correctly set the device-tree entry 'mmu-type' Date: Mon, 6 Mar 2023 14:02:51 -0800 Message-Id: <20230306220259.7748-15-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Alexandre Ghiti , Andrew Jones , Alistair Francis , Bin Meng , Frank Chang , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1029.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Alexandre Ghiti The 'mmu-type' should reflect what the hardware is capable of so use the new satp_mode field in RISCVCPUConfig to do that. Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Alistair Francis Reviewed-by: Bin Meng Reviewed-by: Frank Chang Message-ID: <20230303131252.892893-6-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 7f70fa11a1..26eb81d036 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -228,8 +228,9 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket, int cpu; uint32_t cpu_phandle; MachineState *ms = MACHINE(s); - char *name, *cpu_name, *core_name, *intc_name; + char *name, *cpu_name, *core_name, *intc_name, *sv_name; bool is_32_bit = riscv_is_32bit(&s->soc[0]); + uint8_t satp_mode_max; for (cpu = s->soc[socket].num_harts - 1; cpu >= 0; cpu--) { RISCVCPU *cpu_ptr = &s->soc[socket].harts[cpu]; @@ -239,13 +240,15 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket, cpu_name = g_strdup_printf("/cpus/cpu@%d", s->soc[socket].hartid_base + cpu); qemu_fdt_add_subnode(ms->fdt, cpu_name); - if (cpu_ptr->cfg.mmu) { - qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", - (is_32_bit) ? "riscv,sv32" : "riscv,sv48"); - } else { - qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", - "riscv,none"); - } + + satp_mode_max = satp_mode_max_from_map( + s->soc[socket].harts[cpu].cfg.satp_mode.map); + sv_name = g_strdup_printf("riscv,%s", + satp_mode_str(satp_mode_max, is_32_bit)); + qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", sv_name); + g_free(sv_name); + + name = riscv_isa_string(cpu_ptr); qemu_fdt_setprop_string(ms->fdt, cpu_name, "riscv,isa", name); g_free(name); From patchwork Mon Mar 6 22:02:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162434 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A1119C61DA4 for ; Mon, 6 Mar 2023 22:07:19 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwq-0006xG-Jt; Mon, 06 Mar 2023 17:04:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwo-0006w2-HI for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:46 -0500 Received: from mail-pj1-x1033.google.com ([2607:f8b0:4864:20::1033]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwk-0006rT-Ra for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:46 -0500 Received: by mail-pj1-x1033.google.com with SMTP id oj5so11277431pjb.5 for ; Mon, 06 Mar 2023 14:04:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140281; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=YemHXp4yitN2wSol7YVy8zJZd9cScsdwZhzDdjeY07I=; b=jKSdoV3plVihkMrhsB9QCbXTVXtUNiHEmFXMBmA4M4NwXE3Fu6oG3UX1BcTfEEslkR FSV+FaqmHdOnBxtmsz99TFZg6uHnTPV5zggCqUA1bEkcbnaac3rNeWS4Vdfa6oZBezso 7KidFOIWBgeYDniINYLGsIOjazEQR8IWUsmUXCPOq7ZAdXpDhOSkg2Y6OBQ2Ybi3JByE dB7mKjZaETKA8QjLxGR9GRuIzwMHk3KNZQ91MW9i545RujwrOglTSGrxUabuxs72K+Ys yl0wAKgu2XDa9AdtQ/tZVeYg8zkyzst4QSGNcXLsvvaCpPyhxWpfrdVgNr7rfmC9CYwN vpgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140281; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YemHXp4yitN2wSol7YVy8zJZd9cScsdwZhzDdjeY07I=; b=nE0QcYF0HKTB/Oj7Cpmp+DBhQGy/X6mxqMyM2Z0XvcilN+Ea3oHPkeoreXsYFWVs59 VE6c2F/nSWqrdbv35ZFHY7+5tbrLlcGWCH95TidMCXVyqEpvJrt7SCNEZVQvP399dbrR FNqPsuDqlEN9pC5/M9xA/vPIGfjk1NXAgzqmGH42wR4+AsmT/VKpCwIzRnzGgKYqQwO3 DHmL/7GRkOkQt7GuJolE10ZFqMsTbcaXFuSBi8m3dY1g8Rm7aQtkVXpMQJ0qEbu2Gll5 7CUcIAXZLAvo6HLeqpKGjAZ2MfnsT3i5D+eOFfZ5M68diK7Kg5hGAUULXLLb/68MQfZF e5wg== X-Gm-Message-State: AO0yUKWMZxHHmE+w4pqqXnJbAg72gZj4TJE6QtNQPhgVvnVtrcblUXNR vgEUMZKKuFhPHiwJPKpM3S+gYg== X-Google-Smtp-Source: AK7set8LONE2uMQFdjA1tbaUbEntm3mRp2ZO5SxIDW+JfTEH9MAjC9KYaE8+7yj8WE6UezUbOyxxPg== X-Received: by 2002:a17:902:dad0:b0:19e:baa1:26bd with SMTP id q16-20020a170902dad000b0019ebaa126bdmr7601206plx.13.1678140281517; Mon, 06 Mar 2023 14:04:41 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id lc11-20020a170902fa8b00b0019edfeed50bsm84713plb.296.2023.03.06.14.04.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:41 -0800 (PST) Subject: [PULL 15/22] hw/riscv/virt: Add OEM_ID and OEM_TABLE_ID fields Date: Mon, 6 Mar 2023 14:02:52 -0800 Message-Id: <20230306220259.7748-16-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Bin Meng , Alistair Francis , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1033; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1033.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L ACPI needs OEM_ID and OEM_TABLE_ID for the machine. Add these fields in the RISCVVirtState structure and initialize with default values. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-2-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 5 +++++ include/hw/riscv/virt.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 26eb81d036..5a059489b5 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -49,6 +49,7 @@ #include "hw/pci/pci.h" #include "hw/pci-host/gpex.h" #include "hw/display/ramfb.h" +#include "hw/acpi/aml-build.h" /* * The virt machine physical address space used by some of the devices @@ -1528,6 +1529,10 @@ static void virt_machine_init(MachineState *machine) static void virt_machine_instance_init(Object *obj) { + RISCVVirtState *s = RISCV_VIRT_MACHINE(obj); + + s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); + s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); } static char *virt_get_aia_guests(Object *obj, Error **errp) diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index b3d26135c0..6c7885bf89 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -56,6 +56,8 @@ struct RISCVVirtState { bool have_aclint; RISCVVirtAIAType aia_type; int aia_guests; + char *oem_id; + char *oem_table_id; }; enum { From patchwork Mon Mar 6 22:02:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162425 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 53193C61DA4 for ; Mon, 6 Mar 2023 22:05:13 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwt-00072j-7L; Mon, 06 Mar 2023 17:04:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwp-0006wv-TX for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:47 -0500 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwl-0006nx-T9 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:47 -0500 Received: by mail-pl1-x62a.google.com with SMTP id x11so7550660pln.12 for ; Mon, 06 Mar 2023 14:04:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140283; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=qUFbOZZ5FU+gsShKlpocvlGsQua6rirJE5ys9meJ4h0=; b=iqyzRLynO/tN4qpQWJ2QcO3mRkcoefAaK8C2atJ2HXIBDshC7GaHQmwiE45GCFrHWV JtySd5BJ2TKn1NiPKoAbvdp4czg0JvC9rjcWOa7Swiq/cb+7KEiWfOpnBNqFXRxidqd6 WJQw7Frv4wJcLYhIlW7MUEuRO/AUxujeTnDgcJPSeixR7L8k6qLTg8m3qXR3EY48REgn iQthZQaZ2a+nji5ubilb8uG3yAnnUV1Jn/Q4UDUDzXJ6qxDMSFsEY6gbWcaDguILPvty +nJEjWVHK9lSDAc5No9H33/20iW4hb/BstbmM94Z8jRC1HGTYojvruIpp4YirQxSiDSA M0aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140283; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qUFbOZZ5FU+gsShKlpocvlGsQua6rirJE5ys9meJ4h0=; b=OH9xDGNbFShjfA8+gy79ByT904L3M3uwA/332uUWdiAl/NBPr2IauogWr8hfM5VPsA XdxxIRzK14paaD9GvVRutLvmOT6SdzyLTKQD7ODh8QJiV9S7wfbQh24iZBLuzkpX0bjk YgdJOtuYRCGBidRD6p3Qcrqg6lBkJtJVMXwouK7jjlW0BFfeXLFs4gUGCRatvWsx02WR YKUWYGPwiJsFCnfwJmdXuHXqpF7V2Yrkz4oVHyHtjp623hZztjS1LGXvu/kaXAfGNQKn zEOCVgnsuEpNnSJ3fU6ZWB5HuxWaiEuc3FQZG9+i7+XDUPMGBc/2PHBZclIGIJREhyRs TTJw== X-Gm-Message-State: AO0yUKU95IuaMlxEQaItPYCgy3Kw0phk5+66A7rHLWQ8uWwXloJSJA/I srZyLbjhlNY7npAGHYE86wikxJK76EsZX9hZnog= X-Google-Smtp-Source: AK7set9gZ3doQtesOfGDXStcFEd7b8ZyhUwPpfiVEVmBOCfomSMmo1OSAPTzJOxj1UwsFwv9qCCylA== X-Received: by 2002:a17:90b:3886:b0:234:1645:5266 with SMTP id mu6-20020a17090b388600b0023416455266mr12837629pjb.30.1678140283091; Mon, 06 Mar 2023 14:04:43 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id f6-20020a17090ac28600b00233cde36909sm8253524pjt.21.2023.03.06.14.04.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:42 -0800 (PST) Subject: [PULL 16/22] hw/riscv/virt: Add a switch to disable ACPI Date: Mon, 6 Mar 2023 14:02:53 -0800 Message-Id: <20230306220259.7748-17-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62a; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L ACPI will be enabled by default. Add a switch to turn off for testing and debug purposes. Signed-off-by: Sunil V L Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-3-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 29 +++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 5a059489b5..90579a4c0e 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -50,6 +50,7 @@ #include "hw/pci-host/gpex.h" #include "hw/display/ramfb.h" #include "hw/acpi/aml-build.h" +#include "qapi/qapi-visit-common.h" /* * The virt machine physical address space used by some of the devices @@ -1533,6 +1534,7 @@ static void virt_machine_instance_init(Object *obj) s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); + s->acpi = ON_OFF_AUTO_AUTO; } static char *virt_get_aia_guests(Object *obj, Error **errp) @@ -1607,6 +1609,28 @@ static void virt_set_aclint(Object *obj, bool value, Error **errp) s->have_aclint = value; } +bool virt_is_acpi_enabled(RISCVVirtState *s) +{ + return s->acpi != ON_OFF_AUTO_OFF; +} + +static void virt_get_acpi(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVVirtState *s = RISCV_VIRT_MACHINE(obj); + OnOffAuto acpi = s->acpi; + + visit_type_OnOffAuto(v, name, &acpi, errp); +} + +static void virt_set_acpi(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVVirtState *s = RISCV_VIRT_MACHINE(obj); + + visit_type_OnOffAuto(v, name, &s->acpi, errp); +} + static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine, DeviceState *dev) { @@ -1678,6 +1702,11 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) sprintf(str, "Set number of guest MMIO pages for AIA IMSIC. Valid value " "should be between 0 and %d.", VIRT_IRQCHIP_MAX_GUESTS); object_class_property_set_description(oc, "aia-guests", str); + object_class_property_add(oc, "acpi", "OnOffAuto", + virt_get_acpi, virt_set_acpi, + NULL, NULL); + object_class_property_set_description(oc, "acpi", + "Enable ACPI"); } static const TypeInfo virt_machine_typeinfo = { diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 6c7885bf89..62efebaa32 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -58,6 +58,7 @@ struct RISCVVirtState { int aia_guests; char *oem_id; char *oem_table_id; + OnOffAuto acpi; }; enum { @@ -123,4 +124,5 @@ enum { #define FDT_APLIC_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \ 1 + FDT_APLIC_INT_CELLS) +bool virt_is_acpi_enabled(RISCVVirtState *s); #endif From patchwork Mon Mar 6 22:02:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162438 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 64431C64EC4 for ; Mon, 6 Mar 2023 22:07:47 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwt-00072e-25; Mon, 06 Mar 2023 17:04:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIwr-0006ys-9m for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:49 -0500 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwn-0006ty-EE for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:48 -0500 Received: by mail-pj1-x1030.google.com with SMTP id oj5so11277564pjb.5 for ; Mon, 06 Mar 2023 14:04:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140284; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=hLQ2d4Q8lyM8hisZupM0/ijO56IIsMafYWr8dV9IEZc=; b=SCMIv8yrxOcgdbbdMlgfulCsT9iWvkz0XJ59JSgKHH70FEmnXDlyKVbTWNrbnYQ+xx qzXBrbmzDSvnvb2i2YSYoa+lilbruqjWFBeTCE6C4VP1BRvz8lazBh13O+Ko6e7xM8kG i8mMLNK7Mgzb23hxPSOxPoqsgVNgLXXCSjae0Y4x1L//mKR9Xi37mry+bx2umdN1CTTn xOqh8Edt+YTXd4PbuWfqlXPxtcSLw6ZhhpdWJD8gZsmR3MK5HWL/sXVCF7KGC/8SfkfU ST5QvoERCOrKAfb9KPwT+Dzdrrh1+CAx+L5gxM1bUn4rHuNuqE8tXjoLCplsrOMwXii4 guPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140284; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hLQ2d4Q8lyM8hisZupM0/ijO56IIsMafYWr8dV9IEZc=; b=ndp+Y1oRqw3FrneswWWSKCVDLoiXLgURMsMW48+Ng4ezT2ujiIgd4J72bcEZmj0rVT K9+FsF1gohStFS/OviXsi3MBvcPhRnwyIZFi5EvbxcI4cA/LPNo2JKGPvzKFsNwZf796 2U5OL5J9S2sv/rRO3A5s70AYBn6mc1ekK6kYgJ9dhDQdmDngL72DJ6fmbnocXytMTDB1 lfEt5I4SNN/LrRDknEbK3xWzhoZXDu/xzYoJTPKmu+Bemf0cmcVuFjbZGOpnyvpKfRaD osS5ZjFHVJmvuyWmCgWMQCZXZ1tmcUUEuJKUmdmTeOjLqtpdINDMGydF0DtY9QSDU6Bq Wr/w== X-Gm-Message-State: AO0yUKWyFzExnSY66OGBhU+ZJ97W9u51iw/dZ2VzmmNyWmqNc5vqCiim Q0h7+ttwR2D8+jjxMS0f4xlr2A== X-Google-Smtp-Source: AK7set9YgpGYg8Y0wrNGnw3I8xqhrvhr/JQmv9HHCDJxy3MCb9KJqtgbjtqOzOCX4DnT8bpAgqprrQ== X-Received: by 2002:a17:90b:1b4e:b0:233:ee67:8eb3 with SMTP id nv14-20020a17090b1b4e00b00233ee678eb3mr12883633pjb.24.1678140284122; Mon, 06 Mar 2023 14:04:44 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id c3-20020a17090abf0300b002376d85844dsm6344251pjs.51.2023.03.06.14.04.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:43 -0800 (PST) Subject: [PULL 17/22] hw/riscv/virt: Add memmap pointer to RiscVVirtState Date: Mon, 6 Mar 2023 14:02:54 -0800 Message-Id: <20230306220259.7748-18-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Bin Meng , Alistair Francis , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1030; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1030.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L memmap needs to be exported outside of virt.c so that modules like acpi can use it. Hence, add a pointer field in RiscVVirtState structure and initialize it with the memorymap. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-4-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 2 ++ include/hw/riscv/virt.h | 1 + 2 files changed, 3 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 90579a4c0e..aed303e1e6 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1458,6 +1458,8 @@ static void virt_machine_init(MachineState *machine) ROUND_UP(virt_high_pcie_memmap.base, virt_high_pcie_memmap.size); } + s->memmap = virt_memmap; + /* register system main memory (actual RAM) */ memory_region_add_subregion(system_memory, memmap[VIRT_DRAM].base, machine->ram); diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 62efebaa32..379501edcc 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -59,6 +59,7 @@ struct RISCVVirtState { char *oem_id; char *oem_table_id; OnOffAuto acpi; + const MemMapEntry *memmap; }; enum { From patchwork Mon Mar 6 22:02:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162428 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7DC78C64EC4 for ; Mon, 6 Mar 2023 22:06:24 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwt-00072v-8F; Mon, 06 Mar 2023 17:04:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIws-00071h-2t for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:50 -0500 Received: from mail-pj1-x1034.google.com ([2607:f8b0:4864:20::1034]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwo-0006qY-3w for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:49 -0500 Received: by mail-pj1-x1034.google.com with SMTP id x34so11342914pjj.0 for ; Mon, 06 Mar 2023 14:04:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140285; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=LtnBq7s4bDkJsgeH75CHXNbBj64DnlS7U8qxbOWtiLM=; b=Hj/jhHuevfmpbu1R9xhkG9Ws2KHqLrS5Ef6PdybkHbVHEwhgVwOD2xDYah+PVNlCra n0Rsaexj8jCHlUXqHRDGMC3jLDmlP/pnWJWHTDASFB1SAa8SjE5Ih5l4zz+rMWdfcHmf 8Oz7jFAxu4PNSPbYMmWDDgDbAPBstTFqkQFy3esJ09GqEV2YPcJLXkeeRqr/Tgc4NfDE 0MVrvijZFzjdIxMX0M5J1AAk6rxFDuvgKS8Q27/38ZuPr70/VadsE275ruCXSoQzo3mK nNPcblQ7uIPsoce9LGZDZ1q4ozv8Y9LroRZtTMng+nTOUBvOisQ4MznGNU4RPzGXI1Lp cbAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140285; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LtnBq7s4bDkJsgeH75CHXNbBj64DnlS7U8qxbOWtiLM=; b=E2OFUftNxI79CvE7baUIHgN7M3RRRhFIKMIJ4cXk9zxeJQDQnoDcS/kXSeRigmudMV xl7LKVFjLThzJSAlieAv0zasnCpFlaFug2nxxMEYtBKzQXv/14XG1pe6K9U5ab5OcVS7 nAOKWmriMxgHS2IPwskI7zoD3y+O6YGi4G+Dlu0TZvO0MlBvNHkN8FjFwX86AfbUcOTb 2xm5O5JHKy8E5L6rLqfIBz1wCtnBTNS/UGsb45RfsEVhvBTYK7WvbJHkcD0uL8Eb8Ywb ZnbdX2YqrhwHu130DWK09pF97TW4u0jhlHkuviEs2ExrhVHOZgtbLoMG0sA+GoZx8rsm EaKA== X-Gm-Message-State: AO0yUKXmvHWvXKjwZGQU5j5yA6iHGUmyr+wytCe4C+wPyei1jUzxALuc 7wKZ0MHzW3ITiGybkBm1VPZROw== X-Google-Smtp-Source: AK7set9ujP76koPxARg+6qZ1y2k2CVeeiSqxR5v5/PCncX56axrMMF5DyZUlV3NRG3dxQesVxWTYEg== X-Received: by 2002:a05:6a20:6d2a:b0:cc:395f:e1ed with SMTP id fv42-20020a056a206d2a00b000cc395fe1edmr11574670pzb.22.1678140285112; Mon, 06 Mar 2023 14:04:45 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id e16-20020aa78250000000b005e093020cabsm6724362pfn.45.2023.03.06.14.04.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:44 -0800 (PST) Subject: [PULL 18/22] hw/riscv/virt: Enable basic ACPI infrastructure Date: Mon, 6 Mar 2023 14:02:55 -0800 Message-Id: <20230306220259.7748-19-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1034; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1034.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L Add basic ACPI infrastructure for RISC-V with below tables. 1) DSDT with below basic objects - CPUs - fw_cfg 2) FADT revision 6 with HW_REDUCED flag 3) XSDT 4) RSDP Add this functionality in a new file virt-acpi-build.c and enable building this infrastructure. Signed-off-by: Sunil V L Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-5-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/Kconfig | 1 + hw/riscv/meson.build | 1 + hw/riscv/virt-acpi-build.c | 304 +++++++++++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 1 + 4 files changed, 307 insertions(+) create mode 100644 hw/riscv/virt-acpi-build.c diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 4550b3b938..6528ebfa3a 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -44,6 +44,7 @@ config RISCV_VIRT select VIRTIO_MMIO select FW_CFG_DMA select PLATFORM_BUS + select ACPI config SHAKTI_C bool diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index ab6cae57ea..2f7ee81be3 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -9,5 +9,6 @@ riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c')) riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c')) riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c')) riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfsoc.c')) +riscv_ss.add(when: 'CONFIG_ACPI', if_true: files('virt-acpi-build.c')) hw_arch += {'riscv': riscv_ss} diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c new file mode 100644 index 0000000000..d6947fdc74 --- /dev/null +++ b/hw/riscv/virt-acpi-build.c @@ -0,0 +1,304 @@ +/* + * Support for generating ACPI tables and passing them to Guests + * + * RISC-V virt ACPI generation + * + * Copyright (C) 2008-2010 Kevin O'Connor + * Copyright (C) 2006 Fabrice Bellard + * Copyright (C) 2013 Red Hat Inc + * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO.,LTD. + * Copyright (C) 2021-2023 Ventana Micro Systems Inc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#include "qemu/osdep.h" +#include "hw/acpi/acpi-defs.h" +#include "hw/acpi/acpi.h" +#include "hw/acpi/aml-build.h" +#include "hw/acpi/utils.h" +#include "qapi/error.h" +#include "sysemu/reset.h" +#include "migration/vmstate.h" +#include "hw/riscv/virt.h" + +#define ACPI_BUILD_TABLE_SIZE 0x20000 + +typedef struct AcpiBuildState { + /* Copy of table in RAM (for patching) */ + MemoryRegion *table_mr; + MemoryRegion *rsdp_mr; + MemoryRegion *linker_mr; + /* Is table patched? */ + bool patched; +} AcpiBuildState; + +static void acpi_align_size(GArray *blob, unsigned align) +{ + /* + * Align size to multiple of given size. This reduces the chance + * we need to change size in the future (breaking cross version migration). + */ + g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align)); +} + +static void riscv_acpi_madt_add_rintc(uint32_t uid, + const CPUArchIdList *arch_ids, + GArray *entry) +{ + uint64_t hart_id = arch_ids->cpus[uid].arch_id; + + build_append_int_noprefix(entry, 0x18, 1); /* Type */ + build_append_int_noprefix(entry, 20, 1); /* Length */ + build_append_int_noprefix(entry, 1, 1); /* Version */ + build_append_int_noprefix(entry, 0, 1); /* Reserved */ + build_append_int_noprefix(entry, 0x1, 4); /* Flags */ + build_append_int_noprefix(entry, hart_id, 8); /* Hart ID */ + build_append_int_noprefix(entry, uid, 4); /* ACPI Processor UID */ +} + +static void acpi_dsdt_add_cpus(Aml *scope, RISCVVirtState *s) +{ + MachineClass *mc = MACHINE_GET_CLASS(s); + MachineState *ms = MACHINE(s); + const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); + + for (int i = 0; i < arch_ids->len; i++) { + Aml *dev; + GArray *madt_buf = g_array_new(0, 1, 1); + + dev = aml_device("C%.03X", i); + aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007"))); + aml_append(dev, aml_name_decl("_UID", + aml_int(arch_ids->cpus[i].arch_id))); + + /* build _MAT object */ + riscv_acpi_madt_add_rintc(i, arch_ids, madt_buf); + aml_append(dev, aml_name_decl("_MAT", + aml_buffer(madt_buf->len, + (uint8_t *)madt_buf->data))); + g_array_free(madt_buf, true); + + aml_append(scope, dev); + } +} + +static void acpi_dsdt_add_fw_cfg(Aml *scope, const MemMapEntry *fw_cfg_memmap) +{ + Aml *dev = aml_device("FWCF"); + aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0002"))); + + /* device present, functioning, decoding, not shown in UI */ + aml_append(dev, aml_name_decl("_STA", aml_int(0xB))); + aml_append(dev, aml_name_decl("_CCA", aml_int(1))); + + Aml *crs = aml_resource_template(); + aml_append(crs, aml_memory32_fixed(fw_cfg_memmap->base, + fw_cfg_memmap->size, AML_READ_WRITE)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} + +/* FADT */ +static void build_fadt_rev6(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s, + unsigned dsdt_tbl_offset) +{ + AcpiFadtData fadt = { + .rev = 6, + .minor_ver = 5, + .flags = 1 << ACPI_FADT_F_HW_REDUCED_ACPI, + .xdsdt_tbl_offset = &dsdt_tbl_offset, + }; + + build_fadt(table_data, linker, &fadt, s->oem_id, s->oem_table_id); +} + +/* DSDT */ +static void build_dsdt(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + Aml *scope, *dsdt; + const MemMapEntry *memmap = s->memmap; + AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + + acpi_table_begin(&table, table_data); + dsdt = init_aml_allocator(); + + /* + * When booting the VM with UEFI, UEFI takes ownership of the RTC hardware. + * While UEFI can use libfdt to disable the RTC device node in the DTB that + * it passes to the OS, it cannot modify AML. Therefore, we won't generate + * the RTC ACPI device at all when using UEFI. + */ + scope = aml_scope("\\_SB"); + acpi_dsdt_add_cpus(scope, s); + + acpi_dsdt_add_fw_cfg(scope, &memmap[VIRT_FW_CFG]); + + aml_append(dsdt, scope); + + /* copy AML table into ACPI tables blob and patch header there */ + g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); + + acpi_table_end(linker, &table); + free_aml_allocator(); +} + +static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) +{ + GArray *table_offsets; + unsigned dsdt, xsdt; + GArray *tables_blob = tables->table_data; + + table_offsets = g_array_new(false, true, + sizeof(uint32_t)); + + bios_linker_loader_alloc(tables->linker, + ACPI_BUILD_TABLE_FILE, tables_blob, + 64, false); + + /* DSDT is pointed to by FADT */ + dsdt = tables_blob->len; + build_dsdt(tables_blob, tables->linker, s); + + /* FADT and others pointed to by XSDT */ + acpi_add_table(table_offsets, tables_blob); + build_fadt_rev6(tables_blob, tables->linker, s, dsdt); + + /* XSDT is pointed to by RSDP */ + xsdt = tables_blob->len; + build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, + s->oem_table_id); + + /* RSDP is in FSEG memory, so allocate it separately */ + { + AcpiRsdpData rsdp_data = { + .revision = 2, + .oem_id = s->oem_id, + .xsdt_tbl_offset = &xsdt, + .rsdt_tbl_offset = NULL, + }; + build_rsdp(tables->rsdp, tables->linker, &rsdp_data); + } + + /* + * The align size is 128, warn if 64k is not enough therefore + * the align size could be resized. + */ + if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) { + warn_report("ACPI table size %u exceeds %d bytes," + " migration may not work", + tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2); + error_printf("Try removing some objects."); + } + + acpi_align_size(tables_blob, ACPI_BUILD_TABLE_SIZE); + + /* Clean up memory that's no longer used */ + g_array_free(table_offsets, true); +} + +static void acpi_ram_update(MemoryRegion *mr, GArray *data) +{ + uint32_t size = acpi_data_len(data); + + /* + * Make sure RAM size is correct - in case it got changed + * e.g. by migration + */ + memory_region_ram_resize(mr, size, &error_abort); + + memcpy(memory_region_get_ram_ptr(mr), data->data, size); + memory_region_set_dirty(mr, 0, size); +} + +static void virt_acpi_build_update(void *build_opaque) +{ + AcpiBuildState *build_state = build_opaque; + AcpiBuildTables tables; + + /* No state to update or already patched? Nothing to do. */ + if (!build_state || build_state->patched) { + return; + } + + build_state->patched = true; + + acpi_build_tables_init(&tables); + + virt_acpi_build(RISCV_VIRT_MACHINE(qdev_get_machine()), &tables); + + acpi_ram_update(build_state->table_mr, tables.table_data); + acpi_ram_update(build_state->rsdp_mr, tables.rsdp); + acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob); + + acpi_build_tables_cleanup(&tables, true); +} + +static void virt_acpi_build_reset(void *build_opaque) +{ + AcpiBuildState *build_state = build_opaque; + build_state->patched = false; +} + +static const VMStateDescription vmstate_virt_acpi_build = { + .name = "virt_acpi_build", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_BOOL(patched, AcpiBuildState), + VMSTATE_END_OF_LIST() + }, +}; + +void virt_acpi_setup(RISCVVirtState *s) +{ + AcpiBuildTables tables; + AcpiBuildState *build_state; + + build_state = g_malloc0(sizeof *build_state); + + acpi_build_tables_init(&tables); + virt_acpi_build(s, &tables); + + /* Now expose it all to Guest */ + build_state->table_mr = acpi_add_rom_blob(virt_acpi_build_update, + build_state, tables.table_data, + ACPI_BUILD_TABLE_FILE); + assert(build_state->table_mr != NULL); + + build_state->linker_mr = acpi_add_rom_blob(virt_acpi_build_update, + build_state, + tables.linker->cmd_blob, + ACPI_BUILD_LOADER_FILE); + + build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update, + build_state, tables.rsdp, + ACPI_BUILD_RSDP_FILE); + + qemu_register_reset(virt_acpi_build_reset, build_state); + virt_acpi_build_reset(build_state); + vmstate_register(NULL, 0, &vmstate_virt_acpi_build, build_state); + + /* + * Clean up tables but don't free the memory: we track it + * in build_state. + */ + acpi_build_tables_cleanup(&tables, false); +} diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 379501edcc..e5c474b26e 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -126,4 +126,5 @@ enum { 1 + FDT_APLIC_INT_CELLS) bool virt_is_acpi_enabled(RISCVVirtState *s); +void virt_acpi_setup(RISCVVirtState *vms); #endif From patchwork Mon Mar 6 22:02:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162444 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 364B1C61DA4 for ; Mon, 6 Mar 2023 22:08:19 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIwx-00077e-P7; Mon, 06 Mar 2023 17:04:56 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIws-00072d-S8 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:50 -0500 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwp-0006rw-6U for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:50 -0500 Received: by mail-pl1-x62b.google.com with SMTP id i5so12106701pla.2 for ; Mon, 06 Mar 2023 14:04:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140286; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=TOpYKIeN5vKellg3Iht21zb8f5DYIGJ7B3B8YuQ0gk4=; b=gSunpMsa5D7aXIMdCqHXO7VlvxGH8LqznELuqfolZvygfOtg9Wg1VBsyEoltACtgq8 YR7Gx8NaLH9XzxGV2t5dMouA6N1SthXxhjcCTOFpA8a4q7XqD9fJyidX/efnoAHsrkJX s8ZKbOW2xdxwDlCYH3PJxivSjFslvVKhxaWUZMnQ39muqJA2n3SuDCOI+BOWeLDVMxMn KPNrSrlhUQrliQp9GA02ZPjMPRaAnZD4Y+pR9hPXqt9Q5BraHeoE7YeHNfMKbbnAG1Mc 8N+3Xn4ccG45oM6PI8iac1fXPvHczhPclauth/DoXda5vTAT8vjltp/4G5BdIBmQ9HMJ qNfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140286; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TOpYKIeN5vKellg3Iht21zb8f5DYIGJ7B3B8YuQ0gk4=; b=yjKus7SAo0i8VxmIxbIJaOk3AY3JR/dicI59gIbZ2lPiJMJG+gFvY4/dDvw88Dq6zm ZMA5zUfB2oODfi62rmOHe4NjlNgnledrj9fHbkgPtkOui8QhiC7r/D2vzV1qPxIcwYoM mIFdLpBqPKASXcbqXIaV+LvK+FJ+ZyRnCpM+M3oWYPpyfxmESZDPaIco2x/9HZI7DO3u TB+SFh7ogQR8KG8qC6bXiPyrTrhh6jUj8U/V2sZnohgEJc4cKzkfRUxc65CaF4SMVtpP uWVevT3XOELhzkPVxBUsbZSIx26GndZBCeMfZ4X3TdBkaSjW0YLL7MST47DpMvWQp+cG bhpQ== X-Gm-Message-State: AO0yUKVrV6gm6/pg3YzF84kl1eRy/0YQRiYYdqxtt0axraccqFAM4aMN lDEi/LnPzBi6elnU/1P9r9vedw== X-Google-Smtp-Source: AK7set+8Wafma+r4uUjG/HdzgpegXPpySxmMPjUTgy5lFoLTvvyfjenI71fQRqbLjIEpGIW6i8zI3g== X-Received: by 2002:a17:90a:1d1:b0:237:2edb:d4e3 with SMTP id 17-20020a17090a01d100b002372edbd4e3mr12719689pjd.27.1678140286304; Mon, 06 Mar 2023 14:04:46 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id s26-20020a63215a000000b005034a57b963sm6579468pgm.58.2023.03.06.14.04.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:45 -0800 (PST) Subject: [PULL 19/22] hw/riscv/virt: virt-acpi-build.c: Add RINTC in MADT Date: Mon, 6 Mar 2023 14:02:56 -0800 Message-Id: <20230306220259.7748-20-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Alistair Francis , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62b; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62b.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L Add Multiple APIC Description Table (MADT) with the RINTC structure for each cpu. Signed-off-by: Sunil V L Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-6-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt-acpi-build.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index d6947fdc74..026d1eaf88 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -32,6 +32,7 @@ #include "sysemu/reset.h" #include "migration/vmstate.h" #include "hw/riscv/virt.h" +#include "hw/riscv/numa.h" #define ACPI_BUILD_TABLE_SIZE 0x20000 @@ -160,6 +161,36 @@ static void build_dsdt(GArray *table_data, free_aml_allocator(); } +/* + * ACPI spec, Revision 6.5+ + * 5.2.12 Multiple APIC Description Table (MADT) + * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/15 + * https://drive.google.com/file/d/1R6k4MshhN3WTT-hwqAquu5nX6xSEqK2l/view + */ +static void build_madt(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + MachineClass *mc = MACHINE_GET_CLASS(s); + MachineState *ms = MACHINE(s); + const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); + + AcpiTable table = { .sig = "APIC", .rev = 6, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + acpi_table_begin(&table, table_data); + /* Local Interrupt Controller Address */ + build_append_int_noprefix(table_data, 0, 4); + build_append_int_noprefix(table_data, 0, 4); /* MADT Flags */ + + /* RISC-V Local INTC structures per HART */ + for (int i = 0; i < arch_ids->len; i++) { + riscv_acpi_madt_add_rintc(i, arch_ids, table_data); + } + + acpi_table_end(linker, &table); +} + static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) { GArray *table_offsets; @@ -181,6 +212,9 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_fadt_rev6(tables_blob, tables->linker, s, dsdt); + acpi_add_table(table_offsets, tables_blob); + build_madt(tables_blob, tables->linker, s); + /* XSDT is pointed to by RSDP */ xsdt = tables_blob->len; build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, From patchwork Mon Mar 6 22:02:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162431 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DC98EC6FD1A for ; Mon, 6 Mar 2023 22:07:04 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIx5-0007fL-05; Mon, 06 Mar 2023 17:05:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIx2-0007QF-I6 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:05:00 -0500 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwr-0006wW-0V for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:51 -0500 Received: by mail-pl1-x62d.google.com with SMTP id u5so12068668plq.7 for ; Mon, 06 Mar 2023 14:04:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140287; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=nEG+8tKpC0mKLiolqDAAgKmMAgJCfr+M8A7Oq6yedtk=; b=Q9g++BtxOMjrKJ6ZqeWXxtjVWAhfMrL9IA9K7H1saByIVecmlEpSD+9/cROWNpzz3v 9lw/xI6WE/5FLRX84hGv1HB7vOc1pJRbLjvGiKKHe3j0BLI1SitKI875rlRoHp3dZ93g 3eNr/NnyTvm7bVA3P5smzqUe0ZbyoWYAVqut+6eVKsFPQ+wCgsle6qP1Z6c9lLGJReEV 2YJsaCimZABp/8M9PqiOL1IEvlajnybjG0zPjAiaHz4cgerJUd8fmccW99HfAGiBFPoy zr4gkDl52LLYhKvrW6aeGRLbuLsWqwApJ9W7m0O4UWAxdbJL8iH8K5RsXSLKcYnvknYr y1sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140287; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nEG+8tKpC0mKLiolqDAAgKmMAgJCfr+M8A7Oq6yedtk=; b=ItAXHAW96nGU2ZE2w0OKflWohPJkLR9QFaNeeZhZcsZKSUN3zuEyi2G6PVWKtXbif8 jgOyf8IFNXK9W3M4hes5Lzj6ak5vDQo07M630PexKEVT+oUIRSvySOEHqPa8W7kWwGyz oEn3eb6qx63Q6SxPZ/HoOrCp0AYaHpo5Xchjt9kuIiSMbQmwXvgVbWbrpJqOItabLN47 Ll9Tj7CD4fS5jHMrTyNG3sWlMEGGvFYBKctTAsnDDchQBdLzNUkQKSd3Op91eZiB3Mq5 iUpmXfXz1hlcf6v7jsxcmGfFz7AfJGRjh4+kHlXBEW1OVa0sgNaTPz660jSDU6RjTpCC QKGw== X-Gm-Message-State: AO0yUKWssZsquKFbrzwPW+QtBj36GeqO6A5ALmPfO+q97tsm+sfa/uqX oAQl/gZwa9sXPEINsA6vgTauHA== X-Google-Smtp-Source: AK7set836ArEa8FSoQWZ/YyDL937N+Kyye7CTOct9/zDn51HOGvQqAVt8041QYp/oMBXBsn8xBk4lw== X-Received: by 2002:a17:902:b488:b0:19d:19fb:55ec with SMTP id y8-20020a170902b48800b0019d19fb55ecmr10137013plr.6.1678140287389; Mon, 06 Mar 2023 14:04:47 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id s18-20020a17090302d200b0019e665b24dfsm7295464plk.1.2023.03.06.14.04.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:47 -0800 (PST) Subject: [PULL 20/22] hw/riscv/virt: virt-acpi-build.c: Add RHCT Table Date: Mon, 6 Mar 2023 14:02:57 -0800 Message-Id: <20230306220259.7748-21-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=palmer@rivosinc.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L RISC-V ACPI platforms need to provide RISC-V Hart Capabilities Table (RHCT). Add this to the ACPI tables. Signed-off-by: Sunil V L Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-7-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt-acpi-build.c | 78 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index 026d1eaf88..82da0a238c 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -33,6 +33,7 @@ #include "migration/vmstate.h" #include "hw/riscv/virt.h" #include "hw/riscv/numa.h" +#include "hw/intc/riscv_aclint.h" #define ACPI_BUILD_TABLE_SIZE 0x20000 @@ -111,6 +112,80 @@ static void acpi_dsdt_add_fw_cfg(Aml *scope, const MemMapEntry *fw_cfg_memmap) aml_append(scope, dev); } +/* RHCT Node[N] starts at offset 56 */ +#define RHCT_NODE_ARRAY_OFFSET 56 + +/* + * ACPI spec, Revision 6.5+ + * 5.2.36 RISC-V Hart Capabilities Table (RHCT) + * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/16 + * https://drive.google.com/file/d/1nP3nFiH4jkPMp6COOxP6123DCZKR-tia/view + */ +static void build_rhct(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + MachineClass *mc = MACHINE_GET_CLASS(s); + MachineState *ms = MACHINE(s); + const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); + size_t len, aligned_len; + uint32_t isa_offset, num_rhct_nodes; + RISCVCPU *cpu; + char *isa; + + AcpiTable table = { .sig = "RHCT", .rev = 1, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + acpi_table_begin(&table, table_data); + + build_append_int_noprefix(table_data, 0x0, 4); /* Reserved */ + + /* Time Base Frequency */ + build_append_int_noprefix(table_data, + RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, 8); + + /* ISA + N hart info */ + num_rhct_nodes = 1 + ms->smp.cpus; + + /* Number of RHCT nodes*/ + build_append_int_noprefix(table_data, num_rhct_nodes, 4); + + /* Offset to the RHCT node array */ + build_append_int_noprefix(table_data, RHCT_NODE_ARRAY_OFFSET, 4); + + /* ISA String Node */ + isa_offset = table_data->len - table.table_offset; + build_append_int_noprefix(table_data, 0, 2); /* Type 0 */ + + cpu = &s->soc[0].harts[0]; + isa = riscv_isa_string(cpu); + len = 8 + strlen(isa) + 1; + aligned_len = (len % 2) ? (len + 1) : len; + + build_append_int_noprefix(table_data, aligned_len, 2); /* Length */ + build_append_int_noprefix(table_data, 0x1, 2); /* Revision */ + + /* ISA string length including NUL */ + build_append_int_noprefix(table_data, strlen(isa) + 1, 2); + g_array_append_vals(table_data, isa, strlen(isa) + 1); /* ISA string */ + + if (aligned_len != len) { + build_append_int_noprefix(table_data, 0x0, 1); /* Optional Padding */ + } + + /* Hart Info Node */ + for (int i = 0; i < arch_ids->len; i++) { + build_append_int_noprefix(table_data, 0xFFFF, 2); /* Type */ + build_append_int_noprefix(table_data, 16, 2); /* Length */ + build_append_int_noprefix(table_data, 0x1, 2); /* Revision */ + build_append_int_noprefix(table_data, 1, 2); /* Number of offsets */ + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor UID */ + build_append_int_noprefix(table_data, isa_offset, 4); /* Offsets[0] */ + } + + acpi_table_end(linker, &table); +} + /* FADT */ static void build_fadt_rev6(GArray *table_data, BIOSLinker *linker, @@ -215,6 +290,9 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_madt(tables_blob, tables->linker, s); + acpi_add_table(table_offsets, tables_blob); + build_rhct(tables_blob, tables->linker, s); + /* XSDT is pointed to by RSDP */ xsdt = tables_blob->len; build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, From patchwork Mon Mar 6 22:02:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162441 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9797DC61DA4 for ; Mon, 6 Mar 2023 22:08:01 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIx4-0007do-P5; Mon, 06 Mar 2023 17:05:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIx2-0007QP-Ia for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:05:00 -0500 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIwr-0006oH-Eq for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:51 -0500 Received: by mail-pj1-x1029.google.com with SMTP id y2so11290814pjg.3 for ; Mon, 06 Mar 2023 14:04:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140288; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=T4Ht91dtise3VXyeM0B1MvojQi2kjoyoe8PlK/ZAG1w=; b=eCRqu08W02petCUTE1XyrLSFg+jLgbgpZzqWKS47OcrOlHhaXvjxUI368gFXmE7pmu Smd6Fk4FYlsPniZz3I6LpS0JTcnFAZ5HgK8jXMdkCfE8a1yZ+TTjAtBtdX/ZZ6sXNMm0 U0e3iO+sfmsIaN3UDHucOARWbysy9BgCmoGURVZ+LVved5/dBKfYBAN4JI9kvmQBJLXa 9IodZTV/zwLJzr73UAYvLJ/gdcW7H7Pu3gmo4ahMIWzy3WUjlviGLnv6bCvOhKnhZN0S m+SED30EuNV7t9AECuNSqueC81xW2Ff5Cw1jomkksnYex2wc1pe0yk2VACbLdgAZ1SqW cDYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140288; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T4Ht91dtise3VXyeM0B1MvojQi2kjoyoe8PlK/ZAG1w=; b=11DgTFtpNjjjqD2w3uSlHTRbwopTYvf4omqb1RGuxcdnaUaMoCVFVF3aa4K2dJgNQd RsmA81AfgIuSOYQ0xyFQrD/L200xq5QuYfjhZXRiLqxFYeIk9JjpwGOe9LqFgUn8lq3j 7aAfHNbD++Bji8Donn6cGhDG96zXTx0MVntTlmNiJbSqT4XxRV1nU9Px3z8f9VW2I0G6 Jt5U//zGby0l7Tajj3j5BD2dvX7Pom6nqZKOj/kYBlR2Oxt4Bs989TewAMhKSzMEhzp0 huW3a85iZSfYl27le1Q4BIMwNyBSRFic0F6l3og1aCbYqTq+TCsjolVppf0aXIMAaDGG Ti5Q== X-Gm-Message-State: AO0yUKUIqPL7aWg58F6ZXLTVjJ7aBrd0XqK+3mYd8Cyt9vlK9+N9O1h/ YINbWCDS1b1oCpeXiJEaozvO4A== X-Google-Smtp-Source: AK7set9kzOG86b6FYsRqzBdH5UrEEgwIH1y4ave7mMhDTqCErWlb3sEuucmKFsnAVYtNFfTxz7jvFA== X-Received: by 2002:a17:90b:3e8d:b0:233:ca14:6afb with SMTP id rj13-20020a17090b3e8d00b00233ca146afbmr13246385pjb.37.1678140288507; Mon, 06 Mar 2023 14:04:48 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id ga7-20020a17090b038700b00233db0db3dfsm8291035pjb.7.2023.03.06.14.04.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:48 -0800 (PST) Subject: [PULL 21/22] hw/riscv/virt.c: Initialize the ACPI tables Date: Mon, 6 Mar 2023 14:02:58 -0800 Message-Id: <20230306220259.7748-22-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Bin Meng , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1029.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L Initialize the ACPI tables if the acpi option is not disabled. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-8-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index aed303e1e6..4e3efbee16 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1323,6 +1323,10 @@ static void virt_machine_done(Notifier *notifier, void *data) if (kvm_enabled()) { riscv_setup_direct_kernel(kernel_entry, fdt_load_addr); } + + if (virt_is_acpi_enabled(s)) { + virt_acpi_setup(s); + } } static void virt_machine_init(MachineState *machine) From patchwork Mon Mar 6 22:02:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Palmer Dabbelt X-Patchwork-Id: 13162442 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BDFDFC64EC4 for ; Mon, 6 Mar 2023 22:08:01 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZIx8-0007tP-8h; Mon, 06 Mar 2023 17:05:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZIx2-0007QE-II for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:05:00 -0500 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pZIws-0006sG-Al for qemu-devel@nongnu.org; Mon, 06 Mar 2023 17:04:52 -0500 Received: by mail-pj1-x1030.google.com with SMTP id h17-20020a17090aea9100b0023739b10792so10096379pjz.1 for ; Mon, 06 Mar 2023 14:04:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20210112.gappssmtp.com; s=20210112; t=1678140289; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:from:to:cc:subject:date :message-id:reply-to; bh=47W96iQ+SkG3dvh8kZCFx6LTiVa4sba31wGpFSZ1JEg=; b=u2sT4RhWeHNcuok2Zaibp/0qEyvYi7pzcJLdZVYtTF4tNyoXTcSFGHliuJypI8WhhO tJFxalLLF2T+xf6sYZY5OqCs7bezCexXIX4TS0UMd8N0uncUnBqT61OMV86RBjpxLxq4 i//OdDPLeWePHeUfbpuMtOl6FTzKkSw8GCp9KzoBnctK00lI+cfo9/r67FYi485Mc1nr Dq3ge4rhNuAUZgfqkm57UZFjvebtTLECx9BO8id/g7p93QGuuJFQEVG21baS7hHJq+/Y U96hrz/fDHi1Ci7gOc7TcJmoZWvFPw38qZVORs7Kw+9/Hj8fCyww47R/DhZxSSDQxNTo ElKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678140289; h=to:from:cc:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=47W96iQ+SkG3dvh8kZCFx6LTiVa4sba31wGpFSZ1JEg=; b=Pidnd9PrjrVn05EE4W9Ti+WUKaCuf0S02V25apZY2jbKp0MeO0Cl4ymRpRKn+p1oVL EzEV5+A+Eu51Xn7yty7eQtjdITPOxEl4BCCbk7m1bhh0H85BQ8X3VeIcINrXcoVWz7u0 iaqktFgsdqgWFw6BAh1WWZLr2IuvNdeRHaUD/c3r+XbL2mWePwSjEBMYSDfndF00Dxjc 38TN2IQbJJnraA0cGdfCjLJxh+C4E5s2N/S34a2MZPY9eHO+t8jb8CkL1wajknIBP8dG +4UfUhIyCAtHsShDwbgm1ZKH1wXUal9XhKd659FLhJL6ul71yXORYsyY449Jm5xjKDot zXuA== X-Gm-Message-State: AO0yUKV0RCfW7sGFu5lbuIh+LrU90KFo/LHVMxHqNqwXA/9z88hNeNAh C2Lwd+58NVLZpkKUQltimCIUsw== X-Google-Smtp-Source: AK7set8rFf0x6ITod2sUsRYquKxHVbqXN3JqwpRDRBo1fL+SESiG/HEbG/wjs+wRa8InsBzFPekD6w== X-Received: by 2002:a17:903:32cf:b0:19d:1d32:fbe with SMTP id i15-20020a17090332cf00b0019d1d320fbemr14890417plr.20.1678140289558; Mon, 06 Mar 2023 14:04:49 -0800 (PST) Received: from localhost ([50.221.140.188]) by smtp.gmail.com with ESMTPSA id w14-20020a170902e88e00b0019e88d9bed3sm7142069plg.210.2023.03.06.14.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Mar 2023 14:04:49 -0800 (PST) Subject: [PULL 22/22] MAINTAINERS: Add entry for RISC-V ACPI Date: Mon, 6 Mar 2023 14:02:59 -0800 Message-Id: <20230306220259.7748-23-palmer@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230306220259.7748-1-palmer@rivosinc.com> References: <20230306220259.7748-1-palmer@rivosinc.com> MIME-Version: 1.0 Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, Sunil V L , Bin Meng , Alistair Francis , Andrew Jones , Palmer Dabbelt From: Palmer Dabbelt To: Peter Maydell Received-SPF: pass client-ip=2607:f8b0:4864:20::1030; envelope-from=palmer@rivosinc.com; helo=mail-pj1-x1030.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Sunil V L RISC-V ACPI related functionality for virt machine is added in virt-acpi-build.c. Add the maintainer entry after moving the ARM ACPI entry under the main ACPI entry. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-9-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- MAINTAINERS | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 011fd85a09..26bf14b57b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -999,12 +999,6 @@ S: Maintained F: hw/ssi/xlnx-versal-ospi.c F: include/hw/ssi/xlnx-versal-ospi.h -ARM ACPI Subsystem -M: Shannon Zhao -L: qemu-arm@nongnu.org -S: Maintained -F: hw/arm/virt-acpi-build.c - STM32F100 M: Alexandre Iooss L: qemu-arm@nongnu.org @@ -1892,6 +1886,18 @@ F: docs/specs/acpi_nvdimm.rst F: docs/specs/acpi_pci_hotplug.rst F: docs/specs/acpi_hw_reduced_hotplug.rst +ARM ACPI Subsystem +M: Shannon Zhao +L: qemu-arm@nongnu.org +S: Maintained +F: hw/arm/virt-acpi-build.c + +RISC-V ACPI Subsystem +M: Sunil V L +L: qemu-riscv@nongnu.org +S: Maintained +F: hw/riscv/virt-acpi-build.c + ACPI/VIOT M: Jean-Philippe Brucker S: Supported