From 397e679f18d76574b15d1bc6ed4d925cc78ae359 Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Thu, 12 Jan 2023 15:59:29 +0530 Subject: [PATCH 1/8] SBSA Test Changes - Added RuleID to all the tests. - Test Order Change for Few tests. - Rearranged some of the test to OS view. Signed-off-by: Rajat Goyal --- platform/pal_uefi/include/pal_uefi.h | 7 + platform/pal_uefi/src/pal_pe.c | 1 + platform/pal_uefi/src/pal_peripherals.c | 27 +- test_pool/exerciser/test_e001.c | 10 +- test_pool/exerciser/test_e002.c | 9 +- test_pool/exerciser/test_e003.c | 9 +- test_pool/exerciser/test_e004.c | 10 +- test_pool/exerciser/test_e005.c | 9 +- test_pool/exerciser/test_e006.c | 9 +- test_pool/exerciser/test_e007.c | 9 +- test_pool/exerciser/test_e008.c | 9 +- test_pool/exerciser/test_e009.c | 10 +- test_pool/exerciser/test_e010.c | 9 +- test_pool/exerciser/test_e011.c | 9 +- test_pool/exerciser/test_e012.c | 9 +- test_pool/exerciser/test_e013.c | 9 +- test_pool/exerciser/test_e014.c | 9 +- test_pool/exerciser/test_e015.c | 9 +- test_pool/exerciser/test_e016.c | 10 +- .../gic/{ => operating_system}/test_g001.c | 11 +- test_pool/gic/operating_system/test_g002.c | 121 ++++++ test_pool/gic/test_g002.c | 74 ---- test_pool/gic/test_g003.c | 68 ---- test_pool/gic/test_g004.c | 98 ----- test_pool/io_virt/test_i001.c | 86 ----- test_pool/io_virt/test_i002.c | 79 ---- test_pool/io_virt/test_i004.c | 88 ----- test_pool/io_virt/test_i005.c | 76 ---- test_pool/io_virt/test_i006.c | 69 ---- test_pool/io_virt/test_i008.c | 93 ----- test_pool/io_virt/test_i010.c | 135 ------- test_pool/io_virt/test_i011.c | 105 ------ test_pool/io_virt/test_i012.c | 100 ----- test_pool/io_virt/test_i015.c | 107 ------ test_pool/io_virt/test_i016.c | 105 ------ .../memory_map/operating_system/test_m001.c | 77 ++++ test_pool/nist_sts/test_n001.c | 9 +- test_pool/pcie/test_p001.c | 9 +- test_pool/pcie/test_p002.c | 9 +- test_pool/pcie/test_p003.c | 9 +- test_pool/pcie/test_p005.c | 9 +- test_pool/pcie/test_p006.c | 9 +- test_pool/pcie/test_p007.c | 9 +- test_pool/pcie/test_p008.c | 9 +- test_pool/pcie/test_p009.c | 147 -------- test_pool/pcie/test_p010.c | 9 +- test_pool/pcie/test_p011.c | 9 +- test_pool/pcie/test_p012.c | 9 +- test_pool/pcie/test_p013.c | 9 +- test_pool/pcie/test_p014.c | 9 +- test_pool/pcie/test_p015.c | 9 +- test_pool/pcie/test_p016.c | 9 +- test_pool/pcie/test_p017.c | 9 +- test_pool/pcie/test_p018.c | 9 +- test_pool/pcie/test_p019.c | 9 +- test_pool/pcie/test_p020.c | 9 +- test_pool/pcie/test_p021.c | 9 +- test_pool/pcie/test_p022.c | 9 +- test_pool/pcie/test_p023.c | 9 +- test_pool/pcie/test_p024.c | 9 +- test_pool/pcie/test_p025.c | 9 +- test_pool/pcie/test_p026.c | 9 +- test_pool/pcie/test_p027.c | 9 +- test_pool/pcie/test_p028.c | 9 +- test_pool/pcie/test_p029.c | 9 +- test_pool/pcie/test_p030.c | 9 +- test_pool/pcie/test_p031.c | 9 +- test_pool/pcie/test_p032.c | 9 +- test_pool/pcie/test_p033.c | 9 +- test_pool/pcie/test_p034.c | 9 +- test_pool/pcie/test_p035.c | 9 +- test_pool/pcie/test_p036.c | 9 +- test_pool/pcie/test_p037.c | 9 +- test_pool/pcie/test_p038.c | 9 +- test_pool/pcie/test_p039.c | 9 +- test_pool/pcie/test_p040.c | 9 +- test_pool/pcie/test_p041.c | 9 +- test_pool/pcie/test_p042.c | 9 +- test_pool/pcie/test_p043.c | 9 +- test_pool/pcie/test_p044.c | 9 +- test_pool/pcie/test_p045.c | 9 +- test_pool/pcie/test_p046.c | 9 +- test_pool/pcie/test_p047.c | 9 +- test_pool/pcie/test_p048.c | 11 +- test_pool/pcie/test_p049.c | 9 +- test_pool/pcie/test_p050.c | 9 +- test_pool/pcie/test_p051.c | 9 +- test_pool/pcie/test_p052.c | 9 +- test_pool/pcie/test_p053.c | 9 +- test_pool/pcie/test_p054.c | 9 +- test_pool/pcie/test_p055.c | 9 +- test_pool/pcie/test_p056.c | 9 +- test_pool/pcie/test_p057.c | 15 +- test_pool/pcie/test_p058.c | 10 +- test_pool/pcie/test_p059.c | 6 +- test_pool/pcie/test_p060.c | 10 +- .../test_c001.c} | 11 +- .../test_c002.c} | 11 +- .../test_c003.c} | 18 +- test_pool/pe/operating_system/test_c004.c | 83 ++++ .../test_c005.c} | 11 +- test_pool/pe/operating_system/test_c006.c | 65 ++++ .../test_c007.c} | 11 +- .../test_c008.c} | 11 +- .../test_c009.c} | 11 +- .../test_c010.c} | 11 +- .../test_c011.c} | 11 +- .../test_c012.c} | 11 +- .../test_c013.c} | 11 +- .../test_c014.c} | 11 +- test_pool/pe/operating_system/test_c015.c | 93 +++++ test_pool/pe/operating_system/test_c016.c | 126 +++++++ .../test_c017.c} | 11 +- .../test_c018.c} | 11 +- .../test_c019.c} | 11 +- .../test_c020.c} | 11 +- .../test_c021.c} | 11 +- .../test_c022.c} | 11 +- .../test_c023.c} | 11 +- test_pool/pe/operating_system/test_c024.c | 59 +++ .../test_c025.c} | 12 +- .../test_c026.c} | 11 +- .../test_c027.c} | 11 +- test_pool/pe/operating_system/test_c028.c | 59 +++ test_pool/pe/operating_system/test_c029.c | 59 +++ .../pe/{ => operating_system}/test_c030.c | 23 +- test_pool/pe/operating_system/test_c031.c | 59 +++ test_pool/pe/operating_system/test_c032.c | 60 +++ test_pool/pe/operating_system/test_c033.c | 60 +++ test_pool/pe/operating_system/test_c034.c | 68 ++++ test_pool/pe/operating_system/test_c035.c | 60 +++ test_pool/pe/operating_system/test_c036.c | 61 +++ test_pool/pe/operating_system/test_c037.c | 60 +++ test_pool/pe/test_c001.c | 65 ---- test_pool/pe/test_c002.c | 62 --- test_pool/pe/test_c005.c | 59 --- test_pool/pe/test_c006.c | 69 ---- test_pool/pe/test_c007.c | 59 --- test_pool/pe/test_c008.c | 61 --- test_pool/pe/test_c011.c | 110 ------ test_pool/pe/test_c012.c | 62 --- test_pool/pe/test_c013.c | 60 --- test_pool/pe/test_c014.c | 74 ---- test_pool/pe/test_c015.c | 279 -------------- test_pool/pe/test_c017.c | 60 --- test_pool/peripherals/test_d001.c | 92 ----- test_pool/peripherals/test_d002.c | 92 ----- test_pool/peripherals/test_d003.c | 270 ------------- test_pool/peripherals/test_m001.c | 127 ------- test_pool/power_wakeup/test_u001.c | 355 ------------------ test_pool/power_wakeup/test_u002.c | 275 -------------- .../operating_system/test_i001.c} | 13 +- .../operating_system/test_i002.c} | 14 +- test_pool/smmu/operating_system/test_i003.c | 100 +++++ test_pool/smmu/operating_system/test_i004.c | 100 +++++ .../operating_system/test_i005.c} | 11 +- .../operating_system/test_i006.c} | 11 +- .../operating_system/test_i007.c} | 34 +- .../operating_system/test_i008.c} | 12 +- .../operating_system/test_i009.c} | 10 +- .../operating_system/test_i010.c} | 12 +- .../operating_system/test_i011.c} | 12 +- .../operating_system/test_i012.c} | 12 +- test_pool/smmu/operating_system/test_i013.c | 108 ++++++ test_pool/smmu/operating_system/test_i014.c | 120 ++++++ .../operating_system/test_i015.c} | 24 +- test_pool/smmu/operating_system/test_i016.c | 137 +++++++ test_pool/timer_wd/test_t001.c | 65 ---- test_pool/timer_wd/test_t002.c | 88 ----- test_pool/timer_wd/test_t003.c | 88 ----- test_pool/timer_wd/test_t004.c | 94 ----- test_pool/timer_wd/test_t005.c | 105 ------ test_pool/timer_wd/test_t006.c | 71 ---- test_pool/timer_wd/test_t007.c | 162 -------- test_pool/timer_wd/test_t008.c | 128 ------- test_pool/timer_wd/test_w001.c | 105 ------ test_pool/timer_wd/test_w002.c | 128 ------- .../operating_system/test_w001.c} | 13 +- uefi_app/SbsaAvs.inf | 144 +++---- uefi_app/SbsaAvsNist.inf | 132 +++---- val/include/pal_interface.h | 2 + val/include/sbsa_avs_common.h | 11 +- val/include/sbsa_avs_memory.h | 8 +- val/include/sbsa_avs_pe.h | 6 +- val/include/sbsa_avs_val.h | 4 +- val/include/val_interface.h | 2 + val/src/avs_gic_support.c | 8 +- val/src/avs_memory.c | 46 ++- val/src/avs_pe.c | 81 ++-- val/src/avs_pe_infra.c | 6 +- val/src/avs_peripherals.c | 5 + val/src/avs_status.c | 34 +- val/src/avs_test_infra.c | 15 +- 193 files changed, 2672 insertions(+), 5445 deletions(-) rename test_pool/gic/{ => operating_system}/test_g001.c (84%) create mode 100644 test_pool/gic/operating_system/test_g002.c delete mode 100644 test_pool/gic/test_g002.c delete mode 100644 test_pool/gic/test_g003.c delete mode 100644 test_pool/gic/test_g004.c delete mode 100644 test_pool/io_virt/test_i001.c delete mode 100644 test_pool/io_virt/test_i002.c delete mode 100644 test_pool/io_virt/test_i004.c delete mode 100644 test_pool/io_virt/test_i005.c delete mode 100644 test_pool/io_virt/test_i006.c delete mode 100644 test_pool/io_virt/test_i008.c delete mode 100644 test_pool/io_virt/test_i010.c delete mode 100644 test_pool/io_virt/test_i011.c delete mode 100644 test_pool/io_virt/test_i012.c delete mode 100644 test_pool/io_virt/test_i015.c delete mode 100644 test_pool/io_virt/test_i016.c create mode 100644 test_pool/memory_map/operating_system/test_m001.c delete mode 100644 test_pool/pcie/test_p009.c rename test_pool/pe/{test_c004.c => operating_system/test_c001.c} (90%) rename test_pool/pe/{test_c003.c => operating_system/test_c002.c} (85%) rename test_pool/pe/{test_c010.c => operating_system/test_c003.c} (74%) create mode 100644 test_pool/pe/operating_system/test_c004.c rename test_pool/pe/{test_c019.c => operating_system/test_c005.c} (86%) create mode 100644 test_pool/pe/operating_system/test_c006.c rename test_pool/pe/{test_c020.c => operating_system/test_c007.c} (86%) rename test_pool/pe/{test_c021.c => operating_system/test_c008.c} (86%) rename test_pool/pe/{test_c024.c => operating_system/test_c009.c} (86%) rename test_pool/pe/{test_c022.c => operating_system/test_c010.c} (90%) rename test_pool/pe/{test_c026.c => operating_system/test_c011.c} (86%) rename test_pool/pe/{test_c027.c => operating_system/test_c012.c} (88%) rename test_pool/pe/{test_c025.c => operating_system/test_c013.c} (86%) rename test_pool/pe/{test_c023.c => operating_system/test_c014.c} (86%) create mode 100644 test_pool/pe/operating_system/test_c015.c create mode 100644 test_pool/pe/operating_system/test_c016.c rename test_pool/pe/{test_c018.c => operating_system/test_c017.c} (88%) rename test_pool/pe/{test_c033.c => operating_system/test_c018.c} (86%) rename test_pool/pe/{test_c034.c => operating_system/test_c019.c} (86%) rename test_pool/pe/{test_c036.c => operating_system/test_c020.c} (86%) rename test_pool/pe/{test_c028.c => operating_system/test_c021.c} (86%) rename test_pool/pe/{test_c035.c => operating_system/test_c022.c} (86%) rename test_pool/pe/{test_c029.c => operating_system/test_c023.c} (88%) create mode 100644 test_pool/pe/operating_system/test_c024.c rename test_pool/pe/{test_os_c018.c => operating_system/test_c025.c} (82%) rename test_pool/pe/{test_c031.c => operating_system/test_c026.c} (86%) rename test_pool/pe/{test_c032.c => operating_system/test_c027.c} (86%) create mode 100644 test_pool/pe/operating_system/test_c028.c create mode 100644 test_pool/pe/operating_system/test_c029.c rename test_pool/pe/{ => operating_system}/test_c030.c (75%) create mode 100644 test_pool/pe/operating_system/test_c031.c create mode 100644 test_pool/pe/operating_system/test_c032.c create mode 100644 test_pool/pe/operating_system/test_c033.c create mode 100644 test_pool/pe/operating_system/test_c034.c create mode 100644 test_pool/pe/operating_system/test_c035.c create mode 100644 test_pool/pe/operating_system/test_c036.c create mode 100644 test_pool/pe/operating_system/test_c037.c delete mode 100644 test_pool/pe/test_c001.c delete mode 100644 test_pool/pe/test_c002.c delete mode 100644 test_pool/pe/test_c005.c delete mode 100644 test_pool/pe/test_c006.c delete mode 100644 test_pool/pe/test_c007.c delete mode 100644 test_pool/pe/test_c008.c delete mode 100755 test_pool/pe/test_c011.c delete mode 100644 test_pool/pe/test_c012.c delete mode 100644 test_pool/pe/test_c013.c delete mode 100644 test_pool/pe/test_c014.c delete mode 100755 test_pool/pe/test_c015.c delete mode 100644 test_pool/pe/test_c017.c delete mode 100644 test_pool/peripherals/test_d001.c delete mode 100644 test_pool/peripherals/test_d002.c delete mode 100755 test_pool/peripherals/test_d003.c delete mode 100644 test_pool/peripherals/test_m001.c delete mode 100755 test_pool/power_wakeup/test_u001.c delete mode 100755 test_pool/power_wakeup/test_u002.c rename test_pool/{io_virt/test_i007.c => smmu/operating_system/test_i001.c} (89%) mode change 100755 => 100644 rename test_pool/{io_virt/test_i003.c => smmu/operating_system/test_i002.c} (89%) mode change 100755 => 100644 create mode 100644 test_pool/smmu/operating_system/test_i003.c create mode 100644 test_pool/smmu/operating_system/test_i004.c rename test_pool/{io_virt/test_i013.c => smmu/operating_system/test_i005.c} (90%) rename test_pool/{io_virt/test_i014.c => smmu/operating_system/test_i006.c} (90%) rename test_pool/{io_virt/test_i009.c => smmu/operating_system/test_i007.c} (76%) rename test_pool/{io_virt/test_hyp_i005.c => smmu/operating_system/test_i008.c} (87%) rename test_pool/{io_virt/test_os_i005.c => smmu/operating_system/test_i009.c} (90%) rename test_pool/{io_virt/test_os_i006.c => smmu/operating_system/test_i010.c} (89%) rename test_pool/{io_virt/test_os_i007.c => smmu/operating_system/test_i011.c} (89%) rename test_pool/{io_virt/test_os_i008.c => smmu/operating_system/test_i012.c} (90%) create mode 100644 test_pool/smmu/operating_system/test_i013.c create mode 100644 test_pool/smmu/operating_system/test_i014.c rename test_pool/{io_virt/test_os_i009.c => smmu/operating_system/test_i015.c} (82%) create mode 100644 test_pool/smmu/operating_system/test_i016.c delete mode 100644 test_pool/timer_wd/test_t001.c delete mode 100644 test_pool/timer_wd/test_t002.c delete mode 100644 test_pool/timer_wd/test_t003.c delete mode 100644 test_pool/timer_wd/test_t004.c delete mode 100644 test_pool/timer_wd/test_t005.c delete mode 100644 test_pool/timer_wd/test_t006.c delete mode 100755 test_pool/timer_wd/test_t007.c delete mode 100644 test_pool/timer_wd/test_t008.c delete mode 100755 test_pool/timer_wd/test_w001.c delete mode 100755 test_pool/timer_wd/test_w002.c rename test_pool/{timer_wd/test_w003.c => watchdog/operating_system/test_w001.c} (90%) diff --git a/platform/pal_uefi/include/pal_uefi.h b/platform/pal_uefi/include/pal_uefi.h index 4e36e3db..bb37a96e 100644 --- a/platform/pal_uefi/include/pal_uefi.h +++ b/platform/pal_uefi/include/pal_uefi.h @@ -18,6 +18,11 @@ #ifndef __PAL_UEFI_H__ #define __PAL_UEFI_H__ +/* include ACPI specification headers */ +#include "Include/Guid/Acpi.h" +#include +#include "Include/IndustryStandard/Acpi.h" + extern VOID* g_sbsa_log_file_handle; extern UINT32 g_print_level; extern UINT32 g_print_mmio; @@ -99,6 +104,7 @@ typedef struct { UINT32 attr; ///< PE attributes UINT64 mpidr; ///< PE MPIDR UINT32 pmu_gsiv; ///< PMU Interrupt ID + UINT32 gmain_gsiv; /* GIC Maintenace Interrupt */ }PE_INFO_ENTRY; typedef struct { @@ -415,6 +421,7 @@ typedef enum { MEMORY_TYPE_NORMAL, MEMORY_TYPE_RESERVED, MEMORY_TYPE_NOT_POPULATED, + MEMORY_TYPE_PERSISTENT, MEMORY_TYPE_LAST_ENTRY }MEM_INFO_TYPE_e; diff --git a/platform/pal_uefi/src/pal_pe.c b/platform/pal_uefi/src/pal_pe.c index e3c5ebea..5ab15bda 100644 --- a/platform/pal_uefi/src/pal_pe.c +++ b/platform/pal_uefi/src/pal_pe.c @@ -215,6 +215,7 @@ pal_pe_create_info_table(PE_INFO_TABLE *PeTable) Ptr->mpidr = Entry->MPIDR; Ptr->pe_num = PeTable->header.num_of_pe; Ptr->pmu_gsiv = Entry->PerformanceInterruptGsiv; + Ptr->gmain_gsiv = Entry->VGICMaintenanceInterrupt; sbsa_print(AVS_PRINT_DEBUG, L" MPIDR %x PE num %x \n", Ptr->mpidr, Ptr->pe_num); pal_pe_data_cache_ops_by_va((UINT64)Ptr, CLEAN_AND_INVALIDATE); Ptr++; diff --git a/platform/pal_uefi/src/pal_peripherals.c b/platform/pal_uefi/src/pal_peripherals.c index bf0e3fe6..643f6d4d 100644 --- a/platform/pal_uefi/src/pal_peripherals.c +++ b/platform/pal_uefi/src/pal_peripherals.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020-2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -191,6 +191,25 @@ IsDeviceMemory(EFI_MEMORY_TYPE type) switch(type) { case EfiMemoryMappedIO: case EfiMemoryMappedIOPortSpace: + return TRUE; + default: + return FALSE; + } +} + +/** + @brief Check if the memory type is persistent + + @param EFI_MEMORY_TYPE - Type of UEFI memory. + + @return true if memory is persistent + false otherwise +**/ +BOOLEAN +IsPersistentMemory(EFI_MEMORY_TYPE type) +{ + + switch(type) { case EfiPersistentMemory: return TRUE; default: @@ -261,7 +280,11 @@ pal_memory_create_info_table(MEMORY_INFO_TABLE *memoryInfoTable) if (IsDeviceMemory ((EFI_MEMORY_TYPE)MemoryMapPtr->Type)) { memoryInfoTable->info[i].type = MEMORY_TYPE_DEVICE; } else { - memoryInfoTable->info[i].type = MEMORY_TYPE_NOT_POPULATED; + if (IsPersistentMemory ((EFI_MEMORY_TYPE)MemoryMapPtr->Type)) { + memoryInfoTable->info[i].type = MEMORY_TYPE_PERSISTENT; + } else { + memoryInfoTable->info[i].type = MEMORY_TYPE_NOT_POPULATED; + } } } } diff --git a/test_pool/exerciser/test_e001.c b/test_pool/exerciser/test_e001.c index 133d3b64..3782c30d 100644 --- a/test_pool/exerciser/test_e001.c +++ b/test_pool/exerciser/test_e001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2019, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 1) #define TEST_DESC "Enhanced ECAM Memory access check " - +#define TEST_RULE "" static void @@ -93,14 +93,14 @@ e001_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e002.c b/test_pool/exerciser/test_e002.c index 2c720d92..4415f4ee 100644 --- a/test_pool/exerciser/test_e002.c +++ b/test_pool/exerciser/test_e002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018,2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018,2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,6 +26,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 2) #define TEST_DESC "PCIe Memory access check " +#define TEST_RULE "" #define TEST_DATA 0xDEADDAED static const ARM_NORMAL_MEM ARM_NORMAL_MEM_ARRAY[] = {NORMAL_NC, NORMAL_WT}; @@ -166,14 +167,14 @@ e002_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e003.c b/test_pool/exerciser/test_e003.c index c37a5720..bfe3c184 100644 --- a/test_pool/exerciser/test_e003.c +++ b/test_pool/exerciser/test_e003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,6 +29,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 3) #define TEST_DESC "PCIe Address translation check " +#define TEST_RULE "" #define TEST_DATA_NUM_PAGES 4 #define TEST_DATA 0xDE @@ -270,14 +271,14 @@ e003_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e004.c b/test_pool/exerciser/test_e004.c index 8f5a4a11..a162f545 100644 --- a/test_pool/exerciser/test_e004.c +++ b/test_pool/exerciser/test_e004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,7 +27,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 4) #define TEST_DESC "Generate MSI(X) interrupts " - +#define TEST_RULE "PCI_MSI_2,ITS_DEV_6" static uint32_t irq_pending; static uint32_t lpi_int_id = 0x204C; @@ -191,15 +191,15 @@ e004_entry (void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* Get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e005.c b/test_pool/exerciser/test_e005.c index 0b757fa7..a1ae015a 100644 --- a/test_pool/exerciser/test_e005.c +++ b/test_pool/exerciser/test_e005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,6 +29,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 5) #define TEST_DESC "Generate PASID PCIe transactions " +#define TEST_RULE "PCI_PAS_1, RE_SMU_4" #define TEST_DATA_NUM_PAGES 2 #define TEST_DATA 0xDE @@ -393,14 +394,14 @@ e005_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e006.c b/test_pool/exerciser/test_e006.c index 56f752af..3ab40bb2 100644 --- a/test_pool/exerciser/test_e006.c +++ b/test_pool/exerciser/test_e006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 6) #define TEST_DESC "Generate PCIe legacy interrupts " +#define TEST_RULE "PCI_LI_02" static uint32_t instance; static uint32_t e_intr_line; @@ -188,15 +189,15 @@ e006_entry (void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* Get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e007.c b/test_pool/exerciser/test_e007.c index 7f8bff71..3e86013e 100644 --- a/test_pool/exerciser/test_e007.c +++ b/test_pool/exerciser/test_e007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -45,6 +45,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 7) #define TEST_DESC "Check PCI Express I/O Coherency " +#define TEST_RULE "PCI_IC_01, PCI_IC_03, PCI_IC_06, PCI_IC_07, PCI_IC_08" #define TEST_DATA_BLK_SIZE (4*1024) #define KNOWN_DATA 0xDE @@ -234,15 +235,15 @@ e007_entry (void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* Get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e008.c b/test_pool/exerciser/test_e008.c index b54d0134..71b28a1d 100644 --- a/test_pool/exerciser/test_e008.c +++ b/test_pool/exerciser/test_e008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,6 +27,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 8) #define TEST_DESC "Check BME functionality of RP " +#define TEST_RULE "" #define TEST_DATA_NUM_PAGES 1 @@ -195,14 +196,14 @@ e008_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e009.c b/test_pool/exerciser/test_e009.c index c3be7156..87781a80 100644 --- a/test_pool/exerciser/test_e009.c +++ b/test_pool/exerciser/test_e009.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,7 +27,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 9) #define TEST_DESC "Check RP Sec Bus transactions are TYPE0" - +#define TEST_RULE "PCI_IN_11" static void @@ -102,14 +102,14 @@ e009_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e010.c b/test_pool/exerciser/test_e010.c index 42bf5042..aae1d14e 100644 --- a/test_pool/exerciser/test_e010.c +++ b/test_pool/exerciser/test_e010.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,6 +27,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 10) #define TEST_DESC "Check RP Sub Bus transactions are TYPE1" +#define TEST_RULE "PCI_IN_10" #define MAX_BUS 255 #define BUS_SHIFT 16 @@ -196,14 +197,14 @@ e010_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e011.c b/test_pool/exerciser/test_e011.c index 0227766e..adbc02aa 100644 --- a/test_pool/exerciser/test_e011.c +++ b/test_pool/exerciser/test_e011.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,6 +29,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 11) #define TEST_DESC "ATS Functionality Check " +#define TEST_RULE "" #define TEST_DATA_NUM_PAGES 1 #define TEST_DATA 0xDE @@ -330,14 +331,14 @@ e011_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e012.c b/test_pool/exerciser/test_e012.c index 934bfd85..bf5a76a0 100644 --- a/test_pool/exerciser/test_e012.c +++ b/test_pool/exerciser/test_e012.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,6 +28,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 12) #define TEST_DESC "Check P2P ACS Functionality " +#define TEST_RULE "PCI_PP_04" static uint32_t @@ -309,14 +310,14 @@ e012_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e013.c b/test_pool/exerciser/test_e013.c index 952ff810..57fe8645 100644 --- a/test_pool/exerciser/test_e013.c +++ b/test_pool/exerciser/test_e013.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,6 +29,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 13) #define TEST_DESC "Check ACS Redirected Req Valid " +#define TEST_RULE "PCI_PP_04" static uint32_t @@ -462,14 +463,14 @@ e013_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e014.c b/test_pool/exerciser/test_e014.c index acab46ca..17fd3851 100644 --- a/test_pool/exerciser/test_e014.c +++ b/test_pool/exerciser/test_e014.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,6 +35,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 14) #define TEST_DESC "Check PCIe Software Coherency " +#define TEST_RULE "PCI_IC_04, RE_ORD_4" #define TEST_DATA_BLK_SIZE (4*1024) #define NEW_DATA 0xAD @@ -219,16 +220,16 @@ e014_entry (void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* Get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e015.c b/test_pool/exerciser/test_e015.c index b9b1a20f..eb704c43 100644 --- a/test_pool/exerciser/test_e015.c +++ b/test_pool/exerciser/test_e015.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,6 +27,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 15) #define TEST_DESC "Arrival order & Gathering Check " +#define TEST_RULE "PCI_IC_05, RE_ORD_1, RE_ORD_2" /* 0 means read transction, 1 means write transaction */ static uint32_t transaction_order[] = {1, 1, 0, 1, 0, 0, 0, 0}; @@ -342,14 +343,14 @@ e015_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/exerciser/test_e016.c b/test_pool/exerciser/test_e016.c index 1923ed3e..05637f11 100644 --- a/test_pool/exerciser/test_e016.c +++ b/test_pool/exerciser/test_e016.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,7 +27,7 @@ #define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 16) #define TEST_DESC "ARI forwarding Rule " - +#define TEST_RULE "PCI_IN_17" static void @@ -184,14 +184,14 @@ e016_entry(void) uint32_t num_pe = 1; uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* Get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/gic/test_g001.c b/test_pool/gic/operating_system/test_g001.c similarity index 84% rename from test_pool/gic/test_g001.c rename to test_pool/gic/operating_system/test_g001.c index c9804b9c..f346f19a 100644 --- a/test_pool/gic/test_g001.c +++ b/test_pool/gic/operating_system/test_g001.c @@ -21,6 +21,7 @@ #include "val/include/sbsa_avs_gic.h" #define TEST_NUM (AVS_GIC_TEST_NUM_BASE + 1) +#define TEST_RULE "S_L3GI_01" #define TEST_DESC "Check GIC version " static @@ -35,7 +36,9 @@ payload(void) val_print(AVS_PRINT_INFO, "\n Received GIC version = %4d ", gic_version); if (gic_version < 3) { - val_print(AVS_PRINT_ERR, "\n GIC version is %3x ", gic_version); + val_print(AVS_PRINT_ERR, + "\n GIC version is %3x, expected GICv3 or higher version", + gic_version); val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); return; } @@ -52,15 +55,15 @@ g001_entry(uint32_t num_pe) num_pe = 1; //This GIC test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/gic/operating_system/test_g002.c b/test_pool/gic/operating_system/test_g002.c new file mode 100644 index 00000000..a749ffc0 --- /dev/null +++ b/test_pool/gic/operating_system/test_g002.c @@ -0,0 +1,121 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_gic.h" +#include "val/include/sbsa_avs_pe.h" + +#define TEST_NUM (AVS_GIC_TEST_NUM_BASE + 2) +#define TEST_RULE "S_L5PP_01" +#define TEST_DESC "Check Reserved PPI Assignments " + +/* PPI IDs 1056-1071 and 1088-1103 are reserved for future SBSA usage */ +#define IS_PPI_RESERVED(id) ((id > 1055 && id < 1072) || (id > 1087 && id < 1104)) + +static +void +payload() +{ + + uint32_t intid; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 5) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Check non-secure physical timer interrupt */ + intid = val_timer_get_info(TIMER_INFO_PHY_EL1_INTID, 0); + if (IS_PPI_RESERVED(intid)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + val_print(AVS_PRINT_ERR, "\n Interrupt ID is reserved for future SBSA usage ", 0); + return; + } + + /* Check non-secure virtual timer interrupt */ + intid = val_timer_get_info(TIMER_INFO_VIR_EL1_INTID, 0); + if (IS_PPI_RESERVED(intid)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + val_print(AVS_PRINT_ERR, "\n Interrupt ID is reserved for future SBSA usage ", 0); + return; + } + + /* Check for EL2 virtual timer interrupt */ + intid = val_timer_get_info(TIMER_INFO_VIR_EL2_INTID, 0); + if (IS_PPI_RESERVED(intid)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + val_print(AVS_PRINT_ERR, "\n Interrupt ID is reserved for future SBSA usage ", 0); + return; + } + + /* Check non-secure EL2 physical timer interrupt */ + intid = val_timer_get_info(TIMER_INFO_PHY_EL2_INTID, 0); + if (IS_PPI_RESERVED(intid)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + val_print(AVS_PRINT_ERR, "\n Interrupt ID is reserved for future SBSA usage ", 0); + return; + } + + /* Check GIC maintenance interrupt */ + intid = val_pe_get_gmain_gsiv(index); + if (IS_PPI_RESERVED(intid)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); + val_print(AVS_PRINT_ERR, "\n Interrupt ID is reserved for future SBSA usage ", 0); + return; + } + + /* Check Performance monitor interrupt */ + intid = val_pe_get_pmu_gsiv(index); + if (IS_PPI_RESERVED(intid)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 06)); + val_print(AVS_PRINT_ERR, "\n Interrupt ID is reserved for future SBSA usage ", 0); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + +} + +uint32_t +g002_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This GIC test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/gic/test_g002.c b/test_pool/gic/test_g002.c deleted file mode 100644 index 76d5189a..00000000 --- a/test_pool/gic/test_g002.c +++ /dev/null @@ -1,74 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_gic.h" -#include "val/include/sbsa_avs_pcie.h" - -#define TEST_NUM (AVS_GIC_TEST_NUM_BASE + 2) -#define TEST_DESC "If PCIe, then GIC implements ITS " - -static -void -payload(void) -{ - - uint32_t data; - uint32_t num_ecam = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - num_ecam = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (num_ecam != 0) { - data = val_gic_get_info(GIC_INFO_VERSION); - if (data < 2) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_gic_get_info(GIC_INFO_NUM_ITS); - - if (data == 0) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - //If PCIe is not present, just Pass the test - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -g002_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This GIC test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/gic/test_g003.c b/test_pool/gic/test_g003.c deleted file mode 100644 index 9ec07625..00000000 --- a/test_pool/gic/test_g003.c +++ /dev/null @@ -1,68 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_gic.h" - -#define TEST_NUM (AVS_GIC_TEST_NUM_BASE + 3) -#define TEST_DESC "GIC number of Security states(2) " - -static -void -payload(void) -{ - - uint32_t data; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_gic_get_info(GIC_INFO_VERSION); - if (data < 3) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 1)); - return; - } - - data = val_gic_get_info(GIC_INFO_SEC_STATES); - - if (data != 0) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); - return; - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 1)); -} - -uint32_t -g003_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This GIC test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/gic/test_g004.c b/test_pool/gic/test_g004.c deleted file mode 100644 index 890e4d71..00000000 --- a/test_pool/gic/test_g004.c +++ /dev/null @@ -1,98 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_common.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_gic.h" -#include "val/include/sbsa_avs_gic_support.h" - -#define TEST_NUM (AVS_GIC_TEST_NUM_BASE + 4) -#define TEST_DESC "GIC Maintenance Interrupt " - -static uint32_t int_id = 25; - -static -void -isr(void) -{ - uint32_t data; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - /* We received our interrupt, so disable Maintenance interrupt from generating further interrupts */ - data = val_gic_reg_read(ICH_HCR_EL2); - data &= ~0x7; - val_gic_reg_write(ICH_HCR_EL2, data); - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_print(AVS_PRINT_INFO, "\n Received GIC maintenance interrupt ", 0); - val_gic_end_of_interrupt(int_id); - - return; -} - -static -void -payload(void) -{ - - uint32_t data; - uint32_t timeout = 0x100000; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_gic_get_info(GIC_INFO_VERSION); - if (data < 3) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - val_gic_install_isr(int_id, isr); - - // Write to GIC registers which will generate Maintenance interrupt - data = val_gic_reg_read(ICH_HCR_EL2); - data |= 0x7; - val_gic_reg_write(ICH_HCR_EL2, data); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if(timeout == 0){ - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - return; -} - -uint32_t -g004_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This GIC test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i001.c b/test_pool/io_virt/test_i001.c deleted file mode 100644 index 387165a6..00000000 --- a/test_pool/io_virt/test_i001.c +++ /dev/null @@ -1,86 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 1) -#define TEST_DESC "Check 64KB Granularity support " - -static -void -payload(void) -{ - - uint64_t data; - uint32_t rev; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while (num_smmu--) - { - rev = val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu); - if (rev == 2) { - data = val_smmu_read_cfg(SMMUv2_IDR2, num_smmu); - if (!(data & BIT14)) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - - if (rev == 3) { - data = val_smmu_read_cfg(SMMUv3_IDR5, num_smmu); - if (!(data & BIT6)) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - -} - -uint32_t -i001_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i002.c b/test_pool/io_virt/test_i002.c deleted file mode 100644 index 3187fd9e..00000000 --- a/test_pool/io_virt/test_i002.c +++ /dev/null @@ -1,79 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 2) -#define TEST_DESC "All SMMUs have same Arch Revision " - -static -void -payload(void) -{ - - uint32_t num_smmu; - uint32_t smmuv2_flag = 0, smmuv3_flag = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while (num_smmu--) - { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - smmuv2_flag = 1; - } else { - smmuv3_flag = 1; - } - } - if ((smmuv2_flag) && (smmuv3_flag)) { - val_print(AVS_PRINT_ERR, "ALL SMMUs are not of the same Architecture version \n", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i002_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i004.c b/test_pool/io_virt/test_i004.c deleted file mode 100644 index 93f08580..00000000 --- a/test_pool/io_virt/test_i004.c +++ /dev/null @@ -1,88 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 4) -#define TEST_DESC "If PCIe, Check Stall model " - -static -void -payload(void) -{ - - uint64_t data; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_smmu_read_cfg(SMMUv3_IDR0, num_smmu); - if (((data >> 24) & 0x3) == 0x2) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - -} - -uint32_t -i004_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i005.c b/test_pool/io_virt/test_i005.c deleted file mode 100644 index 9d20f60a..00000000 --- a/test_pool/io_virt/test_i005.c +++ /dev/null @@ -1,76 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_iovirt.h" -#include "val/include/sbsa_avs_smmu.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 5) -#define TEST_DESC "SMMUv2 unique intr per ctxt bank " - -static -void -payload(void) -{ - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); - return; - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 3) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v3 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 2)); - return; - } - - if(!val_iovirt_check_unique_ctx_intid(num_smmu)) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); - return; - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 0)); -} - -uint32_t -i005_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i006.c b/test_pool/io_virt/test_i006.c deleted file mode 100644 index 84ad1bdd..00000000 --- a/test_pool/io_virt/test_i006.c +++ /dev/null @@ -1,69 +0,0 @@ -/** @file - * Copyright (c) 2016-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_iovirt.h" -#include "val/include/sbsa_avs_smmu.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 6) -#define TEST_DESC "Unique stream id for each req id " - -static -void -payload(void) -{ - int num_rc; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - num_rc = val_iovirt_get_pcie_rc_info(NUM_PCIE_RC, 0); - if(!num_rc) { - val_print(AVS_PRINT_ERR, "\n No Root Complex discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); - return; - } - while(num_rc--) { - if(!val_iovirt_unique_rid_strid_map(num_rc)) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); - break; - } - } - if(num_rc < 0) - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 0)); -} - - -uint32_t -i006_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i008.c b/test_pool/io_virt/test_i008.c deleted file mode 100644 index 982bc3c9..00000000 --- a/test_pool/io_virt/test_i008.c +++ /dev/null @@ -1,93 +0,0 @@ -/** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 8) -#define TEST_DESC "Check SMMU 16 Bit VMID Support " - -static -void -payload(void) -{ - - uint64_t data; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (g_sbsa_level < 6) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - - data = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR0, num_smmu), 18, 18); - - if (data != 1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i008_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i010.c b/test_pool/io_virt/test_i010.c deleted file mode 100644 index 43797626..00000000 --- a/test_pool/io_virt/test_i010.c +++ /dev/null @@ -1,135 +0,0 @@ -/** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 10) -#define TEST_DESC "Check SMMU Granule Support " - -static -void -payload(void) -{ - - uint64_t data; - uint64_t data_pe_mmfr0, data_smmu_idr5; - uint32_t is_gran4k = 0; - uint32_t is_gran64k = 0; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (g_sbsa_level < 6) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - data_pe_mmfr0 = val_pe_reg_read(ID_AA64MMFR0_EL1); - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - - data_smmu_idr5 = val_smmu_read_cfg(SMMUv3_IDR5, num_smmu); - - /* If PE Supports 4KB Gran, (TGran4 == 0) or (TGran4 == 0x1) - * or (TGran4_2 == 0x2) or (TGran4_2 == 0x3) */ - if (((VAL_EXTRACT_BITS(data_pe_mmfr0, 28, 31) == 0x0) || - (VAL_EXTRACT_BITS(data_pe_mmfr0, 28, 31) == 0x1)) || - ((VAL_EXTRACT_BITS(data_pe_mmfr0, 40, 43) == 0x2) || - (VAL_EXTRACT_BITS(data_pe_mmfr0, 40, 43) == 0x3))) { - is_gran4k = 1; - if (VAL_EXTRACT_BITS(data_smmu_idr5, 4, 4) != 1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - - /* If PE Supports 16KB Gran, (TGran16 == 0x1) or (TGran16 == 0x2) - * or (TGran16_2 == 0x2) or (TGran16_2 == 0x3) */ - if (((VAL_EXTRACT_BITS(data_pe_mmfr0, 20, 23) == 0x1) || - (VAL_EXTRACT_BITS(data_pe_mmfr0, 20, 23) == 0x2)) || - ((VAL_EXTRACT_BITS(data_pe_mmfr0, 32, 35) == 0x2) || - (VAL_EXTRACT_BITS(data_pe_mmfr0, 32, 35) == 0x3))) { - if (VAL_EXTRACT_BITS(data_smmu_idr5, 5, 5) != 1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - } - - /* If PE Supports 64KB Gran, (TGran64 == 0) or (TGran64_2 == 0x2) */ - if ((VAL_EXTRACT_BITS(data_pe_mmfr0, 24, 27) == 0x0) || - (VAL_EXTRACT_BITS(data_pe_mmfr0, 36, 39) == 0x2)) { - is_gran64k = 1; - if (VAL_EXTRACT_BITS(data_smmu_idr5, 6, 6) != 1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); - return; - } - } - - /* If 4K & 64K Granule Not Supported */ - if (!(is_gran4k && is_gran64k)) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); - return; - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i010_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i011.c b/test_pool/io_virt/test_i011.c deleted file mode 100644 index e88fe85a..00000000 --- a/test_pool/io_virt/test_i011.c +++ /dev/null @@ -1,105 +0,0 @@ -/** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 11) -#define TEST_DESC "Check Large Virtual Addr Support " - -static -void -payload(void) -{ - - uint64_t data; - uint64_t data_va_range, data_vax; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (g_sbsa_level < 6) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - data_va_range = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR2_EL1), 16, 19); - if (data_va_range == 0) { - val_print(AVS_PRINT_WARN, "\n Large VA Not Supported by PE ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 05)); - return; - } - - data_vax = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR5, num_smmu), 10, 11); - - /* If PE Supports Large VA Range then SMMU_IDR5.VAX = 0b01 */ - if (data_va_range == 1) { - if (data_vax != 1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i011_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i012.c b/test_pool/io_virt/test_i012.c deleted file mode 100644 index 711c2d0a..00000000 --- a/test_pool/io_virt/test_i012.c +++ /dev/null @@ -1,100 +0,0 @@ -/** @file - * Copyright (c) 2020-2022, Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 12) -#define TEST_DESC "Check SMMU 52 Bit OAS Support " - -static -void -payload(void) -{ - - uint64_t data; - uint64_t data_pa_range, data_oas; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - data_pa_range = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR0_EL1), 0, 3); - if (data_pa_range != 0x6) { - val_print(AVS_PRINT_WARN, "\n Large PA Not Supported by PE ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 05)); - return; - } - - data_oas = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR5, num_smmu), 0, 2); - - /* If PE Supports Large PA then SMMU_IDR5.OAS = 0b110 */ - if (data_pa_range == 0x6) { - if (data_oas != 0x6) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i012_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i015.c b/test_pool/io_virt/test_i015.c deleted file mode 100644 index 4fc8c5ce..00000000 --- a/test_pool/io_virt/test_i015.c +++ /dev/null @@ -1,107 +0,0 @@ -/** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 15) -#define TEST_DESC "Check SMMU Endianess Support " - -static -void -payload(void) -{ - - uint64_t data; - uint64_t data_pe_endian; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (g_sbsa_level < 6) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - /* Check the current endianness setting of SCTLR.EE */ - if (val_pe_reg_read(CurrentEL) == AARCH64_EL2) { - data_pe_endian = VAL_EXTRACT_BITS(val_pe_reg_read(SCTLR_EL2), 25, 25); - } else if (val_pe_reg_read(CurrentEL) == AARCH64_EL1) { - data_pe_endian = VAL_EXTRACT_BITS(val_pe_reg_read(SCTLR_EL1), 25, 25); - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - - data = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR0, num_smmu), 21, 22); - - if ((data_pe_endian == 1) && ((data == 1) || (data == 2))) { - /* If PE supports big endian */ - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } else if ((data_pe_endian == 0) && ((data == 1) || (data == 3))) { - /* If PE supports little endian */ - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i015_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i016.c b/test_pool/io_virt/test_i016.c deleted file mode 100644 index 84e124c2..00000000 --- a/test_pool/io_virt/test_i016.c +++ /dev/null @@ -1,105 +0,0 @@ -/** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_smmu.h" -#include "val/include/sbsa_avs_pcie.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 16) -#define TEST_DESC "Check SMMU DVM Capability Support " - -static -void -payload(void) -{ - - uint64_t data; - uint64_t data_pe_tlb, data_ril; - uint32_t num_smmu; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (g_sbsa_level < 6) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); - - if (num_smmu == 0) { - val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - data_pe_tlb = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ISAR0_EL1), 56, 59); - if (data_pe_tlb != 0x2) { - val_print(AVS_PRINT_WARN, "\n TLB Range Invalid Not Supported ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - - while (num_smmu--) { - if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { - val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 05)); - return; - } - - data_ril = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR3, num_smmu), 10, 10); - - /* If PE TLB Range Invalidation then SMMU_IDR3.RIL = 0b1 */ - if (data_pe_tlb == 0x2) { - if (data_ril != 0x1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -uint32_t -i016_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/memory_map/operating_system/test_m001.c b/test_pool/memory_map/operating_system/test_m001.c new file mode 100644 index 00000000..670fa181 --- /dev/null +++ b/test_pool/memory_map/operating_system/test_m001.c @@ -0,0 +1,77 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_peripherals.h" +#include "val/include/sbsa_avs_memory.h" + +#define TEST_NUM (AVS_MEM_MAP_TEST_NUM_BASE + 1) +#define TEST_RULE "S_L3MM_01, S_L3MM_02" +#define TEST_DESC "Check peripherals addr 64Kb apart " + +static void payload(void) +{ + uint32_t pe_index; + uint32_t peri_index, peri_index1; + uint64_t peri_count, addr_diff; + uint64_t peri_addr1, peri_addr2; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + peri_count = val_peripheral_get_info(NUM_ALL, 0); + + /* check whether all peripheral base addresses are 64KB apart from each other */ + for (peri_index = 0 ; peri_index < peri_count; peri_index++) { + for (peri_index1 = peri_index + 1; peri_index1 < peri_count; peri_index1++) { + + peri_addr1 = val_peripheral_get_info(ANY_BASE0, peri_index); + peri_addr2 = val_peripheral_get_info(ANY_BASE0, peri_index1); + + addr_diff = (peri_addr1 > peri_addr2) ? + peri_addr1 - peri_addr2 : peri_addr2 - peri_addr1; + + if (addr_diff < MEM_SIZE_64KB) { + val_print(AVS_PRINT_ERR, + "\n Peripheral base addresses isn't atleast 64Kb apart", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + } + } + + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t m001_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + /* run on single PE */ + num_pe = 1; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/nist_sts/test_n001.c b/test_pool/nist_sts/test_n001.c index d61b2f67..b0939fe3 100644 --- a/test_pool/nist_sts/test_n001.c +++ b/test_pool/nist_sts/test_n001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,6 +25,7 @@ #include "val/include/sbsa_avs_nist.h" #define TEST_NUM (AVS_NIST_TEST_NUM_BASE + 1) +#define TEST_RULE "S_L7ENT_1" #define TEST_DESC "NIST Statistical Test Suite \n " #define BUFFER_SIZE 1000 @@ -261,15 +262,15 @@ n001_entry(uint32_t num_pe) num_pe = 1; //This NIST test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ -// status = val_check_for_error(TEST_NUM, num_pe); +// status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); -// val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); +// val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p001.c b/test_pool/pcie/test_p001.c index ffdbe6a8..6716a4f0 100644 --- a/test_pool/pcie/test_p001.c +++ b/test_pool/pcie/test_p001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 1) #define TEST_DESC "Check ECAM Presence " +#define TEST_RULE "PCI_IN_01" static void @@ -49,14 +50,14 @@ p001_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p002.c b/test_pool/pcie/test_p002.c index 9ddafb80..5fca846d 100644 --- a/test_pool/pcie/test_p002.c +++ b/test_pool/pcie/test_p002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 2) #define TEST_DESC "Check ECAM value in MCFG table " +#define TEST_RULE "" static void @@ -50,14 +51,14 @@ p002_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p003.c b/test_pool/pcie/test_p003.c index d47bfbf0..b311f3ae 100644 --- a/test_pool/pcie/test_p003.c +++ b/test_pool/pcie/test_p003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 3) #define TEST_DESC "Check ECAM Memory accessibility " +#define TEST_RULE "PCI_IN_02" static void *branch_to_test; @@ -173,14 +174,14 @@ p003_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p005.c b/test_pool/pcie/test_p005.c index fe03169c..b7c57ef4 100644 --- a/test_pool/pcie/test_p005.c +++ b/test_pool/pcie/test_p005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ /* SBSA-checklist 63 & 64 */ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 5) #define TEST_DESC "PCIe Unaligned access, Norm mem " +#define TEST_RULE "PCI_MM_01, PCI_MM_02, PCI_MM_03, RE_BAR_2" #define DATA 0xC0DECAFE @@ -246,14 +247,14 @@ p005_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p006.c b/test_pool/pcie/test_p006.c index 2e1e4d0d..a5b2e38b 100644 --- a/test_pool/pcie/test_p006.c +++ b/test_pool/pcie/test_p006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 6) #define TEST_DESC "No extra addr translation - SMMU " +#define TEST_RULE "PCI_MM_05, PCI_MM_06, PCI_MM_07" /* For all DMA masters populated in the Info table, which are behind an SMMU, @@ -104,14 +105,14 @@ p006_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p007.c b/test_pool/pcie/test_p007.c index ad7163a8..aade0baf 100644 --- a/test_pool/pcie/test_p007.c +++ b/test_pool/pcie/test_p007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 7) #define TEST_DESC "Check MSI support for PCIe device " +#define TEST_RULE "PCI_MSI_01" static void @@ -74,14 +75,14 @@ p007_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p008.c b/test_pool/pcie/test_p008.c index 109cb286..11dd74de 100644 --- a/test_pool/pcie/test_p008.c +++ b/test_pool/pcie/test_p008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 8) #define TEST_DESC "Check MSI(X) vectors uniqueness " +#define TEST_RULE "" /** @brief Returns MSI(X) status of the device @@ -193,15 +194,15 @@ p008_entry (uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p009.c b/test_pool/pcie/test_p009.c deleted file mode 100644 index 6aa712d4..00000000 --- a/test_pool/pcie/test_p009.c +++ /dev/null @@ -1,147 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_pcie.h" -#include "val/include/sbsa_avs_memory.h" - -#define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 9) -#define TEST_DESC "Check all MSI(X) vectors are LPIs " - -#define LPI_BASE 8192 - -/** - @brief Returns MSI(X) status of the device - - @param dev_index index of PCI device - - @return 0 device does not support MSI(X) - @return 1 device supports MSI(X) -**/ -static -uint32_t -check_msi_status (uint32_t dev_index) { - uint32_t data; - - data = val_peripheral_get_info (ANY_FLAGS, dev_index); - - if ((data & PER_FLAG_MSI_ENABLED) && - val_peripheral_get_info (ANY_GSIV, dev_index)) { - return 1; - } - - return 0; -} - -/** - @brief Free memory allocated for a list of MSI(X) vectors - - @param list pointer to a list of MSI(X) vectors -**/ -static -void -clean_msi_list (PERIPHERAL_VECTOR_LIST *list) -{ - PERIPHERAL_VECTOR_LIST *next_node; - PERIPHERAL_VECTOR_LIST *current_node; - - current_node = list; - while (current_node != NULL) { - next_node = current_node->next; - val_memory_free (current_node); - current_node = next_node; - } -} - -static -void -payload (void) -{ - - uint32_t count = val_peripheral_get_info (NUM_ALL, 0); - uint32_t index = val_pe_get_index_mpid (val_pe_get_mpid()); - uint8_t status; - PERIPHERAL_VECTOR_LIST *dev_mvec, *mvec; - uint64_t dev_bdf; - uint32_t test_skip = 1; - - if(!count) { - val_set_status (index, RESULT_SKIP (g_sbsa_level, TEST_NUM, 2)); - return; - } - - status = 0; - dev_mvec = NULL; - - /* - Pull each discovered PCI device and its list of MSI(X) vectors. - Check whether every vector IRQ number is an LPI or not. - */ - while (count > 0 && !status) { - if (check_msi_status (count - 1)) { - /* Get BDF of a device */ - dev_bdf = val_peripheral_get_info (ANY_BDF, count - 1); - if (dev_bdf) { - val_print (AVS_PRINT_INFO, " Checking PCI device with BDF %4X\n", dev_bdf); - /* Read MSI(X) vectors */ - if (val_get_msi_vectors (dev_bdf, &dev_mvec)) { - test_skip = 0; - mvec = dev_mvec; - while(mvec) { - if(mvec->vector.vector_irq_base < LPI_BASE) { - val_print(AVS_PRINT_INFO, " MSI vector irq %d is not an LPI\n", mvec->vector.vector_irq_base); - val_set_status (index, RESULT_FAIL (g_sbsa_level, TEST_NUM, mvec->vector.vector_irq_base)); - status = 1; - } - mvec = mvec->next; - } - clean_msi_list (dev_mvec); - } - } - } - count--; - } - - if (test_skip) { - val_print(AVS_PRINT_ERR, "\n No MSI vectors found ", 0); - val_set_status (index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 0)); - } else if (!status) { - val_set_status (index, RESULT_PASS(g_sbsa_level, TEST_NUM, 0)); - } -} - -uint32_t -p009_entry (uint32_t num_pe) -{ - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) { - val_run_test_payload (TEST_NUM, num_pe, payload, 0); - } - - /* get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); - - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/pcie/test_p010.c b/test_pool/pcie/test_p010.c index 709a925c..930feb16 100644 --- a/test_pool/pcie/test_p010.c +++ b/test_pool/pcie/test_p010.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2019, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 10) #define TEST_DESC "PASID support atleast 16 bits " +#define TEST_RULE "PCI_PAS_1" #define MIN_PASID_SUPPORT 16 @@ -85,14 +86,14 @@ p010_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p011.c b/test_pool/pcie/test_p011.c index f188932b..446fa457 100644 --- a/test_pool/pcie/test_p011.c +++ b/test_pool/pcie/test_p011.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 11) #define TEST_DESC "PCIe RC & PE, Same Inner SH Domain" +#define TEST_RULE "PCI_IC_02" #define INNER_SHAREABLE 1 @@ -64,14 +65,14 @@ p011_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p012.c b/test_pool/pcie/test_p012.c index 291f32a9..e991cdcc 100644 --- a/test_pool/pcie/test_p012.c +++ b/test_pool/pcie/test_p012.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 12) #define TEST_DESC "PCI legacy interrupt SPI ID unique" +#define TEST_RULE "PCI_LI_02" static inline char pin_name(int pin) { @@ -155,15 +156,15 @@ p012_entry (uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p013.c b/test_pool/pcie/test_p013.c index d7fcec32..657ebf70 100644 --- a/test_pool/pcie/test_p013.c +++ b/test_pool/pcie/test_p013.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 13) #define TEST_DESC "Addressability of Non-Sec masters " +#define TEST_RULE "B_MEM_03, B_MEM_04, B_MEM_06" #define BAR_64BIT_SUPPORT 0x2 #define ADDR_TYPE_MASK 0x6 @@ -92,15 +93,15 @@ p013_entry (uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p014.c b/test_pool/pcie/test_p014.c index b0acae0d..8e2a9930 100644 --- a/test_pool/pcie/test_p014.c +++ b/test_pool/pcie/test_p014.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 14) #define TEST_DESC "Memory attributes of DMA traffic " +#define TEST_RULE "B_PER_09, B_PER_10" /* For all DMA masters populated in the Info table, which are behind an SMMU, @@ -102,14 +103,14 @@ p014_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p015.c b/test_pool/pcie/test_p015.c index af14ee8a..355276cb 100644 --- a/test_pool/pcie/test_p015.c +++ b/test_pool/pcie/test_p015.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 15) #define TEST_DESC "PCIe No Snoop transaction attr " +#define TEST_RULE "" static void @@ -84,15 +85,15 @@ p015_entry (uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test (TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) { val_run_test_payload (TEST_NUM, num_pe, payload, 0); } /* get the result from all PE and check for failure */ - status = val_check_for_error (TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status (0, SBSA_AVS_END (g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p016.c b/test_pool/pcie/test_p016.c index 9b3e3bde..7dad0f2a 100644 --- a/test_pool/pcie/test_p016.c +++ b/test_pool/pcie/test_p016.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018,2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 16) #define TEST_DESC "NP type-1 pcie only support 32-bit" +#define TEST_RULE "PCI_MM_04" #define BAR0 0x10 @@ -99,13 +100,13 @@ uint32_t p016_entry(uint32_t num_pe) /* This test is run on single processor */ num_pe = 1; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p017.c b/test_pool/pcie/test_p017.c index 20662734..94d97022 100644 --- a/test_pool/pcie/test_p017.c +++ b/test_pool/pcie/test_p017.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 17) #define TEST_DESC "Root port must implement minimal ACS features if P2P supported" +#define TEST_RULE "PCI_PP_04" static void payload(void) { @@ -110,13 +111,13 @@ uint32_t p017_entry(uint32_t num_pe) /* This test is run on single processor */ num_pe = 1; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p018.c b/test_pool/pcie/test_p018.c index c7c555f3..fb2f1a02 100644 --- a/test_pool/pcie/test_p018.c +++ b/test_pool/pcie/test_p018.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 18) #define TEST_DESC "All switches must implement minimal ACS features if P2P supported" +#define TEST_RULE "" static void payload(void) { @@ -115,13 +116,13 @@ uint32_t p018_entry(uint32_t num_pe) /* This test is run on single processor */ num_pe = 1; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p019.c b/test_pool/pcie/test_p019.c index ac0e4fe2..715e701a 100644 --- a/test_pool/pcie/test_p019.c +++ b/test_pool/pcie/test_p019.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 19) #define TEST_DESC "Multifunction devices must implement minimal ACS features if P2P supported" +#define TEST_RULE "" static void payload(void) { @@ -109,13 +110,13 @@ uint32_t p019_entry(uint32_t num_pe) /* This test is run on single processor */ num_pe = 1; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p020.c b/test_pool/pcie/test_p020.c index 7662bb61..c861d0d9 100644 --- a/test_pool/pcie/test_p020.c +++ b/test_pool/pcie/test_p020.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 20) #define TEST_DESC "Check Type 0/1 common config rules" +#define TEST_RULE "RE_REG_1, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p020_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p021.c b/test_pool/pcie/test_p021.c index 39ff953b..0de30bfc 100644 --- a/test_pool/pcie/test_p021.c +++ b/test_pool/pcie/test_p021.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 21) #define TEST_DESC "Check Type 0 config header rules " +#define TEST_RULE "RE_REG_1, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p021_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p022.c b/test_pool/pcie/test_p022.c index 81af76a6..0540107c 100644 --- a/test_pool/pcie/test_p022.c +++ b/test_pool/pcie/test_p022.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 22) #define TEST_DESC "Check Type 1 config header rules " +#define TEST_RULE "RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p022_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p023.c b/test_pool/pcie/test_p023.c index c4d13384..fc8ccc26 100644 --- a/test_pool/pcie/test_p023.c +++ b/test_pool/pcie/test_p023.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 23) #define TEST_DESC "Check PCIe capability rules " +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p023_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p024.c b/test_pool/pcie/test_p024.c index 3a40420c..dba62c90 100644 --- a/test_pool/pcie/test_p024.c +++ b/test_pool/pcie/test_p024.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 24) #define TEST_DESC "Check Device capabilites reg rules" +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p024_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p025.c b/test_pool/pcie/test_p025.c index 663baefd..f7e2876e 100644 --- a/test_pool/pcie/test_p025.c +++ b/test_pool/pcie/test_p025.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 25) #define TEST_DESC "Check Device Control register rule" +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p025_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p026.c b/test_pool/pcie/test_p026.c index 858d2722..3964885a 100644 --- a/test_pool/pcie/test_p026.c +++ b/test_pool/pcie/test_p026.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 26) #define TEST_DESC "Check Device cap 2 register rules " +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p026_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p027.c b/test_pool/pcie/test_p027.c index 0004be71..abcbf5ba 100644 --- a/test_pool/pcie/test_p027.c +++ b/test_pool/pcie/test_p027.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 27) #define TEST_DESC "Check Device control 2 reg rules " +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p027_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p028.c b/test_pool/pcie/test_p028.c index b53b1f4a..81a3c52f 100644 --- a/test_pool/pcie/test_p028.c +++ b/test_pool/pcie/test_p028.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 28) #define TEST_DESC "Check Power management cap rules " +#define TEST_RULE "RE_REG_2, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p028_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p029.c b/test_pool/pcie/test_p029.c index e6b09c9b..90f70603 100644 --- a/test_pool/pcie/test_p029.c +++ b/test_pool/pcie/test_p029.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,6 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 29) #define TEST_DESC "Check Power management/status rule" +#define TEST_RULE "RE_REG_2, RE_REC_1, RE_REC_2" static void @@ -54,14 +55,14 @@ p029_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p030.c b/test_pool/pcie/test_p030.c index b8eec745..917e81cc 100644 --- a/test_pool/pcie/test_p030.c +++ b/test_pool/pcie/test_p030.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 30) #define TEST_DESC "Check Cmd Reg memory space enable " +#define TEST_RULE "RE_REC_1, RE_REC_2" static void *branch_to_test; @@ -168,14 +169,14 @@ p030_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p031.c b/test_pool/pcie/test_p031.c index eb58a4e4..8b9f174d 100644 --- a/test_pool/pcie/test_p031.c +++ b/test_pool/pcie/test_p031.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 31) #define TEST_DESC "Check Type0/1 BIST Register rule " +#define TEST_RULE "RE_REC_1, RE_REC_2" static void @@ -85,14 +86,14 @@ p031_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p032.c b/test_pool/pcie/test_p032.c index 96007626..5860d10d 100644 --- a/test_pool/pcie/test_p032.c +++ b/test_pool/pcie/test_p032.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 32) #define TEST_DESC "Check HDR CapPtr Register rule " +#define TEST_RULE "RE_REC_1, RE_REC_2" static void @@ -82,14 +83,14 @@ p032_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p033.c b/test_pool/pcie/test_p033.c index 28955f13..76416427 100644 --- a/test_pool/pcie/test_p033.c +++ b/test_pool/pcie/test_p033.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 33) #define TEST_DESC "Check Max payload size supported " +#define TEST_RULE "RE_REC_1, RE_REC_2" static void @@ -86,14 +87,14 @@ p033_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p034.c b/test_pool/pcie/test_p034.c index 43d9ac14..4843701f 100644 --- a/test_pool/pcie/test_p034.c +++ b/test_pool/pcie/test_p034.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 34) #define TEST_DESC "Check BAR memory space & Type rule" +#define TEST_RULE "RE_BAR_3" static void @@ -122,14 +123,14 @@ p034_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p035.c b/test_pool/pcie/test_p035.c index 49d5cee2..290cd062 100644 --- a/test_pool/pcie/test_p035.c +++ b/test_pool/pcie/test_p035.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 35) #define TEST_DESC "Check Function level reset rule " +#define TEST_RULE "RE_RST_1, PCI_SM_02" static uint32_t is_flr_failed(uint32_t bdf) @@ -186,14 +187,14 @@ p035_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p036.c b/test_pool/pcie/test_p036.c index 8f036f76..6e94464b 100644 --- a/test_pool/pcie/test_p036.c +++ b/test_pool/pcie/test_p036.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 36) #define TEST_DESC "Check ARI forwarding support rule " +#define TEST_RULE "PCI_IN_17" static void @@ -95,14 +96,14 @@ p036_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p037.c b/test_pool/pcie/test_p037.c index 27d31c1a..d75d5943 100644 --- a/test_pool/pcie/test_p037.c +++ b/test_pool/pcie/test_p037.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 37) #define TEST_DESC "Check OBFF supported rule " +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -101,14 +102,14 @@ p037_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p038.c b/test_pool/pcie/test_p038.c index ec070c24..9357124a 100644 --- a/test_pool/pcie/test_p038.c +++ b/test_pool/pcie/test_p038.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 38) #define TEST_DESC "Check CTRS and CTDS rule " +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -109,14 +110,14 @@ p038_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p039.c b/test_pool/pcie/test_p039.c index 58438ee8..c8023dca 100644 --- a/test_pool/pcie/test_p039.c +++ b/test_pool/pcie/test_p039.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 39) #define TEST_DESC "Check i-EP atomicop rule " +#define TEST_RULE "RE_REG_3, RE_REC_1, RE_REC_2" static void @@ -116,14 +117,14 @@ p039_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p040.c b/test_pool/pcie/test_p040.c index 6c30d706..b9429c01 100644 --- a/test_pool/pcie/test_p040.c +++ b/test_pool/pcie/test_p040.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 40) #define TEST_DESC "Check Rootport ATS and PRI rule " +#define TEST_RULE "IE_SMU_1, IE_SMU_2" static void @@ -82,14 +83,14 @@ p040_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p041.c b/test_pool/pcie/test_p041.c index 804d28c7..eb6443b7 100644 --- a/test_pool/pcie/test_p041.c +++ b/test_pool/pcie/test_p041.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 41) #define TEST_DESC "Check MSI and MSI-X support rule " +#define TEST_RULE "RE_INT_1, IE_INT_1" static void @@ -97,14 +98,14 @@ p041_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p042.c b/test_pool/pcie/test_p042.c index 62f1a369..bf736672 100644 --- a/test_pool/pcie/test_p042.c +++ b/test_pool/pcie/test_p042.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 42) #define TEST_DESC "Check Power Management rules " +#define TEST_RULE "RE_PWR_1" static void @@ -78,14 +79,14 @@ p042_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p043.c b/test_pool/pcie/test_p043.c index 8b4c0d76..2d2e6dca 100644 --- a/test_pool/pcie/test_p043.c +++ b/test_pool/pcie/test_p043.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,6 +25,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 43) #define TEST_DESC "Check ARI forwarding enable rule " +#define TEST_RULE "PCI_IN_17" static void @@ -124,14 +125,14 @@ p043_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p044.c b/test_pool/pcie/test_p044.c index 61198029..45c14bfc 100644 --- a/test_pool/pcie/test_p044.c +++ b/test_pool/pcie/test_p044.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 44) #define TEST_DESC "Check device under RP in same ECAM" +#define TEST_RULE "PCI_IN_04" static uint8_t func_ecam_is_rp_ecam(uint32_t dsf_bdf) @@ -139,14 +140,14 @@ p044_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p045.c b/test_pool/pcie/test_p045.c index 9fcfa9c7..410cc88e 100644 --- a/test_pool/pcie/test_p045.c +++ b/test_pool/pcie/test_p045.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 45) #define TEST_DESC "Check all RP in HB is in same ECAM" +#define TEST_RULE "PCI_IN_03" static @@ -110,14 +111,14 @@ p045_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p046.c b/test_pool/pcie/test_p046.c index 5c7324d8..ca813683 100644 --- a/test_pool/pcie/test_p046.c +++ b/test_pool/pcie/test_p046.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 46) #define TEST_DESC "Check RP Byte Enable Rules " +#define TEST_RULE "PCI_IN_18" static void @@ -146,14 +147,14 @@ p046_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p047.c b/test_pool/pcie/test_p047.c index 0fde1636..ebb9ec05 100644 --- a/test_pool/pcie/test_p047.c +++ b/test_pool/pcie/test_p047.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 47) #define TEST_DESC "Check Config Txn for RP in HB " +#define TEST_RULE "PCI_IN_12" static void @@ -101,14 +102,14 @@ p047_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p048.c b/test_pool/pcie/test_p048.c index 3f3effe1..73d382bf 100644 --- a/test_pool/pcie/test_p048.c +++ b/test_pool/pcie/test_p048.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 48) #define TEST_DESC "Check RootPort NP Memory Access " +#define TEST_RULE "PCI_IN_13" #define KNOWN_DATA 0xABABABAB @@ -183,7 +184,7 @@ payload(void) * Write known value to an address which is in range * Base + offset should always be in the range. * Read the same - */ + */ old_value = (*(volatile uint32_t *)(mem_base + mem_offset)); *(volatile uint32_t *)(mem_base + mem_offset) = KNOWN_DATA; @@ -265,14 +266,14 @@ p048_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p049.c b/test_pool/pcie/test_p049.c index 639bfe5c..859df040 100644 --- a/test_pool/pcie/test_p049.c +++ b/test_pool/pcie/test_p049.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 49) #define TEST_DESC "Check RootPort P Memory Access " +#define TEST_RULE "PCI_IN_13" #define KNOWN_DATA 0xABABABAB @@ -296,14 +297,14 @@ p049_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p050.c b/test_pool/pcie/test_p050.c index 1ed9a208..6e284069 100644 --- a/test_pool/pcie/test_p050.c +++ b/test_pool/pcie/test_p050.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 50) #define TEST_DESC "Check L-Intr SPI Level-Sensitive " +#define TEST_RULE "PCI_LI_01, PCI_LI_03" static void @@ -109,14 +110,14 @@ p050_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p051.c b/test_pool/pcie/test_p051.c index c3da5707..25187c46 100644 --- a/test_pool/pcie/test_p051.c +++ b/test_pool/pcie/test_p051.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 51) #define TEST_DESC "Check Sec Bus Reset For iEP_RP " +#define TEST_RULE "IE_RST_2" static uint32_t @@ -235,14 +236,14 @@ p051_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p052.c b/test_pool/pcie/test_p052.c index 7a73fd07..a1e6c851 100644 --- a/test_pool/pcie/test_p052.c +++ b/test_pool/pcie/test_p052.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 52) #define TEST_DESC "Check ATS Support Rule " +#define TEST_RULE "RE_SMU_2" static void @@ -91,14 +92,14 @@ p052_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p053.c b/test_pool/pcie/test_p053.c index 70e3400d..cd026a1b 100644 --- a/test_pool/pcie/test_p053.c +++ b/test_pool/pcie/test_p053.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 53) #define TEST_DESC "Check RootPort P2P Support " +#define TEST_RULE "PCI_PP_04" static void @@ -136,14 +137,14 @@ p053_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p054.c b/test_pool/pcie/test_p054.c index d87938e3..41a73d06 100644 --- a/test_pool/pcie/test_p054.c +++ b/test_pool/pcie/test_p054.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 54) #define TEST_DESC "Check RP Adv Error Report Support " +#define TEST_RULE "PCI_PP_04" static void @@ -100,14 +101,14 @@ p054_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p055.c b/test_pool/pcie/test_p055.c index faea79fe..07f0e601 100644 --- a/test_pool/pcie/test_p055.c +++ b/test_pool/pcie/test_p055.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 55) #define TEST_DESC "Check Direct Translated P2P Supp " +#define TEST_RULE "PCI_PP_05" static void @@ -102,14 +103,14 @@ p055_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p056.c b/test_pool/pcie/test_p056.c index 566f18fe..f93175b4 100644 --- a/test_pool/pcie/test_p056.c +++ b/test_pool/pcie/test_p056.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 56) #define TEST_DESC "Check iEP-RootPort P2P Support " +#define TEST_RULE "" static void @@ -157,14 +158,14 @@ p056_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p057.c b/test_pool/pcie/test_p057.c index d5f29b8b..fbfc0fff 100644 --- a/test_pool/pcie/test_p057.c +++ b/test_pool/pcie/test_p057.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ #include "val/include/sbsa_avs_memory.h" #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 57) +#define TEST_RULE "" #define TEST_DESC "Check RCiEP, iEP_EP P2P Supp " static @@ -39,7 +40,7 @@ payload(void) uint32_t test_skip = 1; uint32_t acs_data; uint32_t data; - uint8_t p2p_support_flag=0; + uint8_t p2p_support_flag = 0; pcie_device_bdf_table *bdf_tbl_ptr; pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); @@ -57,7 +58,7 @@ payload(void) if ((dp_type == RCiEP) || (dp_type == iEP_EP)) { /* Check if the EP Supports Multifunction */ - if(val_pcie_multifunction_support(bdf)) + if (val_pcie_multifunction_support(bdf)) continue; /* Check If Endpoint supports P2P with other Functions. */ @@ -118,14 +119,12 @@ p057_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p058.c b/test_pool/pcie/test_p058.c index 9c3475f5..75ac9a2a 100644 --- a/test_pool/pcie/test_p058.c +++ b/test_pool/pcie/test_p058.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 58) #define TEST_RULE "RE_BAR_1" -#define TEST_DESC "Read and write to RCiEP BAR reg " +#define TEST_DESC "Read and write to RCiEP BAR reg " #define TEST_DATA_1 0xDEADDAED #define TEST_DATA_2 0xABABABAB @@ -153,14 +153,14 @@ p058_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from the PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p059.c b/test_pool/pcie/test_p059.c index e27a880a..ffbaf1ff 100644 --- a/test_pool/pcie/test_p059.c +++ b/test_pool/pcie/test_p059.c @@ -92,14 +92,14 @@ p059_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pcie/test_p060.c b/test_pool/pcie/test_p060.c index 798cd5d0..a06be830 100644 --- a/test_pool/pcie/test_p060.c +++ b/test_pool/pcie/test_p060.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,7 @@ #define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 60) #define TEST_RULE "RE_PCI_1" -#define TEST_DESC "Check RCiEP Hdr type & link Cap " +#define TEST_DESC "Check RCiEP Hdr type & link Cap " static void @@ -89,14 +89,14 @@ p060_entry(uint32_t num_pe) num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from the PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c004.c b/test_pool/pe/operating_system/test_c001.c similarity index 90% rename from test_pool/pe/test_c004.c rename to test_pool/pe/operating_system/test_c001.c index 0e346001..4cd75470 100644 --- a/test_pool/pe/test_c004.c +++ b/test_pool/pe/operating_system/test_c001.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_val.h" #include "val/include/sbsa_avs_pe.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 04) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 01) +#define TEST_RULE "S_L3PE_01" #define TEST_DESC "Check PE Granule Support " static @@ -59,19 +60,19 @@ payload(void) } uint32_t -c004_entry(uint32_t num_pe) +c001_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c003.c b/test_pool/pe/operating_system/test_c002.c similarity index 85% rename from test_pool/pe/test_c003.c rename to test_pool/pe/operating_system/test_c002.c index da8cf328..3f29f05d 100644 --- a/test_pool/pe/test_c003.c +++ b/test_pool/pe/operating_system/test_c002.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_val.h" #include "val/include/sbsa_avs_pe.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 03) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 02) +#define TEST_RULE "S_L3PE_02" #define TEST_DESC "Check for 16-bit ASID support " static @@ -43,19 +44,19 @@ payload(void) @brief Read System register to verify 16-bit ASID support **/ uint32_t -c003_entry(uint32_t num_pe) +c002_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c010.c b/test_pool/pe/operating_system/test_c003.c similarity index 74% rename from test_pool/pe/test_c010.c rename to test_pool/pe/operating_system/test_c003.c index 81e4dcca..4ab7c56e 100644 --- a/test_pool/pe/test_c010.c +++ b/test_pool/pe/operating_system/test_c003.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_val.h" #include "val/include/sbsa_avs_pe.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 10) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 3) +#define TEST_RULE "S_L3PE_03" #define TEST_DESC "Check AARCH64 implementation " static @@ -30,29 +31,30 @@ payload(void) data = val_pe_reg_read(ID_AA64PFR0_EL1); - if ((data & 0x3) && (data & 0x30) && (data & 0x300) && (data & 0x3000)) //bits 1:0, 5:4, 9:8 and 13:12 must not be zero - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + /* bits 1:0, 5:4, 9:8 and 13:12 must not be zero */ + if ((data & 0x3) && (data & 0x30) && (data & 0x300) && (data & 0x3000)) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); return; } uint32_t -c010_entry(uint32_t num_pe) +c003_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/operating_system/test_c004.c b/test_pool/pe/operating_system/test_c004.c new file mode 100644 index 00000000..c1d44cb0 --- /dev/null +++ b/test_pool/pe/operating_system/test_c004.c @@ -0,0 +1,83 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_peripherals.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 4) +#define TEST_RULE "S_L3PE_04" +#define TEST_DESC "Check FEAT_LPA Requirements " + +#define FEAT_LPA_IMPL 0x6 +/* Retuns true if addr is greater than 48 bits */ +#define IS_ADDR_EXCEEDS_48BITS(addr) (addr & (0xfULL << 48)) + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t peri_count; + uint64_t peri_base; + + /* ID_AA64MMFR0_EL1.PARange [3:0] = 0b0110 indicates FEAT_LPA is implemented */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR0_EL1), 0, 3); + peri_count = val_peripheral_get_info(NUM_ALL, 0); + + if (data == FEAT_LPA_IMPL) + { + /* If the PE implements FEAT_LPA Index through Peripheral info table and + get base addresses */ + while (peri_count) + { + peri_base = val_peripheral_get_info(ANY_BASE0, peri_count - 1); + + /* If the base address is greater than 48 bits it is outside 256TB memory map */ + if (IS_ADDR_EXCEEDS_48BITS(peri_base)) + { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + peri_count--; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + } + else + { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + } +} + +uint32_t c004_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/test_c019.c b/test_pool/pe/operating_system/test_c005.c similarity index 86% rename from test_pool/pe/test_c019.c rename to test_pool/pe/operating_system/test_c005.c index 52130102..f0f227d2 100644 --- a/test_pool/pe/test_c019.c +++ b/test_pool/pe/operating_system/test_c005.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 19) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 5) +#define TEST_RULE "S_L4PE_01" #define TEST_DESC "Check for RAS extension " static @@ -42,21 +43,21 @@ void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c019_entry(uint32_t num_pe) +uint32_t c005_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/operating_system/test_c006.c b/test_pool/pe/operating_system/test_c006.c new file mode 100644 index 00000000..25e9bc8a --- /dev/null +++ b/test_pool/pe/operating_system/test_c006.c @@ -0,0 +1,65 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_memory.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 6) +#define TEST_RULE "S_L4PE_02" +#define TEST_DESC "Check DC CVAP support " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 4) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + if (val_memory_check_for_persistent_mem()) { + /* ID_AA64ISAR1_EL1.DPB[3:0] = 0b0001 or 0b0010 indicate support for + DC CVAP instruction */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ISAR1_EL1), 0, 3); + if (data == 0b0001 || data == 0b0010) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); +} + +uint32_t c006_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/test_c020.c b/test_pool/pe/operating_system/test_c007.c similarity index 86% rename from test_pool/pe/test_c020.c rename to test_pool/pe/operating_system/test_c007.c index e90706c6..0876ddc2 100644 --- a/test_pool/pe/test_c020.c +++ b/test_pool/pe/operating_system/test_c007.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 20) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 7) +#define TEST_RULE "S_L4PE_03" #define TEST_DESC "Check for 16-Bit VMID " static void payload(void) @@ -41,21 +42,21 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c020_entry(uint32_t num_pe) +uint32_t c007_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c021.c b/test_pool/pe/operating_system/test_c008.c similarity index 86% rename from test_pool/pe/test_c021.c rename to test_pool/pe/operating_system/test_c008.c index 663d23e0..41b8b26b 100644 --- a/test_pool/pe/test_c021.c +++ b/test_pool/pe/operating_system/test_c008.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 21) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 8) +#define TEST_RULE "S_L4PE_04" #define TEST_DESC "Check for Virtual host extensions " static void payload(void) @@ -41,21 +42,21 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c021_entry(uint32_t num_pe) +uint32_t c008_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c024.c b/test_pool/pe/operating_system/test_c009.c similarity index 86% rename from test_pool/pe/test_c024.c rename to test_pool/pe/operating_system/test_c009.c index 6b74fc75..7b98df3d 100644 --- a/test_pool/pe/test_c024.c +++ b/test_pool/pe/operating_system/test_c009.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 24) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 9) +#define TEST_RULE "S_L5PE_01" #define TEST_DESC "Support Page table map size change" static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c024_entry(uint32_t num_pe) +uint32_t c009_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c022.c b/test_pool/pe/operating_system/test_c010.c similarity index 90% rename from test_pool/pe/test_c022.c rename to test_pool/pe/operating_system/test_c010.c index d1f7efbf..613047b4 100644 --- a/test_pool/pe/test_c022.c +++ b/test_pool/pe/operating_system/test_c010.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 22) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 10) +#define TEST_RULE "S_L5PE_02" #define TEST_DESC "Check for pointer signing " static void check_pointer_signing_algorithm(uint32_t index, uint64_t data) @@ -59,18 +60,18 @@ static void payload(void) } } -uint32_t c022_entry(uint32_t num_pe) +uint32_t c010_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c026.c b/test_pool/pe/operating_system/test_c011.c similarity index 86% rename from test_pool/pe/test_c026.c rename to test_pool/pe/operating_system/test_c011.c index 862a4088..c62175a2 100644 --- a/test_pool/pe/test_c026.c +++ b/test_pool/pe/operating_system/test_c011.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 26) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 11) +#define TEST_RULE "S_L5PE_04" #define TEST_DESC "Check Activity monitors extension " static void payload(void) @@ -40,18 +41,18 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c026_entry(uint32_t num_pe) +uint32_t c011_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c027.c b/test_pool/pe/operating_system/test_c012.c similarity index 88% rename from test_pool/pe/test_c027.c rename to test_pool/pe/operating_system/test_c012.c index 522fefd7..c6dfb73b 100644 --- a/test_pool/pe/test_c027.c +++ b/test_pool/pe/operating_system/test_c012.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 27) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 12) +#define TEST_RULE "S_L5PE_05" #define TEST_DESC "Check for SHA3 and SHA512 support " static void payload(void) @@ -48,18 +49,18 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c027_entry(uint32_t num_pe) +uint32_t c012_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c025.c b/test_pool/pe/operating_system/test_c013.c similarity index 86% rename from test_pool/pe/test_c025.c rename to test_pool/pe/operating_system/test_c013.c index ced8c7cf..002b71e1 100644 --- a/test_pool/pe/test_c025.c +++ b/test_pool/pe/operating_system/test_c013.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 25) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 13) +#define TEST_RULE "S_L5PE_06" #define TEST_DESC "Stage 2 control of mem and cache " static void payload(void) @@ -39,18 +40,18 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c025_entry(uint32_t num_pe) +uint32_t c013_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c023.c b/test_pool/pe/operating_system/test_c014.c similarity index 86% rename from test_pool/pe/test_c023.c rename to test_pool/pe/operating_system/test_c014.c index b61c85e1..e8b64f8d 100644 --- a/test_pool/pe/test_c023.c +++ b/test_pool/pe/operating_system/test_c014.c @@ -18,7 +18,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 23) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 14) +#define TEST_RULE "S_L5PE_07" #define TEST_DESC "Check for nested virtualization " static void payload(void) @@ -39,18 +40,18 @@ static void payload(void) val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c023_entry(uint32_t num_pe) +uint32_t c014_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/operating_system/test_c015.c b/test_pool/pe/operating_system/test_c015.c new file mode 100644 index 00000000..56c82fb6 --- /dev/null +++ b/test_pool/pe/operating_system/test_c015.c @@ -0,0 +1,93 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_mpam.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 15) +#define TEST_RULE "S_MPAM_PE" +#define TEST_DESC "Check MPAM PE Requirements " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 5) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + /* Check if PEs implements FEAT_MPAM */ + /* ID_AA64PFR0_EL1.MPAM bits[43:40] > 0 or ID_AA64PFR1_EL1.MPAM_frac bits[19:16] > 0 + indicates implementation of MPAM extension */ + + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* check support for minimum of 16 physical partition IDs, MPAMIDR_EL1.PARTID_MAX + must be >= 16 */ + data = VAL_EXTRACT_BITS(val_mpam_reg_read(MPAMIDR_EL1), 0, 15); + if (data < 16) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* check support for MPAM virtulization support indicated by MPAMIDR_EL1.HAS_HCR bit */ + data = VAL_EXTRACT_BITS(val_mpam_reg_read(MPAMIDR_EL1), 17, 17); + if (data == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* check support for minimum of 8 virtual partition IDs, + MPAMIDR_EL1.VPMR_MAX must be > 0 */ + data = VAL_EXTRACT_BITS(val_mpam_reg_read(MPAMIDR_EL1), 18, 20); + if (data < 1) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* Check support for minimum of 2 performance monitor groups (PMGs), + MPAMIDR_EL1.PMG_MAX must be >= 2 */ + data = VAL_EXTRACT_BITS(val_mpam_reg_read(MPAMIDR_EL1), 32, 39); + if (data < 2) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + return; + } + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c015_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c016.c b/test_pool/pe/operating_system/test_c016.c new file mode 100644 index 00000000..f5bc52e3 --- /dev/null +++ b/test_pool/pe/operating_system/test_c016.c @@ -0,0 +1,126 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_mpam.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 16) +#define TEST_RULE "S_MPAM_PE" +#define TEST_DESC "Check MPAM LLC Requirements " + +static void payload(void) +{ + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t msc_node_cnt; + uint32_t rsrc_node_cnt; + uint32_t msc_index, rsrc_index; + uint32_t llc_index; + uint64_t cache_identifier; + uint32_t test_run = 0; + + if (g_sbsa_level < 5) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Find the LLC cache identifier */ + llc_index = val_cache_get_llc_index(); + if (llc_index == CACHE_TABLE_EMPTY) { + val_print(AVS_PRINT_ERR, "\n PPTT table empty", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + cache_identifier = val_cache_get_info(CACHE_ID, llc_index); + + if (cache_identifier == INVALID_CACHE_INFO) { + val_print(AVS_PRINT_ERR, "\n LLC invalid in PPTT", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Check in the MPAM table which MSC is attached to the LLC */ + msc_node_cnt = val_mpam_get_msc_count(); + val_print(AVS_PRINT_DEBUG, "\n MSC count = %d", msc_node_cnt); + + /* Check if PE implements FEAT_MPAM */ + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + if (msc_node_cnt == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* visit each MSC node and check for cache resources */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + + val_print(AVS_PRINT_DEBUG, "\n msc index = %d", msc_index); + val_print(AVS_PRINT_DEBUG, "\n Resource count %d = ", rsrc_node_cnt); + + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + + /* check whether the resource location is cache */ + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_PE_CACHE) { + if (val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index) == + cache_identifier) { + /* We have MSC which controls/monitors the LLC cache */ + val_print(AVS_PRINT_DEBUG, "\n rsrc index = %d", rsrc_index); + + test_run = 1; + /* Check CPOR are present */ + if (!val_mpam_supports_cpor(msc_index)) { + val_print(AVS_PRINT_ERR, "\n CPOR unsupported by LLC", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + return; + } + } + } + } + } + + if (!test_run) { + val_print(AVS_PRINT_ERR, "\n No LLC MSC found", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c016_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/test_c018.c b/test_pool/pe/operating_system/test_c017.c similarity index 88% rename from test_pool/pe/test_c018.c rename to test_pool/pe/operating_system/test_c017.c index 0eba2373..42e1c566 100644 --- a/test_pool/pe/test_c018.c +++ b/test_pool/pe/operating_system/test_c017.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 18) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 17) +#define TEST_RULE "B_PE_17" #define TEST_DESC "Check SPE if implemented " static @@ -52,18 +53,18 @@ void payload(void) } -uint32_t c018_entry(uint32_t num_pe) +uint32_t c017_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c033.c b/test_pool/pe/operating_system/test_c018.c similarity index 86% rename from test_pool/pe/test_c033.c rename to test_pool/pe/operating_system/test_c018.c index 3e5be7c2..c9b352c8 100644 --- a/test_pool/pe/test_c033.c +++ b/test_pool/pe/operating_system/test_c018.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 33) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 18) +#define TEST_RULE "S_L6PE_02" #define TEST_DESC "Check Branch Target Support " static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c033_entry(uint32_t num_pe) +uint32_t c018_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c034.c b/test_pool/pe/operating_system/test_c019.c similarity index 86% rename from test_pool/pe/test_c034.c rename to test_pool/pe/operating_system/test_c019.c index bdf6b61d..216176d4 100644 --- a/test_pool/pe/test_c034.c +++ b/test_pool/pe/operating_system/test_c019.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 34) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 19) +#define TEST_RULE "S_L6PE_03" #define TEST_DESC "Check Protect Against Timing Fault" static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c034_entry(uint32_t num_pe) +uint32_t c019_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c036.c b/test_pool/pe/operating_system/test_c020.c similarity index 86% rename from test_pool/pe/test_c036.c rename to test_pool/pe/operating_system/test_c020.c index 79b46c6c..bb73b586 100644 --- a/test_pool/pe/test_c036.c +++ b/test_pool/pe/operating_system/test_c020.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 36) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 20) +#define TEST_RULE "S_L6PE_04" #define TEST_DESC "Check PMU Version Support " static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c036_entry(uint32_t num_pe) +uint32_t c020_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c028.c b/test_pool/pe/operating_system/test_c021.c similarity index 86% rename from test_pool/pe/test_c028.c rename to test_pool/pe/operating_system/test_c021.c index 1da118fb..ac7c1e77 100644 --- a/test_pool/pe/test_c028.c +++ b/test_pool/pe/operating_system/test_c021.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 28) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 21) +#define TEST_RULE "S_L6PE_05" #define TEST_DESC "Check AccessFlag DirtyState Update" static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c028_entry(uint32_t num_pe) +uint32_t c021_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c035.c b/test_pool/pe/operating_system/test_c022.c similarity index 86% rename from test_pool/pe/test_c035.c rename to test_pool/pe/operating_system/test_c022.c index 8c2c31ec..4a6c30e4 100644 --- a/test_pool/pe/test_c035.c +++ b/test_pool/pe/operating_system/test_c022.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 35) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 22) +#define TEST_RULE "S_L6PE_06" #define TEST_DESC "Check Enhanced Virtualization Trap" static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c035_entry(uint32_t num_pe) +uint32_t c022_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c029.c b/test_pool/pe/operating_system/test_c023.c similarity index 88% rename from test_pool/pe/test_c029.c rename to test_pool/pe/operating_system/test_c023.c index 41ad8003..52bc5b6b 100644 --- a/test_pool/pe/test_c029.c +++ b/test_pool/pe/operating_system/test_c023.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 29) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 23) +#define TEST_RULE "B_SEC_01" #define TEST_DESC "Check Speculation Restriction " static void payload(void) @@ -46,18 +47,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c029_entry(uint32_t num_pe) +uint32_t c023_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/operating_system/test_c024.c b/test_pool/pe/operating_system/test_c024.c new file mode 100644 index 00000000..ba2204da --- /dev/null +++ b/test_pool/pe/operating_system/test_c024.c @@ -0,0 +1,59 @@ +/** @file + * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 24) +#define TEST_RULE "B_SEC_02" +#define TEST_DESC "Check Speculative Str Bypass Safe " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 6) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Read ID_AA64PFR1_EL1.SSBS[7:4] = 0b0010 */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 4, 7); + + if (data != 2) + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c024_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/test_os_c018.c b/test_pool/pe/operating_system/test_c025.c similarity index 82% rename from test_pool/pe/test_os_c018.c rename to test_pool/pe/operating_system/test_c025.c index aacde8ea..1bbfdffb 100644 --- a/test_pool/pe/test_os_c018.c +++ b/test_pool/pe/operating_system/test_c025.c @@ -19,9 +19,9 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 40) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 25) #define TEST_RULE "B_SEC_03" -#define TEST_DESC "Check PEs Impl CSDB,SSBB,PSSBB " +#define TEST_DESC "Check PEs Impl CSDB,SSBB,PSSBB " static void @@ -40,18 +40,18 @@ payload() } uint32_t -os_c018_entry(uint32_t num_pe) +c025_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(6, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c031.c b/test_pool/pe/operating_system/test_c026.c similarity index 86% rename from test_pool/pe/test_c031.c rename to test_pool/pe/operating_system/test_c026.c index 1abf8b1c..ed167c7e 100644 --- a/test_pool/pe/test_c031.c +++ b/test_pool/pe/operating_system/test_c026.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 31) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 26) +#define TEST_RULE "B_SEC_04" #define TEST_DESC "Check PEs Implement SB Barrier " static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c031_entry(uint32_t num_pe) +uint32_t c026_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/test_c032.c b/test_pool/pe/operating_system/test_c027.c similarity index 86% rename from test_pool/pe/test_c032.c rename to test_pool/pe/operating_system/test_c027.c index a5ef91e4..a3d6f2bc 100644 --- a/test_pool/pe/test_c032.c +++ b/test_pool/pe/operating_system/test_c027.c @@ -19,7 +19,8 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/val_interface.h" -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 32) +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 27) +#define TEST_RULE "B_SEC_05" #define TEST_DESC "Check PE Impl CFP,DVP,CPP RCTX " static void payload(void) @@ -41,18 +42,18 @@ static void payload(void) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); } -uint32_t c032_entry(uint32_t num_pe) +uint32_t c027_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/operating_system/test_c028.c b/test_pool/pe/operating_system/test_c028.c new file mode 100644 index 00000000..fae8bdd7 --- /dev/null +++ b/test_pool/pe/operating_system/test_c028.c @@ -0,0 +1,59 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 28) +#define TEST_RULE "S_L7PE_01" +#define TEST_DESC "Check Fine Grain Trap Support " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64MMFR0_EL1.FGT[59:56] = 0b0001 indicate fine grained trap feature */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR0_EL1), 56, 59); + + if (data == 1) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c028_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c029.c b/test_pool/pe/operating_system/test_c029.c new file mode 100644 index 00000000..13fa0c5e --- /dev/null +++ b/test_pool/pe/operating_system/test_c029.c @@ -0,0 +1,59 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 29) +#define TEST_RULE "S_L7PE_02" +#define TEST_DESC "Check for ECV support " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64MMFR0_EL1.ECV[63:60] = 0b0010 indicate Enhanced counter vitualization */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR0_EL1), 60, 63); + + if (data == 2) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c029_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/test_c030.c b/test_pool/pe/operating_system/test_c030.c similarity index 75% rename from test_pool/pe/test_c030.c rename to test_pool/pe/operating_system/test_c030.c index 63a571b6..5c2939b7 100644 --- a/test_pool/pe/test_c030.c +++ b/test_pool/pe/operating_system/test_c030.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,39 +20,40 @@ #include "val/include/val_interface.h" #define TEST_NUM (AVS_PE_TEST_NUM_BASE + 30) -#define TEST_DESC "Check Speculative Str Bypass Safe " +#define TEST_RULE "S_L7PE_03" +#define TEST_DESC "Check for AMU Support " static void payload(void) { uint64_t data = 0; uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - if (g_sbsa_level < 6) { + if (g_sbsa_level < 7) { val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); return; } - /* Read ID_AA64PFR1_EL1.SSBS[7:4] = 0b0010 */ - data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 4, 7); + /* ID_AA64PFR0_EL1.AMU[47:44] = 0b0010 indicate AMU Support */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 44, 47); - if (data != 2) - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - else + if (data == 2) val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); } uint32_t c030_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/pe/operating_system/test_c031.c b/test_pool/pe/operating_system/test_c031.c new file mode 100644 index 00000000..e215ee28 --- /dev/null +++ b/test_pool/pe/operating_system/test_c031.c @@ -0,0 +1,59 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 31) +#define TEST_RULE "S_L7PE_04" +#define TEST_DESC "Checks ASIMD Int8 matrix multiplc " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64ISAR1_EL1.I8MM[55:52] = 0b0001 Advanced SIMD int8 matrix multiply support */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ISAR1_EL1), 52, 55); + + if (data == 1) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c031_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c032.c b/test_pool/pe/operating_system/test_c032.c new file mode 100644 index 00000000..d68047de --- /dev/null +++ b/test_pool/pe/operating_system/test_c032.c @@ -0,0 +1,60 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 32) +#define TEST_RULE "S_L7PE_05" +#define TEST_DESC "Check for BFLOAT16 extension " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64ISAR1_EL1.BF16[47:44] = 0b0001 indicate FEAT_BF16 support */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ISAR1_EL1), 44, 47); + + if (data == 1) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c032_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c033.c b/test_pool/pe/operating_system/test_c033.c new file mode 100644 index 00000000..1289c151 --- /dev/null +++ b/test_pool/pe/operating_system/test_c033.c @@ -0,0 +1,60 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 33) +#define TEST_RULE "S_L7PE_06" +#define TEST_DESC "Check for EnhancedPAC2 and FPAC " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64ISAR1_EL1.APA[7:4] = 0b0101 indicate EnhancedPAC2 and FPAC support */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ISAR1_EL1), 4, 7); + + if (data == 5) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c033_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c034.c b/test_pool/pe/operating_system/test_c034.c new file mode 100644 index 00000000..dfca79ae --- /dev/null +++ b/test_pool/pe/operating_system/test_c034.c @@ -0,0 +1,68 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 34) +#define TEST_RULE "S_L7PE_07" +#define TEST_DESC "Check for SVE Int8 matrix multiplc" + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64PFR0_EL1.SVE[35:32] non-zero value indicate SVE support */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 32, 35); + + if (data == 0) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* ID_AA64ZFR0_EL1.I8MM[47:44] = 0b0001 indicate SVE Int8 matrix multiply support */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ZFR0_EL1), 44, 47); + + if (data == 1) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c034_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c035.c b/test_pool/pe/operating_system/test_c035.c new file mode 100644 index 00000000..0febe50d --- /dev/null +++ b/test_pool/pe/operating_system/test_c035.c @@ -0,0 +1,60 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 35) +#define TEST_RULE "S_L7PE_08" +#define TEST_DESC "Check for data gathering hint " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64ISAR1_EL1.DGH[51:48] = 0b0001 indicate data gathering hint feature */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64ISAR1_EL1), 48, 51); + + if (data == 1) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c035_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c036.c b/test_pool/pe/operating_system/test_c036.c new file mode 100644 index 00000000..cc6a09f1 --- /dev/null +++ b/test_pool/pe/operating_system/test_c036.c @@ -0,0 +1,61 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 36) +#define TEST_RULE "S_L7PE_09" +#define TEST_DESC "Check WFE Fine tune delay feature " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64MMFR1_EL1.TWED [35:32] = 0b0001 indicates support for configurable delayed + trapping for WFE instruction */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR1_EL1), 32, 35); + + if (data == 1) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c036_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/operating_system/test_c037.c b/test_pool/pe/operating_system/test_c037.c new file mode 100644 index 00000000..a8014bd1 --- /dev/null +++ b/test_pool/pe/operating_system/test_c037.c @@ -0,0 +1,60 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/val_interface.h" + +#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 37) +#define TEST_RULE "S_L7PE_10" +#define TEST_DESC "Check for enhanced PAN feature " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64MMFR1_EL1.PAN [23:20] = 0b0011 indicate support for enhanced PAN feature */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64MMFR1_EL1), 20, 23); + + if (data == 3) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t c037_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pe/test_c001.c b/test_pool/pe/test_c001.c deleted file mode 100644 index dfe0b3ca..00000000 --- a/test_pool/pe/test_c001.c +++ /dev/null @@ -1,65 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" -#include "val/include/val_interface.h" - -#define TEST_NUM AVS_PE_TEST_NUM_BASE + 1 -#define TEST_DESC "Check for number of PE " - -static -void -payload(void) -{ - uint64_t num_of_pe = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - num_of_pe = val_pe_get_num(); - - if (num_of_pe > MAX_NUM_PE) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - val_print(AVS_PRINT_ERR, "Number of PE is %d \n", num_of_pe); - return; - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c001_entry() -{ - - uint32_t status = AVS_STATUS_FAIL; //default value - uint32_t num_pe = 1; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - /* This check is when user is forcing us to skip this test */ - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/pe/test_c002.c b/test_pool/pe/test_c002.c deleted file mode 100644 index 67ccb5e8..00000000 --- a/test_pool/pe/test_c002.c +++ /dev/null @@ -1,62 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" -#include "val/include/val_interface.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 02) -#define TEST_DESC "Check for SIMD extensions " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(ID_AA64PFR0_EL1); - data = (data & 0xF00000) >> 20; - - if ((data == 0x0) || (data == 0x1)) - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c002_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; //default value - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - /* This check is when user is forcing us to skip this test */ - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c005.c b/test_pool/pe/test_c005.c deleted file mode 100644 index 06c79f3c..00000000 --- a/test_pool/pe/test_c005.c +++ /dev/null @@ -1,59 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 05) -#define TEST_DESC "Check Cache Architecture " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(CTR_EL0); - - if ((data & 0x8000)) //bits 15:14 - bit 15 must be 1 for VIPT or PIPT - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c005_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c006.c b/test_pool/pe/test_c006.c deleted file mode 100644 index e41e194a..00000000 --- a/test_pool/pe/test_c006.c +++ /dev/null @@ -1,69 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 06) -#define TEST_DESC "Check HW Coherence support " - -static -void -payload(void) -{ - uint64_t data = 0; - uint64_t pfr0, a32_support; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - pfr0 = val_pe_reg_read(ID_AA64PFR0_EL1); - a32_support = ((pfr0 & 0xf000) == 0x2000)? 1:((pfr0 & 0xf00) == 0x200)?\ - 1:((pfr0 & 0xf0) == 0x20)? 1:((pfr0 & 0xf) == 0x2)? 1:0; - - if(a32_support == 0){ - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - data = val_pe_reg_read(ID_MMFR0_EL1); - - if ((((data >> 28) & 0xF) == 1) && (((data >> 12) & 0xF) == 1)) //bits 31:28 and 15:12 should be 1 - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c006_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c007.c b/test_pool/pe/test_c007.c deleted file mode 100644 index 10dba70e..00000000 --- a/test_pool/pe/test_c007.c +++ /dev/null @@ -1,59 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 07) -#define TEST_DESC "Check Cryptographic extensions " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(ID_AA64ISAR0_EL1); - - if (((data >> 4) & 0xF) && ((data >> 8) & 0xF) && ((data >> 12) & 0xF)) //bits 7:4, 11:8, 15:12 must be non-zero - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c007_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c008.c b/test_pool/pe/test_c008.c deleted file mode 100644 index bf7cd0ae..00000000 --- a/test_pool/pe/test_c008.c +++ /dev/null @@ -1,61 +0,0 @@ -/** @file - * Copyright (c) 2016-2019, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 8) -#define TEST_DESC "Check Little Endian support " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - /* Check the current endianness setting of SCTLR.EE */ - if (val_pe_reg_read(CurrentEL) == AARCH64_EL2) { - data = val_pe_reg_read(SCTLR_EL2); - } else if (val_pe_reg_read(CurrentEL) == AARCH64_EL1) { - data = val_pe_reg_read(SCTLR_EL1); - } - - if (((data >> 25) & 1) == 0) //Bit 25 must be 0 - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 02)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - - return; -} - -uint32_t -c008_entry(uint32_t num_pe) -{ - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/pe/test_c011.c b/test_pool/pe/test_c011.c deleted file mode 100755 index 1c21d373..00000000 --- a/test_pool/pe/test_c011.c +++ /dev/null @@ -1,110 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 11) -#define TEST_DESC "Check PMU Overflow signal " - -static uint32_t int_id; - -static -void -set_pmu_overflow(void) -{ - uint64_t pmcr; - - //Initializing the state of overflow status and interrupt request registers - val_pe_reg_write(PMINTENCLR_EL1, 0xFFFFFFFF); - val_pe_reg_write(PMOVSCLR_EL0, 0xFFFFFFFF); - - //Sequence to generate PMUIRQ - pmcr = val_pe_reg_read(PMCR_EL0); - val_pe_reg_write(PMCR_EL0, pmcr|0x1); - - val_pe_reg_write(PMINTENSET_EL1, 0x1); - val_pe_reg_write(PMOVSSET_EL0, 0x1); - -} - - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - /* We received our interrupt, so disable PMUIRQ from generating further interrupts */ - val_pe_reg_write(PMOVSCLR_EL0, 0x1); - val_print(AVS_PRINT_INFO, "\n Received PMUIRQ ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(int_id); - - return; -} - - -static -void -payload(void) -{ - uint32_t timeout = 0x100000; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - int_id = val_pe_get_pmu_gsiv(index); - - if (int_id != 23) { - timeout = 0; - val_print(AVS_PRINT_ERR, "\n Incorrect PPI value %d ", int_id); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - val_gic_install_isr(int_id, isr); - - set_pmu_overflow(); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if(timeout == 0) - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); -} - -/** - @brief Install ISR and verify PMU Overflow Interrupt by programming System registers -**/ -uint32_t -c011_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - num_pe = 1; - - status = val_initialize_test(TEST_NUM, TEST_DESC, val_pe_get_num(), g_sbsa_level); - if (status != AVS_STATUS_SKIP) - /* execute payload on present PE and then execute on other PE */ - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c012.c b/test_pool/pe/test_c012.c deleted file mode 100644 index 75de42b3..00000000 --- a/test_pool/pe/test_c012.c +++ /dev/null @@ -1,62 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 12) -#define TEST_DESC "Check number of PMU counters " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(PMCR_EL0); - - if (((data & 0x0F800) >> 11) > 5) //bits 15:11 for Number of counters. - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c012_entry(uint32_t num_pe) -{ - - uint32_t status; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - /* execute payload on present PE and then execute on other PE */ - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - - diff --git a/test_pool/pe/test_c013.c b/test_pool/pe/test_c013.c deleted file mode 100644 index 12661f3e..00000000 --- a/test_pool/pe/test_c013.c +++ /dev/null @@ -1,60 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 13) -#define TEST_DESC "Check Synchronous Watchpoints " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(ID_AA64DFR0_EL1); - - if (((data >> 20) & 0xF) > 2) //bits 23:20 for Number of watchpoints - 1 - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c013_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - /* execute payload on present PE and then execute on other PE */ - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c014.c b/test_pool/pe/test_c014.c deleted file mode 100644 index f1288473..00000000 --- a/test_pool/pe/test_c014.c +++ /dev/null @@ -1,74 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 14) -#define TEST_DESC "Check number of Breakpoints " - -static -void payload(void) -{ - uint64_t data = 0; - int32_t breakpointcount; - uint32_t context_aware_breakpoints = 0; - uint32_t pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(ID_AA64DFR0_EL1); - - /* bits 15:12 for Number of breakpoints - 1 */ - breakpointcount = VAL_EXTRACT_BITS(data, 12, 15) + 1; - - if (breakpointcount < 6) { - val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); - return; - } - - /*bits [31:28] Number of breakpoints that are context-aware, minus 1*/ - context_aware_breakpoints = VAL_EXTRACT_BITS(data, 28, 31) + 1; - if (context_aware_breakpoints > 1) - val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 1)); - else - val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 2)); - - - return; - -} - -/** - @brief Check for the number of breakpoints available -**/ -uint32_t -c014_entry(uint32_t num_pe) -{ - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - /* execute payload on present PE and then execute on other PE */ - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c015.c b/test_pool/pe/test_c015.c deleted file mode 100755 index f487940b..00000000 --- a/test_pool/pe/test_c015.c +++ /dev/null @@ -1,279 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 15) -#define TEST_DESC "Check Arch symmetry across PE " - -#define NUM_OF_REGISTERS 32 - -#define RAS 1 -#define SPE 2 -#define LOR 3 -#define AA32 4 -#define PMUV3 5 - -#define MASK_AA64MMFR0 0xF -#define MASK_MIDR 0x00F0FFFF -#define MASK_MPIDR 0xFF3FFFFFFF -#define MASK_CTR 0xC000 -#define MASK_CCSIDR 0xFFFFFF8 -#define MASK_PMCR 0xFFFF - -#define MAX_CACHE_LEVEL 7 - -uint64_t rd_data_array[NUM_OF_REGISTERS]; -uint64_t cache_list[MAX_CACHE_LEVEL]; - -typedef struct{ - uint32_t reg_name; - uint64_t reg_mask; - char reg_desc[30]; - uint8_t dependency; -}reg_details; - -reg_details reg_list[] = { - {CCSIDR_EL1, MASK_CCSIDR, "CCSIDR_EL1" , 0x0 }, - {ID_AA64PFR0_EL1, 0x0, "ID_AA64PFR0_EL1" , 0x0 }, - {ID_AA64PFR1_EL1, 0x0, "ID_AA64PFR1_EL1" , 0x0 }, - {ID_AA64DFR0_EL1, 0x0, "ID_AA64DFR0_EL1" , 0x0 }, - {ID_AA64DFR1_EL1, 0x0, "ID_AA64DFR1_EL1" , 0x0 }, - {ID_AA64MMFR0_EL1, MASK_AA64MMFR0, "ID_AA64MMFR0_EL1", 0x0 }, - {ID_AA64MMFR1_EL1, 0x0, "ID_AA64MMFR1_EL1", 0x0 }, - //{ID_AA64MMFR2_EL1, 0x0, "ID_AA64MMFR2_EL1", 0x0 }, - {CTR_EL0, MASK_CTR, "CTR_EL0" , 0x0 }, - {ID_AA64ISAR0_EL1, 0x0, "ID_AA64ISAR0_EL1", 0x0 }, - {ID_AA64ISAR1_EL1, 0x0, "ID_AA64ISAR1_EL1", 0x0 }, - {MPIDR_EL1, MASK_MPIDR, "MPIDR_EL1" , 0x0 }, - {MIDR_EL1, MASK_MIDR, "MIDR_EL1" , 0x0 }, - {ID_DFR0_EL1, 0x0, "ID_DFR0_EL1" , AA32}, - {ID_ISAR0_EL1, 0x0, "ID_ISAR0_EL1" , AA32}, - {ID_ISAR1_EL1, 0x0, "ID_ISAR1_EL1" , AA32}, - {ID_ISAR2_EL1, 0x0, "ID_ISAR2_EL1" , AA32}, - {ID_ISAR3_EL1, 0x0, "ID_ISAR3_EL1" , AA32}, - {ID_ISAR4_EL1, 0x0, "ID_ISAR4_EL1" , AA32}, - {ID_ISAR5_EL1, 0x0, "ID_ISAR5_EL1" , AA32}, - {ID_MMFR0_EL1, 0x0, "ID_MMFR0_EL1" , AA32}, - {ID_MMFR1_EL1, 0x0, "ID_MMFR1_EL1" , AA32}, - {ID_MMFR2_EL1, 0x0, "ID_MMFR2_EL1" , AA32}, - {ID_MMFR3_EL1, 0x0, "ID_MMFR3_EL1" , AA32}, - {ID_MMFR4_EL1, 0x0, "ID_MMFR4_EL1" , AA32}, - {ID_PFR0_EL1, 0x0, "ID_PFR0_EL1" , AA32}, - {ID_PFR1_EL1, 0x0, "ID_PFR1_EL1" , AA32}, - {MVFR0_EL1, 0x0, "MVFR0_EL1" , AA32}, - {MVFR1_EL1, 0x0, "MVFR1_EL1" , AA32}, - {MVFR2_EL1, 0x0, "MVFR2_EL1" , AA32}, - {PMCEID0_EL0, 0x0, "PMCEID0_EL0", PMUV3 }, - {PMCEID1_EL0, 0x0, "PMCEID1_EL0", PMUV3 }, - {PMCR_EL0, MASK_PMCR, "PMCR_EL0", PMUV3 }, - {PMBIDR_EL1, 0x0, "PMBIDR_EL1" , SPE }, - {PMSIDR_EL1, 0x0, "PMSIDR_EL1" , SPE }, - {ERRIDR_EL1, 0x0, "ERRIDR_EL1" , RAS }, - {ERR0FR_EL1, 0x0, "ERR0FR_EL1" , RAS }, - {ERR1FR_EL1, 0x0, "ERR1FR_EL1" , RAS }, - {ERR2FR_EL1, 0x0, "ERR2FR_EL1" , RAS }, - {ERR3FR_EL1, 0x0, "ERR3FR_EL1" , RAS }, - {LORID_EL1, 0x0, "LORID_EL1" , LOR } -}; - -static -uint64_t -return_reg_value(uint32_t reg, uint8_t dependency) -{ - uint64_t temp=0; - - if(dependency == 0) - return val_pe_reg_read(reg); - - switch(dependency) - { - case RAS: // If RAS is not supported, then skip register check - temp = val_pe_reg_read(ID_AA64PFR0_EL1); - temp = (temp >> 28) & 0xf; - if(temp == 1) - return val_pe_reg_read(reg); - else - return 0; - break; - - case SPE: // If Statistical Profiling Extension is not supported, then skip register check - temp = val_pe_reg_read(ID_AA64DFR0_EL1); - temp = (temp >> 32) & 0xf; - if(temp == 1) - return val_pe_reg_read(reg); - else - return 0; - break; - - case LOR: // If Limited Ordering Region is not supported, then skip register check - temp = val_pe_reg_read(ID_AA64MMFR1_EL1); - temp = (temp >> 16) & 0xf; - if(temp == 1) - return val_pe_reg_read(reg); - else - return 0; - break; - - case AA32: // If the register is UNK in pure AArch64 implementation, then skip register check - temp = val_pe_reg_read(ID_AA64PFR0_EL1); - temp = (temp & 1); - if(temp == 0) - return val_pe_reg_read(reg); - else - return 0; - break; - - case PMUV3: // If PMUv3 is not supported, then skip register check - temp = val_pe_reg_read(ID_AA64DFR0_EL1); - temp = (temp >> 8) & 0xf; - if (temp != 0 && temp != 0b1111) - return val_pe_reg_read(reg); - else - return 0; - break; - - default: - val_print(AVS_PRINT_ERR, "\n Unknown dependency = %d ", dependency); - return 0x0; - } - -} - -static -void -id_regs_check(void) -{ - uint64_t reg_read_data; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint32_t i = 0; - - /* Loop CLIDR to check if a cache level is implemented before comparing */ - while (i < MAX_CACHE_LEVEL) { - reg_read_data = val_pe_reg_read(CLIDR_EL1); - if (reg_read_data & ((0x7) << (i * 3))) { - /* Select the correct cache in csselr register */ - val_pe_reg_write(CSSELR_EL1, i << 1); - reg_read_data = return_reg_value(reg_list[0].reg_name, reg_list[0].dependency); - - if ((reg_read_data & (~reg_list[0].reg_mask)) != (cache_list[i] & (~reg_list[0].reg_mask))) { - val_set_test_data(index, (reg_read_data & (~reg_list[0].reg_mask)), 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - i++; - } - - for (i = 1; i < NUM_OF_REGISTERS; i++) { - reg_read_data = return_reg_value(reg_list[i].reg_name, reg_list[i].dependency); - - if((reg_read_data & (~reg_list[i].reg_mask)) != (rd_data_array[i] & (~reg_list[i].reg_mask))) - { - val_set_test_data(index, (reg_read_data & (~reg_list[i].reg_mask)), i); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - reg_read_data = 0; - } - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - - return; -} - -static -void -payload(uint32_t num_pe) -{ - uint32_t my_index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint32_t i; - uint32_t timeout; - uint64_t reg_read_data, debug_data=0, array_index=0; - - if (num_pe == 1) { - val_print(AVS_PRINT_WARN, "\n Skipping as num of PE is 1 ", 0); - val_set_status(my_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - /* Loop CLIDR to check if a cache level is implemented */ - i = 0; - while (i < MAX_CACHE_LEVEL) { - reg_read_data = val_pe_reg_read(CLIDR_EL1); - if (reg_read_data & ((0x7) << (i * 3))) { - /* Select the correct cache level in csselr register */ - val_pe_reg_write(CSSELR_EL1, i << 1); - cache_list[i] = return_reg_value(reg_list[0].reg_name, reg_list[0].dependency); - val_data_cache_ops_by_va((addr_t)(cache_list + i), CLEAN_AND_INVALIDATE); - val_print(AVS_PRINT_INFO, "\n Cache size read is %x ", cache_list[i]); - } - i++; - } - - for (i = 1; i < NUM_OF_REGISTERS; i++) { - rd_data_array[i] = return_reg_value(reg_list[i].reg_name, reg_list[i].dependency); - val_data_cache_ops_by_va((addr_t)(rd_data_array + i), CLEAN_AND_INVALIDATE); - } - - for (i = 0; i < num_pe; i++) { - if (i != my_index) { - timeout=TIMEOUT_LARGE; - val_execute_on_pe(i, id_regs_check, 0); - while ((--timeout) && (IS_RESULT_PENDING(val_get_status(i)))); - - if(timeout == 0) { - val_print(AVS_PRINT_ERR, "\n **Timed out** for PE index = %d", i); - val_set_status(i, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - if(IS_TEST_FAIL(val_get_status(i))) { - val_get_test_data(i, &debug_data, &array_index); - val_print(AVS_PRINT_ERR, "\n Reg compare failed for PE index=%d for Register: ", i); - val_print(AVS_PRINT_ERR, reg_list[array_index].reg_desc, 0); - val_print(AVS_PRINT_ERR, "\n Current PE value = 0x%llx", rd_data_array[array_index] & (~reg_list[array_index].reg_mask)); - val_print(AVS_PRINT_ERR, " Other PE value = 0x%llx", debug_data); - return; - } - } - } - - return; - -} - -uint32_t -c015_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, val_pe_get_num(), g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - /* execute payload, which will execute relevant functions on current and other PEs */ - payload(num_pe); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/pe/test_c017.c b/test_pool/pe/test_c017.c deleted file mode 100644 index 0bf99980..00000000 --- a/test_pool/pe/test_c017.c +++ /dev/null @@ -1,60 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_PE_TEST_NUM_BASE + 17) -#define TEST_DESC "Check CRC32 instruction support " - -static -void -payload(void) -{ - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - data = val_pe_reg_read(ID_AA64ISAR0_EL1); - - if ((data >> 16) & 0xF) //bits 19:16 are CRC32 and should not be zero - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - return; - -} - -uint32_t -c017_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} - diff --git a/test_pool/peripherals/test_d001.c b/test_pool/peripherals/test_d001.c deleted file mode 100644 index 3b22d529..00000000 --- a/test_pool/peripherals/test_d001.c +++ /dev/null @@ -1,92 +0,0 @@ -/** @file - * Copyright (c) 2016-2019, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_peripherals.h" -#include "val/include/sbsa_avs_pcie.h" - -#define TEST_NUM (AVS_PER_TEST_NUM_BASE + 1) -#define TEST_DESC "Check USB CTRL Interface via PCIe " - -static -void -payload(void) -{ - - uint32_t interface = 0; - uint32_t ret; - uint32_t bdf; - uint64_t count = val_peripheral_get_info(NUM_USB, 0); - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (count == 0) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while (count != 0) { - bdf = val_peripheral_get_info(USB_BDF, count - 1); - ret = val_pcie_read_cfg(bdf, 0x8, &interface); - interface = (interface >> 8) & 0xFF; - if (ret == PCIE_NO_MAPPING || (interface < 0x20) || (interface == 0xFF)) { - val_print(AVS_PRINT_WARN, "\n WARN: USB CTRL ECAM access failed 0x%x ", interface); - val_print(AVS_PRINT_WARN, "\n Re-checking USB CTRL using PciIo protocol ", 0); - ret = val_pcie_io_read_cfg(bdf, 0x8, &interface); - if (ret == PCIE_NO_MAPPING) { - val_print(AVS_PRINT_ERR, "\n Reading device class code using PciIo protocol failed ", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - interface = (interface >> 8) & 0xFF; - if ((interface < 0x20) || (interface == 0xFF)) { - val_print(AVS_PRINT_ERR, "\n Detected USB CTRL not EHCI/XHCI 0x%x ", interface); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - count--; - } - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - return; -} - -/** - @brief Read PCI CFG space class and sub-class register - to determine the USB interface version -**/ -uint32_t -d001_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/peripherals/test_d002.c b/test_pool/peripherals/test_d002.c deleted file mode 100644 index 3571d405..00000000 --- a/test_pool/peripherals/test_d002.c +++ /dev/null @@ -1,92 +0,0 @@ -/** @file - * Copyright (c) 2016-2019, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_peripherals.h" -#include "val/include/sbsa_avs_pcie.h" - -#define TEST_NUM (AVS_PER_TEST_NUM_BASE + 2) -#define TEST_DESC "Check SATA CTRL Interface via PCIe" - -static -void -payload(void) -{ - - uint32_t interface = 0; - uint32_t bdf; - uint32_t ret; - uint32_t count = val_peripheral_get_info(NUM_SATA, 0); - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (count == 0) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while (count != 0) { - bdf = val_peripheral_get_info(SATA_BDF, count - 1); - ret = val_pcie_read_cfg(bdf, 0x8, &interface); - interface = (interface >> 8) & 0xFF; - if (ret == PCIE_NO_MAPPING || interface != 0x01) { - val_print(AVS_PRINT_WARN, "\n WARN: SATA CTRL ECAM access failed %x ", interface); - val_print(AVS_PRINT_WARN, "\n Re-checking SATA CTRL using PciIo protocol ", 0); - ret = val_pcie_io_read_cfg(bdf, 0x8, &interface); - if (ret == PCIE_NO_MAPPING) { - val_print(AVS_PRINT_ERR, "\n Reading device class code using PciIo protocol failed ", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - interface = (interface >> 8) & 0xFF; - if (interface != 0x01) { - val_print(AVS_PRINT_ERR, "\n Detected SATA CTRL not AHCI ", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - count--; - } - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - return; -} - -/** - @brief Read PCI CFG space class and sub-class register - to determine the SATA interface version -**/ -uint32_t -d002_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/peripherals/test_d003.c b/test_pool/peripherals/test_d003.c deleted file mode 100755 index 0658a458..00000000 --- a/test_pool/peripherals/test_d003.c +++ /dev/null @@ -1,270 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" -#include "val/include/sbsa_avs_pe.h" - -#include "val/include/sbsa_avs_peripherals.h" -#include "val/include/sbsa_avs_gic.h" - -#define TEST_NUM (AVS_PER_TEST_NUM_BASE + 3) -/*one space character is removed from TEST_DESC, to nullify a space written as part of the test */ -#define TEST_DESC "Check SBSA UART register offsets " -#define TEST_NUM1 (AVS_PER_TEST_NUM_BASE + 4) -#define TEST_DESC1 "Check Generic UART Interrupt " - -static uint64_t l_uart_base; -static uint32_t int_id; -static uint64_t branch_to_test; -static uint32_t test_fail; - -static -void -esr(uint64_t interrupt_type, void *context) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - /* Update the ELR to point to next instrcution */ - val_pe_update_elr(context, branch_to_test); - - val_print(AVS_PRINT_ERR, "\n Error : Received Sync Exception type %d", interrupt_type); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); -} - -static -uint32_t -uart_reg_read(uint32_t offset, uint32_t width_mask) -{ - if (width_mask & WIDTH_BIT8) - return *((volatile uint8_t *)(l_uart_base + offset)); - - if (width_mask & WIDTH_BIT16) - return *((volatile uint16_t *)(l_uart_base + offset)); - - if (width_mask & WIDTH_BIT32) - return *((volatile uint32_t *)(l_uart_base + offset)); - - return 0; -} - -static -void -uart_reg_write(uint32_t offset, uint32_t width_mask, uint32_t data) -{ - if (width_mask & WIDTH_BIT8) - *((volatile uint8_t *)(l_uart_base + offset)) = (uint8_t)data; - - if (width_mask & WIDTH_BIT16) - *((volatile uint16_t *)(l_uart_base + offset)) = (uint16_t)data; - - if (width_mask & WIDTH_BIT32) - *((volatile uint32_t *)(l_uart_base + offset)) = (uint32_t)data; - -} - -static -void -uart_setup(void) -{ - - - -} - -static -void -uart_enable_txintr(void) -{ - uint32_t data; - - /* Enable TX interrupt by setting mask bit[5] in UARTIMSC */ - data = uart_reg_read(SBSA_UARTIMSC, WIDTH_BIT32); - data = data | (1<<5); - uart_reg_write(SBSA_UARTIMSC, WIDTH_BIT32, data); -} - -static -void -uart_disable_txintr(void) -{ - uint32_t data; - - /* Disable TX interrupt by clearing mask bit[5] in UARTIMSC */ - data = uart_reg_read(SBSA_UARTIMSC, WIDTH_BIT32); - data = data & (~(1<<5)); - uart_reg_write(SBSA_UARTIMSC, WIDTH_BIT32, data); - -} - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uart_disable_txintr(); - val_print(AVS_PRINT_DEBUG, "\n Received interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM1, 01)); - val_gic_end_of_interrupt(int_id); -} - -static -uint32_t -validate_register_access(uint32_t offset, uint32_t width) -{ - if (width & WIDTH_BIT8) { - uart_reg_write(offset, WIDTH_BIT8, 0xF); - } - if (width & WIDTH_BIT16) { - uart_reg_write(offset, WIDTH_BIT16, 0xF); - } - if (width & WIDTH_BIT32) { - uart_reg_write(offset, WIDTH_BIT32, 0xF); - } - return AVS_STATUS_PASS; - -} - -static -void -payload(void) -{ - - uint32_t count = val_peripheral_get_info(NUM_UART, 0); - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); - val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); - - branch_to_test = (uint64_t)&&exception_taken; - - if (count == 0) { - val_print(AVS_PRINT_WARN, "\n No UART defined by Platform ", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while (count != 0) { - - l_uart_base = val_peripheral_get_info(UART_BASE0, count - 1); - if (l_uart_base == 0) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - uart_setup(); - - /*Make sure write to a read only register doesn't cause any exceptions*/ - validate_register_access(SBSA_UARTFR, WIDTH_BIT8 | WIDTH_BIT16 | WIDTH_BIT32); - validate_register_access(SBSA_UARTRIS, WIDTH_BIT16 | WIDTH_BIT32); - validate_register_access(SBSA_UARTMIS, WIDTH_BIT16 | WIDTH_BIT32); - /* Writing bits 11:8 as 0xF and writing space character (0x20) to UART data register */ - uart_reg_write(SBSA_UARTDR, WIDTH_BIT32, 0xF20); - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - - count--; - } -exception_taken: - return; -} - -static -void -payload1(void) -{ - uint32_t count = val_peripheral_get_info(NUM_UART, 0); - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint32_t timeout; - - if (count == 0) { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM1, 01)); - return; - } - - while (count != 0) { - timeout = TIMEOUT_MEDIUM; - int_id = val_peripheral_get_info(UART_GSIV, count - 1); - l_uart_base = val_peripheral_get_info(UART_BASE0, count - 1); - - /* If Interrupt ID is available, check for interrupt generation */ - if (int_id != 0x0) { - /* PASS will be set from ISR */ - val_set_status(index, RESULT_PENDING(g_sbsa_level, TEST_NUM1)); - if (val_gic_install_isr(int_id, isr)) { - val_print(AVS_PRINT_ERR, "\n GIC Install Handler Fail", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM1, 01)); - return; - } - uart_enable_txintr(); - val_print_raw(l_uart_base, g_print_level, - "\n Test Message ", 0); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))) { - }; - - if (timeout == 0) { - val_print(AVS_PRINT_ERR, - "\n Did not receive UART interrupt %d ", int_id); - test_fail++; - } - } else { - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM1, 02)); - } - - count--; - } - if (test_fail) - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM1, 02)); - else - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM1, 02)); -} - - -/** - @brief Verify UART registers for Read-only bits and also - enable interrupt generation -**/ -uint32_t -d003_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - if (!status) { - status = val_initialize_test(TEST_NUM1, TEST_DESC1, val_pe_get_num(), g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM1, num_pe, payload1, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM1, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM1)); - } - - - return status; -} diff --git a/test_pool/peripherals/test_m001.c b/test_pool/peripherals/test_m001.c deleted file mode 100644 index 25a9ff05..00000000 --- a/test_pool/peripherals/test_m001.c +++ /dev/null @@ -1,127 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2020-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_peripherals.h" -#include "val/include/sbsa_avs_pe.h" -#include "val/include/sbsa_avs_memory.h" - -#define TEST_NUM (AVS_PER_TEST_NUM_BASE + 5) -#define TEST_DESC "Memory Access to Un-Populated addr" - -#define LOOP_VAR 3 /* Number of Addresses to check */ - -static void *branch_to_test; - -static -void -esr(uint64_t interrupt_type, void *context) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - /* Update the ELR to point to next instrcution */ - val_pe_update_elr(context, (uint64_t)branch_to_test); - - val_print(AVS_PRINT_INFO, "\n Received DAbort Exception %d", interrupt_type); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -static -void -payload(void) -{ - addr_t addr; - uint64_t attr; - uint32_t instance = 0; - uint64_t status; - uint32_t loop_var = LOOP_VAR; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - status = val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); - status |= val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); - if (status) - { - val_print(AVS_PRINT_ERR, "\n Failed in installing the exception handler", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - - /* If we don't find a single un-populated address, mark this test as skipped */ - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - - while (loop_var) { - /* Get the base address of unpopulated region */ - status = val_memory_get_unpopulated_addr(&addr, instance); - if (status == MEM_MAP_NO_MEM) { - val_print(AVS_PRINT_INFO, "\n All instances of unpopulated memory were obtained", 0); - return; - } - - if (status) { - val_print(AVS_PRINT_ERR, "\n Error in obtaining unpopulated memory for instance 0x%d", instance); - return; - } - - if (val_memory_get_info(addr, &attr) == MEM_TYPE_NOT_POPULATED) { - /* default value of FAIL, Pass is set in the exception handler */ - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - branch_to_test = &&exception_taken; - - *((volatile uint64_t*)addr) = 0x100; -exception_taken: - /* if the access did not go to our exception handler, fail and exit */ - if (IS_TEST_FAIL(val_get_status(index))) { - val_print(AVS_PRINT_ERR, "\n Memory access check fails at address = 0x%llx ", addr); - return; - } - - } - - loop_var--; - instance++; - } - -} - -uint32_t -m001_entry(uint32_t num_pe) -{ - - uint32_t error_flag = 0; - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, val_pe_get_num(), g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - error_flag = val_check_for_error(TEST_NUM, num_pe); - - if (!error_flag) - status = AVS_STATUS_PASS; - else - status = AVS_STATUS_FAIL; - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/power_wakeup/test_u001.c b/test_pool/power_wakeup/test_u001.c deleted file mode 100755 index c50ebaa9..00000000 --- a/test_pool/power_wakeup/test_u001.c +++ /dev/null @@ -1,355 +0,0 @@ -/** @file - * Copyright (c) 2016-2019, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_wakeup.h" - -#define TEST_DESC " TEST Wakeup from Power Semantic B \n" - -#define TEST_NUM (AVS_WAKEUP_TEST_NUM_BASE + 1) -#define TEST_DESC1 "Wake from EL0 PHY Timer Interrupt " -#define TEST_NUM2 (AVS_WAKEUP_TEST_NUM_BASE + 2) -#define TEST_DESC2 "Wake from EL0 VIRT Timer Interrupt" -#define TEST_NUM3 (AVS_WAKEUP_TEST_NUM_BASE + 3) -#define TEST_DESC3 "Wake from EL2 PHY Timer Interrupt " -#define TEST_NUM4 (AVS_WAKEUP_TEST_NUM_BASE + 4) -#define TEST_DESC4 "Wake from Watchdog WS0 Interrupt " -#define TEST_NUM5 (AVS_WAKEUP_TEST_NUM_BASE + 5) -#define TEST_DESC5 "Wake from System Timer Interrupt " - -static uint32_t intid; -uint64_t timer_num; -static uint32_t g_wd_int_received; -static uint32_t g_failsafe_int_received; -extern uint32_t g_wakeup_timeout; - -static -void -isr_failsafe(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - val_timer_set_phy_el1(0); - val_print(AVS_PRINT_ERR, "\n Received Failsafe interrupt ", 0); - g_failsafe_int_received = 1; - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - intid = val_timer_get_info(TIMER_INFO_PHY_EL1_INTID, 0); - val_gic_end_of_interrupt(intid); -} - -static -void -isr1(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - val_timer_set_phy_el1(0); - val_print(AVS_PRINT_INFO, "\n Received EL1 PHY interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - intid = val_timer_get_info(TIMER_INFO_PHY_EL1_INTID, 0); - val_gic_end_of_interrupt(intid); -} - - -static -void -isr2(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - /* We received our interrupt, so disable timer from generating further interrupts */ - val_timer_set_vir_el1(0); - val_print(AVS_PRINT_INFO, "\n Received EL1 VIRT interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM2, 01)); - intid = val_timer_get_info(TIMER_INFO_VIR_EL1_INTID, 0); - val_gic_end_of_interrupt(intid); -} - -static -void -isr3(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - /* We received our interrupt, so disable timer from generating further interrupts */ - val_timer_set_phy_el2(0); - val_print(AVS_PRINT_INFO, "\n Received EL2 Physical interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM3, 01)); - intid = val_timer_get_info(TIMER_INFO_PHY_EL2_INTID, 0); - val_gic_end_of_interrupt(intid); -} - -static -void -isr4(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - val_wd_set_ws0(timer_num, 0); - val_print(AVS_PRINT_INFO, "\n Received WS0 interrupt ", 0); - g_wd_int_received = 1; - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM4, 01)); - intid = val_wd_get_info(timer_num, WD_INFO_GSIV); - val_gic_end_of_interrupt(intid); -} - -static -void -isr5(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint64_t cnt_base_n = val_timer_get_info(TIMER_INFO_SYS_CNT_BASE_N, timer_num); - val_timer_disable_system_timer((addr_t)cnt_base_n); - val_print(AVS_PRINT_INFO, "\n Received Sys timer interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM5, 01)); - intid = val_timer_get_info(TIMER_INFO_SYS_INTID, timer_num); - val_gic_end_of_interrupt(intid); -} - -static -void -wakeup_set_failsafe(void) -{ - uint64_t timer_expire_val = val_get_counter_frequency() * (g_wakeup_timeout + 1); - - intid = val_timer_get_info(TIMER_INFO_PHY_EL1_INTID, 0); - val_gic_install_isr(intid, isr_failsafe); - val_timer_set_phy_el1(timer_expire_val); -} - -static -void -wakeup_clear_failsafe(void) -{ - val_timer_set_phy_el1(0); - -} - -static -void -payload1(void) -{ - uint64_t timer_expire_val = val_get_counter_frequency() * g_wakeup_timeout; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - - intid = val_timer_get_info(TIMER_INFO_PHY_EL1_INTID, 0); - val_gic_install_isr(intid, isr1); - val_timer_set_phy_el1(timer_expire_val); - val_power_enter_semantic(SBSA_POWER_SEM_B); - return; -} - -static -void -payload2(void) -{ - uint64_t timer_expire_val = val_get_counter_frequency() * g_wakeup_timeout; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM2, 01)); - intid = val_timer_get_info(TIMER_INFO_VIR_EL1_INTID, 0); - val_gic_install_isr(intid, isr2); - wakeup_set_failsafe(); - val_timer_set_vir_el1(timer_expire_val); - val_power_enter_semantic(SBSA_POWER_SEM_B); - wakeup_clear_failsafe(); - return; -} - -static -void -payload3(void) -{ - uint64_t timer_expire_val = val_get_counter_frequency() * g_wakeup_timeout; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM3, 01)); - intid = val_timer_get_info(TIMER_INFO_PHY_EL2_INTID, 0); - val_gic_install_isr(intid, isr3); - wakeup_set_failsafe(); - val_timer_set_phy_el2(timer_expire_val); - val_power_enter_semantic(SBSA_POWER_SEM_B); - wakeup_clear_failsafe(); - return; -} - -static -void -payload4(void) -{ - uint32_t status, ns_wdg = 0; - uint64_t timer_expire_val = 1 * g_wakeup_timeout; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - timer_num = val_wd_get_info(0, WD_INFO_COUNT); - if(!timer_num){ - val_print(AVS_PRINT_WARN, "\n No watchdog implemented ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM4, 01)); - return; - } - - while(timer_num--) { - if(val_wd_get_info(timer_num, WD_INFO_ISSECURE)) - continue; - - ns_wdg++; - intid = val_wd_get_info(timer_num, WD_INFO_GSIV); - status = val_gic_install_isr(intid, isr4); - if (status == 0) { - wakeup_set_failsafe(); - status = val_wd_set_ws0(timer_num, timer_expire_val); - if (status) { - val_print(AVS_PRINT_ERR, "\n Setting watchdog timeout failed", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM4, 02)); - return; - } - g_wd_int_received = 0; - g_failsafe_int_received = 0; - - val_power_enter_semantic(SBSA_POWER_SEM_B); - wakeup_clear_failsafe(); - /* If PE wakeup is due to some interrupt other than WD - or failsafe, test will be consider as PASS(as BSA WAK_10 rule - Semantic B is satisfied) - Test will be consider as failure in case WD interrupt - failed to fire. - */ - if (!(g_wd_int_received || g_failsafe_int_received)) { - val_gic_clear_interrupt(intid); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM4, 1)); - } - } else { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM4, 01)); - } - } - - if(!ns_wdg){ - val_print(AVS_PRINT_WARN, "\n No non-secure watchdog implemented ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM4, 02)); - return; - } - -} - -static -void -payload5(void) -{ - uint64_t cnt_base_n; - uint64_t timer_expire_val = val_get_counter_frequency() * g_wakeup_timeout; - uint32_t status, ns_timer = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - timer_num = val_timer_get_info(TIMER_INFO_NUM_PLATFORM_TIMERS, 0); - if(!timer_num){ - val_print(AVS_PRINT_WARN, "\n No system timers implemented ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM5, 01)); - return; - } - - while(timer_num--) { - - if(val_timer_get_info(TIMER_INFO_IS_PLATFORM_TIMER_SECURE, timer_num)) - continue; - - ns_timer++; - status = val_timer_get_info(TIMER_INFO_SYS_TIMER_STATUS, 0); - if(status != AVS_STATUS_PASS){ - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM5, 02)); - return; - } - - //Read CNTACR to determine whether access permission from NS state is permitted - status = val_timer_skip_if_cntbase_access_not_allowed(timer_num); - if(status == AVS_STATUS_SKIP){ - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM5, 03)); - return; - } - - cnt_base_n = val_timer_get_info(TIMER_INFO_SYS_CNT_BASE_N, timer_num); - if(cnt_base_n == 0){ - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM5, 04)); - return; - } - - intid = val_timer_get_info(TIMER_INFO_SYS_INTID, timer_num); - status = val_gic_install_isr(intid, isr5); - - if(status == 0) { - wakeup_set_failsafe(); - /* enable System timer */ - val_timer_set_system_timer((addr_t)cnt_base_n, timer_expire_val); - val_power_enter_semantic(SBSA_POWER_SEM_B); - wakeup_clear_failsafe(); - } else{ - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM5, 01)); - return; - } - } - - if(!ns_timer){ - val_print(AVS_PRINT_WARN, "\n No non-secure systimer implemented ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM4, 03)); - return; - } -} - -uint32_t -u001_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL, status_test = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - val_print(AVS_PRINT_TEST, TEST_DESC, 0); - - status_test = val_initialize_test(TEST_NUM, TEST_DESC1, num_pe, g_sbsa_level); - if (status_test != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload1, 0); - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - status_test = val_initialize_test(TEST_NUM2, TEST_DESC2, num_pe, g_sbsa_level); - if (status_test != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM2, num_pe, payload2, 0); - status |= val_check_for_error(TEST_NUM2, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM2)); - - /* Run this test if current exception level is EL2 */ - if (val_pe_reg_read(CurrentEL) == AARCH64_EL2) { - status_test = val_initialize_test(TEST_NUM3, TEST_DESC3, num_pe, g_sbsa_level); - if (status_test != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM3, num_pe, payload3, 0); - status |= val_check_for_error(TEST_NUM3, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM3)); - } - - status_test = val_initialize_test(TEST_NUM4, TEST_DESC4, num_pe, g_sbsa_level); - if (status_test != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM4, num_pe, payload4, 0); - status |= val_check_for_error(TEST_NUM4, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM4)); - - status_test = val_initialize_test(TEST_NUM5, TEST_DESC5, num_pe, g_sbsa_level); - if (status_test != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM5, num_pe, payload5, 0); - status |= val_check_for_error(TEST_NUM5, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM5)); - - return status; -} diff --git a/test_pool/power_wakeup/test_u002.c b/test_pool/power_wakeup/test_u002.c deleted file mode 100755 index a8c1823c..00000000 --- a/test_pool/power_wakeup/test_u002.c +++ /dev/null @@ -1,275 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/sbsa_avs_pe.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_wakeup.h" -#include "val/include/sbsa_std_smc.h" - -#define TEST_NUM (AVS_WAKEUP_TEST_NUM_BASE + 6) -#define TEST_DESC "Test No-Wake from Power Semantic F" - -static uint32_t intid, wakeup_event, cnt_base_n=0; -static uint64_t timer_num, wd_num; - -#define WATCHDOG_SEMF 0x1 -#define SYSTIMER_SEMF 0x2 - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint32_t status; - - //val_print(AVS_PRINT_INFO, "\n Received interrupt ", 0); - if(wakeup_event == SYSTIMER_SEMF) - val_timer_disable_system_timer((addr_t)cnt_base_n); - else if(wakeup_event == WATCHDOG_SEMF) { - status = val_wd_set_ws0(wd_num, 0); - if (status) - val_print(AVS_PRINT_ERR, "\n Setting watchdog timeout failed", 0); - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(intid); -} - -static -uint32_t -wakeup_event_for_semantic_f(void) -{ - uint32_t ns_timer = 0, ns_wdg = 0; - wd_num = val_wd_get_info(0, WD_INFO_COUNT); - - if(wd_num == 0){ - timer_num = val_timer_get_info(TIMER_INFO_NUM_PLATFORM_TIMERS, 0); - if(timer_num == 0) - return 0; - else{ - while(timer_num--) { - if(val_timer_get_info(TIMER_INFO_IS_PLATFORM_TIMER_SECURE, timer_num)) - continue; - else{ - ns_timer++; - break; - } - } - if(ns_timer == 0) - return 0; - intid = val_timer_get_info(TIMER_INFO_SYS_INTID, timer_num); - return SYSTIMER_SEMF; - } - } - else{ - while(wd_num--) { - if(val_wd_get_info(wd_num, WD_INFO_ISSECURE)) - continue; - else{ - ns_wdg++; - break; - } - } - if(ns_wdg == 0) - return 0; - intid = val_wd_get_info(wd_num, WD_INFO_GSIV); - return WATCHDOG_SEMF; - } - -} - -static -void -payload_target_pe(void) -{ - uint64_t data1, data2; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - //val_print(AVS_PRINT_INFO, "\n Print from target PE ", 0); - val_get_test_data(index, &data1, &data2); - val_pe_reg_write(VBAR_EL2, data2); - - val_gic_cpuif_init(); - val_suspend_pe(0,0,0); - // Set the status to indicate that target PE has resumed execution from sleep mode - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); -} - -static -void -payload_dummy(void) -{ - -} - -static -void -payload(void) -{ - uint64_t timeout = TIMEOUT_SMALL; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint32_t target_pe, status; - uint64_t timer_expire_ticks = TIMEOUT_SMALL; - - // Step1: Choose the index of the target PE - if ((index + 1) >= val_pe_get_num()) - target_pe = index-1; - else - target_pe = index+1; - - val_set_status(target_pe, RESULT_PENDING(g_sbsa_level, TEST_NUM)); - - // Step2: Get the wakeup event, which is either watchdog signal or system timer - // if none of these are present in a platform, skip the test - wakeup_event = wakeup_event_for_semantic_f(); - if(wakeup_event == 0){ - val_print(AVS_PRINT_WARN, "\n No Watchdogs and system timers present", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - // Step3: Route the interrupt to target PE and install ISR - val_gic_route_interrupt_to_pe(intid, val_pe_get_mpid_index(target_pe)); - val_gic_install_isr(intid, isr); - - // Step4: val_execute_on_pe will call payload on target PE and target PE will do following: - // 1. program VBAR of target PE with the same vale as main PE - // 2. initialize gic cpu interface for target PE - // 3. place itself in sleep mode and expect the wakeup_event to wake it up - // 4. after wake-up it will update the status, which main PE will rely on - val_execute_on_pe(target_pe, payload_target_pe, val_pe_reg_read(VBAR_EL2)); - - // Step5: Program timer/watchdog, which on expiry will generate an interrupt - // and wake target PE - if(wakeup_event == SYSTIMER_SEMF){ - cnt_base_n = val_timer_get_info(TIMER_INFO_SYS_CNT_BASE_N, timer_num); - val_timer_set_system_timer((addr_t)cnt_base_n, timer_expire_ticks); - } - else if(wakeup_event == WATCHDOG_SEMF){ - status = val_wd_set_ws0(wd_num, timer_expire_ticks); - if (status) { - val_print(AVS_PRINT_ERR, "\n Setting watchdof timeout failed", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - } - - // Step6: Wait for target PE to update the status, if a timeout occurs that would mean that - // target PE was not able to wakeup - while((IS_TEST_PASS(val_get_status(target_pe))) && (--timeout)); - - if(timeout == 0) - val_print(AVS_PRINT_INFO, "\n Target PE was not able to wakeup succesfully from sleep \n due to watchdog/sytimer interrupt", 0); - - // Step7: Clear the pending/active interrupt if any - if(1 == val_gic_get_interrupt_state(intid)){ - val_print(AVS_PRINT_INFO, "\n Pending interrupt was seen for the 1st interrupt", 0); - if(wakeup_event == SYSTIMER_SEMF) - val_timer_disable_system_timer((addr_t)cnt_base_n); - else if(wakeup_event == WATCHDOG_SEMF) { - status = val_wd_set_ws0(wd_num, 0); - if (status) { - val_print(AVS_PRINT_ERR, "\n Setting watchdof timeout failed", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); - return; - } - } - - val_gic_clear_interrupt(intid); - } - val_gic_end_of_interrupt(intid); // trigger END of interrupt for above interrupt - - // Step8: Wait for target PE to switch itself off, if it still doesn't switch off timeout - // value should be increased - timeout = TIMEOUT_SMALL; - while(--timeout); - - // Step9: Generate timer interrupt again, when target PE is off and make sure it doesn't wakeup - val_gic_route_interrupt_to_pe(intid, val_pe_get_mpid_index(target_pe)); - val_gic_install_isr(intid, isr); - timer_expire_ticks = TIMEOUT_SMALL; - - if(wakeup_event == SYSTIMER_SEMF) - val_timer_set_system_timer((addr_t)cnt_base_n, timer_expire_ticks); - else if(wakeup_event == WATCHDOG_SEMF) { - status = val_wd_set_ws0(wd_num, timer_expire_ticks); - if (status) { - val_print(AVS_PRINT_ERR, "\n Setting watchdof timeout failed", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); - return; - } - } - - val_print(AVS_PRINT_INFO, "\n Interrupt generating sequence triggered", 0); - - // Step10: wait for interrupt to become active or pendind for a timeout duration - timeout = TIMEOUT_MEDIUM; - while ((--timeout) && (0 == val_gic_get_interrupt_state(intid))); - - if(timeout == 0) - val_print(AVS_PRINT_INFO, "\n No pending interrupt was seen for the 2nd interrupt", 0); - else{ - val_print(AVS_PRINT_INFO, "\n Pending interrupt was seen for the 2nd interrupt", 0); - if(wakeup_event == SYSTIMER_SEMF) - val_timer_disable_system_timer((addr_t)cnt_base_n); - else if(wakeup_event == WATCHDOG_SEMF) { - status = val_wd_set_ws0(wd_num, 0); - if (status) { - val_print(AVS_PRINT_ERR, "\n Setting watchdof timeout failed", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); - return; - } - } - - val_gic_clear_interrupt(intid); - val_gic_end_of_interrupt(intid); // trigger END of interrupt for above interrupt - } - - // Step11: If event triggered woke up the target PE when it was off, then making PSCI call - // to switch it ON again would throw an error response, based on which the test is - // passed ot failed. - val_execute_on_pe(target_pe, payload_dummy, 0); - - if(IS_TEST_FAIL(val_get_status(target_pe)) || IS_RESULT_PENDING(val_get_status(target_pe))) - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - else - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - - return; -} - - -uint32_t -u002_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL, status_test = AVS_STATUS_FAIL; - - num_pe = 1; //This test is run on single processor, which will start and trigger interrupt to - // target PE. - - status_test = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status_test != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/io_virt/test_i007.c b/test_pool/smmu/operating_system/test_i001.c old mode 100755 new mode 100644 similarity index 89% rename from test_pool/io_virt/test_i007.c rename to test_pool/smmu/operating_system/test_i001.c index ea54b109..76e7e575 --- a/test_pool/io_virt/test_i007.c +++ b/test_pool/smmu/operating_system/test_i001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,8 @@ #include "val/include/sbsa_avs_smmu.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 7) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 1) +#define TEST_RULE "S_L3SM_01 " #define TEST_DESC "Check SMMU Version " static @@ -73,21 +74,21 @@ payload(void) } uint32_t -i007_entry(uint32_t num_pe) +i001_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_i003.c b/test_pool/smmu/operating_system/test_i002.c old mode 100755 new mode 100644 similarity index 89% rename from test_pool/io_virt/test_i003.c rename to test_pool/smmu/operating_system/test_i002.c index df6ac6c3..e0a51d57 --- a/test_pool/io_virt/test_i003.c +++ b/test_pool/smmu/operating_system/test_i002.c @@ -20,8 +20,8 @@ #include "val/include/sbsa_avs_smmu.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 3) -#define TEST_RULE "S_L4SM_01, S_L4SM_02" +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 2) +#define TEST_RULE "S_L4SM_01, S_L4SM_02, S_L5SM_01, S_L5SM_02" #define TEST_DESC "SMMU Compatibility Check " static @@ -48,7 +48,7 @@ payload(void) if (g_sbsa_level > 3) { val_print(AVS_PRINT_ERR, - "\n Smmuv3 should be supported Level %x", g_sbsa_level); + "\n SMMUv3 should be supported at level %x", g_sbsa_level); val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); return; } @@ -93,21 +93,21 @@ payload(void) } uint32_t -i003_entry(uint32_t num_pe) +i002_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/smmu/operating_system/test_i003.c b/test_pool/smmu/operating_system/test_i003.c new file mode 100644 index 00000000..f2c24a2e --- /dev/null +++ b/test_pool/smmu/operating_system/test_i003.c @@ -0,0 +1,100 @@ +/** @file + * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_pcie.h" + +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 3) +#define TEST_RULE "B_SMMU_09" +#define TEST_DESC "SMMU revision and S-EL2 support " + +static +void +payload() +{ + + uint32_t num_smmu; + uint32_t index; + uint32_t s_el2; + uint32_t smmu_rev; + uint32_t minor; + uint32_t s1ts, s1p; + + index = val_pe_get_index_mpid(val_pe_get_mpid()); + s_el2 = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 36, 39); + + num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); + if (num_smmu == 0) { + val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); + return; + } + + while (num_smmu--) { + smmu_rev = val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu); + + if (s_el2) { + if (smmu_rev == 2) { + s1ts = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv2_IDR0, num_smmu), 30, 30); + // Stage 1 translation functionality cannot be provided by SMMU v2 revision + if (s1ts) { + val_print(AVS_PRINT_ERR, + "\n SMMUv2 detected: revision must be v3.2 or higher ", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); + return; + } + } + else if (smmu_rev == 3) { + minor = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_AIDR, num_smmu), 0, 3); + s1p = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR0, num_smmu), 1, 1); + // Stage 1 translation functionality cannot be provided by SMMU v3.0/3.1 revisions + if ((minor < 2) && s1p) { + val_print(AVS_PRINT_ERR, + "\n SMMUv3.%d detected: revision must be v3.2 or higher ", minor); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); + return; + } + } + } + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 1)); +} + +uint32_t +i003_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/smmu/operating_system/test_i004.c b/test_pool/smmu/operating_system/test_i004.c new file mode 100644 index 00000000..ecb319a4 --- /dev/null +++ b/test_pool/smmu/operating_system/test_i004.c @@ -0,0 +1,100 @@ +/** @file + * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_pcie.h" + +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 4) +#define TEST_RULE "B_SMMU_20" +#define TEST_DESC "SMMU Revision,S-EL2 support Hyp " + +static +void +payload() +{ + /* Check SMMU Revision & S-EL2 Support for Hypervisor */ + uint32_t num_smmu; + uint32_t index; + uint32_t s_el2; + uint32_t smmu_rev; + uint32_t minor; + uint32_t s2ts, s2p; + + index = val_pe_get_index_mpid(val_pe_get_mpid()); + s_el2 = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 36, 39); + + num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); + if (num_smmu == 0) { + val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); + return; + } + + while (num_smmu--) { + smmu_rev = val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu); + + if (s_el2) { + if (smmu_rev == 2) { + s2ts = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv2_IDR0, num_smmu), 29, 29); + // Stage 2 translation functionality cannot be provided by SMMU v2 revision + if (s2ts) { + val_print(AVS_PRINT_ERR, + "\n SMMUv2 detected: revision must be v3.2 or higher ", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); + return; + } + } + else if (smmu_rev == 3) { + minor = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_AIDR, num_smmu), 0, 3); + s2p = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR0, num_smmu), 0, 0); + // Stage 2 translation functionality cannot be provided by SMMU v3.0/3.1 revisions + if ((minor < 2) && s2p) { + val_print(AVS_PRINT_ERR, + "\n SMMUv3.%d detected: revision must be v3.2 or higher ", minor); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); + return; + } + } + } + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 1)); +} + +uint32_t +i004_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/io_virt/test_i013.c b/test_pool/smmu/operating_system/test_i005.c similarity index 90% rename from test_pool/io_virt/test_i013.c rename to test_pool/smmu/operating_system/test_i005.c index 98c345e1..a6f60f0f 100644 --- a/test_pool/io_virt/test_i013.c +++ b/test_pool/smmu/operating_system/test_i005.c @@ -21,7 +21,8 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pcie.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 13) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 5) +#define TEST_RULE "S_L6SM_01" #define TEST_DESC "Check SMMU Coherent Access Support" static @@ -74,21 +75,21 @@ payload(void) } uint32_t -i013_entry(uint32_t num_pe) +i005_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_i014.c b/test_pool/smmu/operating_system/test_i006.c similarity index 90% rename from test_pool/io_virt/test_i014.c rename to test_pool/smmu/operating_system/test_i006.c index b3c1981a..e2ceeb4c 100644 --- a/test_pool/io_virt/test_i014.c +++ b/test_pool/smmu/operating_system/test_i006.c @@ -21,7 +21,8 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pcie.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 14) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 6) +#define TEST_RULE "S_L6SM_02" #define TEST_DESC "Check SMMU HTTU Support " static @@ -74,21 +75,21 @@ payload(void) } uint32_t -i014_entry(uint32_t num_pe) +i006_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_i009.c b/test_pool/smmu/operating_system/test_i007.c similarity index 76% rename from test_pool/io_virt/test_i009.c rename to test_pool/smmu/operating_system/test_i007.c index 21a4498d..c57b8fe6 100644 --- a/test_pool/io_virt/test_i009.c +++ b/test_pool/smmu/operating_system/test_i007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,12 +21,13 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pcie.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 9) -#define TEST_DESC "Check SMMU 16 Bit ASID Support " +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 7) +#define TEST_RULE "S_L6SM_03" +#define TEST_DESC "Check SMMU MSI Support " static void -payload(void) +payload() { uint64_t data; @@ -38,32 +39,25 @@ payload(void) return; } - data = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); - - if (data == 0) { - val_print(AVS_PRINT_WARN, "\n PCIe Subsystem not discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); if (num_smmu == 0) { val_print(AVS_PRINT_ERR, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); return; } while (num_smmu--) { if (val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu) == 2) { val_print(AVS_PRINT_WARN, "\n Not valid for SMMU v2 ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); return; } - data = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR0, num_smmu), 12, 12); + data = VAL_EXTRACT_BITS(val_smmu_read_cfg(SMMUv3_IDR0, num_smmu), 13, 13); - if (data != 1) { + /* Check If SMMU_IDR0.MSI[13:13] == 0b1*/ + if (data != 0b1) { val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); return; } @@ -73,21 +67,21 @@ payload(void) } uint32_t -i009_entry(uint32_t num_pe) +i007_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_hyp_i005.c b/test_pool/smmu/operating_system/test_i008.c similarity index 87% rename from test_pool/io_virt/test_hyp_i005.c rename to test_pool/smmu/operating_system/test_i008.c index 53ad966b..64c8b2dd 100644 --- a/test_pool/io_virt/test_hyp_i005.c +++ b/test_pool/smmu/operating_system/test_i008.c @@ -22,9 +22,9 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pcie.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 20) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 8) #define TEST_RULE "B_SMMU_23" -#define TEST_DESC "Check SMMU 16 Bit VMID Support " +#define TEST_DESC "Check SMMU 16 Bit VMID Support " static void @@ -67,21 +67,21 @@ payload() } uint32_t -hyp_i005_entry(uint32_t num_pe) +i008_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(6, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_os_i005.c b/test_pool/smmu/operating_system/test_i009.c similarity index 90% rename from test_pool/io_virt/test_os_i005.c rename to test_pool/smmu/operating_system/test_i009.c index 09f9604c..d7b47156 100644 --- a/test_pool/io_virt/test_os_i005.c +++ b/test_pool/smmu/operating_system/test_i009.c @@ -21,7 +21,7 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pe.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 21) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 9) #define TEST_RULE "B_SMMU_03" #define TEST_DESC "Check Large Virtual Addr Support " @@ -73,22 +73,22 @@ payload() } uint32_t -os_i005_entry(uint32_t num_pe) +i009_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(6, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_os_i006.c b/test_pool/smmu/operating_system/test_i010.c similarity index 89% rename from test_pool/io_virt/test_os_i006.c rename to test_pool/smmu/operating_system/test_i010.c index 8b652c72..eb710c40 100644 --- a/test_pool/io_virt/test_os_i006.c +++ b/test_pool/smmu/operating_system/test_i010.c @@ -21,9 +21,9 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pe.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 22) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 10) #define TEST_RULE "B_SMMU_04, B_SMMU_05" -#define TEST_DESC "Check TLB Range Invalidation " +#define TEST_DESC "Check TLB Range Invalidation " static void @@ -77,22 +77,22 @@ payload() } uint32_t -os_i006_entry(uint32_t num_pe) +i010_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(6, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_os_i007.c b/test_pool/smmu/operating_system/test_i011.c similarity index 89% rename from test_pool/io_virt/test_os_i007.c rename to test_pool/smmu/operating_system/test_i011.c index 2e827c4c..cccb3b4b 100644 --- a/test_pool/io_virt/test_os_i007.c +++ b/test_pool/smmu/operating_system/test_i011.c @@ -22,9 +22,9 @@ #include "val/include/sbsa_avs_smmu.h" #include "val/include/sbsa_avs_pcie.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 23) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 11) #define TEST_RULE "B_SMMU_13" -#define TEST_DESC "Check SMMU 16 Bit ASID Support " +#define TEST_DESC "Check SMMU 16 Bit ASID Support " static void @@ -79,21 +79,21 @@ payload() } uint32_t -os_i007_entry(uint32_t num_pe) +i011_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(6, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/io_virt/test_os_i008.c b/test_pool/smmu/operating_system/test_i012.c similarity index 90% rename from test_pool/io_virt/test_os_i008.c rename to test_pool/smmu/operating_system/test_i012.c index da8a944f..24d2d9b2 100644 --- a/test_pool/io_virt/test_os_i008.c +++ b/test_pool/smmu/operating_system/test_i012.c @@ -22,9 +22,9 @@ #include "val/include/sbsa_avs_pcie.h" #include "val/include/sbsa_avs_pe.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 24) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 12) #define TEST_RULE "B_SMMU_14" -#define TEST_DESC "Check SMMU Endianess Support " +#define TEST_DESC "Check SMMU Endianess Support " static void @@ -88,21 +88,21 @@ payload() } uint32_t -os_i008_entry(uint32_t num_pe) +i012_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(6, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/smmu/operating_system/test_i013.c b/test_pool/smmu/operating_system/test_i013.c new file mode 100644 index 00000000..6a8ca189 --- /dev/null +++ b/test_pool/smmu/operating_system/test_i013.c @@ -0,0 +1,108 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_iovirt.h" +#include "val/include/sbsa_avs_pe.h" + +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 13) +#define TEST_RULE "S_L7SM_01" +#define TEST_DESC "Check if all DMA reqs behind SMMU " + +static +void +payload() +{ + + uint32_t num_pcie_rc, num_named_comp; + uint32_t i, test_fails = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* check whether all DMA capable PCIe root complexes are behind a SMMU */ + num_pcie_rc = val_iovirt_get_pcie_rc_info(NUM_PCIE_RC, 0); + + for (i = 0; i < num_pcie_rc; i++) { + /* print info fields */ + val_print(AVS_PRINT_DEBUG, "\n RC segment no : 0x%llx", + val_iovirt_get_pcie_rc_info(RC_SEGMENT_NUM, i)); + val_print(AVS_PRINT_DEBUG, "\n CCA attribute : 0x%x", + val_iovirt_get_pcie_rc_info(RC_MEM_ATTRIBUTE, i)); + val_print(AVS_PRINT_DEBUG, "\n SMMU base addr : 0x%llx\n", + val_iovirt_get_pcie_rc_info(RC_SMMU_BASE, i)); + + if (val_iovirt_get_pcie_rc_info(RC_MEM_ATTRIBUTE, i) == 0x1 && + val_iovirt_get_pcie_rc_info(RC_SMMU_BASE, i) == 0) { + val_print(AVS_PRINT_ERR, + "\n DMA capable PCIe root port with segment no: %llx not behind a SMMU.", + val_iovirt_get_pcie_rc_info(RC_SEGMENT_NUM, i)); + test_fails++; + } + } + + /* check whether all DMA capable Named component requestors are behind a SMMU */ + num_named_comp = val_iovirt_get_named_comp_info(NUM_NAMED_COMP, 0); + for (i = 0; i < num_named_comp; i++) { + /* print info fields */ + val_print(AVS_PRINT_DEBUG, "\n Named component :", 0); + val_print(AVS_PRINT_DEBUG, + (char8_t *)val_iovirt_get_named_comp_info(NAMED_COMP_DEV_OBJ_NAME, i), 0); + val_print(AVS_PRINT_DEBUG, "\n CCA attribute : 0x%x", + val_iovirt_get_named_comp_info(NAMED_COMP_CCA_ATTR, i)); + val_print(AVS_PRINT_DEBUG, "\n SMMU base addr : 0x%llx\n", + val_iovirt_get_named_comp_info(NAMED_COMP_SMMU_BASE, i)); + if (val_iovirt_get_named_comp_info(NAMED_COMP_CCA_ATTR, i) == 0x1 && + val_iovirt_get_named_comp_info(NAMED_COMP_SMMU_BASE, i) == 0) { + val_print(AVS_PRINT_ERR, + "\n DMA capable named component with namespace path: ", 0); + val_print(AVS_PRINT_ERR, + (char8_t *)val_iovirt_get_named_comp_info(NAMED_COMP_DEV_OBJ_NAME, i), 0); + val_print(AVS_PRINT_ERR, " not behind a SMMU.", 0); + test_fails++; + } + } + + if (test_fails) + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +i013_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on single processor */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/smmu/operating_system/test_i014.c b/test_pool/smmu/operating_system/test_i014.c new file mode 100644 index 00000000..438ae0df --- /dev/null +++ b/test_pool/smmu/operating_system/test_i014.c @@ -0,0 +1,120 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_iovirt.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_pcie.h" + +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 14) +#define TEST_RULE "S_L7SM_03, S_L7SM_04" +#define TEST_DESC "Check SMMUv3 PMU Extension " + +static +void +payload() +{ + + uint32_t num_smmu; + uint32_t num_pmcg = 0; + uint32_t i = 0; + uint32_t smmu_version; + uint64_t smmu_base = 0; + uint64_t pmcg_base = 0; + uint64_t pmcg_node_ref = 0; + uint64_t num_pmcg_count = 0; + uint64_t num_pmcg_found = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 6) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); + num_pmcg = val_iovirt_get_pmcg_info(PMCG_NUM_CTRL, 0); + + if (num_smmu == 0) { + val_print(AVS_PRINT_DEBUG, "\n No SMMU Controllers are discovered ", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + while (num_smmu--) { + smmu_version = val_smmu_get_info(SMMU_CTRL_ARCH_MAJOR_REV, num_smmu); + if (smmu_version != 3) { + val_print(AVS_PRINT_DEBUG, + "\n Valid for only SMMU v3, smmu version %d", smmu_version); + continue; + } + + smmu_base = val_smmu_get_info(SMMU_CTRL_BASE, num_smmu); + + num_pmcg_found = 0; + /* Each SMMUv3 should contain atleast 1 PMCG*/ + for (i = 0; i < num_pmcg; i++) { + pmcg_node_ref = val_iovirt_get_pmcg_info(PMCG_NODE_REF, i); + if (smmu_base == pmcg_node_ref) { + pmcg_base = val_iovirt_get_pmcg_info(PMCG_CTRL_BASE, i); + /*Check if SMMU_PMCG_CFGR.NCTR > 4*/ + num_pmcg_count = VAL_EXTRACT_BITS(val_mmio_read(pmcg_base + SMMU_PMCG_CFGR), 0, 5); + /*No of counters in a group is SMMU_PMCG_CFGR.NCTR + 1*/ + num_pmcg_count++; + /* Each PMCG should have atleast 4 counters*/ + if (num_pmcg_count < 4) { + val_print(AVS_PRINT_ERR, "\n PMCG has less then 4 counters", 0); + val_print(AVS_PRINT_ERR, + "\n No of PMCG counters :%d ", num_pmcg_count); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + num_pmcg_found++; + } + } + + if (num_pmcg_found == 0) { + val_print(AVS_PRINT_ERR, "\n PMU Extension not implimented for SMMUv3", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +i014_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/io_virt/test_os_i009.c b/test_pool/smmu/operating_system/test_i015.c similarity index 82% rename from test_pool/io_virt/test_os_i009.c rename to test_pool/smmu/operating_system/test_i015.c index 38ff8f66..f3a12290 100644 --- a/test_pool/io_virt/test_os_i009.c +++ b/test_pool/smmu/operating_system/test_i015.c @@ -21,9 +21,9 @@ #include "val/include/sbsa_avs_pe.h" #include "val/include/sbsa_avs_smmu.h" -#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 25) +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 15) #define TEST_RULE "B_SMMU_11, B_SMMU_22" -#define TEST_DESC "Check system for MPAM support " +#define TEST_DESC "Check system for MPAM support " static void @@ -47,13 +47,13 @@ payload() num_smmu = val_smmu_get_info(SMMU_NUM_CTRL, 0); if (num_smmu == 0) { val_print(AVS_PRINT_DEBUG, "\n No SMMU Controllers are discovered ", 0); - val_set_status(index, RESULT_SKIP(6, TEST_NUM, 3)); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); return; } if (!(pe_mpam || frac)) { val_print(AVS_PRINT_DEBUG, "\n No MPAM controlled resources present ", 0); - val_set_status(index, RESULT_SKIP(6, TEST_NUM, 3)); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); return; } @@ -62,7 +62,7 @@ payload() if (smmu_rev < 3) { // MPAM support not required for SMMUv2 and below val_print(AVS_PRINT_DEBUG, "\n SMMU revision v2 or lower detected ", 0); - val_set_status(index, RESULT_SKIP(6, TEST_NUM, 4)); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 4)); return; } else { @@ -78,7 +78,7 @@ payload() if (!(mpam && max_id)) { val_print(AVS_PRINT_ERR, "\n SMMU without MPAM support detected ", 0); - val_set_status(index, RESULT_FAIL(6, TEST_NUM, 4)); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); return; } } @@ -86,31 +86,31 @@ payload() // MPAM support not required for SMMUv3.0/3.1 val_print(AVS_PRINT_WARN, "\n SMMU revision v3.0/3.1 detected ", 0); - val_set_status(index, RESULT_SKIP(6, TEST_NUM, 4)); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 4)); return; } } } - val_set_status(index, RESULT_PASS(6, TEST_NUM, 1)); + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 1)); } uint32_t -os_i009_entry(uint32_t num_pe) +i015_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, 6); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); - val_report_status(0, SBSA_AVS_END(6, TEST_NUM)); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; } diff --git a/test_pool/smmu/operating_system/test_i016.c b/test_pool/smmu/operating_system/test_i016.c new file mode 100644 index 00000000..84b9ced2 --- /dev/null +++ b/test_pool/smmu/operating_system/test_i016.c @@ -0,0 +1,137 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_iovirt.h" + +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_smmu.h" + +#define TEST_NUM (AVS_SMMU_TEST_NUM_BASE + 16) +#define TEST_RULE "S_L7SM_02" +#define TEST_DESC "Check for SMMU/CATU in ETR Path " + +#define MAX_NUM_ETR 6 + +static +void +payload(void) +{ + uint32_t index = 0; + uint32_t status = 0; + uint32_t etr_count = 0; + uint32_t smmu_found = 0; + uint32_t num_named_comp = 0; + char etr_path[MAX_NUM_ETR][MAX_NAMED_COMP_LENGTH]; + uint32_t i = 0; + uint32_t j = 0; + + index = val_pe_get_index_mpid(val_pe_get_mpid()); + memset(etr_path, 0, sizeof(etr_path)); + + /*Check for ETR devices using ETR using unique HID (ARMHC501)*/ + status = val_get_device_path("ARMHC501", etr_path); + if (status != 0) { + val_print(AVS_PRINT_ERR, "\n Unable to get ETR device info from ACPI namespace", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); + return; + } + + if ((char)etr_path[0][0] == '\0') { + val_print(AVS_PRINT_ERR, "\n No ETR devices are discovered ", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 1)); + return; + } else { + /*Counting num of ETR Devices*/ + for (i = 0; i < MAX_NUM_ETR; i++) { + if ((char)etr_path[i][0] != '\0') + etr_count++; + } + } + val_print(AVS_PRINT_DEBUG, "\n Num of ETR devices found etr_count: %d ", etr_count); + + num_named_comp = val_iovirt_get_named_comp_info(NUM_NAMED_COMP, 0); + val_print(AVS_PRINT_DEBUG, "\n NUM Named component : %d", num_named_comp); + + /*ETR device should be behind SMMU or CATU*/ + for (i = 0; i < etr_count; i++) { + for (j = 0; j < num_named_comp; j++) { + smmu_found = 0; + /* print info fields */ + val_print(AVS_PRINT_DEBUG, "\n Named component :", 0); + val_print(AVS_PRINT_DEBUG, + (char8_t *)val_iovirt_get_named_comp_info(NAMED_COMP_DEV_OBJ_NAME, j), 0); + + /*Check the ETR and Named Componnet paths are matching*/ + if (!val_strncmp((char8_t *)val_iovirt_get_named_comp_info(NAMED_COMP_DEV_OBJ_NAME, j), + (char8_t *)etr_path[i], 9)) { + + /*Check Named Component with ETR path have SMMU*/ + if (val_iovirt_get_named_comp_info(NAMED_COMP_SMMU_BASE, j)) { + smmu_found++; + break; + } + } + } + + /*SMMU not found in ETR path, check for CATU*/ + if (!smmu_found) { + /*Check for CATU in the path of ETR device*/ + val_print(AVS_PRINT_DEBUG, "\n SMMU not found in ETR Path at index %d", i); + + /*Check the CATU in ETR path*/ + status = val_smmu_is_etr_behind_catu((char8_t *)etr_path[i]); + if (status == NOT_IMPLEMENTED) { + val_print(AVS_PRINT_DEBUG, + "\n val_smmu_is_etr_behind_catu API not implemented", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 2)); + return; + } else if (status) { + val_print(AVS_PRINT_DEBUG, "\n No CATU found in ETR path at index %d", i); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 2)); + return; + } + } + + if (!smmu_found) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 3)); + return; + } + } + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 1)); +} + +uint32_t +i016_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/timer_wd/test_t001.c b/test_pool/timer_wd/test_t001.c deleted file mode 100644 index f6b64881..00000000 --- a/test_pool/timer_wd/test_t001.c +++ /dev/null @@ -1,65 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 1) -#define TEST_DESC "Check Counter Frequency " - -static -void -payload(void) -{ - - uint32_t counter_freq; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - counter_freq = val_timer_get_info(TIMER_INFO_CNTFREQ, 0); - val_print(AVS_PRINT_DEBUG, "\n Counter frequency is %x ", counter_freq); - - if (counter_freq > 10*1000*1000) { - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - return; - } - - val_print(AVS_PRINT_ERR, "\n Counter frequency is %x ", counter_freq); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - -} - -uint32_t -t001_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/timer_wd/test_t002.c b/test_pool/timer_wd/test_t002.c deleted file mode 100644 index 00e81885..00000000 --- a/test_pool/timer_wd/test_t002.c +++ /dev/null @@ -1,88 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 2) -#define TEST_DESC "Check EL0-Phy timer interrupt " - -static uint32_t intid; - -static -void -isr(void) -{ - val_timer_set_phy_el1(0); - val_print(AVS_PRINT_INFO, "\n Received interrupt ", 0); - val_set_status(0, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(intid); -} - - -static -void -payload(void) -{ - - uint32_t timeout = TIMEOUT_LARGE; - uint32_t timer_expire_val = 100; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - intid = val_timer_get_info(TIMER_INFO_PHY_EL1_INTID, 0); - - if (intid != 30) { - timeout = 0; - val_print(AVS_PRINT_ERR, "\n Incorrect PPI value %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - val_gic_install_isr(intid, isr); - - val_timer_set_phy_el1(timer_expire_val); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if (timeout == 0){ - val_print(AVS_PRINT_ERR, "\n EL0-Phy timer interrupt not received on %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - } - -} - -uint32_t -t002_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; // This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/timer_wd/test_t003.c b/test_pool/timer_wd/test_t003.c deleted file mode 100644 index d74c0cff..00000000 --- a/test_pool/timer_wd/test_t003.c +++ /dev/null @@ -1,88 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 3) -#define TEST_DESC "Check EL0-Virtual timer interrupt " - -static uint32_t intid; - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - /* We received our interrupt, so disable timer from generating further interrupts */ - val_timer_set_vir_el1(0); - val_print(AVS_PRINT_INFO, "\n Received interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(intid); -} - - -static -void -payload(void) -{ - - uint32_t timeout = TIMEOUT_LARGE; - uint64_t timer_expire_val = 100; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - intid = val_timer_get_info(TIMER_INFO_VIR_EL1_INTID, 0); - - if (intid != 27) { - val_print(AVS_PRINT_ERR, "\n Incorrect PPI value %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - } - - val_gic_install_isr(intid, isr); - - val_timer_set_vir_el1(timer_expire_val); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if (timeout == 0) { - val_print(AVS_PRINT_ERR, "\n EL0-Virtual timer interrupt not received on %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - } - -} - -uint32_t -t003_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/timer_wd/test_t004.c b/test_pool/timer_wd/test_t004.c deleted file mode 100644 index 4755746d..00000000 --- a/test_pool/timer_wd/test_t004.c +++ /dev/null @@ -1,94 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 4) -#define TEST_DESC "Check EL2-phy timer interrupt " - -static uint32_t intid; - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - /* We received our interrupt, so disable timer from generating further interrupts */ - val_timer_set_phy_el2(0); - val_print(AVS_PRINT_INFO, "\n Received interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(intid); -} - - -static -void -payload(void) -{ - - uint32_t timeout = TIMEOUT_LARGE; - uint64_t timer_expire_val = 100; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - intid = val_timer_get_info(TIMER_INFO_PHY_EL2_INTID, 0); - if (intid != 26) { - val_print(AVS_PRINT_ERR, "\n Incorrect PPI value %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - val_gic_install_isr(intid, isr); - - val_timer_set_phy_el2(timer_expire_val); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if (timeout == 0) { - val_print(AVS_PRINT_ERR, "\n EL2-Phy timer interrupt not received on %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - } - -} - -uint32_t -t004_entry(uint32_t num_pe) -{ - - uint32_t error_flag = 0; - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - error_flag = val_check_for_error(TEST_NUM, num_pe); - - if (!error_flag) - status = AVS_STATUS_PASS; - else - status = AVS_STATUS_FAIL; - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - return status; - -} diff --git a/test_pool/timer_wd/test_t005.c b/test_pool/timer_wd/test_t005.c deleted file mode 100644 index 30c67bde..00000000 --- a/test_pool/timer_wd/test_t005.c +++ /dev/null @@ -1,105 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 5) -#define TEST_DESC "Check EL2-Virtual timer interrupt " - -static uint32_t intid; - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - /* We received our interrupt, so disable timer from generating further interrupts */ - val_timer_set_vir_el2(0); - val_print(AVS_PRINT_INFO, "\n Received interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(intid); -} - - - -static -void -payload(void) -{ - - uint32_t timeout = TIMEOUT_LARGE; - uint64_t timer_expire_val = 100; - uint64_t data = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - /* This test is run only when ARM v8.1 Virtualized Host Extensions are supported */ - data = val_pe_reg_read(ID_AA64MMFR1_EL1); - - if (((data >> 8) & 0xF) == 0) { - val_print(AVS_PRINT_WARN, "\n v8.1 VHE not supported on this PE ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - intid = val_timer_get_info(TIMER_INFO_VIR_EL2_INTID, 0); - - if (intid != 28) { - val_print(AVS_PRINT_ERR, "\n Incorrect PPI value %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - - val_gic_install_isr(intid, isr); - - val_timer_set_vir_el2(timer_expire_val); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if (timeout == 0) { - val_print(AVS_PRINT_ERR, "\n EL2-Virtual timer interrupt not received on %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - } - -} - -/** - @brief Check interrupt generation from EL2-Virtual timer. - Depends on ARM V8.1 VHE Extensions. -**/ -uint32_t -t005_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/timer_wd/test_t006.c b/test_pool/timer_wd/test_t006.c deleted file mode 100644 index 096ac3a6..00000000 --- a/test_pool/timer_wd/test_t006.c +++ /dev/null @@ -1,71 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 6) -#define TEST_DESC "SYS Timer if PE Timer not ON " - -static -void -payload(void) -{ - - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - if (val_timer_get_info(TIMER_INFO_NUM_PLATFORM_TIMERS, 0) == 0) { - val_print(AVS_PRINT_INFO, "\n Physical EL1 timer flag = %x", val_timer_get_info(TIMER_INFO_PHY_EL1_FLAGS, 0)); - val_print(AVS_PRINT_INFO, "\n Physical EL2 timer flag = %x", val_timer_get_info(TIMER_INFO_PHY_EL2_FLAGS, 0)); - val_print(AVS_PRINT_INFO, "\n Virtual EL1 timer flag = %x", val_timer_get_info(TIMER_INFO_VIR_EL1_FLAGS, 0)); - - if((val_timer_get_info(TIMER_INFO_PHY_EL1_FLAGS, 0) & SBSA_TIMER_FLAG_ALWAYS_ON) && - (val_timer_get_info(TIMER_INFO_PHY_EL2_FLAGS, 0) & SBSA_TIMER_FLAG_ALWAYS_ON) && - (val_timer_get_info(TIMER_INFO_VIR_EL1_FLAGS, 0) & SBSA_TIMER_FLAG_ALWAYS_ON)) { - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - } else { - val_print(AVS_PRINT_ERR, "\n PE Timers are not always-on. ", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - } - } else { - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 02)); - } - -} - -uint32_t -t006_entry(uint32_t num_pe) -{ - - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - return status; - -} diff --git a/test_pool/timer_wd/test_t007.c b/test_pool/timer_wd/test_t007.c deleted file mode 100755 index badf3694..00000000 --- a/test_pool/timer_wd/test_t007.c +++ /dev/null @@ -1,162 +0,0 @@ -/** @file - * Copyright (c) 2016-2018,2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" -#include "val/include/sbsa_avs_pe.h" - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 7) -#define TEST_DESC "CNTCTLBase & CNTBaseN access " - -#define ARBIT_VALUE 0xA000 - -static -void -payload(void) -{ - - uint64_t cnt_ctl_base, cnt_base_n; - uint32_t data; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint64_t timer_num = val_timer_get_info(TIMER_INFO_NUM_PLATFORM_TIMERS, 0); - uint64_t data1; - - if (!timer_num) { - val_print(AVS_PRINT_WARN, "\n No System timers are defined ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 0x1)); - return; - } - - while(timer_num){ - --timer_num; //array index starts from 0, so subtract 1 from count - - if (val_timer_get_info(TIMER_INFO_IS_PLATFORM_TIMER_SECURE, timer_num)) - continue; //Skip Secure Timer - - cnt_ctl_base = val_timer_get_info(TIMER_INFO_SYS_CNTL_BASE, timer_num); - cnt_base_n = val_timer_get_info(TIMER_INFO_SYS_CNT_BASE_N, timer_num); - - if (cnt_ctl_base == 0) { - val_print(AVS_PRINT_WARN, "\n CNTCTL BASE_N is zero ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 0x2)); - return; - } - - data = val_mmio_read(cnt_ctl_base + 0x8); - val_mmio_write(cnt_ctl_base + 0x8, 0xFFFFFFFF); - if(data != val_mmio_read(cnt_ctl_base + 0x8)) { - val_print(AVS_PRINT_ERR, "\n Read-write check failed for CNTCTLBase.CNTTIDR", 0); - val_print(AVS_PRINT_ERR, ", expected value %x ", data); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); - return; - } - - if (cnt_base_n == 0) { - val_print(AVS_PRINT_WARN, "\n CNT_BASE_N is zero ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 0x3)); - return; - } - - // Read CNTPCT register - data1 = val_mmio_read64(cnt_base_n + 0x0); - val_print(AVS_PRINT_DEBUG, "\n CNTPCT Read value = 0x%llx ", data1); - - // Writes to Read-Only registers should be ignore - val_mmio_write64(cnt_base_n + 0x0, (data1 - ARBIT_VALUE)); - - if (val_mmio_read64(cnt_base_n + 0x0) < data1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 2)); - val_print(AVS_PRINT_ERR, "\n CNTBaseN: CNTPCT reg should be read-only ", 0); - return; - } - - // Read CNTVCT register - data1 = val_mmio_read64(cnt_base_n + 0x8); - val_print(AVS_PRINT_DEBUG, "\n CNTVCT Read value = 0x%llx ", data1); - - // Writes to Read-Only registers should be ignore - val_mmio_write64(cnt_base_n + 0x8, (data1 - ARBIT_VALUE)); - - if (val_mmio_read64(cnt_base_n + 0x8) < data1) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 3)); - val_print(AVS_PRINT_ERR, "\n CNTBaseN: CNTVCT reg should be read-only ", 0); - return; - } - - // Read CNTFRQ register - data = val_mmio_read(cnt_base_n + 0x10); - val_print(AVS_PRINT_DEBUG, "\n CNTFRQ Read value = 0x%x ", - data); - - // Writes to Read-Only registers should be ignore - val_mmio_write(cnt_base_n + 0x10, (data - ARBIT_VALUE)); - - if (val_mmio_read(cnt_base_n + 0x10) != data) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); - val_print(AVS_PRINT_ERR, "\n CNTBaseN: CNTFRQ reg should be read-only ", 0); - return; - } - - data = 0x3; - val_mmio_write(cnt_base_n + 0x2C, data); - if(data != (val_mmio_read(cnt_base_n + 0x2C) & 0x3)) { - val_print(AVS_PRINT_ERR, "\n Read-write check failed for CNTBaseN.CNTP_CTL", 0); - val_print(AVS_PRINT_ERR, ", expected value %x ", data); - val_print(AVS_PRINT_ERR, "\n Read value %x ", val_mmio_read(cnt_base_n + 0x2C)); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 0x5)); - val_mmio_write(cnt_base_n + 0x2C, 0x0); // Disable the timer before return - return; - } - val_mmio_write(cnt_base_n + 0x2C, 0x0); // Disable timer - - data1 = 0xFF00FF00FF00FF00; - /* Write a random value to CNTP_CVAL*/ - val_mmio_write64(cnt_base_n + 0x20, data1); - - if (data1 != val_mmio_read64(cnt_base_n + 0x20)) { - val_print(AVS_PRINT_ERR, "\n Read-write check failed for " - "CNTBaseN.CNTP_CVAL, read value %llx ", - val_mmio_read64(cnt_base_n + 0x20)); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 6)); - return; - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - } - -} - -uint32_t -t007_entry(uint32_t num_pe) -{ - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/timer_wd/test_t008.c b/test_pool/timer_wd/test_t008.c deleted file mode 100644 index 94060e01..00000000 --- a/test_pool/timer_wd/test_t008.c +++ /dev/null @@ -1,128 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_timer.h" -#include "val/include/sbsa_avs_pe.h" -#include "val/include/sbsa_avs_wakeup.h" - - -#define TEST_NUM (AVS_TIMER_TEST_NUM_BASE + 8) -#define TEST_DESC "Generate Mem Mapped SYS Timer Intr" - -static uint32_t intid; -static uint64_t cnt_base_n; - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - - val_print(AVS_PRINT_INFO, "\n Received interrupt ", 0); - val_timer_disable_system_timer((addr_t)cnt_base_n); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(intid); -} - - -static -void -payload(void) -{ - - volatile uint32_t timeout; - uint32_t timer_expire_val = TIMEOUT_MEDIUM; - uint32_t status, ns_timer = 0; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint64_t timer_num = val_timer_get_info(TIMER_INFO_NUM_PLATFORM_TIMERS, 0); - - if (!timer_num) { - val_print(AVS_PRINT_WARN, "\n No System timers are defined ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); - return; - } - - while(timer_num){ - timer_num--; //array index starts from 0, so subtract 1 from count - - if (val_timer_get_info(TIMER_INFO_IS_PLATFORM_TIMER_SECURE, timer_num)) - continue; //Skip Secure Timer - - ns_timer++; - timeout = TIMEOUT_LARGE; - val_set_status(index, RESULT_PENDING(g_sbsa_level, TEST_NUM)); // Set the initial result to pending - - //Read CNTACR to determine whether access permission from NS state is permitted - status = val_timer_skip_if_cntbase_access_not_allowed(timer_num); - if(status == AVS_STATUS_SKIP){ - val_print(AVS_PRINT_WARN, "\n Security doesn't allow access to timer registers ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - cnt_base_n = val_timer_get_info(TIMER_INFO_SYS_CNT_BASE_N, timer_num); - if (cnt_base_n == 0) { - val_print(AVS_PRINT_WARN, "\n CNT_BASE_N is zero ", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); - return; - } - - /* Install ISR */ - intid = val_timer_get_info(TIMER_INFO_SYS_INTID, timer_num); - val_gic_install_isr(intid, isr); - - /* enable System timer */ - val_timer_set_system_timer((addr_t)cnt_base_n, timer_expire_val); - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if (timeout == 0){ - val_print(AVS_PRINT_ERR, "\n Sys timer interrupt not received on %d ", intid); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - } - - if(!ns_timer) { - val_print(AVS_PRINT_WARN, "\n No non-secure systimer implemented", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); - return; - } - -} - -uint32_t -t008_entry(uint32_t num_pe) -{ - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - - return status; -} diff --git a/test_pool/timer_wd/test_w001.c b/test_pool/timer_wd/test_w001.c deleted file mode 100755 index 333ece78..00000000 --- a/test_pool/timer_wd/test_w001.c +++ /dev/null @@ -1,105 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_wd.h" - -#define TEST_NUM (AVS_WD_TEST_NUM_BASE + 1) -#define TEST_DESC "Check NS Watchdog Accessibility " - -static -void -payload(void) -{ - - uint64_t ctrl_base; - uint64_t refresh_base; - uint64_t wd_num = val_wd_get_info(0, WD_INFO_COUNT); - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - uint32_t data, ns_wdg = 0; - - val_print(AVS_PRINT_DEBUG, "\n Found %d watchdogs in ACPI table ", wd_num); - - if (wd_num == 0) { - val_print(AVS_PRINT_WARN, "\n No Watchdogs reported %d ", wd_num); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - - do { - wd_num--; //array index starts from 0, so subtract 1 from count - - if (val_wd_get_info(wd_num, WD_INFO_ISSECURE)) - continue; //Skip Secure watchdog - - ns_wdg++; - refresh_base = val_wd_get_info(wd_num, WD_INFO_REFRESH_BASE); - val_print(AVS_PRINT_INFO, "\n Watchdog Refresh base is %llx ", refresh_base); - ctrl_base = val_wd_get_info(wd_num, WD_INFO_CTRL_BASE); - val_print(AVS_PRINT_INFO, "\n Watchdog CTRL base is %llx ", ctrl_base); - - data = val_mmio_read(ctrl_base); - //Control register bits 31:4 are reserved 0 - if(data >> 4) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - data = val_mmio_read(refresh_base); - //refresh frame offset 0 must return 0 on reads. - if(data) { - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); - return; - } - } while(wd_num); - - if(!ns_wdg) { - val_print(AVS_PRINT_WARN, "\n No non-secure Watchdogs reported", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - -} - -uint32_t -w001_entry(uint32_t num_pe) -{ - - uint32_t error_flag = 0; - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - /* This check is when user is forcing us to skip this test */ - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - error_flag = val_check_for_error(TEST_NUM, num_pe); - - if (!error_flag) - status = AVS_STATUS_PASS; - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - return status; - -} diff --git a/test_pool/timer_wd/test_w002.c b/test_pool/timer_wd/test_w002.c deleted file mode 100755 index 3eebf8e8..00000000 --- a/test_pool/timer_wd/test_w002.c +++ /dev/null @@ -1,128 +0,0 @@ -/** @file - * Copyright (c) 2016-2018, 2020-2022 Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - - -#include "val/include/sbsa_avs_val.h" -#include "val/include/val_interface.h" - -#include "val/include/sbsa_avs_wd.h" - -#define TEST_NUM (AVS_WD_TEST_NUM_BASE + 2) -#define TEST_DESC "Check Watchdog WS0 interrupt " - -static uint32_t int_id; -static uint64_t wd_num; - -static -void -isr(void) -{ - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - val_wd_set_ws0(wd_num, 0); - val_print(AVS_PRINT_DEBUG, "\n Received WS0 interrupt ", 0); - val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); - val_gic_end_of_interrupt(int_id); -} - - -static -void -payload(void) -{ - - uint32_t status, timeout, ns_wdg = 0; - uint64_t timer_expire_ticks = 1; - uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); - wd_num = val_wd_get_info(0, WD_INFO_COUNT); - - - if (wd_num == 0) { - val_print(AVS_PRINT_WARN, "\n No Watchdogs reported %d ", wd_num); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); - return; - } - - do { - wd_num--; //array index starts from 0, so subtract 1 from count - - if (val_wd_get_info(wd_num, WD_INFO_ISSECURE)) - continue; //Skip Secure watchdog - - ns_wdg++; - timeout = val_get_counter_frequency() * 2; - val_set_status(index, RESULT_PENDING(g_sbsa_level, TEST_NUM)); // Set the initial result to pending - - int_id = val_wd_get_info(wd_num, WD_INFO_GSIV); - val_print(AVS_PRINT_DEBUG, "\n WS0 Interrupt id %d ", int_id); - - val_gic_install_isr(int_id, isr); - - /* Set Interrupt Type Edge/Level Trigger */ - if (val_wd_get_info(wd_num, WD_INFO_IS_EDGE)) - val_gic_set_intr_trigger(int_id, INTR_TRIGGER_INFO_EDGE_RISING); - else - val_gic_set_intr_trigger(int_id, INTR_TRIGGER_INFO_LEVEL_HIGH); - - status = val_wd_set_ws0(wd_num, timer_expire_ticks); - if (status) { - val_print(AVS_PRINT_ERR, "\n Setting watchdog timeout failed", 0); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))); - - if (timeout == 0) { - val_print(AVS_PRINT_ERR, "\n WS0 Interrupt not received on %d ", int_id); - val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); - return; - } - - } while(wd_num); - - if(!ns_wdg) { - val_print(AVS_PRINT_WARN, "\n No non-secure Watchdogs reported", 0); - val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); - return; - } - -} - -uint32_t -w002_entry(uint32_t num_pe) -{ - - uint32_t error_flag = 0; - uint32_t status = AVS_STATUS_FAIL; - - num_pe = 1; //This Timer test is run on single processor - - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); - /* This check is when user is forcing us to skip this test */ - if (status != AVS_STATUS_SKIP) - val_run_test_payload(TEST_NUM, num_pe, payload, 0); - - /* get the result from all PE and check for failure */ - error_flag = val_check_for_error(TEST_NUM, num_pe); - - if (!error_flag) - status = AVS_STATUS_PASS; - - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); - return status; - -} diff --git a/test_pool/timer_wd/test_w003.c b/test_pool/watchdog/operating_system/test_w001.c similarity index 90% rename from test_pool/timer_wd/test_w003.c rename to test_pool/watchdog/operating_system/test_w001.c index 6acd5fca..08dfaac6 100644 --- a/test_pool/timer_wd/test_w003.c +++ b/test_pool/watchdog/operating_system/test_w001.c @@ -20,8 +20,9 @@ #include "val/include/sbsa_avs_wd.h" -#define TEST_NUM (AVS_WD_TEST_NUM_BASE + 3) -#define TEST_DESC "Check NS Watchdog Architecture Version" +#define TEST_NUM (AVS_WD_TEST_NUM_BASE + 1) +#define TEST_RULE "S_L6WD_01" +#define TEST_DESC "Check NS Watchdog Revision " static void @@ -88,20 +89,20 @@ payload(void) } uint32_t -w003_entry(uint32_t num_pe) +w001_entry(uint32_t num_pe) { uint32_t status = AVS_STATUS_FAIL; num_pe = 1; //This test is run on single processor - status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level); + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); /* This check is when user is forcing us to skip this test */ if (status != AVS_STATUS_SKIP) val_run_test_payload(TEST_NUM, num_pe, payload, 0); /* get the result from all PE and check for failure */ - status = val_check_for_error(TEST_NUM, num_pe); - val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM)); + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); return status; diff --git a/uefi_app/SbsaAvs.inf b/uefi_app/SbsaAvs.inf index 27898aaf..0392208d 100644 --- a/uefi_app/SbsaAvs.inf +++ b/uefi_app/SbsaAvs.inf @@ -1,5 +1,5 @@ ## @file -# Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -31,57 +31,50 @@ [Sources.AARCH64] ../ SbsaAvsMain.c - ../test_pool/pe/test_c001.c - ../test_pool/pe/test_c002.c - ../test_pool/pe/test_c003.c - ../test_pool/pe/test_c004.c - ../test_pool/pe/test_c005.c - ../test_pool/pe/test_c006.c - ../test_pool/pe/test_c007.c - ../test_pool/pe/test_c008.c - ../test_pool/pe/test_c010.c - ../test_pool/pe/test_c011.c - ../test_pool/pe/test_c012.c - ../test_pool/pe/test_c013.c - ../test_pool/pe/test_c014.c - ../test_pool/pe/test_c015.c - ../test_pool/pe/test_c017.c - ../test_pool/pe/test_c018.c - ../test_pool/pe/test_c019.c - ../test_pool/pe/test_c020.c - ../test_pool/pe/test_c021.c - ../test_pool/pe/test_c022.c - ../test_pool/pe/test_c023.c - ../test_pool/pe/test_c024.c - ../test_pool/pe/test_c025.c - ../test_pool/pe/test_c026.c - ../test_pool/pe/test_c027.c - ../test_pool/pe/test_c028.c - ../test_pool/pe/test_c029.c - ../test_pool/pe/test_c030.c - ../test_pool/pe/test_c031.c - ../test_pool/pe/test_c032.c - ../test_pool/pe/test_c033.c - ../test_pool/pe/test_c034.c - ../test_pool/pe/test_c035.c - ../test_pool/pe/test_c036.c - ../test_pool/gic/test_g001.c - ../test_pool/gic/test_g002.c - ../test_pool/gic/test_g003.c - ../test_pool/gic/test_g004.c - ../test_pool/timer_wd/test_t001.c - ../test_pool/timer_wd/test_t002.c - ../test_pool/timer_wd/test_t003.c - ../test_pool/timer_wd/test_t004.c - ../test_pool/timer_wd/test_t005.c - ../test_pool/timer_wd/test_t006.c - ../test_pool/timer_wd/test_t007.c - ../test_pool/timer_wd/test_t008.c - ../test_pool/timer_wd/test_w001.c - ../test_pool/timer_wd/test_w002.c - ../test_pool/timer_wd/test_w003.c + ../test_pool/pe/operating_system/test_c001.c + ../test_pool/pe/operating_system/test_c002.c + ../test_pool/pe/operating_system/test_c003.c + ../test_pool/pe/operating_system/test_c004.c + ../test_pool/pe/operating_system/test_c005.c + ../test_pool/pe/operating_system/test_c006.c + ../test_pool/pe/operating_system/test_c007.c + ../test_pool/pe/operating_system/test_c008.c + ../test_pool/pe/operating_system/test_c009.c + ../test_pool/pe/operating_system/test_c010.c + ../test_pool/pe/operating_system/test_c011.c + ../test_pool/pe/operating_system/test_c012.c + ../test_pool/pe/operating_system/test_c013.c + ../test_pool/pe/operating_system/test_c014.c + ../test_pool/pe/operating_system/test_c015.c + ../test_pool/pe/operating_system/test_c016.c + ../test_pool/pe/operating_system/test_c017.c + ../test_pool/pe/operating_system/test_c018.c + ../test_pool/pe/operating_system/test_c019.c + ../test_pool/pe/operating_system/test_c020.c + ../test_pool/pe/operating_system/test_c021.c + ../test_pool/pe/operating_system/test_c022.c + ../test_pool/pe/operating_system/test_c023.c + ../test_pool/pe/operating_system/test_c024.c + ../test_pool/pe/operating_system/test_c025.c + ../test_pool/pe/operating_system/test_c026.c + ../test_pool/pe/operating_system/test_c027.c + ../test_pool/pe/operating_system/test_c028.c + ../test_pool/pe/operating_system/test_c029.c + ../test_pool/pe/operating_system/test_c030.c + ../test_pool/pe/operating_system/test_c031.c + ../test_pool/pe/operating_system/test_c032.c + ../test_pool/pe/operating_system/test_c033.c + ../test_pool/pe/operating_system/test_c034.c + ../test_pool/pe/operating_system/test_c035.c + ../test_pool/pe/operating_system/test_c036.c + ../test_pool/pe/operating_system/test_c037.c + + ../test_pool/gic/operating_system/test_g001.c + ../test_pool/gic/operating_system/test_g002.c + + ../test_pool/watchdog/operating_system/test_w001.c + ../test_pool/pcie/test_p001.c - ../test_pool/pcie/test_p002.c ../test_pool/pcie/test_p003.c ../test_pool/pcie/test_p020.c ../test_pool/pcie/test_p021.c @@ -103,7 +96,6 @@ ../test_pool/pcie/test_p037.c ../test_pool/pcie/test_p038.c ../test_pool/pcie/test_p039.c - ../test_pool/pcie/test_p040.c ../test_pool/pcie/test_p041.c ../test_pool/pcie/test_p042.c ../test_pool/pcie/test_p043.c @@ -116,35 +108,27 @@ ../test_pool/pcie/test_p050.c ../test_pool/pcie/test_p051.c ../test_pool/pcie/test_p052.c - ../test_pool/pcie/test_p053.c - ../test_pool/pcie/test_p054.c - ../test_pool/pcie/test_p055.c ../test_pool/pcie/test_p056.c ../test_pool/pcie/test_p057.c ../test_pool/pcie/test_p058.c ../test_pool/pcie/test_p059.c ../test_pool/pcie/test_p060.c - ../test_pool/io_virt/test_i001.c - ../test_pool/io_virt/test_i002.c - ../test_pool/io_virt/test_i003.c - ../test_pool/io_virt/test_i004.c - ../test_pool/io_virt/test_i005.c - ../test_pool/io_virt/test_i006.c - ../test_pool/io_virt/test_i007.c - ../test_pool/io_virt/test_i008.c - ../test_pool/io_virt/test_i009.c - ../test_pool/io_virt/test_i010.c - ../test_pool/io_virt/test_i011.c - ../test_pool/io_virt/test_i012.c - ../test_pool/io_virt/test_i013.c - ../test_pool/io_virt/test_i014.c - ../test_pool/io_virt/test_i015.c - ../test_pool/io_virt/test_i016.c - ../test_pool/power_wakeup/test_u001.c - ../test_pool/power_wakeup/test_u002.c - ../test_pool/peripherals/test_d001.c - ../test_pool/peripherals/test_d002.c - ../test_pool/peripherals/test_d003.c + ../test_pool/smmu/operating_system/test_i001.c + ../test_pool/smmu/operating_system/test_i002.c + ../test_pool/smmu/operating_system/test_i003.c + ../test_pool/smmu/operating_system/test_i004.c + ../test_pool/smmu/operating_system/test_i005.c + ../test_pool/smmu/operating_system/test_i006.c + ../test_pool/smmu/operating_system/test_i007.c + ../test_pool/smmu/operating_system/test_i008.c + ../test_pool/smmu/operating_system/test_i009.c + ../test_pool/smmu/operating_system/test_i010.c + ../test_pool/smmu/operating_system/test_i011.c + ../test_pool/smmu/operating_system/test_i012.c + ../test_pool/smmu/operating_system/test_i013.c + ../test_pool/smmu/operating_system/test_i014.c + ../test_pool/smmu/operating_system/test_i015.c + ../test_pool/memory_map/operating_system/test_m001.c ../test_pool/exerciser/test_e001.c ../test_pool/exerciser/test_e002.c ../test_pool/exerciser/test_e003.c @@ -161,14 +145,6 @@ ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c ../test_pool/exerciser/test_e016.c -# BSA test which gets compile with SBSA - ../test_pool/pe/test_os_c018.c - ../test_pool/io_virt/test_os_i005.c - ../test_pool/io_virt/test_os_i006.c - ../test_pool/io_virt/test_os_i007.c - ../test_pool/io_virt/test_os_i008.c -# ../test_pool/io_virt/test_os_i009.c - ../test_pool/io_virt/test_hyp_i005.c [Packages] StdLib/StdLib.dec diff --git a/uefi_app/SbsaAvsNist.inf b/uefi_app/SbsaAvsNist.inf index 68d6e401..57c82db4 100644 --- a/uefi_app/SbsaAvsNist.inf +++ b/uefi_app/SbsaAvsNist.inf @@ -31,57 +31,49 @@ [Sources.AARCH64] ../ SbsaAvsMain.c - ../test_pool/pe/test_c001.c - ../test_pool/pe/test_c002.c - ../test_pool/pe/test_c003.c - ../test_pool/pe/test_c004.c - ../test_pool/pe/test_c005.c - ../test_pool/pe/test_c006.c - ../test_pool/pe/test_c007.c - ../test_pool/pe/test_c008.c - ../test_pool/pe/test_c009.c - ../test_pool/pe/test_c010.c - ../test_pool/pe/test_c011.c - ../test_pool/pe/test_c012.c - ../test_pool/pe/test_c013.c - ../test_pool/pe/test_c014.c - ../test_pool/pe/test_c015.c - ../test_pool/pe/test_c016.c - ../test_pool/pe/test_c017.c - ../test_pool/pe/test_c018.c - ../test_pool/pe/test_c019.c - ../test_pool/pe/test_c020.c - ../test_pool/pe/test_c021.c - ../test_pool/pe/test_c022.c - ../test_pool/pe/test_c023.c - ../test_pool/pe/test_c024.c - ../test_pool/pe/test_c025.c - ../test_pool/pe/test_c026.c - ../test_pool/pe/test_c027.c - ../test_pool/pe/test_c028.c - ../test_pool/pe/test_c029.c - ../test_pool/pe/test_c030.c - ../test_pool/pe/test_c031.c - ../test_pool/pe/test_c032.c - ../test_pool/pe/test_c033.c - ../test_pool/pe/test_c034.c - ../test_pool/pe/test_c035.c - ../test_pool/pe/test_c036.c - ../test_pool/gic/test_g001.c - ../test_pool/gic/test_g002.c - ../test_pool/gic/test_g003.c - ../test_pool/gic/test_g004.c - ../test_pool/timer_wd/test_t001.c - ../test_pool/timer_wd/test_t002.c - ../test_pool/timer_wd/test_t003.c - ../test_pool/timer_wd/test_t004.c - ../test_pool/timer_wd/test_t005.c - ../test_pool/timer_wd/test_t006.c - ../test_pool/timer_wd/test_t007.c - ../test_pool/timer_wd/test_t008.c - ../test_pool/timer_wd/test_w001.c - ../test_pool/timer_wd/test_w002.c - ../test_pool/timer_wd/test_w003.c + ../test_pool/pe/operating_system/test_c001.c + ../test_pool/pe/operating_system/test_c002.c + ../test_pool/pe/operating_system/test_c003.c + ../test_pool/pe/operating_system/test_c004.c + ../test_pool/pe/operating_system/test_c005.c + ../test_pool/pe/operating_system/test_c006.c + ../test_pool/pe/operating_system/test_c007.c + ../test_pool/pe/operating_system/test_c008.c + ../test_pool/pe/operating_system/test_c009.c + ../test_pool/pe/operating_system/test_c010.c + ../test_pool/pe/operating_system/test_c011.c + ../test_pool/pe/operating_system/test_c012.c + ../test_pool/pe/operating_system/test_c013.c + ../test_pool/pe/operating_system/test_c014.c + ../test_pool/pe/operating_system/test_c015.c + ../test_pool/pe/operating_system/test_c016.c + ../test_pool/pe/operating_system/test_c017.c + ../test_pool/pe/operating_system/test_c018.c + ../test_pool/pe/operating_system/test_c019.c + ../test_pool/pe/operating_system/test_c020.c + ../test_pool/pe/operating_system/test_c021.c + ../test_pool/pe/operating_system/test_c022.c + ../test_pool/pe/operating_system/test_c023.c + ../test_pool/pe/operating_system/test_c024.c + ../test_pool/pe/operating_system/test_c025.c + ../test_pool/pe/operating_system/test_c026.c + ../test_pool/pe/operating_system/test_c027.c + ../test_pool/pe/operating_system/test_c028.c + ../test_pool/pe/operating_system/test_c029.c + ../test_pool/pe/operating_system/test_c030.c + ../test_pool/pe/operating_system/test_c031.c + ../test_pool/pe/operating_system/test_c032.c + ../test_pool/pe/operating_system/test_c033.c + ../test_pool/pe/operating_system/test_c034.c + ../test_pool/pe/operating_system/test_c035.c + ../test_pool/pe/operating_system/test_c036.c + ../test_pool/pe/operating_system/test_c037.c + + ../test_pool/gic/operating_system/test_g001.c + ../test_pool/gic/operating_system/test_g002.c + + ../test_pool/watchdog/operating_system/test_w001.c + ../test_pool/pcie/test_p001.c ../test_pool/pcie/test_p002.c ../test_pool/pcie/test_p003.c @@ -123,28 +115,22 @@ ../test_pool/pcie/test_p055.c ../test_pool/pcie/test_p056.c ../test_pool/pcie/test_p057.c - ../test_pool/io_virt/test_i001.c - ../test_pool/io_virt/test_i002.c - ../test_pool/io_virt/test_i003.c - ../test_pool/io_virt/test_i004.c - ../test_pool/io_virt/test_i005.c - ../test_pool/io_virt/test_i006.c - ../test_pool/io_virt/test_i007.c - ../test_pool/io_virt/test_i008.c - ../test_pool/io_virt/test_i009.c - ../test_pool/io_virt/test_i010.c - ../test_pool/io_virt/test_i011.c - ../test_pool/io_virt/test_i012.c - ../test_pool/io_virt/test_i013.c - ../test_pool/io_virt/test_i014.c - ../test_pool/io_virt/test_i015.c - ../test_pool/io_virt/test_i016.c - ../test_pool/power_wakeup/test_u001.c - ../test_pool/power_wakeup/test_u002.c - ../test_pool/peripherals/test_d001.c - ../test_pool/peripherals/test_d002.c - ../test_pool/peripherals/test_d003.c - ../test_pool/peripherals/test_m001.c + ../test_pool/smmu/operating_system/test_i001.c + ../test_pool/smmu/operating_system/test_i002.c + ../test_pool/smmu/operating_system/test_i003.c + ../test_pool/smmu/operating_system/test_i004.c + ../test_pool/smmu/operating_system/test_i005.c + ../test_pool/smmu/operating_system/test_i006.c + ../test_pool/smmu/operating_system/test_i007.c + ../test_pool/smmu/operating_system/test_i008.c + ../test_pool/smmu/operating_system/test_i009.c + ../test_pool/smmu/operating_system/test_i010.c + ../test_pool/smmu/operating_system/test_i011.c + ../test_pool/smmu/operating_system/test_i012.c + ../test_pool/smmu/operating_system/test_i013.c + ../test_pool/smmu/operating_system/test_i014.c + ../test_pool/smmu/operating_system/test_i015.c + ../test_pool/memory_map/operating_system/test_m001.c ../test_pool/exerciser/test_e001.c ../test_pool/exerciser/test_e002.c ../test_pool/exerciser/test_e003.c diff --git a/val/include/pal_interface.h b/val/include/pal_interface.h index 3dbc0568..1adb5e96 100644 --- a/val/include/pal_interface.h +++ b/val/include/pal_interface.h @@ -115,6 +115,7 @@ typedef struct { uint32_t attr; ///< PE attributes uint64_t mpidr; ///< PE MPIDR uint32_t pmu_gsiv; ///< PMU Interrupt ID + uint32_t gmain_gsiv; /* GIC Maintenance Interrupt */ }PE_INFO_ENTRY; typedef struct { @@ -615,6 +616,7 @@ typedef enum { MEMORY_TYPE_NORMAL, MEMORY_TYPE_RESERVED, MEMORY_TYPE_NOT_POPULATED, + MEMORY_TYPE_PERSISTENT, MEMORY_TYPE_LAST_ENTRY }MEM_INFO_TYPE_e; diff --git a/val/include/sbsa_avs_common.h b/val/include/sbsa_avs_common.h index 9245f28e..4bc2186d 100644 --- a/val/include/sbsa_avs_common.h +++ b/val/include/sbsa_avs_common.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -32,6 +32,7 @@ #define AVS_SMMU_TEST_NUM_BASE 700 #define AVS_EXERCISER_TEST_NUM_BASE 800 #define AVS_NIST_TEST_NUM_BASE 900 +#define AVS_MEM_MAP_TEST_NUM_BASE 1300 #define STATE_BIT 28 #define STATE_MASK 0xF @@ -108,10 +109,11 @@ void val_mmio_write64(addr_t addr, uint64_t data); uint32_t -val_initialize_test(uint32_t test_num, char8_t * desc, uint32_t num_pe, uint32_t level); +val_initialize_test(uint32_t test_num, char8_t *desc, uint32_t num_pe, uint32_t level, + char8_t *ruleid); uint32_t -val_check_for_error(uint32_t test_num, uint32_t num_pe); +val_check_for_error(uint32_t test_num, uint32_t num_pe, char8_t *ruleid); void val_run_test_payload(uint32_t test_num, uint32_t num_pe, void (*payload)(void), uint64_t test_input); @@ -130,7 +132,8 @@ typedef enum { WAKEUP_MODULE, PERIPHERAL_MODULE, SMMU_MODULE, - EXERCISER_MODULE + EXERCISER_MODULE, + MEM_MAP_MODULE } MODULE_ID_e; #endif diff --git a/val/include/sbsa_avs_memory.h b/val/include/sbsa_avs_memory.h index 47505b87..593f841a 100644 --- a/val/include/sbsa_avs_memory.h +++ b/val/include/sbsa_avs_memory.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ #define MEM_MAP_SUCCESS 0x0 #define MEM_MAP_NO_MEM 0x1 #define MEM_MAP_FAILURE 0x2 +#define MEM_SIZE_64KB 65536 addr_t val_memory_ioremap(void *addr, uint32_t size, uint64_t attr); @@ -38,5 +39,8 @@ uint32_t val_memory_page_size(void); void *val_memory_alloc_pages(uint32_t num_pages); void val_memory_free_pages(void *page_base, uint32_t num_pages); void *val_aligned_alloc( uint32_t alignment, uint32_t size ); +uint32_t val_memory_check_for_persistent_mem(void); -#endif // __SBSA_AVS_PERIPHERAL_H__ +uint32_t m001_entry(uint32_t num_pe); + +#endif diff --git a/val/include/sbsa_avs_pe.h b/val/include/sbsa_avs_pe.h index 6edc44cf..0aff60bd 100644 --- a/val/include/sbsa_avs_pe.h +++ b/val/include/sbsa_avs_pe.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -317,7 +317,7 @@ void val_pe_context_restore(uint64_t sp); void val_pe_default_esr(uint64_t interrupt_type, void *context); void val_pe_cache_clean_range(uint64_t start_addr, uint64_t length); -uint32_t c001_entry(void); +uint32_t c001_entry(uint32_t num_pe); uint32_t c002_entry(uint32_t num_pe); uint32_t c003_entry(uint32_t num_pe); uint32_t c004_entry(uint32_t num_pe); @@ -353,7 +353,7 @@ uint32_t c033_entry(uint32_t num_pe); uint32_t c034_entry(uint32_t num_pe); uint32_t c035_entry(uint32_t num_pe); uint32_t c036_entry(uint32_t num_pe); +uint32_t c037_entry(uint32_t num_pe); -uint32_t os_c018_entry(uint32_t num_pe); #endif diff --git a/val/include/sbsa_avs_val.h b/val/include/sbsa_avs_val.h index 3bf0891f..264f5299 100644 --- a/val/include/sbsa_avs_val.h +++ b/val/include/sbsa_avs_val.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -49,7 +49,7 @@ uint8_t val_is_el2_enabled(void); void -val_report_status(uint32_t id, uint32_t status); +val_report_status(uint32_t id, uint32_t status, char8_t *ruleid); void val_set_status(uint32_t index, uint32_t status); diff --git a/val/include/val_interface.h b/val/include/val_interface.h index 82794774..437eaeec 100644 --- a/val/include/val_interface.h +++ b/val/include/val_interface.h @@ -78,6 +78,7 @@ uint32_t val_pe_get_pmu_gsiv(uint32_t index); uint64_t val_pe_get_mpid(void); uint32_t val_pe_get_index_mpid(uint64_t mpid); uint32_t val_pe_install_esr(uint32_t exception_type, void (*esr)(uint64_t, void *)); +uint32_t val_pe_get_gmain_gsiv(uint32_t index); void val_execute_on_pe(uint32_t index, void (*payload)(void), uint64_t args); void val_suspend_pe(uint32_t power_state, uint64_t entry, uint32_t context_id); @@ -314,6 +315,7 @@ typedef enum { UART_BASE0, UART_GSIV, UART_FLAGS, + ANY_BASE0, ANY_FLAGS, ANY_GSIV, ANY_BDF, diff --git a/val/src/avs_gic_support.c b/val/src/avs_gic_support.c index 8f8754c8..e6a09fb1 100644 --- a/val/src/avs_gic_support.c +++ b/val/src/avs_gic_support.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -50,7 +50,8 @@ val_gic_reg_read(uint32_t reg_id) case ICH_MISR_EL2: return GicReadIchMisr(); default: - val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), RESULT_FAIL(g_sbsa_level, 0, 0x78)); + val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), + RESULT_FAIL(g_sbsa_level, 0, 0x78), NULL); } return 0x0; @@ -86,7 +87,8 @@ val_gic_reg_write(uint32_t reg_id, uint64_t write_data) GicWriteIccPmr(write_data); break; default: - val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), RESULT_FAIL(g_sbsa_level, 0, 0x78)); + val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), + RESULT_FAIL(g_sbsa_level, 0, 0x78), NULL); } } diff --git a/val/src/avs_memory.c b/val/src/avs_memory.c index 96f17248..94521edf 100644 --- a/val/src/avs_memory.c +++ b/val/src/avs_memory.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,7 +35,26 @@ uint32_t val_memory_execute_tests(uint32_t level, uint32_t num_pe) { - uint32_t status; + uint32_t status = 0; + uint32_t i; + + for (i = 0 ; i < MAX_TEST_SKIP_NUM ; i++) { + if (g_skip_test_num[i] == AVS_MEM_MAP_TEST_NUM_BASE) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all memory tests \n", 0); + return AVS_STATUS_SKIP; + } + } + + if (g_single_module != SINGLE_MODULE_SENTINEL && g_single_module != AVS_MEM_MAP_TEST_NUM_BASE && + (g_single_test == SINGLE_MODULE_SENTINEL || + (g_single_test - AVS_MEM_MAP_TEST_NUM_BASE > 100 || + g_single_test - AVS_MEM_MAP_TEST_NUM_BASE < 0))) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all memory tests \n", 0); + val_print(AVS_PRINT_TEST, " (Running only a single module)\n", 0); + return AVS_STATUS_SKIP; + } + + g_curr_module = 1 << MEM_MAP_MODULE; status = m001_entry(num_pe); @@ -281,4 +300,27 @@ void *val_aligned_alloc( uint32_t alignment, uint32_t size ) { return pal_aligned_alloc(alignment, size); + +} + +/** + @brief Checks for presence of persistent memory. + + @param none + + @return 1 - persistent memory exists. + 0 - persistent memory does not exist. +**/ +uint32_t +val_memory_check_for_persistent_mem(void) +{ + + uint32_t index = 0; + + while (g_memory_info_table->info[index].type != MEMORY_TYPE_LAST_ENTRY) { + if (g_memory_info_table->info[index].type == MEMORY_TYPE_PERSISTENT) + return 1; + index++; + } + return 0; } diff --git a/val/src/avs_pe.c b/val/src/avs_pe.c index cb7fb24f..ba83648a 100644 --- a/val/src/avs_pe.c +++ b/val/src/avs_pe.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -61,32 +61,35 @@ val_pe_execute_tests(uint32_t level, uint32_t num_pe) g_curr_module = 1 << PE_MODULE; -#ifndef ONLY_SBSA_RULE_TESTS - status |= c001_entry(); + status |= c001_entry(num_pe); status |= c002_entry(num_pe); - status |= c005_entry(num_pe); - status |= c006_entry(num_pe); - status |= c007_entry(num_pe); - status |= c008_entry(num_pe); - status |= c011_entry(num_pe); - status |= c012_entry(num_pe); - status |= c013_entry(num_pe); - status |= c014_entry(num_pe); - status |= c015_entry(num_pe); - status |= c017_entry(num_pe); -#endif - status |= c003_entry(num_pe); status |= c004_entry(num_pe); - status |= c010_entry(num_pe); if (level > 3) { - status |= c019_entry(num_pe); - status |= c020_entry(num_pe); - status |= c021_entry(num_pe); + status |= c005_entry(num_pe); + status |= c006_entry(num_pe); + status |= c007_entry(num_pe); + status |= c008_entry(num_pe); } if (level > 4) { + status |= c009_entry(num_pe); + status |= c010_entry(num_pe); + status |= c011_entry(num_pe); + status |= c012_entry(num_pe); + status |= c013_entry(num_pe); + status |= c014_entry(num_pe); + status |= c015_entry(num_pe); + status |= c016_entry(num_pe); + } + + if (level > 5) { + status |= c017_entry(num_pe); + status |= c018_entry(num_pe); + status |= c019_entry(num_pe); + status |= c020_entry(num_pe); + status |= c021_entry(num_pe); status |= c022_entry(num_pe); status |= c023_entry(num_pe); status |= c024_entry(num_pe); @@ -95,8 +98,7 @@ val_pe_execute_tests(uint32_t level, uint32_t num_pe) status |= c027_entry(num_pe); } - if (level > 5) { - status |= c018_entry(num_pe); + if (level > 6) { status |= c028_entry(num_pe); status |= c029_entry(num_pe); status |= c030_entry(num_pe); @@ -106,10 +108,7 @@ val_pe_execute_tests(uint32_t level, uint32_t num_pe) status |= c034_entry(num_pe); status |= c035_entry(num_pe); status |= c036_entry(num_pe); - -#ifdef ONLY_SBSA_RULE_TESTS - status |= os_c018_entry(num_pe); -#endif + status |= c037_entry(num_pe); } val_print_test_end(status, "PE"); @@ -249,7 +248,8 @@ val_pe_reg_read(uint32_t reg_id) if (AA64ReadCurrentEL() == AARCH64_EL2) return AA64ReadTcr2(); default: - val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), RESULT_FAIL(g_sbsa_level, 0, 0x78)); + val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), + RESULT_FAIL(g_sbsa_level, 0, 0x78), NULL); } return 0x0; @@ -308,7 +308,8 @@ val_pe_reg_write(uint32_t reg_id, uint64_t write_data) AA64WritePmblimitr(write_data); break; default: - val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), RESULT_FAIL(g_sbsa_level, 0, 0x78)); + val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), + RESULT_FAIL(g_sbsa_level, 0, 0x78), NULL); } } @@ -361,7 +362,7 @@ val_pe_get_pmu_gsiv(uint32_t index) PE_INFO_ENTRY *entry; if (index > g_pe_info_table->header.num_of_pe) { - val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF)); + val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF), NULL); return 0xFFFFFF; } @@ -461,3 +462,27 @@ uint32_t val_pe_reg_read_ttbr(uint32_t ttbr1, uint64_t *ttbr_ptr) *ttbr_ptr = ReadTtbr[ttbr1][(el >> 2) - 1](); return 0; } + +/** + @brief This API returns the GIC Maintenance Interrupt ID for a given PE index + 1. Caller - Test Suite + 2. Prerequisite - val_create_peinfo_table + @param index - the index of PE whose GIC Maintenace interrupt ID is returned. + @return GIC Maintenance interrupt ID +**/ +uint32_t +val_pe_get_gmain_gsiv(uint32_t index) +{ + + PE_INFO_ENTRY *entry; + + if (index > g_pe_info_table->header.num_of_pe) { + val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF), NULL); + return 0xFFFFFF; + } + + entry = g_pe_info_table->pe_info; + + return entry[index].gmain_gsiv; + +} diff --git a/val/src/avs_pe_infra.c b/val/src/avs_pe_infra.c index 88f1ab61..ed3a89c1 100644 --- a/val/src/avs_pe_infra.c +++ b/val/src/avs_pe_infra.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020-2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -144,7 +144,7 @@ val_pe_get_mpid_index(uint32_t index) PE_INFO_ENTRY *entry; if (index > g_pe_info_table->header.num_of_pe) { - val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF)); + val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF), NULL); return 0xFFFFFF; } @@ -225,7 +225,7 @@ val_execute_on_pe(uint32_t index, void (*payload)(void), uint64_t test_input) int timeout = TIMEOUT_LARGE; if (index > g_pe_info_table->header.num_of_pe) { val_print(AVS_PRINT_ERR, "Input Index exceeds Num of PE %x \n", index); - val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF)); + val_report_status(index, RESULT_FAIL(g_sbsa_level, 0, 0xFF), NULL); return; } diff --git a/val/src/avs_peripherals.c b/val/src/avs_peripherals.c index d14a6fd9..7ea417e0 100644 --- a/val/src/avs_peripherals.c +++ b/val/src/avs_peripherals.c @@ -181,6 +181,11 @@ val_peripheral_get_info(PERIPHERAL_INFO_e info_type, uint32_t instance) if (i != 0xFFFF) return g_peripheral_info_table->info[i].flags; break; + case ANY_BASE0: + i = val_peripheral_get_entry_index(PERIPHERAL_TYPE_NONE, instance); + if (i != 0xFFFF) + return g_peripheral_info_table->info[i].base0; + break; case ANY_FLAGS: i = val_peripheral_get_entry_index (PERIPHERAL_TYPE_NONE, instance); if (i != 0xFFFF) diff --git a/val/src/avs_status.c b/val/src/avs_status.c index 29ffa82f..aaebf916 100644 --- a/val/src/avs_status.c +++ b/val/src/avs_status.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,7 +29,7 @@ @return none **/ void -val_report_status(uint32_t index, uint32_t status) +val_report_status(uint32_t index, uint32_t status, char8_t *ruleid) { if (IS_TEST_FAIL(status)) { @@ -37,14 +37,32 @@ val_report_status(uint32_t index, uint32_t status) val_print(AVS_PRINT_ERR, "for Level= %2d ", (status >> LEVEL_BIT) & LEVEL_MASK); } - if (IS_TEST_PASS(status)) - val_print(AVS_PRINT_TEST, ": Result: PASS \n", status); + if (IS_TEST_PASS(status)) { + val_print(AVS_PRINT_DEBUG, "\n ", 0); + val_print(AVS_PRINT_DEBUG, ruleid, 0); + val_print(AVS_PRINT_DEBUG, "\n ", 0); + val_print(AVS_PRINT_TEST, ": Result: PASS \n", status); + } else - if (IS_TEST_FAIL(status)) - val_print(AVS_PRINT_ERR, ": Result: --FAIL-- %x \n", status & STATUS_MASK); + if (IS_TEST_FAIL(status)) { + if (ruleid) { + val_print(AVS_PRINT_ERR, "\n ", 0); + val_print(AVS_PRINT_ERR, ruleid, 0); + val_print(AVS_PRINT_ERR, "\n Checkpoint -- %2d ", + status & STATUS_MASK); + } + val_print(AVS_PRINT_ERR, " : Result: FAIL \n", 0); + } else - if (IS_TEST_SKIP(status)) - val_print(AVS_PRINT_WARN, ": Result: -SKIPPED- %x \n", status & STATUS_MASK); + if (IS_TEST_SKIP(status)) { + if (ruleid) { + val_print(AVS_PRINT_WARN, "\n ", 0); + val_print(AVS_PRINT_WARN, ruleid, 0); + val_print(AVS_PRINT_WARN, "\n Checkpoint -- %2d ", + status & STATUS_MASK); + } + val_print(AVS_PRINT_WARN, " : Result: SKIPPED \n", 0); + } else if (IS_TEST_START(status)) val_print(AVS_PRINT_INFO, "\n START ", status); diff --git a/val/src/avs_test_infra.c b/val/src/avs_test_infra.c index 8571755d..bee37f39 100644 --- a/val/src/avs_test_infra.c +++ b/val/src/avs_test_infra.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -236,7 +236,8 @@ val_mmio_write64(addr_t addr, uint64_t data) @return Skip - if the user has overriden to skip the test. **/ uint32_t -val_initialize_test(uint32_t test_num, char8_t *desc, uint32_t num_pe, uint32_t level) +val_initialize_test(uint32_t test_num, char8_t *desc, uint32_t num_pe, uint32_t level, + char8_t *ruleid) { uint32_t i; @@ -244,7 +245,7 @@ val_initialize_test(uint32_t test_num, char8_t *desc, uint32_t num_pe, uint32_t val_print(AVS_PRINT_ERR, "%4d : ", test_num); //Always print this val_print(AVS_PRINT_TEST, desc, 0); - val_report_status(0, SBSA_AVS_START(level, test_num)); + val_report_status(0, SBSA_AVS_START(level, test_num), ruleid); val_pe_initialize_default_exception_handler(val_pe_default_esr); g_sbsa_tests_total++; @@ -454,7 +455,7 @@ val_run_test_payload(uint32_t test_num, uint32_t num_pe, void (*payload)(void), @return Success or on failure - status of the last failed PE **/ uint32_t -val_check_for_error(uint32_t test_num, uint32_t num_pe) +val_check_for_error(uint32_t test_num, uint32_t num_pe, char8_t *ruleid) { uint32_t i; uint32_t status = 0; @@ -465,7 +466,7 @@ val_check_for_error(uint32_t test_num, uint32_t num_pe) of pe_info_table but num_pe is 1 for SOC tests */ if (num_pe == 1) { status = val_get_status(my_index); - val_report_status(my_index, status); + val_report_status(my_index, status, ruleid); if (IS_TEST_PASS(status)) { g_sbsa_tests_pass++; return AVS_STATUS_PASS; @@ -481,14 +482,14 @@ val_check_for_error(uint32_t test_num, uint32_t num_pe) status = val_get_status(i); //val_print(AVS_PRINT_ERR, "Status %4x \n", status); if (IS_TEST_FAIL_SKIP(status)) { - val_report_status(i, status); + val_report_status(i, status, ruleid); error_flag += 1; break; } } if (!error_flag) - val_report_status(my_index, status); + val_report_status(my_index, status, ruleid); if (IS_TEST_PASS(status)) { g_sbsa_tests_pass++; From 4b36750957c13483b1fdd73b278fae178f5d5ca9 Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Thu, 12 Jan 2023 17:35:46 +0530 Subject: [PATCH 2/8] SBSA 7.1 Changes - Added MPAM Related tests - Added New PMU Tests - Added RAS tests - Exerciser Test Bug Fixes - Nist Test changes Signed-off-by: Rajat Goyal --- test_pool/exerciser/test_e003.c | 3 + test_pool/exerciser/test_e005.c | 6 + test_pool/exerciser/test_e011.c | 3 + test_pool/exerciser/test_e012.c | 21 +- test_pool/exerciser/test_e013.c | 3 + test_pool/exerciser/test_e015.c | 14 +- .../mpam/operating_system/test_mpam001.c | 77 ++ .../mpam/operating_system/test_mpam002.c | 140 +++ .../mpam/operating_system/test_mpam003.c | 213 ++++ .../mpam/operating_system/test_mpam004.c | 141 +++ .../mpam/operating_system/test_mpam005.c | 131 ++ .../mpam/operating_system/test_mpam006.c | 299 +++++ test_pool/nist_sts/test_n001.c | 14 +- test_pool/pcie/operating_system/test_p009.c | 148 +++ test_pool/pcie/operating_system/test_p061.c | 197 +++ test_pool/pcie/operating_system/test_p062.c | 102 ++ test_pool/pmu/operating_system/test_pmu001.c | 112 ++ test_pool/pmu/operating_system/test_pmu002.c | 63 + test_pool/pmu/operating_system/test_pmu003.c | 66 + test_pool/pmu/operating_system/test_pmu004.c | 228 ++++ test_pool/pmu/operating_system/test_pmu005.c | 186 +++ test_pool/pmu/operating_system/test_pmu006.c | 78 ++ test_pool/pmu/operating_system/test_pmu007.c | 204 ++++ test_pool/pmu/operating_system/test_pmu008.c | 253 ++++ test_pool/pmu/operating_system/test_pmu009.c | 146 +++ test_pool/ras/operating_system/test_ras001.c | 120 ++ test_pool/ras/operating_system/test_ras002.c | 134 ++ test_pool/ras/operating_system/test_ras003.c | 130 ++ test_pool/ras/operating_system/test_ras004.c | 130 ++ test_pool/ras/operating_system/test_ras005.c | 185 +++ test_pool/ras/operating_system/test_ras006.c | 310 +++++ test_pool/ras/operating_system/test_ras007.c | 128 ++ test_pool/ras/operating_system/test_ras008.c | 116 ++ test_pool/ras/operating_system/test_ras009.c | 208 ++++ test_pool/ras/operating_system/test_ras010.c | 86 ++ test_pool/ras/operating_system/test_ras011.c | 259 ++++ test_pool/ras/operating_system/test_ras012.c | 142 +++ uefi_app/SbsaAvs.h | 16 +- uefi_app/SbsaAvs.inf | 39 +- uefi_app/SbsaAvsMain.c | 300 ++++- uefi_app/SbsaAvsNist.inf | 51 +- val/include/pal_interface.h | 362 +++++- val/include/sbsa_avs_common.h | 9 + val/include/sbsa_avs_exerciser.h | 2 +- val/include/sbsa_avs_mmu.h | 34 + val/include/sbsa_avs_mpam.h | 112 ++ val/include/sbsa_avs_mpam_reg.h | 167 +++ val/include/sbsa_avs_pmu.h | 55 + val/include/sbsa_avs_pmu_reg.h | 130 ++ val/include/sbsa_avs_ras.h | 133 ++ val/src/AArch64/MpamSupport.s | 54 + val/src/AArch64/RasSupport.S | 109 ++ val/src/avs_mmu.c | 238 ++++ val/src/avs_mpam.c | 1073 +++++++++++++++++ val/src/avs_pmu.c | 555 +++++++++ val/src/avs_ras.c | 827 +++++++++++++ 56 files changed, 8983 insertions(+), 79 deletions(-) create mode 100644 test_pool/mpam/operating_system/test_mpam001.c create mode 100644 test_pool/mpam/operating_system/test_mpam002.c create mode 100644 test_pool/mpam/operating_system/test_mpam003.c create mode 100644 test_pool/mpam/operating_system/test_mpam004.c create mode 100644 test_pool/mpam/operating_system/test_mpam005.c create mode 100644 test_pool/mpam/operating_system/test_mpam006.c create mode 100644 test_pool/pcie/operating_system/test_p009.c create mode 100644 test_pool/pcie/operating_system/test_p061.c create mode 100644 test_pool/pcie/operating_system/test_p062.c create mode 100644 test_pool/pmu/operating_system/test_pmu001.c create mode 100644 test_pool/pmu/operating_system/test_pmu002.c create mode 100644 test_pool/pmu/operating_system/test_pmu003.c create mode 100644 test_pool/pmu/operating_system/test_pmu004.c create mode 100644 test_pool/pmu/operating_system/test_pmu005.c create mode 100644 test_pool/pmu/operating_system/test_pmu006.c create mode 100644 test_pool/pmu/operating_system/test_pmu007.c create mode 100644 test_pool/pmu/operating_system/test_pmu008.c create mode 100644 test_pool/pmu/operating_system/test_pmu009.c create mode 100644 test_pool/ras/operating_system/test_ras001.c create mode 100644 test_pool/ras/operating_system/test_ras002.c create mode 100644 test_pool/ras/operating_system/test_ras003.c create mode 100644 test_pool/ras/operating_system/test_ras004.c create mode 100644 test_pool/ras/operating_system/test_ras005.c create mode 100644 test_pool/ras/operating_system/test_ras006.c create mode 100644 test_pool/ras/operating_system/test_ras007.c create mode 100644 test_pool/ras/operating_system/test_ras008.c create mode 100644 test_pool/ras/operating_system/test_ras009.c create mode 100644 test_pool/ras/operating_system/test_ras010.c create mode 100644 test_pool/ras/operating_system/test_ras011.c create mode 100644 test_pool/ras/operating_system/test_ras012.c create mode 100644 val/include/sbsa_avs_mmu.h create mode 100644 val/include/sbsa_avs_mpam.h create mode 100644 val/include/sbsa_avs_mpam_reg.h create mode 100644 val/include/sbsa_avs_pmu.h create mode 100644 val/include/sbsa_avs_pmu_reg.h create mode 100644 val/include/sbsa_avs_ras.h create mode 100644 val/src/AArch64/MpamSupport.s create mode 100644 val/src/AArch64/RasSupport.S create mode 100644 val/src/avs_mmu.c create mode 100644 val/src/avs_mpam.c create mode 100644 val/src/avs_pmu.c create mode 100644 val/src/avs_ras.c diff --git a/test_pool/exerciser/test_e003.c b/test_pool/exerciser/test_e003.c index bfe3c184..0fcad4ec 100644 --- a/test_pool/exerciser/test_e003.c +++ b/test_pool/exerciser/test_e003.c @@ -182,6 +182,9 @@ payload(void) if ((pgt_desc.oas = val_smmu_get_info(SMMU_OUT_ADDR_SIZE, master.smmu_index)) == 0) goto test_fail; + /* set pgt_desc.pgt_base to NULL to create new translation table, val_pgt_create + will update pgt_desc.pgt_base to point to created translation table */ + pgt_desc.pgt_base = (uint64_t) NULL; if (val_pgt_create(mem_desc, &pgt_desc)) goto test_fail; diff --git a/test_pool/exerciser/test_e005.c b/test_pool/exerciser/test_e005.c index a1ae015a..b3850676 100644 --- a/test_pool/exerciser/test_e005.c +++ b/test_pool/exerciser/test_e005.c @@ -232,6 +232,9 @@ payload(void) if ((pgt_desc.oas = val_smmu_get_info(SMMU_OUT_ADDR_SIZE, master.smmu_index)) == 0) goto test_fail; + /* set pgt_desc.pgt_base to NULL to create new translation table, val_pgt_create + will update pgt_desc.pgt_base to point to created translation table */ + pgt_desc.pgt_base = (uint64_t) NULL; if (val_pgt_create(mem_desc, &pgt_desc)) goto test_fail; @@ -308,6 +311,9 @@ payload(void) mem_desc->length = test_data_blk_size; mem_desc->attributes |= PGT_STAGE1_AP_RW; + /* set pgt_desc.pgt_base to NULL to create new translation table, val_pgt_create + will update pgt_desc.pgt_base to point to created translation table */ + pgt_desc.pgt_base = (uint64_t) NULL; if (val_pgt_create(mem_desc, &pgt_desc)) goto test_fail; diff --git a/test_pool/exerciser/test_e011.c b/test_pool/exerciser/test_e011.c index adbc02aa..4616848c 100644 --- a/test_pool/exerciser/test_e011.c +++ b/test_pool/exerciser/test_e011.c @@ -199,6 +199,9 @@ payload(void) if ((pgt_desc.oas = val_smmu_get_info(SMMU_OUT_ADDR_SIZE, master.smmu_index)) == 0) goto test_fail; + /* set pgt_desc.pgt_base to NULL to create new translation table, val_pgt_create + will update pgt_desc.pgt_base to point to created translation table */ + pgt_desc.pgt_base = (uint64_t) NULL; if (val_pgt_create(mem_desc, &pgt_desc)) goto test_fail; diff --git a/test_pool/exerciser/test_e012.c b/test_pool/exerciser/test_e012.c index bf5a76a0..a31f646b 100644 --- a/test_pool/exerciser/test_e012.c +++ b/test_pool/exerciser/test_e012.c @@ -245,6 +245,8 @@ payload(void) if (val_pcie_get_rootport(req_e_bdf, &req_rp_bdf)) continue; + val_print(AVS_PRINT_DEBUG, "\n bdf is 0x%x", req_e_bdf); + val_print(AVS_PRINT_DEBUG, "\n RP bdf is 0x%x", req_rp_bdf); /* It ACS Not Supported, Fail.*/ if (val_pcie_find_capability(req_rp_bdf, PCIE_ECAP, ECID_ACS, &cap_base) != PCIE_SUCCESS) { val_print(AVS_PRINT_ERR, "\n ACS Not Supported for BDF : 0x%x", req_rp_bdf); @@ -258,9 +260,15 @@ payload(void) val_pcie_write_cfg(req_rp_bdf, cap_base + ACSCR_OFFSET, reg_value); /* Find another exerciser on other rootport, - Break from the test if no such exerciser if found */ + Break from the test if no such exerciser if found and + Disable Source Validation & Transaction Blocking of req_rp_bdf*/ if (get_target_exer_bdf(req_rp_bdf, &tgt_e_bdf, &tgt_rp_bdf, &bar_base)) - continue; + { + val_pcie_read_cfg(req_rp_bdf, cap_base + ACSCR_OFFSET, ®_value); + reg_value = reg_value & (0 << ACS_CTRL_SVE_SHIFT) & (0 << ACS_CTRL_TBE_SHIFT); + val_pcie_write_cfg(req_rp_bdf, cap_base + ACSCR_OFFSET, reg_value); + continue; + } /* Enable Source Validation & Transaction Blocking */ val_pcie_read_cfg(tgt_rp_bdf, cap_base + ACSCR_OFFSET, ®_value); @@ -279,18 +287,23 @@ payload(void) status = check_transaction_blocking(instance, req_rp_bdf, bar_base); if (status == AVS_STATUS_SKIP) - val_print(AVS_PRINT_DEBUG, "\n ACS Transaction Blocking Skipped for 0x%x", req_rp_bdf); + val_print(AVS_PRINT_DEBUG, "\n ACS Transaction Blocking Skipped for 0x%x", req_rp_bdf); else if (status) curr_bdf_failed++; if(curr_bdf_failed > 0) { - val_print(AVS_PRINT_ERR, "\n ACS Functional Check Failed, RP Bdf : 0x%x", req_rp_bdf); + val_print(AVS_PRINT_ERR, "\n ACS Functional Check Failed, RP Bdf : 0x%x", req_rp_bdf); curr_bdf_failed = 0; fail_cnt++; } /* Clear Error Status Bits */ val_pcie_clear_device_status_error(req_rp_bdf); val_pcie_clear_sig_target_abort(req_rp_bdf); + + /* Disable Source Validation & Transaction Blocking */ + val_pcie_read_cfg(tgt_rp_bdf, cap_base + ACSCR_OFFSET, ®_value); + reg_value = reg_value & (0 << ACS_CTRL_SVE_SHIFT) & (0 << ACS_CTRL_TBE_SHIFT); + val_pcie_write_cfg(tgt_rp_bdf, cap_base + ACSCR_OFFSET, reg_value); } if (test_skip == 1) diff --git a/test_pool/exerciser/test_e013.c b/test_pool/exerciser/test_e013.c index 57fe8645..876a981a 100644 --- a/test_pool/exerciser/test_e013.c +++ b/test_pool/exerciser/test_e013.c @@ -161,6 +161,9 @@ create_va_pa_mapping (uint64_t txn_va, uint64_t txn_pa, if (!pgt_desc->oas) return AVS_STATUS_FAIL; + /* set pgt_desc.pgt_base to NULL to create new translation table, val_pgt_create + will update pgt_desc.pgt_base to point to created translation table */ + pgt_desc->pgt_base = (uint64_t) NULL; if (val_pgt_create(mem_desc, pgt_desc)) return AVS_STATUS_FAIL; diff --git a/test_pool/exerciser/test_e015.c b/test_pool/exerciser/test_e015.c index eb704c43..2cc66080 100644 --- a/test_pool/exerciser/test_e015.c +++ b/test_pool/exerciser/test_e015.c @@ -54,12 +54,7 @@ static uint32_t test_sequence_check(uint32_t instance) uint64_t num_transactions; uint64_t transaction_type; - /* Get number of transactions captured from exerciser */ - val_exerciser_get_param(NUM_TRANSACTIONS, NULL, &num_transactions, instance); - if (num_transactions != sizeof(transaction_order)/sizeof(transaction_order[0])) { - val_print(AVS_PRINT_ERR, "\n Exerciser %d gathering check failed", instance); - return 1; - } + num_transactions = sizeof(transaction_order)/sizeof(transaction_order[0]); /* Check transactions arrival order */ for (idx = 0; idx < sizeof(transaction_order)/sizeof(transaction_order[0]); idx++) { @@ -69,6 +64,13 @@ static uint32_t test_sequence_check(uint32_t instance) return 1; } } + + /* Get number of transactions captured from exerciser */ + if (num_transactions != idx) { + val_print(AVS_PRINT_ERR, "\n Exerciser %d gathering check failed", instance); + return 1; + } + return 0; } diff --git a/test_pool/mpam/operating_system/test_mpam001.c b/test_pool/mpam/operating_system/test_mpam001.c new file mode 100644 index 00000000..c9e76846 --- /dev/null +++ b/test_pool/mpam/operating_system/test_mpam001.c @@ -0,0 +1,77 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_MPAM_TEST_NUM_BASE + 1) +#define TEST_RULE "S_L7MP_01, S_L7MP_02" +#define TEST_DESC "Check for MPAM extension " + +static void payload(void) +{ + uint32_t pe_index; + uint64_t data = 0; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* PEs must implement FEAT_MPAM */ + /* ID_AA64PFR0_EL1.MPAM bits[43:40] > 0 or ID_AA64PFR1_EL1.MPAM_frac bits[19:16] > 0 + indicates implementation of MPAM extension */ + + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + + /* check support for minimum of 16 physical partition IDs, MPAMIDR_EL1.PARTID_MAX + must be >= 16 */ + data = VAL_EXTRACT_BITS(val_mpam_reg_read(MPAMIDR_EL1), 0, 15); + if (data < 16) { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t mpam001_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/mpam/operating_system/test_mpam002.c b/test_pool/mpam/operating_system/test_mpam002.c new file mode 100644 index 00000000..ad3ffc50 --- /dev/null +++ b/test_pool/mpam/operating_system/test_mpam002.c @@ -0,0 +1,140 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_MPAM_TEST_NUM_BASE + 2) +#define TEST_RULE "S_L7MP_03, S_L7MP_04" +#define TEST_DESC "Check for MPAM LLC CSU " + +static void payload(void) +{ + uint32_t llc_index; + uint32_t cache_identifier; + uint32_t msc_node_cnt; + uint32_t rsrc_node_cnt; + uint32_t msc_index, rsrc_index; + uint32_t csumon_count; + uint32_t test_fail = 0; + uint32_t test_run = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Check if PE implements FEAT_MPAM */ + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Find the LLC cache identifier */ + llc_index = val_cache_get_llc_index(); + if (llc_index == CACHE_TABLE_EMPTY) { + val_print(AVS_PRINT_ERR, "\n Cache info table empty", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + cache_identifier = val_cache_get_info(CACHE_ID, llc_index); + if (cache_identifier == INVALID_CACHE_INFO) { + val_print(AVS_PRINT_ERR, "\n LLC invalid in PPTT", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + + /* Check in the MPAM table which MSC is attached to the LLC */ + + msc_node_cnt = val_mpam_get_msc_count(); + val_print(AVS_PRINT_DEBUG, "\n MSC count = %d", msc_node_cnt); + + if (msc_node_cnt == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* visit each MSC node and check for cache resources */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + + val_print(AVS_PRINT_DEBUG, "\n msc index = %d", msc_index); + val_print(AVS_PRINT_DEBUG, "\n Resource count %d = ", rsrc_node_cnt); + + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + + /* check whether the resource location is cache */ + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_PE_CACHE) { + if (val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index) == + cache_identifier) { + /* We have MSC which controls/monitors the LLC cache */ + val_print(AVS_PRINT_DEBUG, "\n rsrc index = %d", rsrc_index); + + test_run = 1; + /* Check CSU monitor are present */ + if (!val_mpam_supports_csumon(msc_index)) { + val_print(AVS_PRINT_ERR, "\n CSU MON unsupported by LLC", 0); + test_fail = 1; + } + /* Check min 16 CSU monitor are present */ + csumon_count = val_mpam_get_csumon_count(msc_index); + if (csumon_count < 16) { + val_print(AVS_PRINT_ERR, "\n CSU MON %d less than 16", csumon_count); + test_fail = 1; + } + } + } + } + } + + if (!test_run) { + val_print(AVS_PRINT_ERR, "\n No LLC MSC found", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + return; + } + + if (test_fail) + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); + else + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + +} + +uint32_t mpam002_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/mpam/operating_system/test_mpam003.c b/test_pool/mpam/operating_system/test_mpam003.c new file mode 100644 index 00000000..94a8cc7e --- /dev/null +++ b/test_pool/mpam/operating_system/test_mpam003.c @@ -0,0 +1,213 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_MPAM_TEST_NUM_BASE + 3) +#define TEST_RULE "S_L7MP_05, S_L7MP_06" +#define TEST_DESC "Check for MPAM MBWUs Monitor func " + +#define BUFFER_SIZE 65536 /* 64 Kilobytes*/ + +static void payload(void) +{ + uint32_t pe_index; + uint32_t msc_node_cnt, msc_index; + uint32_t rsrc_node_cnt, rsrc_index; + uint64_t mpam2_el2, mpam2_el2_temp; + uint64_t byte_count; + uint64_t addr_base, addr_len; + uint64_t nrdy_timeout; + uint32_t test_fails = 0; + uint32_t test_skip = 1; + void *src_buf = 0; + void *dest_buf = 0; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Check if PE implements FEAT_MPAM */ + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + + /* get total number of MSCs reported by MPAM ACPI table */ + msc_node_cnt = val_mpam_get_msc_count(); + val_print(AVS_PRINT_DEBUG, "\n MSC count = %d", msc_node_cnt); + + if (!msc_node_cnt) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* MSC must implement MPAM v1.1 version */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + if (val_mpam_msc_get_version(msc_index) != MPAM_VERSION_1_1) { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + } + + /* read MPAM2_EL2 and store the value for restoring later */ + mpam2_el2 = val_mpam_reg_read(MPAM2_EL2); + mpam2_el2_temp = mpam2_el2; + + /* Write DEFAULT_PARTID & DEFAULT PMG to mpam2_el2 to generate PE traffic */ + mpam2_el2 = (mpam2_el2 & ~(MPAMn_ELx_PARTID_D_MASK << MPAMn_ELx_PARTID_D_SHIFT)) | + DEFAULT_PARTID << MPAMn_ELx_PARTID_D_SHIFT; + mpam2_el2 = (mpam2_el2 & ~(MPAMn_ELx_PMG_D_MASK << MPAMn_ELx_PMG_D_SHIFT)) | + DEFAULT_PMG << MPAMn_ELx_PMG_D_SHIFT; + + val_print(AVS_PRINT_DEBUG, "\n Value written to MPAM2_EL2 = 0x%llx", mpam2_el2); + val_mpam_reg_write(MPAM2_EL2, mpam2_el2); + + /* visit each MSC node and check for memory resources */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + + val_print(AVS_PRINT_DEBUG, "\n msc index = %d", msc_index); + val_print(AVS_PRINT_DEBUG, "\n Resource count %d = ", rsrc_node_cnt); + + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + + /* check whether the resource location is memory */ + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_MEMORY) { + + /* As per S_L7MP_05, MBWU monitoring must be supported for general purpose mem */ + if (!val_mpam_msc_supports_mbwumon(msc_index)) { + val_print(AVS_PRINT_ERR, "\n MBWU MON unsupported by MSC %d", msc_index); + test_fails++; + break; + } + + test_skip = 0; + /* select resource instance if RIS feature implemented */ + if (val_mpam_msc_supports_ris(msc_index)) + val_mpam_memory_configure_ris_sel(msc_index, rsrc_index); + + val_print(AVS_PRINT_DEBUG, "\n rsrc index = %d", rsrc_index); + + /* Allocate source and destination memory buffers*/ + addr_base = val_mpam_memory_get_base(msc_index, rsrc_index); + addr_len = val_mpam_memory_get_size(msc_index, rsrc_index); + + if ((addr_base == SRAT_INVALID_INFO) || (addr_len == SRAT_INVALID_INFO) || + (addr_len <= 2 * BUFFER_SIZE)) { /* src and dst buffer size */ + val_print(AVS_PRINT_ERR, "\n No SRAT mem range info found", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + + /* Restore MPAM2_EL2 settings */ + val_mpam_reg_write(MPAM2_EL2, mpam2_el2_temp); + return; + } + + + src_buf = (void *)val_mem_alloc_at_address(addr_base, BUFFER_SIZE); + dest_buf = (void *)val_mem_alloc_at_address(addr_base + BUFFER_SIZE, BUFFER_SIZE); + + if ((src_buf == NULL) || (dest_buf == NULL)) { + val_print(AVS_PRINT_ERR, "\n Memory allocation of buffers failed", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + + /* Restore MPAM2_EL2 settings */ + val_mpam_reg_write(MPAM2_EL2, mpam2_el2_temp); + return; + } + + /* configure MBWU Monitor for this memory resource node */ + val_mpam_memory_configure_mbwumon(msc_index); + + /* enable MBWU monitoring */ + val_mpam_memory_mbwumon_enable(msc_index); + + + /* wait for MAX_NRDY_USEC after msc config change */ + nrdy_timeout = val_mpam_get_info(MPAM_MSC_NRDY, msc_index, 0); + while (nrdy_timeout) { + --nrdy_timeout; + }; + + /* perform memory operation */ + val_memcpy(src_buf, dest_buf, BUFFER_SIZE); + + /* read the memory bandwidth usage monitor */ + byte_count = val_mpam_memory_mbwumon_read_count(msc_index); + + /* disable and reset the MBWU monitor */ + val_mpam_memory_mbwumon_disable(msc_index); + val_mpam_memory_mbwumon_reset(msc_index); + + val_print(AVS_PRINT_DEBUG, "\n byte_count = 0x%llx bytes", byte_count); + + /* the monitor should count both read and write bandwidth, + hence count should be twice of the buffer size */ + if ((byte_count != 2 * BUFFER_SIZE)) { + val_print(AVS_PRINT_ERR, "\n Monitor count incorrect for MSC %d", + msc_index); + val_print(AVS_PRINT_ERR, " rsrc node %d", rsrc_index); + test_fails++; + } + + /* free the buffers */ + val_mem_free_at_address((uint64_t)src_buf, BUFFER_SIZE); + val_mem_free_at_address((uint64_t)dest_buf, BUFFER_SIZE); + } + } + } + /* Restore MPAM2_EL2 settings */ + val_mpam_reg_write(MPAM2_EL2, mpam2_el2_temp); + + if (test_fails) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + else if (test_skip) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 04)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + + return; +} + +uint32_t mpam003_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/mpam/operating_system/test_mpam004.c b/test_pool/mpam/operating_system/test_mpam004.c new file mode 100644 index 00000000..7db82c2b --- /dev/null +++ b/test_pool/mpam/operating_system/test_mpam004.c @@ -0,0 +1,141 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_MPAM_TEST_NUM_BASE + 4) +#define TEST_RULE "S_L7MP_07" +#define TEST_DESC "Check for MBWU counter size " + +#define MBWU_COUNTER_44BIT 0 +#define MAX_44BIT_COUNTER_BW 1677722 /* this is in MB (1.6 TB) */ + +static void payload(void) +{ + uint32_t pe_index; + uint32_t msc_node_cnt, msc_index; + uint32_t rsrc_node_cnt, rsrc_index; + uint64_t mbwu_bw; + uint32_t test_fails = 0; + uint32_t test_skip = 1; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + /* Check if PE implements FEAT_MPAM */ + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* get total number of MSCs reported by MPAM ACPI table */ + msc_node_cnt = val_mpam_get_msc_count(); + val_print(AVS_PRINT_DEBUG, "\n MSC count = %d", msc_node_cnt); + + if (!msc_node_cnt) { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* visit each MSC node and check for memory resources */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + + val_print(AVS_PRINT_DEBUG, "\n msc index = %d", msc_index); + val_print(AVS_PRINT_DEBUG, "\n Resource count %d = ", rsrc_node_cnt); + + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + + /* check whether the resource location is memory */ + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_MEMORY) { + + /* As per S_L7MP_05, MBWU monitoring must be supported for general purpose mem */ + if (!val_mpam_msc_supports_mbwumon(msc_index)) { + val_print(AVS_PRINT_ERR, "\n MBWU MON unsupported by MSC %d", msc_index); + test_fails++; + break; + } + + test_skip = 0; + + /* L7MP_07, MBWU counter size must be 44 bit for interface b/w upto 1.6 TB/s + else 66 bit. Check MBWUMON_IDR HAS_LONG[30] and LWD[29] bits. The reg is + present only if mbwumon is supported */ + if (!val_mpam_msc_supports_mbwumon(msc_index)) { + val_print(AVS_PRINT_ERR, "\n MBWU MON unsupported by MSC %d", msc_index); + test_fails++; + break; + } + if (!val_mpam_mbwu_supports_long(msc_index)) { + val_print(AVS_PRINT_ERR, "\n MBWU long unsupported MSC %d", msc_index); + test_fails++; + break; + } + mbwu_bw = val_mpam_msc_get_mscbw(msc_index, rsrc_index); + if (mbwu_bw == HMAT_INVALID_INFO) + { + val_print(AVS_PRINT_ERR, "\n No HMAT info ", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + if ((val_mpam_mbwu_supports_lwd(msc_index) == MBWU_COUNTER_44BIT) + && (mbwu_bw >= MAX_44BIT_COUNTER_BW)) { + val_print(AVS_PRINT_ERR, "\n MBWU supported b/w %d", mbwu_bw); + test_fails++; + break; + } + } + } + } + + if (test_fails) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + else if (test_skip) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + + return; +} + +uint32_t mpam004_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/mpam/operating_system/test_mpam005.c b/test_pool/mpam/operating_system/test_mpam005.c new file mode 100644 index 00000000..33b32070 --- /dev/null +++ b/test_pool/mpam/operating_system/test_mpam005.c @@ -0,0 +1,131 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_mpam.h" +#include "val/include/sbsa_avs_peripherals.h" + +#define TEST_NUM (AVS_MPAM_TEST_NUM_BASE + 5) +#define TEST_RULE "S_L7MP_08" +#define TEST_DESC "Check for MPAM MSC address overlap" + +static void payload(void) +{ + uint32_t msc_node_cnt; + uint32_t msc_index; + uint32_t msc_index1; + uint64_t msc_addr; + uint32_t msc_len; + uint64_t msc_addr1; + uint32_t test_fails = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t peri_count; + uint64_t peripheral_base; + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + msc_node_cnt = val_mpam_get_msc_count(); + val_print(AVS_PRINT_DEBUG, "\n MSC count = %d", msc_node_cnt); + + if (msc_node_cnt == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Check MSC memory node size are not overlapping with other MSC */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + msc_addr = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + msc_len = val_mpam_get_info(MPAM_MSC_ADDR_LEN, msc_index, 0); + + for (msc_index1 = msc_index + 1; msc_index1 < msc_node_cnt; msc_index1++) { + msc_addr1 = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index1, 0); + + if (msc_addr1 >= msc_addr && msc_addr1 <= (msc_addr + msc_len)) { + val_print(AVS_PRINT_ERR, "\n MSC %d and", msc_index); + val_print(AVS_PRINT_ERR, " %d memory layout overlapping", msc_index1); + test_fails++; + } + } + + /* Check with peripherals - USB */ + peri_count = val_peripheral_get_info(NUM_USB, 0); + while (peri_count) { + --peri_count; //array index starts from 0, so subtract 1 from count + val_print(AVS_PRINT_DEBUG, "\n USB index %d", peri_count); + peripheral_base = val_peripheral_get_info(USB_BASE0, peri_count); + if (peripheral_base >= msc_addr && peripheral_base <= (msc_addr + msc_len)) { + val_print(AVS_PRINT_ERR, "\n MSC %d and", msc_index); + val_print(AVS_PRINT_ERR, " USB %d memory layout overlapping", peri_count); + test_fails++; + } + } + + + /* Check with peripherals - UART */ + peri_count = val_peripheral_get_info(NUM_UART, 0); + while (peri_count) { + --peri_count; //array index starts from 0, so subtract 1 from count + val_print(AVS_PRINT_DEBUG, "\n UART index %d", peri_count); + peripheral_base = val_peripheral_get_info(UART_BASE0, peri_count); + if (peripheral_base >= msc_addr && peripheral_base <= (msc_addr + msc_len)) { + val_print(AVS_PRINT_ERR, "\n MSC %d and", msc_index); + val_print(AVS_PRINT_ERR, " UART %d memory layout overlapping", peri_count); + test_fails++; + } + } + + /* Check with peripherals - SATA */ + peri_count = val_peripheral_get_info(NUM_SATA, 0); + while (peri_count) { + --peri_count; //array index starts from 0, so subtract 1 from count + val_print(AVS_PRINT_DEBUG, "\n SATA index %d", peri_count); + peripheral_base = val_peripheral_get_info(SATA_BASE0, peri_count); + if (peripheral_base >= msc_addr && peripheral_base <= (msc_addr + msc_len)) { + val_print(AVS_PRINT_ERR, "\n MSC %d and", msc_index); + val_print(AVS_PRINT_ERR, " SATA %d memory layout overlapping", peri_count); + test_fails++; + } + } + } + + if (test_fails) + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + else + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t mpam005_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/mpam/operating_system/test_mpam006.c b/test_pool/mpam/operating_system/test_mpam006.c new file mode 100644 index 00000000..484712a8 --- /dev/null +++ b/test_pool/mpam/operating_system/test_mpam006.c @@ -0,0 +1,299 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_mpam.h" +#include "val/include/sbsa_avs_memory.h" + +#define TEST_NUM (AVS_MPAM_TEST_NUM_BASE + 6) +#define TEST_RULE "S_L7MP_03" +#define TEST_DESC "Check PMG storage by CPOR nodes " + +#define PARTITION_PERCENTAGE 75 +#define CACHE_PERCENTAGE 50 + +static uint64_t mpam2_el2_temp; + +static void payload(void) +{ + uint32_t msc_node_cnt; + uint32_t rsrc_node_cnt; + uint32_t msc_index; + uint32_t rsrc_index; + uint32_t llc_index; + uint32_t cache_identifier; + uint32_t cache_size; + uint32_t max_pmg; + uint32_t max_partid; + uint32_t cpor_nodes = 0; + uint32_t csumon_count = 0; + uint8_t pmg1; + uint8_t pmg2; + void *src_buf = 0; + void *dest_buf = 0; + uint64_t buf_size; + uint64_t mpam2_el2 = 0; + uint64_t nrdy_timeout; + uint32_t storage_value1; + uint32_t storage_value2; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Check if PE implements FEAT_MPAM */ + if (!((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0))) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Get the Index for LLC */ + llc_index = val_cache_get_llc_index(); + if (llc_index == CACHE_TABLE_EMPTY) { + val_print(AVS_PRINT_ERR, "\n Cache info table empty", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Get the cache identifier for LLC */ + cache_identifier = val_cache_get_info(CACHE_ID, llc_index); + if (cache_identifier == INVALID_CACHE_INFO) { + val_print(AVS_PRINT_ERR, "\n LLC invalid in PPTT", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Get total number of MSCs reported by MPAM ACPI table */ + msc_node_cnt = val_mpam_get_msc_count(); + val_print(AVS_PRINT_DEBUG, "\n MSC count = %d", msc_node_cnt); + + if (msc_node_cnt == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* Get MPAM related information for LLC */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_PE_CACHE) { + if (val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index) == + cache_identifier) { + if (val_mpam_supports_cpor(msc_index)) { + cache_size = val_cache_get_info(CACHE_SIZE, llc_index); + + max_pmg = val_mpam_get_max_pmg(msc_index); + + if (val_mpam_supports_csumon(msc_index)) + csumon_count = val_mpam_get_csumon_count(msc_index); + cpor_nodes++; + } + max_partid = val_mpam_get_max_partid(msc_index); + } + } + } + } + + val_print(AVS_PRINT_DEBUG, "\n CPOR Nodes = %d", cpor_nodes); + val_print(AVS_PRINT_DEBUG, "\n Max PMG = %d", max_pmg); + val_print(AVS_PRINT_DEBUG, "\n Max PARTID = %d", max_partid); + val_print(AVS_PRINT_DEBUG, "\n Cache Size = 0x%x", cache_size); + val_print(AVS_PRINT_DEBUG, "\n Number of CSU Monitors = %d", csumon_count); + + if (csumon_count == 0 || cpor_nodes == 0) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* Configure CPOR settings for nodes supporting CPOR */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_PE_CACHE) { + if (val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index) == + cache_identifier) { + /* Select resource instance if RIS feature implemented */ + if (val_mpam_msc_supports_ris(msc_index)) + val_mpam_memory_configure_ris_sel(msc_index, rsrc_index); + + if (val_mpam_supports_cpor(msc_index)) + val_mpam_configure_cpor(msc_index, max_partid, PARTITION_PERCENTAGE); + } + } + } + } + + /* Create two PMG groups for PE traffic */ + pmg1 = max_pmg; + pmg2 = max_pmg-1; + + mpam2_el2 = val_mpam_reg_read(MPAM2_EL2); + mpam2_el2_temp = mpam2_el2; + + /* visit each MSC node and check for Cache resources */ + for (msc_index = 0; msc_index < msc_node_cnt; msc_index++) { + rsrc_node_cnt = val_mpam_get_info(MPAM_MSC_RSRC_COUNT, msc_index, 0); + + val_print(AVS_PRINT_DEBUG, "\n msc index = %d", msc_index); + val_print(AVS_PRINT_DEBUG, "\n Resource count %d = ", rsrc_node_cnt); + + for (rsrc_index = 0; rsrc_index < rsrc_node_cnt; rsrc_index++) { + + /* Check whether resource node is a PE Cache */ + if (val_mpam_get_info(MPAM_MSC_RSRC_TYPE, msc_index, rsrc_index) == + MPAM_RSRC_TYPE_PE_CACHE) { + + /*Check if the PE Cache ID matches LLC ID */ + if (val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index) == + cache_identifier) { + + buf_size = cache_size * CACHE_PERCENTAGE / 100 ; + + /*Allocate memory for source and destination buffers */ + src_buf = (void *)val_memory_alloc(buf_size); + dest_buf = (void *)val_memory_alloc(buf_size); + + val_print(AVS_PRINT_DEBUG, "\n buf_size = 0x%x", buf_size); + + if ((src_buf == NULL) || (dest_buf == NULL)) { + val_print(AVS_PRINT_ERR, "\n Mem allocation failed", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + } + + /* Clear the PARTID_D & PMG_D bits in mpam2_el2 before writing to them */ + mpam2_el2 = CLEAR_BITS_M_TO_N(mpam2_el2, MPAMn_ELx_PARTID_D_SHIFT+15, + MPAMn_ELx_PARTID_D_SHIFT); + mpam2_el2 = CLEAR_BITS_M_TO_N(mpam2_el2, MPAMn_ELx_PMG_D_SHIFT+7, + MPAMn_ELx_PMG_D_SHIFT); + + /* Write MAX_PARTID & PMG2 to MPAM2_EL2 and generate PE traffic */ + mpam2_el2 |= (((uint64_t)pmg2 << MPAMn_ELx_PMG_D_SHIFT) | + ((uint64_t)max_partid << MPAMn_ELx_PARTID_D_SHIFT)); + + val_mpam_reg_write(MPAM2_EL2, mpam2_el2); + + /* Configure CSU monitors with PMG1 */ + if (val_mpam_supports_cpor(msc_index) && val_mpam_supports_csumon(msc_index)) + val_mpam_configure_csu_mon(msc_index, max_partid, pmg1, 0); + + /* Enable CSU monitoring */ + val_mpam_csumon_enable(msc_index); + + /* wait for MAX_NRDY_USEC after msc config change */ + nrdy_timeout = val_mpam_get_info(MPAM_MSC_NRDY, msc_index, 0); + while (nrdy_timeout) { + --nrdy_timeout; + }; + + /*Perform first memory transaction */ + val_memcpy(src_buf, dest_buf, buf_size); + + /* Read Cache storage value */ + storage_value1 = val_mpam_read_csumon(msc_index); + + val_print(AVS_PRINT_DEBUG, "\n Storage Value 1 = 0x%x", storage_value1); + + /*Restore initial MPAM_EL2 settings */ + mpam2_el2 = mpam2_el2_temp; + + /* Clear the PARTID_D & PMG_D bits in mpam2_el2 before writing to them */ + mpam2_el2 = CLEAR_BITS_M_TO_N(mpam2_el2, MPAMn_ELx_PARTID_D_SHIFT+15, + MPAMn_ELx_PARTID_D_SHIFT); + mpam2_el2 = CLEAR_BITS_M_TO_N(mpam2_el2, MPAMn_ELx_PMG_D_SHIFT+7, + MPAMn_ELx_PMG_D_SHIFT); + + /* Write MAX_PARTID & PMG1 to MPAM2_EL2 and generate PE traffic */ + mpam2_el2 |= (((uint64_t)pmg1 << MPAMn_ELx_PMG_D_SHIFT) | + ((uint64_t)max_partid << MPAMn_ELx_PARTID_D_SHIFT)); + + val_mpam_reg_write(MPAM2_EL2, mpam2_el2); + + /* Disable the monitor */ + val_mpam_csumon_disable(msc_index); + + /* Enable CSU monitoring */ + val_mpam_csumon_enable(msc_index); + + /* wait for MAX_NRDY_USEC after msc config change */ + nrdy_timeout = val_mpam_get_info(MPAM_MSC_NRDY, msc_index, 0); + while (nrdy_timeout) { + --nrdy_timeout; + }; + + /*Perform second memory transaction */ + val_memcpy(src_buf, dest_buf, buf_size); + + /* Read Cache storage value for PMG1 */ + storage_value2 = val_mpam_read_csumon(msc_index); + + val_print(AVS_PRINT_DEBUG, "\n Storage Value 1 = 0x%x", storage_value2); + + /* Disable the monitor */ + val_mpam_csumon_disable(msc_index); + + /* Test fails if storage_value1 is non zero or storage_value2 is zero */ + if (storage_value1 || !storage_value2) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); + + /*Restore MPAM2_EL2 settings */ + val_mpam_reg_write(MPAM2_EL2, mpam2_el2_temp); + + /*Free the buffers */ + val_memory_free(src_buf); + val_memory_free(dest_buf); + + return; + } + + /*Restore MPAM2_EL2 settings */ + val_mpam_reg_write(MPAM2_EL2, mpam2_el2_temp); + + /*Free the buffers */ + val_memory_free(src_buf); + val_memory_free(dest_buf); + } + } + } + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + return; +} + +uint32_t mpam006_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/nist_sts/test_n001.c b/test_pool/nist_sts/test_n001.c index b0939fe3..8f02994e 100644 --- a/test_pool/nist_sts/test_n001.c +++ b/test_pool/nist_sts/test_n001.c @@ -38,6 +38,16 @@ extern int main(int argc, char *argv[]); +static int acs_strnlen(const char *buffer, size_t max_len) +{ + size_t len; + for (len = 0; len < max_len; len++, buffer++) { + if (!*buffer) + break; + } + return (len); +} + /*Enabling all NIST test suites(test 1 - 15) by default */ uint32_t test_select = ALL_NIST_TEST; @@ -55,7 +65,7 @@ check_prerequisite_nist(void) * executing NIST test suite. */ for (i = 0; i < REQ_OPEN_FILES; i++) { - sprintf(file_name[i], "tmp_%d.txt", i); + snprintf(file_name[i], 20, "tmp_%d.txt", i); fp[i] = fopen(file_name[i], "wb"); if (fp[i] == NULL) { val_print(AVS_PRINT_ERR, "\nMax # of opened files has been reached. " @@ -96,7 +106,7 @@ print_nist_result(void) while (fgets(buffer, BUFFER_SIZE, fptr) != NULL) { /* Total character read count */ - totalRead = strlen(buffer); + totalRead = acs_strnlen(buffer, BUFFER_SIZE); /* Trim new line character from last if exists */ buffer[totalRead - 1] = buffer[totalRead - 1] == '\n' diff --git a/test_pool/pcie/operating_system/test_p009.c b/test_pool/pcie/operating_system/test_p009.c new file mode 100644 index 00000000..96ca8bbd --- /dev/null +++ b/test_pool/pcie/operating_system/test_p009.c @@ -0,0 +1,148 @@ +/** @file + * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_memory.h" + +#define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 9) +#define TEST_DESC "Check all MSI(X) vectors are LPIs " +#define TEST_RULE "S_L3GI_02" + +#define LPI_BASE 8192 + +/** + @brief Returns MSI(X) status of the device + + @param dev_index index of PCI device + + @return 0 device does not support MSI(X) + @return 1 device supports MSI(X) +**/ +static +uint32_t +check_msi_status (uint32_t dev_index) { + uint32_t data; + + data = val_peripheral_get_info (ANY_FLAGS, dev_index); + + if ((data & PER_FLAG_MSI_ENABLED) && + val_peripheral_get_info (ANY_GSIV, dev_index)) { + return 1; + } + + return 0; +} + +/** + @brief Free memory allocated for a list of MSI(X) vectors + + @param list pointer to a list of MSI(X) vectors +**/ +static +void +clean_msi_list (PERIPHERAL_VECTOR_LIST *list) +{ + PERIPHERAL_VECTOR_LIST *next_node; + PERIPHERAL_VECTOR_LIST *current_node; + + current_node = list; + while (current_node != NULL) { + next_node = current_node->next; + val_memory_free (current_node); + current_node = next_node; + } +} + +static +void +payload (void) +{ + + uint32_t count = val_peripheral_get_info (NUM_ALL, 0); + uint32_t index = val_pe_get_index_mpid (val_pe_get_mpid()); + uint8_t status; + PERIPHERAL_VECTOR_LIST *dev_mvec, *mvec; + uint64_t dev_bdf; + uint32_t test_skip = 1; + + if(!count) { + val_set_status (index, RESULT_SKIP (g_sbsa_level, TEST_NUM, 2)); + return; + } + + status = 0; + dev_mvec = NULL; + + /* + Pull each discovered PCI device and its list of MSI(X) vectors. + Check whether every vector IRQ number is an LPI or not. + */ + while (count > 0 && !status) { + if (check_msi_status (count - 1)) { + /* Get BDF of a device */ + dev_bdf = val_peripheral_get_info (ANY_BDF, count - 1); + if (dev_bdf) { + val_print (AVS_PRINT_INFO, " Checking PCI device with BDF %4X\n", dev_bdf); + /* Read MSI(X) vectors */ + if (val_get_msi_vectors (dev_bdf, &dev_mvec)) { + test_skip = 0; + mvec = dev_mvec; + while(mvec) { + if(mvec->vector.vector_irq_base < LPI_BASE) { + val_print(AVS_PRINT_INFO, " MSI vector irq %d is not an LPI\n", mvec->vector.vector_irq_base); + val_set_status (index, RESULT_FAIL (g_sbsa_level, TEST_NUM, mvec->vector.vector_irq_base)); + status = 1; + } + mvec = mvec->next; + } + clean_msi_list (dev_mvec); + } + } + } + count--; + } + + if (test_skip) { + val_print(AVS_PRINT_ERR, "\n No MSI vectors found ", 0); + val_set_status (index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 0)); + } else if (!status) { + val_set_status (index, RESULT_PASS(g_sbsa_level, TEST_NUM, 0)); + } +} + +uint32_t +p009_entry (uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) { + val_run_test_payload (TEST_NUM, num_pe, payload, 0); + } + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pcie/operating_system/test_p061.c b/test_pool/pcie/operating_system/test_p061.c new file mode 100644 index 00000000..0baee70c --- /dev/null +++ b/test_pool/pcie/operating_system/test_p061.c @@ -0,0 +1,197 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_pe.h" + +#define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 61) +#define TEST_DESC "Check RootPort P&NP Memory Access " +#define TEST_RULE "S_PCI_02" + +static void *branch_to_test; + +static +void +esr(uint64_t interrupt_type, void *context) +{ + uint32_t pe_index; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + + /* Update the ELR to return to test specified address */ + val_pe_update_elr(context, (uint64_t)branch_to_test); + + val_print(AVS_PRINT_INFO, "\n Received exception of type: %d", interrupt_type); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +static uint32_t test_sequence_1B(uint8_t *addr) +{ + uint32_t write_val = 0xAB; + uint32_t read_value, old_value; + uint32_t pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + + for (int idx = 0; idx < 8; idx++) { + old_value = val_mmio_read8((addr_t)addr); + val_mmio_write8((addr_t)addr, write_val); + read_value = val_mmio_read8((addr_t)addr); + + if ((old_value != read_value && read_value == PCIE_UNKNOWN_RESPONSE)) { + val_print(AVS_PRINT_ERR, "\n Error in read and write 1B", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return 1; + } + + val_mmio_write8((addr_t)addr, old_value); + addr++; + } + + return 0; +} + +uint32_t test_sequence_2B(uint16_t *addr) +{ + uint32_t write_val = 0xABCD; + uint32_t read_value, old_value; + uint32_t pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + + for (int idx = 0; idx < 4; idx++) { + old_value = val_mmio_read16((addr_t)addr); + val_mmio_write16((addr_t)addr, write_val); + read_value = val_mmio_read16((addr_t)addr); + + if ((old_value != read_value && read_value == PCIE_UNKNOWN_RESPONSE)) { + val_print(AVS_PRINT_ERR, "\n Error in read and write 2B", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return 1; + } + + val_mmio_write16((addr_t)addr, old_value); + addr++; + } + + return 0; +} + +static +void +payload(void) +{ + + uint32_t bdf; + uint32_t pe_index; + uint32_t tbl_index; + uint32_t bar_data; + uint32_t test_fails; + uint32_t test_skip = 1; + uint64_t bar_base = 0; + uint32_t status; + pcie_device_bdf_table *bdf_tbl_ptr; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + bdf_tbl_ptr = val_pcie_bdf_table_ptr(); + + /* Install sync and async handlers to handle exceptions.*/ + status = val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); + status |= val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); + if (status) + { + val_print(AVS_PRINT_ERR, "\n Failed in installing the exception handler", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + branch_to_test = &&exception_return; + + bar_data = 0; + tbl_index = 0; + test_fails = 0; + + while (tbl_index < bdf_tbl_ptr->num_entries) + { + bdf = bdf_tbl_ptr->device[tbl_index++].bdf; + + /* + * For Function with Type 1 config space header, obtain + * base address of the its own BAR address. + */ + if ((val_pcie_function_header_type(bdf) == TYPE1_HEADER)) + val_pcie_get_mmio_bar(bdf, &bar_base); + + /* Skip this function if it doesn't have mmio BAR */ + if (!bar_base) + continue; + + /* If test runs for atleast an endpoint */ + test_skip = 0; + + bar_data = val_mmio_read(bar_base); + + if (test_sequence_1B((uint8_t *)bar_base)) { + val_print(AVS_PRINT_ERR, "\n Failed check for Bdf 0x%x", bdf); + test_fails++; + } + + if (test_sequence_2B((uint16_t *)bar_base)) { + val_print(AVS_PRINT_ERR, "\n Failed check for Bdf 0x%x", bdf); + test_fails++; + } + + val_mmio_write(bar_base, bar_data); + +exception_return: + + if (IS_TEST_FAIL(val_get_status(pe_index))) { + val_print(AVS_PRINT_ERR, "\n Failed. Exception on Memory Access For Bdf 0x%x", bdf); + val_pcie_clear_urd(bdf); + test_fails++; + } + + /* Reset the loop variables */ + bar_data = 0; + } + + if (test_skip == 1) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + else if (test_fails) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, test_fails)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +p061_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pcie/operating_system/test_p062.c b/test_pool/pcie/operating_system/test_p062.c new file mode 100644 index 00000000..645bf0c7 --- /dev/null +++ b/test_pool/pcie/operating_system/test_p062.c @@ -0,0 +1,102 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_pe.h" + +#define TEST_NUM (AVS_PCIE_TEST_NUM_BASE + 62) +#define TEST_DESC "Check EA Capability " +#define TEST_RULE "S_L4PCI_2" + +static +void +payload(void) +{ + + uint32_t bdf; + uint32_t pe_index; + uint32_t tbl_index; + uint32_t reg_value; + uint32_t enable_value; + uint32_t test_fails; + uint32_t test_skip = 1; + uint32_t cap_base; + uint32_t status; + pcie_device_bdf_table *bdf_tbl_ptr; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + bdf_tbl_ptr = val_pcie_bdf_table_ptr(); + + tbl_index = 0; + test_fails = 0; + + while (tbl_index < bdf_tbl_ptr->num_entries) + { + bdf = bdf_tbl_ptr->device[tbl_index++].bdf; + + /* If test runs for atleast an endpoint */ + test_skip = 0; + + /* Retrieve the addr of Enhanced Allocation capability (14h) and check if the + * capability structure is not supported. + */ + status = val_pcie_find_capability(bdf, PCIE_CAP, CID_EA, &cap_base); + if (status == PCIE_CAP_NOT_FOUND) + continue; + + /* Read Entry type register(08h) present in Enhanced Allocation capability struct(10h) */ + val_pcie_read_cfg(bdf, cap_base + EA_ENTRY_TYPE_OFFSET, ®_value); + + /* Extract enable value */ + enable_value = (reg_value >> EA_ENTRY_TYPE_ENABLE_SHIFT) & EA_ENTRY_TYPE_ENABLE_MASK; + if (enable_value) + { + val_print(AVS_PRINT_ERR, "\n Failed. BDF 0x%x Supports Enhanced Allocation", bdf); + test_fails++; + } + } + + if (test_skip == 1) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + else if (test_fails) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, test_fails)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +p062_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu001.c b/test_pool/pmu/operating_system/test_pmu001.c new file mode 100644 index 00000000..92d7500f --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu001.c @@ -0,0 +1,112 @@ +/** @file + * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 1) +#define TEST_RULE "PMU_PE_02" +#define TEST_DESC "Check PMU Overflow signal " + +static uint32_t int_id; + +void +set_pmu_overflow() +{ + uint64_t pmcr; + + //Initializing the state of overflow status and interrupt request registers + val_pe_reg_write(PMINTENCLR_EL1, 0xFFFFFFFF); + val_pe_reg_write(PMOVSCLR_EL0, 0xFFFFFFFF); + + //Sequence to generate PMUIRQ + pmcr = val_pe_reg_read(PMCR_EL0); + val_pe_reg_write(PMCR_EL0, pmcr|0x1); + + val_pe_reg_write(PMINTENSET_EL1, 0x1); + val_pe_reg_write(PMOVSSET_EL0, 0x1); + +} + + +static +void +isr() +{ + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + /* We received our interrupt, so disable PMUIRQ from generating further interrupts */ + val_pe_reg_write(PMOVSCLR_EL0, 0x1); + val_print(AVS_PRINT_INFO, "\n Received PMUIRQ ", 0); + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + val_gic_end_of_interrupt(int_id); + + return; +} + + +static +void +payload() +{ + uint32_t timeout = 0x100000; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + int_id = val_pe_get_pmu_gsiv(index); + + if (int_id != 23) { + timeout = 0; + val_print(AVS_PRINT_ERR, "\n Incorrect PPI value %d ", int_id); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_gic_install_isr(int_id, isr); + + set_pmu_overflow(); + + while ((--timeout > 0) && (IS_RESULT_PENDING(val_get_status(index)))) { + ; + } + + if (timeout == 0) + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +/** + @brief Install ISR and verify PMU Overflow Interrupt by programming System registers +**/ +uint32_t +pmu001_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + num_pe = 1; + + status = val_initialize_test(TEST_NUM, TEST_DESC, val_pe_get_num(), g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + /* execute payload on present PE and then execute on other PE */ + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} + diff --git a/test_pool/pmu/operating_system/test_pmu002.c b/test_pool/pmu/operating_system/test_pmu002.c new file mode 100644 index 00000000..5e79674d --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu002.c @@ -0,0 +1,63 @@ +/** @file + * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_pe.h" + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 2) +#define TEST_RULE " PMU_PE_03" +#define TEST_DESC "Check number of PMU counters " + +static +void +payload() +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + data = val_pe_reg_read(PMCR_EL0); + + if (((data & 0x0F800) >> 11) > 5) //bits 15:11 for Number of counters. + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + + return; + +} + +uint32_t +pmu002_entry(uint32_t num_pe) +{ + + uint32_t status; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + /* execute payload on present PE and then execute on other PE */ + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} + + diff --git a/test_pool/pmu/operating_system/test_pmu003.c b/test_pool/pmu/operating_system/test_pmu003.c new file mode 100644 index 00000000..061b6956 --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu003.c @@ -0,0 +1,66 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 3) +#define TEST_RULE "PMU_EV_11" +#define TEST_DESC "Check for multi-threaded PMU ext " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + data = val_pe_reg_read(ID_AA64DFR0_EL1); + /* ID_AA64DFR0_EL1 bits 48 to 51 is MTPMU support. + * MTPMU = 0xF: Not implement any multithreaded PMU extension. + * MTPMU = 0x1: Implement the ARMv8.6-MTPMU extension. + */ + if ((VAL_EXTRACT_BITS(data, 48, 51) == 0xF) || (VAL_EXTRACT_BITS(data, 48, 51) == 0x1)) + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + + return; +} + +uint32_t pmu003_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu004.c b/test_pool/pmu/operating_system/test_pmu004.c new file mode 100644 index 00000000..43d6e89b --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu004.c @@ -0,0 +1,228 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 4) +#define TEST_RULE "PMU_BM_1, PMU_SYS_1, PMU_SYS_2" +#define TEST_DESC "Check memory bandwidth monitors " + +#define BUFFER_SIZE 4194304 /* 4 Megabytes*/ +#define NUM_PMU_MON 3 /* Minimum required monitors */ + +static PMU_EVENT_TYPE_e config_events[NUM_PMU_MON] = {PMU_EVENT_IB_TOTAL_BW, + PMU_EVENT_IB_READ_BW, + PMU_EVENT_IB_WRITE_BW}; + +/* Generates Inbound read/write traffic at memory interface */ +static uint32_t generate_inbound_traffic(uint32_t node_index, uint64_t base_addr, uint32_t size, + uint64_t *value) +{ + uint32_t i; + void *src_buf = 0; + void *dest_buf = 0; + /* Generate inbound traffic for given size*/ + + /* Allocate memory for 4 Megabytes */ + src_buf = (void *)val_mem_alloc_at_address(base_addr, BUFFER_SIZE); + dest_buf = (void *)val_mem_alloc_at_address(base_addr + BUFFER_SIZE, BUFFER_SIZE); + + if ((src_buf == NULL) || (dest_buf == NULL)) + return 1; + + /* Perform memory copy for given size */ + val_memcpy(src_buf, dest_buf, size); + + /* Read the configured monitors for bandwidth values */ + for (i = 0; i < NUM_PMU_MON ; i++) + value[i] = val_pmu_read_count(node_index, i); + + /*Free the buffers */ + val_mem_free_at_address((uint64_t)src_buf, BUFFER_SIZE); + val_mem_free_at_address((uint64_t)dest_buf, BUFFER_SIZE); + + return 0; +} + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t fail_cnt = 0, test_skip = 1; + uint32_t node_count; + uint32_t node_index; + uint64_t bandwidth1[NUM_PMU_MON]; + uint64_t bandwidth2[NUM_PMU_MON]; + uint32_t status; + uint64_t mem_range_index; + uint64_t num_mem_range; + uint64_t mc_prox_domain; + uint64_t prox_base_addr, addr_len; + uint32_t i; + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + node_count = val_pmu_get_info(PMU_NODE_COUNT, 0); + val_print(AVS_PRINT_DEBUG, "\n PMU NODES = %d", node_count); + + if (node_count == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + val_print(AVS_PRINT_ERR, "\n No PMU nodes found", 0); + return; + } + + /*Get number of memory ranges from SRAT table */ + num_mem_range = val_srat_get_info(SRAT_MEM_NUM_MEM_RANGE, 0); + if (num_mem_range == 0 || num_mem_range == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n No Proximity domains in the system", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Loop through the memory ranges listed on SRAT table */ + for (mem_range_index = 0 ; mem_range_index < num_mem_range ; mem_range_index++) { + + /* Get proximity domain mapped to the memory range */ + mc_prox_domain = val_srat_get_prox_domain(mem_range_index); + if (mc_prox_domain == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n Proximity domain not found", 0); + fail_cnt++; + continue; + } + + /* Get PMU node index corresponding to the proximity domain */ + node_index = val_pmu_get_node_index(mc_prox_domain); + if (node_index == PMU_INVALID_INDEX) { + val_print(AVS_PRINT_ERR, + "\n Proximity domain %d has no PMU associated with it", mc_prox_domain); + fail_cnt++; + continue; + } + + /* Check if the PMU supports atleast 3 counters */ + data = val_pmu_get_monitor_count(node_index); + if (data < 3) { + val_print(AVS_PRINT_ERR, "\n PMU should support atleast 3 counter", 0); + fail_cnt++; + continue; + } + + /* Get base address of the proximity domain */ + prox_base_addr = val_srat_get_info(SRAT_MEM_BASE_ADDR, mc_prox_domain); + addr_len = val_srat_get_info(SRAT_MEM_ADDR_LEN, mc_prox_domain); + if ((prox_base_addr == SRAT_INVALID_INFO) || (addr_len == SRAT_INVALID_INFO) || + (addr_len <= 2 * BUFFER_SIZE)) { + val_print(AVS_PRINT_ERR, + "\n Invalid base address for proximity domain : 0x%lx", + mc_prox_domain); + fail_cnt++; + continue; + } + + /* Configure PMEVTYPER to monitor Bandwidth value */ + for (i = 0; i < NUM_PMU_MON; i++) { + status = val_pmu_configure_monitor(node_index, config_events[i], i); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Required PMU Event 0x%x not supported", config_events[i]); + val_print(AVS_PRINT_ERR, " at node %d", node_index); + fail_cnt++; + break; + } + } + + if (status) + continue; + + /* Enable specific monitors */ + for (i = 0; i < NUM_PMU_MON ; i++) + val_pmu_enable_monitor(node_index, i); + + /* Generate first memory traffic for 2 MB */ + status = generate_inbound_traffic(node_index, prox_base_addr, BUFFER_SIZE / 2, bandwidth1); + + if (status) { + val_print(AVS_PRINT_ERR, "\n Memory allocation failed", node_index); + fail_cnt++; + continue; + } + + /* Reset the monitors */ + for (i = 0; i < NUM_PMU_MON ; i++) { + val_pmu_disable_monitor(node_index, i); + val_pmu_enable_monitor(node_index, i); + } + + /* Generate second memory traffic for 4 MB */ + status = generate_inbound_traffic(node_index, prox_base_addr, BUFFER_SIZE, bandwidth2); + + if (status) { + val_print(AVS_PRINT_ERR, "\n Memory allocation failed", node_index); + fail_cnt++; + continue; + } + + /* Consider delta to check if counter is moving in proportion */ + for (i = 0; i < NUM_PMU_MON ; i++) { + if (bandwidth1[i] > bandwidth2[i]) { + fail_cnt++; + break; + } + } + + /* Disable PMU monitors */ + val_pmu_disable_all_monitors(node_index); + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t pmu004_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on a single PE */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu005.c b/test_pool/pmu/operating_system/test_pmu005.c new file mode 100644 index 00000000..674b0830 --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu005.c @@ -0,0 +1,186 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 5) +#define TEST_RULE "PMU_MEM_1, PMU_SYS_1, PMU_SYS_2" +#define TEST_DESC "Check memory latency monitors " + +#define BUFFER_SIZE 4194304 /* 4 Megabytes*/ + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t fail_cnt = 0, test_skip = 1; + uint32_t node_count; + uint32_t node_index; + uint64_t num_open_txn; + uint64_t num_total_txn; + uint64_t mem_range_index; + uint64_t num_mem_range; + uint64_t mc_prox_domain; + uint64_t prox_base_addr, addr_len; + uint32_t status1, status2; + void *src_buf = 0; + void *dest_buf = 0; + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + node_count = val_pmu_get_info(PMU_NODE_COUNT, 0); + val_print(AVS_PRINT_DEBUG, "\n PMU NODES = %d", node_count); + + if (node_count == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + val_print(AVS_PRINT_ERR, "\n No PMU nodes found", 0); + return; + } + + /*Get number of memory ranges from SRAT table */ + num_mem_range = val_srat_get_info(SRAT_MEM_NUM_MEM_RANGE, 0); + if (num_mem_range == 0 || num_mem_range == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n No Proximity domains in the system", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + + /* Loop through the memory ranges listed on SRAT table */ + for (mem_range_index = 0 ; mem_range_index < num_mem_range ; mem_range_index++) { + + /* Get proximity domain mapped to the memory range */ + mc_prox_domain = val_srat_get_prox_domain(mem_range_index); + if (mc_prox_domain == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n Proximity domain not found", 0); + fail_cnt++; + continue; + } + + /* Get PMU node index corresponding to the proximity domain */ + node_index = val_pmu_get_node_index(mc_prox_domain); + if (node_index == PMU_INVALID_INDEX) { + val_print(AVS_PRINT_ERR, + "\n Proximity domain %d has no PMU associated with it", mc_prox_domain); + fail_cnt++; + continue; + } + + + /* Check if the PMU supports atleast 2 counters */ + data = val_pmu_get_monitor_count(node_index); + if (data < 2) { + val_print(AVS_PRINT_ERR, "\n Number of monitors supported = %d", data); + fail_cnt++; + continue; + } + + /* Configure PMEVTYPER to monitor memory latency */ + status1 = val_pmu_configure_monitor(node_index, PMU_EVENT_IB_OPEN_TXN, 0); + status2 = val_pmu_configure_monitor(node_index, PMU_EVENT_IB_TOTAL_TXN, 1); + if (status1 || status2) { + val_print(AVS_PRINT_ERR, + "\n Required events are not supported at node %d", node_index); + fail_cnt++; + continue; + } + + /* Get base address of the proximity domain */ + prox_base_addr = val_srat_get_info(SRAT_MEM_BASE_ADDR, mc_prox_domain); + addr_len = val_srat_get_info(SRAT_MEM_ADDR_LEN, mc_prox_domain); + if ((prox_base_addr == SRAT_INVALID_INFO) || (addr_len == SRAT_INVALID_INFO) || + (addr_len <= 2 * BUFFER_SIZE)) { + val_print(AVS_PRINT_ERR, + "\n Invalid base address for proximity domain : 0x%lx", + mc_prox_domain); + fail_cnt++; + continue; + } + + //* Allocate memory for 4 Megabytes */ + src_buf = (void *)val_mem_alloc_at_address(prox_base_addr, BUFFER_SIZE); + dest_buf = (void *)val_mem_alloc_at_address(prox_base_addr + BUFFER_SIZE, BUFFER_SIZE); + + if ((src_buf == NULL) || (dest_buf == NULL)) { + val_print(AVS_PRINT_ERR, "\n Memory allocation of buffers failed", 0); + fail_cnt++; + continue; + } + + + /* Enable the required counters to count programmed events */ + val_pmu_enable_monitor(node_index, 0); + val_pmu_enable_monitor(node_index, 1); + + /* Perform read/write and vary scale */ + val_memcpy(src_buf, dest_buf, BUFFER_SIZE); + + /* Read the monitors */ + num_open_txn = val_pmu_read_count(node_index, 0); + num_total_txn = val_pmu_read_count(node_index, 1); + + /*Free the buffers */ + val_mem_free_at_address((uint64_t)src_buf, BUFFER_SIZE); + val_mem_free_at_address((uint64_t)dest_buf, BUFFER_SIZE); + + /* Check if counters are moving */ + if (!num_open_txn || !num_total_txn) { + fail_cnt++; + } + + /* Disable PMU monitors */ + val_pmu_disable_all_monitors(node_index); + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t pmu005_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on a single PE */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu006.c b/test_pool/pmu/operating_system/test_pmu006.c new file mode 100644 index 00000000..6fbe725a --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu006.c @@ -0,0 +1,78 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 6) +#define TEST_RULE "PMU_SPE" +#define TEST_DESC "Check for PMU SPE Requirements " + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* ID_AA64DFR0_EL1.PMSVer bits 32 to 35 indicate the implementation of + Statistical Profiling extension */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64DFR0_EL1), 32, 35); + + if (data > 0) { + /* PMBIDR_EL1.F bit 5 indicates if PE supports Hardware management of + the Access Flag and dirty state for accesses made by the SPE */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(PMBIDR_EL1), 5, 5); + + if (data == 1) { + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + return; + } + else { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + } + /* Implementation of PMU_SPE is optional, skipping the test */ + else + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + + return; +} + +uint32_t pmu006_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu007.c b/test_pool/pmu/operating_system/test_pmu007.c new file mode 100644 index 00000000..037a30ae --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu007.c @@ -0,0 +1,204 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" +#include "val/include/sbsa_avs_pcie.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 7) +#define TEST_RULE "PMU_BM_2, PMU_SYS_1, PMU_SYS_2" +#define TEST_DESC "Check PCIe bandwidth monitors " + +#define NUM_TOTAL_PMU_MON 6 /* Minimum required bandwidth monitors */ + +PMU_EVENT_TYPE_e bandwidth_events[NUM_TOTAL_PMU_MON] = {PMU_EVENT_IB_TOTAL_BW, + PMU_EVENT_IB_READ_BW, + PMU_EVENT_IB_WRITE_BW, + PMU_EVENT_OB_TOTAL_BW, + PMU_EVENT_OB_READ_BW, + PMU_EVENT_OB_WRITE_BW}; + +static void generate_inbound_traffic(uint32_t num_ecam, uint32_t size) +{ + uint32_t ecam_index; + uint32_t start_bus, seg_num; + uint32_t dev_index, func_index; + uint32_t bdf, reg_value; + + for (ecam_index = 0; ecam_index < num_ecam; ecam_index++) + { + /* Derive ecam specific information */ + seg_num = val_pcie_get_info(PCIE_INFO_SEGMENT, ecam_index); + start_bus = val_pcie_get_info(PCIE_INFO_START_BUS, ecam_index); + + /* Iterate over all buses, devices and functions in this ecam */ + for (dev_index = 0; dev_index < size; dev_index++) { + for (func_index = 0; func_index < PCIE_MAX_FUNC; func_index++) { + /* Form bdf using seg, bus, device, function numbers */ + bdf = PCIE_CREATE_BDF(seg_num, start_bus, dev_index, func_index); + val_pcie_read_cfg(bdf, TYPE01_VIDR, ®_value); + val_pcie_write_cfg(bdf, TYPE01_VIDR, 0xFFFFFFFF); + } + } + } +} + +static void generate_traffic(uint32_t node_index, uint32_t num_ecam, uint32_t size, uint64_t *value) +{ + uint32_t i; + + /* Generate inbound/outbound traffic for given size*/ + generate_inbound_traffic(num_ecam, size); + + /* Read the configured monitors for bandwidth values */ + for (i = 0; i < NUM_TOTAL_PMU_MON ; i++) + value[i] = val_pmu_read_count(node_index, i); +} + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t node_count; + uint32_t node_index; + uint64_t bandwidth1[NUM_TOTAL_PMU_MON], bandwidth2[NUM_TOTAL_PMU_MON]; + uint32_t fail_cnt = 0, test_skip = 0; + uint32_t run_flag = 0; + uint32_t status; + uint32_t num_ecam; + uint32_t i; + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + num_ecam = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); + if (num_ecam == 0) + { + val_print(AVS_PRINT_ERR, "\n No ECAMs present ", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + node_count = val_pmu_get_info(PMU_NODE_COUNT, 0); + val_print(AVS_PRINT_DEBUG, "\n PMU NODES = %d", node_count); + + if (node_count == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + val_print(AVS_PRINT_ERR, "\n No PMU nodes found", 0); + return; + } + + /* Loop through all the PMU nodes */ + for (node_index = 0; node_index < node_count; node_index++) { + + /* Check the PMU nodes which are associated with PCIe RC */ + if (val_pmu_get_info(PMU_NODE_TYPE, node_index) == PMU_NODE_PCIE_RC) { + run_flag = 1; + + /* Check if the PMU supports atleast 6 counter */ + data = val_pmu_get_monitor_count(node_index); + if (data < NUM_TOTAL_PMU_MON) { + val_print(AVS_PRINT_ERR, "\n PMU should support atleast 6 counters", 0); + fail_cnt++; + continue; + } + + /* Configure PMEVTYPER to monitor Bandwidth value */ + for (i = 0; i < NUM_TOTAL_PMU_MON; i++) { + status = val_pmu_configure_monitor(node_index, bandwidth_events[i], i); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Required PMU Event 0x%x not supported", bandwidth_events[i]); + val_print(AVS_PRINT_ERR, " at node %d", node_index); + fail_cnt++; + break; + } + } + + if (status) + continue; + + /* Enable specific monitors */ + for (i = 0; i < NUM_TOTAL_PMU_MON ; i++) + val_pmu_enable_monitor(node_index, i); + + /* Generate first pcie traffic */ + generate_traffic(node_index, num_ecam, 10, bandwidth1); + + /* Reset the monitors */ + for (i = 0; i < NUM_TOTAL_PMU_MON ; i++) { + val_pmu_disable_monitor(node_index, i); + val_pmu_enable_monitor(node_index, i); + } + + /* Generate second pcie traffic */ + generate_traffic(node_index, num_ecam, 20, bandwidth2); + + /* Consider delta to check if counter is moving in proportion */ + for (i = 0; i < NUM_TOTAL_PMU_MON ; i++) { + if (bandwidth1[i] > bandwidth2[i]) { + fail_cnt++; + break; + } + } + + /* Disable PMU monitors */ + val_pmu_disable_all_monitors(node_index); + } + } + + if (!run_flag) { + val_print(AVS_PRINT_ERR, "\n No PMU associated with PCIe interface", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + return; + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 05)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 06)); +} + +uint32_t +pmu007_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on a single PE */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu008.c b/test_pool/pmu/operating_system/test_pmu008.c new file mode 100644 index 00000000..f657a99b --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu008.c @@ -0,0 +1,253 @@ +/** @file + * Copyright (c) 2022-2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 8) +#define TEST_RULE "PMU_SYS_5" +#define TEST_DESC "Check System PMU for NUMA systems " + +#define BUFFER_SIZE 4194304 /* 4 Megabytes*/ + +#define NUM_PMU_MON 3 /* Minimum required monitors */ + +static PMU_EVENT_TYPE_e config_events[NUM_PMU_MON] = {PMU_EVENT_LOCAL_BW, + PMU_EVENT_REMOTE_BW, + PMU_EVENT_ALL_BW}; + +static uint32_t remote_pe_index; +static void *src_buf; +static void *dest_buf; + +/* This payload generates remote PE traffic for 2 MB*/ +static void payload1(void) +{ + val_memcpy(src_buf, dest_buf, BUFFER_SIZE / 2); + + val_set_status(remote_pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +/* This payload generates remote PE traffic for 4 MB*/ +static void payload2(void) +{ + val_memcpy(src_buf, dest_buf, BUFFER_SIZE); + + val_set_status(remote_pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 02)); +} + +static uint32_t generate_traffic(uint64_t prox_domain, uint32_t size, void (*remote_traffic)(void)) +{ + uint64_t prox_base_addr, addr_len; + uint32_t timeout = TIMEOUT_LARGE; + + prox_base_addr = val_srat_get_info(SRAT_MEM_BASE_ADDR, prox_domain); + addr_len = val_srat_get_info(SRAT_MEM_ADDR_LEN, prox_domain); + if ((prox_base_addr == SRAT_INVALID_INFO) || (addr_len == SRAT_INVALID_INFO) || + (addr_len <= 2 * BUFFER_SIZE)) { + val_print(AVS_PRINT_ERR, + "\n Invalid base address for proximity domain : 0x%lx", + prox_domain); + return 1; + } + + /* Allocate memory for 4 Megabytes */ + src_buf = (void *)val_mem_alloc_at_address(prox_base_addr, BUFFER_SIZE); + dest_buf = (void *)val_mem_alloc_at_address(prox_base_addr + BUFFER_SIZE, BUFFER_SIZE); + + if ((src_buf == NULL) || (dest_buf == NULL)) + return 1; + + /* Perform memory copy for given size */ + val_memcpy(src_buf, dest_buf, size); + + /* Perform memory copy from remote PE*/ + val_execute_on_pe(remote_pe_index, remote_traffic, 0); + + /* Wait for execution to complete*/ + while (--timeout) + { + if (!(IS_RESULT_PENDING(val_get_status(remote_pe_index)))) { + break; + } + } + + /*Free the buffers */ + val_mem_free_at_address((uint64_t)src_buf, BUFFER_SIZE); + val_mem_free_at_address((uint64_t)dest_buf, BUFFER_SIZE); + + return 0; +} + +static void payload(void) +{ + uint64_t data = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t node_count; + uint32_t mc_node_index; + uint32_t status; + uint32_t i; + uint64_t num_mem_range; + uint32_t pe_uid, pe_prox_domain; + uint32_t remote_pe_uid, remote_pe_prox_domain; + uint64_t value1[NUM_PMU_MON]; + uint64_t value2[NUM_PMU_MON]; + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + node_count = val_pmu_get_info(PMU_NODE_COUNT, 0); + val_print(AVS_PRINT_DEBUG, "\n PMU NODES = %d", node_count); + + if (node_count == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 1)); + val_print(AVS_PRINT_ERR, "\n No PMU nodes found", 0); + return; + } + + /*Get number of memory ranges from SRAT table */ + num_mem_range = val_srat_get_info(SRAT_MEM_NUM_MEM_RANGE, 0); + if (num_mem_range == 0 || num_mem_range == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n No Proximity domains in the system", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 2)); + return; + } + + /*Get local PE details */ + pe_uid = val_pe_get_uid(index); + pe_prox_domain = val_srat_get_info(SRAT_GICC_PROX_DOMAIN, pe_uid); + if (pe_prox_domain == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n Could not get proximity domain info for given PE", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 3)); + return; + } + /* Get memory controller local to the primary PE */ + mc_node_index = val_pmu_get_node_index(pe_prox_domain); + if (mc_node_index == PMU_INVALID_INDEX) { + val_print(AVS_PRINT_ERR, "\n PMU node not found", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 4)); + return; + } + + /* Check if the PMU supports atleast 3 counters */ + data = val_pmu_get_monitor_count(mc_node_index); + if (data < 3) { + val_print(AVS_PRINT_ERR, "\n PMU should support atleast 3 counter", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 5)); + return; + } + + /* Configure PMEVTYPER to monitor Bandwidth value */ + for (i = 0; i < NUM_PMU_MON; i++) { + status = val_pmu_configure_monitor(mc_node_index, config_events[i], i); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Required PMU Event 0x%x not supported", config_events[i]); + val_print(AVS_PRINT_ERR, " at node %d", mc_node_index); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 6)); + return; + } + } + + /* Enable specific monitors */ + for (i = 0; i < NUM_PMU_MON ; i++) + val_pmu_enable_monitor(mc_node_index, i); + + /* Get remote PE details */ + remote_pe_prox_domain = val_srat_get_info(SRAT_GICC_REMOTE_PROX_DOMAIN, pe_prox_domain); + if (remote_pe_prox_domain == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n Could not get remote PE proximity domain", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 7)); + return; + } + remote_pe_uid = val_srat_get_info(SRAT_GICC_PROC_UID, remote_pe_prox_domain); + remote_pe_index = val_pe_get_index_uid(remote_pe_uid); + + /* Generate traffic to the memory controller with varied scale. First with + size 2 MB and second with 4 MB. Consider delta for results */ + + /* Generate remote and local traffic for 2 MB */ + status = generate_traffic(pe_prox_domain, BUFFER_SIZE / 2, payload1); + if (status) { + val_print(AVS_PRINT_ERR, "\n Memory allocation failed", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 8)); + return; + } + + /* Read the configured monitors for bandwidth values */ + for (i = 0; i < NUM_PMU_MON ; i++) + value1[i] = val_pmu_read_count(mc_node_index, i); + + /* Reset the monitors */ + for (i = 0; i < NUM_PMU_MON ; i++) { + val_pmu_disable_monitor(mc_node_index, i); + val_pmu_enable_monitor(mc_node_index, i); + } + + /* Generate remote and local traffic for 4 MB */ + status = generate_traffic(pe_prox_domain, BUFFER_SIZE, payload2); + + if (status) { + val_print(AVS_PRINT_ERR, "\n Memory allocation failed", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 9)); + return; + } + + /* Read the configured monitors for bandwidth values */ + for (i = 0; i < NUM_PMU_MON ; i++) + value2[i] = val_pmu_read_count(mc_node_index, i); + + /*Consider delta for results*/ + for (i = 0 ; i < NUM_PMU_MON ; i++) { + if (value2[i] <= value1[i]) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 10)); + return; + } + } + + /* Disable PMU monitors */ + val_pmu_disable_all_monitors(mc_node_index); + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 03)); +} + +uint32_t +pmu008_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on a single PE */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/pmu/operating_system/test_pmu009.c b/test_pool/pmu/operating_system/test_pmu009.c new file mode 100644 index 00000000..cc694684 --- /dev/null +++ b/test_pool/pmu/operating_system/test_pmu009.c @@ -0,0 +1,146 @@ +/** @file + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/sbsa_avs_common.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_pmu.h" +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_mpam.h" + + +#define TEST_NUM (AVS_PMU_TEST_NUM_BASE + 9) +#define TEST_RULE "PMU_SYS_6" +#define TEST_DESC "Check multiple types of traffic measurement" + +#define NUM_TRAFFIC_TYPE 2 /* To atleast check 2 different types of traffic */ + +static PMU_EVENT_TYPE_e config_events[NUM_TRAFFIC_TYPE] = {PMU_EVENT_TRAFFIC_1, + PMU_EVENT_TRAFFIC_2}; + +static void payload(void) +{ + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t pmu_node_count, num_mon, i; + uint32_t mon_index, pmu_node_index; + uint32_t mon_count_value; + uint32_t ret_status, status; + uint64_t interface_acpiid; + uint32_t num_traffic_support; + + if (g_sbsa_level < 7) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 1)); + return; + } + + pmu_node_count = val_pmu_get_info(PMU_NODE_COUNT, 0); + val_print(AVS_PRINT_DEBUG, "\n PMU NODES = %d", pmu_node_count); + + if (pmu_node_count == 0) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 2)); + val_print(AVS_PRINT_ERR, "\n No PMU nodes found", 0); + return; + } + + /* PAL API to know the interface id which supports multiple types of traffic + and all the types of traffic supported */ + ret_status = val_pmu_get_multi_traffic_support_interface(&interface_acpiid, + &num_traffic_support); + if (ret_status == NOT_IMPLEMENTED) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 3)); + return; + } + + /* PMU info table index for the interface */ + pmu_node_index = val_pmu_get_index_acpiid(interface_acpiid); + if (pmu_node_index == PMU_INVALID_INDEX) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 4)); + return; + } + + /* Get number of monitor to the interface pmu node */ + num_mon = val_pmu_get_monitor_count(pmu_node_index); + if (num_mon == 0) { + val_print(AVS_PRINT_ERR, "\n PMU should support atleast 1 counter", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 5)); + return; + } + + /* Each monitor must be able to measure each supported traffic type */ + for (mon_index = 0; mon_index < num_mon; mon_index++) + { + /* Configure PMEVTYPER with required event type */ + for (i = 0; i < NUM_TRAFFIC_TYPE; i++) { + + status = val_pmu_configure_monitor(pmu_node_index, config_events[i], mon_index); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Required PMU Event 0x%x not supported", config_events[i]); + val_print(AVS_PRINT_ERR, " at node %d", pmu_node_index); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 6)); + return; + } + val_pmu_enable_monitor(pmu_node_index, mon_index); + + /* generate workload */ + ret_status = val_generate_traffic(interface_acpiid, pmu_node_index, mon_index, + config_events[i]); + if (ret_status) { + val_print(AVS_PRINT_ERR, "\n workload generate function failed", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 7)); + return; + } + mon_count_value = val_pmu_read_count(pmu_node_index, mon_index); + + /* check if the monitor count value is as expected */ + ret_status = val_pmu_check_monitor_count_value(interface_acpiid, mon_count_value, + config_events[i]); + if (ret_status) { + val_print(AVS_PRINT_ERR, "\n count value not as expected", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 8)); + return; + } + + val_pmu_disable_monitor(pmu_node_index, mon_index); + } + } + + /* Disable PMU monitors */ + val_pmu_disable_all_monitors(pmu_node_index); + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 9)); +} + +uint32_t +pmu009_entry(uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on a single PE */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, + TEST_RULE); + /* This check is when user is forcing us to skip this test */ + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras001.c b/test_pool/ras/operating_system/test_ras001.c new file mode 100644 index 00000000..4a08197c --- /dev/null +++ b/test_pool/ras/operating_system/test_ras001.c @@ -0,0 +1,120 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 1) +#define TEST_RULE "RAS_01" +#define TEST_DESC "Check Error Counter " + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0; + uint64_t num_node; + uint64_t value; + uint32_t node_index; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes not found. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < num_node; node_index++) { + + /* Get Current Node Type */ + status = val_ras_get_info(RAS_INFO_NODE_TYPE, node_index, &value); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Node Type not found index %d", node_index); + fail_cnt++; + break; + } + + /* Check if Node is Memory Controller/PE (Cache Resource) */ + if (!((value == NODE_TYPE_MC) || (value == NODE_TYPE_PE))) + continue; + + /* Check for Cache Resource Type in case of Processor Node */ + if (value == NODE_TYPE_PE) { + status = val_ras_get_info(RAS_INFO_PE_RES_TYPE, node_index, &value); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n PE Resource type not found index %d", node_index); + fail_cnt++; + break; + } + + if (value != 0) + continue; + } + + /* Read FR register of the first error record */ + value = val_ras_reg_read(node_index, RAS_ERR_FR, 0); + if (value == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<0>FR register for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + + /* Check ERR_FR.CEC[14:12] != 0 for CEC to be implemented */ + if (!(value & ERR_FR_CEC_MASK)) { + val_print(AVS_PRINT_ERR, "\n CEC not implemented for node_index %d", node_index); + fail_cnt++; + continue; + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras001_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras002.c b/test_pool/ras/operating_system/test_ras002.c new file mode 100644 index 00000000..2d4da0f9 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras002.c @@ -0,0 +1,134 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 2) +#define TEST_RULE "RAS_02" +#define TEST_DESC "Check CFI, DUI, UI Controls " + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0; + uint64_t num_node; + uint64_t value; + uint32_t node_index; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes not found. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < num_node; node_index++) { + + /* Get Current Node Type */ + status = val_ras_get_info(RAS_INFO_NODE_TYPE, node_index, &value); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Node Type not found index %d", node_index); + fail_cnt++; + break; + } + + /* Check if Node is Memory Controller/PE (Cache Resource) */ + if (!((value == NODE_TYPE_MC) || (value == NODE_TYPE_PE))) + continue; + + /* Check for Cache Resource Type in case of Processor Node */ + if (value == NODE_TYPE_PE) { + status = val_ras_get_info(RAS_INFO_PE_RES_TYPE, node_index, &value); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n PE Resource type not found index %d", node_index); + fail_cnt++; + break; + } + + if (value != 0) + continue; + } + + /* Read FR register of the first error record */ + value = val_ras_reg_read(node_index, RAS_ERR_FR, 0); + if (value == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<0>FR register for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + + /* Check DUI[17:16] != 0 of FR Register For DUI Control */ + if (!(value & ERR_FR_DUI_MASK)) { + val_print(AVS_PRINT_ERR, "\n DUI not implemented for node_index %d", node_index); + fail_cnt++; + continue; + } + + /* Check CFI[11:10] != 0 of FR Register For CFI Control */ + if (!(value & ERR_FR_CFI_MASK)) { + val_print(AVS_PRINT_ERR, "\n CFI not implemented for node_index %d", node_index); + fail_cnt++; + continue; + } + + /* Check UI[5:4] != 0 of FR Register For UI Control */ + if (!(value & ERR_FR_UI_MASK)) { + val_print(AVS_PRINT_ERR, "\n UI not implemented for node_index %d", node_index); + fail_cnt++; + continue; + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras002_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras003.c b/test_pool/ras/operating_system/test_ras003.c new file mode 100644 index 00000000..1b3350f1 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras003.c @@ -0,0 +1,130 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 3) +#define TEST_RULE "RAS_03" +#define TEST_DESC "Check FHI in Error Record Group " + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 1; + uint64_t num_node; + uint32_t node_index, sec_node; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t base_addr, base_addr_sec; + uint64_t fhi_id, fhi_id_sec; + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node < 2)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes should be more than 1. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < (num_node - 1); node_index++) { + + /* Get Current Node Base Address */ + status = val_ras_get_info(RAS_INFO_BASE_ADDR, node_index, &base_addr); + if (status) { + /* Interface is System Register based, Skipping this node */ + val_print(AVS_PRINT_DEBUG, "\n Interface is SR, Skipping node %d", node_index); + continue; + } + + /* Get FHI number for this Node, If Not Skip the Node */ + status = val_ras_get_info(RAS_INFO_FHI_ID, node_index, &fhi_id); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n FHI not supported for index %d", node_index); + continue; + } + + test_skip = 0; + + /* Compare with Rest of the node having same Base Address */ + for (sec_node = node_index + 1; sec_node < num_node; sec_node++) { + + /* Get Second Node Base Address */ + status = val_ras_get_info(RAS_INFO_BASE_ADDR, sec_node, &base_addr_sec); + if (status) { + /* Interface is System Register based, Skipping this node */ + val_print(AVS_PRINT_DEBUG, "\n Interface is SR, Skipping sec_node %d", node_index); + continue; + } + + /* If not same base address then skip this node */ + if (base_addr != base_addr_sec) + continue; + + /* Get FHI number for this Node */ + status = val_ras_get_info(RAS_INFO_FHI_ID, sec_node, &fhi_id_sec); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n FHI not supported for index %d", sec_node); + continue; + } + + /* Check if FHI is same otherwise fail the test */ + if (fhi_id != fhi_id_sec) { + val_print(AVS_PRINT_ERR, "\n FHI different for Same Group index %d", node_index); + val_print(AVS_PRINT_ERR, " : %d", sec_node); + fail_cnt++; + continue; + } + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras003_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras004.c b/test_pool/ras/operating_system/test_ras004.c new file mode 100644 index 00000000..60e54047 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras004.c @@ -0,0 +1,130 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 4) +#define TEST_RULE "RAS_04" +#define TEST_DESC "Check ERI in Error Record Group " + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 1; + uint64_t num_node; + uint32_t node_index, sec_node; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t base_addr, base_addr_sec; + uint64_t eri_id, eri_id_sec; + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node < 2)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes should be more than 1. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < (num_node - 1); node_index++) { + + /* Get Current Node Base Address */ + status = val_ras_get_info(RAS_INFO_BASE_ADDR, node_index, &base_addr); + if (status) { + /* Interface is System Register based, Skipping this node */ + val_print(AVS_PRINT_DEBUG, "\n Interface is SR, Skipping node %d", node_index); + continue; + } + + /* Get ERI number for Node, If Not Skip the Node */ + status = val_ras_get_info(RAS_INFO_ERI_ID, node_index, &eri_id); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n ERI Not supported for index %d", node_index); + continue; + } + + test_skip = 0; + + /* Compare with Rest of the node having same Base Address */ + for (sec_node = node_index + 1; sec_node < num_node; sec_node++) { + + /* Get Second Node Base Address */ + status = val_ras_get_info(RAS_INFO_BASE_ADDR, sec_node, &base_addr_sec); + if (status) { + /* Interface is System Register based, Skipping this node */ + val_print(AVS_PRINT_DEBUG, "\n Interface is SR, Skipping sec_node %d", node_index); + continue; + } + + /* If not same base address then skip this node */ + if (base_addr != base_addr_sec) + continue; + + /* Get ERI number for this Node */ + status = val_ras_get_info(RAS_INFO_ERI_ID, sec_node, &eri_id_sec); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n ERI Not supported for index %d", sec_node); + continue; + } + + /* Check if ERI is same otherwise fail the test */ + if (eri_id != eri_id_sec) { + val_print(AVS_PRINT_ERR, "\n ERI Diff for Same Group Nodes. Index %d", node_index); + val_print(AVS_PRINT_ERR, " : %d", sec_node); + fail_cnt++; + continue; + } + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras004_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras005.c b/test_pool/ras/operating_system/test_ras005.c new file mode 100644 index 00000000..7eac4508 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras005.c @@ -0,0 +1,185 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 5) +#define TEST_RULE "RAS_06" +#define TEST_DESC "Check ERI/FHI Connected to GIC " + +#define IS_NOT_SPI_PPI(int_id) ((int_id < 16) || (int_id > 1019)) + +static uint64_t int_id; +static uint32_t intr_pending = 1; + +static +void +intr_handler(void) +{ + intr_pending = 0; + + /* Clear the interrupt pending state */ + + val_print(AVS_PRINT_INFO, "\n Received interrupt %x ", 0); + val_gic_end_of_interrupt(int_id); + return; +} + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 1; + uint64_t num_node; + uint32_t node_index; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t eri_id = 0, fhi_id = 0; + uint64_t rec_index; + RAS_ERR_IN_t err_in_params; + RAS_ERR_OUT_t err_out_params; + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status) { + val_print(AVS_PRINT_ERR, "\n RAS Nodes not present", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < num_node; node_index++) { + + /* Get ERI number for Node, If Not Skip the Node */ + status = val_ras_get_info(RAS_INFO_ERI_ID, node_index, &eri_id); + if (status) { + /* No ERI Support for this node */ + val_print(AVS_PRINT_DEBUG, "\n ERI Not supported for node %d", node_index); + } else { + test_skip = 0; + /* ERI Support, Check for SPI/PPI */ + if (IS_NOT_SPI_PPI(eri_id)) { + val_print(AVS_PRINT_ERR, "\n ERI Not SPI/PPI for node %d", node_index); + fail_cnt++; + continue; + } + } + + /* Get FHI number for Node, If Not Skip the Node */ + status = val_ras_get_info(RAS_INFO_FHI_ID, node_index, &fhi_id); + if (status) { + /* No FHI Support for this node */ + val_print(AVS_PRINT_DEBUG, "\n FHI Not supported for node %d", node_index); + } else { + test_skip = 0; + /* FHI Support, Check for SPI/PPI */ + if (IS_NOT_SPI_PPI(fhi_id)) { + val_print(AVS_PRINT_ERR, "\n FHI Not SPI/PPI for node %d", node_index); + fail_cnt++; + continue; + } + } + + /* Check with Interrupt Generation if platform supports */ + if (test_skip == 0) { + + int_id = (fhi_id) ? fhi_id : eri_id; + + /* Get Error Record number for this Node */ + status = val_ras_get_info(RAS_INFO_START_INDEX, node_index, &rec_index); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Could not get Start Index for index %d", node_index); + fail_cnt++; + continue; + } + + err_in_params.rec_index = rec_index; + err_in_params.node_index = node_index; + err_in_params.ras_error_type = ERR_CE; + err_in_params.is_pfg_check = 0; + + /* Install handler for interrupt */ + val_gic_install_isr(int_id, intr_handler); + + /* Setup an error in an implementation defined way */ + status = val_ras_setup_error(err_in_params, &err_out_params); + if (status == NOT_IMPLEMENTED) { + val_print(AVS_PRINT_DEBUG, "\n Skipping Functional Check, node %d", node_index); + continue; + } else if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_setup_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* Inject error in an implementation defined way */ + status = val_ras_inject_error(err_in_params, &err_out_params); + if (status == NOT_IMPLEMENTED) { + val_print(AVS_PRINT_DEBUG, "\n Skipping Functional Check, node %d", node_index); + continue; + } else if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_inject_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* Wait loop */ + val_ras_wait_timeout(1); + + if (intr_pending) { + val_print(AVS_PRINT_ERR, "\n Not Connected to GIC for node %d", node_index); + fail_cnt++; + continue; + } + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras005_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras006.c b/test_pool/ras/operating_system/test_ras006.c new file mode 100644 index 00000000..6d368814 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras006.c @@ -0,0 +1,310 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_mpam.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 6) +#define TEST_RULE "RAS_07" +#define TEST_DESC "RAS ERRADDR.AI bit status check" + +#define ONE_BYTE_BUFFER 0x1 + +static +void +payload() +{ + uint64_t num_node; + uint64_t num_mc_node; + uint64_t node_type; + uint64_t err_inj_addr; + uint64_t prox_base_addr; + uint64_t num_err_recs; + uint64_t err_rec_impl_bitmap; + uint64_t err_rec_addrmode_bitmap; + uint64_t data; + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 0; + uint32_t node_index; + uint64_t mc_prox_domain; + uint32_t err_rec_addrmode; + uint32_t err_rec_addr_ai; + uint32_t err_rec_index; + uint32_t err_inj_addr_data; + uint32_t err_recorded = 0; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + RAS_ERR_IN_t err_in_params; + RAS_ERR_OUT_t err_out_params; + +/* get number of nodes with RAS functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_ERR, "\n RAS nodes not found. Skipping...", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* get number of MC nodes with RAS functionality */ + status = val_ras_get_info(RAS_INFO_NUM_MC, 0, &num_mc_node); + if (status || (num_mc_node == 0)) { + val_print(AVS_PRINT_ERR, "\n RAS MC nodes not found. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + for (node_index = 0; node_index < num_node; node_index++) { + /* check whether current node is memory controller node */ + status = val_ras_get_info(RAS_INFO_NODE_TYPE, node_index, &node_type); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Couldn't get node type for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + + if (node_type == NODE_TYPE_MC) { + /* get number of error records for the current RAS node + (both implemented and unimplemented) */ + status = val_ras_get_info(RAS_INFO_NUM_ERR_REC, node_index, &num_err_recs); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Couldn't get number of error records for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + /* skip if num of error records in zero */ + if (num_err_recs == 0) { + val_print(AVS_PRINT_DEBUG, + "\n Number of error records for RAS node index: 0x%lx is zero", + node_index); + test_skip++; + continue; + } + + /* get proximity domain of RAS memory controller node */ + status = val_ras_get_info(RAS_INFO_MC_RES_PROX_DOMAIN, node_index, &mc_prox_domain); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Couldn't get MC proximity domain for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + + /* fetch base addr of the proximity domain to inject an error in platform + defined method */ + prox_base_addr = val_srat_get_info(SRAT_MEM_BASE_ADDR, mc_prox_domain); + if (prox_base_addr == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, + "\n Invalid base address for proximity domain : 0x%lx", + mc_prox_domain); + fail_cnt++; + continue; + } + + /* check if the address accessible to PE by trying to allocate the address */ + err_inj_addr = (uint64_t)val_mem_alloc_at_address(prox_base_addr, ONE_BYTE_BUFFER); + + if (err_inj_addr == 0) { + val_print(AVS_PRINT_ERR, + "\n Unable to allocate address in proximity domain : 0x%lx failed.", + mc_prox_domain); + /* test not applicable if memory isn't accessible by PE */ + test_skip++; + continue; + } + + /* inject error with following parameters */ + err_in_params.rec_index = 0; /* not applicable for scenario*/ + err_in_params.node_index = node_index; + err_in_params.ras_error_type = ERR_CE; /* correctable error */ + err_in_params.error_pa = err_inj_addr; /* address of the location where error + needs to be injected */ + err_in_params.is_pfg_check = 0; /* not a pseudo fault check */ + + /* Setup error in an implementation defined way */ + status = val_ras_setup_error(err_in_params, &err_out_params); + if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_setup_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* Inject error in an implementation defined way */ + status = val_ras_inject_error(err_in_params, &err_out_params); + if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_inject_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* wait loop to allow system to inject the error */ + val_ras_wait_timeout(1); + + if (status) { + val_print(AVS_PRINT_ERR, + "\n Memory error injection for RAS node index: 0x%lx failed.", + node_index); + fail_cnt++; + continue; + } + + /* perform a read to error-injected address, which will cause system to record the error + with address syndrome in one of the error records present for the current RAS node */ + err_inj_addr_data = val_mmio_read(err_inj_addr); + val_print(AVS_PRINT_DEBUG, "\n Error injected address: 0x%llx", err_inj_addr); + val_print(AVS_PRINT_DEBUG, " Data read: 0x%lx", err_inj_addr_data); + + /* wait loop to allow system to update RAS error records */ + val_ras_wait_timeout(1); + + /* get error record implemented bitmap from RAS info table */ + status = val_ras_get_info(RAS_INFO_ERR_REC_IMP, node_index, &err_rec_impl_bitmap); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Couldn't get implemented rec bitmap for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + + /* get addressing mode bitmap by which current RAS node populates + ERRADDR field of error records */ + status = val_ras_get_info(RAS_INFO_ADDR_MODE, node_index, &err_rec_addrmode_bitmap); + if (status) { + val_print(AVS_PRINT_ERR, + "\n Couldn't get implemented addr mode bitmap for RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + + /* Iterate through each error record implemented and check if ERRADDR.AI bit is 0b0 + if the address is the same as System Physical Address for the location, + and 0b1 otherwise.*/ + for (err_rec_index = 0; err_rec_index < num_err_recs; err_rec_index++) { + /* check if error record is implemented for current node + Bit[n] = 0b: Error record at index n is implemented. + Bit[n] = 1b: Error record at index n is not implemented. + If not implemented skip the error record */ + if ((err_rec_impl_bitmap >> err_rec_index) & 0x1) + continue; + /* since we have injected error in a memory location in current MC proximity domain + space, one of the error record should have recorded address syndrome and + ERRSTATUS AV, bit [31] & V, bit [30] should be valid for that error record */ + + /* if ERRSTATUS AV, bit [31] & V, bit [30] is invalid, continue with next + error record */ + data = val_ras_reg_read(node_index, RAS_ERR_STATUS, err_rec_index); + if (data == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<%d>STATUS register for ", + err_rec_index); + val_print(AVS_PRINT_ERR, + "RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + if (!((data & ERR_STATUS_V_MASK) && (data & ERR_STATUS_AV_MASK))) + continue; + + /* valid error record with address syndrome found */ + err_recorded = 1; + + /* get addressing mode for ERRADDR field in current error record + Bit[n] = 0b: Error record at index n reports System Physical + Addresses (SPA) in the ERR_ADDR register. + Bit[n] = 1b: otherwise */ + err_rec_addrmode = (err_rec_addrmode_bitmap >> err_rec_index) & 0x1; + + /* read ERRADDR.AI bit */ + data = val_ras_reg_read(node_index, RAS_ERR_ADDR, err_rec_index); + if (data == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<%d>STATUS register for ", + err_rec_index); + val_print(AVS_PRINT_ERR, + "RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + err_rec_addr_ai = (data >> ERR_ADDR_AI_SHIFT) & 0x1; + + if (err_rec_addrmode == 0 && err_rec_addr_ai == 0) { + val_print(AVS_PRINT_DEBUG, + "\n RAS node index: 0x%lx PASSED", + node_index); + /* error record comply with RAS_07 requirements */ + break; + } else { + fail_cnt++; + break; + } + } + + /* check if system RAS recorded the error in memory with address syndrome + if no, rule is not applicable for the node */ + if (!err_recorded) { + val_print(AVS_PRINT_ERR, + "\n Memory error not recorded for RAS node index: 0x%lx", + node_index); + test_skip++; + } + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 03)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras006_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on single processor */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras007.c b/test_pool/ras/operating_system/test_ras007.c new file mode 100644 index 00000000..bf635a17 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras007.c @@ -0,0 +1,128 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 7) +#define TEST_RULE "RAS_08" +#define TEST_DESC "Check Error Group Status " + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 1; + uint64_t num_node; + uint64_t value; + uint32_t node_index; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t start_index; + uint64_t err_rec_implement, err_status, record_imp_bits; + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes not found. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < num_node; node_index++) { + + /* Get Current Node Interface Type */ + status = val_ras_get_info(RAS_INFO_BASE_ADDR, node_index, &value); + if (status) { + /* Interface is System Register based, Skipping this node */ + val_print(AVS_PRINT_DEBUG, "\n Interface is SR, Skipping node %d", node_index); + continue; + } + + test_skip = 0; + + /* Get Start error index number for this Node */ + status = val_ras_get_info(RAS_INFO_START_INDEX, node_index, &start_index); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Could not get Start Index for index %d", node_index); + fail_cnt++; + continue; + } + + /* Check which error records are implemented in this node */ + status = val_ras_get_info(RAS_INFO_ERR_REC_IMP, node_index, &err_rec_implement); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Could not get err rec info for index %d", node_index); + fail_cnt++; + continue; + } + + /* Get error status reporting value for this node */ + status = val_ras_get_info(RAS_INFO_STATUS_REPORT, node_index, &err_status); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Could not get status for index %d", node_index); + fail_cnt++; + continue; + } + + /* This will have bit value 1 for all the implemented error records */ + record_imp_bits = (err_rec_implement ^ AVS_ALL_1_64BIT); + + if (err_status & record_imp_bits) { + /* Fail the test as one of the implemented ER has error reporting not supported */ + val_print(AVS_PRINT_ERR, "\n ERRGSR not supported for index %d", node_index); + fail_cnt++; + continue; + } + + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras007_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras008.c b/test_pool/ras/operating_system/test_ras008.c new file mode 100644 index 00000000..8e388f3b --- /dev/null +++ b/test_pool/ras/operating_system/test_ras008.c @@ -0,0 +1,116 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" +#include "val/include/sbsa_avs_peripherals.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 8) +#define TEST_RULE "RAS_11, RAS_12" +#define TEST_DESC "Software Fault Error Check " + +/* The generic peripherals which ACS can rely on like PCIe spec it ruled out as the + rule mentions to follow PCIe specification mentioned behaviour for handling those + errors. + The most generic address access which can be used will be UART space, In the PL011 + there are some unused address space and the UART specification is mandating the + response for access to those space. + + As part of this rule we can make sure data abort if not generated as part of access + to the unused address space. +*/ + +static uint64_t branch_to_test; +static uint64_t l_uart_base; + +static +void +esr(uint64_t interrupt_type, void *context) +{ + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + /* Update the ELR to point to next instrcution */ + val_pe_update_elr(context, branch_to_test); + + val_print(AVS_PRINT_ERR, "\n Error : Received Sync Exception type %d", interrupt_type); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); +} + +static +void +payload(void) +{ + + uint32_t count = val_peripheral_get_info(NUM_UART, 0); + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t value; + + val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); + val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); + + branch_to_test = (uint64_t)&&exception_taken; + + if (count == 0) { + val_print(AVS_PRINT_WARN, "\n No UART defined by Platform ", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + while (count != 0) { + l_uart_base = val_peripheral_get_info(UART_BASE0, count - 1); + if (l_uart_base == 0) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /*Make sure access to Reserved doesn't cause any exceptions*/ + value = *((volatile uint32_t *)(l_uart_base + SBSA_UART_RES)); + val_print(AVS_PRINT_DEBUG, "\n Value from UART Reserved Space 0x%llx", value); + + *((volatile uint32_t *)(l_uart_base + SBSA_UART_RES)) = (uint32_t)(0xDEAD); + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + + count--; + } +exception_taken: + return; +} + +uint32_t +ras008_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras009.c b/test_pool/ras/operating_system/test_ras009.c new file mode 100644 index 00000000..6ef435fd --- /dev/null +++ b/test_pool/ras/operating_system/test_ras009.c @@ -0,0 +1,208 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_mpam.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 9) +#define TEST_RULE "S_L7RAS_1" +#define TEST_DESC "Data abort on Containable err " + +#define ONE_BYTE_BUFFER 0x1 + +static uint32_t esr_pending = 1; +static void *branch_to_test; + +static +void +esr(uint64_t interrupt_type, void *context) +{ + esr_pending = 0; + + /* Update the ELR to return to test specified address */ + val_pe_update_elr(context, (uint64_t)branch_to_test); + + val_print(AVS_PRINT_ERR, "\n Received exception of type: %d", interrupt_type); +} + +static +void +payload() +{ + uint64_t num_node; + uint64_t num_mc_node; + uint64_t node_type; + uint64_t err_inj_addr; + uint64_t prox_base_addr; + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 0; + uint32_t node_index; + uint64_t mc_prox_domain; + uint32_t err_inj_addr_data; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + RAS_ERR_IN_t err_in_params; + RAS_ERR_OUT_t err_out_params; + + /* get number of nodes with RAS functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_ERR, "\n RAS nodes not found. Skipping...", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* get number of MC nodes with RAS functionality */ + status = val_ras_get_info(RAS_INFO_NUM_MC, 0, &num_mc_node); + if (status || (num_mc_node == 0)) { + val_print(AVS_PRINT_ERR, "\n RAS MC nodes not found. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (node_index = 0; node_index < num_node; node_index++) { + + /* check whether current node is memory controller node */ + status = val_ras_get_info(RAS_INFO_NODE_TYPE, node_index, &node_type); + if (status) { + val_print(AVS_PRINT_ERR, "\n Couldn't get node type for node : 0x%lx", node_index); + fail_cnt++; + continue; + } + + if (node_type != NODE_TYPE_MC) + continue; + + /* Get proximity domain of RAS memory controller node */ + status = val_ras_get_info(RAS_INFO_MC_RES_PROX_DOMAIN, node_index, &mc_prox_domain); + if (status) { + val_print(AVS_PRINT_ERR, "\n Couldn't get MC prox domain for node : 0x%lx", node_index); + fail_cnt++; + continue; + } + + /* Get base addr for proximity domain to inject error in platform defined method */ + prox_base_addr = val_srat_get_info(SRAT_MEM_BASE_ADDR, mc_prox_domain); + if (prox_base_addr == SRAT_INVALID_INFO) { + val_print(AVS_PRINT_ERR, "\n Invalid base for prox domain : 0x%lx", mc_prox_domain); + fail_cnt++; + continue; + } + + /* check if the address accessible to PE by trying to allocate the address */ + err_inj_addr = (uint64_t)val_mem_alloc_at_address(prox_base_addr, ONE_BYTE_BUFFER); + + if (err_inj_addr == 0) { + val_print(AVS_PRINT_ERR, "\n Unable to allocate address in prox domain : 0x%lx", + mc_prox_domain); + /* test not applicable if memory isn't accessible by PE */ + test_skip++; + continue; + } + + /* Install sync and async handlers to handle exceptions.*/ + status = val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); + status |= val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); + if (status) + { + val_print(AVS_PRINT_ERR, "\n Failed in installing the exception handler", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + branch_to_test = &&exception_return; + + /* Inject error with following parameters */ + err_in_params.rec_index = 0; /* not applicable for scenario*/ + err_in_params.node_index = node_index; + err_in_params.ras_error_type = ERR_CONTAINABLE; /* containable error */ + err_in_params.error_pa = err_inj_addr; /* address of the location where error + needs to be injected */ + err_in_params.is_pfg_check = 0; /* not a pseudo fault check */ + + /* Setup error in an implementation defined way */ + status = val_ras_setup_error(err_in_params, &err_out_params); + if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_setup_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* Inject error in an implementation defined way */ + status = val_ras_inject_error(err_in_params, &err_out_params); + if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_inject_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* wait loop to allow system to inject the error */ + val_ras_wait_timeout(1); + + /* Perform a read to error-injected address, which will cause system to record the error + with address syndrome in one of the error records present for the current RAS node */ + err_inj_addr_data = val_mmio_read(err_inj_addr); + val_print(AVS_PRINT_DEBUG, "\n Error injected address: 0x%llx", err_inj_addr); + val_print(AVS_PRINT_DEBUG, " Data read: 0x%lx", err_inj_addr_data); + + /* wait loop to allow system to update RAS error records */ + val_ras_wait_timeout(1); + +exception_return: + /* Check for External Abort */ + if (esr_pending) { + val_print(AVS_PRINT_DEBUG, "\n Data abort Check Fail, for node %d", node_index); + fail_cnt++; + continue; + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras009_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on single processor */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras010.c b/test_pool/ras/operating_system/test_ras010.c new file mode 100644 index 00000000..348fbfb9 --- /dev/null +++ b/test_pool/ras/operating_system/test_ras010.c @@ -0,0 +1,86 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 10) +#define TEST_RULE "SYS_RAS_1" +#define TEST_DESC "Check for patrol scrubbing support" + +static +void +payload() +{ + + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t num_of_mem_blocks = 0; + uint32_t i, scrub_support; + uint32_t fail_cnt = 0; + + + /* Note: RAS2 entry for a proximity domain imply that the domain supports error detection */ + /* get total number of RAS2 memory info blocks */ + num_of_mem_blocks = val_ras2_get_mem_info(RAS2_NUM_MEM_BLOCK, 0); + if (num_of_mem_blocks == 0) { + val_print(AVS_PRINT_DEBUG, "\n No RAS2 memory nodes found. Skipping...", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + for (i = 0; i < num_of_mem_blocks; i++) { + /* check whether current NUMA node (proximity domain) support patrol scrubbing */ + scrub_support = val_ras2_get_mem_info(RAS2_SCRUB_SUPPORT, i); + if (scrub_support == 0) { + val_print(AVS_PRINT_DEBUG, + "\n Patrol scrubbing not supported by proximity domain: 0x%x", + val_ras2_get_mem_info(RAS2_PROX_DOMAIN, i)); + fail_cnt++; + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + return; +} + +uint32_t +ras010_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; /* This test is run on single processor */ + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras011.c b/test_pool/ras/operating_system/test_ras011.c new file mode 100644 index 00000000..882649fe --- /dev/null +++ b/test_pool/ras/operating_system/test_ras011.c @@ -0,0 +1,259 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 11) +#define TEST_RULE "SYS_RAS_2,SYS_RAS_3" +#define TEST_DESC "Check Poison Storage & Forwarding " + +static uint32_t esr_pending = 1; +static uint64_t int_id; + +static +void +intr_handler(void) +{ + /* Clear the interrupt pending state */ + + val_print(AVS_PRINT_INFO, "\n Received interrupt %x ", 0); + val_gic_end_of_interrupt(int_id); + return; +} + +static void *branch_to_test; + +static +void +esr(uint64_t interrupt_type, void *context) +{ + esr_pending = 0; + + /* Update the ELR to return to test specified address */ + val_pe_update_elr(context, (uint64_t)branch_to_test); + + val_print(AVS_PRINT_ERR, "\n Received exception of type: %d", interrupt_type); +} + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 1; + uint64_t num_node; + uint64_t value; + uint64_t mc_status; + uint64_t pe_status; + uint32_t node_index; + uint32_t poison_check; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint32_t mpidr = val_pe_get_mpid(); + uint64_t rec_index; + RAS_ERR_IN_t err_in_params; + RAS_ERR_OUT_t err_out_params; + uint64_t pe_node_index; + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes not found. Skipping...", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Run this test only if this pe node has ras Functionality */ + /* Check current PE RAS Support with mpidr */ + status = val_ras_get_info(RAS_INFO_NODE_INDEX_FOR_AFF, mpidr, &pe_node_index); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n RAS Node not found for PE", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Check if Platform Supports Poison Storage & Forwarding */ + poison_check = val_ras_check_plat_poison_support(); + + for (node_index = 0; node_index < num_node; node_index++) { + + /* Get Current Node Type */ + status = val_ras_get_info(RAS_INFO_NODE_TYPE, node_index, &value); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Node Type not found index %d", node_index); + fail_cnt++; + break; + } + + /* Check if Node is Memory Controller */ + if (value != NODE_TYPE_MC) + continue; + + + /* Get Error Record number for this Node */ + status = val_ras_get_info(RAS_INFO_START_INDEX, node_index, &rec_index); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Could not get Start Index for index %d", node_index); + fail_cnt++; + continue; + } + + err_in_params.rec_index = rec_index; + err_in_params.node_index = node_index; + err_in_params.ras_error_type = ERR_CE; + err_in_params.is_pfg_check = 0; + + /* Get Interrupt details for this node */ + status = val_ras_get_info(RAS_INFO_ERI_ID, node_index, &int_id); + if (status) { + /* Interrupt details not found, Failing for this node */ + val_print(AVS_PRINT_DEBUG, "\n No Intr found, Failed for node %d", node_index); + fail_cnt++; + continue; + } + + test_skip = 0; + + /* Install sync and async handlers to handle exceptions.*/ + status = val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); + status |= val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); + if (status) + { + val_print(AVS_PRINT_ERR, "\n Failed in installing the exception handler", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + branch_to_test = &&exception_return; + + /* Install handler for interrupt */ + val_gic_install_isr(int_id, intr_handler); + + /* Setup an error in an implementation defined way */ + status = val_ras_setup_error(err_in_params, &err_out_params); + if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_setup_error failed, node %d", node_index); + fail_cnt++; + break; + } + + /* Inject error in an implementation defined way */ + status = val_ras_inject_error(err_in_params, &err_out_params); + if (status) { + val_print(AVS_PRINT_ERR, "\n val_ras_inject_error failed, node %d", node_index); + fail_cnt++; + break; + } + +exception_return: + /* Read Status Register for Memory Controller RAS Node */ + status = val_ras_check_err_record(node_index, err_in_params.ras_error_type); + if (status) { + val_print(AVS_PRINT_ERR, "\n MC Err Status Check Failed, for node %d", node_index); + fail_cnt++; + continue; + } + + /* Read Status Register for PE RAS Node */ + status = val_ras_check_err_record(pe_node_index, err_in_params.ras_error_type); + if (status) { + val_print(AVS_PRINT_ERR, "\n PE Err Status Check Failed, for node %d", node_index); + fail_cnt++; + continue; + } + + if (poison_check) { + /* Poison Check only if Poison Storage & Forwarding Supported */ + /* Read Status Register for RAS Nodes */ + mc_status = val_ras_reg_read(node_index, RAS_ERR_STATUS, rec_index); + if (mc_status == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<%d>STATUS register for ", + rec_index); + val_print(AVS_PRINT_ERR, + "RAS node index: 0x%lx", + node_index); + fail_cnt++; + continue; + } + pe_status = val_ras_reg_read(pe_node_index, RAS_ERR_STATUS, rec_index); + if (pe_status == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<%d>STATUS register for ", + rec_index); + val_print(AVS_PRINT_ERR, + "RAS node index: 0x%lx", + pe_node_index); + fail_cnt++; + continue; + } + + /* Check Poison Information Storage/Forwarding in MC/PE Ras Node */ + if (!(mc_status & ERR_STATUS_PN_MASK)) { + val_print(AVS_PRINT_DEBUG, "\n Poison Storage Fail, for node %d", node_index); + fail_cnt++; + continue; + } + if (!(pe_status & ERR_STATUS_PN_MASK)) { + val_print(AVS_PRINT_DEBUG, "\n Poison Frwding Fail, for node %d", pe_node_index); + fail_cnt++; + continue; + } + } else { + /* Check for External Abort */ + if (esr_pending) { + val_print(AVS_PRINT_DEBUG, "\n EA Check Fail, for node %d", pe_node_index); + fail_cnt++; + continue; + } + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras011_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/ras/operating_system/test_ras012.c b/test_pool/ras/operating_system/test_ras012.c new file mode 100644 index 00000000..662031ce --- /dev/null +++ b/test_pool/ras/operating_system/test_ras012.c @@ -0,0 +1,142 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_ras.h" + +#define TEST_NUM (AVS_RAS_TEST_NUM_BASE + 12) +#define TEST_RULE "SYS_RAS_2" +#define TEST_DESC "Check Pseudo Fault Injection " + +static void *branch_to_test; + +static +void +esr(uint64_t interrupt_type, void *context) +{ + /* Update the ELR to return to test specified address */ + val_pe_update_elr(context, (uint64_t)branch_to_test); + + val_print(AVS_PRINT_ERR, "\n Received exception of type: %d", interrupt_type); +} + +static +void +payload() +{ + + uint32_t status; + uint32_t fail_cnt = 0, test_skip = 1; + uint64_t num_node; + uint32_t node_index; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + uint64_t rec_index; + RAS_ERR_IN_t err_in_params; + RAS_ERR_OUT_t err_out_params; + + /* Get Number of nodes with RAS Functionality */ + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_node); + if (status || (num_node == 0)) { + val_print(AVS_PRINT_DEBUG, "\n RAS Nodes not found. Skipping...", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Run this test only if this pe node has ras Functionality */ + for (node_index = 0; node_index < num_node; node_index++) { + + /* Get Error Record number for this Node */ + status = val_ras_get_info(RAS_INFO_START_INDEX, node_index, &rec_index); + if (status) { + val_print(AVS_PRINT_DEBUG, "\n Could not get Start Index for index %d", node_index); + fail_cnt++; + continue; + } + + err_in_params.rec_index = rec_index; + err_in_params.node_index = node_index; + err_in_params.ras_error_type = ERR_CE; + err_in_params.is_pfg_check = 0; + + test_skip = 0; + + /* Install sync and async handlers to handle exceptions.*/ + status = val_pe_install_esr(EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, esr); + status |= val_pe_install_esr(EXCEPT_AARCH64_SERROR, esr); + if (status) + { + val_print(AVS_PRINT_ERR, "\n Failed in installing the exception handler", 0); + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + branch_to_test = &&exception_return; + + /* Setup an error in an implementation defined way */ + status = val_ras_setup_error(err_in_params, &err_out_params); + if (status == NOT_IMPLEMENTED) { + val_print(AVS_PRINT_ERR, "\n ras_setup_error API unimplemented", 0); + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Inject error in an implementation defined way */ + status = val_ras_inject_error(err_in_params, &err_out_params); + +exception_return: + /* Read Status Register for RAS Nodes */ + status = val_ras_check_err_record(node_index, err_in_params.ras_error_type); + if (status) { + val_print(AVS_PRINT_ERR, "\n Err Status Check Failed, for node %d", node_index); + fail_cnt++; + continue; + } + } + + if (fail_cnt) { + val_set_status(index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } else if (test_skip) { + val_set_status(index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + return; + } + + val_set_status(index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +ras012_entry(uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + + num_pe = 1; //This test is run on single processor + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/uefi_app/SbsaAvs.h b/uefi_app/SbsaAvs.h index a3c5e441..a344b0eb 100644 --- a/uefi_app/SbsaAvs.h +++ b/uefi_app/SbsaAvs.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,13 +20,13 @@ - #define SBSA_ACS_MAJOR_VER 6 - #define SBSA_ACS_MINOR_VER 1 + #define SBSA_ACS_MAJOR_VER 7 + #define SBSA_ACS_MINOR_VER 1 #define SBSA_ACS_SUBMINOR_VER 0 #define G_SBSA_LEVEL 4 #define SBSA_MIN_LEVEL_SUPPORTED 3 - #define SBSA_MAX_LEVEL_SUPPORTED 6 + #define SBSA_MAX_LEVEL_SUPPORTED 7 #define G_PRINT_LEVEL AVS_PRINT_TEST #define PE_INFO_TBL_SZ 8192 /*Supports maximum 400 PEs*/ @@ -39,6 +39,14 @@ #define PERIPHERAL_INFO_TBL_SZ 1024 /*Supports maximum 20 PCIe EPs (USB and SATA controllers only) */ #define PCIE_INFO_TBL_SZ 512 /*Supports maximum 20 RC's*/ + #define PMU_INFO_TBL_SZ 20488 /*Supports maximum 512 PMUs*/ + #define RAS_INFO_TBL_SZ 32768 /*Supports maximum 256 RAS Nodes*/ + #define RAS2_FEAT_INFO_TBL_SZ 32768 /*Supports maximum of 1024 RAS2 memory feature entries*/ + #define CACHE_INFO_TBL_SZ 262144 /*Support maximum of 7280 cache entries*/ + #define SRAT_INFO_TBL_SZ 12000 /*Support maximum of 500 mem proximity domain entries*/ + #define MPAM_INFO_TBL_SZ 98304 /*Supports maximum of 2048 MSC entries*/ + #define HMAT_INFO_TBL_SZ 8192 /*Supports maximum of 400 Proximity domains*/ + #ifdef _AARCH64_BUILD_ unsigned long __stack_chk_guard = 0xBAAAAAAD; unsigned long __stack_chk_fail = 0xBAAFAAAD; diff --git a/uefi_app/SbsaAvs.inf b/uefi_app/SbsaAvs.inf index 0392208d..b07490eb 100644 --- a/uefi_app/SbsaAvs.inf +++ b/uefi_app/SbsaAvs.inf @@ -113,6 +113,9 @@ ../test_pool/pcie/test_p058.c ../test_pool/pcie/test_p059.c ../test_pool/pcie/test_p060.c + ../test_pool/pcie/operating_system/test_p061.c + ../test_pool/pcie/operating_system/test_p062.c + ../test_pool/smmu/operating_system/test_i001.c ../test_pool/smmu/operating_system/test_i002.c ../test_pool/smmu/operating_system/test_i003.c @@ -145,6 +148,40 @@ ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c ../test_pool/exerciser/test_e016.c + ../test_pool/exerciser/operating_system/test_e017.c + ../test_pool/exerciser/operating_system/test_e018.c + ../test_pool/exerciser/operating_system/test_e019.c + ../test_pool/exerciser/operating_system/test_e020.c + + ../test_pool/mpam/operating_system/test_mpam001.c + ../test_pool/mpam/operating_system/test_mpam002.c + ../test_pool/mpam/operating_system/test_mpam003.c + ../test_pool/mpam/operating_system/test_mpam004.c + ../test_pool/mpam/operating_system/test_mpam005.c + ../test_pool/mpam/operating_system/test_mpam006.c + + ../test_pool/pmu/operating_system/test_pmu001.c + ../test_pool/pmu/operating_system/test_pmu002.c + ../test_pool/pmu/operating_system/test_pmu003.c + ../test_pool/pmu/operating_system/test_pmu004.c + ../test_pool/pmu/operating_system/test_pmu005.c + ../test_pool/pmu/operating_system/test_pmu006.c + ../test_pool/pmu/operating_system/test_pmu007.c + ../test_pool/pmu/operating_system/test_pmu008.c + ../test_pool/pmu/operating_system/test_pmu009.c + + ../test_pool/ras/operating_system/test_ras001.c + ../test_pool/ras/operating_system/test_ras002.c + ../test_pool/ras/operating_system/test_ras003.c + ../test_pool/ras/operating_system/test_ras004.c + ../test_pool/ras/operating_system/test_ras005.c + ../test_pool/ras/operating_system/test_ras006.c + ../test_pool/ras/operating_system/test_ras007.c + ../test_pool/ras/operating_system/test_ras008.c + ../test_pool/ras/operating_system/test_ras009.c + ../test_pool/ras/operating_system/test_ras010.c + ../test_pool/ras/operating_system/test_ras011.c + ../test_pool/ras/operating_system/test_ras012.c [Packages] StdLib/StdLib.dec @@ -177,4 +214,4 @@ [BuildOptions] GCC:*_*_*_ASM_FLAGS = -march=armv8.1-a - GCC:*_*_*_CC_FLAGS = -O0 -D ONLY_SBSA_RULE_TESTS + GCC:*_*_*_CC_FLAGS = -O0 diff --git a/uefi_app/SbsaAvsMain.c b/uefi_app/SbsaAvsMain.c index a04b761b..95072e7b 100644 --- a/uefi_app/SbsaAvsMain.c +++ b/uefi_app/SbsaAvsMain.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -36,9 +36,9 @@ UINT32 g_sbsa_level; UINT32 g_enable_pcie_tests; UINT32 g_print_level; UINT32 g_execute_nist; -UINT32 g_print_mmio; -UINT32 g_curr_module; -UINT32 g_enable_module; +UINT32 g_print_mmio = FALSE; +UINT32 g_curr_module = 0; +UINT32 g_enable_module = 0; UINT32 g_skip_test_num[MAX_TEST_SKIP_NUM] = { 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000 }; UINT32 g_single_test = SINGLE_TEST_SENTINEL; @@ -239,6 +239,175 @@ createPeripheralInfoTable( return Status; } +EFI_STATUS +createPmuInfoTable( +) +{ + UINT64 *PmuInfoTable; + EFI_STATUS Status; + + Status = gBS->AllocatePool (EfiBootServicesData, + PMU_INFO_TBL_SZ, + (VOID **) &PmuInfoTable); + + if (EFI_ERROR(Status)) + { + Print(L"Allocate Pool failed %x \n", Status); + return Status; + } + val_pmu_create_info_table(PmuInfoTable); + + return Status; + +} + +EFI_STATUS +createRasInfoTable( +) +{ + UINT64 *RasInfoTable; + EFI_STATUS Status; + + Status = gBS->AllocatePool(EfiBootServicesData, + RAS_INFO_TBL_SZ, + (VOID **) &RasInfoTable); + + if (EFI_ERROR(Status)) + { + Print(L"Allocate Pool failed %x \n", Status); + return Status; + } + val_ras_create_info_table(RasInfoTable); + + return Status; + +} + +EFI_STATUS +createCacheInfoTable( +) +{ + UINT64 *CacheInfoTable; + EFI_STATUS Status; + + Status = gBS->AllocatePool(EfiBootServicesData, + CACHE_INFO_TBL_SZ, + (VOID **) &CacheInfoTable); + + if (EFI_ERROR(Status)) + { + Print(L"Allocate Pool failed %x \n", Status); + return Status; + } + val_cache_create_info_table(CacheInfoTable); + + return Status; +} + +EFI_STATUS +createMpamInfoTable( +) +{ + UINT64 *MpamInfoTable; + EFI_STATUS Status; + + Status = gBS->AllocatePool(EfiBootServicesData, + MPAM_INFO_TBL_SZ, + (VOID **) &MpamInfoTable); + + if (EFI_ERROR(Status)) + { + Print(L"Allocate Pool failed %x \n", Status); + return Status; + } + val_mpam_create_info_table(MpamInfoTable); + + return Status; +} + +EFI_STATUS +createHmatInfoTable( +) +{ + UINT64 *HmatInfoTable; + EFI_STATUS Status; + + Status = gBS->AllocatePool(EfiBootServicesData, + HMAT_INFO_TBL_SZ, + (VOID **) &HmatInfoTable); + + if (EFI_ERROR(Status)) + { + Print(L"Allocate Pool failed %x \n", Status); + return Status; + } + val_hmat_create_info_table(HmatInfoTable); + + return Status; +} + +EFI_STATUS +createSratInfoTable( +) +{ + UINT64 *SratInfoTable; + EFI_STATUS Status; + + Status = gBS->AllocatePool(EfiBootServicesData, + SRAT_INFO_TBL_SZ, + (VOID **) &SratInfoTable); + + if (EFI_ERROR(Status)) + { + Print(L"Allocate Pool failed %x \n", Status); + return Status; + } + val_srat_create_info_table(SratInfoTable); + + return Status; +} + +/** + @brief This API allocates memory for info table and + calls create info table function passed as parameter. + + @param create_info_tbl_func - function pointer to val_*_create_info_table + @param info_table_size - memory size to be allocated. + + @return None +**/ + +EFI_STATUS +createInfoTable( + VOID(*create_info_tbl_func)(UINT64 *), + UINT64 info_table_size, + CHAR8 *table_name + ) +{ + UINT64 *InfoTable; + EFI_STATUS Status; + + val_print(AVS_PRINT_DEBUG, "\n Allocating memory for ", 0); + val_print(AVS_PRINT_DEBUG, table_name, 0); + val_print(AVS_PRINT_DEBUG, " info table", 0); + + Status = gBS->AllocatePool(EfiBootServicesData, + info_table_size, + (VOID **) &InfoTable); + + if (EFI_ERROR(Status)) + { + val_print(AVS_PRINT_ERR, "\n Allocate memory for ", 0); + val_print(AVS_PRINT_ERR, table_name, 0); + val_print(AVS_PRINT_ERR, " info table failed : %x", Status); + return Status; + } + + (*create_info_tbl_func)(InfoTable); + + return Status; +} + VOID freeSbsaAvsMem() { @@ -250,6 +419,12 @@ freeSbsaAvsMem() val_pcie_free_info_table(); val_iovirt_free_info_table(); val_peripheral_free_info_table(); + val_pmu_free_info_table(); + val_cache_free_info_table(); + val_mpam_free_info_table(); + val_hmat_free_info_table(); + val_srat_free_info_table(); + val_ras2_free_info_table(); val_free_shared_mem(); } @@ -258,16 +433,14 @@ HelpMsg ( VOID ) { - Print (L"\nUsage: Sbsa.efi [-v ] | [-l ] | [-f ] | [-skip ] | [-nist] | [-p ] | [-t ] | [-m ]\n" - "[-skip ] | [-nist] | [-p ]\n" + Print (L"\nUsage: Sbsa.efi [-v ] | [-l ] | [-f ] | " + "[-skip ] | [-nist] | [-p ] | [-t ] | [-m ]\n" "Options:\n" "-v Verbosity of the Prints\n" " 1 shows all prints, 5 shows Errors\n" - " Note: pal_mmio prints can be enabled for specific modules by passing\n" - " module numbers along with global verbosity level 1\n" - " Module numbers are PE 0, GIC 1, ...\n" - " E.g., To enable mmio prints for PE and TIMER pass -v 102 \n" "-mmio Pass this flag to enable pal_mmio_read/write prints, use with -v 1\n" + " Refer to section 4 of SBSA_ACS_User_Guide\n" + " To skip a module, use Model_ID as mentioned in user guide\n" "-l Level of compliance to be tested for\n" " As per SBSA spec, 3 to 6\n" "-f Name of the log file to record the test results in\n" @@ -296,7 +469,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { {L"-h" , TypeFlag}, // -h # help : info about commands {L"-nist" , TypeFlag}, // -nist # Binary Flag to enable the execution of NIST STS {L"-p" , TypeValue}, // -p # Enable/disable PCIe SBSA 6.0 (RCiEP) compliance tests. - {L"-mmio" , TypeFlag}, // -mmio # Enable pal_mmio prints + {L"-mmio" , TypeValue}, // -mmio # Enable pal_mmio prints {L"-t" , TypeValue}, // -t # Test to be run {L"-m" , TypeValue}, // -m # Module to be run {L"-p2p", TypeFlag}, // -p2p # Peer-to-Peer is supported @@ -325,7 +498,7 @@ ShellAppMainsbsa ( CONST CHAR16 *CmdLineArg; CHAR16 *ProbParam; UINT32 Status; - UINT32 ReadVerbosity; + UINT32 MmioVerbosity; UINT32 i,j=0; VOID *branch_label; @@ -375,12 +548,7 @@ ShellAppMainsbsa ( if (CmdLineArg == NULL) { g_print_level = G_PRINT_LEVEL; } else { - ReadVerbosity = StrDecimalToUintn(CmdLineArg); - while (ReadVerbosity/10) { - g_enable_module |= (1 << ReadVerbosity%10); - ReadVerbosity /= 10; - } - g_print_level = ReadVerbosity; + g_print_level = StrDecimalToUintn(CmdLineArg); if (g_print_level > 5) { g_print_level = G_PRINT_LEVEL; } @@ -417,17 +585,21 @@ ShellAppMainsbsa ( return 0; } - // Options with Flags - if (ShellCommandLineGetFlag (ParamPackage, L"-nist")) { - g_execute_nist = TRUE; - } else { - g_execute_nist = FALSE; - } if (ShellCommandLineGetFlag (ParamPackage, L"-mmio")) { - g_print_mmio = TRUE; - } else { - g_print_mmio = FALSE; + CmdLineArg = ShellCommandLineGetValue (ParamPackage, L"-mmio"); + if (CmdLineArg == NULL) { + g_print_mmio = TRUE; + } else { + MmioVerbosity = StrDecimalToUintn((CONST CHAR16 *)(CmdLineArg+0)); + g_enable_module |= (1 << MmioVerbosity/100); + for (i=0 ; i < StrLen(CmdLineArg) ; i++) { + if (*(CmdLineArg + i) == L',') { + MmioVerbosity = StrDecimalToUintn((CONST CHAR16 *)(CmdLineArg+i+1)); + g_enable_module |= (1 << MmioVerbosity/100); + } + } + } } if (ShellCommandLineGetFlag (ParamPackage, L"-p2p")) { @@ -457,6 +629,16 @@ ShellAppMainsbsa ( } } + // Options with Flags + if (ShellCommandLineGetFlag (ParamPackage, L"-nist")) { + g_execute_nist = TRUE; + } else { + g_execute_nist = FALSE; + } + + if (g_sbsa_level == 7) + g_execute_nist = TRUE; + // Options with Values CmdLineArg = ShellCommandLineGetValue (ParamPackage, L"-t"); if (CmdLineArg != NULL) { @@ -496,8 +678,31 @@ ShellAppMainsbsa ( createTimerInfoTable(); createWatchdogInfoTable(); + + Status = createCacheInfoTable(); + if (Status) + Print(L" Failed to created Cache info table \n"); + + Status = createMpamInfoTable(); + if (Status) + Print(L" Failed to created Mpam info table \n"); + + Status = createHmatInfoTable(); + if (Status) + Print(L" Failed to created HMAT info table \n"); + + Status = createSratInfoTable(); + if (Status) + Print(L" Failed to created SRAT info table \n"); + + Status = createInfoTable(val_ras2_create_info_table, RAS2_FEAT_INFO_TBL_SZ, "RAS2"); + if (Status) + Print(L" Failed to created RAS2 feature info table \n"); + createPcieVirtInfoTable(); createPeripheralInfoTable(); + createPmuInfoTable(); + createRasInfoTable(); val_allocate_shared_mem(); @@ -513,33 +718,36 @@ ShellAppMainsbsa ( val_print(AVS_PRINT_TEST, "\n *** Starting GIC tests *** \n", 0); Status |= val_gic_execute_tests(g_sbsa_level, val_pe_get_num()); -#ifndef ONLY_SBSA_RULE_TESTS - val_print(AVS_PRINT_TEST, "\n *** Starting Timer tests *** \n", 0); - Status |= val_timer_execute_tests(g_sbsa_level, val_pe_get_num()); -#endif - -#ifdef ONLY_SBSA_RULE_TESTS if (g_sbsa_level > 4) -#endif { val_print(AVS_PRINT_TEST, "\n *** Starting Watchdog tests *** \n", 0); Status |= val_wd_execute_tests(g_sbsa_level, val_pe_get_num()); } -#ifndef ONLY_SBSA_RULE_TESTS - val_print(AVS_PRINT_TEST, "\n *** Starting Power and Wakeup semantic tests *** \n", 0); - Status |= val_wakeup_execute_tests(g_sbsa_level, val_pe_get_num()); + if (g_sbsa_level > 3) { + val_print(AVS_PRINT_TEST, "\n *** Starting SMMU tests *** \n", 0); + Status |= val_smmu_execute_tests(g_sbsa_level, val_pe_get_num()); + } - val_print(AVS_PRINT_TEST, "\n *** Starting Peripheral tests *** \n", 0); - Status |= val_peripheral_execute_tests(g_sbsa_level, val_pe_get_num()); -#endif + val_print(AVS_PRINT_TEST, "\n *** Starting Memory tests *** \n", 0); + Status |= val_memory_execute_tests(g_sbsa_level, val_pe_get_num()); - val_print(AVS_PRINT_TEST, "\n *** Starting SMMU tests *** \n", 0); - Status |= val_smmu_execute_tests(g_sbsa_level, val_pe_get_num()); + if (g_sbsa_level > 6) { + val_print(AVS_PRINT_TEST, "\n *** Starting MPAM tests *** \n", 0); + Status |= val_mpam_execute_tests(g_sbsa_level, val_pe_get_num()); + } + + if (g_sbsa_level > 6) { + val_print(AVS_PRINT_TEST, "\n *** Starting PMU tests *** \n", 0); + Status |= val_pmu_execute_tests(g_sbsa_level, val_pe_get_num()); + } + + if (g_sbsa_level > 6) { + val_print(AVS_PRINT_TEST, "\n *** Starting RAS tests *** \n", 0); + Status |= val_ras_execute_tests(g_sbsa_level, val_pe_get_num()); + } -#ifdef ONLY_SBSA_RULE_TESTS if (g_sbsa_level > 5) -#endif { val_print(AVS_PRINT_TEST, "\n *** Starting PCIe tests *** \n", 0); Status |= val_pcie_execute_tests(g_enable_pcie_tests, g_sbsa_level, val_pe_get_num()); @@ -557,12 +765,12 @@ ShellAppMainsbsa ( } - #ifdef ENABLE_NIST +#ifdef ENABLE_NIST if (g_execute_nist == TRUE) { val_print(AVS_PRINT_TEST, "\n *** Starting NIST statistical tests *** \n", 0); Status |= val_nist_execute_tests(g_sbsa_level, val_pe_get_num()); } - #endif +#endif print_test_status: val_print(AVS_PRINT_TEST, "\n ------------------------------------------------------- \n", 0); diff --git a/uefi_app/SbsaAvsNist.inf b/uefi_app/SbsaAvsNist.inf index 57c82db4..a5a54a95 100644 --- a/uefi_app/SbsaAvsNist.inf +++ b/uefi_app/SbsaAvsNist.inf @@ -1,5 +1,5 @@ ## @file -# Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -75,7 +75,6 @@ ../test_pool/watchdog/operating_system/test_w001.c ../test_pool/pcie/test_p001.c - ../test_pool/pcie/test_p002.c ../test_pool/pcie/test_p003.c ../test_pool/pcie/test_p020.c ../test_pool/pcie/test_p021.c @@ -97,7 +96,6 @@ ../test_pool/pcie/test_p037.c ../test_pool/pcie/test_p038.c ../test_pool/pcie/test_p039.c - ../test_pool/pcie/test_p040.c ../test_pool/pcie/test_p041.c ../test_pool/pcie/test_p042.c ../test_pool/pcie/test_p043.c @@ -110,11 +108,14 @@ ../test_pool/pcie/test_p050.c ../test_pool/pcie/test_p051.c ../test_pool/pcie/test_p052.c - ../test_pool/pcie/test_p053.c - ../test_pool/pcie/test_p054.c - ../test_pool/pcie/test_p055.c ../test_pool/pcie/test_p056.c ../test_pool/pcie/test_p057.c + ../test_pool/pcie/test_p058.c + ../test_pool/pcie/test_p059.c + ../test_pool/pcie/test_p060.c + ../test_pool/pcie/operating_system/test_p061.c + ../test_pool/pcie/operating_system/test_p062.c + ../test_pool/smmu/operating_system/test_i001.c ../test_pool/smmu/operating_system/test_i002.c ../test_pool/smmu/operating_system/test_i003.c @@ -146,6 +147,42 @@ ../test_pool/exerciser/test_e013.c ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c + ../test_pool/exerciser/test_e016.c + ../test_pool/exerciser/operating_system/test_e017.c + ../test_pool/exerciser/operating_system/test_e018.c + ../test_pool/exerciser/operating_system/test_e019.c + ../test_pool/exerciser/operating_system/test_e020.c + + ../test_pool/mpam/operating_system/test_mpam001.c + ../test_pool/mpam/operating_system/test_mpam002.c + ../test_pool/mpam/operating_system/test_mpam003.c + ../test_pool/mpam/operating_system/test_mpam004.c + ../test_pool/mpam/operating_system/test_mpam005.c + ../test_pool/mpam/operating_system/test_mpam006.c + + ../test_pool/pmu/operating_system/test_pmu001.c + ../test_pool/pmu/operating_system/test_pmu002.c + ../test_pool/pmu/operating_system/test_pmu003.c + ../test_pool/pmu/operating_system/test_pmu004.c + ../test_pool/pmu/operating_system/test_pmu005.c + ../test_pool/pmu/operating_system/test_pmu006.c + ../test_pool/pmu/operating_system/test_pmu007.c + ../test_pool/pmu/operating_system/test_pmu008.c + ../test_pool/pmu/operating_system/test_pmu009.c + + ../test_pool/ras/operating_system/test_ras001.c + ../test_pool/ras/operating_system/test_ras002.c + ../test_pool/ras/operating_system/test_ras003.c + ../test_pool/ras/operating_system/test_ras004.c + ../test_pool/ras/operating_system/test_ras005.c + ../test_pool/ras/operating_system/test_ras006.c + ../test_pool/ras/operating_system/test_ras007.c + ../test_pool/ras/operating_system/test_ras008.c + ../test_pool/ras/operating_system/test_ras009.c + ../test_pool/ras/operating_system/test_ras010.c + ../test_pool/ras/operating_system/test_ras011.c + ../test_pool/ras/operating_system/test_ras012.c + ../test_pool/nist_sts/test_n001.c [Packages] @@ -180,3 +217,5 @@ [BuildOptions] GCC:*_*_*_ASM_FLAGS = -march=armv8.1-a + GCC:*_*_*_CC_FLAGS = -O0 + diff --git a/val/include/pal_interface.h b/val/include/pal_interface.h index 1adb5e96..584806ca 100644 --- a/val/include/pal_interface.h +++ b/val/include/pal_interface.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,6 +20,7 @@ #ifdef TARGET_LINUX #include +#include #endif #ifdef TARGET_LINUX @@ -110,12 +111,17 @@ typedef struct { /** @brief structure instance for PE entry **/ +#define DEFAULT_CACHE_IDX 0xFFFFFFFF +#define MAX_L1_CACHE_RES 2 /* Generally PE Level 1 have a data and a instruction cache */ + typedef struct { - uint32_t pe_num; ///< PE Index - uint32_t attr; ///< PE attributes - uint64_t mpidr; ///< PE MPIDR - uint32_t pmu_gsiv; ///< PMU Interrupt ID + uint32_t pe_num; /* PE Index */ + uint32_t attr; /* PE attributes */ + uint64_t mpidr; /* PE MPIDR */ + uint32_t pmu_gsiv; /* PMU Interrupt */ uint32_t gmain_gsiv; /* GIC Maintenance Interrupt */ + uint32_t acpi_proc_uid; /* ACPI Processor UID */ + uint32_t level_1_res[MAX_L1_CACHE_RES]; /* index of level 1 cache(s) in cache_info_table */ }PE_INFO_ENTRY; typedef struct { @@ -402,8 +408,14 @@ typedef union { #define MAX_NAMED_COMP_LENGTH 256 +typedef struct { + uint64_t smmu_base; /* SMMU base to which component is attached, else NULL */ + uint32_t cca; /* Cache Coherency Attribute */ + char name[MAX_NAMED_COMP_LENGTH]; /* Device object name */ +} IOVIRT_NAMED_COMP_INFO_BLOCK; + typedef union { - char name[MAX_NAMED_COMP_LENGTH]; + IOVIRT_NAMED_COMP_INFO_BLOCK named_comp; IOVIRT_RC_INFO_BLOCK rc; IOVIRT_PMCG_INFO_BLOCK pmcg; uint32_t its_count; @@ -435,6 +447,10 @@ void pal_iovirt_create_info_table(IOVIRT_INFO_TABLE *iovirt); uint32_t pal_iovirt_check_unique_ctx_intid(uint64_t smmu_block); uint32_t pal_iovirt_unique_rid_strid_map(uint64_t rc_block); uint64_t pal_iovirt_get_rc_smmu_base(IOVIRT_INFO_TABLE *iovirt, uint32_t rc_seg_num, uint32_t rid); +#ifdef TARGET_LINUX +uint32_t pal_get_device_path(const char *hid, char hid_path[][MAX_NAMED_COMP_LENGTH]); +uint32_t pal_smmu_is_etr_behind_catu(char *etr_path); +#endif /** @brief SMMU Info Table @@ -722,7 +738,10 @@ typedef enum { CFG_TXN_ATTRIBUTES = 0x7, ATS_RES_ATTRIBUTES = 0x8, TRANSACTION_TYPE = 0x9, - NUM_TRANSACTIONS = 0xA + NUM_TRANSACTIONS = 0xA, + ADDRESS_ATTRIBUTES = 0xB, + DATA_ATTRIBUTES = 0xC, + ERROR_INJECT_TYPE = 0xD } EXERCISER_PARAM_TYPE; typedef enum { @@ -758,7 +777,8 @@ typedef enum { TXN_NO_SNOOP_DISABLE = 0xa, START_TXN_MONITOR = 0xb, STOP_TXN_MONITOR = 0xc, - ATS_TXN_REQ = 0xd + ATS_TXN_REQ = 0xd, + INJECT_ERROR = 0xe } EXERCISER_OPS; typedef enum { @@ -817,7 +837,331 @@ uint32_t pal_exerciser_get_state(EXERCISER_STATE *state, uint32_t bdf); uint32_t pal_exerciser_ops(EXERCISER_OPS ops, uint64_t param, uint32_t instance); uint32_t pal_exerciser_get_data(EXERCISER_DATA_TYPE type, exerciser_data_t *data, uint32_t bdf, uint64_t ecam); - uint32_t pal_nist_generate_rng(uint32_t *rng_buffer); + +/* PMU related APIs and structures*/ + +/** + @brief Instance of system pmu info +**/ +typedef struct { + uint8_t type; /* The component that this PMU block is associated with*/ + uint64_t primary_instance; /* Primary node instance, specific to the PMU type*/ + uint32_t secondary_instance; /* Secondary node instance, specific to the PMU type*/ + uint8_t dual_page_extension; /* Support of the dual-page mode*/ + uint64_t base0; /* Base address of Page 0 of the PMU*/ + uint64_t base1; /* Base address of Page 1 of the PMU, + valid only if dual_page_extension is 1*/ +} PMU_INFO_BLOCK; + +typedef struct { + uint32_t pmu_count; /* Total number of PMU info blocks*/ + PMU_INFO_BLOCK info[]; /* PMU info blocks for each PMU nodes*/ +} PMU_INFO_TABLE; + +/** + @brief SRAT node type +**/ + +typedef enum { + SRAT_NODE_MEM_AFF = 0x01, + SRAT_NODE_GICC_AFF = 0x03 +} SRAT_NODE_TYPE_e; + +/** + @brief SRAT GICC Affinity Structure +**/ + +typedef struct { + uint32_t prox_domain; /* Proximity domain*/ + uint32_t proc_uid; /* ACPI Processor UID */ + uint32_t flags; /* Flags*/ + uint32_t clk_domain; /* Clock Domain*/ +} SRAT_GICC_AFF_ENTRY; + +/** + @brief SRAT Memory Affinity Structure +**/ + +typedef struct { + uint32_t prox_domain; /* Proximity domain */ + uint32_t flags; /* flags */ + uint64_t addr_base; /* mem range address base */ + uint64_t addr_len; /* mem range address len */ +} SRAT_MEM_AFF_ENTRY; + +typedef union { + SRAT_MEM_AFF_ENTRY mem_aff; + SRAT_GICC_AFF_ENTRY gicc_aff; +} SRAT_NODE_INFO; + +typedef struct { + uint32_t node_type; /* Node type*/ + SRAT_NODE_INFO node_data; +} SRAT_INFO_ENTRY; + +typedef struct { + uint32_t num_of_srat_entries; + uint32_t num_of_mem_ranges; + SRAT_INFO_ENTRY srat_info[]; +} SRAT_INFO_TABLE; + +typedef enum { + PMU_EVENT_IB_TOTAL_BW, /* Inbound total bandwidth */ + PMU_EVENT_OB_TOTAL_BW, /* Outbound total bandwidth */ + PMU_EVENT_IB_READ_BW, /* Inbound read bandwidth */ + PMU_EVENT_IB_WRITE_BW, /* Inbound write bandwidth */ + PMU_EVENT_OB_READ_BW, /* Outbound read bandwidth */ + PMU_EVENT_OB_WRITE_BW, /* Outbound write bandwidth */ + PMU_EVENT_IB_OPEN_TXN, /* Inbound open transactions */ + PMU_EVENT_IB_TOTAL_TXN, /* Inbound total transactions */ + PMU_EVENT_OB_OPEN_TXN, /* Outbound open transactions */ + PMU_EVENT_OB_TOTAL_TXN, /* Outbound total transactions */ + PMU_EVENT_LOCAL_BW, /* Local traffic bandwidth */ + PMU_EVENT_REMOTE_BW, /* Remote trafic bandwidth */ + PMU_EVENT_ALL_BW, /* All traffic bandwidth */ + PMU_EVENT_TRAFFIC_1, /* traffic type 1 */ + PMU_EVENT_TRAFFIC_2 /* traffic type 2 */ +} PMU_EVENT_TYPE_e; + +/* PMU node types */ +typedef enum { + PMU_NODE_MEM_CNTR, + PMU_NODE_SMMU, + PMU_NODE_PCIE_RC, + PMU_NODE_ACPI_DEVICE, + PMU_NODE_PE_CACHE +} PMU_NODE_INFO_TYPE; + + +#define PMU_EVENT_INVALID 0xFFFFFFFF + +/** + @brief This API fills in the PMU_INFO_TABLE with information about local and system + timers in the system. This is achieved by parsing the ACPI - APMT table. + + @param PmuTable - Address where the PMU information needs to be filled. + + @return None +**/ +void pal_pmu_create_info_table(PMU_INFO_TABLE *PmuTable); +uint32_t pal_pmu_get_event_info(PMU_EVENT_TYPE_e event_type, PMU_NODE_INFO_TYPE node_type); +uint32_t pal_pmu_get_multi_traffic_support_interface(uint64_t *interface_acpiid, + uint32_t *num_traffic_type_support); +uint32_t pal_generate_traffic(uint64_t interface_acpiid, uint32_t pmu_node_index, + uint32_t mon_index, uint32_t eventid); +uint32_t pal_pmu_check_monitor_count_value(uint64_t interface_acpiid, uint32_t count_value, + uint32_t eventid); + +/* Cache info table structures and APIs */ + +#define CACHE_TYPE_SHARED 0x0 +#define CACHE_TYPE_PRIVATE 0x1 +#define CACHE_INVALID_NEXT_LVL_IDX 0xFFFFFFFF +#define CACHE_INVALID_IDX 0xFFFFFFFF + +/*only the fields and flags required by ACS are parsed from ACPI PPTT table*/ +/*Cache flags indicate validity of cache info provided by PPTT Table*/ +typedef struct { + uint32_t size_property_valid; + uint32_t cache_type_valid; + uint32_t cache_id_valid; +} CACHE_FLAGS; + +/* Since most of platform doesn't support cache id field (ACPI 6.4+), ACS uses PPTT offset as key + to uniquely identify a cache, In future once platforms align with ACPI 6.4+ my_offset member + might be removed from cache entry*/ +typedef struct { + CACHE_FLAGS flags; /* Cache flags */ + uint32_t my_offset; /* Cache PPTT structure offset */ + uint32_t next_level_index; /* Index of next level cache entry in CACHE_INFO_TABLE */ + uint32_t size; /* Size of the cache in bytes */ + uint32_t cache_id; /* Unique, non-zero identifier for this cache */ + uint32_t is_private; /* Field indicate whether cache is private */ + uint8_t cache_type; /* Cache type */ +} CACHE_INFO_ENTRY; + +typedef struct { + uint32_t num_of_cache; /* Total of number of cache info entries */ + CACHE_INFO_ENTRY cache_info[]; /* Array of cache info entries */ +} CACHE_INFO_TABLE; + +void pal_cache_create_info_table(CACHE_INFO_TABLE *CacheTable, PE_INFO_TABLE *PeTable); +void pal_cache_dump_info_table(CACHE_INFO_TABLE *CacheTable, PE_INFO_TABLE *PeTable); + +/* + * @brief MPAM Resource Node + */ + +#define MPAM_NEXT_MSC(msc_entry) \ + (MPAM_MSC_NODE *)((uint8_t *)(&msc_entry->rsrc_node[0]) \ + + msc_entry->rsrc_count * sizeof(MPAM_RESOURCE_NODE)) + +typedef struct { + uint8_t ris_index; + uint8_t locator_type; /* Identifies location of this resource */ + uint64_t descriptor1; /* Primary acpi description of location */ + uint32_t descriptor2; /* Secondary acpi description of location */ +} MPAM_RESOURCE_NODE; + +/* + * @brief MPAM MSC Node + */ +typedef struct { + uint64_t msc_base_addr; /* base addr of mem-map MSC reg */ + uint32_t msc_addr_len; /* MSC mem map size */ + uint32_t max_nrdy; /* max time in microseconds that MSC not ready + after config change */ + uint32_t rsrc_count; /* number of resource nodes */ + MPAM_RESOURCE_NODE rsrc_node[]; /* Details of resource node */ +} MPAM_MSC_NODE; + +/* + * @brief Mpam info table + */ +typedef struct { + uint32_t msc_count; /* Number of MSC node */ + MPAM_MSC_NODE msc_node[]; /* Details of MSC node */ +} MPAM_INFO_TABLE; + +void pal_mpam_create_info_table(MPAM_INFO_TABLE *MpamTable); +void *pal_mem_alloc_at_address(uint64_t mem_base, uint64_t size); +void pal_mem_free_at_address(uint64_t mem_base, uint64_t size); + +/* RAS INFO table */ + +typedef enum { + NODE_TYPE_PE = 0x0, + NODE_TYPE_MC = 0x1, + NODE_TYPE_SMMU = 0x2, + NODE_TYPE_VDR = 0x3, + NODE_TYPE_GIC = 0x4, + NODE_TYPE_LAST_ENTRY +} RAS_NODE_TYPE_e; + +typedef enum { + RAS_INTF_TYPE_SYS_REG, /* System register RAS node interface type */ + RAS_INTF_TYPE_MMIO /* MMIO RAS node interface type */ +} RAS_NODE_INTF_TYPE; + +typedef struct { + uint32_t processor_id; + uint32_t resource_type; + uint32_t flags; + uint64_t affinity; + uint64_t res_specific_data; /* Resource Specific Data */ +} RAS_NODE_PE_DATA; + +typedef struct { + uint32_t proximity_domain; +} RAS_NODE_MC_DATA; + +typedef struct { + RAS_NODE_INTF_TYPE intf_type; /* Interface Type */ + uint32_t flags; + uint64_t base_addr; + uint32_t start_rec_index; /* Start Record Index */ + uint32_t num_err_rec; + uint64_t err_rec_implement; + uint64_t err_status_reporting; + uint64_t addressing_mode; +} RAS_INTERFACE_INFO; + +typedef struct { + uint32_t type; + uint32_t flag; + uint32_t gsiv; + uint32_t its_grp_id; +} RAS_INTERRUPT_INFO; + +typedef union { + RAS_NODE_PE_DATA pe; + RAS_NODE_MC_DATA mc; +} RAS_NODE_DATA; + +typedef struct { + RAS_NODE_TYPE_e type; /* Node Type PE/GIC/SMMU */ + uint16_t length; /* Length of the Node */ + uint64_t num_intr_entries; /* Number of Interrupt Entry */ + RAS_NODE_DATA node_data; /* Node Specific Data */ + RAS_INTERFACE_INFO intf_info; /* Node Interface Info */ + RAS_INTERRUPT_INFO intr_info[2]; /* Node Interrupt Info */ + uint32_t err_grp_id; /* Error Group ID used in the ACS */ +} RAS_NODE_INFO; + +typedef struct { + uint32_t num_nodes; /* Number of total RAS Nodes */ + uint32_t num_pe_node; /* Number of PE RAS Nodes */ + uint32_t num_mc_node; /* Number of Memory Controller Nodes */ + RAS_NODE_INFO node[]; /* Array of RAS nodes */ +} RAS_INFO_TABLE; + +typedef enum { + ERR_UC = 0x1, /* UnContainable Error */ + ERR_DE, /* Deferred Error */ + ERR_CE, /* Correctable Error */ + ERR_CRITICAL, /* Critical Error */ + ERR_CONTAINABLE /* Containable Error */ +} RAS_ERROR_TYPE; + +typedef struct { + RAS_ERROR_TYPE ras_error_type; /* Error Type */ + uint64_t error_pa; /* Error Phy Address */ + uint32_t rec_index; /* Error Record Index */ + uint32_t node_index; /* Error Node Index in Info table */ + uint8_t is_pfg_check; /* Pseudo Fault Check or not */ +} RAS_ERR_IN_t; + +typedef struct { + uint32_t intr_id; /* Interrupt ID */ + uint32_t error_record; /* Error Record Number */ +} RAS_ERR_OUT_t; + +typedef enum { + RAS2_TYPE_MEMORY = 0 /* RAS2 memory feature type*/ +} RAS2_FEAT_TYPE; + +typedef struct { + uint32_t proximity_domain; /* Proximity domain of the memory */ + uint32_t patrol_scrub_support; /* Patrol srub support flag */ +} RAS2_MEM_INFO; + +typedef union { + RAS2_MEM_INFO mem_feat_info; /* Memory feature specific info */ +} RAS2_BLOCK_INFO; + +typedef struct { + RAS2_FEAT_TYPE type; /* RAS2 feature type*/ + RAS2_BLOCK_INFO block_info; /* RAS2 block info */ +} RAS2_BLOCK; + +typedef struct { + uint32_t num_all_block; /* Number of RAS2 feature blocks */ + uint32_t num_of_mem_block; /* Number of memory feature blocks */ + RAS2_BLOCK blocks[]; +} RAS2_INFO_TABLE; + +void pal_ras2_create_info_table(RAS2_INFO_TABLE *ras2_info_table); +void pal_ras_create_info_table(RAS_INFO_TABLE *ras_info_table); + +uint32_t pal_ras_setup_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param); +uint32_t pal_ras_inject_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param); +void pal_ras_wait_timeout(uint32_t count); +uint32_t pal_ras_check_plat_poison_support(void); + +typedef struct { + uint32_t mem_prox_domain; /* Proximity domain of the memory region*/ + uint64_t write_bw; /* Maximum write bandwidth */ + uint64_t read_bw; /* Maximum read bandwidth */ +} HMAT_BW_ENTRY; + +typedef struct { + uint32_t num_of_mem_prox_domain; /* Number of Memory Proximity Domains */ + HMAT_BW_ENTRY bw_info[]; /* Array of bandwidth info based on proximity domain */ +} HMAT_INFO_TABLE; + +void pal_hmat_create_info_table(HMAT_INFO_TABLE *HmatTable); +void pal_srat_create_info_table(SRAT_INFO_TABLE *SratTable); + #endif diff --git a/val/include/sbsa_avs_common.h b/val/include/sbsa_avs_common.h index 4bc2186d..e1c6cf29 100644 --- a/val/include/sbsa_avs_common.h +++ b/val/include/sbsa_avs_common.h @@ -32,6 +32,9 @@ #define AVS_SMMU_TEST_NUM_BASE 700 #define AVS_EXERCISER_TEST_NUM_BASE 800 #define AVS_NIST_TEST_NUM_BASE 900 +#define AVS_MPAM_TEST_NUM_BASE 1000 +#define AVS_PMU_TEST_NUM_BASE 1100 +#define AVS_RAS_TEST_NUM_BASE 1200 #define AVS_MEM_MAP_TEST_NUM_BASE 1300 #define STATE_BIT 28 @@ -63,7 +66,9 @@ #define SBSA_AVS_START(level, test_num) (((TEST_START_VAL) << STATE_BIT) | ((level) << LEVEL_BIT) | ((test_num) << TEST_NUM_BIT)) #define SBSA_AVS_END(level, test_num) (((TEST_END_VAL) << STATE_BIT) | ((level) << LEVEL_BIT) | ((test_num) << TEST_NUM_BIT)) +/* status definations*/ +#define STATUS_SYS_REG_ACCESS_FAIL 0x78 /* TEST Result defines */ @@ -133,6 +138,10 @@ typedef enum { PERIPHERAL_MODULE, SMMU_MODULE, EXERCISER_MODULE, + NIST_MODULE, + MPAM_MODULE, + PMU_MODULE, + RAS_MODULE, MEM_MAP_MODULE } MODULE_ID_e; diff --git a/val/include/sbsa_avs_exerciser.h b/val/include/sbsa_avs_exerciser.h index 8d807351..c44ce3fa 100644 --- a/val/include/sbsa_avs_exerciser.h +++ b/val/include/sbsa_avs_exerciser.h @@ -43,7 +43,7 @@ typedef enum { } EXERCISER_INFO_TYPE; -void val_exerciser_create_info_table(void); +uint32_t val_exerciser_create_info_table(void); uint32_t val_exerciser_init(uint32_t instance); uint32_t val_exerciser_get_info(EXERCISER_INFO_TYPE type, uint32_t instance); uint32_t val_exerciser_set_param(EXERCISER_PARAM_TYPE type, uint64_t value1, uint64_t value2, uint32_t instance); diff --git a/val/include/sbsa_avs_mmu.h b/val/include/sbsa_avs_mmu.h new file mode 100644 index 00000000..fdb557c6 --- /dev/null +++ b/val/include/sbsa_avs_mmu.h @@ -0,0 +1,34 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#ifndef __SBSA_AVS_MMU_H__ +#define __SBSA_AVS_MMU_H__ + +/* upper and lower mem attribute shift definitions */ +#define MEM_ATTR_INDX_SHIFT 2 +#define MEM_ATTR_AP_SHIFT 6 +#define MEM_ATTR_SH_SHIFT 8 +#define MEM_ATTR_AF_SHIFT 10 + +/* memory type MAIR register index definitions*/ +#define ATTR_DEVICE_nGnRnE (0x0ULL << MEM_ATTR_INDX_SHIFT) + +uint32_t val_mmu_check_for_entry(uint64_t base_addr); +uint32_t val_mmu_add_entry(uint64_t base_addr, uint64_t size); +uint32_t val_mmu_update_entry(uint64_t address, uint32_t size); + +#endif /* __SBSA_AVS_MMU_H__ */ diff --git a/val/include/sbsa_avs_mpam.h b/val/include/sbsa_avs_mpam.h new file mode 100644 index 00000000..987f2e7a --- /dev/null +++ b/val/include/sbsa_avs_mpam.h @@ -0,0 +1,112 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#ifndef __SBSA_AVS_MPAM_H__ +#define __SBSA_AVS_MPAM_H__ + +/* The return value is always 64-bit, type casting is needed by the caller and (m > n) */ +#define CLEAR_BITS_M_TO_N(num, m, n) (num & ((~0UL << (m+1)) | ((1UL << n) - 1))) + +#define MPAM_VERSION_1_1 0x11 + +/******************************************************************************* + * MPAM system register bit definitions & constants + ******************************************************************************/ +/* MPAMn_ELx bit definitions */ +#define MPAMn_ELx_PARTID_I_SHIFT 0 +#define MPAMn_ELx_PARTID_D_SHIFT 16 +#define MPAMn_ELx_PMG_I_SHIFT 32 +#define MPAMn_ELx_PMG_D_SHIFT 40 +#define MPAMn_ELx_MPAMEN_SHIFT 63 +#define MPAMn_ELx_PARTID_I_MASK 0xffffULL +#define MPAMn_ELx_PARTID_D_MASK 0xffffULL +#define MPAMn_ELx_PMG_I_MASK 0xffULL +#define MPAMn_ELx_PMG_D_MASK 0xffULL +#define MPAMn_ELx_MPAMEN_MASK 0x1ULL +/* MPAMIDR_EL1 bit definitions */ +#define MPAMIDR_PARTID_MAX_SHIFT 0 +#define MPAMIDR_PMG_MAX_SHIFT 32 +#define MPAMIDR_PARTID_MAX_MASK 0xffff +#define MPAMIDR_PMG_MAX_MASK 0xff + +#define CPOR_BITMAP_DEF_VAL 0xFFFFFFFF + +/* MPAM system registers */ +typedef enum { + MPAMIDR_EL1, + MPAM2_EL2, + MPAM1_EL1 +} MPAM_SYS_REGS; + +#define DEFAULT_PARTID 0ULL +#define DEFAULT_PARTID_MAX 65535 //(2^16 - 1) +#define DEFAULT_PMG 0ULL +#define DEFAULT_PMG_MAX 255 //(2^8 - 1) +#define MPAM_MON_NOT_READY -1 + +void val_mpam_reg_write(MPAM_SYS_REGS reg_id, uint64_t write_data); +uint64_t val_mpam_reg_read(MPAM_SYS_REGS reg_id); +uint64_t AA64ReadMpamidr(void); +uint64_t AA64ReadMpam1(void); +uint64_t AA64ReadMpam2(void); +void AA64IssueDSB(void); +void AA64WriteMpam1(uint64_t write_data); +void AA64WriteMpam2(uint64_t write_data); + +uint64_t val_mpam_get_info(MPAM_INFO_e type, uint32_t msc_index, uint32_t rsrc_index); +uint32_t val_mpam_msc_supports_mon(uint32_t msc_index); +uint32_t val_mpam_msc_supports_mbwumon(uint32_t msc_index); +void val_mpam_memory_configure_mbwumon(uint32_t msc_index); +void val_mpam_memory_mbwumon_enable(uint32_t msc_index); +void val_mpam_memory_mbwumon_disable(uint32_t msc_index); +void val_mpam_memory_configure_ris_sel(uint32_t msc_index, uint32_t rsrc_index); +uint32_t val_mpam_msc_supports_ris(uint32_t msc_index); +uint64_t val_mpam_memory_mbwumon_read_count(uint32_t msc_index); +uint32_t val_mpam_get_msc_count(void); +void val_mpam_memory_mbwumon_reset(uint32_t msc_index); +void *val_mem_alloc_at_address (uint64_t mem_base, uint64_t size); +void val_mem_free_at_address (uint64_t mem_base, uint64_t size); +uint32_t val_mpam_get_csumon_count(uint32_t msc_index); +uint32_t val_mpam_supports_csumon(uint32_t msc_index); +uint64_t val_mpam_memory_get_size(uint32_t msc_index, uint32_t rsrc_index); +uint64_t val_mpam_memory_get_base(uint32_t msc_index, uint32_t rsrc_index); +uint32_t val_mpam_supports_cpor(uint32_t msc_index); +uint64_t val_mpam_msc_get_mscbw(uint32_t msc_index, uint32_t rsrc_index); +uint32_t val_mpam_mbwu_supports_long(uint32_t msc_index); +uint32_t val_mpam_mbwu_supports_lwd(uint32_t msc_index); +uint32_t val_mpam_get_max_partid(uint32_t msc_index); +uint32_t val_mpam_msc_get_version(uint32_t msc_index); +uint32_t val_mpam_get_max_pmg(uint32_t msc_index); +void val_mpam_configure_cpor(uint32_t msc_index, uint16_t partid, uint32_t cpbm_percentage); +uint32_t val_mpam_get_cpbm_width(uint32_t msc_index); +void val_mem_issue_dsb(void); +void val_mpam_configure_csu_mon(uint32_t msc_index, uint16_t partid, uint8_t pmg, uint16_t mon_sel); +void val_mpam_csumon_enable(uint32_t msc_index); +void val_mpam_csumon_disable(uint32_t msc_index); +uint32_t val_mpam_read_csumon(uint32_t msc_index); +uint64_t val_srat_get_prox_domain(uint64_t mem_range_index); + + + +uint32_t mpam001_entry(uint32_t num_pe); +uint32_t mpam002_entry(uint32_t num_pe); +uint32_t mpam003_entry(uint32_t num_pe); +uint32_t mpam004_entry(uint32_t num_pe); +uint32_t mpam005_entry(uint32_t num_pe); +uint32_t mpam006_entry(uint32_t num_pe); + +#endif /*__SBSA_AVS_MPAM_H__ */ diff --git a/val/include/sbsa_avs_mpam_reg.h b/val/include/sbsa_avs_mpam_reg.h new file mode 100644 index 00000000..d91852d3 --- /dev/null +++ b/val/include/sbsa_avs_mpam_reg.h @@ -0,0 +1,167 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#ifndef __MPAM_REG_H__ +#define __MPAM_REG_H__ + +/* Macro can be used to declare MASK and SHIFT for bitfields using MSB and LSB */ +#define BITFIELD_DECL(type, name, msb, lsb) \ + const uint32_t name##_SHIFT = lsb; \ + const type name##_MASK = ((((type)0x1) << (msb - lsb + 1)) - 1); + +/* Macro can be used to read bitfields with name##_MASK and name##_SHIFT + already defined or declared for it*/ +#define BITFIELD_READ(name, val) ((val >> name##_SHIFT) & name##_MASK) + +/* Macro can be used to set bitfields with name##_MASK and name##_SHIFT + already defined or declared for it*/ +#define BITFIELD_SET(name, val) ((val & name##_MASK) << name##_SHIFT) + +/* Macro can be used write a particular bitfield with name##_MASK and name##_SHIFT + already defined or declared for it without affecting other fields*/ +#define BITFIELD_WRITE(reg_val, name, val) \ + ((reg_val & ~(name##_MASK << name##_SHIFT)) | val << name##_SHIFT) + +/******************************************************************************* + * MPAM memory mapped register offsets + ******************************************************************************/ +#define REG_MPAMF_IDR 0x0000 +#define REG_MPAMF_SIDR 0x0008 +#define REG_MPAMF_IIDR 0x0018 +#define REG_MPAMF_AIDR 0x0020 +#define REG_MPAMF_IMPL_IDR 0x0028 +#define REG_MPAMF_CPOR_IDR 0x0030 +#define REG_MPAMF_CCAP_IDR 0x0038 +#define REG_MPAMF_MBW_IDR 0x0040 +#define REG_MPAMF_PRI_IDR 0x0048 +#define REG_PARTID_NRW_IDR 0x0050 +#define REG_MPAMF_MSMON_IDR 0x0080 +#define REG_MPAMF_CSUMON_IDR 0x0088 +#define REG_MPAMF_MBWUMON_IDR 0x0090 + +#define REG_MSMON_CFG_MON_SEL 0x0800 +#define REG_MSMON_CAPT_EVNT 0x0808 +#define REG_MSMON_CFG_CSU_FLT 0x0810 +#define REG_MSMON_CFG_CSU_CTL 0x0818 +#define REG_MSMON_CFG_MBWU_FLT 0x0820 +#define REG_MSMON_CFG_MBWU_CTL 0x0828 +#define REG_MSMON_CSU 0x0840 +#define REG_MSMON_CSU_CAPTURE 0x0848 +#define REG_MSMON_CSU_OFSR 0x0858 +#define REG_MSMON_MBWU 0x0860 +#define REG_MSMON_MBWU_CAPTURE 0x0868 +#define REG_MSMON_MBWU_L 0x0880 +#define REG_MSMON_MBWU_L_CAPTURE 0x0890 + +#define REG_MPAMCFG_PART_SEL 0x0100 +#define REG_MPAMCFG_CPBM 0x1000 + +/* MPAMF_IDR bit definitions */ +BITFIELD_DECL(uint64_t, IDR_PARTID_MAX, 15, 0) +BITFIELD_DECL(uint64_t, IDR_PMG_MAX, 23, 16) +BITFIELD_DECL(uint64_t, IDR_HAS_CCAP_PART, 24, 24) +BITFIELD_DECL(uint64_t, IDR_HAS_CPOR_PART, 25, 25) +BITFIELD_DECL(uint64_t, IDR_HAS_MBW_PART, 26, 26) +BITFIELD_DECL(uint64_t, IDR_HAS_MSMON, 30, 30) +BITFIELD_DECL(uint64_t, IDR_HAS_RIS, 32, 32) + +/* MPAMF_AIDR bit definitions */ +BITFIELD_DECL(uint32_t, AIDR_VERSION, 7, 0) + +/* MPAMF_MSMON_IDR bit definitions */ +BITFIELD_DECL(uint32_t, MSMON_IDR_MSMON_CSU, 16, 16) +BITFIELD_DECL(uint32_t, MSMON_IDR_MSMON_MBWU, 17, 17) +BITFIELD_DECL(uint32_t, MSMON_IDR_HAS_LOCAL_CAPT_EVN, 31, 31) + +/* MPAMF_MBWUMON_IDR bit definitions */ +BITFIELD_DECL(uint32_t, MBWUMON_IDR_NUM_MON, 15, 0) +BITFIELD_DECL(uint32_t, MBWUMON_IDR_SCALE, 20, 16) +BITFIELD_DECL(uint32_t, MBWUMON_IDR_LWD, 29, 29) +BITFIELD_DECL(uint32_t, MBWUMON_IDR_HAS_LONG, 30, 30) +BITFIELD_DECL(uint32_t, MBWUMON_IDR_HAS_CAPTURE, 31, 31) + +/* MSMON_CFG_MBWU_FLT bit definitions */ +BITFIELD_DECL(uint32_t, MBWU_FLT_PARTID, 15, 0) +BITFIELD_DECL(uint32_t, MBWU_FLT_PMG, 23, 16) + +/* MSMON_CFG_MBWU_CTL bit definitions */ +BITFIELD_DECL(uint32_t, MBWU_CTL_TYPE, 7, 0) +BITFIELD_DECL(uint32_t, MBWU_CTL_MATCH_PARTID, 16, 16) +BITFIELD_DECL(uint32_t, MBWU_CTL_MATCH_PMG, 17, 17) +BITFIELD_DECL(uint32_t, MBWU_CTL_SUBTYPE, 23, 20) +BITFIELD_DECL(uint32_t, MBWU_CTL_OFLOW_FRZ, 24, 24) +BITFIELD_DECL(uint32_t, MBWU_CTL_OFLOW_INTR, 25, 25) +BITFIELD_DECL(uint32_t, MBWU_CTL_OFLOW_STATUS, 26, 26) +BITFIELD_DECL(uint32_t, MBWU_CTL_CAPT_RESET, 27, 27) +BITFIELD_DECL(uint32_t, MBWU_CTL_CAPT_EVNT, 30, 28) +BITFIELD_DECL(uint32_t, MBWU_CTL_EN, 31, 31) + +/* MSMON_MBWU bit definitions */ +BITFIELD_DECL(uint32_t, MSMON_MBWU_VALUE, 30, 0) +BITFIELD_DECL(uint32_t, MSMON_MBWU_NRDY, 31, 31) + +/* MSMON_MBWU_CAPTURE bit definitions */ +BITFIELD_DECL(uint32_t, MSMON_MBWU_CAPTURE_VALUE, 30, 0) +BITFIELD_DECL(uint32_t, MSMON_MBWU_CAPTURE_NRDY, 31, 31) + +/* MSMON_MBWU_L bit definitions */ +BITFIELD_DECL(uint64_t, MSMON_MBWU_L_NRDY, 63, 63) +BITFIELD_DECL(uint64_t, MSMON_MBWU_L_44BIT_VALUE, 43, 0) +BITFIELD_DECL(uint64_t, MSMON_MBWU_L_63BIT_VALUE, 62, 0) + +/* MSMON_MBWU_L_CAPTURE bit definitions */ +BITFIELD_DECL(uint64_t, MSMON_MBWU_L_CAPTURE_NRDY, 63, 63) +BITFIELD_DECL(uint64_t, MSMON_MBWU_L_CAPTURE_44BIT_VALUE, 43, 0) +BITFIELD_DECL(uint64_t, MSMON_MBWU_L_CAPTURE_63BIT_VALUE, 62, 0) + +/* MSMON_CFG_MON_SEL bit definitions */ +BITFIELD_DECL(uint32_t, MON_SEL_MON_SEL, 15, 0) +BITFIELD_DECL(uint32_t, MON_SEL_RIS, 27, 24) + +/* MPAMCFG_PART_SEL bit definitions */ +BITFIELD_DECL(uint32_t, PART_SEL_PARTID_SEL, 15, 0) +BITFIELD_DECL(uint32_t, PART_SEL_RIS, 27, 24) + +/* MPAMF_CSUMON_IDR bit definitions */ +BITFIELD_DECL(uint32_t, CSUMON_IDR_NUM_MON, 15, 0) + +/* MPAMF_CPOR_IDR bit definitions */ +BITFIELD_DECL(uint32_t, CPOR_IDR_CPBM_WD, 15, 0) + +/* MSMON_CFG_CSU_CTL bit definitions */ +BITFIELD_DECL(uint32_t, CSU_CTL_TYPE, 7, 0) +BITFIELD_DECL(uint32_t, CSU_CTL_MATCH_PARTID, 16, 16) +BITFIELD_DECL(uint32_t, CSU_CTL_MATCH_PMG, 17, 17) +BITFIELD_DECL(uint32_t, CSU_CTL_SUBTYPE, 22, 20) +BITFIELD_DECL(uint32_t, CSU_CTL_OFLOW_FRZ, 24, 24) +BITFIELD_DECL(uint32_t, CSU_CTL_OFLOW_INTR, 25, 25) +BITFIELD_DECL(uint32_t, CSU_CTL_OFLOW_STATUS, 26, 26) +BITFIELD_DECL(uint32_t, CSU_CTL_CAPT_RESET, 27, 27) +BITFIELD_DECL(uint32_t, CSU_CTL_CAPT_EVNT, 30, 28) +BITFIELD_DECL(uint32_t, CSU_CTL_EN, 31, 31) + +/* MSMON_CFG_CSU_FLT bit definitions */ +BITFIELD_DECL(uint32_t, CSU_FLT_PARTID, 15, 0) +BITFIELD_DECL(uint32_t, CSU_FLT_PMG, 23, 16) + +/* MSMON_CSU bit definitions */ +BITFIELD_DECL(uint32_t, MSMON_CSU_VALUE, 30, 0) +BITFIELD_DECL(uint32_t, MSMON_CSU_NRDY, 31, 31) + + + +#endif /*__MPAM_REG_H__ */ diff --git a/val/include/sbsa_avs_pmu.h b/val/include/sbsa_avs_pmu.h new file mode 100644 index 00000000..7bce4eb6 --- /dev/null +++ b/val/include/sbsa_avs_pmu.h @@ -0,0 +1,55 @@ +/** @file + * Copyright (c) 2022-2023 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#ifndef __SBSA_AVS_PMU_H__ +#define __SBSA_AVS_PMU_H__ + +uint64_t val_pmu_get_info(PMU_INFO_e type, uint32_t node_index); +uint8_t val_pmu_supports_dedicated_cycle_counter(uint32_t node_index); +uint32_t val_pmu_get_monitor_count(uint32_t node_index); +void val_pmu_disable_all_monitors(uint32_t node_index); +void val_pmu_enable_all_monitors(uint32_t node_index); +void val_pmu_reset_all_monitors(uint32_t node_index); +uint32_t val_pmu_get_monitor_group_count(uint32_t node_index); +uint32_t val_pmu_get_max_monitor_size(uint32_t node_index); +uint32_t val_pmu_configure_monitor(uint32_t node_index, PMU_EVENT_TYPE_e event_type, + uint32_t mon_inst); +void val_pmu_enable_monitor(uint32_t node_index, uint32_t mon_inst); +void val_pmu_disable_monitor(uint32_t node_index, uint32_t mon_inst); +uint64_t val_pmu_read_count(uint32_t node_index, uint32_t mon_inst); +uint32_t val_pmu_get_node_index(uint64_t prox_domain); +uint32_t val_pmu_implements_pmscr(uint32_t node_index); +uint32_t val_pmu_is_secure(uint32_t node_index); +uint32_t val_pmu_get_multi_traffic_support_interface(uint64_t *interface_acpiid, + uint32_t *num_traffic_type_support); +uint32_t val_pmu_get_index_acpiid(uint64_t interface_acpiid); +uint32_t val_generate_traffic(uint64_t interface_acpiid, uint32_t pmu_node_index, + uint32_t mon_index, uint32_t eventid); +uint32_t val_pmu_check_monitor_count_value(uint64_t interface_acpiid, uint32_t count_value, + uint32_t eventid); + +uint32_t pmu001_entry(uint32_t num_pe); +uint32_t pmu002_entry(uint32_t num_pe); +uint32_t pmu003_entry(uint32_t num_pe); +uint32_t pmu004_entry(uint32_t num_pe); +uint32_t pmu005_entry(uint32_t num_pe); +uint32_t pmu006_entry(uint32_t num_pe); +uint32_t pmu007_entry(uint32_t num_pe); +uint32_t pmu008_entry(uint32_t num_pe); +uint32_t pmu009_entry(uint32_t num_pe); + +#endif /*__SBSA_AVS_PMU_H__ */ diff --git a/val/include/sbsa_avs_pmu_reg.h b/val/include/sbsa_avs_pmu_reg.h new file mode 100644 index 00000000..ce44c5d8 --- /dev/null +++ b/val/include/sbsa_avs_pmu_reg.h @@ -0,0 +1,130 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#ifndef __PMU_REG_H__ +#define __PMU_REG_H__ + +/* Macro can be used to declare MASK and SHIFT for bitfields using MSB and LSB */ +#define BITFIELD_DECL(type, name, msb, lsb) \ + const uint32_t name##_SHIFT = lsb; \ + const type name##_MASK = ((((type)0x1) << (msb - lsb + 1)) - 1); + +/* Macro can be used to read bitfields with name##_MASK and name##_SHIFT + already defined or declared for it*/ +#define BITFIELD_READ(name, val) ((val >> name##_SHIFT) & name##_MASK) + +/* Macro can be used to set bitfields with name##_MASK and name##_SHIFT + already defined or declared for it*/ +#define BITFIELD_SET(name, val) ((val & name##_MASK) << name##_SHIFT) + +/* Macro can be used write a particular bitfield with name##_MASK and name##_SHIFT + already defined or declared for it without affecting other fields*/ +#define BITFIELD_WRITE(reg_val, name, val) \ + ((reg_val & ~(name##_MASK << name##_SHIFT)) | val << name##_SHIFT) + +/******************************************************************************* + * PMU memory mapped register offsets + ******************************************************************************/ +#define REG_PMEVCNTR 0x0000 +#define REG_PMEVCNTR_L 0x0000 +#define REG_PMEVCNTR_H 0x0004 +#define REG_PMCCNTR 0x003C +#define REG_PMCCNTR_L 0x00F8 +#define REG_PMCCNTR_H 0x00FC +#define REG_PMEVTYPER 0x0400 +#define REG_PMCCFILTR 0x047C +#define REG_PMSVR 0x0600 +#define REG_PMEVFILTR 0x0A00 +#define REG_PMCNTENSET 0x0C00 +#define REG_PMCNTENCLR 0x0C20 +#define REG_PMINTENSET 0x0C40 +#define REG_PMINTENCLR 0x0C60 +#define REG_PMOVSCLR 0x0C80 +#define REG_PMOVSSET 0x0CC0 +#define REG_PMCGR 0x0CE0 +#define REG_PMCFGR 0x0E00 +#define REG_PMCR 0x0E04 +#define REG_PMIIDR 0x0E08 +#define REG_PMCEID 0x0E20 +#define REG_PMSSCR 0x0E30 +#define REG_PMSSRR_L 0x0E38 +#define REG_PMSSRR_H 0x0E3C +#define REG_PMSCR_L 0x0E40 +#define REG_PMSCR_H 0x0E44 +#define REG_PMIRQCR0_L 0x0E80 +#define REG_PMIRQCR0_H 0x0E84 +#define REG_PMIRQCR1 0x0E88 +#define REG_PMIRQCR2 0x0E8C +#define REG_PMIRQSR_L 0x0EF8 +#define REG_PMIRQSR_H 0x0EFC +#define REG_PMDEVAFF_L 0x0FA8 +#define REG_PMDEVAFF_H 0x0FAC +#define REG_PMAUTHSTATUS 0x0FB8 +#define REG_PMDEVARCH 0x0FBC +#define REG_PMDEVID 0x0FC8 +#define REG_PMDEVTYPE 0x0FCC +#define REG_PMPIDR4 0x0FD0 +#define REG_PMPIDR5 0x0FD4 +#define REG_PMPIDR6 0x0FD8 +#define REG_PMPIDR7 0x0FDC +#define REG_PMPIDR0 0x0FE0 +#define REG_PMPIDR1 0x0FE4 +#define REG_PMPIDR2 0x0FE8 +#define REG_PMPIDR3 0x0FEC +#define REG_PMCIDR0 0x0FF0 +#define REG_PMCIDR1 0x0FF4 +#define REG_PMCIDR2 0x0FF8 +#define REG_PMCIDR3 0x0FFC + + + +/* PMCFGR bit definitions */ +BITFIELD_DECL(uint32_t, PMCFGR_N, 7, 0) +BITFIELD_DECL(uint32_t, PMCFGR_SIZE, 13, 8) +BITFIELD_DECL(uint32_t, PMCFGR_CC, 14, 14) +BITFIELD_DECL(uint32_t, PMCFGR_CCD, 15, 15) +BITFIELD_DECL(uint32_t, PMCFGR_EX, 16, 16) +BITFIELD_DECL(uint32_t, PMCFGR_NA, 17, 17) +BITFIELD_DECL(uint32_t, PMCFGR_UEN, 19, 19) +BITFIELD_DECL(uint32_t, PMCFGR_MSI, 20, 20) +BITFIELD_DECL(uint32_t, PMCFGR_FZO, 21, 21) +BITFIELD_DECL(uint32_t, PMCFGR_SS, 22, 22) +BITFIELD_DECL(uint32_t, PMCFGR_TRO, 23, 23) +BITFIELD_DECL(uint32_t, PMCFGR_HDBG, 24, 24) +BITFIELD_DECL(uint32_t, PMCFGR_NCG, 31, 28) + +/* PMCR bit configuration */ +BITFIELD_DECL(uint32_t, PMCR_E, 0, 0) +BITFIELD_DECL(uint32_t, PMCR_P, 1, 1) +BITFIELD_DECL(uint32_t, PMCR_C, 2, 2) +BITFIELD_DECL(uint32_t, PMCR_D, 3, 3) +BITFIELD_DECL(uint32_t, PMCR_X, 4, 4) +BITFIELD_DECL(uint32_t, PMCR_DP, 5, 5) +BITFIELD_DECL(uint32_t, PMCR_NA, 8, 8) +BITFIELD_DECL(uint32_t, PMCR_FZO, 9, 9) +BITFIELD_DECL(uint32_t, PMCR_HDBG, 10, 10) +BITFIELD_DECL(uint32_t, PMCR_TRO, 11, 11) + +/* PMSCR_L bit configuration */ +BITFIELD_DECL(uint32_t, PMSCR_SO, 0, 0) +BITFIELD_DECL(uint32_t, PMSCR_NSRA, 1, 1) +BITFIELD_DECL(uint32_t, PMSCR_NSMSI, 2, 2) +BITFIELD_DECL(uint32_t, PMSCR_MSI_MPAM_NS, 3, 3) +BITFIELD_DECL(uint32_t, PMSCR_NAO, 4, 4) +BITFIELD_DECL(uint32_t, PMSCR_IMPL, 31, 31) + +#endif /*__PMU_REG_H__ */ diff --git a/val/include/sbsa_avs_ras.h b/val/include/sbsa_avs_ras.h new file mode 100644 index 00000000..8fbd662c --- /dev/null +++ b/val/include/sbsa_avs_ras.h @@ -0,0 +1,133 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __SBSA_AVS_RAS_H +#define __SBSA_AVS_RAS_H + + +#define ERR_FR_INJ_MASK (0x3ull << 20) +#define ERR_FR_DUI_MASK (0x3ull << 16) +#define ERR_FR_CEC_MASK (0x7ull << 12) +#define ERR_FR_CFI_MASK (0x3ull << 10) +#define ERR_FR_UI_MASK (0x3ull << 4) + +#define ERR_STATUS_V_MASK (0x1 << 30) +#define ERR_STATUS_AV_MASK (0x1 << 31) +#define ERR_STATUS_UE_MASK (0x1 << 29) +#define ERR_STATUS_CE_MASK (0x3 << 24) +#define ERR_STATUS_DE_MASK (0x1 << 23) +#define ERR_STATUS_PN_MASK (0x1 << 22) +#define ERR_STATUS_CI_MASK (0x1 << 19) +#define ERR_STATUS_CLEAR (0xFFF80000) + +#define ERR_CTLR_CLEAR_MASK 0x3FFD +#define ERR_CTLR_ED_ENABLE 0x1 + +#define ERR_ADDR_AI_SHIFT 61 + +#define ERR_PFGCTL_UC_ENABLE (0x1ull << 1) +#define ERR_PFGCTL_DE_ENABLE (0x1ull << 5) +#define ERR_PFGCTL_CE_NON_ENABLE (0x1ull << 6) +#define ERR_PFGCTL_CI_ENABLE (0x1ull << 8) +#define ERR_PFGCTL_CDNEN_ENABLE (0x1ull << 31) + +#define ERR_FR_OFFSET 0x000 +#define ERR_CTLR_OFFSET 0x008 +#define ERR_STATUS_OFFSET 0x010 +#define ERR_ADDR_OFFSET 0x018 +#define ERR_PFGCTL_OFFSET 0x808 +#define ERR_PFGCDN_OFFSET 0x810 +#define ERR_ERRDEVAFF_OFFSET 0xFA8 + +#define RAS_INTERFACE_SR 0x0 +#define RAS_INTERFACE_MMIO 0x1 + +#define AVS_ALL_1_64BIT 0xFFFFFFFFFFFFFFFF + +typedef enum { + RAS_ERR_FR = 0x1, + RAS_ERR_CTLR, + RAS_ERR_STATUS, + RAS_ERR_ADDR, + RAS_ERR_PFGCDN, + RAS_ERR_PFGCTL, + RAS_ERR_ERRDEVAFF +} RAS_REG_LIST; + +typedef enum { + RAS_INFO_NUM_PE = 0x1, /* Number of PE RAS Node */ + RAS_INFO_NUM_MC, /* Number of MC RAS Node */ + RAS_INFO_NUM_NODES, /* Number of RAS Nodes */ + RAS_INFO_NODE_TYPE, /* RAS Node Type */ + RAS_INFO_PE_RES_TYPE, /* PE Resource Type */ + RAS_INFO_MC_RES_PROX_DOMAIN, /* Memory controller RAS node proximity domain */ + RAS_INFO_INTF_TYPE, /* RAS registers interface type */ + RAS_INFO_ADDR_MODE, /* bitmap based policy for ERRADDR field of error records */ + RAS_INFO_BASE_ADDR, /* Base Address */ + RAS_INFO_NUM_ERR_REC, /* Number of Error Record */ + RAS_INFO_START_INDEX, /* Error Record Start Index */ + RAS_INFO_ERR_REC_IMP, /* Error Record Implemented */ + RAS_INFO_STATUS_REPORT, /* Error Status Reporting */ + RAS_INFO_ERI_ID, /* ERI Interrupt ID */ + RAS_INFO_FHI_ID, /* FHI Interrupt ID */ + RAS_INFO_PFG_SUPPORT, /* Pseudo Fault Inj Support */ + RAS_INFO_NODE_INDEX_FOR_AFF /* RAS Node Index for Affinity */ +} RAS_INFO_TYPE; + +uint32_t val_ras_setup_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param); +uint32_t val_ras_inject_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param); +void val_ras_wait_timeout(uint32_t count); + +uint32_t val_ras_check_err_record(uint32_t node_index, uint32_t error_type); +uint32_t val_ras_check_plat_poison_support(void); + +uint64_t val_ras_reg_read(uint32_t node_index, uint32_t reg, uint32_t err_rec_idx); +void val_ras_reg_write(uint32_t node_index, uint32_t reg, uint64_t write_data); + +uint32_t ras001_entry(uint32_t num_pe); +uint32_t ras002_entry(uint32_t num_pe); +uint32_t ras003_entry(uint32_t num_pe); +uint32_t ras004_entry(uint32_t num_pe); +uint32_t ras005_entry(uint32_t num_pe); +uint32_t ras006_entry(uint32_t num_pe); +uint32_t ras007_entry(uint32_t num_pe); +uint32_t ras008_entry(uint32_t num_pe); +uint32_t ras009_entry(uint32_t num_pe); +uint32_t ras010_entry(uint32_t num_pe); +uint32_t ras011_entry(uint32_t num_pe); +uint32_t ras012_entry(uint32_t num_pe); + +uint64_t AA64ReadErrIdr1(void); +uint64_t AA64ReadErrAddr1(void); +uint64_t AA64ReadErrCtlr1(void); +uint64_t AA64ReadErrFr1(void); +uint64_t AA64ReadErrStatus1(void); +uint64_t AA64ReadErrSelr1(void); +uint64_t AA64ReadErrPfgf1(void); +uint64_t AA64ReadErrPfgctl1(void); +uint64_t AA64ReadErrPfgcdn1(void); + +void AA64WriteErrIdr1(uint64_t write_data); +void AA64WriteErrAddr1(uint64_t write_data); +void AA64WriteErrCtlr1(uint64_t write_data); +void AA64WriteErrStatus1(uint64_t write_data); +void AA64WriteErrSelr1(uint64_t write_data); +void AA64WriteErrPfgf1(uint64_t write_data); +void AA64WriteErrPfgctl1(uint64_t write_data); +void AA64WriteErrPfgcdn1(uint64_t write_data); + +#endif // __SBSA_AVS_RAS_H diff --git a/val/src/AArch64/MpamSupport.s b/val/src/AArch64/MpamSupport.s new file mode 100644 index 00000000..17b93837 --- /dev/null +++ b/val/src/AArch64/MpamSupport.s @@ -0,0 +1,54 @@ +#/** @file +# Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +#**/ + +.text +.align 2 + +GCC_ASM_EXPORT(AA64ReadMpam1) +GCC_ASM_EXPORT(AA64WriteMpam1) +GCC_ASM_EXPORT(AA64ReadMpam2) +GCC_ASM_EXPORT(AA64WriteMpam2) +GCC_ASM_EXPORT(AA64ReadMpamidr) +GCC_ASM_EXPORT(AA64IssueDSB) + + +ASM_PFX(AA64ReadMpam1): + mrs x0, mpam1_el1 + ret + +ASM_PFX(AA64WriteMpam1): + msr mpam1_el1, x0 + ret + +ASM_PFX(AA64ReadMpam2): + mrs x0, mpam2_el2 + ret + +ASM_PFX(AA64WriteMpam2): + msr mpam2_el2, x0 + ret + +ASM_PFX(AA64ReadMpamidr): + mrs x0, mpamidr_el1 + ret + +ASM_PFX(AA64IssueDSB): + dsb sy + ret + +ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/val/src/AArch64/RasSupport.S b/val/src/AArch64/RasSupport.S new file mode 100644 index 00000000..12501d07 --- /dev/null +++ b/val/src/AArch64/RasSupport.S @@ -0,0 +1,109 @@ +#/** @file +# Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +#**/ + +.text +.align 2 + +GCC_ASM_EXPORT(AA64ReadErrIdr1) +GCC_ASM_EXPORT(AA64WriteErrIdr1) +GCC_ASM_EXPORT(AA64ReadErrAddr1) +GCC_ASM_EXPORT(AA64WriteErrAddr1) +GCC_ASM_EXPORT(AA64ReadErrCtlr1) +GCC_ASM_EXPORT(AA64WriteErrCtlr1) +GCC_ASM_EXPORT(AA64ReadErrFr1) +GCC_ASM_EXPORT(AA64ReadErrStatus1) +GCC_ASM_EXPORT(AA64WriteErrStatus1) +GCC_ASM_EXPORT(AA64ReadErrSelr1) +GCC_ASM_EXPORT(AA64WriteErrSelr1) +GCC_ASM_EXPORT(AA64ReadErrPfgf1) +GCC_ASM_EXPORT(AA64ReadErrPfgctl1) +GCC_ASM_EXPORT(AA64ReadErrPfgcdn1) +GCC_ASM_EXPORT(AA64WriteErrPfgf1) +GCC_ASM_EXPORT(AA64WriteErrPfgctl1) +GCC_ASM_EXPORT(AA64WriteErrPfgcdn1) + + +ASM_PFX(AA64ReadErrIdr1): + mrs x0, erridr_el1 + ret + +ASM_PFX(AA64WriteErrIdr1): + msr erridr_el1, x0 + ret + +ASM_PFX(AA64ReadErrAddr1): + mrs x0, erxaddr_el1 + ret + +ASM_PFX(AA64WriteErrAddr1): + msr erxaddr_el1, x0 + ret + +ASM_PFX(AA64ReadErrCtlr1): + mrs x0, erxctlr_el1 + ret + +ASM_PFX(AA64WriteErrCtlr1): + msr erxctlr_el1, x0 + ret + +ASM_PFX(AA64ReadErrFr1): + mrs x0, erxfr_el1 + ret + +ASM_PFX(AA64ReadErrStatus1): + mrs x0, erxstatus_el1 + ret + +ASM_PFX(AA64WriteErrStatus1): + msr erxstatus_el1, x0 + ret + +ASM_PFX(AA64ReadErrSelr1): + mrs x0, errselr_el1 + ret + +ASM_PFX(AA64WriteErrSelr1): + msr errselr_el1, x0 + ret + +ASM_PFX(AA64ReadErrPfgf1): + mrs x0, erxpfgf_el1 + ret + +ASM_PFX(AA64WriteErrPfgf1): + msr erxpfgf_el1, x0 + ret + +ASM_PFX(AA64ReadErrPfgctl1): + mrs x0, erxpfgctl_el1 + ret + +ASM_PFX(AA64WriteErrPfgctl1): + msr erxpfgctl_el1, x0 + ret + +ASM_PFX(AA64ReadErrPfgcdn1): + mrs x0, erxpfgcdn_el1 + ret + +ASM_PFX(AA64WriteErrPfgcdn1): + msr erxpfgcdn_el1, x0 + ret + +ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/val/src/avs_mmu.c b/val/src/avs_mmu.c new file mode 100644 index 00000000..0d094148 --- /dev/null +++ b/val/src/avs_mmu.c @@ -0,0 +1,238 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "include/sbsa_avs_val.h" +#include "include/sbsa_avs_common.h" +#include "include/sbsa_avs_mmu.h" +#include "include/sbsa_avs_pgt.h" +#include "include/sbsa_avs_pe.h" +#include "include/sbsa_avs_memory.h" + +static uint32_t log2_func(uint64_t size); + +/** + @brief This API will check whether inputted base address is already + mapped in the translation table or not. + + @param addr - address to be checked. + + @return 0 - if mmu entry is present, 1 otherwise. +**/ +uint32_t +val_mmu_check_for_entry(uint64_t addr) +{ + PE_TCR_BF tcr; + uint64_t ttbr, ttable_entry; + uint64_t tt_base_phys, *tt_base_virt; + uint32_t ias, index, num_pgt_levels, this_level; + uint32_t page_size_log2, bits_per_level, page_size; + uint32_t bits_at_this_level, bits_remaining; + + /* Get translation attributes from TCR and translation table base from TTBR + TTBR0 is used since we are accessing lower address region */ + if (val_pe_reg_read_tcr(0 /*for TTBR0*/, &tcr)) { + val_print(AVS_PRINT_ERR, "\n Failed to fetch TCR", 0); + return 1; + } + + if (val_pe_reg_read_ttbr(0 /*TTBR0*/, &ttbr)) { + val_print(AVS_PRINT_ERR, "\n Failed to fetch TTBR0", 0); + return 1; + } + + /* obtain page size */ + page_size = val_memory_page_size(); + /* number of bits required to index byte location inside the page */ + page_size_log2 = log2_func(page_size); + /* calculate input addr size */ + ias = 64 - tcr.tsz; + /* calculate bits resolved per level for all granule sizes */ + bits_per_level = page_size_log2 - 3; + /* calculate max num of translation levels possible */ + num_pgt_levels = (ias - page_size_log2 + bits_per_level - 1)/bits_per_level; + /* start translation from lowest level */ + this_level = PGT_LEVEL_MAX - num_pgt_levels; + /* bits to translate after first translation */ + bits_remaining = (num_pgt_levels - 1) * bits_per_level + page_size_log2; + /* bits translated at current level */ + bits_at_this_level = ias - bits_remaining; + /* address to first translation table comes from TTBR0 register */ + tt_base_phys = ttbr & AARCH64_TTBR_ADDR_MASK; + + while (this_level < PGT_LEVEL_MAX) { + /* translation starts from most siginificant bits of VA */ + index = (addr >> bits_remaining) & ((0x1u << bits_at_this_level) - 1); + tt_base_virt = (uint64_t *)val_memory_phys_to_virt(tt_base_phys); + /* index the translation table and read the entry */ + ttable_entry = tt_base_virt[index]; + + val_print(AVS_PRINT_INFO, "\n Translation table level = %d", this_level); + val_print(AVS_PRINT_INFO, "\n Table base address = 0x%llx", + (uint64_t)tt_base_virt); + val_print(AVS_PRINT_INFO, "\n Table entry index = %d", index); + val_print(AVS_PRINT_INFO, "\n Table entry = 0x%llx", + ttable_entry); + val_print(AVS_PRINT_INFO, "\n VA bits remaining to be resolve = %d", bits_remaining); + + /* check whether the table entry is invalid */ + if (IS_PGT_ENTRY_INVALID(ttable_entry)) { + val_print(AVS_PRINT_DEBUG, "\n VA not mapped in translation table", 0); + return 1; + } + + /* As per Arm ARM, entry of type "table descriptor" is only + valid at translation level 0 */ + if (this_level == 0 && !IS_PGT_ENTRY_TABLE(ttable_entry)) { + val_print(AVS_PRINT_DEBUG, + "\n VA not mapped correctly in translation table", 0); + return 1; + } + + if (this_level == 3) { + /* at level 3 table entry should be of type "page descriptor" with + ttable_entry[1:0] bits = b11 */ + if (!IS_PGT_ENTRY_PAGE(ttable_entry)) { + val_print(AVS_PRINT_DEBUG, + "\n VA not mapped correctly in translation table", 0); + return 1; + } + else { + val_print(AVS_PRINT_DEBUG, "\n VA translation successful", 0); + return 0; + } + } + + /* check whether table walk hit a block descriptor entry + Note : level 0 table entry can't describe a page or a block + level 3 can only have entry of type page descriptor + (Refer Arm ARM for more info) */ + if (IS_PGT_ENTRY_BLOCK(ttable_entry) && this_level != 0) { + val_print(AVS_PRINT_DEBUG, "\n VA translation successful", 0); + return 0; + } + + /* point to next translation table if table walk still not hit + a page or a block descriptor entry */ + tt_base_phys = ttable_entry & (((0x1ull << (ias - page_size_log2)) - 1) << page_size_log2); + + /* update level and remaining VA bits to resolve */ + ++this_level; + bits_remaining -= bits_at_this_level; + bits_at_this_level = bits_per_level; + } + /* execution should don't reach here */ + return 1; +} + +/** + @brief This API adds translation table entry for memory region specified. + Note : This API should only be used to map memory of type Device. + + @param base_addr - base address of the memory. + @param size - size of the memory region. + + @return 0 - if SUCCESS, 1 otherwise. +**/ +uint32_t +val_mmu_add_entry(uint64_t base_addr, uint64_t size) +{ + pgt_descriptor_t pgt_desc; + memory_region_descriptor_t mem_desc; + uint64_t ttbr; + const uint32_t oas_bit_arr[7] = {32, 36, 40, 42, 44, 48, 52}; /* Physical address sizes */ + + /* init descriptors */ + val_memory_set(&mem_desc, sizeof(mem_desc), 0); + val_memory_set(&pgt_desc, sizeof(pgt_desc), 0); + + /* Get translation attributes from TCR and translation table base from TTBR */ + if (val_pe_reg_read_tcr(0 /*for TTBR0*/, &pgt_desc.tcr)) { + val_print(AVS_PRINT_ERR, "\n Failed to fetch TCR", 0); + return 1; + } + if (val_pe_reg_read_ttbr(0 /*TTBR0*/, &ttbr)) { + val_print(AVS_PRINT_ERR, "\n Failed to fetch TTBR0", 0); + return 1; + } + + /* update pgt descriptor structure with translation table base from TTBR0 */ + pgt_desc.pgt_base = (ttbr & AARCH64_TTBR_ADDR_MASK); + /* only stage one translation */ + pgt_desc.stage = PGT_STAGE1; + + /* realise OAS and IAS from TCR register */ + pgt_desc.oas = oas_bit_arr[pgt_desc.tcr.ps]; + pgt_desc.ias = 64 - pgt_desc.tcr.tsz; + val_print(AVS_PRINT_DEBUG, "\n Input addr size in bits (ias) = %d", pgt_desc.ias); + val_print(AVS_PRINT_DEBUG, "\n Output addr size in bits (oas) = %d\n", pgt_desc.oas); + + /* populate mem descriptor structure with addr region to be mapped and attributes */ + mem_desc.virtual_address = base_addr; + mem_desc.physical_address = base_addr; + mem_desc.length = size; + mem_desc.attributes = ATTR_DEVICE_nGnRnE | (1ull << MEM_ATTR_AF_SHIFT); + + /* update translation table entry(s) for addr region defined by memory descriptor structure */ + if (val_pgt_create(&mem_desc, &pgt_desc)) { + val_print(AVS_PRINT_ERR, " Failed to create MMU translation entry(s)\n", 0); + return 1; + } + return 0; +} + +/** + @brief This API adds translation table entry for memory region specified + if the region is not yet mapped. + Note : This API should only be used to map memory of type Device. + + @param None + + @return 0 if Success, 1 otherwise. +**/ +uint32_t val_mmu_update_entry(uint64_t address, uint32_t size) +{ + + /* If entry is already present return success */ + if (!val_mmu_check_for_entry(address)) { + val_print(AVS_PRINT_DEBUG, "\n Address is already mapped", 0); + return 0; + } + + /* Add the entry and return status */ + return val_mmu_add_entry(address, size); +} + +/** + @brief This is local function is used to get log base 2 of input value. + + @param value - input value + + @return result +**/ +static uint32_t log2_func(uint64_t value) +{ + int bit = 0; + + while (value != 0) + { + if (value & 1) + return bit; + value >>= 1; + ++bit; + } + return 0; +} diff --git a/val/src/avs_mpam.c b/val/src/avs_mpam.c new file mode 100644 index 00000000..c379697f --- /dev/null +++ b/val/src/avs_mpam.c @@ -0,0 +1,1073 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "include/sbsa_avs_val.h" +#include "include/sbsa_avs_common.h" +#include "include/sbsa_avs_mpam.h" +#include "include/sbsa_avs_mpam_reg.h" + +static MPAM_INFO_TABLE *g_mpam_info_table; +static SRAT_INFO_TABLE *g_srat_info_table; +static HMAT_INFO_TABLE *g_hmat_info_table; + +/** + @brief This API executes all the MPAM tests sequentially + 1. Caller - Application layer. + 2. Prerequisite - val_mpam_create_info_table + @param level - level of compliance being tested for. + @param num_pe - the number of PE to run these tests on. + @return Consolidated status of all the tests run. +**/ +uint32_t +val_mpam_execute_tests(uint32_t level, uint32_t num_pe) +{ + uint32_t status = AVS_STATUS_FAIL, i; + uint32_t msc_node_cnt; + + for (i = 0; i < MAX_TEST_SKIP_NUM; i++) { + if (g_skip_test_num[i] == AVS_MPAM_TEST_NUM_BASE) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all MPAM tests \n", 0); + return AVS_STATUS_SKIP; + } + } + + if (g_single_module != SINGLE_MODULE_SENTINEL && g_single_module != AVS_MPAM_TEST_NUM_BASE && + (g_single_test == SINGLE_MODULE_SENTINEL || + (g_single_test - AVS_MPAM_TEST_NUM_BASE > 100 || + g_single_test - AVS_MPAM_TEST_NUM_BASE < 0))) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all MPAM tests \n", 0); + val_print(AVS_PRINT_TEST, " (Running only a single module)\n", 0); + return AVS_STATUS_SKIP; + } + + /* check if PE supports MPAM extension, else skip all MPAM tests */ + if (val_pe_feat_check(PE_FEAT_MPAM)) { + val_print(AVS_PRINT_TEST, + "\n PE MPAM extension unimplemented. Skipping all MPAM tests\n", 0); + return AVS_STATUS_SKIP; + } + + g_curr_module = 1 << MPAM_MODULE; + + /* run tests which don't check MPAM MSCs */ + if (g_sbsa_level > 6) + status = mpam001_entry(num_pe); + + msc_node_cnt = val_mpam_get_msc_count(); + if (msc_node_cnt == 0) { + val_print(AVS_PRINT_TEST, + "\n MPAM MSCs not found. Skipping remaining MPAM tests\n", 0); + return AVS_STATUS_SKIP; + } + + if (g_sbsa_level > 6) { + status |= mpam002_entry(num_pe); + status |= mpam003_entry(num_pe); + status |= mpam004_entry(num_pe); + status |= mpam005_entry(num_pe); + status |= mpam006_entry(num_pe); + val_print_test_end(status, "MPAM"); + } + + return status; +} + +/** + @brief This API provides a 'C' interface to call MPAM system register reads + 1. Caller - Test Suite + 2. Prerequisite - None + @param reg_id - the system register index for which data is returned. + @return the value read from the system register. +**/ +uint64_t +val_mpam_reg_read(MPAM_SYS_REGS reg_id) +{ + switch (reg_id) { + case MPAMIDR_EL1: + return AA64ReadMpamidr(); + case MPAM2_EL2: + return AA64ReadMpam2(); + case MPAM1_EL1: + return AA64ReadMpam1(); + default: + val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), + RESULT_FAIL(g_sbsa_level, 0, STATUS_SYS_REG_ACCESS_FAIL), NULL); + } + + return 0; +} + +/** + @brief This API provides a 'C' interface to call MPAM system register writes + 1. Caller - Test Suite + 2. Prerequisite - None + @param reg_id - the system register index for which data is written + @param write_data - the 64-bit data to write to the system register + @return None +**/ +void +val_mpam_reg_write(MPAM_SYS_REGS reg_id, uint64_t write_data) +{ + switch (reg_id) { + case MPAM2_EL2: + AA64WriteMpam2(write_data); + break; + case MPAM1_EL1: + AA64WriteMpam1(write_data); + break; + default: + val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), + RESULT_FAIL(g_sbsa_level, 0, STATUS_SYS_REG_ACCESS_FAIL), NULL); + } + + return; +} + +/** + @brief This API returns requested MSC or resource info. + + @param type - the type of information being requested. + @param msc_index - index of the MSC node in the MPAM info table. + @param rsrc_index - index of the resource node in the MPAM MSC node if resource + related info is requested, set this parameter 0 otherwise. + + @return requested data if found, otherwise MPAM_INVALID_INFO. +**/ +uint64_t +val_mpam_get_info(MPAM_INFO_e type, uint32_t msc_index, uint32_t rsrc_index) +{ + uint32_t i = 0; + MPAM_MSC_NODE *msc_entry; + + if (g_mpam_info_table == NULL) { + val_print(AVS_PRINT_WARN, "\n MPAM info table not found", 0); + return MPAM_INVALID_INFO; + } + + if (msc_index > g_mpam_info_table->msc_count) { + val_print(AVS_PRINT_ERR, "Invalid MSC index = 0x%lx ", msc_index); + return 0; + } + + /* Walk the MPAM info table and return requested info */ + msc_entry = &g_mpam_info_table->msc_node[0]; + for (i = 0; i < g_mpam_info_table->msc_count; i++, msc_entry = MPAM_NEXT_MSC(msc_entry)) { + if (msc_index == i) { + if (rsrc_index > msc_entry->rsrc_count - 1) { + val_print(AVS_PRINT_ERR, + "\n Invalid MSC resource index = 0x%lx for", rsrc_index); + val_print(AVS_PRINT_ERR, "MSC index = 0x%lx ", msc_index); + return MPAM_INVALID_INFO; + } + switch (type) { + case MPAM_MSC_RSRC_COUNT: + return msc_entry->rsrc_count; + case MPAM_MSC_RSRC_RIS: + return msc_entry->rsrc_node[rsrc_index].ris_index; + case MPAM_MSC_RSRC_TYPE: + return msc_entry->rsrc_node[rsrc_index].locator_type; + case MPAM_MSC_RSRC_DESC1: + return msc_entry->rsrc_node[rsrc_index].descriptor1; + case MPAM_MSC_BASE_ADDR: + return msc_entry->msc_base_addr; + case MPAM_MSC_ADDR_LEN: + return msc_entry->msc_addr_len; + case MPAM_MSC_NRDY: + return msc_entry->max_nrdy; + default: + val_print(AVS_PRINT_ERR, + "\n This MPAM info option for type %d is not supported", type); + return MPAM_INVALID_INFO; + } + } + } + return MPAM_INVALID_INFO; +} + +/** + @brief This API returns requested Base address or Address length or num of mem ranges info. + 1. Caller - Test Suite + 2. Prerequisite - val_srat_create_info_table + @param type - the type of information being requested. + @param data - proximity domain or uid. + + @return requested data if found, otherwise SRAT_INVALID_INFO. +**/ +uint64_t +val_srat_get_info(SRAT_INFO_e type, uint64_t data) +{ + uint32_t i = 0; + + if (g_srat_info_table == NULL) { + val_print(AVS_PRINT_WARN, "\n SRAT info table not found", 0); + return SRAT_INVALID_INFO; + } + + switch (type) { + case SRAT_MEM_NUM_MEM_RANGE: + return g_srat_info_table->num_of_mem_ranges; + case SRAT_MEM_BASE_ADDR: + for (i = 0; i < g_srat_info_table->num_of_srat_entries; i++) { + if (g_srat_info_table->srat_info[i].node_type == SRAT_NODE_MEM_AFF) { + if (data == g_srat_info_table->srat_info[i].node_data.mem_aff.prox_domain) { + return g_srat_info_table->srat_info[i].node_data.mem_aff.addr_base; + } + } + } + break; + case SRAT_MEM_ADDR_LEN: + for (i = 0; i < g_srat_info_table->num_of_srat_entries; i++) { + if (g_srat_info_table->srat_info[i].node_type == SRAT_NODE_MEM_AFF) { + if (data == g_srat_info_table->srat_info[i].node_data.mem_aff.prox_domain) { + return g_srat_info_table->srat_info[i].node_data.mem_aff.addr_len; + } + } + } + break; + case SRAT_GICC_PROX_DOMAIN: + for (i = 0; i < g_srat_info_table->num_of_srat_entries; i++) { + if (g_srat_info_table->srat_info[i].node_type == SRAT_NODE_GICC_AFF) { + if (data == g_srat_info_table->srat_info[i].node_data.gicc_aff.proc_uid) { + return g_srat_info_table->srat_info[i].node_data.gicc_aff.prox_domain; + } + } + } + break; + case SRAT_GICC_PROC_UID: + for (i = 0; i < g_srat_info_table->num_of_srat_entries; i++) { + if (g_srat_info_table->srat_info[i].node_type == SRAT_NODE_GICC_AFF) { + if (data == g_srat_info_table->srat_info[i].node_data.gicc_aff.prox_domain) { + return g_srat_info_table->srat_info[i].node_data.gicc_aff.proc_uid; + } + } + } + return SRAT_INVALID_INFO; + break; + case SRAT_GICC_REMOTE_PROX_DOMAIN: + for (i = 0; i < g_srat_info_table->num_of_srat_entries; i++) { + if (g_srat_info_table->srat_info[i].node_type == SRAT_NODE_GICC_AFF) { + if (g_srat_info_table->srat_info[i].node_data.gicc_aff.prox_domain != data) { + return g_srat_info_table->srat_info[i].node_data.gicc_aff.prox_domain; + } + } + } + return SRAT_INVALID_INFO; + break; + default: + val_print(AVS_PRINT_ERR, + "\n This SRAT info option for type %d is not supported", type); + break; + } + return SRAT_INVALID_INFO; +} + +/** + @brief This API returns proximity domain mapped to the memory range. + + @param none + @return proximity domain +**/ +uint64_t +val_srat_get_prox_domain(uint64_t mem_range_index) +{ + uint32_t i = 0; + + if (g_srat_info_table == NULL) { + val_print(AVS_PRINT_WARN, "\n SRAT info table not found", 0); + return SRAT_INVALID_INFO; + } + + if (mem_range_index > g_srat_info_table->num_of_mem_ranges) { + val_print(AVS_PRINT_WARN, "\n Invalid index", 0); + return SRAT_INVALID_INFO; + } + + for (i = 0; i < g_srat_info_table->num_of_mem_ranges; i++) { + if (g_srat_info_table->srat_info[i].node_type == SRAT_NODE_MEM_AFF) { + if (mem_range_index == 0) + return g_srat_info_table->srat_info[i].node_data.mem_aff.prox_domain; + else + mem_range_index--; + } + } + return SRAT_INVALID_INFO; +} + +/** + * @brief This API returns numbers of MPAM MSC nodes in the system. + * + * @param None + * @return number of MPAM MSC nodes + */ +uint32_t +val_mpam_get_msc_count(void) +{ + if (g_mpam_info_table == NULL) { + val_print(AVS_PRINT_WARN, "\n MPAM info table not found", 0); + return 0; + } + else + return g_mpam_info_table->msc_count; +} + +/** + @brief This API returns MSC MAPAM version + @param msc_index - index of the MSC node in the MPAM info table. + @return msc mpam version. +**/ +uint32_t +val_mpam_msc_get_version(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(AIDR_VERSION, val_mmio_read(base + REG_MPAMF_AIDR)); +} + +/** + @brief This API checks whether resource monitoring is supported by the MPAM MSC. + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_msc_supports_mon(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(IDR_HAS_MSMON, val_mmio_read(base + REG_MPAMF_IDR)); +} + +/** + @brief This API checks whether MSC has cache portion partitioning. + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_supports_cpor(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(IDR_HAS_CPOR_PART, val_mmio_read(base + REG_MPAMF_IDR)); +} + +/** + @brief This API checks whether resource instance selection (RIS) implemented + for the MSC. + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_msc_supports_ris(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(IDR_HAS_RIS, val_mmio_read(base + REG_MPAMF_IDR)); +} + +/** + @brief This API checks if the MSC supports Memory Bandwidth Usage Monitor (MBWU) + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_msc_supports_mbwumon(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + if (val_mpam_msc_supports_mon(msc_index)) + return BITFIELD_READ(MSMON_IDR_MSMON_MBWU, val_mmio_read(base + REG_MPAMF_MSMON_IDR)); + else + return 0; +} + +/** + @brief This API returns max bandwidth supported by a memory interface with mbwu attached + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint64_t +val_mpam_msc_get_mscbw(uint32_t msc_index, uint32_t rsrc_index) +{ + uint64_t prox_domain; + uint32_t i = 0; + + prox_domain = val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index); + + if (g_hmat_info_table == NULL) { + val_print(AVS_PRINT_WARN, "\n HMAT info table not found", 0); + return HMAT_INVALID_INFO; + } + + for (i = 0; i < g_hmat_info_table->num_of_mem_prox_domain ; i++) { + if (g_hmat_info_table->bw_info[i].mem_prox_domain == prox_domain) { + return (g_hmat_info_table->bw_info[i].write_bw + + g_hmat_info_table->bw_info[i].read_bw); + } + } + val_print(AVS_PRINT_WARN, "\n Invalid Proximity domain 0x%lx", prox_domain); + return HMAT_INVALID_INFO; +} + +/** + @brief This API checks if the MBWU supports 44-bit ot 64-bit counter + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_mbwu_supports_long(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(MBWUMON_IDR_HAS_LONG, val_mmio_read(base + REG_MPAMF_MBWUMON_IDR)); +} + +/** + @brief This API checks if the MBWU supports 64 bit counter + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_mbwu_supports_lwd(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(MBWUMON_IDR_LWD, val_mmio_read(base + REG_MPAMF_MBWUMON_IDR)); +} + +/** + @brief This API checks if the MSC supports Cache Usage Monitor (CSU) + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_supports_csumon(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + if (val_mpam_msc_supports_mon(msc_index)) + return BITFIELD_READ(MSMON_IDR_MSMON_CSU, val_mmio_read(base + REG_MPAMF_MSMON_IDR)); + else + return 0; +} + +/** + @brief This API checks if the MSC supports Cache Usage Monitor (CSU) + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + @param msc_index - index of the MSC node in the MPAM info table. + @return 1 if supported 0 otherwise. +**/ +uint32_t +val_mpam_get_csumon_count(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(CSUMON_IDR_NUM_MON, val_mmio_read(base + REG_MPAMF_CSUMON_IDR)); +} + +/** + @brief This API configures MPAM MBWU selection registers. + Prerequisite - val_mpam_msc_supports_ris + This API should only be used for MSC supporting RIS. + + @param msc_index - index of the MSC node in the MPAM info table. + @param rsrc_index - index of the resource node in the MPAM MSC node. + + @return null +**/ +void +val_mpam_memory_configure_ris_sel(uint32_t msc_index, uint32_t rsrc_index) +{ + addr_t base; + uint32_t data; + uint8_t ris_index; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + ris_index = val_mpam_get_info(MPAM_MSC_RSRC_RIS, msc_index, rsrc_index); + + /*configure MSMON_CFG_MON_SEL.RIS field and write MSMON_CFG_MON_SEL.MON_SEL + field to be 0 */ + data = BITFIELD_SET(MON_SEL_RIS, ris_index); + val_mmio_write(base + REG_MSMON_CFG_MON_SEL, data); + + /* configure MPAMCFG_PART_SEL.RIS field and write MPAMCFG_PART_SEL. + PARTID_SEL field to DEFAULT PARTID*/ + data = BITFIELD_SET(PART_SEL_RIS, ris_index) + | BITFIELD_SET(PART_SEL_PARTID_SEL, DEFAULT_PARTID); + val_mmio_write(base + REG_MPAMCFG_PART_SEL, data); +} + +/** + @brief This API configures the bandwidth usage monitor. + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support MBWU monitoring, can be checked + using val_mpam_msc_supports_mbwumon API. + + @param msc_index - index of the MSC node in the MPAM info table. + @return None +**/ +void +val_mpam_memory_configure_mbwumon(uint32_t msc_index) +{ + uint32_t data = 0; + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /* select monitor instance zero by writing zero to MSMON_CFG_MON_SEL.MON_SEL */ + data = val_mmio_read(base + REG_MSMON_CFG_MON_SEL); + /* retaining other configured fields e.g, RIS index if supported */ + data = BITFIELD_WRITE(data, MON_SEL_MON_SEL, 0); + val_mmio_write(base + REG_MSMON_CFG_MON_SEL, data); + + /* disable monitor instance before configuration */ + val_mpam_memory_mbwumon_disable(msc_index); + + /* configure monitor ctrl reg for default partid and default pmg */ + data = BITFIELD_SET(MBWU_CTL_MATCH_PARTID, 1) | BITFIELD_SET(MBWU_CTL_MATCH_PMG, 1); + val_mmio_write(base + REG_MSMON_CFG_MBWU_CTL, data); + + /* configure monitor filter reg for default partid and default pmg */ + data = BITFIELD_SET(MBWU_FLT_PARTID, DEFAULT_PARTID) | BITFIELD_SET(MBWU_FLT_PMG, DEFAULT_PMG); + val_mmio_write(base + REG_MSMON_CFG_MBWU_FLT, data); + + /* reset the MBWU monitor count */ + val_mpam_memory_mbwumon_reset(msc_index); +} + +/** + @brief This API enables the bandwidth usage monitor. + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support MBWU monitoring, can be checked + using val_mpam_msc_supports_mbwumon API.. + + @param msc_index - index of the MSC node in the MPAM info table. +**/ +void +val_mpam_memory_mbwumon_enable(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + /* enable the monitor instance to collect information according to the configuration */ + val_mmio_write(base + REG_MSMON_CFG_MBWU_CTL, BITFIELD_SET(MBWU_CTL_EN, 1)); +} + +/** + @brief This API disables the bandwidth usage monitor. + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support MBWU monitoring, can be checked + using val_mpam_msc_supports_mbwumon API. + + @param msc_index - index of the MSC node in the MPAM info table. +**/ +void +val_mpam_memory_mbwumon_disable(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + /* disable the monitor */ + val_mmio_write(base + REG_MSMON_CFG_MBWU_CTL, BITFIELD_SET(MBWU_CTL_EN, 0)); +} + +/** + @brief This API reads the MBWU montior counter value. + Prerequisite - val_mpam_memory_configure_mbwumon, + This API can be called only after configuring MBWU monitor. + + @param msc_index - MPAM feature page index for this MSC. + @return MPAM_MON_NOT_READY if monitor has Not Ready status, + else counter value. +**/ +uint64_t +val_mpam_memory_mbwumon_read_count(uint32_t msc_index) +{ + addr_t base; + uint64_t count = MPAM_MON_NOT_READY; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /*if MSMON_MBWU_L is implemented*/ + if (BITFIELD_READ(MBWUMON_IDR_LWD, val_mmio_read64(base + REG_MPAMF_MBWUMON_IDR))) { + if (BITFIELD_READ(MBWUMON_IDR_HAS_LONG, val_mmio_read64(base + REG_MPAMF_MBWUMON_IDR))) { + // (63 bits) + if (BITFIELD_READ(MSMON_MBWU_L_NRDY, val_mmio_read64(base + REG_MSMON_MBWU_L)) == 0) + count = BITFIELD_READ(MSMON_MBWU_L_63BIT_VALUE, + val_mmio_read64(base + REG_MSMON_MBWU_L)); + } + else { + // (44 bits) + if (BITFIELD_READ(MSMON_MBWU_L_NRDY, val_mmio_read64(base + REG_MSMON_MBWU_L) == 0)) + count = BITFIELD_READ(MSMON_MBWU_L_44BIT_VALUE, + val_mmio_read64(base + REG_MSMON_MBWU_L)); + } + } + else { + // (31 bits) + if (BITFIELD_READ(MSMON_MBWU_NRDY, val_mmio_read(base + REG_MSMON_MBWU)) == 0) { + count = BITFIELD_READ(MSMON_MBWU_VALUE, + val_mmio_read(base + REG_MSMON_MBWU)); + /* shift the count if scaling is enabled */ + count = count << BITFIELD_READ(MBWUMON_IDR_SCALE, + val_mmio_read(base + REG_MPAMF_MBWUMON_IDR)); + } + } + return(count); +} + +/** + @brief This API resets the MBWU montior counter value. + Prerequisite - val_mpam_memory_configure_mbwumon, + This API can be called only after configuring MBWU monitor. + + @param msc_index - MPAM feature page index for this MSC. + @return None +**/ +void +val_mpam_memory_mbwumon_reset(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /*if MSMON_MBWU_L is implemented*/ + if (BITFIELD_READ(MBWUMON_IDR_LWD, val_mmio_read64(base + REG_MPAMF_MBWUMON_IDR))) + val_mmio_write64(base + REG_MSMON_MBWU_L, 0); + else + val_mmio_write(base + REG_MSMON_MBWU, 0); +} + + +/** + @brief Creates a buffer with length equal to size within the + address range (mem_base, mem_base + mem_size) + + @param mem_base - Base address of the memory range + @param size - Buffer size to be created + + @return Buffer address if SUCCESSFUL, else NULL +**/ +void * +val_mem_alloc_at_address(uint64_t mem_base, uint64_t size) +{ + return pal_mem_alloc_at_address(mem_base, size); +} + +/** + @brief Frees the allocated buffer with length equal to size within the + address range (mem_base, mem_base + mem_size) + + @param mem_base - Base address of the memory range + @param size - Buffer size to be created + + @return Buffer address if SUCCESSFUL, else NULL +**/ +void +val_mem_free_at_address(uint64_t mem_base, uint64_t size) +{ + return pal_mem_free_at_address(mem_base, size); +} +/** + @brief Creates a buffer with length equal to size within the + address range (mem_base, mem_base + mem_size) + + @param mem_base - Base address of the memory range + @param mem_size - Size of the memory range of interest + @param size - Buffer size to be created + + @return Buffer address if SUCCESSFUL, else NULL +**/ +uint64_t val_mpam_memory_get_size(uint32_t msc_index, uint32_t rsrc_index) +{ + uint64_t prox_domain; + + prox_domain = val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index); + return val_srat_get_info(SRAT_MEM_ADDR_LEN, prox_domain); +} + +/** + @brief Creates a buffer with length equal to size within the + address range (mem_base, mem_base + mem_size) + + @param mem_base - Base address of the memory range + @param mem_size - Size of the memory range of interest + @param size - Buffer size to be created + + @return Buffer address if SUCCESSFUL, else NULL +**/ +uint64_t val_mpam_memory_get_base(uint32_t msc_index, uint32_t rsrc_index) +{ + uint64_t prox_domain; + + prox_domain = val_mpam_get_info(MPAM_MSC_RSRC_DESC1, msc_index, rsrc_index); + return val_srat_get_info(SRAT_MEM_BASE_ADDR, prox_domain); +} + +/** + @brief This API will call PAL layer to fill in the MPAM table information + into the g_mpam_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param mpam_info_table pre-allocated memory pointer for cache info. + @return Error if Input parameter is NULL +**/ +void +val_mpam_create_info_table(uint64_t *mpam_info_table) +{ + if (mpam_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\n Pre-allocated memory pointer is NULL \n", 0); + return; + } + + g_mpam_info_table = (MPAM_INFO_TABLE *)mpam_info_table; +#ifndef TARGET_LINUX + pal_mpam_create_info_table(g_mpam_info_table); + + val_print(AVS_PRINT_TEST, + " MPAM INFO: Number of MSC nodes : %d \n", g_mpam_info_table->msc_count); +#endif +} + +/** + @brief This API frees the memory allocated for MPAM info table. + @param None + @return None +**/ +void +val_mpam_free_info_table(void) +{ + pal_mem_free((void *)g_mpam_info_table); +} + +/** + @brief This API will call PAL layer to fill in the HMAT table information + into the g_hmat_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param hmat_info_table pre-allocated memory pointer for cache info. + @return Error if Input parameter is NULL +**/ +void +val_hmat_create_info_table(uint64_t *hmat_info_table) +{ + if (hmat_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\n Pre-allocated memory pointer is NULL \n", 0); + return; + } +#ifndef TARGET_LINUX + g_hmat_info_table = (HMAT_INFO_TABLE *)hmat_info_table; + + pal_hmat_create_info_table(g_hmat_info_table); + + if (g_hmat_info_table->num_of_mem_prox_domain != 0) + val_print(AVS_PRINT_TEST, + " HMAT INFO: Number of Prox domains : %d \n", + g_hmat_info_table->num_of_mem_prox_domain); +#endif +} + +/** + @brief This API frees the memory allocated for HMAT info table. + @param None + @return None +**/ +void +val_hmat_free_info_table(void) +{ + pal_mem_free((void *)g_hmat_info_table); +} + +/** + @brief This API will call PAL layer to fill in the SRAT table information + into the g_hmat_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param srat_info_table pre-allocated memory pointer for cache info. + @return Error if Input parameter is NULL +**/ +void +val_srat_create_info_table(uint64_t *srat_info_table) +{ + if (srat_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\n Pre-allocated memory pointer is NULL \n", 0); + return; + } +#ifndef TARGET_LINUX + g_srat_info_table = (SRAT_INFO_TABLE *)srat_info_table; + + pal_srat_create_info_table(g_srat_info_table); + + if (g_srat_info_table->num_of_mem_ranges != 0) + val_print(AVS_PRINT_TEST, + " SRAT INFO: Number of Memory Ranges : %d \n", + g_srat_info_table->num_of_mem_ranges); +#endif +} + +/** + @brief This API frees the memory allocated for SRAT info table. + @param None + @return None +**/ +void +val_srat_free_info_table(void) +{ + pal_mem_free((void *)g_srat_info_table); +} + +/** + @brief This API gets maximum supported value of PMG + @param msc_index - index of the MSC node in the MPAM info table. + @return PMG value. +**/ +uint32_t +val_mpam_get_max_pmg(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(IDR_PMG_MAX, val_mmio_read(base + REG_MPAMF_IDR)); +} + +/** + @brief This API gets Maximum supported value of PARTID + @param msc_index - index of the MSC node in the MPAM info table. + @return Partion ID value. +**/ +uint32_t +val_mpam_get_max_partid(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + return BITFIELD_READ(IDR_PARTID_MAX, val_mmio_read(base + REG_MPAMF_IDR)); +} + +/** + @brief This API Configures CPOR settings for given MSC + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support CSU monitoring, can be checked + using val_mpam_supports_csumon API. + @param msc_index - index of the MSC node in the MPAM info table. + @param partid - PATRTID for CPOR configuration + @param cpbm_percentage - Percentage of cache to be partitioned + @return void. +**/ +void +val_mpam_configure_cpor(uint32_t msc_index, uint16_t partid, uint32_t cpbm_percentage) +{ + addr_t base; + uint16_t index; + uint32_t unset_bitmask; + uint32_t num_unset_bits; + uint16_t num_cpbm_bits; + uint32_t data; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /* Get CPBM width */ + num_cpbm_bits = val_mpam_get_cpbm_width(msc_index); + + /* retaining other configured fields e.g, RIS index if supported */ + data = val_mmio_read(base + REG_MPAMCFG_PART_SEL); + + /* Select PARTID */ + data = BITFIELD_WRITE(data, PART_SEL_PARTID_SEL, partid); + val_mmio_write(base + REG_MPAMCFG_PART_SEL, partid); + + /* + * Configure CPBM register to have a 1 in cpbm_percentage + * bits in the overall CPBM_WD bit positions + */ + num_cpbm_bits = (num_cpbm_bits * cpbm_percentage) / 100 ; + for (index = 0; index < num_cpbm_bits - 31; index += 32) + val_mmio_write(base + REG_MPAMCFG_CPBM + index, CPOR_BITMAP_DEF_VAL); + + /* Unset bits from above step are set */ + num_unset_bits = num_cpbm_bits - index; + unset_bitmask = (1 << num_unset_bits) - 1; + if (unset_bitmask) + val_mmio_write(base + REG_MPAMCFG_CPBM + index, unset_bitmask); + + /* Issue a DSB instruction */ + val_mem_issue_dsb(); + + return; +} + +/** + @brief This API gets CPBM width + @param msc_index - index of the MSC node in the MPAM info table. + @return Number of bits in the cache portion partitioning bit map. +**/ +uint32_t +val_mpam_get_cpbm_width(uint32_t msc_index) +{ + addr_t base; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + if (val_mpam_supports_cpor(msc_index)) + return BITFIELD_READ(CPOR_IDR_CPBM_WD, val_mmio_read(base + REG_MPAMF_CPOR_IDR)); + else + return 0; +} + +/** + @brief This API issues a DSB Memory barrier instruction + @param None + @return None +**/ +void +val_mem_issue_dsb(void) +{ + AA64IssueDSB(); +} + +/** + @brief This API configures the cache storage usage monitor. + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support CSU monitoring, can be checked + using val_mpam_supports_csumon API. + + @param msc_index - index of the MSC node in the MPAM info table. + @return None +**/ +void +val_mpam_configure_csu_mon(uint32_t msc_index, uint16_t partid, uint8_t pmg, uint16_t mon_sel) +{ + addr_t base; + uint32_t data; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /* retaining other configured fields e.g, RIS index if supported */ + data = val_mmio_read(base + REG_MSMON_CFG_MON_SEL); + /* Select the monitor instance */ + data = BITFIELD_WRITE(data, MON_SEL_MON_SEL, mon_sel); + val_mmio_write(base + REG_MSMON_CFG_MON_SEL, data); + + /* Configure the CSU monitor filter register for input PARTID & PMG */ + data = BITFIELD_SET(CSU_FLT_PARTID, partid) | BITFIELD_SET(CSU_FLT_PMG, pmg); + val_mmio_write(base + REG_MSMON_CFG_CSU_FLT, data); + + /*Disable the monitor */ + val_mpam_csumon_disable(msc_index); + + /* Configure the CSU monitor control register to match input PARTID & PMG */ + data = BITFIELD_SET(CSU_CTL_MATCH_PARTID, 1) | BITFIELD_SET(CSU_CTL_MATCH_PMG, 1); + val_mmio_write(base + REG_MSMON_CFG_CSU_CTL, data); + + /* Issue a DSB instruction */ + val_mem_issue_dsb(); + + return; +} + +/** + @brief This API enables the Cache storage usage monitor. + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support CSU monitoring, can be checked + using val_mpam_supports_csumon API.. + + @param msc_index - index of the MSC node in the MPAM info table. +**/ +void +val_mpam_csumon_enable(uint32_t msc_index) +{ + addr_t base; + uint32_t data; + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /* enable the monitor instance to collect information according to the configuration */ + data = BITFIELD_WRITE(val_mmio_read(base + REG_MSMON_CFG_CSU_CTL), CSU_CTL_EN, 1); + val_mmio_write(base + REG_MSMON_CFG_CSU_CTL, data); +} + +/** + @brief This API disables the Cache strorage usage monitor. + Prerequisite - If MSC supports RIS, Resource instance should be + selected using val_mpam_memory_configure_ris_sel + prior calling this API. + - MSC should support CSU monitoring, can be checked + using val_mpam_supports_csumon API. + + @param msc_index - index of the MSC node in the MPAM info table. + @return None +**/ +void +val_mpam_csumon_disable(uint32_t msc_index) +{ + addr_t base; + uint32_t data; + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + + /* enable the monitor instance to collect information according to the configuration */ + data = BITFIELD_WRITE(val_mmio_read(base + REG_MSMON_CFG_CSU_CTL), CSU_CTL_EN, 0); + val_mmio_write(base + REG_MSMON_CFG_CSU_CTL, data); +} + +/** + @brief This API reads the CSU montior counter value. + Prerequisite - val_mpam_configure_csu_mon, + This API can be called only after configuring CSU monitor. + + @param msc_index - MPAM feature page index for this MSC. + @return 0 if monitor has Not Ready status, + else counter value. +**/ +uint32_t +val_mpam_read_csumon(uint32_t msc_index) +{ + addr_t base; + uint32_t count; + + base = val_mpam_get_info(MPAM_MSC_BASE_ADDR, msc_index, 0); + if (BITFIELD_READ(MSMON_CSU_NRDY, val_mmio_read(base + REG_MSMON_CSU)) == 0) { + count = BITFIELD_READ(MSMON_CSU_VALUE, + val_mmio_read(base + REG_MSMON_CSU)); + return count; + } + return 0; +} diff --git a/val/src/avs_pmu.c b/val/src/avs_pmu.c new file mode 100644 index 00000000..383681a3 --- /dev/null +++ b/val/src/avs_pmu.c @@ -0,0 +1,555 @@ +/** @file + * Copyright (c) 2022-2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "include/sbsa_avs_val.h" +#include "include/sbsa_avs_common.h" +#include "include/sbsa_avs_pmu.h" +#include "include/sbsa_avs_pmu_reg.h" + +PMU_INFO_TABLE *g_pmu_info_table; + +/** + @brief This API executes all the PMU tests sequentially + 1. Caller - Application layer. + 2. Prerequisite - val_pmu_create_info_table + @param level - level of compliance being tested for. + @param num_pe - the number of PE to run these tests on. + @return Consolidated status of all the tests run. +**/ +uint32_t +val_pmu_execute_tests(uint32_t level, uint32_t num_pe) +{ + + uint32_t status = AVS_STATUS_FAIL; + uint32_t i, pmu_node_count; + + for (i = 0; i < MAX_TEST_SKIP_NUM; i++) { + if (g_skip_test_num[i] == AVS_PMU_TEST_NUM_BASE) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all PMU tests \n", 0); + return AVS_STATUS_SKIP; + } + } + + if (g_single_module != SINGLE_MODULE_SENTINEL && g_single_module != AVS_PMU_TEST_NUM_BASE && + (g_single_test == SINGLE_MODULE_SENTINEL || + (g_single_test - AVS_PMU_TEST_NUM_BASE > 100 || + g_single_test - AVS_PMU_TEST_NUM_BASE < 0))) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all PMU tests \n", 0); + val_print(AVS_PRINT_TEST, " (Running only a single module)\n", 0); + return AVS_STATUS_SKIP; + } + + /* check if PE supports PMU extension, else skip all PMU tests */ + if (val_pe_feat_check(PE_FEAT_PMU)) { + val_print(AVS_PRINT_TEST, + "\n PE PMU extension unimplemented. Skipping all PMU tests\n", 0); + return AVS_STATUS_SKIP; + } + + g_curr_module = 1 << PMU_MODULE; + + /* run tests which don't check PMU nodes */ + if (g_sbsa_level > 6) { + status = pmu001_entry(num_pe); + status |= pmu002_entry(num_pe); + status |= pmu003_entry(num_pe); + status |= pmu006_entry(num_pe); + } + + pmu_node_count = val_pmu_get_info(PMU_NODE_COUNT, 0); + if (pmu_node_count == 0) { + val_print(AVS_PRINT_TEST, + "\n PMU nodes not found. Skipping remaining PMU tests\n", 0); + return AVS_STATUS_SKIP; + } + + if (g_sbsa_level > 6) { + status |= pmu004_entry(num_pe); + status |= pmu005_entry(num_pe); + status |= pmu007_entry(num_pe); + status |= pmu008_entry(num_pe); + status |= pmu009_entry(num_pe); + } + + val_print_test_end(status, "PMU"); + + return status; +} + +/** + @brief This API will call PAL layer to fill in the PMU information + into the address pointed by g_pmu_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param pmu_info_table pre-allocated memory pointer for PMU info + @return Error if Input param is NULL +**/ +void +val_pmu_create_info_table(uint64_t *pmu_info_table) +{ + if (pmu_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\nInput for Create PMU Info table cannot be NULL", 0); + return; + } + + g_pmu_info_table = (PMU_INFO_TABLE *)pmu_info_table; + + pal_pmu_create_info_table(g_pmu_info_table); + + val_print(AVS_PRINT_TEST, " PMU_INFO: Number of PMU units : %4d\n", + g_pmu_info_table->pmu_count); + + return; +} + +/** + @brief Free the memory allocated for the PMU information table +**/ +void +val_pmu_free_info_table() +{ + pal_mem_free((void *)g_pmu_info_table); + g_pmu_info_table = NULL; +} + +/** + @brief This API returns requested PMU node info. + + @param type - the type of information being requested. + @param node_index - index of the node in the APMT info table.. + + @return requested data if found, otherwise PMU_INVALID_INFO. +**/ + +uint64_t +val_pmu_get_info(PMU_INFO_e type, uint32_t node_index) +{ + PMU_INFO_BLOCK *entry; + + if (g_pmu_info_table == NULL) { + val_print(AVS_PRINT_WARN, "\n APMT info table not found", 0); + return 0; + } + + if (node_index > g_pmu_info_table->pmu_count) { + val_print(AVS_PRINT_WARN, "\n Invalid Node index ", 0); + return 0; + } + + entry = &g_pmu_info_table->info[node_index]; + + switch (type) { + case PMU_NODE_TYPE: + return entry->type; + case PMU_NODE_BASE0: + return entry->base0; + case PMU_NODE_BASE1: + return entry->base1; + case PMU_NODE_PRI_INST: + return entry->primary_instance; + case PMU_NODE_SEC_INST: + return entry->secondary_instance; + case PMU_NODE_COUNT: + return g_pmu_info_table->pmu_count; + case PMU_NODE_DP_EXTN: + return entry->dual_page_extension; + default: + val_print(AVS_PRINT_ERR, "\n This PMU info option is not supported : %d ", type); + return 0; + } +} + +/** + @brief This API checks if the PMU implements dedicated cycle counter. + @param node_index - index of the PMU node in the APMT info table. + @return 1 if supported 0 otherwise. +**/ +uint8_t +val_pmu_supports_dedicated_cycle_counter(uint32_t node_index) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + return BITFIELD_READ(PMCFGR_CC, val_mmio_read(base + REG_PMCFGR)); +} + +/** + @brief This API gets the number of monitors supported by the PMU node. + @param node_index - index of the PMU node in the APMT info table. + @return monitor count. +**/ +uint32_t +val_pmu_get_monitor_count(uint32_t node_index) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + /* If PMCFGR.CC == 1 PMEVCNTR31 is implemented and is a dedicated cycle counter + else If PMEVCNTR31 is implemented, it is a normal monitor */ + if (val_pmu_supports_dedicated_cycle_counter(node_index)) + return BITFIELD_READ(PMCFGR_N, val_mmio_read(base + REG_PMCFGR)); + else + return BITFIELD_READ(PMCFGR_N, val_mmio_read(base + REG_PMCFGR)) + 1; +} + +/** + @brief This API disbles all PMU monitors. + @param node_index - index of the PMU node in the APMT info table. + @return none. +**/ +void +val_pmu_disable_all_monitors(uint32_t node_index) +{ + addr_t base; + uint32_t data; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + data = BITFIELD_WRITE(val_mmio_read(base + REG_PMCR), PMCR_E, 0); + + val_mmio_write(base + REG_PMCR, data); +} + +/** + @brief This API enable all PMU monitors count. Monitors are enabled by PMCNTENSET + @param node_index - index of the PMU node in the APMT info table. + @return none. +**/ +void +val_pmu_enable_all_monitors(uint32_t node_index) +{ + addr_t base; + uint32_t data; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + data = BITFIELD_WRITE(val_mmio_read(base + REG_PMCR), PMCR_E, 1); + + val_mmio_write(base + REG_PMCR, data); +} + +/** + @brief This API resets all PMU monitors. + @param node_index - index of the PMU node in the APMT info table. + @return none. +**/ +void +val_pmu_reset_all_monitors(uint32_t node_index) +{ + addr_t base; + uint32_t data; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + data = BITFIELD_WRITE(val_mmio_read(base + REG_PMCR), PMCR_P, 1); + + val_mmio_write(base + REG_PMCR, data); +} + +/** + @brief This API returns the number of monitor groups implemented by the PMU node. + @param node_index - index of the PMU node in the APMT info table. + @return monitor group count. +**/ +uint32_t +val_pmu_get_monitor_group_count(uint32_t node_index) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + /* PMCFGR.NCG gives number of monitor groups implemented minus one */ + return BITFIELD_READ(PMCFGR_NCG, val_mmio_read(base + REG_PMCFGR)) + 1; +} + +/** + @brief This API returns the size of the largest implemented monitor. + @param node_index - index of the PMU node in the APMT info table. + @return The size of the largest implemented monitor. +**/ +uint32_t +val_pmu_get_max_monitor_size(uint32_t node_index) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + return BITFIELD_READ(PMCFGR_SIZE, val_mmio_read(base + REG_PMCFGR)); +} + +/** + @brief This API Configures the requested monitor instance. + @param node_index - index of the PMU node in the APMT info table. + @param event_type - PMU event type. + @param mon_inst - instance of the monitor to enable. + @return status 1 - Configure FAIL due to unsupported event + 0 - PASS +**/ +uint32_t +val_pmu_configure_monitor(uint32_t node_index, PMU_EVENT_TYPE_e event_type, uint32_t mon_inst) +{ + addr_t base; + uint32_t offset; + uint32_t data; + uint32_t node_type; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + /* Calculate the register offset based on selected monitor */ + offset = 4 * mon_inst; + + /* Disable all monitors before configuring the monitor */ + val_pmu_disable_all_monitors(node_index); + + node_type = val_pmu_get_info(PMU_NODE_TYPE, node_index); + /* Get event id details based on Implementation */ + data = pal_pmu_get_event_info(event_type, node_type); + + if (data == PMU_EVENT_INVALID) { + return 1; + } + + /* Write the received details into PMEVTYPER */ + val_mmio_write(base + offset + REG_PMEVTYPER, data); + + /* Enable all the monitors using PMCR.E */ + val_pmu_enable_all_monitors(node_index); + + /* Reset the all monitor counts before enabling required monitor */ + val_pmu_reset_all_monitors(node_index); + + return 0; +} + +/** + @brief This API Enables the requested monitor instance. + @param node_index - index of the PMU node in the APMT info table. + @param mon_inst - instance of the monitor to enable. + @return The size of the largest implemented monitor. +**/ +void +val_pmu_enable_monitor(uint32_t node_index, uint32_t mon_inst) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + uint32_t reg_offset, bit_offset; + + /* Register offset and bit offset is calculated based on the selected + monitor */ + reg_offset = mon_inst / 32 * 4; + bit_offset = mon_inst % 32; + + val_mmio_write(base + reg_offset + REG_PMCNTENSET, 1 << bit_offset); +} + +/** + @brief This API disables the requested monitor instance. + @param node_index - index of the PMU node in the APMT info table. + @param mon_inst - instance of the monitor to disable. + @return None. +**/ +void +val_pmu_disable_monitor(uint32_t node_index, uint32_t mon_inst) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + uint32_t reg_offset, bit_offset; + + /* Register offset and bit offset is calculated based on the selected + monitor */ + reg_offset = mon_inst / 32 * 4; + bit_offset = mon_inst % 32; + + val_mmio_write(base + reg_offset + REG_PMCNTENCLR, 1 << bit_offset); + + /* Reset all the monitors */ + val_pmu_reset_all_monitors(node_index); +} + +/** + @brief This API reads PMU counter value. + @param node_index - index of the PMU node in the APMT info table. + @param mon_inst - instance of the monitor to read. + @return Counter value. +**/ +uint64_t +val_pmu_read_count(uint32_t node_index, uint32_t mon_inst) +{ + addr_t base; + uint64_t count; + uint32_t offset; + + /* PMEVCNTR is a page 1 register when dual page extension is implemented */ + if (val_pmu_get_info(PMU_NODE_DP_EXTN, node_index)) + base = val_pmu_get_info(PMU_NODE_BASE1, node_index); + else + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + /* The width of the register PMEVCNTR depends on the size of the largest + implemented counter. if size if PMCFGR.SIZE <= 0b011111, all monitors are + 32 bits or smaller else at least one monitor is larger than 32 bits. The + offset is then calculated accordingly. */ + + if (val_pmu_get_max_monitor_size(node_index) > 0b011111) { + offset = 8 * mon_inst; + count = (uint64_t)val_mmio_read(base + offset + REG_PMEVCNTR_H) << 32 | + val_mmio_read(base + offset + REG_PMEVCNTR_L); + } + else { + offset = 4 * mon_inst; + count = val_mmio_read(base + offset + REG_PMEVCNTR); + } + + return count; +} + +/** + @brief This API returns PMU node index for given proximity domain + @param prox_domain Proximity domain from SRAT ACPI table. + @return PMU node index from APMT ACPI table. +**/ +uint32_t +val_pmu_get_node_index(uint64_t prox_domain) +{ + uint32_t node_index; + PMU_INFO_BLOCK *entry; + + for (node_index = 0 ; node_index < g_pmu_info_table->pmu_count ; node_index++) + { + entry = &g_pmu_info_table->info[node_index]; + if (entry->type == PMU_NODE_MEM_CNTR) { + if (prox_domain == entry->primary_instance) { + return node_index; + } + } + } + val_print(AVS_PRINT_DEBUG, "\n PMU node for given proximity domain not found ", 0); + return PMU_INVALID_INDEX; +} + +/* the below API are needed for test update to Coresight PMU EAC release specification, + The tests are currently based on beta release of spec and below API are not called */ +/** + @brief This API checks if PMU node implements PMSCR register. + @param node_index - index of the PMU node in the APMT info table. + @return 1 - PMSCR is present. + 0 - PMSCR is absent. +**/ +uint32_t +val_pmu_implements_pmscr(uint32_t node_index) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + return BITFIELD_READ(PMSCR_IMPL, val_mmio_read(base + REG_PMSCR_L)); +} + +/** + @brief This API checks if PMU node is secure only. + @param node_index - index of the PMU node in the APMT info table. + @return 0 - Non-secure and Realm Register Access is disabled + 1 - Non-secure and Realm Register Access is enabled +**/ +uint32_t +val_pmu_is_secure(uint32_t node_index) +{ + addr_t base; + + base = val_pmu_get_info(PMU_NODE_BASE0, node_index); + + if (val_pmu_implements_pmscr(node_index)) { + return BITFIELD_READ(PMSCR_NSRA, val_mmio_read(base + REG_PMSCR_L)); + } + + return 0; +} + +/** + @brief This API checks if pmu monitor count value is valid + @param interface_acpiid - acpiid of interface + @param count_value - monitor count value + @param eventid - eventid + @return 0 - monitor count value is valid + non-zero - error or invallid count value +**/ +uint32_t +val_pmu_check_monitor_count_value(uint64_t interface_acpiid, uint32_t count_value, + uint32_t eventid) +{ + return pal_pmu_check_monitor_count_value(interface_acpiid, count_value, eventid); +} + +/** + @brief This API generates required workload for given pmu node and event id + @param interface_acpiid - acpiid of interface + @param pmu_node_index - pmu node index + @param mon_index - monitor index + @param eventid - eventid + @return 0 - success status + non-zero - error status +**/ +uint32_t +val_generate_traffic(uint64_t interface_acpiid, uint32_t pmu_node_index, + uint32_t mon_index, uint32_t eventid) +{ + return pal_generate_traffic(interface_acpiid, pmu_node_index, mon_index, eventid); +} +/** + @brief This API generates required workload for given pmu node and event id + @param interface_acpiid - acpiid of interface + @param index_id - index id of interface + @return 0 - success status + non-zero - error status +**/ +uint32_t +val_pmu_get_index_acpiid(uint64_t interface_acpiid) +{ + uint32_t node_index; + PMU_INFO_BLOCK *entry; + + for (node_index = 0 ; node_index < g_pmu_info_table->pmu_count ; node_index++) + { + entry = &g_pmu_info_table->info[node_index]; + if ((entry->type == PMU_NODE_ACPI_DEVICE) && + (entry->primary_instance == interface_acpiid)) { + return node_index; + } + } + val_print(AVS_PRINT_DEBUG, "\n PMU node for given acpi id not found ", 0); + return PMU_INVALID_INDEX; + +} +/** + @brief This API checks if PMU node is secure only. + @param interface_acpiid - acpiid of interface + @param num_traffic_type_support - num of traffic type supported. + @return 0 - success status + non-zero - error status +**/ +uint32_t +val_pmu_get_multi_traffic_support_interface(uint64_t *interface_acpiid, + uint32_t *num_traffic_type_support) +{ + return pal_pmu_get_multi_traffic_support_interface(interface_acpiid, num_traffic_type_support); +} diff --git a/val/src/avs_ras.c b/val/src/avs_ras.c new file mode 100644 index 00000000..8ee36603 --- /dev/null +++ b/val/src/avs_ras.c @@ -0,0 +1,827 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "include/sbsa_avs_val.h" +#include "include/sbsa_avs_common.h" +#include "include/sbsa_avs_ras.h" +#include "include/sbsa_avs_pe.h" + +static RAS_INFO_TABLE *g_ras_info_table; +static RAS2_INFO_TABLE *g_ras2_info_table; + +/** + @brief This API executes all the RAS tests sequentially + 1. Caller - Application layer. + 2. Prerequisite - val_ras_create_info_table + @param level - level of compliance being tested for. + @param num_pe - the number of PE to run these tests on. + @return Consolidated status of all the tests run. +**/ +uint32_t +val_ras_execute_tests(uint32_t level, uint32_t num_pe) +{ + uint32_t status, i; + uint64_t num_ras_nodes = 0; + + for (i = 0; i < MAX_TEST_SKIP_NUM; i++) { + if (g_skip_test_num[i] == AVS_RAS_TEST_NUM_BASE) { + val_print(AVS_PRINT_TEST, "\n USER Override - Skipping all RAS tests \n", 0); + return AVS_STATUS_SKIP; + } + } + + if (g_single_module != SINGLE_MODULE_SENTINEL && g_single_module != AVS_RAS_TEST_NUM_BASE && + (g_single_test == SINGLE_MODULE_SENTINEL || + (g_single_test - AVS_RAS_TEST_NUM_BASE > 100 || + g_single_test - AVS_RAS_TEST_NUM_BASE < 0))) { + val_print(AVS_PRINT_TEST, " USER Override - Skipping all RAS tests \n", 0); + val_print(AVS_PRINT_TEST, " (Running only a single module)\n", 0); + return AVS_STATUS_SKIP; + } + + /* check if PE supports RAS extension, else skip all RAS tests */ + if (val_pe_feat_check(PE_FEAT_RAS)) { + val_print(AVS_PRINT_TEST, + "\n PE RAS extension unimplemented. Skipping all RAS tests\n", 0); + return AVS_STATUS_SKIP; + } + + g_curr_module = 1 << RAS_MODULE; + + status = val_ras_get_info(RAS_INFO_NUM_NODES, 0, &num_ras_nodes); + if (status || (num_ras_nodes == 0)) { + val_print(AVS_PRINT_TEST, "\n RAS nodes not found. Skipping all RAS tests\n", 0); + return AVS_STATUS_SKIP; + } + + /* set default status to AVS_STATUS_FAIL */ + status = AVS_STATUS_FAIL; + + if (g_sbsa_level > 6) { + status = ras001_entry(num_pe); + status |= ras002_entry(num_pe); + status |= ras003_entry(num_pe); + status |= ras004_entry(num_pe); + status |= ras005_entry(num_pe); + status |= ras006_entry(num_pe); + status |= ras007_entry(num_pe); + status |= ras008_entry(num_pe); + status |= ras009_entry(num_pe); + status |= ras010_entry(num_pe); + status |= ras011_entry(num_pe); + status |= ras012_entry(num_pe); + } + val_print_test_end(status, "RAS"); + + return status; +} + +/** + @brief This API will call PAL layer to fill in the RAS information + into the address pointed by g_ras_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param ras_info_table pre-allocated memory pointer for RAS info + @return Error if Input param is NULL +**/ +uint32_t +val_ras_create_info_table(uint64_t *ras_info_table) +{ + + if (ras_info_table == NULL) { + val_print(AVS_PRINT_ERR, "Input for Create Info table cannot be NULL \n", 0); + return AVS_STATUS_ERR; + } + + g_ras_info_table = (RAS_INFO_TABLE *)ras_info_table; + + pal_ras_create_info_table(g_ras_info_table); + + val_print(AVS_PRINT_TEST, " RAS_INFO: Number of RAS nodes : %4d \n", + g_ras_info_table->num_nodes); + + return AVS_STATUS_PASS; +} + +/** + @brief Free the memory allocated for the RAS information table +**/ +void +val_ras_free_info_table() +{ + pal_mem_free((void *)g_ras_info_table); +} + +/** + @brief This API will call PAL layer to fill in the RAS2 feature + information into the address pointed by g_ras2_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param ras_info_table pre-allocated memory pointer for RAS info + @return Error if Input param is NULL +**/ +void +val_ras2_create_info_table(uint64_t *ras2_info_table) +{ + + if (ras2_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\nInput for RAS2 feat create info table cannot be NULL \n", 0); + return; + } + +#ifndef TARGET_LINUX + g_ras2_info_table = (RAS2_INFO_TABLE *)ras2_info_table; + + pal_ras2_create_info_table(g_ras2_info_table); + + val_print(AVS_PRINT_TEST, " RAS2_INFO: Number of RAS2 entries : %4d \n", + g_ras2_info_table->num_all_block); + val_print(AVS_PRINT_TEST, " RAS2_INFO: Num of RAS2 memory entries: %4d \n", + g_ras2_info_table->num_of_mem_block); +#endif +return; +} + +/** + @brief Free the memory allocated for the RAS2 feature information table +**/ +void +val_ras2_free_info_table() +{ + pal_mem_free((void *)g_ras2_info_table); +} + +/** + @brief This API will use the info table to return the RAS information + for info_type and param1 into the address pointed by ret_data. + 1. Caller - Test layer. + 2. Prerequisite - val_ras_create_info_table. + @param info_type Required RAS information type enum + @param param1 Variable passed from test for which info needs to be returned. + @param *ret_data Return Data Pointer + @return Status +**/ +uint32_t +val_ras_get_info(uint32_t info_type, uint32_t param1, uint64_t *ret_data) +{ + uint32_t status = AVS_STATUS_FAIL; + uint32_t j = 0; + uint64_t value = 0; + uint64_t pe_affinity = 0; + uint32_t pe_uid = 0; + + switch (info_type) { + + case RAS_INFO_NUM_NODES: + *ret_data = g_ras_info_table->num_nodes; + return AVS_STATUS_PASS; + case RAS_INFO_NODE_TYPE: + *ret_data = g_ras_info_table->node[param1].type; + return AVS_STATUS_PASS; + case RAS_INFO_INTF_TYPE: + *ret_data = g_ras_info_table->node[param1].intf_info.intf_type; + return AVS_STATUS_PASS; + case RAS_INFO_PE_RES_TYPE: + if (g_ras_info_table->node[param1].type == NODE_TYPE_PE) { + *ret_data = g_ras_info_table->node[param1].node_data.pe.resource_type; + return AVS_STATUS_PASS; + } else + return AVS_STATUS_FAIL; + break; + case RAS_INFO_MC_RES_PROX_DOMAIN: + if (g_ras_info_table->node[param1].type == NODE_TYPE_MC) { + *ret_data = g_ras_info_table->node[param1].node_data.mc.proximity_domain; + return AVS_STATUS_PASS; + } else + return AVS_STATUS_FAIL; + break; + case RAS_INFO_NUM_PE: + /* Returns the number of PE RAS Nodes */ + *ret_data = g_ras_info_table->num_pe_node; + return AVS_STATUS_PASS; + break; + case RAS_INFO_NUM_MC: + /* Returns the number of MC RAS Nodes */ + *ret_data = g_ras_info_table->num_mc_node; + return AVS_STATUS_PASS; + break; + case RAS_INFO_BASE_ADDR: + /* Returns the Base address of Error Group. Valid only in MMIO */ + if (g_ras_info_table->node[param1].intf_info.intf_type == RAS_INTERFACE_MMIO) { + *ret_data = g_ras_info_table->node[param1].intf_info.base_addr; + return AVS_STATUS_PASS; + } else + return AVS_STATUS_FAIL; + break; + case RAS_INFO_START_INDEX: + /* Returns the Start Error Record Index Number */ + *ret_data = g_ras_info_table->node[param1].intf_info.start_rec_index; + return AVS_STATUS_PASS; + break; + case RAS_INFO_NUM_ERR_REC: + /* Returns the Number of Error Records */ + *ret_data = g_ras_info_table->node[param1].intf_info.num_err_rec; + return AVS_STATUS_PASS; + break; + case RAS_INFO_ERR_REC_IMP: + /* Returns the Error Record Implemented */ + *ret_data = g_ras_info_table->node[param1].intf_info.err_rec_implement; + return AVS_STATUS_PASS; + break; + case RAS_INFO_ADDR_MODE: + /* Returns the addressing mode bitmap for RAS address syndrome */ + *ret_data = g_ras_info_table->node[param1].intf_info.addressing_mode; + return AVS_STATUS_PASS; + break; + case RAS_INFO_STATUS_REPORT: + /* Returns the Error Reporting Status Field */ + *ret_data = g_ras_info_table->node[param1].intf_info.err_status_reporting; + return AVS_STATUS_PASS; + break; + case RAS_INFO_PFG_SUPPORT: + /* Returns the PFG Support */ + value = val_ras_reg_read(param1, RAS_ERR_FR, 0); + if (value == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<0>FR register for RAS node index: 0x%lx", + param1); + return AVS_STATUS_FAIL; + } + if (value & ERR_FR_INJ_MASK) + *ret_data = 0x1; + else + *ret_data = 0x0; + return AVS_STATUS_PASS; + case RAS_INFO_ERI_ID: + /* Returns the ERI ID For the Node */ + for (j = 0; j < g_ras_info_table->node[param1].num_intr_entries; j++) { + if (g_ras_info_table->node[param1].intr_info[j].type) { + *ret_data = g_ras_info_table->node[param1].intr_info[j].gsiv; + return AVS_STATUS_PASS; + } + } + return AVS_STATUS_FAIL; + break; + case RAS_INFO_FHI_ID: + /* Returns the FHI ID For the Node */ + for (j = 0; j < g_ras_info_table->node[param1].num_intr_entries; j++) { + if (!(g_ras_info_table->node[param1].intr_info[j].type)) { + *ret_data = g_ras_info_table->node[param1].intr_info[j].gsiv; + return AVS_STATUS_PASS; + } + } + return AVS_STATUS_FAIL; + break; + case RAS_INFO_NODE_INDEX_FOR_AFF: + /* Returns the Node Index For the PE node for MPIDR = param1 */ + val_print(AVS_PRINT_DEBUG, + "\n RAS_GET_INFO : Param1 = 0x%x ", + param1); + for (j = 0; j < g_ras_info_table->num_nodes; j++) { + if (g_ras_info_table->node[j].type == NODE_TYPE_PE) { + if (g_ras_info_table->node[j].node_data.pe.flags & 0x1) { + /* This is a global node return the index*/ + *ret_data = j; + return AVS_STATUS_PASS; + } else if (g_ras_info_table->node[j].node_data.pe.flags & 0x2) { + /* This is a shared resource */ + /* Get RAS node interface type and read for processor affinity */ + if (g_ras_info_table->node[j].intf_info.intf_type == RAS_INTF_TYPE_SYS_REG) + /* affinity field read from ACPI */ + pe_affinity = g_ras_info_table->node[j].node_data.pe.affinity; + else { + pe_affinity = val_ras_reg_read(RAS_ERR_ERRDEVAFF, j, 0); + if (pe_affinity == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n RAS_GET_INFO : Invalid pe_affinity (ERR_ERRDEVAFF) for RAS node = %d ", + j); + return AVS_STATUS_FAIL; + } + } + /* check if PE belongs to any of the higher affinity level i.e, 1, 2, or 3 */ + if (((param1 & PE_AFFINITY_LVL_1) == (pe_affinity & PE_AFFINITY_LVL_1)) + || ((param1 & PE_AFFINITY_LVL_2) == (pe_affinity & PE_AFFINITY_LVL_2)) + || ((param1 & PE_AFFINITY_LVL_3) == (pe_affinity & PE_AFFINITY_LVL_3))) { + *ret_data = j; + return AVS_STATUS_PASS; + } + } else { + /* if global or shared error flag not set for node, + Use g_ras_info_table->node[j].node_data.pe.processor_id */ + /* get processor UID */ + pe_uid = val_pe_get_uid(param1); + if (pe_uid == INVALID_PE_INFO) { + val_print(AVS_PRINT_ERR, + "\n RAS_GET_INFO : Invalid PE UID for MPIDR = %lx", + param1); + return AVS_STATUS_FAIL; + } + if (pe_uid == g_ras_info_table->node[j].node_data.pe.processor_id) { + *ret_data = j; + return AVS_STATUS_PASS; + } + } + } + } + val_print(AVS_PRINT_ERR, + "\n RAS_GET_INFO : No PE RAS node matches with MPIDR = %lx", + param1); + return AVS_STATUS_FAIL; + break; + default: + break; + + } + + return status; +} + +/** + @brief This API is a single point of entry to retrieve + RAS2 memory feature info from RAS2 info table. + 1. Caller - Test suite + 2. Prerequisite - val_ras2_create_info_table + @param type the type of information being requested. + @param index the index of RAS2 memory feat info instance. + @return 64-bit data +**/ +uint64_t +val_ras2_get_mem_info(RAS2_MEM_INFO_e type, uint32_t index) +{ + uint32_t i, j = 0; + RAS2_BLOCK *block; + + if (g_ras2_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\nRAS2_GET_MEM_INFO : ras2 info table is not created \n", 0); + return 0; /* imply no ras2_info entries */ + } + + if (type == RAS2_NUM_MEM_BLOCK) + return g_ras2_info_table->num_of_mem_block; + + /* check if index in range */ + if (index > g_ras2_info_table->num_of_mem_block - 1) { + val_print(AVS_PRINT_ERR, + "\nRAS2_GET_MEM_INFO: Index (%d) is greater than num of RAS2 mem blocks\n", + index); + return INVALID_RAS2_INFO; + } + + /* Go through the table return the relevant field value for RAS2 memory info block */ + /* at the index position */ + block = &g_ras2_info_table->blocks[0]; + for (i = 0; i < g_ras2_info_table->num_all_block; i++, block++) { + if (block->type == RAS2_FEATURE_TYPE_MEMORY) { + if (j == index) { + switch (type) { + case RAS2_PROX_DOMAIN: + return block->block_info.mem_feat_info.proximity_domain; + case RAS2_SCRUB_SUPPORT: + return block->block_info.mem_feat_info.patrol_scrub_support; + default: + val_print(AVS_PRINT_ERR, + "\nThis RAS2 memory info option not supported: %d \n", type); + return INVALID_RAS2_INFO; + } + } + j++; + } + } + return INVALID_RAS2_INFO; +} + +/** + @brief This API will be used to Read RAS Registers based on interface + 1. Caller - Test layer. + 2. Prerequisite - val_ras_create_info_table. + @param node_index RAS Node Index + @param reg Register to read. + @param err_rec_idx Error record index (required for record specific registers). + @return register read value or INVALID_RAS_REG_VAL if failure +**/ +uint64_t +val_ras_reg_read(uint32_t node_index, uint32_t reg, uint32_t err_rec_idx) +{ + uint64_t base, value = INVALID_RAS_REG_VAL; + uint32_t start_rec_index, offset; + uint64_t num_err_recs, err_rec_impl_bitmap; + + start_rec_index = g_ras_info_table->node[node_index].intf_info.start_rec_index; + + /* err_rec_idx = 0 means the first error record of the node */ + if (err_rec_idx == 0) + err_rec_idx = start_rec_index; + + /* Check if err record index is valid */ + val_ras_get_info(RAS_INFO_NUM_ERR_REC, node_index, &num_err_recs); + if ((err_rec_idx - start_rec_index) >= num_err_recs) { + val_print(AVS_PRINT_ERR, + "\n RAS_REG_READ : Invalid Input error record index(%d)\n", err_rec_idx); + return INVALID_RAS_REG_VAL; + } + + /* check if err record is implemented for given node index*/ + val_ras_get_info(RAS_INFO_ERR_REC_IMP, node_index, &err_rec_impl_bitmap); + + if ((err_rec_impl_bitmap >> err_rec_idx) & 0x1) { + val_print(AVS_PRINT_ERR, + "\n RAS_REG_READ : Error record index(%d) is unimplemented ", err_rec_idx); + val_print(AVS_PRINT_ERR, + "for node with index: %d \n", node_index); + return INVALID_RAS_REG_VAL; + } + + if (g_ras_info_table->node[node_index].intf_info.intf_type == RAS_INTF_TYPE_MMIO) { + /* MMIO based RAS register read */ + + /* Get the Base address for this node */ + base = g_ras_info_table->node[node_index].intf_info.base_addr; + + switch (reg) { + case RAS_ERR_FR: + /* ERRFR RAS register of first standard error record is + shared across multiple error records if exists */ + offset = ERR_FR_OFFSET + (64 * start_rec_index); + break; + case RAS_ERR_CTLR: + /* ERRCTLR RAS register of first standard error record is + shared across multiple error records if exists */ + offset = ERR_CTLR_OFFSET + (64 * start_rec_index); + break; + case RAS_ERR_STATUS: + offset = ERR_STATUS_OFFSET + (64 * err_rec_idx); + break; + case RAS_ERR_ADDR: + offset = ERR_ADDR_OFFSET + (64 * err_rec_idx); + break; + case RAS_ERR_PFGCDN: + /* ERRPFGCDN RAS register is valid only for first error record */ + if (err_rec_idx == start_rec_index) + offset = ERR_PFGCDN_OFFSET + (64 * start_rec_index); + else { + val_print(AVS_PRINT_ERR, + "\n RAS_REG_READ : ERR<%d>PFGCDN is RES0 for node index :", err_rec_idx); + val_print(AVS_PRINT_ERR, " %d", node_index); + return INVALID_RAS_REG_VAL; + } + break; + case RAS_ERR_PFGCTL: + /* ERRPFGCTL RAS register is valid only for first error record */ + if (err_rec_idx == start_rec_index) + offset = ERR_PFGCTL_OFFSET + (64 * start_rec_index); + else { + val_print(AVS_PRINT_ERR, + "\n RAS_REG_READ : ERR<%d>PFGCTL is RES0 for node index :", err_rec_idx); + val_print(AVS_PRINT_ERR, " %d", node_index); + return INVALID_RAS_REG_VAL; + } + break; + case RAS_ERR_ERRDEVAFF: + /* only valid for MMIO interface */ + offset = ERR_ERRDEVAFF_OFFSET; + default: + break; + } + value = val_mmio_read(base + offset); + } else { + /* System register based read */ + + /* RAS registers reads with ERRSELR_EL1.SEL set to start error record index */ + AA64WriteErrSelr1(start_rec_index); + + switch (reg) { + case RAS_ERR_FR: + value = AA64ReadErrFr1(); + break; + case RAS_ERR_CTLR: + value = AA64ReadErrCtlr1(); + break; + case RAS_ERR_PFGCDN: + /* ERRPFGCDN RAS register is valid only for first error record */ + if (err_rec_idx == start_rec_index) + value = AA64ReadErrPfgcdn1(); + else { + val_print(AVS_PRINT_ERR, + "\n RAS_REG_READ : ERR<%d>PFGCDN is RES0 for the node index :", err_rec_idx); + val_print(AVS_PRINT_ERR, " %d", node_index); + return INVALID_RAS_REG_VAL; + } + break; + case RAS_ERR_PFGCTL: + /* ERRPFGCTL RAS register is valid only for first error record */ + if (err_rec_idx == start_rec_index) + value = AA64ReadErrPfgctl1(); + else { + val_print(AVS_PRINT_ERR, + "\n RAS_REG_READ : ERR<%d>PFGCTL is RES0 for the node index :", err_rec_idx); + val_print(AVS_PRINT_ERR, " %d", node_index); + return INVALID_RAS_REG_VAL; + } + break; + default: + break; + } + + /* RAS registers reads with ERRSELR_EL1.SEL set to current error record index + These registers are unique to given error record */ + AA64WriteErrSelr1(err_rec_idx); + + switch (reg) { + case RAS_ERR_STATUS: + value = AA64ReadErrStatus1(); + break; + case RAS_ERR_ADDR: + value = AA64ReadErrAddr1(); + break; + default: + break; + } + } + + return value; +} + +/** + @brief This API will be used to Write RAS Registers based on interface + 1. Caller - Test layer. + 2. Prerequisite - val_ras_create_info_table. + @param node_index RAS Node Index + @param reg Register to write. + @param write_data Value to write in reg + @return None +**/ +void +val_ras_reg_write(uint32_t node_index, uint32_t reg, uint64_t write_data) +{ + uint64_t base; + uint32_t rec_index, offset; + + rec_index = g_ras_info_table->node[node_index].intf_info.start_rec_index; + + if (g_ras_info_table->node[node_index].intf_info.intf_type == RAS_INTF_TYPE_MMIO) { + /* MMIO Based Write */ + + /* Get the Base address for this node */ + base = g_ras_info_table->node[node_index].intf_info.base_addr; + + switch (reg) { + case RAS_ERR_FR: + offset = ERR_FR_OFFSET + (64 * rec_index); + break; + case RAS_ERR_CTLR: + offset = ERR_CTLR_OFFSET + (64 * rec_index); + break; + case RAS_ERR_STATUS: + offset = ERR_STATUS_OFFSET + (64 * rec_index); + break; + case RAS_ERR_PFGCDN: + offset = ERR_PFGCDN_OFFSET + (64 * rec_index); + break; + case RAS_ERR_PFGCTL: + offset = ERR_PFGCTL_OFFSET + (64 * rec_index); + break; + default: + break; + } + + val_mmio_write(base + offset, write_data); + } else { + /* System register based Write */ + + /* Update ERRSELR_EL1.SEL to choose which record index to use */ + AA64WriteErrSelr1(rec_index); + + switch (reg) { + case RAS_ERR_CTLR: + AA64WriteErrCtlr1(write_data); + break; + case RAS_ERR_STATUS: + AA64WriteErrStatus1(write_data); + break; + case RAS_ERR_PFGCDN: + AA64WriteErrPfgcdn1(write_data); + break; + case RAS_ERR_PFGCTL: + AA64WriteErrPfgctl1(write_data); + break; + default: + break; + } + } +} + +/** + @brief Function for setting up the Error Environment + + @param in_param - Error Input Parameters. + @param *out_param - Parameters returned from platform to be used in the test. + + @return Status +**/ +uint32_t +val_ras_setup_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param) +{ + uint32_t status = AVS_STATUS_FAIL; + uint32_t pfgctl_value = 0; + + /* Clear the ERR_STATUS for any previous error */ + val_ras_reg_write(in_param.node_index, RAS_ERR_STATUS, ERR_STATUS_CLEAR); + + /* Make Sure ERI/FHI is not enabled */ + val_ras_reg_write(in_param.node_index, RAS_ERR_CTLR, 0); + + /* Enable fault injection: ERRCTLR.ED=1 */ + val_ras_reg_write(in_param.node_index, RAS_ERR_CTLR, ERR_CTLR_ED_ENABLE); + + /* Check if Pseudo Fault needs to test */ + if (in_param.is_pfg_check) + { + /* Write Counter in ERRPFGCDN */ + val_ras_reg_write(in_param.node_index, RAS_ERR_PFGCDN, 0x5); + + /* Write to ERRPFGCTL.* To Enable Error */ + switch (in_param.ras_error_type) { + case ERR_UC: + pfgctl_value = ERR_PFGCTL_UC_ENABLE; + break; + case ERR_DE: + pfgctl_value = ERR_PFGCTL_DE_ENABLE; + break; + case ERR_CE: + pfgctl_value = ERR_PFGCTL_CE_NON_ENABLE; + break; + case ERR_CRITICAL: + pfgctl_value = ERR_PFGCTL_CI_ENABLE; + break; + default: + break; + } + val_ras_reg_write(in_param.node_index, RAS_ERR_PFGCTL, pfgctl_value); + + return AVS_STATUS_PASS; + } + + /* Platform defined way of error setup */ + status = pal_ras_setup_error(in_param, out_param); + return status; +} + +/** + @brief Platform Defined way of Timeout/Wait loop + + @param count - Timeout/Wait Multiplier. + + @return None +**/ +void +val_ras_wait_timeout(uint32_t count) +{ + pal_ras_wait_timeout(count); +} + +void +ras_pfg_access_node(uint32_t node_index) +{ + uint64_t reg_value; + + /* Loop for Wait */ + val_ras_wait_timeout(1); + + /* Access to the Node register, Might need an imp def way here */ + reg_value = val_ras_reg_read(node_index, RAS_ERR_CTLR, 0); + if (reg_value == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<0>CTLR register for RAS node index: 0x%lx", + node_index); + } + + val_print(AVS_PRINT_INFO, " Access RAS Node, CTLR : 0x%llx \n", reg_value); +} + +/** + @brief Function for injecting the Error + + @param in_param - Error Input Parameters. + @param *out_param - Parameters returned from platform to be used in the test. + + @return Status +**/ +uint32_t +val_ras_inject_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param) +{ + uint32_t status = AVS_STATUS_FAIL; + uint64_t reg_value; + + /* Check if Pseudo Fault needs to test */ + if (in_param.is_pfg_check) + { + /* Write to ERRPFGCTL.CDNEN */ + reg_value = val_ras_reg_read(in_param.node_index, RAS_ERR_PFGCTL, in_param.rec_index); + + if (reg_value == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<%d>PFGCTL register for ", + in_param.rec_index); + val_print(AVS_PRINT_ERR, + "RAS node index: 0x%lx", + in_param.node_index); + return AVS_STATUS_FAIL; + } + + val_ras_reg_write(in_param.node_index, RAS_ERR_PFGCTL, reg_value | ERR_PFGCTL_CDNEN_ENABLE); + + /* Wait and Access to Node */ + ras_pfg_access_node(in_param.node_index); + + return AVS_STATUS_PASS; + } + + /* Platform Defined Way of Error Injection */ + status = pal_ras_inject_error(in_param, out_param); + + return status; +} + +/** + @brief Function to check the Error Record Status + + @param node_index - RAS Node index in the info table. + @param error_type - RAS Error Type. + + @return Status +**/ +uint32_t val_ras_check_err_record(uint32_t node_index, uint32_t error_type) +{ + uint32_t status = AVS_STATUS_PASS; + uint64_t err_status; + uint32_t err_type_mask; + + /* Loop for Wait */ + val_ras_wait_timeout(1); + + err_status = val_ras_reg_read(node_index, RAS_ERR_STATUS, 0); + if (err_status == INVALID_RAS_REG_VAL) { + val_print(AVS_PRINT_ERR, + "\n Couldn't read ERR<0>STATUS register for RAS node index: 0x%lx", + node_index); + return AVS_STATUS_FAIL; + } + + /* Check Status Register Validity in Ras Node */ + if (!(err_status & ERR_STATUS_V_MASK)) { + val_print(AVS_PRINT_DEBUG, "\n Status Reg Not Valid, for node %d", node_index); + status = AVS_STATUS_FAIL; + } + + switch (error_type) { + case ERR_UC: + err_type_mask = ERR_STATUS_UE_MASK; + break; + case ERR_DE: + err_type_mask = ERR_STATUS_DE_MASK; + break; + case ERR_CE: + err_type_mask = ERR_STATUS_CE_MASK; + break; + case ERR_CRITICAL: + err_type_mask = ERR_STATUS_CI_MASK; + break; + default: + break; + } + + /* Check Error Bit in Ras Node */ + if (!(err_status & err_type_mask)) { + val_print(AVS_PRINT_DEBUG, "\n ERR Status Type Fail, for node %d", node_index); + status = AVS_STATUS_FAIL; + } + + return status; +} + +/** + @brief API to check support for Poison + + @param None + + @return 0 - Poison storage & forwarding not supported + 1 - Poison storage & forwarding supported +**/ +uint32_t val_ras_check_plat_poison_support(void) +{ + return pal_ras_check_plat_poison_support(); +} From b049f8a26e87ce788090babd51df06765fb4bc8f Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Thu, 12 Jan 2023 19:31:20 +0530 Subject: [PATCH 3/8] val/pal : SBSA 7.1 Changes - Added val layer api's for RAS, MPAM, PMU. - Bug Fix for Peripheral dump info - Added SRAT, HMAT, AEST, RAS2, PPTT ACPI Parsing code. Signed-off-by: Rajat Goyal --- platform/pal_uefi/SbsaPalLib.inf | 6 +- platform/pal_uefi/SbsaPalNistLib.inf | 6 +- platform/pal_uefi/include/pal_mpam.h | 67 ++++ platform/pal_uefi/include/pal_pmu.h | 76 ++++ platform/pal_uefi/include/pal_ras.h | 80 ++++ platform/pal_uefi/include/pal_uefi.h | 314 +++++++++++++++- platform/pal_uefi/src/pal_acpi.c | 241 +++++++++++- platform/pal_uefi/src/pal_gic.c | 5 +- platform/pal_uefi/src/pal_hmat.c | 256 +++++++++++++ platform/pal_uefi/src/pal_iovirt.c | 27 +- platform/pal_uefi/src/pal_misc.c | 51 ++- platform/pal_uefi/src/pal_mpam.c | 263 +++++++++++++ platform/pal_uefi/src/pal_pcie.c | 11 +- platform/pal_uefi/src/pal_pe.c | 273 +++++++++++++- platform/pal_uefi/src/pal_peripherals.c | 8 +- platform/pal_uefi/src/pal_pmu.c | 216 +++++++++++ platform/pal_uefi/src/pal_ras.c | 472 ++++++++++++++++++++++++ platform/pal_uefi/src/pal_timer_wd.c | 5 +- uefi_app/SbsaAvs.inf | 4 - uefi_app/SbsaAvsNist.inf | 4 - val/SbsaValLib.inf | 11 +- val/SbsaValNistLib.inf | 22 +- val/include/sbsa_avs_exerciser.h | 2 +- val/include/sbsa_avs_gic.h | 6 +- val/include/sbsa_avs_iovirt.h | 4 +- val/include/sbsa_avs_pcie.h | 8 +- val/include/sbsa_avs_pcie_spec.h | 65 +++- val/include/sbsa_avs_pe.h | 12 +- val/include/sbsa_avs_peripherals.h | 4 +- val/include/sbsa_avs_pgt.h | 17 +- val/include/sbsa_avs_smmu.h | 20 +- val/include/sbsa_avs_timer.h | 2 +- val/include/sbsa_avs_wd.h | 8 +- val/include/val_interface.h | 158 +++++++- val/src/AArch64/PeRegSysSupport.S | 8 +- val/src/avs_gic.c | 12 +- val/src/avs_iovirt.c | 166 ++++++++- val/src/avs_pcie.c | 88 +++-- val/src/avs_pe.c | 40 ++ val/src/avs_pe_infra.c | 205 ++++++++++ val/src/avs_peripherals.c | 63 ++-- val/src/avs_pgt.c | 41 +- val/src/avs_smmu.c | 65 ++-- val/src/avs_timer.c | 56 +-- val/src/avs_timer_support.c | 12 +- val/src/avs_wakeup.c | 9 +- val/src/avs_wd.c | 8 +- 47 files changed, 3203 insertions(+), 294 deletions(-) create mode 100644 platform/pal_uefi/include/pal_mpam.h create mode 100644 platform/pal_uefi/include/pal_pmu.h create mode 100644 platform/pal_uefi/include/pal_ras.h create mode 100644 platform/pal_uefi/src/pal_hmat.c create mode 100644 platform/pal_uefi/src/pal_mpam.c create mode 100644 platform/pal_uefi/src/pal_pmu.c create mode 100644 platform/pal_uefi/src/pal_ras.c diff --git a/platform/pal_uefi/SbsaPalLib.inf b/platform/pal_uefi/SbsaPalLib.inf index 759f880a..71e7194a 100644 --- a/platform/pal_uefi/SbsaPalLib.inf +++ b/platform/pal_uefi/SbsaPalLib.inf @@ -1,5 +1,5 @@ ## @file -# Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -39,6 +39,10 @@ src/pal_peripherals.c src/pal_exerciser.c src/pal_smmu.c + src/pal_hmat.c + src/pal_pmu.c + src/pal_mpam.c + src/pal_ras.c [Packages] ArmPkg/ArmPkg.dec diff --git a/platform/pal_uefi/SbsaPalNistLib.inf b/platform/pal_uefi/SbsaPalNistLib.inf index c75909b7..025fc610 100644 --- a/platform/pal_uefi/SbsaPalNistLib.inf +++ b/platform/pal_uefi/SbsaPalNistLib.inf @@ -1,5 +1,5 @@ ## @file -# Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -40,6 +40,10 @@ src/pal_exerciser.c src/pal_smmu.c src/pal_nist.c + src/pal_hmat.c + src/pal_pmu.c + src/pal_mpam.c + src/pal_ras.c [Packages] diff --git a/platform/pal_uefi/include/pal_mpam.h b/platform/pal_uefi/include/pal_mpam.h new file mode 100644 index 00000000..a63b23d0 --- /dev/null +++ b/platform/pal_uefi/include/pal_mpam.h @@ -0,0 +1,67 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_MPAM_H__ +#define __PAL_MPAM_H__ + +/* Not defined in EDK2: Remove once EDK2 supports MPAM*/ +#define MEMORY_RESOURCE_PARTITIONING_AND_MONITORING_TABLE_SIGNATURE SIGNATURE_32('M', 'P', 'A', 'M') + +#pragma pack(1) + +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER header; +} EFI_ACPI_MPAM_TABLE; + +typedef struct { + UINT16 length; + UINT16 reserved; + UINT32 identifier; + UINT64 base_address; + UINT32 mmio_size; + UINT32 overflow_interrupt; + UINT32 overflow_int_flags; + UINT32 reserved1; + UINT32 overflow_int_aff; + UINT32 error_interrupt; + UINT32 error_int_flags; + UINT32 reserved2; + UINT32 error_int_aff; + UINT32 max_nrdy_usec; + UINT64 hardware_id; + UINT32 instance_id; + UINT32 num_resource_nodes; +} EFI_ACPI_MPAM_MSC_NODE_STRUCTURE; + +typedef struct { + UINT32 identifier; + UINT8 ris_index; + UINT16 reserved1; + UINT8 locator_type; + UINT64 descriptor1; + UINT32 descriptor2; + UINT32 num_dependencies; +} EFI_ACPI_MPAM_RESOURCE_NODE_STRUCTURE; + +typedef struct { + UINT32 producer; + UINT32 reserved; +} EFI_ACPI_MPAM_FUNC_DEPEN_DESC_STRUCTURE; + +#pragma pack() + +#endif diff --git a/platform/pal_uefi/include/pal_pmu.h b/platform/pal_uefi/include/pal_pmu.h new file mode 100644 index 00000000..35ff2b59 --- /dev/null +++ b/platform/pal_uefi/include/pal_pmu.h @@ -0,0 +1,76 @@ +/** @file + * Copyright (c) 2022-2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_PMU_H__ +#define __PAL_PMU_H__ + +/* Not defined APMT related structures and defines in EDK2, + * Remove this header once EDK2 supports APMT */ + +#define ARM_PERFORMANCE_MONITORING_TABLE_SIGNATURE SIGNATURE_32('A', 'P', 'M', 'T') + +typedef enum { + PMU_EVENT_IB_TOTAL_BW, /* Inbound total bandwidth */ + PMU_EVENT_OB_TOTAL_BW, /* Outbound total bandwidth */ + PMU_EVENT_IB_READ_BW, /* Inbound read bandwidth */ + PMU_EVENT_IB_WRITE_BW, /* Inbound write bandwidth */ + PMU_EVENT_OB_READ_BW, /* Outbound read bandwidth */ + PMU_EVENT_OB_WRITE_BW, /* Outbound write bandwidth */ + PMU_EVENT_IB_OPEN_TXN, /* Inbound open transactions */ + PMU_EVENT_IB_TOTAL_TXN, /* Inbound total transactions */ + PMU_EVENT_OB_OPEN_TXN, /* Outbound open transactions */ + PMU_EVENT_OB_TOTAL_TXN, /* Outbound total transactions */ + PMU_EVENT_LOCAL_BW, /* Local traffic bandwidth */ + PMU_EVENT_REMOTE_BW, /* Remote traffic bandwidth */ + PMU_EVENT_ALL_BW, /* All traffic bandwidth */ + PMU_EVENT_TRAFFIC_1, /* traffic type 1 */ + PMU_EVENT_TRAFFIC_2 /* traffic type 2 */ +} PMU_EVENT_TYPE_e; + +typedef enum { + PMU_NODE_MEM_CNTR, + PMU_NODE_SMMU, + PMU_NODE_PCIE_RC, + PMU_NODE_ACPI_DEVICE, + PMU_NODE_PE_CACHE +} PMU_NODE_INFO_TYPE; + +#define PMU_EVENT_INVALID 0xFFFFFFFF + +#pragma pack(1) + +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER header; +} APMT_TABLE; + +typedef struct { + UINT16 length; + UINT8 flags; + UINT8 type; + UINT32 identifier; + UINT64 primary_instance; + UINT32 secondary_instance; + UINT64 base_addr0; + UINT64 base_addr1; + UINT32 interrupt; + UINT32 reserved; + UINT32 interrupt_flags; + UINT32 affinity; + UINT32 implementation_id; +} APMT_NODE; + +#endif diff --git a/platform/pal_uefi/include/pal_ras.h b/platform/pal_uefi/include/pal_ras.h new file mode 100644 index 00000000..9205743a --- /dev/null +++ b/platform/pal_uefi/include/pal_ras.h @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#ifndef __PAL_RAS_H__ +#define __PAL_RAS_H__ + +#pragma pack(1) + +#define MAX_NUM_OF_RAS_SUPPORTED 140 + +typedef union { + EFI_ACPI_AEST_PROCESSOR_STRUCT Proc; + EFI_ACPI_AEST_MEMORY_CONTROLLER_STRUCT Mem; + EFI_ACPI_AEST_SMMU_STRUCT Smmu; + EFI_ACPI_AEST_VENDOR_DEFINED_STRUCT Vendor; + EFI_ACPI_AEST_GIC_STRUCT Gic; +} AEST_NODE_RESOURCE; + +typedef struct { + AEST_NODE_RESOURCE NodeResource; + EFI_ACPI_AEST_INTERFACE_STRUCT NodeInterface; + EFI_ACPI_AEST_INTERRUPT_STRUCT NodeInterrupt[2]; +} AEST_NODE; + +typedef struct { + EFI_ACPI_ARM_ERROR_SOURCE_TABLE Header; + AEST_NODE node[]; +} AEST_TABLE; + + +/* RAS2 Feature ACPI Table Structures and Definitions*/ + +/* EDK2 doesn't define RAS2 table signature and structures, remove and use EDK2 definitions + once EDK2 extends support */ + +#define EFI_ACPI_6_5_RAS2_FEATURE_TABLE_SIGNATURE SIGNATURE_32('R', 'A', 'S', '2') +#define RAS2_FEATURE_TYPE_MEMORY 0x0 +#define RAS2_PLATFORM_FEATURE_PATROL_SCRUB_BITMASK 0x1ULL + +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT16 Reserved; + UINT16 NumOfPccDescriptors; +} RAS_FEATURE_2_TABLE_HEADER; + +typedef struct { + UINT8 PccIdentifier; + UINT16 Reserved; + UINT8 FeatureType; + UINT32 Instance; +} RAS2_PCC_DESCRIPTOR; + +typedef struct { + UINT32 Signature; + UINT16 Command; + UINT16 Status; + UINT16 Version; + UINT64 RasFeatures[2]; + UINT64 SetRasCapabilities[2]; + UINT16 NumOfRas2ParameterBlocks; + UINT32 SetRasCapabilitiesStatus; +} RAS2_PCC_SHARED_MEMORY_REGION; + +#pragma pack() + +#endif diff --git a/platform/pal_uefi/include/pal_uefi.h b/platform/pal_uefi/include/pal_uefi.h index bb37a96e..187c7b35 100644 --- a/platform/pal_uefi/include/pal_uefi.h +++ b/platform/pal_uefi/include/pal_uefi.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -60,6 +60,9 @@ extern UINT32 g_pcie_cache_present; #define BAR_MT_SHIFT 3 #define BAR_BASE_SHIFT 4 +#define PLATFORM_TIMEOUT_MEDIUM 0x1000 +#define PLATFORM_TIMEOUT_SMALL 0x10 + typedef enum { MMIO = 0, IO = 1 @@ -83,6 +86,7 @@ typedef struct { #define sbsa_print(verbose, string, ...) if(verbose >= g_print_level) \ Print(string, ##__VA_ARGS__) +UINT64 pal_get_acpi_table_ptr(UINT32 table_signature); /** Conduits for service calls (SMC vs HVC). @@ -99,12 +103,17 @@ typedef struct { /** @brief structure instance for PE entry **/ +#define DEFAULT_CACHE_IDX 0xFFFFFFFF +#define MAX_L1_CACHE_RES 2 /* Generally PE Level 1 have a data and a instruction cache */ + typedef struct { - UINT32 pe_num; ///< PE Index - UINT32 attr; ///< PE attributes - UINT64 mpidr; ///< PE MPIDR - UINT32 pmu_gsiv; ///< PMU Interrupt ID + UINT32 pe_num; /* PE Index */ + UINT32 attr; /* PE attributes */ + UINT64 mpidr; /* PE MPIDR */ + UINT32 pmu_gsiv; /* PMU Interrupt */ UINT32 gmain_gsiv; /* GIC Maintenace Interrupt */ + UINT32 acpi_proc_uid; /* ACPI Processor UID */ + UINT32 level_1_res[MAX_L1_CACHE_RES]; /* index of level 1 cache(s) in cache_info_table */ }PE_INFO_ENTRY; typedef struct { @@ -266,7 +275,7 @@ typedef struct { UINT64 base; UINT32 overflow_gsiv; UINT32 node_ref; -} IOVIRT_PMCG_INFO_BLOCK; +}IOVIRT_PMCG_INFO_BLOCK; typedef enum { IOVIRT_NODE_ITS_GROUP = 0x00, @@ -287,7 +296,8 @@ typedef struct { UINT32 input_base; UINT32 id_count; UINT32 output_base; - UINT32 output_ref; + UINT32 output_ref; /* output ref captured here is offset to iovirt block in + IOVIRT info table not IORT ACPI table in memory */ }ID_MAP; typedef union { @@ -297,8 +307,14 @@ typedef union { #define MAX_NAMED_COMP_LENGTH 256 +typedef struct { + UINT64 smmu_base; /* SMMU base to which component is attached, else NULL */ + UINT32 cca; /* Cache Coherency Attribute */ + CHAR8 name[MAX_NAMED_COMP_LENGTH]; /* Device object name */ +} IOVIRT_NAMED_COMP_INFO_BLOCK; + typedef union { - CHAR8 name[MAX_NAMED_COMP_LENGTH]; + IOVIRT_NAMED_COMP_INFO_BLOCK named_comp; IOVIRT_RC_INFO_BLOCK rc; IOVIRT_PMCG_INFO_BLOCK pmcg; UINT32 its_count; @@ -454,4 +470,286 @@ UINT64 pal_memory_get_unpopulated_addr(UINT64 *addr, UINT32 instance); UINT32 pal_pe_get_num(); +/** + @brief Instance of system pmu info +**/ +typedef struct { + UINT8 type; /* The component that this PMU block is associated with*/ + UINT64 primary_instance; /* Primary node instance, specific to the PMU type*/ + UINT32 secondary_instance; /* Secondary node instance, specific to the PMU type*/ + UINT8 dual_page_extension; /* Support of the dual-page mode*/ + UINT64 base0; /* Base address of Page 0 of the PMU*/ + UINT64 base1; /* Base address of Page 1 of the PMU, + valid only if dual_page_extension is 1*/ +} PMU_INFO_BLOCK; + +typedef struct { + UINT32 pmu_count; /* Total number of PMU info blocks*/ + PMU_INFO_BLOCK info[]; /* PMU info blocks for each PMU nodes*/ +} PMU_INFO_TABLE; + +/* + * @brief Mpam Resource Node + */ +typedef struct { + UINT8 ris_index; + UINT8 locator_type; /* Identifies location of this resource */ + UINT64 descriptor1; /* Primary acpi description of location */ + UINT32 descriptor2; /* Secondary acpi description of location */ +} MPAM_RESOURCE_NODE; + +/* + * @brief Mpam MSC Node + */ +typedef struct { + UINT64 msc_base_addr; /* base addr of mem-map MSC reg */ + UINT32 msc_addr_len; /* MSC mem map size */ + UINT32 max_nrdy; /* max time in microseconds that MSC not ready + after config change */ + UINT32 rsrc_count; /* number of resource nodes */ + MPAM_RESOURCE_NODE rsrc_node[]; /* Details of resource node */ +} MPAM_MSC_NODE; + +/* + * @brief Mpam info table + */ + +#define MPAM_NEXT_MSC(msc_entry) \ + (MPAM_MSC_NODE *)((UINT8 *)(&msc_entry->rsrc_node[0]) \ + + msc_entry->rsrc_count * sizeof(MPAM_RESOURCE_NODE)) + +typedef struct { + UINT32 msc_count; /* Number of MSC node */ + MPAM_MSC_NODE msc_node[]; /* Details of MSC node */ +} MPAM_INFO_TABLE; + +/** + @brief SRAT node type +**/ + +typedef enum { + SRAT_NODE_MEM_AFF = 0x01, + SRAT_NODE_GICC_AFF = 0x03 +} SRAT_NODE_TYPE_e; + +/** + @brief SRAT GICC Affinity Structure +**/ + +typedef struct { + UINT32 prox_domain; /* Proximity domain*/ + UINT32 proc_uid; /* ACPI Processor UID */ + UINT32 flags; /* Flags*/ + UINT32 clk_domain; /* Clock Domain*/ +} SRAT_GICC_AFF_ENTRY; + +/** + @brief SRAT Memory Affinity Structure +**/ + +typedef struct { + UINT32 prox_domain; /* Proximity domain */ + UINT32 flags; /* flags */ + UINT64 addr_base; /* mem range address base */ + UINT64 addr_len; /* mem range address len */ +} SRAT_MEM_AFF_ENTRY; + +typedef union { + SRAT_MEM_AFF_ENTRY mem_aff; + SRAT_GICC_AFF_ENTRY gicc_aff; +} SRAT_NODE_INFO; + +typedef struct { + UINT32 node_type; /* Node type*/ + SRAT_NODE_INFO node_data; +} SRAT_INFO_ENTRY; + +typedef struct { + UINT32 num_of_srat_entries; + UINT32 num_of_mem_ranges; + SRAT_INFO_ENTRY srat_info[]; +} SRAT_INFO_TABLE; + +/* SRAT node structure header. Can be removed after it is defined in EDKII*/ +typedef struct { + UINT8 Type; + UINT8 Length; +} EFI_ACPI_6_4_SRAT_STRUCTURE_HEADER; + + +/* Cache info table structures and APIs */ + +#define CACHE_TYPE_SHARED 0x0 +#define CACHE_TYPE_PRIVATE 0x1 +#define CACHE_INVALID_NEXT_LVL_IDX 0xFFFFFFFF +#define CACHE_INVALID_IDX 0xFFFFFFFF + +/*only the fields and flags required by ACS are parsed from ACPI PPTT table*/ +/*Cache flags indicate validity of cache info provided by PPTT Table*/ +typedef struct { + UINT32 size_property_valid; + UINT32 cache_type_valid; + UINT32 cache_id_valid; +} CACHE_FLAGS; + +/* Since most of platform doesn't support cache id field (ACPI 6.4+), ACS uses PPTT offset as key + to uniquely identify a cache, In future once platforms align with ACPI 6.4+ my_offset member + might be removed from cache entry*/ +typedef struct { + CACHE_FLAGS flags; /* Cache flags */ + UINT32 my_offset; /* Cache PPTT structure offset */ + UINT32 next_level_index; /* Index of next level cache entry in CACHE_INFO_TABLE */ + UINT32 size; /* Size of the cache in bytes */ + UINT32 cache_id; /* Unique, non-zero identifier for this cache */ + UINT32 is_private; /* Field indicate whether cache is private */ + UINT8 cache_type; /* Cache type */ +} CACHE_INFO_ENTRY; + +typedef struct { + UINT32 num_of_cache; /* Total of number of cache info entries */ + CACHE_INFO_ENTRY cache_info[]; /* Array of cache info entries */ +} CACHE_INFO_TABLE; + +/* RAS Information */ + +typedef enum { + NODE_TYPE_PE = 0x0, + NODE_TYPE_MC = 0x1, + NODE_TYPE_SMMU = 0x2, + NODE_TYPE_VDR = 0x3, + NODE_TYPE_GIC = 0x4, + NODE_TYPE_LAST_ENTRY +} RAS_NODE_TYPE_e; + +typedef enum { + RAS_INTF_TYPE_SYS_REG, /* System register RAS node interface type */ + RAS_INTF_TYPE_MMIO /* MMIO RAS node interface type */ +} RAS_NODE_INTF_TYPE; +typedef struct { + UINT32 processor_id; + UINT32 resource_type; + UINT32 flags; + UINT64 affinity; + UINT64 res_specific_data; /* Resource Specific Data */ +} RAS_NODE_PE_DATA; + +typedef struct { + UINT32 proximity_domain; +} RAS_NODE_MC_DATA; + +typedef struct { + RAS_NODE_INTF_TYPE intf_type; /* Interface Type */ + UINT32 flags; + UINT64 base_addr; /* Base address to MMIO region, valid for MMIO intf type */ + UINT32 start_rec_index; /* Start Record Index */ + UINT32 num_err_rec; /* Number of error records (implemented & unimplemented)*/ + UINT64 err_rec_implement; /* bitmap of error records implemented */ + UINT64 err_status_reporting; /* bitmap indicates which error records within this error + node support error status reporting using ERRGSR */ + UINT64 addressing_mode; /* bitmap based policy for ERRADDR field of error records */ +} RAS_INTERFACE_INFO; + +typedef struct { + UINT32 type; + UINT32 flag; + UINT32 gsiv; + UINT32 its_grp_id; +} RAS_INTERRUPT_INFO; + +typedef union { + RAS_NODE_PE_DATA pe; + RAS_NODE_MC_DATA mc; +} RAS_NODE_DATA; + +typedef struct { + RAS_NODE_TYPE_e type; /* Node Type PE/GIC/SMMU */ + UINT16 length; /* Length of the Node */ + UINT64 num_intr_entries; /* Number of Interrupt Entry */ + RAS_NODE_DATA node_data; /* Node Specific Data */ + RAS_INTERFACE_INFO intf_info; /* Node Interface Info */ + RAS_INTERRUPT_INFO intr_info[2]; /* Node Interrupt Info */ +} RAS_NODE_INFO; + +typedef struct { + UINT32 num_nodes; /* Number of total RAS Nodes */ + UINT32 num_pe_node; /* Number of PE RAS Nodes */ + UINT32 num_mc_node; /* Number of Memory Controller Nodes */ + RAS_NODE_INFO node[]; /* Array of RAS nodes */ +} RAS_INFO_TABLE; + +typedef enum { + ERR_UC = 0x1, /* Uncorrectable Error */ + ERR_DE, /* Deferred Error */ + ERR_CE, /* Correctable Error */ + ERR_CRITICAL, /* Critical Error */ + ERR_CONTAINABLE /* Containable Error */ +} RAS_ERROR_TYPE; + +typedef struct { + RAS_ERROR_TYPE ras_error_type; /* Error Type */ + UINT64 error_pa; /* Error Phy Address */ + UINT32 rec_index; /* Error Record Index */ + UINT32 node_index; /* Error Node Index in Info table */ + UINT8 is_pfg_check; /* Pseudo Fault Check or not */ +} RAS_ERR_IN_t; + +typedef struct { + UINT32 intr_id; /* Interrupt ID */ + UINT32 error_record; /* Error Record Number */ +} RAS_ERR_OUT_t; + +void pal_ras_create_info_table(RAS_INFO_TABLE *ras_info_table); +UINT32 pal_ras_setup_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param); +UINT32 pal_ras_inject_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param); +void pal_ras_wait_timeout(UINT32 count); +UINT32 pal_ras_check_plat_poison_support(void); + + +typedef enum { + RAS2_TYPE_MEMORY = 0 /* RAS2 memory feature type*/ +} RAS2_FEAT_TYPE; + +typedef struct { + UINT32 proximity_domain; /* Proximity domain of the memory */ + UINT32 patrol_scrub_support; /* Patrol srub support flag */ +} RAS2_MEM_INFO; + +typedef union { + RAS2_MEM_INFO mem_feat_info; /* Memory feature specific info */ +} RAS2_BLOCK_INFO; + +typedef struct { + RAS2_FEAT_TYPE type; /* RAS2 feature type*/ + RAS2_BLOCK_INFO block_info; /* RAS2 block info */ +} RAS2_BLOCK; + +typedef struct { + UINT32 num_all_block; /* Number of RAS2 feature blocks */ + UINT32 num_of_mem_block; /* Number of memory feature blocks */ + RAS2_BLOCK blocks[]; +} RAS2_INFO_TABLE; + +void pal_ras2_create_info_table(RAS2_INFO_TABLE *ras2_info_table); + +/* HMAT info table structures and APIs*/ + +#define HMAT_MEM_HIERARCHY_MEMORY 0x00 +#define HMAT_DATA_TYPE_ACCESS_BW 0x03 +#define HMAT_DATA_TYPE_READ_BW 0x04 +#define HMAT_DATA_TYPE_WRITE_BW 0x05 +#define HMAT_BW_ENTRY_UNREACHABLE 0xFFFF +#define HMAT_BASE_UNIT_48BIT 0xFFFFFFFFFFFFULL +typedef struct { + UINT32 mem_prox_domain; /* Proximity domain of the memory region*/ + UINT64 write_bw; /* Maximum write bandwidth */ + UINT64 read_bw; /* Maximum read bandwidth */ +} HMAT_BW_ENTRY; + +typedef struct { + UINT32 num_of_mem_prox_domain; /* Number of Memory Proximity Domains */ + HMAT_BW_ENTRY bw_info[]; /* Array of bandwidth info based on proximity domain */ +} HMAT_INFO_TABLE; + +VOID pal_hmat_create_info_table(HMAT_INFO_TABLE *HmatTable); + #endif diff --git a/platform/pal_uefi/src/pal_acpi.c b/platform/pal_uefi/src/pal_acpi.c index 7327fffb..754d29d8 100644 --- a/platform/pal_uefi/src/pal_acpi.c +++ b/platform/pal_uefi/src/pal_acpi.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020-2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,12 +20,11 @@ #include #include #include - -#include "Include/Guid/Acpi.h" -#include -#include "Include/IndustryStandard/Acpi61.h" +#include "Include/IndustryStandard/ArmErrorSourceTable.h" #include "include/pal_uefi.h" +#include "include/pal_pmu.h" +#include "include/pal_mpam.h" /** @brief Checks if System information is passed using Baremetal (BM) @@ -72,6 +71,39 @@ pal_get_xsdt_ptr() } +/** + @brief Iterate through the ACPI tables pointed by XSDT and return table address. + + @param table_signature Signature of the requested ACPI table. + + @return 64-bit ACPI table address if found, else zero is returned. +**/ +UINT64 +pal_get_acpi_table_ptr(UINT32 table_signature) +{ + + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == table_signature) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + /** @brief Iterate through the tables pointed by XSDT and return MADT address @@ -243,6 +275,205 @@ pal_get_iort_ptr() } +/** + @brief Iterate through the tables pointed by XSDT and return AEST Table address + + @param None + + @return 64-bit AEST address + **/ +UINT64 +pal_get_aest_ptr() +{ + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + + /** + @brief Iterate through the tables pointed by XSDT and return APMT Table address + + @param None + + @return 64-bit APMT address + **/ +UINT64 +pal_get_apmt_ptr() +{ + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == ARM_PERFORMANCE_MONITORING_TABLE_SIGNATURE) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + +/** + @brief Iterate through the tables pointed by XSDT and return HMAT address + + @param None + + @return 64-bit HMAT address +**/ +UINT64 +pal_get_hmat_ptr(void) +{ + + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == + EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + + /** + @brief Iterate through the tables pointed by XSDT and return MPAM Table address + + @param None + + @return 64-bit MPAM address + **/ +UINT64 +pal_get_mpam_ptr() +{ + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == + MEMORY_RESOURCE_PARTITIONING_AND_MONITORING_TABLE_SIGNATURE) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + +/** + @brief Iterate through the tables pointed by XSDT and return PPTT address + + @param None + + @return 64-bit PPTT address +**/ +UINT64 +pal_get_pptt_ptr(void) +{ + + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == + EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + +/** + @brief Iterate through the tables pointed by XSDT and return SRAT address + + @param None + + @return 64-bit SRAT address +**/ +UINT64 +pal_get_srat_ptr(void) +{ + + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + UINT64 *Entry64; + UINT32 Entry64Num; + UINT32 Idx; + + Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) pal_get_xsdt_ptr(); + if (Xsdt == NULL) { + sbsa_print(AVS_PRINT_ERR, L" XSDT not found \n"); + return 0; + } + + Entry64 = (UINT64 *)(Xsdt + 1); + Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3; + for (Idx = 0; Idx < Entry64Num; Idx++) { + if (*(UINT32 *)(UINTN)(Entry64[Idx]) == + EFI_ACPI_3_0_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE) { + return(UINT64)(Entry64[Idx]); + } + } + + return 0; +} + /** @brief Iterate through the tables pointed by XSDT and return FADT Table address diff --git a/platform/pal_uefi/src/pal_gic.c b/platform/pal_uefi/src/pal_gic.c index 19a55748..d3d40af9 100644 --- a/platform/pal_uefi/src/pal_gic.c +++ b/platform/pal_uefi/src/pal_gic.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,9 +19,6 @@ #include #include #include - -#include "Include/IndustryStandard/Acpi61.h" -#include #include #include diff --git a/platform/pal_uefi/src/pal_hmat.c b/platform/pal_uefi/src/pal_hmat.c new file mode 100644 index 00000000..96a3aff6 --- /dev/null +++ b/platform/pal_uefi/src/pal_hmat.c @@ -0,0 +1,256 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include +#include +#include + +#include "include/pal_uefi.h" + +#define ADD_PTR(t, p, l) ((t*)((UINT8*)p + l)) + +UINT64 pal_get_hmat_ptr(); + +/** + @brief This function checks whether an entry already present for + a input proximity domain else creates new entry and returns the + index. + + @param HmatTable pointer to pre-allocated memory for hmat info table. + @param mem_prox_domain input memory proximity domain. + + @return Returns index to hmat bw_info_entry for input memory proximity domain. +**/ +UINT32 pal_hmat_get_entry_index(HMAT_INFO_TABLE *HmatTable, UINT32 mem_prox_domain) +{ + HMAT_BW_ENTRY *curr_entry; + UINT32 i; + + curr_entry = HmatTable->bw_info; + for (i = 0 ; i < HmatTable->num_of_mem_prox_domain ; i++) { + /* match mem_prox_domain of the entry with input prox_domain */ + if (curr_entry->mem_prox_domain == mem_prox_domain) { + return i; + } + curr_entry++; + } + + /* if no matching entry found, add the proximity domain to info table + and return the index*/ + curr_entry = &HmatTable->bw_info[HmatTable->num_of_mem_prox_domain]; + curr_entry->mem_prox_domain = mem_prox_domain; + curr_entry->write_bw = 0; /* initialize write bandwidth */ + curr_entry->read_bw = 0; /* initialize read bandwidth */ + HmatTable->num_of_mem_prox_domain++; + + return HmatTable->num_of_mem_prox_domain - 1; +} + +/** + @brief This function returns maximum bandwidth matrix entry for input + target proximity domain among all available initiator proximity domains. + + @param target_prox_index index of target proximity domain in SLLBI target domain list. + @param curr_bw_struct pointer to SLLBI HMAT structure. + + @return Returns maximum bandwidth matrix entry for input target_prox_index + and SLLBI HMAT structure. +**/ +UINT16 pal_hmat_get_max_bw_entry(UINT32 target_prox_index, +EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO *curr_bw_struct) +{ + UINT32 i, offset; + UINT16 max_bw_entry = 0; + UINT16 *bw_entry; + + /* calculate offset to first bandwidth matrix entry for passed target + proximity domain index in current HMAT structure and get */ + offset = sizeof(EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO) + + sizeof(UINT32) * curr_bw_struct->NumberOfInitiatorProximityDomains + + sizeof(UINT32) * curr_bw_struct->NumberOfTargetProximityDomains + + sizeof(UINT16) * target_prox_index; + bw_entry = ADD_PTR(UINT16, curr_bw_struct, offset); + + /* check all available Initiator Proximity Domains */ + for (i = 0 ; i < curr_bw_struct->NumberOfInitiatorProximityDomains ; i++) { + /* if entry value is 0xFFFF then the initiator and target domains are + unreachable from each other, hence ignoring the entry */ + if (*bw_entry == HMAT_BW_ENTRY_UNREACHABLE) { + bw_entry = bw_entry + curr_bw_struct->NumberOfTargetProximityDomains; + continue; + } + + if (max_bw_entry < *bw_entry) + max_bw_entry = *bw_entry; + + /* increment pointer to next intitiator target pair */ + bw_entry = bw_entry + curr_bw_struct->NumberOfTargetProximityDomains; + } + + return max_bw_entry; +} + +/** + @brief This function updates hmat info table after parsing input SLLBI HMAT structure + + @param HmatTable pointer to pre-allocated memory for hmat info table. + @param curr_bw_struct pointer to SLLBI HMAT structure. + + @return None +**/ +VOID pal_hmat_update_info(HMAT_INFO_TABLE *HmatTable, +EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO *curr_bw_struct) +{ + HMAT_BW_ENTRY *curr_info_entry; + UINT64 entry_base_unit, curr_max_bw; + UINT32 i, bw_info_index; + UINT32 *curr_tgt_prox_domain; + UINT16 curr_max_bw_entry; + + entry_base_unit = curr_bw_struct->EntryBaseUnit; + + if (entry_base_unit > HMAT_BASE_UNIT_48BIT) { + sbsa_print(AVS_PRINT_ERR, L"\nEntry Base unit exceeds 0x%llx Mbytes/s ", + HMAT_BASE_UNIT_48BIT); + sbsa_print(AVS_PRINT_ERR, L"\n BW info entries might overflow 64 bit boundary"); + } + + /* pointer to list of target proximity domains */ + curr_tgt_prox_domain = ADD_PTR(UINT32, curr_bw_struct, + (sizeof(EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO) + + 4 * curr_bw_struct->NumberOfInitiatorProximityDomains)); + + for (i = 0 ; i < curr_bw_struct->NumberOfTargetProximityDomains ; i++) { + /* get maximum bandwidth for curr_tgt_prox_domain among available initiator + proxmity domains */ + curr_max_bw_entry = pal_hmat_get_max_bw_entry(i, curr_bw_struct); + curr_max_bw = entry_base_unit * curr_max_bw_entry; + + sbsa_print(AVS_PRINT_INFO, L"\nMemory Proximity Domain : 0x%llx", *curr_tgt_prox_domain); + sbsa_print(AVS_PRINT_INFO, L"\nEntry Base Unit : 0x%llx", entry_base_unit); + sbsa_print(AVS_PRINT_INFO, L"\nMax Bandwidth entry : 0x%llx", curr_max_bw_entry); + sbsa_print(AVS_PRINT_INFO, L"\nMax Bandwidth : 0x%llx", curr_max_bw); + /* get index to HMAT info table entry for curr_tgt_prox_domain */ + bw_info_index = pal_hmat_get_entry_index(HmatTable, *curr_tgt_prox_domain); + /* pointer to HMAT info table entry curr_tgt_prox_domain */ + curr_info_entry = &HmatTable->bw_info[bw_info_index]; + + /* update the HMAT info table only if current seen bandwidth is + greater than previously seen bandwidth. HMAT allows table developer + to capture bandwidth for different scenarios */ + if (curr_bw_struct->DataType == HMAT_DATA_TYPE_ACCESS_BW || + curr_bw_struct->DataType == HMAT_DATA_TYPE_WRITE_BW ) { + if (curr_max_bw > curr_info_entry->write_bw) + curr_info_entry->write_bw = curr_max_bw; + } + + if (curr_bw_struct->DataType == HMAT_DATA_TYPE_ACCESS_BW || + curr_bw_struct->DataType == HMAT_DATA_TYPE_READ_BW ) { + if (curr_max_bw > curr_info_entry->read_bw) + curr_info_entry->read_bw = curr_max_bw; + } + /* point to next target proximity domain */ + curr_tgt_prox_domain++; + } +} + +/** + @brief This API prints hmat info table entries. + + @param HmatTable pointer to pre-allocated memory for hmat info table. + + @return None +**/ +VOID pal_hmat_dump_info_table(HMAT_INFO_TABLE *HmatTable) +{ + HMAT_BW_ENTRY *curr_entry; + UINT32 i; + + if (HmatTable == NULL) + return; + + curr_entry = HmatTable->bw_info; + sbsa_print(AVS_PRINT_INFO, L"\n*** HMAT info table entries ***\n"); + for (i = 0 ; i < HmatTable->num_of_mem_prox_domain ; i++) { + sbsa_print(AVS_PRINT_INFO, L"\nMemory Proximity domain : 0x%llx", curr_entry->mem_prox_domain); + sbsa_print(AVS_PRINT_INFO, L"\n Write bandwidth : 0x%llx", curr_entry->write_bw); + sbsa_print(AVS_PRINT_INFO, L"\n Read bandwidth : 0x%llx\n", curr_entry->read_bw); + curr_entry++; + } +} + +/** + @brief Parses ACPI HMAT table and populates the local hmat info table with + maximum read/write bandwidth for memory proximity domains. + + @param HmatTable pointer to pre-allocated memory for hmat info table. + + @return None +**/ +VOID pal_hmat_create_info_table(HMAT_INFO_TABLE *HmatTable) +{ + EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_HEADER *HmatHdr; + EFI_ACPI_6_4_HMAT_STRUCTURE_HEADER *hmat_struct, *hmat_end; + EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO *curr_bw_struct; + UINT32 TableLength = 0; + + if (HmatTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L" Unable to create HMAT info table, input pointer is NULL \n"); + return; + } + + /* initialize hmat info table number of entries */ + HmatTable->num_of_mem_prox_domain = 0; + + HmatHdr = (EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_HEADER *) pal_get_hmat_ptr(); + if (HmatHdr == NULL) { + sbsa_print(AVS_PRINT_DEBUG, L" HMAT ACPI table not found\n"); + return; + } + else { + TableLength = HmatHdr->Header.Length; + sbsa_print(AVS_PRINT_INFO, L"HMAT ACPI table found at 0x%llx with length 0x%x\n", + HmatHdr, TableLength); + } + + /* pointer to first HMAT structure in ACPI table */ + /* HMAT table has 4 bytes addition to ACPI header to + make the HMAT structures 8 byte aligned */ + hmat_struct = ADD_PTR(EFI_ACPI_6_4_HMAT_STRUCTURE_HEADER, HmatHdr, + sizeof(EFI_ACPI_DESCRIPTION_HEADER) + 4); + + /* HMAT end boundary */ + hmat_end = ADD_PTR(EFI_ACPI_6_4_HMAT_STRUCTURE_HEADER, HmatHdr, TableLength); + /* iterate HMAT structs in HMAT ACPI table */ + while (hmat_struct < hmat_end) { + /* look for system locality latency and bandwidth info HMAT structure */ + if (hmat_struct->Type == EFI_ACPI_6_4_HMAT_TYPE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO) { + curr_bw_struct = ( + EFI_ACPI_6_4_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO *) hmat_struct; + /* update info table, if the data captured by structure is of type bandwidth */ + if (curr_bw_struct->Flags.MemoryHierarchy == HMAT_MEM_HIERARCHY_MEMORY) + if (curr_bw_struct->DataType == HMAT_DATA_TYPE_ACCESS_BW || + curr_bw_struct->DataType == HMAT_DATA_TYPE_WRITE_BW || + curr_bw_struct->DataType == HMAT_DATA_TYPE_READ_BW) + pal_hmat_update_info(HmatTable, curr_bw_struct); + } + /* point to next hmat structure*/ + hmat_struct = ADD_PTR(EFI_ACPI_6_4_HMAT_STRUCTURE_HEADER, hmat_struct, hmat_struct->Length); + } + pal_hmat_dump_info_table(HmatTable); +} diff --git a/platform/pal_uefi/src/pal_iovirt.c b/platform/pal_uefi/src/pal_iovirt.c index 7127bd79..485ff308 100644 --- a/platform/pal_uefi/src/pal_iovirt.c +++ b/platform/pal_uefi/src/pal_iovirt.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2019, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2019, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,12 +19,8 @@ #include #include #include - -#include #include -#include "Include/IndustryStandard/Acpi61.h" - #include "include/pal_uefi.h" #include "include/platform_override.h" #include "include/pal_iovirt.h" @@ -59,7 +55,8 @@ dump_block(IOVIRT_BLOCK *block) { return; case IOVIRT_NODE_NAMED_COMPONENT: sbsa_print(AVS_PRINT_INFO, - L" Named Component: Device Name:%a\n", block->data.name); + L" Named Component:\n Device Name:%a", block->data.named_comp.name); + sbsa_print(AVS_PRINT_INFO, L"\n CCA Attribute: 0x%lx\n", block->data.named_comp.cca); break; case IOVIRT_NODE_PCI_ROOT_COMPLEX: sbsa_print(AVS_PRINT_INFO, @@ -252,14 +249,17 @@ iort_add_block(IORT_TABLE *iort, IORT_NODE *iort_node, IOVIRT_INFO_TABLE *IoVirt count = &IoVirtTable->num_its_groups; break; case IOVIRT_NODE_NAMED_COMPONENT: - AsciiStrnCpyS((CHAR8*)(*data).name, MAX_NAMED_COMP_LENGTH, + AsciiStrnCpyS((CHAR8*)(*data).named_comp.name, MAX_NAMED_COMP_LENGTH, (CHAR8*)((IORT_NAMED_COMPONENT*)node_data)->device_name, (MAX_NAMED_COMP_LENGTH -1)); + (*data).named_comp.cca = (UINT32)(((IORT_NAMED_COMPONENT*)node_data)->memory_properties & IOVIRT_CCA_MASK); + (*data).named_comp.smmu_base = 0; /* initialize smmu_base info for named component */ count = &IoVirtTable->num_named_components; break; case IOVIRT_NODE_PCI_ROOT_COMPLEX: (*data).rc.segment = ((IORT_ROOT_COMPLEX*)node_data)->pci_segment_number; (*data).rc.cca = (UINT32)(((IORT_ROOT_COMPLEX*)node_data)->memory_properties & IOVIRT_CCA_MASK); (*data).rc.ats_attr = ((IORT_ROOT_COMPLEX*)node_data)->ats_attribute; + (*data).rc.smmu_base = 0; /* initialize smmu_base info for root complex */ count = &IoVirtTable->num_pci_rcs; break; case IOVIRT_NODE_SMMU: @@ -330,7 +330,6 @@ iort_add_block(IORT_TABLE *iort, IORT_NODE *iort_node, IOVIRT_INFO_TABLE *IoVirt * Else save NULL pointer. */ temp_block = ADD_PTR(IOVIRT_BLOCK, IoVirtTable, offset); - (*data).rc.smmu_base = 0; if (((*block)->type == IOVIRT_NODE_PCI_ROOT_COMPLEX) && ((temp_block->type == IOVIRT_NODE_SMMU) || (temp_block->type == IOVIRT_NODE_SMMU_V3))) { @@ -338,6 +337,18 @@ iort_add_block(IORT_TABLE *iort, IORT_NODE *iort_node, IOVIRT_INFO_TABLE *IoVirt (*data).rc.smmu_base = (*temp_data).smmu.base; } + /* If this node is a named component, Check whether it is behind a SMMU + * store the SMMU base in named component info structure if true, else + * save NULL pointer. + */ + temp_block = ADD_PTR(IOVIRT_BLOCK, IoVirtTable, offset); + if (((*block)->type == IOVIRT_NODE_NAMED_COMPONENT) && + ((temp_block->type == IOVIRT_NODE_SMMU) || + (temp_block->type == IOVIRT_NODE_SMMU_V3))) { + temp_data = &(temp_block->data); + (*data).named_comp.smmu_base = (*temp_data).smmu.base; + } + } } /* So we successfully added a new block. Calculate its offset */ diff --git a/platform/pal_uefi/src/pal_misc.c b/platform/pal_uefi/src/pal_misc.c index 96a0098f..de1d7973 100644 --- a/platform/pal_uefi/src/pal_misc.c +++ b/platform/pal_uefi/src/pal_misc.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -424,6 +424,55 @@ pal_mem_calloc ( return Buffer; } +/** + @brief Creates a buffer with length equal to size within the + address range (mem_base, mem_base + mem_size) + + @param mem_base - Base address of the memory range + @param mem_size - Size of the memory range of interest + @param size - Buffer size to be created + + @return Buffer address if SUCCESSFUL, else NULL +**/ +VOID * +pal_mem_alloc_at_address ( + UINT64 mem_base, + UINT64 Size + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS PageBase; + + PageBase = mem_base; + Status = gBS->AllocatePages (AllocateAddress, + EfiBootServicesData, + EFI_SIZE_TO_PAGES(Size), + &PageBase); + if (EFI_ERROR(Status)) + { + sbsa_print(AVS_PRINT_ERR, L" Allocate Pages failed %x \n", Status); + return NULL; + } + + return (VOID*)(UINTN)PageBase; +} + +/** + @brief Free number of pages in the memory as requested. + + @param PageBase Address from where we need to free + @param NumPages Number of memory pages needed + + @return None +**/ +VOID +pal_mem_free_at_address( + UINT64 mem_base, + UINT64 Size + ) +{ + gBS->FreePages(mem_base, EFI_SIZE_TO_PAGES(Size)); +} /** * @brief Allocates requested buffer size in bytes in a contiguous cacheable * memory and returns the base address of the range. diff --git a/platform/pal_uefi/src/pal_mpam.c b/platform/pal_uefi/src/pal_mpam.c new file mode 100644 index 00000000..edc11419 --- /dev/null +++ b/platform/pal_uefi/src/pal_mpam.c @@ -0,0 +1,263 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include +#include +#include + +#include "include/pal_uefi.h" +#include "include/platform_override.h" +#include "include/pal_mpam.h" + +#define ADD_PTR(t, p, l) ((t*)((UINT8*)p + l)) + +UINT64 pal_get_mpam_ptr(); + +UINT64 pal_get_srat_ptr(); + +/** + @brief Display MPAM info table details + + @param MpamTable - Address to the MPAM information table. + + @return None +**/ +VOID +pal_mpam_dump_table(MPAM_INFO_TABLE *MpamTable) +{ + UINT32 i, j; + MPAM_MSC_NODE *curr_entry; + + if (MpamTable == NULL) { + return; + } + + /* point to first entry in MPAM info table*/ + curr_entry = &(MpamTable->msc_node[0]); + + for (i = 0; i < MpamTable->msc_count; i++) { + sbsa_print(AVS_PRINT_INFO, L"\nMSC node Index :%d ", i); + sbsa_print(AVS_PRINT_INFO, L"\nMSC base addr :%llx ", + curr_entry->msc_base_addr); + sbsa_print(AVS_PRINT_INFO, L"\nMSC resource count :%lx ", + curr_entry->rsrc_count); + + for (j = 0; j < curr_entry->rsrc_count; j++) { + sbsa_print(AVS_PRINT_INFO, L"\nRESOURCE index :%d ", j); + sbsa_print(AVS_PRINT_INFO, L"\nRIS index :%d ", + curr_entry->rsrc_node[j].ris_index); + sbsa_print(AVS_PRINT_INFO, L"\nlocator type :%08X ", + curr_entry->rsrc_node[j].locator_type); + sbsa_print(AVS_PRINT_INFO, L"\ndescriptor1 :%llx ", + curr_entry->rsrc_node[j].descriptor1); + } + curr_entry = MPAM_NEXT_MSC(curr_entry); + } +} + +/** + @brief Display SRAT info table details + + @param SratTable - Address to the SRAT information table. + + @return None +**/ +VOID +pal_srat_dump_table(SRAT_INFO_TABLE *SratTable) +{ + UINT32 i; + SRAT_INFO_ENTRY *curr_entry; + + if (SratTable == NULL) { + return; + } + + for (i = 0; i < SratTable->num_of_srat_entries; i++) { + curr_entry = &(SratTable->srat_info[i]); + if ( curr_entry->node_type == SRAT_NODE_MEM_AFF) { + sbsa_print(AVS_PRINT_INFO, L"\n SRAT mem prox domain :%x ", + curr_entry->node_data.mem_aff.prox_domain); + sbsa_print(AVS_PRINT_INFO, L"\n SRAT mem addr_base :%llx ", + curr_entry->node_data.mem_aff.addr_base); + sbsa_print(AVS_PRINT_INFO, L"\n SRAT mem addr_len :%llx ", + curr_entry->node_data.mem_aff.addr_len); + } + else if ( curr_entry->node_type == SRAT_NODE_GICC_AFF) { + sbsa_print(AVS_PRINT_INFO, L"\n SRAT Gicc prox domain :%x ", + curr_entry->node_data.gicc_aff.prox_domain); + sbsa_print(AVS_PRINT_INFO, L"\n SRAT Gicc processor uid :%x ", + curr_entry->node_data.gicc_aff.proc_uid); + } + } +} + +/** + @brief This API fills in the MPAM_INFO_TABLE with the platform information + This is achieved by parsing the ACPI - MPAM table. + + @param MpamTable - Address where the MPAM information needs to be filled. + + @return None +**/ +VOID +pal_mpam_create_info_table(MPAM_INFO_TABLE *MpamTable) +{ + UINT32 i; + EFI_ACPI_MPAM_TABLE *mpam; + EFI_ACPI_MPAM_MSC_NODE_STRUCTURE *msc_node, *msc_end; + EFI_ACPI_MPAM_RESOURCE_NODE_STRUCTURE *rsrc_node; + MPAM_MSC_NODE *curr_entry; + + if (MpamTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L" Input MPAM Table Pointer is NULL \n"); + return; + } + + /* Initialize MpamTable */ + MpamTable->msc_count = 0; + + /* point to first entry in MPAM info table*/ + curr_entry = &(MpamTable->msc_node[0]); + + mpam = (EFI_ACPI_MPAM_TABLE *)pal_get_mpam_ptr(); + if (mpam == NULL) { + sbsa_print(AVS_PRINT_DEBUG, L" MPAM table not found\n"); + return; + } + + /* Pointer to the first MSC node */ + msc_node = ADD_PTR(EFI_ACPI_MPAM_MSC_NODE_STRUCTURE, mpam, + sizeof(EFI_ACPI_DESCRIPTION_HEADER)); + msc_end = ADD_PTR(EFI_ACPI_MPAM_MSC_NODE_STRUCTURE, mpam, + mpam->header.Length); + + /* Populate MPAM table MSC node from acpi table MSC node*/ + while (msc_node < msc_end) { + curr_entry->msc_base_addr = msc_node->base_address; + curr_entry->msc_addr_len = msc_node->mmio_size; + curr_entry->max_nrdy = msc_node->max_nrdy_usec; + curr_entry->rsrc_count = msc_node->num_resource_nodes; + + /* Each MSC can have multiple resource node, Populate info table resource + node from acpi table resource node*/ + rsrc_node = ADD_PTR(EFI_ACPI_MPAM_RESOURCE_NODE_STRUCTURE, msc_node, + sizeof(EFI_ACPI_MPAM_MSC_NODE_STRUCTURE)); + i = 0; + + while (i < curr_entry->rsrc_count) { + curr_entry->rsrc_node[i].ris_index = rsrc_node->ris_index; + curr_entry->rsrc_node[i].locator_type = rsrc_node->locator_type; + curr_entry->rsrc_node[i].descriptor1 = rsrc_node->descriptor1; + rsrc_node = ADD_PTR(EFI_ACPI_MPAM_RESOURCE_NODE_STRUCTURE, rsrc_node, + sizeof(EFI_ACPI_MPAM_RESOURCE_NODE_STRUCTURE) + + (sizeof(EFI_ACPI_MPAM_FUNC_DEPEN_DESC_STRUCTURE) * + rsrc_node->num_dependencies)); + i++; + } + MpamTable->msc_count++; + msc_node = ADD_PTR(EFI_ACPI_MPAM_MSC_NODE_STRUCTURE, msc_node, + msc_node->length); + curr_entry = MPAM_NEXT_MSC(curr_entry); + } + pal_mpam_dump_table(MpamTable); +} + +/** + @brief This API fills in the SRAT_INFO_TABLE with the platform information + This is achieved by parsing the ACPI - SRAT table. + + @param SratTable - Address where the SRAT information needs to be filled. + + @return None +**/ +VOID +pal_srat_create_info_table(SRAT_INFO_TABLE *SratTable) +{ + EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *SratHdr; + EFI_ACPI_6_4_SRAT_STRUCTURE_HEADER *Entry = NULL; + EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE *Mem_Aff_Entry = NULL; + EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE *Gicc_Aff_Entry = NULL; + SRAT_INFO_ENTRY *Ptr = NULL; + UINT32 TableLength = 0; + UINT32 Length = 0; + + if (SratTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L" Input SRAT Table Pointer is NULL \n"); + return; + } + + /* Initialize SratTable */ + SratTable->num_of_mem_ranges = 0; + SratTable->num_of_srat_entries = 0; + + SratHdr = (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *) pal_get_srat_ptr(); + + if (SratHdr != NULL) { + TableLength = SratHdr->Header.Length; + sbsa_print(AVS_PRINT_INFO, L" SRAT is at %x and length is %x \n", SratHdr, TableLength); + } else { + sbsa_print(AVS_PRINT_DEBUG, L" SRAT not found \n"); + return; + } + + Entry = (EFI_ACPI_6_4_SRAT_STRUCTURE_HEADER *) (SratHdr + 1); + Length = sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER); + Ptr = SratTable->srat_info; + + do { + + if (Entry->Type == EFI_ACPI_6_4_MEMORY_AFFINITY) { + //Fill in the mem ranges proximity domain, addr, len + Mem_Aff_Entry = (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE *) Entry; + Ptr->node_type = Mem_Aff_Entry->Type; + Ptr->node_data.mem_aff.prox_domain = Mem_Aff_Entry->ProximityDomain; + Ptr->node_data.mem_aff.addr_base = ((UINT64) Mem_Aff_Entry->AddressBaseHigh << 32) | + Mem_Aff_Entry->AddressBaseLow; + Ptr->node_data.mem_aff.addr_len = ((UINT64) Mem_Aff_Entry->LengthHigh << 32) | + Mem_Aff_Entry->LengthLow; + Ptr->node_data.mem_aff.flags = Mem_Aff_Entry->Flags; + sbsa_print(AVS_PRINT_DEBUG, L" Proximity Domain %x \n", Ptr->node_data.mem_aff.prox_domain); + sbsa_print(AVS_PRINT_DEBUG, L" Address %x \n", Ptr->node_data.mem_aff.addr_base); + sbsa_print(AVS_PRINT_DEBUG, L" Length %x \n", Ptr->node_data.mem_aff.addr_len); + pal_pe_data_cache_ops_by_va((UINT64)Ptr, CLEAN_AND_INVALIDATE); + Ptr++; + SratTable->num_of_mem_ranges++; + SratTable->num_of_srat_entries++; + } + + else if (Entry->Type == EFI_ACPI_6_4_GICC_AFFINITY) { + Gicc_Aff_Entry = (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE *) Entry; + Ptr->node_type = Gicc_Aff_Entry->Type; + Ptr->node_data.gicc_aff.prox_domain = Gicc_Aff_Entry->ProximityDomain; + Ptr->node_data.gicc_aff.proc_uid = Gicc_Aff_Entry->AcpiProcessorUid; + Ptr->node_data.gicc_aff.flags = Gicc_Aff_Entry->Flags; + Ptr->node_data.gicc_aff.clk_domain = Gicc_Aff_Entry->ClockDomain; + sbsa_print(AVS_PRINT_DEBUG, L" Proximity Domain %x \n", Ptr->node_data.gicc_aff.prox_domain); + sbsa_print(AVS_PRINT_DEBUG, L" Processor UID %x \n", Ptr->node_data.gicc_aff.proc_uid); + sbsa_print(AVS_PRINT_DEBUG, L" Clock Domain %x \n", Ptr->node_data.gicc_aff.clk_domain); + pal_pe_data_cache_ops_by_va((UINT64)Ptr, CLEAN_AND_INVALIDATE); + Ptr++; + SratTable->num_of_srat_entries++; + } + Length += Entry->Length; + Entry = (EFI_ACPI_6_4_SRAT_STRUCTURE_HEADER *) ((UINT8 *)Entry + + (Entry->Length)); + } while(Length < TableLength); + + pal_srat_dump_table(SratTable); +} diff --git a/platform/pal_uefi/src/pal_pcie.c b/platform/pal_uefi/src/pal_pcie.c index 458661dd..9c5eed3c 100644 --- a/platform/pal_uefi/src/pal_pcie.c +++ b/platform/pal_uefi/src/pal_pcie.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,10 +19,7 @@ #include #include #include - -#include "Include/IndustryStandard/Acpi61.h" #include "Include/IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h" -#include #include #include "Include/IndustryStandard/Pci.h" @@ -222,7 +219,7 @@ UINT32 pal_pcie_p2p_support() { /* - * TODO + * This is platform specific API which needs to be populated with system p2p capability * PCIe support for peer to peer * transactions is platform implementation specific */ @@ -246,7 +243,7 @@ pal_pcie_dev_p2p_support ( UINT32 Fn) { /* - * TODO + * This is platform specific API which needs to be populated with pcie device p2p capability * Root port or Switch support for peer to peer * transactions is platform implementation specific */ @@ -383,7 +380,7 @@ pal_pcie_check_device_list(void) accessed from the BAR base and is within BAR limit value - @param memory offset + @param type @return memory offset **/ UINT32 diff --git a/platform/pal_uefi/src/pal_pe.c b/platform/pal_uefi/src/pal_pe.c index 5ab15bda..537c3efc 100644 --- a/platform/pal_uefi/src/pal_pe.c +++ b/platform/pal_uefi/src/pal_pe.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,13 +18,12 @@ #include #include #include - -#include "Include/IndustryStandard/Acpi61.h" -#include #include #include "include/pal_uefi.h" +UINT64 pal_get_pptt_ptr(void); + static EFI_ACPI_6_1_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *gMadtHdr; UINT8 *gSecondaryPeStack; UINT64 gMpidrMax; @@ -34,6 +33,11 @@ extern INT32 gPsciConduit; #define SIZE_STACK_SECONDARY_PE 0x100 //256 bytes per core #define UPDATE_AFF_MAX(src,dest,mask) ((dest & mask) > (src & mask) ? (dest & mask) : (src & mask)) +#define PPTT_STRUCT_OFFSET 0x24 +#define PPTT_PE_PRIV_RES_OFFSET 0x14 +#define ADD_PTR(t, p, l) ((t*)((UINT8*)p + l)) +#define GET_ADDR_DIFF(a, b) ((UINT8*)a - (UINT8*)b) + UINT64 pal_get_madt_ptr(); @@ -182,7 +186,7 @@ pal_pe_create_info_table(PE_INFO_TABLE *PeTable) { EFI_ACPI_6_1_GIC_STRUCTURE *Entry = NULL; PE_INFO_ENTRY *Ptr = NULL; - UINT32 TableLength = 0; + UINT32 TableLength = 0, i; UINT32 Length = 0; UINT64 MpidrAff0Max = 0, MpidrAff1Max = 0, MpidrAff2Max = 0, MpidrAff3Max = 0; @@ -216,7 +220,10 @@ pal_pe_create_info_table(PE_INFO_TABLE *PeTable) Ptr->pe_num = PeTable->header.num_of_pe; Ptr->pmu_gsiv = Entry->PerformanceInterruptGsiv; Ptr->gmain_gsiv = Entry->VGICMaintenanceInterrupt; - sbsa_print(AVS_PRINT_DEBUG, L" MPIDR %x PE num %x \n", Ptr->mpidr, Ptr->pe_num); + Ptr->acpi_proc_uid = Entry->AcpiProcessorUid; + for (i = 0; i < MAX_L1_CACHE_RES; i++) + Ptr->level_1_res[i] = DEFAULT_CACHE_IDX; //initialize cache index fields with all 1's + sbsa_print(AVS_PRINT_DEBUG, L" MPIDR %llx PE num %x \n", Ptr->mpidr, Ptr->pe_num); pal_pe_data_cache_ops_by_va((UINT64)Ptr, CLEAN_AND_INVALIDATE); Ptr++; PeTable->header.num_of_pe++; @@ -387,3 +394,257 @@ pal_pe_data_cache_ops_by_va(UINT64 addr, UINT32 type) } } + +/** + @brief This API prints cache info table and cache entry indices for each pe. + @param CacheTable Pointer to cache info table. + @param PeTable Pointer to pe info table. + @return None +**/ +VOID +pal_cache_dump_info_table(CACHE_INFO_TABLE *CacheTable, PE_INFO_TABLE *PeTable) +{ + UINT32 i, j; + CACHE_INFO_ENTRY *curr_entry; + PE_INFO_ENTRY *pe_entry; + curr_entry = CacheTable->cache_info; + pe_entry = PeTable->pe_info; + + /*Iterate cache info table and print cache info entries*/ + for (i = 0 ; i < CacheTable->num_of_cache ; i++) { + sbsa_print(AVS_PRINT_INFO, L"\nCache info * Index %d *", i); + sbsa_print(AVS_PRINT_INFO, L"\n Offset: 0x%llx", curr_entry->my_offset); + sbsa_print(AVS_PRINT_INFO, L"\n Type: 0x%llx", curr_entry->cache_type); + sbsa_print(AVS_PRINT_INFO, L"\n Cache ID: 0x%llx", curr_entry->cache_id); + sbsa_print(AVS_PRINT_INFO, L"\n Size: 0x%llx", curr_entry->size); + sbsa_print(AVS_PRINT_INFO, L"\n Next level index: %d", curr_entry->next_level_index); + sbsa_print(AVS_PRINT_INFO, L"\n Private flag: 0x%llx\n", curr_entry->is_private); + curr_entry++; + } + + sbsa_print(AVS_PRINT_INFO, L"\nPE level one cache index info"); + /*Iterate PE info table and print level one cache index info*/ + for (i = 0 ; i < PeTable->header.num_of_pe; i++) { + sbsa_print(AVS_PRINT_INFO, L"\nPE Index * %d *", i); + sbsa_print(AVS_PRINT_INFO, L"\n Level 1 Cache index(s) :"); + + for (j = 0; pe_entry->level_1_res[j] != DEFAULT_CACHE_IDX && j < MAX_L1_CACHE_RES; j++) { + sbsa_print(AVS_PRINT_INFO, L" %d,", pe_entry->level_1_res[j]); + } + sbsa_print(AVS_PRINT_INFO, L"\n"); + pe_entry++; + } +} + +/** + @brief This function parses and stores cache info in cache info table + Caller - pal_cache_create_info_table + @param CacheTable Pointer to cache info table. + @param cache_type_struct Pointer to PPTT cache structure that needs to be parsed. + @param offset Offset of the cache structure in PPTT ACPI table. + @param is_private Flag indicating whether the cache is private. + @return Index to the cache info entry where parsed info is stored. +**/ + +UINT32 +pal_cache_store_info(CACHE_INFO_TABLE *CacheTable, + EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE *cache_type_struct, + UINT32 offset, UINT32 is_private) +{ + CACHE_INFO_ENTRY *curr_entry; + curr_entry = &(CacheTable->cache_info[CacheTable->num_of_cache]); + CacheTable->num_of_cache++; + + curr_entry->my_offset = offset; + curr_entry->flags.size_property_valid = cache_type_struct->Flags.SizePropertyValid; + curr_entry->flags.cache_type_valid = cache_type_struct->Flags.CacheTypeValid; + curr_entry->flags.cache_id_valid = cache_type_struct->Flags.CacheIdValid; + curr_entry->size = cache_type_struct->Size; + curr_entry->cache_type = cache_type_struct->Attributes.CacheType; + curr_entry->cache_id = cache_type_struct->CacheId; + curr_entry->is_private = is_private; + + /* set default next level index to invalid */ + curr_entry->next_level_index = CACHE_INVALID_NEXT_LVL_IDX; + + return CacheTable->num_of_cache - 1; +} + +/** + @brief This function checks whether the cache info for a particular cache already stored. + Caller - pal_cache_create_info_table + @param CacheTable Pointer to cache info table. + @param offset Offset of the cache structure in PPTT ACPI table. + @param found_index pointer to a variable, to return index if cache info already present. + @return 0 if cache info not present, 1 otherwise +**/ +UINT32 +pal_cache_find(CACHE_INFO_TABLE *CacheTable, UINT32 offset, UINT32 *found_index) +{ + CACHE_INFO_ENTRY *curr_entry; + UINT32 i; + + curr_entry = CacheTable->cache_info; + for (i = 0 ; i < CacheTable->num_of_cache ; i++) { + /* match cache offset of the entry with input offset*/ + if(curr_entry->my_offset == offset) { + *found_index = i; + return 1; + } + curr_entry++; + } + return 0; +} + +/** + @brief This function stores level 1 cache info entry index(s) to pe info table. + Caller - pal_cache_create_info_table + @param PeTable Pointer to pe info table. + @param acpi_uid ACPI UID of the pe entry, to which index(s) to be stored. + @param cache_index index of the level 1 cache entry. + @param res_index private resource index of pe private cache. + @return None +**/ +VOID +pal_cache_store_pe_res(PE_INFO_TABLE *PeTable, UINT32 acpi_uid, + UINT32 cache_index, UINT32 res_index) +{ + PE_INFO_ENTRY *entry; + entry = PeTable->pe_info; + UINT32 i; + + if (res_index < MAX_L1_CACHE_RES) { + for (i = 0 ; i < PeTable->header.num_of_pe; i++) { + if (entry->acpi_proc_uid == acpi_uid) { + entry->level_1_res[res_index] = cache_index; + } + entry++; + } + } + else + sbsa_print(AVS_PRINT_ERR, + L"\n The input resource index is greater than supported value %d", MAX_L1_CACHE_RES); +} + + +/** + @brief Parses ACPI PPTT table and populates the local cache info table. + Prerequisite - pal_pe_create_info_table + @param CacheTable Pointer to pre-allocated memory for cache info table. + @return None +**/ + +VOID +pal_cache_create_info_table(CACHE_INFO_TABLE *CacheTable, PE_INFO_TABLE *PeTable) +{ + EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_HEADER *PpttHdr; + UINT32 TableLength = 0; + EFI_ACPI_6_4_PPTT_STRUCTURE_HEADER *pptt_struct, *pptt_end ; + EFI_ACPI_6_4_PPTT_STRUCTURE_PROCESSOR *pe_type_struct, *temp_pe_struct; + EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE *cache_type_struct; + UINT32 i, j, status=0; + UINT32 offset; + UINT32 index; + UINT32 next_index; + + if (CacheTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L" Unable to create cache info table, input pointer is NULL \n"); + return; + } + + /* initialize cache info table entries */ + CacheTable->num_of_cache = 0; + + PpttHdr = (EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_HEADER *) pal_get_pptt_ptr(); + if (PpttHdr == NULL) { + sbsa_print(AVS_PRINT_ERR, L" PPTT Table not found\n"); + return; + } + else { + TableLength = PpttHdr->Header.Length; + sbsa_print(AVS_PRINT_INFO, L"PPTT table found at 0x%llx with length 0x%x\n", + PpttHdr, TableLength); + } + +/* Pointer to first PPTT structure in PPTT ACPI table */ + pptt_struct = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_HEADER, PpttHdr, PPTT_STRUCT_OFFSET); + +/* PPTT end boundary */ + pptt_end = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_HEADER, PpttHdr, TableLength); + +/* iterate PPTT structs in PPTT ACPI Table */ + while (pptt_struct < pptt_end) { + if (pptt_struct->Type == EFI_ACPI_6_4_PPTT_TYPE_PROCESSOR) { + pe_type_struct = (EFI_ACPI_6_4_PPTT_STRUCTURE_PROCESSOR *) pptt_struct; + /* check whether the PPTT PE structure corresponds to a actual PE and not a group */ + if (pe_type_struct->Flags.NodeIsALeaf == 1) { + /* Parse PE private cache resources*/ + for (i = 0 ; i < pe_type_struct->NumberOfPrivateResources ; i++) { + offset = *(ADD_PTR(UINT32, pe_type_struct, PPTT_PE_PRIV_RES_OFFSET + i*4)); + cache_type_struct = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE, PpttHdr, offset); + index = pal_cache_store_info(CacheTable, cache_type_struct, offset, CACHE_TYPE_PRIVATE); + pal_cache_store_pe_res(PeTable, pe_type_struct->AcpiProcessorId, index, i); + /* parse next level(s) of current private PE cache */ + while(cache_type_struct->NextLevelOfCache != 0) { + offset = cache_type_struct->NextLevelOfCache; + cache_type_struct = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE, PpttHdr, offset); + /* check if cache PPTT struct is already parsed*/ + status = pal_cache_find(CacheTable, offset, &next_index); + /* if cache structure is already parsed update the previous cache info with index + of found cache entry in cache_info_table, else parse the cache structure*/ + if (status) { + CacheTable->cache_info[index].next_level_index = next_index; + break; + } + else { + CacheTable->cache_info[index].next_level_index = CacheTable->num_of_cache; + index = pal_cache_store_info(CacheTable, cache_type_struct, + offset, CACHE_TYPE_PRIVATE); + } + } + + /* if a cache entry is already present in info table, then it means next level cache(s) + for that cache is already parsed in past iteration, else parse parent PE group */ + if (status) continue; + temp_pe_struct = pe_type_struct; + + /* Keep on parsing PPTT PE group structures until root */ + while (temp_pe_struct->Parent != 0 ) { + temp_pe_struct = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_PROCESSOR, PpttHdr, + temp_pe_struct->Parent); + /* If a group has cache resources parse it */ + for (j = 0 ; j < temp_pe_struct->NumberOfPrivateResources;j++) { + offset = *(ADD_PTR(UINT32, temp_pe_struct, PPTT_PE_PRIV_RES_OFFSET + j*4)); + cache_type_struct = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE, PpttHdr, offset); + /* Next level cache type should unified type(0x2 or 0x3) or same as previous type*/ + if (cache_type_struct->Attributes.CacheType > 0x1 || + cache_type_struct->Attributes.CacheType == + CacheTable->cache_info[index].cache_type ) { + status = pal_cache_find(CacheTable, offset, &next_index); + /* if cache structure is already parsed update the previous cache info with index + of found cache entry in cache_info_table, else parse the cache structure */ + if (status) { + CacheTable->cache_info[index].next_level_index = next_index; + break; + } + else { + CacheTable->cache_info[index].next_level_index = CacheTable->num_of_cache; + index = pal_cache_store_info(CacheTable, cache_type_struct, offset, + CACHE_TYPE_SHARED); + } + } + } + /* If cache entry already found in info table, then it means next level cache(s) + for that cache is already parsed in past iteration, else parse parent PE group + of current group */ + if(status) break; + } + } + } + } + pptt_struct = ADD_PTR(EFI_ACPI_6_4_PPTT_STRUCTURE_HEADER, pptt_struct, pptt_struct->Length); + } + pal_cache_dump_info_table(CacheTable, PeTable); +} + + diff --git a/platform/pal_uefi/src/pal_peripherals.c b/platform/pal_uefi/src/pal_peripherals.c index 643f6d4d..81a36e6f 100644 --- a/platform/pal_uefi/src/pal_peripherals.c +++ b/platform/pal_uefi/src/pal_peripherals.c @@ -22,9 +22,6 @@ #include #include #include - -#include -#include "Include/IndustryStandard/Acpi61.h" #include "Include/IndustryStandard/SerialPortConsoleRedirectionTable.h" #include "include/pal_uefi.h" @@ -67,6 +64,7 @@ pal_peripheral_create_info_table(PERIPHERAL_INFO_TABLE *peripheralInfoTable) peripheralInfoTable->header.num_usb = 0; peripheralInfoTable->header.num_sata = 0; peripheralInfoTable->header.num_uart = 0; + peripheralInfoTable->header.num_all = 0; /* check for any USB Controllers */ do { @@ -78,6 +76,7 @@ pal_peripheral_create_info_table(PERIPHERAL_INFO_TABLE *peripheralInfoTable) per_info->bdf = DeviceBdf; sbsa_print(AVS_PRINT_INFO, L" Found a USB controller %4x \n", per_info->base0); peripheralInfoTable->header.num_usb++; + peripheralInfoTable->header.num_all++; per_info++; } StartBdf = incrementBusDev(DeviceBdf); @@ -95,6 +94,7 @@ pal_peripheral_create_info_table(PERIPHERAL_INFO_TABLE *peripheralInfoTable) per_info->bdf = DeviceBdf; sbsa_print(AVS_PRINT_INFO, L" Found a SATA controller %4x \n", per_info->base0); peripheralInfoTable->header.num_sata++; + peripheralInfoTable->header.num_all++; per_info++; } //Increment and check if we have more controllers @@ -107,6 +107,7 @@ pal_peripheral_create_info_table(PERIPHERAL_INFO_TABLE *peripheralInfoTable) if (spcr) { peripheralInfoTable->header.num_uart++; + peripheralInfoTable->header.num_all++; per_info->base0 = spcr->BaseAddress.Address; per_info->irq = spcr->GlobalSystemInterrupt; per_info->type = PERIPHERAL_TYPE_UART; @@ -115,6 +116,7 @@ pal_peripheral_create_info_table(PERIPHERAL_INFO_TABLE *peripheralInfoTable) if (PLATFORM_GENERIC_UART_BASE) { peripheralInfoTable->header.num_uart++; + peripheralInfoTable->header.num_all++; per_info->base0 = PLATFORM_GENERIC_UART_BASE; per_info->irq = PLATFORM_GENERIC_UART_INTID; per_info->type = PERIPHERAL_TYPE_UART; diff --git a/platform/pal_uefi/src/pal_pmu.c b/platform/pal_uefi/src/pal_pmu.c new file mode 100644 index 00000000..a6e57406 --- /dev/null +++ b/platform/pal_uefi/src/pal_pmu.c @@ -0,0 +1,216 @@ +/** @file + * Copyright (c) 2022-2023 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include +#include +#include + +#include "include/pal_uefi.h" +#include "include/platform_override.h" +#include "include/pal_pmu.h" + +#define ADD_PTR(t, p, l) ((t*)((UINT8*)p + l)) +#define MAX_NUM_OF_PMU_SUPPORTED 512 + +UINT64 pal_get_apmt_ptr(); + +/** + @brief Display PMU info table details + + @param PmuTable - Address to the PMU information table. + + @return None +**/ +VOID +pal_pmu_dump_info_table(PMU_INFO_TABLE *PmuTable) +{ + UINT32 i; + + if (PmuTable == NULL) { + return; + } + + for (i = 0; i < PmuTable->pmu_count; i++) { + sbsa_print(AVS_PRINT_INFO, L"\nPMU info Index :%d ", i); + sbsa_print(AVS_PRINT_INFO, L"\nPMU node type :%02X ", PmuTable->info[i].type); + sbsa_print(AVS_PRINT_INFO, L"\nDual page extension :%d ", + PmuTable->info[i].dual_page_extension); + sbsa_print(AVS_PRINT_INFO, L"\nBase Address 0 :%llX ", PmuTable->info[i].base0); + if(PmuTable->info[i].dual_page_extension) + sbsa_print(AVS_PRINT_INFO, L"\nBase Address 1 :%llX ", PmuTable->info[i].base1); + sbsa_print(AVS_PRINT_INFO, L"\nPrimary Instance :%llX ", + PmuTable->info[i].primary_instance); + sbsa_print(AVS_PRINT_INFO, L"\nSecondary Instance :%08X ", + PmuTable->info[i].secondary_instance); + + } +} + +/** + @brief This API fills in the PMU_INFO_TABLE with information about local and system + timers in the system. This is achieved by parsing the ACPI - APMT table. + + @param PmuTable - Address where the PMU information needs to be filled. + + @return None +**/ +VOID +pal_pmu_create_info_table(PMU_INFO_TABLE *PmuTable) +{ + APMT_TABLE *apmt; + APMT_NODE *apmt_node, *apmt_end; + + if (PmuTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L"\n Input PMU Table Pointer is NULL"); + return; + } + + /* Initialize PmuTable */ + PmuTable->pmu_count = 0; + + apmt = (APMT_TABLE *)pal_get_apmt_ptr(); + if (apmt == NULL) { + sbsa_print(AVS_PRINT_DEBUG, L" APMT table not found\n"); + return; + } + + /* Pointer to the first APMT node */ + apmt_node = ADD_PTR(APMT_NODE, apmt, sizeof(EFI_ACPI_DESCRIPTION_HEADER)); + apmt_end = ADD_PTR(APMT_NODE, apmt, apmt->header.Length); + + /* Create PMU info block for each APMT node*/ + while (apmt_node < apmt_end) { + PmuTable->info[PmuTable->pmu_count].type = apmt_node->type; + PmuTable->info[PmuTable->pmu_count].dual_page_extension = apmt_node->flags & 1; + PmuTable->info[PmuTable->pmu_count].base0 = apmt_node->base_addr0; + PmuTable->info[PmuTable->pmu_count].base1 = apmt_node->base_addr1; + PmuTable->info[PmuTable->pmu_count].primary_instance = apmt_node->primary_instance; + PmuTable->info[PmuTable->pmu_count].secondary_instance = apmt_node->secondary_instance; + PmuTable->pmu_count++; + if (PmuTable->pmu_count >= MAX_NUM_OF_PMU_SUPPORTED) { + sbsa_print(AVS_PRINT_WARN, L"\n Number of PMUs greater than %d", + MAX_NUM_OF_PMU_SUPPORTED); + break; + } + apmt_node = ADD_PTR(APMT_NODE, apmt_node, apmt_node->length); + } + pal_pmu_dump_info_table(PmuTable); +} + +typedef struct{ + PMU_NODE_INFO_TYPE node_type; + PMU_EVENT_TYPE_e event_desc; + UINT32 event_id; +}event_details; + +/* Array containing the details of implementation defined system PMU events */ +event_details event_list[] = { + {PMU_NODE_MEM_CNTR, PMU_EVENT_IB_TOTAL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_OB_TOTAL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_IB_READ_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_IB_WRITE_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_OB_READ_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_OB_WRITE_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_IB_OPEN_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_IB_TOTAL_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_OB_OPEN_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_OB_TOTAL_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_LOCAL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_REMOTE_BW, PMU_EVENT_INVALID}, + {PMU_NODE_MEM_CNTR, PMU_EVENT_ALL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_IB_TOTAL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_OB_TOTAL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_IB_READ_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_IB_WRITE_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_OB_READ_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_OB_WRITE_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_IB_OPEN_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_IB_TOTAL_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_OB_OPEN_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_OB_TOTAL_TXN, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_LOCAL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_REMOTE_BW, PMU_EVENT_INVALID}, + {PMU_NODE_PCIE_RC, PMU_EVENT_ALL_BW, PMU_EVENT_INVALID}, + {PMU_NODE_ACPI_DEVICE, PMU_EVENT_TRAFFIC_1, PMU_EVENT_INVALID}, + {PMU_NODE_ACPI_DEVICE, PMU_EVENT_TRAFFIC_2, PMU_EVENT_INVALID} +}; + +/** + @brief This API returns the event ID to be filled into PMEVTYPER register. + Prerequisite - event_list array. This API should be called after + filling the required event IDs into event_list array. + + @param event_type - Type of the event. + @param node_type - PMU Node type + + @return Event ID + +**/ +UINT32 +pal_pmu_get_event_info(PMU_EVENT_TYPE_e event_type, PMU_NODE_INFO_TYPE node_type) +{ + UINT32 i=0; + while (event_list[i].node_type != node_type || event_list[i].event_desc != event_type) { + i++; + } + return event_list[i].event_id; +} + +/** + @brief This API checks if pmu monitor count value is valid + @param interface_acpiid - acpiid of interface + @param count_value - monitor count value + @param eventid - eventid + @return 0 - monitor count value is valid + non-zero - error or invallid count value +**/ +UINT32 +pal_pmu_check_monitor_count_value(UINT64 interface_acpiid, UINT32 count_value, UINT32 eventid) +{ + return NOT_IMPLEMENTED; +} + +/** + @brief This API generates required workload for given pmu node and event id + @param interface_acpiid - acpiid of interface + @param pmu_node_index - pmu node index + @param mon_index - monitor index + @param eventid - eventid + @return 0 - success status + non-zero - error status +**/ +UINT32 +pal_generate_traffic(UINT64 interface_acpiid, UINT32 pmu_node_index, + UINT32 mon_index, UINT32 eventid) +{ + return NOT_IMPLEMENTED; +} + +/** + @brief This API checks if PMU node is secure only. + @param interface_acpiid - acpiid of interface + @param num_traffic_type_support - num of traffic type supported. + @return 0 - success status + non-zero - error status +**/ +UINT32 +pal_pmu_get_multi_traffic_support_interface(UINT64 *interface_acpiid, + UINT32 *num_traffic_type_support) +{ + return NOT_IMPLEMENTED; +} diff --git a/platform/pal_uefi/src/pal_ras.c b/platform/pal_uefi/src/pal_ras.c new file mode 100644 index 00000000..10717f19 --- /dev/null +++ b/platform/pal_uefi/src/pal_ras.c @@ -0,0 +1,472 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +**/ + +#include +#include +#include +#include +#include "Include/IndustryStandard/ArmErrorSourceTable.h" + +#include "include/pal_uefi.h" +#include "include/pal_ras.h" +#include "include/platform_override.h" + +#define ADD_PTR(t, p, l) ((t*)((UINT8*)p + l)) + +UINT64 pal_get_aest_ptr(); + +/** + @brief API to check support for Poison + + @param None + + @return 0 - Poison storage & forwarding not supported + 1 - Poison storage & forwarding supported +**/ +UINT32 +pal_ras_check_plat_poison_support() +{ + return 0; +} + +/** + @brief Platform Defined way of setting up the Error Environment + + @param in_param - Error Input Parameters. + @param *out_param - Parameters returned from platform to be used in the test. + + @return 0 - Success, NOT_IMPLEMENTED - API not implemented, Other values - Failure +**/ +UINT32 +pal_ras_setup_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param) +{ + /* Platform Defined way of setting up the Error Environment */ + return NOT_IMPLEMENTED; +} + +/** + @brief Platform Defined way of injecting up the Error Environment + + @param in_param - Error Input Parameters. + @param *out_param - Parameters returned from platform to be used in the test. + + @return 0 - Success, NOT_IMPLEMENTED - API not implemented, Other values - Failure +**/ +UINT32 +pal_ras_inject_error(RAS_ERR_IN_t in_param, RAS_ERR_OUT_t *out_param) +{ + return NOT_IMPLEMENTED; +} + +/** + @brief Platform Defined way of Timeout/Wait loop + + @param count - Timeout/Wait Multiplier. + + @return None +**/ +VOID +pal_ras_wait_timeout(UINT32 count) +{ + UINT32 timeout = count * PLATFORM_TIMEOUT_MEDIUM; + + /* Wait Loop */ + while (timeout > 0) + timeout--; +} + +/** + @brief Display RAS info table details + + @param RasInfoTable - Address to the RAS information table. + + @return None +**/ +VOID +pal_ras_dump_info_table(RAS_INFO_TABLE *RasInfoTable) +{ + UINT32 i, j; + RAS_NODE_INFO *curr; + + if (RasInfoTable == NULL) { + return; + } + + sbsa_print(AVS_PRINT_INFO, L"\nRAS Info :"); + sbsa_print(AVS_PRINT_INFO, L"\nRAS Num Nodes : %d ", RasInfoTable->num_nodes); + + curr = &(RasInfoTable->node[0]); + + for (i = 0; i < RasInfoTable->num_nodes; i++) { + sbsa_print(AVS_PRINT_INFO, L"\n Index : %d ", i); + sbsa_print(AVS_PRINT_INFO, L"\n Type : 0x%x ", curr->type); + sbsa_print(AVS_PRINT_INFO, L"\n Num Intr : 0x%x ", curr->num_intr_entries); + + switch (curr->type) { + case NODE_TYPE_PE: + /* Print Processor Node Details */ + sbsa_print(AVS_PRINT_INFO, L"\n ProcessorID : 0x%x ", curr->node_data.pe.processor_id); + sbsa_print(AVS_PRINT_INFO, L"\n resource_type : 0x%x ", + curr->node_data.pe.resource_type); + sbsa_print(AVS_PRINT_INFO, L"\n flags : 0x%x ", curr->node_data.pe.flags); + sbsa_print(AVS_PRINT_INFO, L"\n affinity : 0x%x ", curr->node_data.pe.affinity); + break; + case NODE_TYPE_MC: + /* Print Memory Controller Node Details */ + sbsa_print(AVS_PRINT_INFO, L"\n proximity_domain : 0x%x ", + curr->node_data.mc.proximity_domain); + break; + default: + break; + } + + sbsa_print(AVS_PRINT_INFO, L"\n Interface Info :"); + sbsa_print(AVS_PRINT_INFO, L"\n type : 0x%x ", curr->intf_info.intf_type); + sbsa_print(AVS_PRINT_INFO, L"\n base : 0x%x ", curr->intf_info.base_addr); + sbsa_print(AVS_PRINT_INFO, L"\n num_err : 0x%x ", curr->intf_info.num_err_rec); + + sbsa_print(AVS_PRINT_INFO, L"\n Interrupt Info :"); + for (j = 0; j < curr->num_intr_entries; j++) { + sbsa_print(AVS_PRINT_INFO, L"\n type : 0x%x ", curr->intr_info[j].type); + sbsa_print(AVS_PRINT_INFO, L"\n gsiv : 0x%x ", curr->intr_info[j].gsiv); + } + + curr++; + } + sbsa_print(AVS_PRINT_INFO, L"\n"); +} + +void fill_node_specific_data ( + RAS_INFO_TABLE *RasInfoTable, + AEST_NODE *aest_node, + RAS_NODE_INFO *curr_node, + EFI_ACPI_AEST_NODE_STRUCT *node_header + ) +{ + EFI_ACPI_AEST_PROCESSOR_STRUCT *pe_node; + EFI_ACPI_AEST_MEMORY_CONTROLLER_STRUCT *mc_node; + + switch (node_header->Type) { + case EFI_ACPI_AEST_NODE_TYPE_PROCESSOR: + /* Fill Processor Node Details */ + pe_node = (EFI_ACPI_AEST_PROCESSOR_STRUCT *)aest_node; + curr_node->type = NODE_TYPE_PE; + curr_node->node_data.pe.processor_id = pe_node->AcpiProcessorId; + curr_node->node_data.pe.resource_type = pe_node->ResourceType; + curr_node->node_data.pe.flags = pe_node->Flags; + curr_node->node_data.pe.affinity = pe_node->ProcessorAffinityLevelIndicator; + RasInfoTable->num_pe_node++; + break; + case EFI_ACPI_AEST_NODE_TYPE_MEMORY: + /* Fill Memory Controller Node Details */ + mc_node = (EFI_ACPI_AEST_MEMORY_CONTROLLER_STRUCT *)aest_node; + curr_node->type = NODE_TYPE_MC; + curr_node->node_data.mc.proximity_domain = mc_node->ProximityDomain; + RasInfoTable->num_mc_node++; + break; + default: + break; + } +} + +void fill_node_interface_data ( + RAS_INFO_TABLE *RasInfoTable, + AEST_NODE *aest_node, + RAS_NODE_INFO *curr_node, + EFI_ACPI_AEST_NODE_STRUCT *node_header + ) +{ + EFI_ACPI_AEST_INTERFACE_STRUCT *node_intf; + + node_intf = ADD_PTR(EFI_ACPI_AEST_INTERFACE_STRUCT, aest_node, node_header->InterfaceOffset); + + curr_node->intf_info.intf_type = node_intf->Type; + curr_node->intf_info.flags = node_intf->Flags; + curr_node->intf_info.base_addr = node_intf->BaseAddress; + curr_node->intf_info.start_rec_index = node_intf->StartErrorRecordIndex; + curr_node->intf_info.num_err_rec = node_intf->NumberErrorRecords; + curr_node->intf_info.err_rec_implement = node_intf->ErrorRecordImplemented; + curr_node->intf_info.err_status_reporting = node_intf->ErrorRecordStatusReportingSupported; + curr_node->intf_info.addressing_mode = node_intf->AddressingMode; +} + +void fill_node_interrupt_data ( + RAS_INFO_TABLE *RasInfoTable, + AEST_NODE *aest_node, + RAS_NODE_INFO *curr_node, + EFI_ACPI_AEST_NODE_STRUCT *node_header + ) +{ + EFI_ACPI_AEST_INTERRUPT_STRUCT *node_intr_data; + UINT32 count = 0; + + node_intr_data = ADD_PTR(EFI_ACPI_AEST_INTERRUPT_STRUCT, aest_node, + node_header->InterruptArrayOffset); + + for (count = 0; count < curr_node->num_intr_entries; count++) + { + curr_node->intr_info[count].type = node_intr_data->InterruptType; + curr_node->intr_info[count].gsiv = node_intr_data->InterruptGsiv; + curr_node->intr_info[count].flag = node_intr_data->InterruptFlags; + curr_node->intr_info[count].its_grp_id = node_intr_data->ItsGroupRefId; + + node_intr_data = ADD_PTR(EFI_ACPI_AEST_INTERRUPT_STRUCT, node_intr_data, + sizeof(EFI_ACPI_AEST_INTERRUPT_STRUCT)); + } + +} +/** + @brief This API fills in the RAS_INFO_TABLE with information about local and system + timers in the system. This is achieved by parsing the ACPI - AEST table. + + @param RasInfoTable - Address where the RAS information needs to be filled. + + @return None +**/ +VOID +pal_ras_create_info_table(RAS_INFO_TABLE *RasInfoTable) +{ + EFI_ACPI_ARM_ERROR_SOURCE_TABLE *aest; + AEST_NODE *aest_node, *aest_end; + EFI_ACPI_AEST_NODE_STRUCT *node_header; + RAS_NODE_INFO *curr_node; + + if (RasInfoTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L"\n Input RAS Table Pointer is NULL"); + return; + } + + /* Initialize RasInfoTable */ + RasInfoTable->num_nodes = 0; + RasInfoTable->num_pe_node = 0; + RasInfoTable->num_mc_node = 0; + + aest = (EFI_ACPI_ARM_ERROR_SOURCE_TABLE *)pal_get_aest_ptr(); + if (aest == NULL) { + sbsa_print(AVS_PRINT_DEBUG, L" AEST table not found\n"); + return; + } + + /* Pointer to the first AEST node */ + aest_node = ADD_PTR(AEST_NODE, aest, sizeof(EFI_ACPI_DESCRIPTION_HEADER)); + aest_end = ADD_PTR(AEST_NODE, aest, aest->Header.Length); + + curr_node = &(RasInfoTable->node[0]); + + /* Create RAS info block for each AEST node*/ + while (aest_node < aest_end) { + /* Add common data for each node */ + node_header = (EFI_ACPI_AEST_NODE_STRUCT *)(aest_node); + + curr_node->type = node_header->Type; + curr_node->length = node_header->Length; + curr_node->num_intr_entries = node_header->InterruptArrayCount; + + /* Fill Node Specific data */ + fill_node_specific_data(RasInfoTable, aest_node, curr_node, node_header); + + /* Fill Node Interface data */ + fill_node_interface_data(RasInfoTable, aest_node, curr_node, node_header); + + /* Fill Node Interrupt data */ + fill_node_interrupt_data(RasInfoTable, aest_node, curr_node, node_header); + + RasInfoTable->num_nodes++; + + if (RasInfoTable->num_nodes >= MAX_NUM_OF_RAS_SUPPORTED) { + sbsa_print(AVS_PRINT_WARN, L"\n Number of RAS nodes greater than %d", + MAX_NUM_OF_RAS_SUPPORTED); + break; + } + + /* Move to the next AEST node */ + aest_node = ADD_PTR(AEST_NODE, aest_node, curr_node->length); + curr_node++; + } + + pal_ras_dump_info_table(RasInfoTable); +} + +/** + @brief Display RAS info table details + + @param RasInfoTable - Address to the RAS information table. + + @return None +**/ +VOID +pal_ras2_dump_info_table(RAS2_INFO_TABLE *RasFeatInfoTable) +{ + RAS2_BLOCK *curr_block; + + if (RasFeatInfoTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L"\n Input RAS Table Pointer is NULL"); + return; + } + + curr_block = RasFeatInfoTable->blocks; + UINT32 i; + + sbsa_print(AVS_PRINT_INFO, L"\nRAS2 Feature Info :"); + sbsa_print(AVS_PRINT_INFO, + L"\n Total number of RAS2 feature info blocks : %d", + RasFeatInfoTable->num_all_block); + sbsa_print(AVS_PRINT_INFO, + L"\n Number of RAS2 memory feature info blocks : %d\n", + RasFeatInfoTable->num_of_mem_block); + + /*Iterate RAS2 feature info table and print info fields */ + for (i = 0 ; i < RasFeatInfoTable->num_all_block ; i++) { + sbsa_print(AVS_PRINT_INFO, L"\n RAS2 feature info * Index %d *", i); + switch(curr_block->type) { + case RAS2_FEATURE_TYPE_MEMORY: + sbsa_print(AVS_PRINT_INFO, L"\n Type : 0x%x", + curr_block->type); + sbsa_print(AVS_PRINT_INFO, L"\n Proximity Domain : 0x%llx", + curr_block->block_info.mem_feat_info.proximity_domain); + sbsa_print(AVS_PRINT_INFO, L"\n Patrol scrub support : 0x%lx\n", + curr_block->block_info.mem_feat_info.patrol_scrub_support); + break; + default: + sbsa_print(AVS_PRINT_INFO, + L"\n Invalid RAS feature type : 0x%x", + curr_block->type); + } + curr_block++; + } +} + + + +/** + @brief This is a helper function to update RAS2_INFO_TABLE block + with required PCCT subspace information for memory instance. + Caller : pal_ras2_create_info_table() + @param pcct - Pointer to PCCT ACPI table + @param curr_block - Pointer to RAS2_BLOCK block. + @param pcct_array_idx - Index of PCCT entry to parse. + + @return None +**/ +VOID pal_ras2_fill_mem_pcct_info( + EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER *pcct, + RAS2_BLOCK *curr_block, + UINT8 pcct_array_idx + ) +{ + + EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC *pcct_subspace, *pcct_end; + RAS2_PCC_SHARED_MEMORY_REGION *ras2_pcc_shared_mem = NULL; + UINT32 index = 0; + + /* initialise RAS2_MEM_INFO PCCT info fields */ + curr_block->block_info.mem_feat_info.patrol_scrub_support = 0; + + /* pointer to start of PCC subspace structure entries */ + pcct_subspace = ADD_PTR(EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC, pcct, + sizeof(EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER)); + pcct_end = ADD_PTR(EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC, pcct, + pcct->Header.Length); + + while (pcct_subspace < pcct_end) { + if (index == pcct_array_idx) { + /* get base address of Generic Communications Channel Shared Memory Region + i.e., RAS2 Platform Communication Channel Shared Memory Region in RAS + context */ + ras2_pcc_shared_mem = (RAS2_PCC_SHARED_MEMORY_REGION * )pcct_subspace->BaseAddress; + /* check if memory instance supports PATROL_SCRUB RAS feature */ + /* RasFeatures[1] is lower 64bits in 128bits member */ + if (ras2_pcc_shared_mem->RasFeatures[1] & RAS2_PLATFORM_FEATURE_PATROL_SCRUB_BITMASK) + curr_block->block_info.mem_feat_info.patrol_scrub_support = 1; + return; + } + /* point to next PCC subspace entry */ + pcct_subspace = ADD_PTR(EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC, pcct_subspace, + pcct_subspace->Length); + index++; + } + + if (ras2_pcc_shared_mem == NULL) { + sbsa_print(AVS_PRINT_ERR, L"\n No PCC subspace found for PCCT index : 0x%x", pcct_array_idx); + return; + } + + return; +} + +/** + @brief This API fills in the RAS_INFO_TABLE with memory patrol scrub info + from parsing RAS2 ACPI table. + + @return None +**/ +VOID +pal_ras2_create_info_table(RAS2_INFO_TABLE *RasFeatInfoTable) +{ + RAS_FEATURE_2_TABLE_HEADER *ras2; + RAS2_PCC_DESCRIPTOR *ras2_pcc_descp; + RAS2_BLOCK *curr_block; + EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER *pcct; + + + UINT32 i; + UINT8 pcct_array_idx; + + if (RasFeatInfoTable == NULL) { + sbsa_print(AVS_PRINT_ERR, L"\n Input RAS Table Pointer is NULL"); + return; + } + + /* initialise RAS2_INFO_TABLE fields */ + RasFeatInfoTable->num_all_block = 0; + RasFeatInfoTable->num_of_mem_block = 0; + + ras2 = (RAS_FEATURE_2_TABLE_HEADER *)pal_get_acpi_table_ptr(EFI_ACPI_6_5_RAS2_FEATURE_TABLE_SIGNATURE); + if (ras2 == NULL) { + sbsa_print(AVS_PRINT_DEBUG, L" RAS2 ACPI table not found\n"); + return; + } + + pcct = (EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER * ) + pal_get_acpi_table_ptr(EFI_ACPI_6_4_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE); + if (pcct == NULL) { + sbsa_print(AVS_PRINT_DEBUG, L" PCCT ACPI table not found\n"); + return; + } + /* pointer to the start of RAS2 PCC descriptor array */ + ras2_pcc_descp = ADD_PTR(RAS2_PCC_DESCRIPTOR, ras2, sizeof(RAS_FEATURE_2_TABLE_HEADER)); + + /* point to first info block */ + curr_block = RasFeatInfoTable->blocks; + + /* Iterate PCC descriptors and parse corresponding PCC info for each proxomity domain */ + for (i = 0; i < ras2->NumOfPccDescriptors; i++, ras2_pcc_descp++) { + if (ras2_pcc_descp->FeatureType == RAS2_FEATURE_TYPE_MEMORY) { + /* Parse required fields from RAS2 ACPI table*/ + curr_block->type = ras2_pcc_descp->FeatureType; + curr_block->block_info.mem_feat_info.proximity_domain = ras2_pcc_descp->Instance; + pcct_array_idx = ras2_pcc_descp->PccIdentifier; + pal_ras2_fill_mem_pcct_info(pcct, curr_block, pcct_array_idx); + + /* increment block count and move the pointer to next info block*/ + RasFeatInfoTable->num_all_block++; + RasFeatInfoTable->num_of_mem_block++; + curr_block++; + } + } + pal_ras2_dump_info_table(RasFeatInfoTable); +} diff --git a/platform/pal_uefi/src/pal_timer_wd.c b/platform/pal_uefi/src/pal_timer_wd.c index 101120ee..ae301927 100644 --- a/platform/pal_uefi/src/pal_timer_wd.c +++ b/platform/pal_uefi/src/pal_timer_wd.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2019, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2019, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,9 +20,6 @@ #include #include -#include -#include "Include/IndustryStandard/Acpi61.h" - #include "include/pal_uefi.h" #include "include/platform_override.h" diff --git a/uefi_app/SbsaAvs.inf b/uefi_app/SbsaAvs.inf index b07490eb..61d05276 100644 --- a/uefi_app/SbsaAvs.inf +++ b/uefi_app/SbsaAvs.inf @@ -148,10 +148,6 @@ ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c ../test_pool/exerciser/test_e016.c - ../test_pool/exerciser/operating_system/test_e017.c - ../test_pool/exerciser/operating_system/test_e018.c - ../test_pool/exerciser/operating_system/test_e019.c - ../test_pool/exerciser/operating_system/test_e020.c ../test_pool/mpam/operating_system/test_mpam001.c ../test_pool/mpam/operating_system/test_mpam002.c diff --git a/uefi_app/SbsaAvsNist.inf b/uefi_app/SbsaAvsNist.inf index a5a54a95..a6769aa8 100644 --- a/uefi_app/SbsaAvsNist.inf +++ b/uefi_app/SbsaAvsNist.inf @@ -148,10 +148,6 @@ ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c ../test_pool/exerciser/test_e016.c - ../test_pool/exerciser/operating_system/test_e017.c - ../test_pool/exerciser/operating_system/test_e018.c - ../test_pool/exerciser/operating_system/test_e019.c - ../test_pool/exerciser/operating_system/test_e020.c ../test_pool/mpam/operating_system/test_mpam001.c ../test_pool/mpam/operating_system/test_mpam002.c diff --git a/val/SbsaValLib.inf b/val/SbsaValLib.inf index dfb2a266..9188bd83 100644 --- a/val/SbsaValLib.inf +++ b/val/SbsaValLib.inf @@ -1,5 +1,5 @@ ## @file -# Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,6 +28,8 @@ src/AArch64/PeTestSupport.S src/AArch64/ArchTimerSupport.S src/AArch64/GicSupport.S + src/AArch64/MpamSupport.s + src/AArch64/RasSupport.S src/avs_status.c src/avs_pe.c src/avs_pe_infra.c @@ -45,6 +47,7 @@ src/avs_memory.c src/avs_exerciser.c src/avs_pgt.c + src/avs_ras.c sys_arch_src/smmu_v3/smmu_v3.c sys_arch_src/gic/gic.c sys_arch_src/gic/sbsa_exception.c @@ -55,10 +58,12 @@ sys_arch_src/gic/v2/gic_v2.c sys_arch_src/gic/its/sbsa_gic_its.c sys_arch_src/gic/its/sbsa_gic_redistributor.c + src/avs_pmu.c + src/avs_mpam.c + src/avs_mmu.c [Packages] MdePkg/MdePkg.dec [BuildOptions] - GCC:*_*_*_ASM_FLAGS = -march=armv8.2-a - GCC:*_*_*_CC_FLAGS = -D ONLY_SBSA_RULE_TESTS + GCC:*_*_*_ASM_FLAGS = -march=armv8.2-a+sve+profile diff --git a/val/SbsaValNistLib.inf b/val/SbsaValNistLib.inf index 0ca2390c..d5329f73 100644 --- a/val/SbsaValNistLib.inf +++ b/val/SbsaValNistLib.inf @@ -1,5 +1,5 @@ ## @file -# Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,6 +28,8 @@ src/AArch64/PeTestSupport.S src/AArch64/ArchTimerSupport.S src/AArch64/GicSupport.S + src/AArch64/MpamSupport.s + src/AArch64/RasSupport.S src/avs_status.c src/avs_pe.c src/avs_pe_infra.c @@ -46,9 +48,20 @@ src/avs_exerciser.c src/avs_nist.c src/avs_pgt.c + src/avs_ras.c sys_arch_src/smmu_v3/smmu_v3.c - sys_arch_src/gic_its_v3/sbsa_gic_its.c - sys_arch_src/gic_its_v3/sbsa_gic_redistributor.c + sys_arch_src/gic/gic.c + sys_arch_src/gic/sbsa_exception.c + sys_arch_src/gic/AArch64/sbsa_exception_asm.S + sys_arch_src/gic/v3/gic_v3.c + sys_arch_src/gic/v3/gic_v3_extended.c + sys_arch_src/gic/v3/AArch64/v3_asm.S + sys_arch_src/gic/v2/gic_v2.c + sys_arch_src/gic/its/sbsa_gic_its.c + sys_arch_src/gic/its/sbsa_gic_redistributor.c + src/avs_pmu.c + src/avs_mpam.c + src/avs_mmu.c [Packages] StdLib/StdLib.dec @@ -64,5 +77,4 @@ MdePkg/MdePkg.dec [BuildOptions] - GCC:*_*_*_ASM_FLAGS = -march=armv8.2-a - GCC:*_*_*_CC_FLAGS = -D ONLY_SBSA_RULE_TESTS + GCC:*_*_*_ASM_FLAGS = -march=armv8.2-a+sve+profile diff --git a/val/include/sbsa_avs_exerciser.h b/val/include/sbsa_avs_exerciser.h index c44ce3fa..8d807351 100644 --- a/val/include/sbsa_avs_exerciser.h +++ b/val/include/sbsa_avs_exerciser.h @@ -43,7 +43,7 @@ typedef enum { } EXERCISER_INFO_TYPE; -uint32_t val_exerciser_create_info_table(void); +void val_exerciser_create_info_table(void); uint32_t val_exerciser_init(uint32_t instance); uint32_t val_exerciser_get_info(EXERCISER_INFO_TYPE type, uint32_t instance); uint32_t val_exerciser_set_param(EXERCISER_PARAM_TYPE type, uint64_t value1, uint64_t value2, uint32_t instance); diff --git a/val/include/sbsa_avs_gic.h b/val/include/sbsa_avs_gic.h index 467b1b83..adbfbe54 100644 --- a/val/include/sbsa_avs_gic.h +++ b/val/include/sbsa_avs_gic.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited and Contributors. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Redistribution and use in source and binary forms, with or without @@ -85,10 +85,6 @@ uint32_t g001_entry(uint32_t num_pe); uint32_t g002_entry(uint32_t num_pe); -uint32_t -g003_entry(uint32_t num_pe); -uint32_t -g004_entry(uint32_t num_pe); uint32_t val_get_max_intid(void); diff --git a/val/include/sbsa_avs_iovirt.h b/val/include/sbsa_avs_iovirt.h index 75384673..a13e1490 100644 --- a/val/include/sbsa_avs_iovirt.h +++ b/val/include/sbsa_avs_iovirt.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,5 +23,7 @@ uint32_t val_iovirt_check_unique_ctx_intid(uint32_t smmu_index); uint32_t val_iovirt_unique_rid_strid_map(uint32_t rc_index); int val_iovirt_get_device_info(uint32_t rid, uint32_t segment, uint32_t *device_id, uint32_t *stream_id, uint32_t *its_id); uint64_t val_iovirt_get_pcie_rc_info(PCIE_RC_INFO_e type, uint32_t index); +uint64_t val_iovirt_get_named_comp_info(NAMED_COMP_INFO_e type, uint32_t index); +uint64_t val_iovirt_get_pmcg_info(PMCG_INFO_e type, uint32_t index); #endif diff --git a/val/include/sbsa_avs_pcie.h b/val/include/sbsa_avs_pcie.h index 26ea268c..2af8cffd 100644 --- a/val/include/sbsa_avs_pcie.h +++ b/val/include/sbsa_avs_pcie.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -392,4 +392,10 @@ p059_entry(uint32_t num_pe); uint32_t p060_entry(uint32_t num_pe); +uint32_t +p061_entry(uint32_t num_pe); + +uint32_t +p062_entry(uint32_t num_pe); + #endif diff --git a/val/include/sbsa_avs_pcie_spec.h b/val/include/sbsa_avs_pcie_spec.h index 141235fd..f62e82fd 100644 --- a/val/include/sbsa_avs_pcie_spec.h +++ b/val/include/sbsa_avs_pcie_spec.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2019-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -188,6 +188,7 @@ #define CID_MSI 0x05 #define CID_MSIX 0x11 #define CID_PMC 0x01 +#define CID_EA 0x14 #define ECID_AER 0x0001 #define ECID_RCECEA 0x0007 #define ECID_ACS 0x000D @@ -195,6 +196,8 @@ #define ECID_ATS 0x000F #define ECID_PRI 0x0013 #define ECID_PASID 0x001B +#define ECID_DPC 0x001D +#define ECID_DVSEC 0x0023 /* PCI Express capability struct offsets */ #define CIDR_OFFSET 0x0 @@ -210,6 +213,66 @@ #define LCAP2R_OFFSET 0x2C #define LCTL2R_OFFSET 0x30 #define DCTL2R_MASK 0xFFFF +#define DSTS_SHIFT 16 +#define DS_UNCORR_MASK 0x6 +#define DS_CORR_MASK 0x1 + +/* DPC Capability struct offsets and shifts */ +#define DPC_CTRL_OFFSET 0x4 +#define DPC_STATUS_OFFSET 0x8 +#define DPC_STATUS_RESET 0xFFFFFFFF +#define DPC_STATUS_MASK 0x1 +#define DPC_TRIGGER_MASK 0x6 +#define DPC_TRIGGER_FATAL 0x2 +#define DPC_TRIGGER_NON_FATAL 0x1 +#define DPC_CTRL_TRG_EN_SHIFT 16 +#define DPC_CTRL_TRG_EN_MASK 0x3 +#define DPC_SOURCE_ID_SHIFT 16 +#define DPC_TRIGGER_SHIFT 0x1 + +/* AER Capability struct offsets and shifts */ +#define ERR_CNT 0x18 +#define AER_UNCORR_STATUS_OFFSET 0x4 +#define AER_UNCORR_MASK_OFFSET 0x8 +#define AER_UNCORR_SEVR_OFFSET 0xC +#define AER_UNCORR_SEVR_FATAL 0xFFFFFFFF +#define AER_UNCORR_SEVR_NONFATAL 0x0 +#define AER_CORR_STATUS_OFFSET 0x10 +#define AER_CORR_MASK_OFFSET 0x14 +#define AER_ROOT_ERR_CMD_OFFSET 0x2C +#define AER_ROOT_ERR_OFFSET 0x30 +#define AER_ROOT_ERR_SOURCE_ID 0x34 +#define AER_SOURCE_ID_SHIFT 16 +#define AER_SOURCE_ID_MASK 0xFFFF +#define AER_ERROR_MASK 0xFFFFFFFF + +/* DPC Capability struct offsets and shifts */ +#define DPC_CTRL_OFFSET 0x4 +#define DPC_STATUS_OFFSET 0x8 +#define DPC_STATUS_RESET 0xFFFFFFFF +#define DPC_STATUS_MASK 0x1 +#define DPC_TRIGGER_MASK 0x6 +#define DPC_TRIGGER_FATAL 0x2 +#define DPC_TRIGGER_NON_FATAL 0x1 +#define DPC_CTRL_TRG_EN_SHIFT 16 +#define DPC_CTRL_TRG_EN_MASK 0x3 +#define DPC_SOURCE_ID_SHIFT 16 +#define DPC_TRIGGER_SHIFT 0x1 +#define DPC_DISABLE_MASK 0xFFFCFFFF +#define DPC_INTR_ENABLE 0x80000 + +/* AER Capability struct offsets and shifts */ +#define AER_UNCORR_STATUS_OFFSET 0x4 +#define AER_UNCORR_MASK_OFFSET 0x8 +#define AER_UNCORR_SEVR_OFFSET 0xC +#define AER_UNCORR_SEVR_FATAL 0xFFFFFFFF +#define AER_UNCORR_SEVR_NONFATAL 0x0 +#define AER_ROOT_ERR_OFFSET 0x30 + +/* EA Capability struct offsets */ +#define EA_ENTRY_TYPE_OFFSET 8 +#define EA_ENTRY_TYPE_ENABLE_SHIFT 31 +#define EA_ENTRY_TYPE_ENABLE_MASK 1 /* ACS Capability Register */ #define ACS_CTRL_SVE_SHIFT 16 diff --git a/val/include/sbsa_avs_pe.h b/val/include/sbsa_avs_pe.h index 0aff60bd..1be123d6 100644 --- a/val/include/sbsa_avs_pe.h +++ b/val/include/sbsa_avs_pe.h @@ -24,6 +24,13 @@ #define MPIDR_AFF_MASK (0xFF00FFFFFF) +/* PE Affinity level masks */ +#define PE_AFFINITY_LVL_1 0xFF00FFFF00ULL +#define PE_AFFINITY_LVL_2 0xFF00FF0000ULL +#define PE_AFFINITY_LVL_3 0xFF00000000ULL + +#define INVALID_PE_INFO 0xDEADDEAD + // // AARCH64 processor exception types. // @@ -134,7 +141,8 @@ typedef enum { RDVL, MAIR_ELx, TCR_ELx, - TTBR_ELx + TTBR_ELx, + ID_AA64ZFR0_EL1 }SBSA_AVS_PE_REGS; uint64_t ArmReadMpidr(void); @@ -297,6 +305,8 @@ void ArmCallWFI(void); void ArmExecuteMemoryBarrier(void); +uint64_t AA64ReadZfr0(void); + void SpeProgramUnderProfiling(uint64_t interval, uint64_t address); void DisableSpe(void); diff --git a/val/include/sbsa_avs_peripherals.h b/val/include/sbsa_avs_peripherals.h index b228c8e5..6b1e6a83 100644 --- a/val/include/sbsa_avs_peripherals.h +++ b/val/include/sbsa_avs_peripherals.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,8 +37,10 @@ uint32_t d003_entry(uint32_t num_pe); #define SBSA_UARTRIS 0x3C #define SBSA_UARTMIS 0x40 #define SBSA_UARTICR 0x44 +#define SBSA_UART_RES 0x50 uint32_t m001_entry(uint32_t num_pe); +uint32_t m002_entry(uint32_t num_pe); #endif // __SBSA_AVS_PERIPHERAL_H__ diff --git a/val/include/sbsa_avs_pgt.h b/val/include/sbsa_avs_pgt.h index a5b3975c..a1b5e0e5 100644 --- a/val/include/sbsa_avs_pgt.h +++ b/val/include/sbsa_avs_pgt.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,12 +22,19 @@ #define PGT_STAGE2 2 #define PGT_ENTRY_TABLE_MASK (0x1 << 1) -#define PGT_ENTRY_VALID_MASK 0x1 +#define PGT_ENTRY_VALID_MASK 0x1ULL #define PGT_ENTRY_PAGE_MASK (0x1 << 1) #define PGT_ENTRY_BLOCK_MASK (0x0 << 1) -#define IS_PGT_ENTRY_PAGE(val) (val & 0x2) -#define IS_PGT_ENTRY_BLOCK(val) !(val & 0x2) +#define PGT_ENTRY_TYPE_MASK 0x3ULL +#define PGT_ENTRY_TYPE_TABLE 0x3 +#define PGT_ENTRY_TYPE_BLOCK 0x1 +#define PGT_ENTRY_TYPE_PAGE 0x3 + +#define IS_PGT_ENTRY_PAGE(val) ((val & PGT_ENTRY_TYPE_MASK) == PGT_ENTRY_TYPE_PAGE) +#define IS_PGT_ENTRY_BLOCK(val) ((val & PGT_ENTRY_TYPE_MASK) == PGT_ENTRY_TYPE_BLOCK) +#define IS_PGT_ENTRY_TABLE(val) ((val & PGT_ENTRY_TYPE_MASK) == PGT_ENTRY_TYPE_TABLE) +#define IS_PGT_ENTRY_INVALID(val) !(val & PGT_ENTRY_VALID_MASK) #define PGT_DESC_SIZE 8 #define PGT_DESC_ATTR_UPPER_MASK ((0x1ull << 12) - 1) << 52 @@ -40,6 +47,8 @@ #define PGT_STAGE2_AP_RO (0x1ull << 6) #define PGT_STAGE2_AP_RW (0x3ull << 6) +#define PGT_LEVEL_MAX 4 + uint32_t val_pgt_create(memory_region_descriptor_t *mem_desc, pgt_descriptor_t *pgt_desc); void val_pgt_destroy(pgt_descriptor_t pgt_desc); uint64_t val_pgt_get_attributes(pgt_descriptor_t pgt_desc, uint64_t virtual_address, uint64_t *attributes); diff --git a/val/include/sbsa_avs_smmu.h b/val/include/sbsa_avs_smmu.h index d1fe8d7b..053244da 100644 --- a/val/include/sbsa_avs_smmu.h +++ b/val/include/sbsa_avs_smmu.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -32,6 +32,11 @@ #define SMMUv3_IIDR 0x18 #define SMMUv3_AIDR 0x1C +#define SMMUv3_MPAMIDR 0x130 + +/* PMCG CNTBaseN register offset*/ +#define SMMU_PMCG_CFGR 0xE00 + uint64_t val_smmu_ssid_bits(uint32_t smmu_index); @@ -103,17 +108,4 @@ i015_entry(uint32_t num_pe); uint32_t i016_entry(uint32_t num_pe); -uint32_t -os_i005_entry(uint32_t num_pe); -uint32_t -os_i006_entry(uint32_t num_pe); -uint32_t -os_i007_entry(uint32_t num_pe); -uint32_t -os_i008_entry(uint32_t num_pe); -uint32_t -os_i009_entry(uint32_t num_pe); -uint32_t -hyp_i005_entry(uint32_t num_pe); - #endif diff --git a/val/include/sbsa_avs_timer.h b/val/include/sbsa_avs_timer.h index ff6e1d59..8bfe7624 100644 --- a/val/include/sbsa_avs_timer.h +++ b/val/include/sbsa_avs_timer.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited and Contributors. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/val/include/sbsa_avs_wd.h b/val/include/sbsa_avs_wd.h index 05ca727c..8cc13748 100644 --- a/val/include/sbsa_avs_wd.h +++ b/val/include/sbsa_avs_wd.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,10 +23,4 @@ uint32_t w001_entry(uint32_t num_pe); -uint32_t -w002_entry(uint32_t num_pe); - -uint32_t -w003_entry(uint32_t num_pe); - #endif // __SBSA_AVS_WD_H diff --git a/val/include/val_interface.h b/val/include/val_interface.h index 437eaeec..053fdfa7 100644 --- a/val/include/val_interface.h +++ b/val/include/val_interface.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -69,6 +69,13 @@ void *val_memcpy(void *dest_buffer, void *src_buffer, uint32_t len); uint64_t val_time_delay_ms(uint64_t time_ms); /* VAL PE APIs */ + +typedef enum { + PE_FEAT_MPAM, + PE_FEAT_PMU, + PE_FEAT_RAS +} PE_FEAT_NAME; + uint32_t val_pe_execute_tests(uint32_t level, uint32_t num_pe); uint32_t val_pe_create_info_table(uint64_t *pe_info_table); void val_pe_free_info_table(void); @@ -77,8 +84,11 @@ uint64_t val_pe_get_mpid_index(uint32_t index); uint32_t val_pe_get_pmu_gsiv(uint32_t index); uint64_t val_pe_get_mpid(void); uint32_t val_pe_get_index_mpid(uint64_t mpid); +uint32_t val_pe_get_index_uid(uint32_t uid); +uint32_t val_pe_get_uid(uint64_t mpidr); uint32_t val_pe_install_esr(uint32_t exception_type, void (*esr)(uint64_t, void *)); uint32_t val_pe_get_gmain_gsiv(uint32_t index); +uint32_t val_pe_feat_check(PE_FEAT_NAME pe_feature); void val_execute_on_pe(uint32_t index, void (*payload)(void), uint64_t args); void val_suspend_pe(uint32_t power_state, uint64_t entry, uint32_t context_id); @@ -204,6 +214,7 @@ void val_pcie_enable_msa(uint32_t bdf); uint32_t val_pcie_is_msa_enabled(uint32_t bdf); void val_pcie_clear_urd(uint32_t bdf); uint32_t val_pcie_is_urd(uint32_t bdf); +void val_pcie_enable_eru(uint32_t bdf); void val_pcie_disable_eru(uint32_t bdf); uint32_t val_pcie_bitfield_check(uint32_t bdf, uint64_t *bf_entry); uint32_t val_pcie_register_bitfields_check(uint64_t *bf_info_table, uint32_t table_size); @@ -221,6 +232,8 @@ uint32_t val_pcie_mem_get_offset(uint32_t type); uint32_t val_pcie_link_cap_support(uint32_t bdf); /* IO-VIRT APIs */ +#define INVALID_NAMED_COMP_INFO 0xFFFFFFFFFFFFFFFFULL + typedef enum { SMMU_NUM_CTRL = 1, SMMU_CTRL_BASE, @@ -249,9 +262,24 @@ typedef enum { RC_SEGMENT_NUM, RC_ATS_ATTRIBUTE, RC_MEM_ATTRIBUTE, - RC_IOVIRT_BLOCK + RC_IOVIRT_BLOCK, + RC_SMMU_BASE }PCIE_RC_INFO_e; +typedef enum { + NUM_NAMED_COMP = 1, + NAMED_COMP_CCA_ATTR, + NAMED_COMP_DEV_OBJ_NAME, + NAMED_COMP_SMMU_BASE +} NAMED_COMP_INFO_e; + +typedef enum { + PMCG_NUM_CTRL = 1, + PMCG_CTRL_BASE, + PMCG_IOVIRT_BLOCK, + PMCG_NODE_REF +} PMCG_INFO_e; + void val_iovirt_create_info_table(uint64_t *iovirt_info_table); void val_iovirt_free_info_table(void); uint32_t val_iovirt_get_rc_smmu_index(uint32_t rc_seg_num, uint32_t rid); @@ -259,6 +287,11 @@ uint32_t val_smmu_execute_tests(uint32_t level, uint32_t num_pe); uint64_t val_smmu_get_info(SMMU_INFO_e, uint32_t index); uint64_t val_iovirt_get_smmu_info(SMMU_INFO_e type, uint32_t index); +#ifdef TARGET_LINUX +uint32_t val_get_device_path(const char *hid, char hid_path[][MAX_NAMED_COMP_LENGTH]); +uint32_t val_smmu_is_etr_behind_catu(char *etr_path); +#endif + typedef enum { DMA_NUM_CTRL = 1, DMA_HOST_INFO, @@ -335,12 +368,16 @@ typedef enum { MEM_TYPE_NORMAL, MEM_TYPE_RESERVED, MEM_TYPE_NOT_POPULATED, + MEM_TYPE_PERSISTENT, MEM_TYPE_LAST_ENTRY }MEMORY_INFO_e; #define MEM_ATTR_UNCACHED 0x2000 #define MEM_ATTR_CACHED 0x1000 +/* MMU entries APIs*/ +uint32_t val_mmu_update_entry(uint64_t address, uint32_t size); + /* Identify memory type using MAIR attribute, refer to ARM ARM VMSA for details */ #define MEM_NORMAL_WB_IN_OUT(attr) (((attr & 0xcc) == 0xcc) || (((attr & 0x7) >= 5) && (((attr >> 4) & 0x7) >= 5))) @@ -354,24 +391,113 @@ uint32_t val_memory_execute_tests(uint32_t level, uint32_t num_pe); uint64_t val_memory_get_info(addr_t addr, uint64_t *attr); uint64_t val_memory_get_unpopulated_addr(addr_t *addr, uint32_t instance); -/* Secure mode EL3 Firmware tests */ - -typedef struct { - uint64_t test_index; - uint64_t test_arg01; - uint64_t test_arg02; - uint64_t test_arg03; -} SBSA_SMC_t; - -void val_secure_call_smc(SBSA_SMC_t *smc); -uint32_t val_secure_get_result(SBSA_SMC_t *smc, uint32_t timeout); -uint32_t val_secure_execute_tests(uint32_t level, uint32_t num_pe); -uint32_t val_secure_trusted_firmware_init(void); - /* PCIe Exerciser tests */ uint32_t val_exerciser_execute_tests(uint32_t level); /* NIST Statistical tests */ uint32_t val_nist_execute_tests(uint32_t level, uint32_t num_pe); uint32_t val_nist_generate_rng(uint32_t *rng_buffer); + +/* PMU test related APIS*/ +void val_pmu_create_info_table(uint64_t *pmu_info_table); +void val_pmu_free_info_table(void); +uint32_t val_pmu_execute_tests(uint32_t level, uint32_t num_pe); + +/*Cache related info APIs*/ +#define INVALID_CACHE_INFO 0xFFFFFFFFFFFFFFFF +#define CACHE_TABLE_EMPTY 0xFFFFFFFF + +typedef enum { + CACHE_TYPE, + CACHE_SIZE, + CACHE_ID, + CACHE_NEXT_LEVEL_IDX, + CACHE_PRIVATE_FLAG +} CACHE_INFO_e; + +void val_cache_create_info_table(uint64_t *cache_info_table); +void val_cache_free_info_table(void); +uint64_t val_cache_get_info(CACHE_INFO_e type, uint32_t cache_index); +uint32_t val_cache_get_llc_index(void); +uint32_t val_cache_get_pe_l1_cache_res(uint32_t res_index); + +/* MPAM tests APIs */ +#define MPAM_INVALID_INFO 0xFFFFFFFF +#define SRAT_INVALID_INFO 0xFFFFFFFF +#define HMAT_INVALID_INFO 0xFFFFFFFF + +uint32_t val_mpam_execute_tests(uint32_t level, uint32_t num_pe); +void val_mpam_create_info_table(uint64_t *mpam_info_table); +void val_mpam_free_info_table(void); + +typedef enum { + MPAM_RSRC_TYPE_PE_CACHE, + MPAM_RSRC_TYPE_MEMORY, + MPAM_RSRC_TYPE_SMMU, + MPAM_RSRC_TYPE_MEM_SIDE_CACHE, + MPAM_RSRC_TYPE_ACPI_DEVICE, + MPAM_RSRC_TYPE_UNKNOWN = 0xFF /* 0x05-0xFE Reserved for future use */ +} MPAM_RSRC_LOCATOR_TYPE; + +/* MPAM info request types*/ +typedef enum { + MPAM_MSC_RSRC_COUNT, + MPAM_MSC_RSRC_RIS, + MPAM_MSC_RSRC_TYPE, + MPAM_MSC_BASE_ADDR, + MPAM_MSC_ADDR_LEN, + MPAM_MSC_RSRC_DESC1, + MPAM_MSC_NRDY +} MPAM_INFO_e; + +/* RAS APIs */ +#define INVALID_RAS2_INFO 0xFFFFFFFFFFFFFFFFULL +#define INVALID_RAS_REG_VAL 0xDEADDEADDEADDEADULL +#define RAS2_FEATURE_TYPE_MEMORY 0x0 + +typedef enum { + RAS2_NUM_MEM_BLOCK, + RAS2_PROX_DOMAIN, + RAS2_SCRUB_SUPPORT +} RAS2_MEM_INFO_e; + +uint32_t val_ras_execute_tests(uint32_t level, uint32_t num_pe); +uint32_t val_ras_create_info_table(uint64_t *ras_info_table); +uint32_t val_ras_get_info(uint32_t info_type, uint32_t param1, uint64_t *ret_data); +void val_ras2_create_info_table(uint64_t *ras2_info_table); +void val_ras2_free_info_table(void); +uint64_t val_ras2_get_mem_info(RAS2_MEM_INFO_e type, uint32_t index); + +/* HMAT APIs */ +void val_hmat_create_info_table(uint64_t *hmat_info_table); +void val_hmat_free_info_table(void); + +/* SRAT APIs */ +typedef enum { + SRAT_MEM_NUM_MEM_RANGE, + SRAT_MEM_BASE_ADDR, + SRAT_MEM_ADDR_LEN, + SRAT_GICC_PROX_DOMAIN, + SRAT_GICC_PROC_UID, + SRAT_GICC_REMOTE_PROX_DOMAIN +} SRAT_INFO_e; + +void val_srat_create_info_table(uint64_t *srat_info_table); +void val_srat_free_info_table(void); +uint64_t val_srat_get_info(SRAT_INFO_e type, uint64_t prox_domain); + +#define PMU_INVALID_INFO 0xFFFFFFFFFFFFFFFF +#define PMU_INVALID_INDEX 0xFFFFFFFF + +/* PMU info request types */ +typedef enum { + PMU_NODE_TYPE, /* PMU Node type */ + PMU_NODE_BASE0, /* Page 0 Base address */ + PMU_NODE_BASE1, /* Page 1 Base address */ + PMU_NODE_PRI_INST, /* Primary instance */ + PMU_NODE_SEC_INST, /* Secondary instance */ + PMU_NODE_COUNT, /* PMU Node count */ + PMU_NODE_DP_EXTN, /* Dual page extension support */ +} PMU_INFO_e; + #endif diff --git a/val/src/AArch64/PeRegSysSupport.S b/val/src/AArch64/PeRegSysSupport.S index eb2587a9..8b7aee18 100644 --- a/val/src/AArch64/PeRegSysSupport.S +++ b/val/src/AArch64/PeRegSysSupport.S @@ -1,5 +1,5 @@ #/** @file -# Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -117,6 +117,7 @@ GCC_ASM_EXPORT (AA64ReadTtbr0El1) GCC_ASM_EXPORT (AA64ReadTtbr0El2) GCC_ASM_EXPORT (AA64ReadTtbr1El1) GCC_ASM_EXPORT (AA64ReadTtbr1El2) +GCC_ASM_EXPORT (AA64ReadZfr0) ASM_PFX(ArmReadMpidr): mrs x0, mpidr_el1 // read EL1 MPIDR @@ -336,7 +337,7 @@ ASM_PFX(AA64ReadVpidr): ret ASM_PFX(AA64ReadPmbidr): - //mrs x0, pmbidr_el1 + mrs x0, pmbidr_el1 ret ASM_PFX(AA64ReadPmsidr): @@ -445,3 +446,6 @@ ASM_PFX(ArmRdvl): .inst 0x04BF5100 ret +ASM_PFX(AA64ReadZfr0): + mrs x0, id_aa64zfr0_el1 + ret diff --git a/val/src/avs_gic.c b/val/src/avs_gic.c index 477779e9..b37f1060 100644 --- a/val/src/avs_gic.c +++ b/val/src/avs_gic.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -54,12 +54,12 @@ val_gic_execute_tests(uint32_t level, uint32_t num_pe) } g_curr_module = 1 << GIC_MODULE; + status = g001_entry(num_pe); -#ifndef ONLY_SBSA_RULE_TESTS - status |= g002_entry(num_pe); - status |= g003_entry(num_pe); - status |= g004_entry(num_pe); -#endif + + if (level > 4) { + status = g002_entry(num_pe); + } val_print_test_end(status, "GIC"); diff --git a/val/src/avs_iovirt.c b/val/src/avs_iovirt.c index cff6dd3f..64d28416 100644 --- a/val/src/avs_iovirt.c +++ b/val/src/avs_iovirt.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -103,7 +103,7 @@ val_iovirt_get_pcie_rc_info(PCIE_RC_INFO_e type, uint32_t index) if(type == NUM_PCIE_RC) return g_iovirt_info_table->num_pci_rcs; - /* Go through the table return the relevant field value for the SMMU block */ + /* Go through the table return the relevant field value for the PCIe root complex block */ /* at the index position */ block = &g_iovirt_info_table->blocks[0]; for(i = 0; i < g_iovirt_info_table->num_blocks; i++, block=IOVIRT_NEXT_BLOCK(block)) @@ -122,6 +122,8 @@ val_iovirt_get_pcie_rc_info(PCIE_RC_INFO_e type, uint32_t index) return block->data.rc.ats_attr; case RC_IOVIRT_BLOCK: return (uint64_t)block; + case RC_SMMU_BASE: + return block->data.rc.smmu_base; default: val_print(AVS_PRINT_ERR, "This PCIe RC info option not supported %d \n", type); return 0; @@ -139,6 +141,129 @@ val_iovirt_get_pcie_rc_info(PCIE_RC_INFO_e type, uint32_t index) } +/** + @brief This API is a single point of entry to retrieve + Named component info stored in the iovirt info table. + 1. Caller - Test suite + 2. Prerequisite - val_iovirt_create_info_table + @param type the type of information being requested. + @param index the index of named component info instance. + @return 64-bit data +**/ +uint64_t +val_iovirt_get_named_comp_info(NAMED_COMP_INFO_e type, uint32_t index) +{ + uint32_t i, j = 0; + IOVIRT_BLOCK *block; + + if (g_iovirt_info_table == NULL) + { + val_print(AVS_PRINT_ERR, "GET_NAMED_COMP_INFO: iovirt info table is not created \n", 0); + return 0; /* imply no named components parsed */ + } + + if (type == NUM_NAMED_COMP) + return g_iovirt_info_table->num_named_components; + + /* check if index in range */ + if (index > g_iovirt_info_table->num_named_components - 1) { + val_print(AVS_PRINT_ERR, + "GET_NAMED_COMP_INFO: Index (%d) is greater than num of Named components \n", + index); + return INVALID_NAMED_COMP_INFO; + } + + /* Go through the table return the relevant field value for the Named component block */ + /* at the index position */ + block = &g_iovirt_info_table->blocks[0]; + for (i = 0; i < g_iovirt_info_table->num_blocks; i++, block = IOVIRT_NEXT_BLOCK(block)) + { + if (block->type == IOVIRT_NODE_NAMED_COMPONENT) + { + if (j == index) + { + switch (type) + { + case NAMED_COMP_CCA_ATTR: + return block->data.named_comp.cca; + case NAMED_COMP_DEV_OBJ_NAME: + /* caller needs to typecast data to (char *) to retrieve full path + to named component in namespace */ + return (uint64_t)block->data.named_comp.name; + case NAMED_COMP_SMMU_BASE: + return block->data.named_comp.smmu_base; + default: + val_print(AVS_PRINT_ERR, + "This Named component info option not supported %d \n", type); + return INVALID_NAMED_COMP_INFO; + } + } + j++; + } + } + + return INVALID_NAMED_COMP_INFO; +} + +/** + @brief This API is a single point of entry to retrieve + PMCG information stored in the IoVirt Info table + 1. Caller - Test suite + 2. Prerequisite - val_iovirt_create_info_table + @param type the type of information being requested + @param index the index of pmcg info instance. + @return 64-bit data +**/ +uint64_t +val_iovirt_get_pmcg_info(PMCG_INFO_e type, uint32_t index) +{ + uint32_t i, j = 0; + IOVIRT_BLOCK *block; + + if (g_iovirt_info_table == NULL) + { + val_print(AVS_PRINT_ERR, "GET_PMCG_INFO: iovirt info table is not created \n", 0); + return 0; + } + + if (type == PMCG_NUM_CTRL) + return g_iovirt_info_table->num_pmcgs; + + /* Go through the table return the relevant field value for the SMMU block */ + /* at the index position */ + block = &g_iovirt_info_table->blocks[0]; + for (i = 0; i < g_iovirt_info_table->num_blocks; i++, block = IOVIRT_NEXT_BLOCK(block)) + { + if (block->type == IOVIRT_NODE_PMCG) + { + if (j == index) + { + switch (type) + { + case PMCG_CTRL_BASE: + return block->data.pmcg.base; + case PMCG_IOVIRT_BLOCK: + return (uint64_t)block; + case PMCG_NODE_REF: + return block->data.pmcg.node_ref; + default: + val_print(AVS_PRINT_ERR, "This PMCG info option not supported %d \n", type); + return 0; + } + } + j++; + } + } + + if (index > j-1) + { + val_print(AVS_PRINT_ERR, "GET_PMCG_INFO: Index (%d) is greater than num of PMCG \n", index); + return 0; + } + return j; +} + + uint32_t val_iovirt_unique_rid_strid_map(uint32_t rc_index) { @@ -312,3 +437,40 @@ val_iovirt_get_rc_smmu_index(uint32_t rc_seg_num, uint32_t rid) val_print(AVS_PRINT_INFO, "RC with segment number %d is not behind any SMMU", rc_seg_num); return AVS_INVALID_INDEX; } + +#ifdef TARGET_LINUX +/** + @brief This API will call PAL layer to fill in the path of the hid passed in the + hid parameter. + 1. Caller - Application layer. + @param hid hardware ID of the device to which the path is filled + @param hid_path 2D array in which the path is stored + @return Error if not able to find the path of given hid +**/ +uint32_t +val_get_device_path(const char *hid, char hid_path[][MAX_NAMED_COMP_LENGTH]) +{ + uint32_t status = 0; + + status = pal_get_device_path(hid, hid_path); + + return status; +} + +/** + @brief This API will call PAL layer to check if etr is behind the catu. + 1. Caller - Application layer. + @param etr_path path of ETR + @return Error if CATU is not behind ETR device +**/ + +uint32_t +val_smmu_is_etr_behind_catu(char *etr_path) +{ + uint32_t status = 0; + + status = pal_smmu_is_etr_behind_catu(etr_path); + + return status; +} +#endif diff --git a/val/src/avs_pcie.c b/val/src/avs_pcie.c index 7649bcc5..2cfedf69 100644 --- a/val/src/avs_pcie.c +++ b/val/src/avs_pcie.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -283,7 +283,6 @@ val_pcie_execute_tests(uint32_t enable_pcie, uint32_t level, uint32_t num_pe) g_curr_module = 1 << PCIE_MODULE; -#ifdef ONLY_SBSA_RULE_TESTS #ifdef TARGET_LINUX status = p009_entry(num_pe); /* This covers GIC rule */ #endif @@ -291,38 +290,17 @@ val_pcie_execute_tests(uint32_t enable_pcie, uint32_t level, uint32_t num_pe) val_print(AVS_PRINT_TEST, " RCiEP and iEP tests are for sbsa level 6+ \n", 0); return AVS_STATUS_SKIP; } -#endif status = p001_entry(num_pe); - if (status == AVS_STATUS_FAIL) { + if (status != AVS_STATUS_PASS) { val_print(AVS_PRINT_WARN, "\n *** Skipping remaining PCIE tests *** \n", 0); return status; } -#ifndef ONLY_SBSA_RULE_TESTS - status |= p002_entry(num_pe); -#endif - #ifdef TARGET_LINUX status |= p005_entry(num_pe); -#ifndef ONLY_SBSA_RULE_TESTS - status |= p006_entry(num_pe); - status |= p007_entry(num_pe); - status |= p008_entry(num_pe); - status |= p009_entry(num_pe); - status |= p010_entry(num_pe); - status |= p011_entry(num_pe); - status |= p012_entry(num_pe); - status |= p013_entry(num_pe); - status |= p014_entry(num_pe); - status |= p015_entry(num_pe); - status |= p016_entry(num_pe); - status |= p017_entry(num_pe); - status |= p018_entry(num_pe); - status |= p019_entry(num_pe); -#endif #else if (g_pcie_bdf_table->num_entries == 0) { @@ -368,17 +346,12 @@ val_pcie_execute_tests(uint32_t enable_pcie, uint32_t level, uint32_t num_pe) status |= p052_entry(num_pe); status |= p056_entry(num_pe); /* iEP/RP only */ status |= p057_entry(num_pe); -#ifndef ONLY_SBSA_RULE_TESTS - status |= p040_entry(num_pe); - status |= p053_entry(num_pe); - status |= p054_entry(num_pe); - status |= p055_entry(num_pe); -#endif -#ifdef ONLY_SBSA_RULE_TESTS status |= p058_entry(num_pe); status |= p059_entry(num_pe); status |= p060_entry(num_pe); -#endif + status |= p061_entry(num_pe); + status |= p062_entry(num_pe); + } #endif @@ -403,7 +376,7 @@ val_pcie_print_device_info(void) if (bdf_tbl_ptr->num_entries == 0) { - val_print(AVS_PRINT_ERR, " PCIE_INFO: BDF Table: No RCiEP or iEP devices found\n", 0); + val_print(AVS_PRINT_DEBUG, " BDF Table: No RCiEP or iEP found\n", 0); return; } @@ -583,11 +556,9 @@ val_pcie_create_device_bdf_table() dp_type = val_pcie_device_port_type(bdf); val_print(AVS_PRINT_INFO, "\n dp_type 0x%x ", dp_type); -#ifdef ONLY_SBSA_RULE_TESTS /* SBSA 6.1 have only rciep and iep/rp rules only */ if ((dp_type != RCiEP) && (dp_type != iEP_EP) && (dp_type != iEP_RP)) continue; -#endif status = pal_pcie_check_device_valid(bdf); if (status) continue; @@ -599,16 +570,19 @@ val_pcie_create_device_bdf_table() } } - val_print(AVS_PRINT_INFO, - " PCIE_INFO: Number of valid BDFs is %x\n", g_pcie_bdf_table->num_entries); - /* Sanity Check : Confirm all EP (normal, integrated) have a rootport */ if (val_pcie_populate_device_rootport()) { /* Discard the bdf table */ g_pcie_bdf_table->num_entries = 0; + val_print(AVS_PRINT_TEST, + " PCIE_INFO: Number of BDFs found : %x\n", g_pcie_bdf_table->num_entries); + return 1; } + val_print(AVS_PRINT_TEST, + " PCIE_INFO: Number of BDFs found : %x\n", g_pcie_bdf_table->num_entries); + return 0; } @@ -1489,6 +1463,43 @@ val_pcie_is_sig_target_abort(uint32_t bdf) return 0; } +/** + @brief Enable error reporting of the PCIe Function to the upstream + @param bdf - Segment/Bus/Dev/Func in the format of PCIE_CREATE_BDF + @return None +**/ +void +val_pcie_enable_eru(uint32_t bdf) +{ + + uint32_t reg_value; + uint32_t dis_mask; + uint32_t pciecs_base; + + /* Set SERR# Enable bit in the Command Register to enable reporting + * upstream of Non-fatal and Fatal errors detected by the Function. + */ + val_pcie_read_cfg(bdf, TYPE01_CR, ®_value); + dis_mask = (1 << CR_SERRE_SHIFT); + val_pcie_write_cfg(bdf, TYPE01_CR, reg_value | dis_mask); + + /* Get the PCI Express Capability structure offset and + * use that offset to read the Device Control register + */ + val_pcie_find_capability(bdf, PCIE_CAP, CID_PCIECS, &pciecs_base); + val_pcie_read_cfg(bdf, pciecs_base + DCTLR_OFFSET, ®_value); + + /* Set Correctable, Non-fatal, Fatal, UR Reporting Enable bits in the + * Device Control Register to enable reporting upstream of these errors + * detected by the Function. + */ + dis_mask = (1 << DCTLR_CERE_SHIFT | + 1 << DCTLR_NFERE_SHIFT | + 1 << DCTLR_FERE_SHIFT | + 1 << DCTLR_URRE_SHIFT); + val_pcie_write_cfg(bdf, pciecs_base + DCTLR_OFFSET, reg_value | dis_mask); +} + /** @brief Disable error reporting of the PCIe Function to the upstream @param bdf - Segment/Bus/Dev/Func in the format of PCIE_CREATE_BDF @@ -1782,6 +1793,7 @@ val_pcie_get_mmio_bar(uint32_t bdf, void *base) val_print(AVS_PRINT_ERR, "\n pal_exerciser_get_data() not implemented", 0); } + /* data.bar_space.base_addr will be zero if no MMIO bar are present for the function */ *(uint64_t *)base = (uint64_t)data.bar_space.base_addr; return; } diff --git a/val/src/avs_pe.c b/val/src/avs_pe.c index ba83648a..e8b24cd9 100644 --- a/val/src/avs_pe.c +++ b/val/src/avs_pe.c @@ -247,6 +247,8 @@ val_pe_reg_read(uint32_t reg_id) return AA64ReadTcr1(); if (AA64ReadCurrentEL() == AARCH64_EL2) return AA64ReadTcr2(); + case ID_AA64ZFR0_EL1: + return AA64ReadZfr0(); default: val_report_status(val_pe_get_index_mpid(val_pe_get_mpid()), RESULT_FAIL(g_sbsa_level, 0, 0x78), NULL); @@ -486,3 +488,41 @@ val_pe_get_gmain_gsiv(uint32_t index) return entry[index].gmain_gsiv; } + +/** + @brief This API checks whether the requested PE feature is implemented or not. + @param pe_feature - PE feature to be checked. + @return AVS_STATUS_PASS if implemented., else AVS_STATUS_FAIL. +**/ +uint32_t val_pe_feat_check(PE_FEAT_NAME pe_feature) +{ + uint64_t data; + + switch (pe_feature) { + case PE_FEAT_MPAM: + /* ID_AA64PFR0_EL1.MPAM bits[43:40] > 0 or ID_AA64PFR1_EL1.MPAM_frac bits[19:16] > 0 + indicates implementation of MPAM extension */ + if ((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 40, 43) > 0) || + (VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR1_EL1), 16, 19) > 0)) + return AVS_STATUS_PASS; + else + return AVS_STATUS_FAIL; + case PE_FEAT_PMU: + /* ID_AA64DFR0_EL1.PMUVer, bits [11:8] == 0000 or 1111 + indicate PMU extension not implemented */ + data = VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64DFR0_EL1), 8, 11); + if (!(data == 0 || data == 0xF)) + return AVS_STATUS_PASS; + else + return AVS_STATUS_FAIL; + case PE_FEAT_RAS: + /* ID_AA64PFR0_EL1 RAS bits [31:28] != 0 indicate RAS extension implemented */ + if ((VAL_EXTRACT_BITS(val_pe_reg_read(ID_AA64PFR0_EL1), 28, 31)) != 0) + return AVS_STATUS_PASS; + else + return AVS_STATUS_FAIL; + default: + val_print(AVS_PRINT_ERR, "\nPE_FEAT_CHECK: Invalid PE feature", 0); + return AVS_STATUS_FAIL; + } +} diff --git a/val/src/avs_pe_infra.c b/val/src/avs_pe_infra.c index ed3a89c1..77689128 100644 --- a/val/src/avs_pe_infra.c +++ b/val/src/avs_pe_infra.c @@ -27,6 +27,12 @@ int32_t gPsciConduit; @brief Pointer to the memory location of the PE Information table **/ PE_INFO_TABLE *g_pe_info_table; + +/** + @brief Pointer to the memory location of the cache Information table +**/ +CACHE_INFO_TABLE *g_cache_info_table; + /** @brief global structure to pass and retrieve arguments for the SMC call **/ @@ -182,6 +188,60 @@ val_pe_get_index_mpid(uint64_t mpid) return 0x0; //Return index 0 as a safe failsafe value } +/** + @brief This API returns the index of the PE whose ACPI UID matches with the input UID + 1. Caller - Test Suite, VAL + 2. Prerequisite - val_create_peinfo_table + @param mpid - the mpidr value of pE whose index is returned. + @return Index of PE +**/ +uint32_t +val_pe_get_index_uid(uint32_t uid) +{ + + PE_INFO_ENTRY *entry; + uint32_t i = g_pe_info_table->header.num_of_pe; + + entry = g_pe_info_table->pe_info; + + while (i > 0) { + if (entry->acpi_proc_uid == uid) { + return entry->pe_num; + } + entry++; + i--; + } + + return 0x0; //Return index 0 as a safe failsafe value +} + + +/** + @brief This API returns the ACPI UID of the PE whose MPIDR matches with the input MPIDR + 1. Caller - Test Suite, VAL + 2. Prerequisite - val_create_pe_info_table + @param mpidr - the MPIDR value of PE whose UID is returned. + @return ACPI UID of the processor. +**/ +uint32_t +val_pe_get_uid(uint64_t mpidr) +{ + + PE_INFO_ENTRY *entry; + uint32_t i = g_pe_info_table->header.num_of_pe; + + entry = g_pe_info_table->pe_info; + + while (i > 0) { + if (entry->mpidr == mpidr) { + return entry->acpi_proc_uid; + } + entry++; + i--; + } + + return INVALID_PE_INFO; +} /** @brief 'C' Entry point for Secondary PE. @@ -379,3 +439,148 @@ val_pe_cache_clean_range(uint64_t start_addr, uint64_t length) } #endif } + +/** + @brief This API will call PAL layer to fill in the PPTT ACPI table information + into the g_cache_info_table pointer. + 1. Caller - Application layer. + 2. Prerequisite - Memory allocated and passed as argument. + @param cache_info_table pre-allocated memory pointer for cache info. + @return Error if Input parameter is NULL +**/ +void +val_cache_create_info_table(uint64_t *cache_info_table) +{ + if (cache_info_table == NULL) { + val_print(AVS_PRINT_ERR, "\n Pre-allocated memory pointer is NULL \n", 0); + return; + } + + g_cache_info_table = (CACHE_INFO_TABLE *)cache_info_table; +#ifndef TARGET_LINUX + pal_cache_create_info_table(g_cache_info_table, g_pe_info_table); + + if (g_cache_info_table->num_of_cache != 0) { + val_print(AVS_PRINT_TEST, + " CACHE_INFO: Number of cache nodes : %4d\n", + g_cache_info_table->num_of_cache); + } + +#endif +} + +/** + @brief This API frees the memory allocated for cache info table. + @param None + @return None +**/ +void +val_cache_free_info_table(void) +{ + pal_mem_free((void *)g_cache_info_table); +} + +/** + @brief This API returns info of the cache indexed in cache info table. + @param type - requested info type. + @param cache_index - index of the cache in cache info table. + @return info value in 64-bit unsigned int if success, + else returns INVALID_CACHE_INFO indicating failure. +**/ +uint64_t +val_cache_get_info(CACHE_INFO_e type, uint32_t cache_index) +{ + CACHE_INFO_ENTRY *entry; + char *cache_info_type[] = {"cache_type", "cache_size", "cache_identifier"}; + + if (cache_index >= g_cache_info_table->num_of_cache) { + val_print(AVS_PRINT_ERR, "\n invalid cache index: %d", cache_index); + return 0; + } + entry = &(g_cache_info_table->cache_info[cache_index]); + switch (type) { + case CACHE_TYPE: + if (entry->flags.cache_type_valid) + return entry->cache_type; + break; + case CACHE_SIZE: + if (entry->flags.size_property_valid) + return entry->size; + break; + case CACHE_ID: + if (entry->flags.cache_id_valid) + return entry->cache_id; + break; + case CACHE_NEXT_LEVEL_IDX: + return entry->next_level_index; + case CACHE_PRIVATE_FLAG: + return entry->is_private; + default: + val_print(AVS_PRINT_ERR, + "\n cache option not supported %d \n", type); + return INVALID_CACHE_INFO; + } + + val_print(AVS_PRINT_ERR, + "\n cache %d has invalid ", cache_index); + val_print(AVS_PRINT_ERR, cache_info_type[type], 0); + return INVALID_CACHE_INFO; +} + +/** + @brief This API returns index of last-level cache in cache info table + for the current PE. + + @return index of the last-level cache. +**/ +uint32_t +val_cache_get_llc_index(void) +{ + uint32_t curr_cache_idx; + uint32_t next_lvl_idx; + uint32_t llc_idx = CACHE_INVALID_IDX; + if (g_cache_info_table->num_of_cache) { + /* get first level private cache index for current PE */ + /* setting res_index to 0 since PE should have atleast one L1 cache */ + curr_cache_idx = val_cache_get_pe_l1_cache_res(0); + + /* get to last level cache in the cache info chain */ + while (curr_cache_idx != CACHE_INVALID_NEXT_LVL_IDX) { + /* check if next level cache is present */ + next_lvl_idx = val_cache_get_info(CACHE_NEXT_LEVEL_IDX, curr_cache_idx); + if (next_lvl_idx == CACHE_INVALID_NEXT_LVL_IDX) { + llc_idx = curr_cache_idx; + break; + } + else + curr_cache_idx = next_lvl_idx; + } + + return llc_idx; + } + else { + val_print(AVS_PRINT_DEBUG, "\n CACHE INFO table invalid", 0); + return CACHE_TABLE_EMPTY; + } +} + +/** + @brief This API returns level 1 cache index for resource index requested. + @param res_index level 1 private resource index. + @return return index of cache in the cache info table. +**/ +uint32_t +val_cache_get_pe_l1_cache_res(uint32_t res_index) +{ + PE_INFO_ENTRY *entry; + uint32_t index = val_pe_get_index_mpid(val_pe_get_mpid()); + + entry = &(g_pe_info_table->pe_info[index]); + if (res_index < MAX_L1_CACHE_RES) + return entry->level_1_res[res_index]; + else { + val_print(AVS_PRINT_ERR, + "\n Requested resource index exceeds maximum index value %d\n", MAX_L1_CACHE_RES); + return DEFAULT_CACHE_IDX; + } +} diff --git a/val/src/avs_peripherals.c b/val/src/avs_peripherals.c index 7ea417e0..35edb23c 100644 --- a/val/src/avs_peripherals.c +++ b/val/src/avs_peripherals.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -36,7 +36,7 @@ uint32_t val_peripheral_execute_tests(uint32_t level, uint32_t num_pe) { - uint32_t status, i; + uint32_t status = AVS_STATUS_SKIP, i; for (i=0 ; i> TYPE01_BCC_SHIFT; - if (base_cc == CNTRL_CC) - ntwk++; - if (base_cc == DP_CNTRL_CC) - dply++; - if (base_cc == MAS_CC) - strg++; - else - continue; + for (func = 0; func < PCIE_MAX_FUNC; func++) + { + dev_bdf = PCIE_CREATE_BDF(seg, bus, dev, func); + val_pcie_read_cfg(dev_bdf, TYPE01_VIDR, ®_value); + if (reg_value == PCIE_UNKNOWN_RESPONSE) + continue; + val_pcie_read_cfg(dev_bdf, TYPE01_RIDR, ®_value); + val_print(AVS_PRINT_DEBUG, "\n BDF is %x", dev_bdf); + val_print(AVS_PRINT_DEBUG, "\n Class code is %x", reg_value); + base_cc = reg_value >> TYPE01_BCC_SHIFT; + if (base_cc == CNTRL_CC) + ntwk++; + if (base_cc == DP_CNTRL_CC) + dply++; + if (base_cc == MAS_CC) + strg++; + else + continue; + } } } } @@ -284,7 +287,7 @@ val_peripheral_create_info_table(uint64_t *peripheral_info_table) pal_peripheral_create_info_table(g_peripheral_info_table); - val_print(AVS_PRINT_TEST, "\n Peripheral: Num of USB controllers : %d \n", + val_print(AVS_PRINT_TEST, " Peripheral: Num of USB controllers : %d \n", val_peripheral_get_info(NUM_USB, 0)); val_print(AVS_PRINT_TEST, " Peripheral: Num of SATA controllers : %d \n", val_peripheral_get_info(NUM_SATA, 0)); diff --git a/val/src/avs_pgt.c b/val/src/avs_pgt.c index 98b9afea..5e6a9db6 100644 --- a/val/src/avs_pgt.c +++ b/val/src/avs_pgt.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2019, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -138,6 +138,8 @@ uint32_t log2_page_size(uint64_t size) /** @brief Create stage 1 or stage 2 page table, with given memory addresses and attributes + Note: This API updates existing translation table if pgt_desc->pgt_base is not NULL + else it created new table and updated pgt_desc->pgt_base with the address. @param mem_desc - Array of memory addresses and attributes needed for page table creation. @param pgt_desc - Data structure for output page table base and input translation attributes. @return status @@ -157,21 +159,28 @@ uint32_t val_pgt_create(memory_region_descriptor_t *mem_desc, pgt_descriptor_t * val_print(PGT_DEBUG_LEVEL, "\n val_pgt_create: nbits_per_level = %d ", bits_per_level); val_print(PGT_DEBUG_LEVEL, "\n val_pgt_create: page_size_log2 = %d ", page_size_log2); - tt_base = (uint64_t*) val_memory_alloc_pages(1); - if (tt_base == NULL) - { - val_print(AVS_PRINT_ERR, "\n val_pgt_create: page allocation failed ", 0); - return AVS_STATUS_ERR; + /* check whether input page descriptor has base addr of translation table + to use. If the pgt_base member is NULL allocate a page to create a new + table, else update existing translation table */ + if (pgt_desc->pgt_base == (uint64_t) NULL) { + tt_base = (uint64_t *) val_memory_alloc_pages(1); + if (tt_base == NULL) { + val_print(AVS_PRINT_ERR, "\n val_pgt_create: page allocation failed ", 0); + return AVS_STATUS_ERR; + } + val_memory_set(tt_base, page_size, 0); } - val_memory_set(tt_base, page_size, 0); + else + tt_base = (uint64_t *) pgt_desc->pgt_base; + tt_desc.tt_base = tt_base; - pgt_addr_mask = ((0x1ull << (48 - page_size_log2)) - 1) << page_size_log2; + pgt_addr_mask = ((0x1ull << (pgt_desc->ias - page_size_log2)) - 1) << page_size_log2; for (mem_desc_iter = mem_desc; mem_desc_iter->length != 0; ++mem_desc_iter) { - val_print(PGT_DEBUG_LEVEL, "val_pgt_create: i/p addr 0x%llx", mem_desc->virtual_address); - val_print(PGT_DEBUG_LEVEL, "val_pgt_create: o/p addr 0x%llx", mem_desc->physical_address); - val_print(PGT_DEBUG_LEVEL, "val_pgt_create: length 0x%llx\n ", mem_desc->length); + val_print(PGT_DEBUG_LEVEL, " val_pgt_create: input addr = 0x%x ", mem_desc->virtual_address); + val_print(PGT_DEBUG_LEVEL, " val_pgt_create: output addr = 0x%x ", mem_desc->physical_address); + val_print(PGT_DEBUG_LEVEL, " val_pgt_create: length = 0x%x\n ", mem_desc->length); if ((mem_desc->virtual_address & (uint64_t)(page_size - 1)) != 0 || (mem_desc->physical_address & (uint64_t)(page_size - 1)) != 0) { @@ -250,11 +259,11 @@ uint64_t val_pgt_get_attributes(pgt_descriptor_t pgt_desc, uint64_t virtual_addr tt_base_virt = (uint64_t*)val_memory_phys_to_virt(tt_base_phys); val64 = tt_base_virt[index]; - val_print(PGT_DEBUG_LEVEL, "\nval_pgt_get_attr: this_level = %d ", this_level); - val_print(PGT_DEBUG_LEVEL, "\nval_pgt_get_attr: index = %d ", index); - val_print(PGT_DEBUG_LEVEL, "\nval_pgt_get_attr: bits_remaining = %d ", bits_remaining); - val_print(PGT_DEBUG_LEVEL, "\nval_pgt_get_attr: tt_base_virt %llx", (uint64_t)tt_base_virt); - val_print(PGT_DEBUG_LEVEL, "\nval_pgt_get_attr: val64 = %llx ", val64); + val_print(PGT_DEBUG_LEVEL, "\n val_pgt_get_attributes: this_level = %d ", this_level); + val_print(PGT_DEBUG_LEVEL, "\n val_pgt_get_attributes: index = %d ", index); + val_print(PGT_DEBUG_LEVEL, "\n val_pgt_get_attributes: bits_remaining = %d ", bits_remaining); + val_print(PGT_DEBUG_LEVEL, "\n val_pgt_get_attributes: tt_base_virt = %x ", (uint64_t)tt_base_virt); + val_print(PGT_DEBUG_LEVEL, "\n val_pgt_get_attributes: val64 = %x ", val64); if (this_level == 3) { if (!IS_PGT_ENTRY_PAGE(val64)) diff --git a/val/src/avs_smmu.c b/val/src/avs_smmu.c index d9c94362..b42a5940 100644 --- a/val/src/avs_smmu.c +++ b/val/src/avs_smmu.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -42,7 +42,6 @@ val_smmu_read_cfg(uint32_t offset, uint32_t index) return val_mmio_read(ctrl_base + offset); } -#ifndef TARGET_LINUX /** @brief This API executes all the SMMU tests sequentially @@ -57,7 +56,6 @@ val_smmu_execute_tests(uint32_t level, uint32_t num_pe) { uint32_t status = AVS_STATUS_PASS, i; uint32_t num_smmu; - uint32_t status_version_chk; for (i=0 ; i 3) - status |= i003_entry(num_pe); + status |= i002_entry(num_pe); if (g_sbsa_level > 4) { - status_version_chk = i007_entry(num_pe); - status |= status_version_chk; + status = i003_entry(num_pe); + status = i004_entry(num_pe); } if (g_sbsa_level > 5) { - if (status_version_chk != AVS_STATUS_PASS) { - val_print(AVS_PRINT_ERR, "\n SMMU Version Not Compliant, Skipping Remaining SMMU Tests...\n", 0); - } else { - -#ifndef ONLY_SBSA_RULE_TESTS - status |= i008_entry(num_pe); - status |= i009_entry(num_pe); - status |= i010_entry(num_pe); - status |= i011_entry(num_pe); - status |= i012_entry(num_pe); - status |= i015_entry(num_pe); - status |= i016_entry(num_pe); -#endif - status |= i013_entry(num_pe); - status |= i014_entry(num_pe); - -#ifdef ONLY_SBSA_RULE_TESTS - status |= hyp_i005_entry(num_pe); - status |= os_i005_entry(num_pe); - status |= os_i006_entry(num_pe); - status |= os_i007_entry(num_pe); - status |= os_i008_entry(num_pe); -#endif - } + status |= i005_entry(num_pe); + status |= i006_entry(num_pe); + status |= i007_entry(num_pe); + status |= i008_entry(num_pe); + status |= i009_entry(num_pe); + status |= i010_entry(num_pe); + status |= i011_entry(num_pe); + status |= i012_entry(num_pe); + status |= i015_entry(num_pe); } + if (g_sbsa_level > 6) { + status |= i013_entry(num_pe); + status |= i014_entry(num_pe); + } +#endif +#ifdef TARGET_LINUX + if (level > 6) + status |= i016_entry(num_pe); +#endif val_print_test_end(status, "SMMU"); return status; } -#endif uint32_t val_smmu_start_monitor_dev(uint32_t ctrl_index) diff --git a/val/src/avs_timer.c b/val/src/avs_timer.c index 38efcfea..fa0cf4aa 100644 --- a/val/src/avs_timer.c +++ b/val/src/avs_timer.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2019, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,7 @@ #include "include/sbsa_avs_timer_support.h" #include "include/sbsa_avs_timer.h" #include "include/sbsa_avs_common.h" - +#include "include/sbsa_avs_mmu.h" TIMER_INFO_TABLE *g_timer_info_table; @@ -35,7 +35,7 @@ TIMER_INFO_TABLE *g_timer_info_table; uint32_t val_timer_execute_tests(uint32_t level, uint32_t num_pe) { - uint32_t status, status_sys_timer, i; + uint32_t status = AVS_STATUS_SKIP, i; for (i=0 ; iheader.sys_timer_status = status_sys_timer; - - val_print_test_end(status, "Timer"); return status; } @@ -302,6 +278,10 @@ void val_timer_create_info_table(uint64_t *timer_info_table) { + uint64_t timer_num; + uint64_t gt_entry; + uint64_t timer_entry; + if (timer_info_table == NULL) { val_print(AVS_PRINT_ERR, "Input for Create Info table cannot be NULL \n", 0); return; @@ -316,8 +296,28 @@ val_timer_create_info_table(uint64_t *timer_info_table) val_timer_set_phy_el1(0); - val_print(AVS_PRINT_TEST, " TIMER_INFO: Number of system timers : %4d \n", g_timer_info_table->header.num_platform_timer); + val_print(AVS_PRINT_TEST, " TIMER_INFO: Number of system timers : %4d \n", + g_timer_info_table->header.num_platform_timer); + + timer_num = val_timer_get_info(TIMER_INFO_NUM_PLATFORM_TIMERS, 0); + + while (timer_num) { + --timer_num; + + if (val_timer_get_info(TIMER_INFO_IS_PLATFORM_TIMER_SECURE, timer_num)) + continue; //Skip Secure Timer + gt_entry = val_timer_get_info(TIMER_INFO_SYS_CNTL_BASE, timer_num); + timer_entry = val_timer_get_info(TIMER_INFO_SYS_CNT_BASE_N, timer_num); + + val_print(AVS_PRINT_DEBUG, " Add entry %lx entry in memmap", gt_entry); + if (val_mmu_update_entry(gt_entry, 0x10000)) + val_print(AVS_PRINT_WARN, "\n Adding %lx entry failed", gt_entry); + + val_print(AVS_PRINT_DEBUG, "\n Add entry %lx entry in memmap", timer_entry); + if (val_mmu_update_entry(timer_entry, 0x10000)) + val_print(AVS_PRINT_WARN, "\n Adding %lx entry failed", timer_entry); + } } /** diff --git a/val/src/avs_timer_support.c b/val/src/avs_timer_support.c index 72c6f6fe..af253ee0 100644 --- a/val/src/avs_timer_support.c +++ b/val/src/avs_timer_support.c @@ -1,6 +1,6 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited or its affiliates. All rights reserved. - * SPDX-License-Identifier : Apache-2.0 + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,7 +71,8 @@ ArmArchTimerReadReg ( case CnthCtl: case CnthpCval: - pal_print ("The register is related to Hypervisor Mode. Can't perform requested operation\n ", 0); + pal_print ("The register is related to Hypervisor Mode." + " Can't perform requested operation\n ", 0); break; default: @@ -88,7 +89,7 @@ ArmArchTimerWriteReg ( ) { - switch(Reg) { + switch (Reg) { case CntPct: pal_print("Can't write to Read Only Register: CNTPCT \n", 0); @@ -144,7 +145,8 @@ ArmArchTimerWriteReg ( break; case CnthCtl: case CnthpCval: - pal_print("The register is related to Hypervisor Mode. Can't perform requested operation\n ", 0); + pal_print("The register is related to Hypervisor Mode." + " Can't perform requested operation\n ", 0); break; default: diff --git a/val/src/avs_wakeup.c b/val/src/avs_wakeup.c index 5e5628e2..f6eeb1c6 100644 --- a/val/src/avs_wakeup.c +++ b/val/src/avs_wakeup.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,7 +35,7 @@ extern int32_t gPsciConduit; uint32_t val_wakeup_execute_tests(uint32_t level, uint32_t num_pe) { - uint32_t status, i; + uint32_t status = AVS_STATUS_SKIP, i; for (i=0 ; i 5) - status |= w003_entry(num_pe); + status |= w001_entry(num_pe); val_print_test_end(status, "Watchdog"); From fb0bca8e0724687f99d8c939e199c71f4bb2ddaf Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Thu, 12 Jan 2023 19:51:05 +0530 Subject: [PATCH 4/8] Linux Changes ACS 7.1 - Added MTE test for B_PE_16 - Added PMU tests - Added SMMU tests Signed-off-by: Rajat Goyal --- linux_app/mte/build_mte.sh | 39 + linux_app/mte/test_mte.c | 166 + linux_app/pmu_app/build_pmu.sh | 64 + linux_app/pmu_app/pmuval/sbsa_acs_pmu.py | 349 ++ linux_app/pmu_app/pmuval/sbsa_pmu_input.csv | 82 + linux_app/pmu_app/pyperf/Makefile | 12 + linux_app/pmu_app/pyperf/pyperf/README.md | 29 + linux_app/pmu_app/pyperf/pyperf/__init__.py | 0 linux_app/pmu_app/pyperf/pyperf/datamap.py | 216 ++ linux_app/pmu_app/pyperf/pyperf/elf.py | 424 +++ linux_app/pmu_app/pyperf/pyperf/hexdump.py | 96 + linux_app/pmu_app/pyperf/pyperf/imagemap.py | 713 ++++ linux_app/pmu_app/pyperf/pyperf/perf_abi.py | 739 ++++ linux_app/pmu_app/pyperf/pyperf/perf_attr.py | 454 +++ .../pmu_app/pyperf/pyperf/perf_aux_arm_spe.py | 118 + .../pmu_app/pyperf/pyperf/perf_aux_cs_etm.py | 311 ++ .../pmu_app/pyperf/pyperf/perf_buildid.py | 396 ++ linux_app/pmu_app/pyperf/pyperf/perf_data.py | 1576 ++++++++ linux_app/pmu_app/pyperf/pyperf/perf_enum.py | 368 ++ linux_app/pmu_app/pyperf/pyperf/perf_espec.py | 797 ++++ linux_app/pmu_app/pyperf/pyperf/perf_parse.py | 119 + linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py | 251 ++ linux_app/pmu_app/pyperf/pyperf/perf_util.py | 282 ++ linux_app/pmu_app/pyperf/pyperf/perf_zstd.py | 151 + linux_app/pmu_app/pyperf/setup.py | 30 + linux_app/pmu_app/pyperf/src/NOTES.txt | 40 + linux_app/pmu_app/pyperf/src/pyperf_events.c | 3261 +++++++++++++++++ linux_app/pmu_app/pysweep/Makefile | 21 + linux_app/pmu_app/pysweep/setup.py | 38 + linux_app/pmu_app/pysweep/src/arch.h | 42 + .../pmu_app/pysweep/src/branch_prediction.c | 103 + .../pmu_app/pysweep/src/branch_prediction.h | 22 + linux_app/pmu_app/pysweep/src/denormals.c | 194 + linux_app/pmu_app/pysweep/src/denormals.h | 45 + linux_app/pmu_app/pysweep/src/genelf.c | 677 ++++ linux_app/pmu_app/pysweep/src/genelf.h | 71 + linux_app/pmu_app/pysweep/src/loadcode.c | 623 ++++ linux_app/pmu_app/pysweep/src/loaddata.c | 458 +++ linux_app/pmu_app/pysweep/src/loadgen.c | 644 ++++ linux_app/pmu_app/pysweep/src/loadgen.h | 258 ++ linux_app/pmu_app/pysweep/src/loadgenp.h | 56 + linux_app/pmu_app/pysweep/src/loadinst.c | 1117 ++++++ linux_app/pmu_app/pysweep/src/loadinst.h | 202 + linux_app/pmu_app/pysweep/src/prepcode.c | 160 + linux_app/pmu_app/pysweep/src/prepcode.h | 47 + linux_app/pmu_app/pysweep/src/pysweep.c | 1341 +++++++ linux_app/pmu_app/pysweep/src/sleep.c | 131 + linux_app/pmu_app/pysweep/src/sleep.h | 39 + .../pmu_app/pysweep/tests/code_template.c | 115 + linux_app/sbsa-acs-app/include/sbsa_app.h | 9 +- .../sbsa-acs-app/include/sbsa_drv_intf.h | 3 +- linux_app/sbsa-acs-app/sbsa_app_main.c | 17 +- linux_app/sbsa-acs-app/sbsa_app_smmu.c | 47 + platform/pal_uefi/include/pal_exerciser.h | 11 +- test_pool/Makefile | 14 +- val/Makefile | 4 +- 56 files changed, 17569 insertions(+), 23 deletions(-) create mode 100644 linux_app/mte/build_mte.sh create mode 100644 linux_app/mte/test_mte.c create mode 100755 linux_app/pmu_app/build_pmu.sh create mode 100644 linux_app/pmu_app/pmuval/sbsa_acs_pmu.py create mode 100644 linux_app/pmu_app/pmuval/sbsa_pmu_input.csv create mode 100644 linux_app/pmu_app/pyperf/Makefile create mode 100644 linux_app/pmu_app/pyperf/pyperf/README.md create mode 100644 linux_app/pmu_app/pyperf/pyperf/__init__.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/datamap.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/elf.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/hexdump.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/imagemap.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_abi.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_attr.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_aux_arm_spe.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_buildid.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_data.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_enum.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_espec.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_parse.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_util.py create mode 100644 linux_app/pmu_app/pyperf/pyperf/perf_zstd.py create mode 100644 linux_app/pmu_app/pyperf/setup.py create mode 100644 linux_app/pmu_app/pyperf/src/NOTES.txt create mode 100644 linux_app/pmu_app/pyperf/src/pyperf_events.c create mode 100644 linux_app/pmu_app/pysweep/Makefile create mode 100644 linux_app/pmu_app/pysweep/setup.py create mode 100644 linux_app/pmu_app/pysweep/src/arch.h create mode 100644 linux_app/pmu_app/pysweep/src/branch_prediction.c create mode 100644 linux_app/pmu_app/pysweep/src/branch_prediction.h create mode 100644 linux_app/pmu_app/pysweep/src/denormals.c create mode 100644 linux_app/pmu_app/pysweep/src/denormals.h create mode 100644 linux_app/pmu_app/pysweep/src/genelf.c create mode 100644 linux_app/pmu_app/pysweep/src/genelf.h create mode 100644 linux_app/pmu_app/pysweep/src/loadcode.c create mode 100644 linux_app/pmu_app/pysweep/src/loaddata.c create mode 100644 linux_app/pmu_app/pysweep/src/loadgen.c create mode 100644 linux_app/pmu_app/pysweep/src/loadgen.h create mode 100644 linux_app/pmu_app/pysweep/src/loadgenp.h create mode 100644 linux_app/pmu_app/pysweep/src/loadinst.c create mode 100644 linux_app/pmu_app/pysweep/src/loadinst.h create mode 100644 linux_app/pmu_app/pysweep/src/prepcode.c create mode 100644 linux_app/pmu_app/pysweep/src/prepcode.h create mode 100644 linux_app/pmu_app/pysweep/src/pysweep.c create mode 100644 linux_app/pmu_app/pysweep/src/sleep.c create mode 100644 linux_app/pmu_app/pysweep/src/sleep.h create mode 100644 linux_app/pmu_app/pysweep/tests/code_template.c create mode 100644 linux_app/sbsa-acs-app/sbsa_app_smmu.c diff --git a/linux_app/mte/build_mte.sh b/linux_app/mte/build_mte.sh new file mode 100644 index 00000000..dd8ca42c --- /dev/null +++ b/linux_app/mte/build_mte.sh @@ -0,0 +1,39 @@ + # #!/usr/bin/env bash + + # @file + # Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + # SPDX-License-Identifier : Apache-2.0 + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + +arch=$(uname -m) +echo $arch +if [[ $arch = "aarch64" ]] +then + echo "aarch64 native build" + export CROSS_COMPILE='' +elif [ -v $CROSS_COMPILE ] +then + echo "CROSS_COMPILE is not set" + echo "set using export CROSS_COMPILE=/bin/aarch64-none-linux-gnu-" + return 0 +fi + +export CC=${CROSS_COMPILE}gcc +echo "Building Linux MTE test..." +echo "CC = $CC" + +$CC -o mte_test -O0 -march=armv8.5-a+memtag test_mte.c + +unset CC +unset CROSS_COMPILE diff --git a/linux_app/mte/test_mte.c b/linux_app/mte/test_mte.c new file mode 100644 index 00000000..1038e30b --- /dev/null +++ b/linux_app/mte/test_mte.c @@ -0,0 +1,166 @@ +/** @file + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_RULE "B_PE_16" +#define TEST_DESC "Check for MTE support " + +#define HWCAP2_MTE (1 << 18) +#define PROT_MTE 0x20 +#define PR_SET_TAGGED_ADDR_CTRL 55 +#define PR_TAGGED_ADDR_ENABLE (1UL << 0) +#define PR_MTE_TCF_SHIFT 1 +#define PR_MTE_TCF_NONE (0UL << PR_MTE_TCF_SHIFT) +#define PR_MTE_TCF_SYNC (1UL << PR_MTE_TCF_SHIFT) +#define PR_MTE_TCF_ASYNC (2UL << PR_MTE_TCF_SHIFT) +#define PR_MTE_TCF_MASK (3UL << PR_MTE_TCF_SHIFT) +#define PR_MTE_TAG_SHIFT 3 +#define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT) +#define SIGSEGV_EXIT_CODE 139 +#define EXIT_SKIPPED 2 + +/* insert a random logical tag into the given pointer */ +#define insert_random_tag(ptr) ({ \ + uint64_t __val; \ + asm("irg %0, %1" : "=r" (__val) : "r" (ptr)); \ + __val; \ +}) + +/* set the allocation tag on the destination address */ +#define set_tag(tagged_addr) do { \ + asm volatile("stg %0, [%0]" : : "r" (tagged_addr) : "memory"); \ +} while (0) + + + +uint32_t payload(void) +{ + unsigned char *var; + unsigned long page_sz = sysconf(_SC_PAGESIZE); + unsigned long hwcap2 = getauxval(AT_HWCAP2); + uint32_t pid; + uint32_t childReturnCode; + uint64_t timeout = 100000; + + /* check if MTE is supported */ + if (!(hwcap2 & HWCAP2_MTE)) { + perror("\n Memory tagging extension(MTE) not supported."); + return EXIT_SKIPPED; + } + + /* enable the tagged address ABI, synchronous or asynchronous MTE tag check faults */ + if (prctl(PR_SET_TAGGED_ADDR_CTRL, + PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC | + (0xfffe << PR_MTE_TAG_SHIFT), + 0, 0, 0)) { + perror("\n prctl() failed"); + return EXIT_FAILURE; + } + + var = mmap(0, page_sz, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (var == MAP_FAILED) { + perror("\n mmap() failed"); + return EXIT_FAILURE; + } + + /* Enable MTE on the above mmap.*/ + if (mprotect(var, page_sz, PROT_READ | PROT_WRITE | PROT_MTE)) { + perror("\n mprotect() failed"); + return EXIT_FAILURE; + } + + /* access with the default tag (0) */ + var[0] = 1; + var[1] = 10; + printf("\n Access with the default tag (0)"); + printf("\n var[0] = %hhu var[1] = %hhu", var[0], var[1]); + printf("\n Default tag(0) pointer : %p", var); + + /* set the logical and allocation tags */ + var = (unsigned char *)insert_random_tag(var); + set_tag(var); + + /* access with non-zero tag */ + var[0] = 3; + printf("\n Access with the non-zero tag"); + printf("\n var[0] = %hhu var[1] = %hhu", var[0], var[1]); + printf("\n Non zero tag pointer : %p", var); + + /* If MTE is enabled correctly the access to next 16 byte granule will cause an exception + due to mismatch in logical and allocation tags */ + + /* creating a child process and accessing var[16] or later to cause exception */ + /*delay for above printf*/ + while (timeout--); + pid = fork(); + + if (pid == 0) { + /* true for child process */ + printf("\n Expecting SIGSEGV exception..."); + var[18] = 0xdd; + + while (timeout--); + exit(0); + } + else if (pid < 0) { + /* fork failure */ + printf("\n Fork failed."); + return EXIT_FAILURE; + } + else { + /* parent process wait and check return status */ + waitpid(pid, &childReturnCode, 0); + printf("\n Child process returned with exit code: %d", childReturnCode); + + if (childReturnCode == SIGSEGV_EXIT_CODE) { + return EXIT_SUCCESS; + } + else { + printf("\n Not received SIGSEGV"); + return EXIT_FAILURE; + } + } + return EXIT_FAILURE; +} + +void main(void) +{ + uint32_t status; + /* test start */ + printf("\n%s: %s:", TEST_RULE, TEST_DESC); + /* call test payload */ + status = payload(); + /*check test return status*/ + if (status == EXIT_SUCCESS) + printf("\nResult: PASS\n"); + else if (status == EXIT_SKIPPED) + printf("\nResult: SKIP\n"); + else + printf("\nResult: FAIL\n"); + + return; +} \ No newline at end of file diff --git a/linux_app/pmu_app/build_pmu.sh b/linux_app/pmu_app/build_pmu.sh new file mode 100755 index 00000000..f5860297 --- /dev/null +++ b/linux_app/pmu_app/build_pmu.sh @@ -0,0 +1,64 @@ + # #!/usr/bin/env bash + + # @file + # Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + # SPDX-License-Identifier : Apache-2.0 + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + +arch=$(uname -m) +echo $arch +if [[ $arch = "aarch64" ]] +then + echo "aarch64 native build" + export CROSS_COMPILE='' +elif [ -v $CROSS_COMPILE ] +then + echo "CROSS_COMPILE is not set" + echo "set using export CROSS_COMPILE=/bin/aarch64-none-linux-gnu-" + return 0 +fi + +if [ -v $PYTHON ] +then + echo "PYTHON is not set" + echo "set using export PYTHON=/python" + return 0 +fi +export CC=${CROSS_COMPILE}gcc +#Info logs +echo $CC +echo $CROSS_COMPILE +echo $PYTHON + +if [ -v $CROSSBASE ] +then + export CROSSBASE=`pwd` +fi +export LDSHARED="${CC} -shared" + +pushd pyperf + make clean + make +popd + +pushd pysweep + make clean + make +popd + +unset CC +unset LDSHARED +unset PYTHON +unset CROSSBASE +unset CROSS_COMPILE diff --git a/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py b/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py new file mode 100644 index 00000000..aef8668e --- /dev/null +++ b/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py @@ -0,0 +1,349 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Test SBSA PMU events +""" + +from __future__ import print_function + +import os, sys, subprocess, argparse + +import pysweep +from pyperf.perf_enum import * +from pyperf.perf_attr import * +import pyperf.perf_util as perf_util +import pyperf.perf_events as pp + +g_workload = None + + +def ecode(s): + # For an event specifier, return an integer code + return int(s,16) + + +parser = argparse.ArgumentParser(description="test relationships between PMU events") +parser.add_argument("-a", "--all-cpus", action="store_true", help="collect on all CPUs") +parser.add_argument("--sleep", type=float, default=0.1, help="time to wait") +parser.add_argument("--data", type=perf_util.str_memsize, help="use a data working set as the workload") +parser.add_argument("--data-dispersion", type=int, help="expansion factor for data working set") +parser.add_argument("--code", type=perf_util.str_memsize, help="use a code working set as the workload") +parser.add_argument("-e", "--event", type=ecode, action="append", default=[], help="also count this event") +parser.add_argument("-r", "--repeat", type=int, default=1, help="repeat test N times") +parser.add_argument("-v", "--verbose", action="count", default=0, help="increase verbosity level") +parser.add_argument("--scaling", type=int, default=0, help="Enable scaling factor") +parser.add_argument("command", nargs=argparse.REMAINDER, help="command to execute") + +opts = parser.parse_args([]) + +total = [0, 0, 0] + +class BadEvent(Exception): + pass + + +def echeck(s): + """ + Filter event codes affected by cores that don't check bit 15 in the event selector. + (Architecture loophole, not technically a silicon errata.) + """ + n = ecode(s) + + return n + + +class EventProperty: + def __init__(self): + pass + + def contains_any(self, el): + for e in el: + if self.contains(e): + return True + return False + + +class Relation(EventProperty): + def __init__(self): + self.n_tests = 0 + self.n_fails = 0 + self.sup = None # The event code. + self.reason = None # Event description + self.rule = None # SBSA rule ID assosiated with event + + def contains(self, e): + return e == self.sup + + def accepts(self, vsub): + if opts.scaling: + if vsub[0] == 0 or vsub[1] == 0 or vsub[2] == 0: + return 0 # if counter is not moved , test failed + if vsub[0] > vsub[1] or vsub[1] > vsub[2]: + return 0 #Faile if counter not moved as per scaling factor + else: + if vsub[0] <= 0: + return 0 + return 1 + + def __str__(self): + return "%s: %x: %s" % (self.rule, self.sup, self.reason) + +def read_csv(fn): + f = open(fn) + for ln in f: + if ln.startswith("#") or not ln.strip(): + continue + yield ln.strip() + f.close() + +def read_relations(): + """ + Read the relationships from a text file, yielding Relation objects. + """ + for ln in read_csv("sbsa_pmu_input.csv"): + (rule,sup, reason) = ln.split(',', 2) + r = Relation() + r.reason = reason + r.rule = rule + try: + r.sup = echeck(sup) + except BadEvent: + continue + yield r + +def open_event(en, group=None, enabled=True): + """ + Open a hardware PMU event to monitor the workload. + + This may fail with an assertion because: + - we don't have privilege + - we're on an inappropriate target that doesn't support this hardware event code + - we are opening as a group member, and haven't got enough physical counters + """ + if opts.all_cpus: + pid = -1 + cpu = 0 + else: + pid = g_workload.pid + cpu = -1 + # Tool verbosity=1: no event messages; tool verbosity=2 (-vv), minimal event messages + event_verbose = max(0, (opts.verbose - 1)) + rf = PERF_FORMAT_TOTAL_TIME_RUNNING|PERF_FORMAT_TOTAL_TIME_ENABLED + attr = PerfEventAttr(type=PERF_TYPE_RAW, config=en, read_format=rf, exclude_kernel=False, inherit=True) + flags = pp.PERF_FLAG_WEAK_GROUP + e = None + try: + if event_verbose: + print("open_event: %s" % attr) + if group is not None: + print(" in group: %s" % group) + e = pp.Event(attr, pid=pid, cpu=cpu, enabled=enabled, group=group, verbose=event_verbose, flags=flags) + except OSError: + print("** could not open hardware performance event - retrying as userspace only", file=sys.stderr) + attr.update(exclude_kernel=True) + if e is None: + e = pp.Event(attr, pid=pid, cpu=cpu, enabled=enabled, group=group, verbose=event_verbose, flags=flags) + assert e is not None + return e + + +class Monitor: + """ + Set up the events to monitor a relationship. + """ + def __init__(self, r, x): + self.r = r + self.x = x + self.supe = open_event(r.sup, enabled=False) + + def enable(self): + self.supe.enable() # Enable the group + return self + + def read(self): + return Witness(self) + + def disable(self): + self.supe.disable() # Disable the group + return self + + def close(self): + self.supe.close() + return self + +def read_events_values(el): + """ + Read a set of values from a list of events. The first event may be a + group event, and some or all of the remaining events may be members of its group. + These may be followed by non-group events. + """ + e = el[0] + if PerfEventAttr(e.attr_struct()).read_format & PERF_FORMAT_GROUP: + g = e.read() # a GroupReading object + values = [r.value for r in g] + else: + values = [] + ix = len(values) + values += [e.read().value for e in el[ix:]] + return values + +class Witness: + """ + Take a reading from a monitor, to get a set of event values to check against the relationship. + """ + def __init__(self, m): + self.m = m + self.read() + def read(self): + vs = read_events_values([self.m.supe]) + self.sup_value = vs[0] + total[self.m.x] = self.sup_value + self.ok = self.accepts() + return self + + def accepts(self): + if opts.scaling: + if x == 2: + return self.m.r.accepts(total) + else : + return 1 + else: + return self.m.r.accepts(total) + +class Workload: + def __init__(self): + self.pid = None + + def prepare(self): + if opts.data or opts.code: + load_opts = {"data": opts.data, "data_dispersion": opts.data_dispersion, "inst": opts.code, "flags": pysweep.MEM_NO_HUGEPAGE} + self.load = pysweep.Load(load_opts, verbose=max(0, opts.verbose-1)) + self.load.start() + self.pid = self.load.tids()[0] + if opts.verbose: + print("reltest: suspend") + self.load.suspend() + else: + self.pid = os.getpid() + + def run(self): + if opts.verbose: + print("reltest: run") + if command: + # Run a subcommand and wait until it terminates + p = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (out, err) = p.communicate() + if p.returncode != 0: + print(err, file=sys.stderr) + sys.exit(p.returncode) + if opts.verbose: + print(out, end="") + elif opts.data or opts.code: + # Run a synthetic workload, for the --sleep duration + self.load.resume() + pysweep.sleep(opts.sleep) + self.load.suspend() + else: + # Just sleep for the --sleep duration, e.g. to pick up background system activity + pysweep.sleep(opts.sleep) + +def test_relation(r,x): + """ + Test a relationship between events. Because each relationship involves a specific + set of events and these all need to be counted at the same time, we run a separate + test for each relationship, with just those events configured. + """ + + if opts.scaling: + opts.data = (x + 1) * 100 + opts.code = (x + 1) * 100 + + g_workload.prepare() + m = Monitor(r, x) + m.enable() + g_workload.run() # Dynamic code & data gen + if opts.scaling: + pysweep.br_pred(opts.data) + else: + pysweep.br_pred(1); + m.disable() + w = m.read() + m.close() + + if opts.scaling: + if x == 2: # Update test count on third itration + r.n_tests += 1 + if not w.ok: + r.n_fails += 1 + show_witness(w) + else: + r.n_tests += 1 + if not w.ok: + r.n_fails += 1 + show_witness(w) + + return w.ok + +def show_witness(w): + # Print more detail about how these values contradict the relationship. + # (Or perhaps not - when verbose, we also show this for all tests.) + r = w.m.r + if opts.scaling: + print(" Rule : %s, event : %04x, count[%08u,%08u,%08u]" % (r.rule, r.sup, total[0], total[1], total[2]), end="") + else : + print(" Rule : %s, event : %04x, count[%08u]" % (r.rule, r.sup, total[0]), end="") + + string_revised=r.reason.ljust(30) + print(" %s" % (string_revised), end="") + + if not w.ok: + print(" :FAIL") + else: + print(" :PASS") + +if __name__ == "__main__": + opts = parser.parse_args() + if opts.command: + command = ' '.join(opts.command) + else: + command = None + g_workload = Workload() + rels = list(read_relations()) + + total_tests = 0 + total_fails = 0 + + print("") + print("***** Starting PMU event test *****") + print("") + + for i in range(opts.repeat): + for r in rels: + total[0] = 0 + total[1] = 0 + total[2] = 0 + if opts.scaling: + for x in range(0, 3): + test_relation(r, x) + else: + test_relation(r, 0) + + total_tests += r.n_tests + total_fails += r.n_fails + + print("----------------------------------------------------------") + print(" Total tets: %d , Total Passed: %d, Total Failed: %d" % (total_tests, (total_tests - total_fails), total_fails)) + print("----------------------------------------------------------") diff --git a/linux_app/pmu_app/pmuval/sbsa_pmu_input.csv b/linux_app/pmu_app/pmuval/sbsa_pmu_input.csv new file mode 100644 index 00000000..18cae6c0 --- /dev/null +++ b/linux_app/pmu_app/pmuval/sbsa_pmu_input.csv @@ -0,0 +1,82 @@ +# Entries are in format +# RULE_ID,EVENT_ID,EVENT_DESCRIPTION + +# IPC Events +PMU_EV_01,08,INST_RETIRED +PMU_EV_01,11,CPU_CYCLES + +# Cache Events +PMU_EV_02,04,L1D_CACHE +PMU_EV_02,13,MEM_ACCESS +PMU_EV_02,14,L1I_CACHE +PMU_EV_02,16,L2D_CACHE +PMU_EV_02,27,L2I_CACHE +PMU_EV_02,2B,L3D_CACHE +PMU_EV_02,36,LL_CACHE_RD +PMU_EV_02,0037,LL_CACHE_MISS_RD +PMU_EV_02,39,L1D_CACHE_LMISS_RD +PMU_EV_02,40,L1D_CACHE_RD +PMU_EV_02,50,L2D_CACHE_RD +PMU_EV_02,66,MEM_ACCESS_RD +PMU_EV_02,A0,L3D_CACHE_RD +PMU_EV_02,4006,L1I_CACHE_LMISS +PMU_EV_02,4009,L2D_CACHE_LMISS_RD +PMU_EV_02,400A,L2I_CACHE_LMISS +PMU_EV_02,400B,L3D_CACHE_LMISS_RD + +# TLB Events +PMU_EV_03,25,L1D_TLB +PMU_EV_03,26,L1I_TLB +PMU_EV_03,34,DTLB_WALK +PMU_EV_03,35,ITLB_WALK + +# Cycle accounting events +PMU_EV_05,11,CPU_CYCLES +PMU_EV_05,23,STALL_FRONTEND +PMU_EV_05,24,STALL_BACKEND +PMU_EV_05,3C,STALL +PMU_EV_05,4005,STALL_BACKEND_MEM + +# Top-down accounting events +PMU_EV_06,11,CPU_CYCLES +PMU_EV_06,3A,OP_RETIRED +PMU_EV_06,3B,OP_SPEC +PMU_EV_06,3D,STALL_SLOT_BACKEND +PMU_EV_06,3E,STALL_SLOT_FRONTEND +PMU_EV_06,3F,STALL_SLOT + +# Workload Events +PMU_EV_07,80C1,FP_FIXED_OPS_SPEC +PMU_EV_07,80C9,INT_FIXED_OPS_SPEC + +#Branching Events +PMU_EV_08,000C,PC_WRITE_RETIRED +PMU_EV_08,000D,BR_IMMED_RETIRED +PMU_EV_08,000E,BR_RETURN_RETIRED +PMU_EV_08,0021,BR_RETIRED +PMU_EV_08,0022,BR_MIS_PRED_RETIRED +PMU_EV_08,8110,BR_IMMED_PRED_RETIRED +PMU_EV_08,8111,BR_IMMED_MIS_PRED_RETIRED +PMU_EV_08,8112,BR_IND_PRED_RETIRED +PMU_EV_08,8113,BR_IND_MIS_PRED_RETIRED +PMU_EV_08,8114,BR_RETURN_PRED_RETIRED +PMU_EV_08,8115,BR_RETURN_MIS_PRED_RETIRED +PMU_EV_08,8116,BR_INDNR_PRED_RETIRED +PMU_EV_08,8117,BR_INDNR_MIS_PRED_RETIRED +PMU_EV_08,8118,BR_TAKEN_PRED_RETIRED +PMU_EV_08,8119,BR_TAKEN_MIS_PRED_RETIRED +PMU_EV_08,811A,BR_SKIP_PRED_RETIRED +PMU_EV_08,811B,BR_SKIP_MIS_PRED_RETIRED +PMU_EV_08,811C,BR_PRED_RETIRED +PMU_EV_08,811D,BR_IND_RETIRED +PMU_EV_08,811E,BR_INDNR_RETIRED + +#Latency Events +PMU_EV_10,13,MEM_ACCESS +PMU_EV_10,19,BUS_ACCESS +PMU_EV_10,34,DTLB_WALK +PMU_EV_10,35,ITLB_WALK +PMU_EV_10,60,BUS_ACCESS_RD +PMU_EV_10,61,BUS_ACCESS_WR +PMU_EV_10,66,MEM_ACCESS_RD +PMU_EV_10,67,MEM_ACCESS_WR diff --git a/linux_app/pmu_app/pyperf/Makefile b/linux_app/pmu_app/pyperf/Makefile new file mode 100644 index 00000000..940d2685 --- /dev/null +++ b/linux_app/pmu_app/pyperf/Makefile @@ -0,0 +1,12 @@ + +default: install + +install: + $(PYTHON) setup.py install --prefix=$(CROSSBASE) + +sysinstall: + sudo $(PYTHON) setup.py install + +.PHONY: clean +clean: + rm -rf build diff --git a/linux_app/pmu_app/pyperf/pyperf/README.md b/linux_app/pmu_app/pyperf/pyperf/README.md new file mode 100644 index 00000000..0cb1a11a --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/README.md @@ -0,0 +1,29 @@ +How this module is structured +----------------------------- + +These modules wrap the system call and mmap buffer, and provide direct access to PMU events. + + - pyperf_events.c - wraps the perf_event_open syscall and mmap buffers + - perf_enum.py - perf-related enumerations + - perf_attr.py - the perf_event_attr structure + - perf_abi.py - decode records returned in the mmap buffer + +These modules provide access to the list of events exported from the kernel via sysfs, +and parse event specifiers as used by the userspace perf tools: + + - perf_util.py - parse and print various types (memory sizes, CPU lists etc.) + - perf_sysfs.py - read event data from sysfs + - perf_parse.py - helper functions for perf_espec.py + - perf_espec.py - parse an invidual event specifier + +These modules replicate some of the functionality of the userspace perf tools: + + - perf_data.py - read perf.data files as created by the 'perf record' tool + - perf_zstd.py - wrap libzstd (if installed) to decompress perf.data files + - datamap.py - helper functions for perf_data.py (self-checking) + - perf_buildid.py - manage the buildid cache. Also, can be used as a command-line tool similar to 'perf buildid' + - elf.py - minimal ELF reader to get buildid + +-------------- + +*Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.* diff --git a/linux_app/pmu_app/pyperf/pyperf/__init__.py b/linux_app/pmu_app/pyperf/pyperf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/linux_app/pmu_app/pyperf/pyperf/datamap.py b/linux_app/pmu_app/pyperf/pyperf/datamap.py new file mode 100644 index 00000000..21d1b231 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/datamap.py @@ -0,0 +1,216 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Build a hierarchical map of sections of a file or other memory space. +Useful when dealing with complicated file formats like perf.data. +""" + +from __future__ import print_function + +import sys + +class DataRange: + def __init__(self, map, base, size, name, parent=None): + self.name = name + self.map = map + self.base = base + self.size = size + self.parent = parent + self.subranges = [] # Ordered by base address + + def limit(self): + return self.base + self.size + + def contains(self, addr, size=1): + return (self.base is None or self.base <= addr) and (self.size is None or (addr+size) <= self.limit()) + + def contains_range(self, range): + return self.contains(range.base, range.size) + + def descent(self): + if self.parent is None: + return [] + return [self] + self.parent.descent() + + def add_range(self, range): + assert self.contains_range(range), "%s should contain %s" % (self, range) + down = [] + for r in self.subranges: + if r.contains_range(range): + # New range is completely inside one of our subranges + assert not down + r.add_range(range) + return + if range.contains_range(r): + # New range contains one of our subranges... and possibly others + r.parent = range + range.add_range(r) + down.append(r) + for r in down: + self.subranges.remove(r) + range.parent = self + ix = 0 + # Add the new range as one of our subranges, ordered by address + for r in self.subranges: + if range.limit() <= r.base: + break + ix = ix + 1 + self.subranges.insert(ix, range) + + def iter_subranges(self, depth=0): + for r in self.subranges: + yield (depth, r) + for rr in r.iter_subranges(depth+1): + yield rr + + def iter_unmapped(self): + start = self.base + for r in self.subranges: + if start < r.base: + yield DataRange(self.map, start, r.base-start, "**unmapped**", parent=self) + start = r.limit() + if start < self.limit(): + yield DataRange(self.map, start, self.limit()-start, "**unmappped**", parent=self) + + def find_subrange(self, n): + # Find immediate subrange containing n, or None + for r in self.subranges: + if r.contains(n): + return r + return None + + def find(self, n): + assert self.is_top() or self.contains(n), "%s should be top or contain %s" % (self, n) + r = self.find_subrange(n) + if r is not None: + return r.find(n) + return self + + def is_top(self): + return self.base is None + + def check(self): + last_range = None + for r in self.subranges: + assert self.contains_range(r), "%s doesn't contain subrange %s" % (self, r) + if last_range is not None: + assert last_range.base <= r.base, "%s contains out-of-sequence subranges %s and %s" % (self, last_range, r) + assert r.base >= last_range.limit(), "%s contains consecutive overlapping ranges %s and %s" % (self, last_range, r) + r.check() + last_range = r + + def __str__(self): + if self.is_top(): + return "TOP" + return "%-10s %-10s %s" % (self.base, self.limit(), self.name) + + def __repr__(self): + return self.name + + def dump(self): + print() + print("Range: %s:" % self, end="") + if self.subranges: + print() + print(" subranges:") + for r in self.subranges: + print(" ", r) + print("----") + for r in self.subranges: + r.dump() + else: + print(" no subranges") + + +class DataMap: + def __init__(self): + self.toprange = DataRange(self, None, None, "TOP") + self.log = [self.toprange] + + def add(self, base, size, name=""): + dr = DataRange(self, base, size, name) + self.log.append(dr) + if size: + self.toprange.add_range(dr) + self.check() + else: + dr = None + return dr + + def find(self, n): + # Find the most specific subrange + return self.toprange.find(n) + + def contains(self, n): + return self.toprange.find_subrange(n) is not None + + def iter_subranges(self): + for r in self.toprange.iter_subranges(): + yield r + + def check(self): + try: + self.toprange.check() + except AssertionError as e: + print("Data map consistency check failed: %s" % e, file=sys.stderr) + self.toprange.dump() + print() + print("Log:") + for dr in self.log: + print(dr) + raise + + def show(self, fmt="%-10s"): + print_datamap(self, fmt=fmt) + + +def print_datamap(d, fmt="%-10s"): + fmt = "%s" + fmt + " " + fmt + " %s" + last_at_level = {} + for (level, r) in d.iter_subranges(): + if level in last_at_level and last_at_level[level].limit() < r.base: + print(fmt % (" "*level, last_at_level[level].limit(), r.base, "**unmapped**")) + print(fmt % (" "*level, r.base, r.limit(), r.name)) + last_at_level[level] = r + d.check() + + +def test(): + d = DataMap() + d.add(15,8,"A") + d.add(17,2,"B") + d.add(1,8,"C") + d.add(12,20,"D") + d.add(1,3,"E") + d.add(2,1,"F") + d.add(4,2,"G") + print_datamap(d) + for i in range(0,20): + r = d.find(i) + print("%3s %s" % (i, r.descent())) + d = DataMap() + d.add(0,37132,"file") + d.add(0,104,"header") + d.add(120,256,"data") + d.add(104,8,"desc 0") + d.add(112,8,"desc 1") + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="map an address space") + opts = parser.parse_args() + test() diff --git a/linux_app/pmu_app/pyperf/pyperf/elf.py b/linux_app/pmu_app/pyperf/pyperf/elf.py new file mode 100644 index 00000000..a86223cd --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/elf.py @@ -0,0 +1,424 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Map an ELF file (including /proc/kcore) +""" + +from __future__ import print_function + +import os, sys, struct, errno + +# Image type +ET_NONE = 0 +ET_REL = 1 +ET_EXEC = 2 +ET_DYN = 3 +ET_CORE = 4 + +# Machine type +EM_386 = 3 +EM_ARM = 40 +EM_X86_64 = 62 +EM_AARCH64 = 183 + +PT_NULL = 0 +PT_LOAD = 1 +PT_DYNAMIC = 2 +PT_INTERP = 3 +PT_NOTE = 4 +PT_SHLIB = 5 +PT_PHDR = 6 +PT_TLS = 7 +PT_GNU_EH_FRAME = 0x6474e550 +PT_GNU_STACK = 0x6474e551 +PT_GNU_RELRO = 0x6474e552 +PT_PAX_FLAGS = 0x65041580 + +PT_ARM_EXIDX = 0x70000001 + +PF_X = 1 +PF_W = 2 +PF_R = 4 + +SHT_NULL = 0 +SHT_PROGBITS = 1 +SHT_SYMTAB = 2 +SHT_STRTAB = 3 +SHT_RELA = 4 +SHT_HASH = 5 +SHT_DYNAMIC = 6 +SHT_NOTE = 7 +SHT_NOBITS = 8 +SHT_REL = 9 +SHT_DYNSYM = 11 +SHT_INIT_ARRAY = 14 +SHT_FINI_ARRAY = 15 +SHT_PREINIT_ARRAY = 16 +SHT_GROUP = 17 +SHT_GNU_ATTRIBUTES = 0x6ffffff5 +SHT_GNU_HASH = 0x6ffffff6 +SHT_GNU_verdef = 0x6ffffffd +SHT_GNU_verneed = 0x6ffffffe +SHT_GNU_versym = 0x6fffffff + +SHT_ARM_EXIDX = 0x70000001 +SHT_ARM_PREEMPTMAP = 0x70000002 +SHT_ARM_ATTRIBUTES = 0x70000003 + +SHF_WRITE = 0x0001 +SHF_ALLOC = 0x0002 +SHF_EXECINSTR = 0x0004 + +SHN_UNDEX = 0 +SHN_ABS = 0xfff1 +SHN_COMMON = 0xfff2 + +# "CORE" note types +NT_PRSTATUS = 1 +NT_PRFPREG = 2 +NT_PRPSINFO = 3 +NT_TASKSTRUCT = 4 +NT_AUXV = 6 + +# "GNU" note types +NT_GNU_ABI_TAG = 1 +NT_GNU_HWCAP = 2 +NT_GNU_BUILD_ID = 3 +NT_GNU_GOLD_VERSION = 4 +NT_GNU_PROPERTY_TYPE_0 = 5 + + +pt_name = {} +sht_name = {} +for x in list(globals()): + if x.startswith("PT_"): + pt_name[globals()[x]] = x[3:] + if x.startswith("SHT_"): + sht_name[globals()[x]] = x[4:] + + +class NotELF(Exception): + pass + + +class Segment: + """ + A program segment (may contain multiple sections). + """ + def __init__(self, file): + self.file = file + self._data = None + + def data(self): + if self._data is None: + self._data = self.file.readat(self.offset, self.filesz) + return self._data + + def size(self): + # Size of segment in memory - including zero padding + return self.memsz + + def vaddr_end(self): + # End address of the segment (not included in the segment). We hope this is representable. + return self.vaddr + self.memsz + + def vaddr_last(self): + # Last valid address in the segment + if self.memsz == 0: + return None + else: + return self.vaddr + (self.memsz - 1) + + def is_padded(self): + assert self.memsz == 0 or self.memsz >= self.filesz + return self.memsz > self.filesz + + def contains_vaddr(self, va, size=1): + return self.vaddr <= va and (va+size) <= self.vaddr_end() + + def is_executable(self): + return (self.flags & PF_X) != 0 + + def __str__(self): + s = "%s[%u]: %s 0x%x-0x%x" % (self.file, self.index, pt_name[self.type], self.vaddr, self.vaddr_end()) + return s + + +class Section: + def __init__(self, file): + self.file = file + self._data = None + + def data(self): + if self._data is None: + self._data = self.file.readat(self.soff, self.ssize) + return self._data + + def __str__(self): + s = "#%u" % (self.index) + + +class Note: + def __init__(self, group, ntype, desc): + self.group = group + self.ntype = ntype + self.desc = bytes(desc) + + def __str__(self): + s = "Note(\"%s\",type=0x%x,data=%u)" % (self.group, self.ntype, len(self.desc)) + return s + + + +def is_mapping_symbol_False(s): + return False + +def symbol_real_address_default(addr): + return addr + + +def is_mapping_symbol_ARM(s): + if s[0] == "$" and len(s) >= 2: + return s[0:2] in ["$a", "$t", "$d", "$x"] and (len(s) == 2 or s[2] == '.') + else: + return False + +def symbol_real_address_ARM(addr): + return addr & ~1 + + +class ELF: + """ + Encapsulate an ELF file for reading. + The constructor attempts to check it's an ELF file and read headers etc. + If that fails, it will throw a NotELF or IOError exception. + """ + def __init__(self, fn): + """ + Construct an ELF object reader, by file name. + """ + self.fn = fn + self.fd = None + self.elf_type = None + self.machine = None + self.is_mapping_symbol = is_mapping_symbol_False + self.symbol_real_address = symbol_real_address_default + self.read_headers() + + def read_headers(self): + try: + self.fd = open(self.fn, "rb") + except IOError as e: + if False and e.errno == errno.EACCES: + print("%s: no permission to read - try as root" % self.fn, file=sys.stderr) + return + raise + s = self.fd.read(80) + if not s.startswith(b"\x7fELF"): + #print("%s: not an ELF file" % self.fn, file=sys.stderr) + #return + raise NotELF() + self.elf_type = self.read16(16) # EXE, OBJ etc. + self.machine = self.read16(18) # EM_ARM etc. + if self.machine == EM_ARM: + self.symbol_real_address = symbol_real_address_ARM + if self.machine in [EM_ARM, EM_AARCH64]: + self.is_mapping_symbol = is_mapping_symbol_ARM + self.sf = (self.read8(4) == 2) # 64-bit ELF + if not self.sf: + self.entry = self.read32(24) + self.phoff = self.read32(28) + self.phsize = self.read16(42) + self.phnum = self.read16(44) + self.shoff = self.read32(32) + self.shsize = self.read16(46) + self.shnum = self.read16(48) + else: + self.entry = self.read64(24) + self.phoff = self.read64(32) + self.phsize = self.read16(54) + self.phnum = self.read16(56) + self.shoff = self.read64(40) + self.shsize = self.read16(58) + self.shnum = self.read16(60) + + def __str__(self): + s = self.fn + return s + + def __del__(self): + if self.fd is not None: + self.fd.close() + + def readat(self, off, n): + self.fd.seek(off) + try: + s = self.fd.read(n) + except IOError: + print("%s: failed to read 0x%x bytes" % (self.fn, n), file=sys.stderr) + s = None + except MemoryError: + print("%s: failed to read 0x%x bytes - out of memory" % (self.fn, n), file=sys.stderr) + s = None + return s + + def readnum(self, fmt, n, off, s=None): + # TBD: handle endianness conversion + if s is None: + s = self.readat(off, n) + else: + s = s[off:off+n] + return struct.unpack(fmt, s)[0] + + def read64(self, off, s=None): + return self.readnum("Q", 8, off, s) + + def read32(self, off, s=None): + return self.readnum("I", 4, off, s) + + def read16(self, off, s=None): + return self.readnum("H", 2, off, s) + + def read8(self, off, s=None): + return self.readnum("B", 1, off, s) + + def segments(self, type=None): + """ + Iterate through segments, possibly of a given type. + """ + for i in range(0, self.phnum): + pho = self.phoff + i*self.phsize + ph = self.readat(pho, self.phsize) + stype = self.read32(0, ph) + if type is not None and stype != type: + continue + s = Segment(self) + s.index = i + s.type = stype + if not self.sf: + s.flags = self.read32(24, ph) + s.filesz = self.read32(16, ph) + s.memsz = self.read32(20, ph) + s.offset = self.read32(4, ph) + s.vaddr = self.read32(8, ph) + else: + s.flags = self.read32(4, ph) + s.filesz = self.read64(32, ph) + s.memsz = self.read64(40, ph) + s.offset = self.read64(8, ph) + s.vaddr = self.read64(16, ph) + yield s + + def notes(self, group=None): + for ns in self.segments(type=PT_NOTE): + d = ns.data() + while d: + if self.read32(0, d) == 0: + d = d[4:] # unclear why we see this + if True or not self.sf: + # ELF spec says 64-bit ELF has 64-bit fields, but in practice, it's 32-bit + namesz = self.read32(0, d) + descsz = self.read32(4, d) + ntype = self.read32(8, d) + d = d[12:] + else: + assert False + assert namesz <= 32, "unexpected namesz in note: 0x%x" % namesz + name = d[0:namesz] + while name[-1:] == b'\00': + name = name[:-1] + d = d[((namesz+3)&~3):] + desc = d[:descsz] + d = d[((descsz+3)&~3):] + if group is None or name == group: + yield Note(name, ntype, desc) + + def build_id(self): + for n in self.notes(group=b"GNU"): + if n.ntype == NT_GNU_BUILD_ID: + return n.desc + return None + + def sections(self): + for i in range(0, self.shnum): + sho = self.shoff + i*self.shsize + sh = self.readat(sho, self.shsize) + s = Section(self) + s.index = i + s.type = self.read32(4, sh) + if not self.sf: + s.flags = self.read32(8, sh) + s.saddr = self.read32(12, sh) + s.soff = self.read32(16, sh) + s.ssize = self.read32(20, sh) + s.salign = self.read32(32, sh) + else: + s.flags = self.read64(8, sh) + s.saddr = self.read64(16, sh) + s.soff = self.read64(24, sh) + s.ssize = self.read64(32, sh) + s.salign = self.read64(48, sh) + yield s + + +if __name__ == "__main__": + import argparse + import hexdump + parser = argparse.ArgumentParser(description="ELF file inspector") + parser.add_argument("--binutils", action="store_true", help="emulate binutils output") + parser.add_argument("--verbose", "-v", action="count", help="increase verbosity") + parser.add_argument("files", type=str, nargs="+", help="ELF files") + opts = parser.parse_args() + for fn in opts.files: + try: + e = ELF(fn) + except NotELF: + print("%s: not ELF" % (fn)) + continue + if e.elf_type is None: + continue + print("%s: elf%s" % (fn, int(e.sf)*32+32)) + if True: + print("Segments:") + for s in e.segments(): + if opts.binutils: + print(" %-12s 0x%016x 0x%016x" % (pt_name[s.type], s.offset, s.vaddr)) + print(" 0x%016x %04x" % (s.filesz, s.flags)) + else: + print(" %3u" % (s.index), end="") + if s.vaddr_last() is not None: + print(" %x-%x" % (s.vaddr, s.vaddr_last()), end="") + else: + print(" vaddr=%x" % (s.vaddr), end="") + print(" %04x %-12s %16x @%x" % (s.flags, pt_name[s.type], s.filesz, s.offset), end="") + if s.is_padded(): + print("*", end="") + print() + print("Sections:") + for s in e.sections(): + print(" %3u %-12s 0x%016x 0x%04x" % (s.index, sht_name[s.type], s.saddr, s.flags)) + print("Notes:") + for n in e.notes(): + print(" %s" % n) + if opts.verbose: + hexdump.print_hex_dump(n.desc, prefix=" ") + bid = e.build_id() + if bid is not None: + print("Build ID: ", end="") + for c in bytearray(bid): + print("%02x" % c, end="") + print() + diff --git a/linux_app/pmu_app/pyperf/pyperf/hexdump.py b/linux_app/pmu_app/pyperf/pyperf/hexdump.py new file mode 100644 index 00000000..cc0cee22 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/hexdump.py @@ -0,0 +1,96 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Show raw data in traditional hex dump format. +""" + +from __future__ import print_function + +import sys + + +def is_printable(c, upper7=False): + if 32 <= c and c <= 0x7e: + return True + if upper7 and c >= 0xa0 and c <= 0xff: + return True + return False + + +def as_bytes(s): + # We want to access the characters of the string as bytes, + # consistently between Python2 and Python3. + if isinstance(s, str): + s = bytearray(s) + return s + + +def print_hex_dump(d, base=0, prefix="", width=16, file=None, upper7=False): + """ + Show raw data from a byte array, in traditional hex dump format. + """ + f = file + if f is None: + f = sys.stdout + d = as_bytes(d) + size = len(d) + nl = int((size+width-1) / width) + tp = size + for i in range(0, nl): + ip = i * width + print("%s%04x: " % (prefix, base+ip), end="", file=f) + nb = min(tp, width) + for j in range(0, nb): + print(" %02x" % d[ip+j], end="", file=f) + for j in range(nb, width): + print(" ", end="", file=f) + print(" ", end="", file=f) + for j in range(0, nb): + c = d[ip+j] + cs = "." + if is_printable(c, upper7=upper7): + cs = chr(c) + try: + print(cs, end="", file=f) + except UnicodeEncodeError: + print(".", end="", file=f) + print("", file=f) + tp -= nb + + +def str_hex(x): + x = as_bytes(x) + s = "" + for c in x: + s += ("%02x" % c) + return s + + +def str_hex_escape(x): + x = as_bytes(x) + s = "" + for c in x: + if is_printable(c): + s += chr(c) + else: + s += "\\x%02x" % c + return s + + +if __name__ == "__main__": + f = open(sys.argv[1]) + print_hex_dump(f.read(), width=32) + f.close() diff --git a/linux_app/pmu_app/pyperf/pyperf/imagemap.py b/linux_app/pmu_app/pyperf/pyperf/imagemap.py new file mode 100644 index 00000000..8e5181f2 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/imagemap.py @@ -0,0 +1,713 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This module manages a set of program images, providing opcodes +and/or symbols at given addresses. + +An imagemap object owns multiple images. + +TBD: we don't yet support multiple address spaces. + +There are two ways we could support multiple address spaces: + + - we could rely on the caller to construct multiple imagemaps. + When changing context id they would change to the imagemap + for that context id. Images such as the kernel, which are + common to all address spaces, would need to be loaded into + each imagemap. + + - we could add a context parameter to each image. When looking + up an address, the caller would supply the current context id. + Images such as the kernel could have a 'None' context id. + +TBD: we don't yet have time awareness, i.e. a mapping only being +valid from, until or between time durations. +This also could be done two ways: + + - by requiring the caller to keep the imagemap up to date, + e.g. by tracking image load and unload events. + + - by associating validity intervals with each image and requiring + a caller to pass in a timestamp with each address. + +Note that multi-address-space support could be built on top of +time-awareness, in the sense that images for an address space could +have their validity intervals intersected with the set of intervals +when their address space was the active one. +""" + +from __future__ import print_function + +import os, sys +import struct, mmap +import bisect +import subprocess +import platform + +import pyperf.elf as elf + +# sys.path.append("/root/symbolizer") +# import symbolizer + +o_target_arch = platform.machine() + + +def binutil(cmd): + """ + Get a binutil command name, appropriate for trace decode, PC-to-symbol resolution etc. + For native ARM systems (32 or 64 bit) this will use native binutils. + For other platforms it will assume you will be decoding 32-bit trace. + """ + if o_target_arch == platform.machine(): + return "/usr/bin/" + cmd + else: + return "arm-none-eabi-" + cmd + + +def is_ARM_mapping_symbol(s): + return elf.is_mapping_symbol_ARM(s) + + +class Symtab(): + """ + Symbol table - maps addresses to symbols. + """ + def __init__(self): + self.syms = [] # list of (addr, name) pairs + self.sym_addr = None + self.sym_names = {} + + def __len__(self): + return len(self.syms) + + def __getitem__(self, ix): + self.ensure_sorted() + return self.syms[ix] + + def add(self, addr, name): + self.syms.append((addr, name)) + self.sym_addr = None + self.sym_names[name] = addr + + def sorted_by_addr(self): + self.ensure_sorted() + for sym in self.syms: + yield sym + + def show(self): + for (addr, name) in self.sorted_by_addr(): + print("0x%08x %s" % (addr, name)) + + def ensure_sorted(self): + if self.sym_addr is None: + self.syms.sort(key=lambda a_n: a_n[0]) + self.sym_addr = [addr for (addr, name) in self.syms] + # now self.syms is sorted by address and sym.addr is the + # addresses from the same list + + def find_sym_by_name(self, name): + """ + Given a name, find the (first?) symbol with that name. + """ + if name in self.sym_names: + return self.sym_names[name] + return None + + def find_exact_sym_by_addr(self, addr): + """ + Given an address, find a symbol at that address, or None. + """ + st = self.find_sym_by_addr(addr) + if st is None or st[0] != addr: + return None + return st[1] + + def find_sym_by_addr(self, addr): + """ + Given an address, return a tuple + (addr, name) + for the nearest previous symbol in address order. + """ + self.ensure_sorted() + ix = bisect.bisect_right(self.sym_addr, addr) + if ix: + ix -= 1 + assert self.sym_addr[ix] <= addr + s = self.syms[ix] + assert s[0] <= addr + return s + else: + return None + + def desc_sym_by_addr(self, addr, decimal=False): + """ + Given an address, return a descriptive string, e.g. + "name+0x10" + """ + s = self.find_sym_by_addr(addr) + if s is None: + return "0x%x" % addr + else: + (a, name) = s + if a == addr: + return name + else: + offset = addr - a + assert offset > 0 + if decimal: + return "%s+%u" % (name, offset) + else: + return "%s+0x%x" % (name, offset) + + + +def read_nm_symlist(sl, symtab, load=0, reject=None, map=None): + """ + Read a symbol list, as output from 'nm', into a provided symbol table. + Input is a file-like-object that we can read line by line. + Return the number of symbols added. + We can't assume input is sorted (/proc/kallsyms isn't). + + In /proc/kallsyms, symbols from dynamically loaded modules are suffixed by the module name. + + 123456 t sym + 123456 t sym [module] + """ + n = 0 + for s in sl: + try: + s = s.decode() + except AttributeError: + pass + if s[0] == " ": + # e.g. undefined symbol + continue + sp = s.find(' ') + if sp < 4: + continue + try: + # Symbol 'address'. In AArch32, LSB will be interworking bit. + addr = int(s[0:sp], 16) + except ValueError: + if s.startswith("ELF"): + print("possibly ELF file?") + raise + print("odd line: %s" % s) + raise + if map is not None: + addr = map(addr) + pa = addr + load + name = s[sp+3:-1] + if not name: + # sometimes seen for 'r' symbols + continue + if reject is not None and reject(name): + continue + symtab.add(pa, name) + n += 1 + return n + + +def read_elf_symlist(fn, symtab, load=0): + """ + For an ELF file, add its exported symbols to a provided symbol table. + The symbol address can be adjusted by a provided load address - + this is for shared objects. + """ + E = elf.ELF(fn) + method = "nm" + cmd = binutil("nm") + (" %s" % fn) + if False: + print(">>> %s" % cmd) + p = subprocess.Popen(cmd.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + pipe = p.stdout + n = read_nm_symlist(pipe, symtab, load=load, reject=E.is_mapping_symbol, map=E.symbol_real_address) + pipe.close() + rc = p.wait() + if rc != 0: + raise OSError("command failed: %s" % cmd) + if n == 0: + # nm didn't find anything. Perhaps a library with only dynamic symbols? + method = "objdump -T" + cmd = binutil("objdump") + (" -T %s" % fn) + p = subprocess.Popen(cmd.split(), shell=False, stdout=subprocess.PIPE) + pipe = p.stdout + for s in pipe: + if len(s) < 30: + continue + if s[17:22] != ".text": + continue + try: + addr = int(s[0:8], 16) + except ValueError: + print("odd line: %s" % s) + continue + # split() isn't very helpful here as some columns are blanks. + ix = 37 + while s[ix] != ' ': + ix += 1 + while s[ix] == ' ': + ix += 1 + name = s[ix:-1] + pa = addr + load + symtab.add(pa, name) + n += 1 + pipe.close() + if n > 0: + print("%s: added %u symbols (%s)" % (fn, n, method)) + return n + + +def proc_map_images(fn): + """ + Read a /proc//map file and yield any images with an executable part. + """ + f = open(fn, "r") + for ln in f: + v = ln.split() + ix = ln.find("-") + base = int(ln[0:ix], 16) + if v[1][2] == 'x': + # executable area + fn = v[5] + if fn[0] != "[": + yield (base, fn) + f.close() + + +def proc_modules(): + """ + Read /proc/modules and yield modules and their load-addresses, as a map + """ + modules = {} + f = open("/proc/modules") + for ln in f: + # don't do tuple assignment as number of fields may vary + d = ln.split() + name = d[0] + saddr = d[5] + status = d[4] + if status == "Live": + modules[name] = int(saddr[2:], 16) + f.close() + return modules + + +class image(): + """ + An object of this class represents a specific instance of a + program text section, loaded into an address space at a given address. + + For shared objects, load_addr should indicate the actual load address. + This is then used to adjust actual addresses down to their relative + address in the image. + """ + def __init__(self, base_addr, data, elf=None, original_name=None, description=None, load_addr=0x0, deferred=False): + # base_addr is the address, in the address space, corresponding + # to byte 0 of the data. That is, data()[0] is the byte at address 'base_addr'. + # It isn't necessarily the load address of the containing module, which + # is used to adjust addresses. + # For example, an executable whose .text section is at 0x8000 + # would have, for the image object for that .text section: + # base_addr = 0x8000 + # load_addr = 0 + self.base_addr = base_addr # Address within the address space + self.deferred = deferred + if not deferred: + self._data = bytearray(data) # Contents of this range of addresses + self.end_addr = base_addr + len(data) # End address within address space + else: + self._data = data + self.end_addr = base_addr + data.size() + self.elf = elf + if original_name is None: + original_name = elf + self.original_name = original_name + if description is None and self.file_name() is not None: + description = "from %s" % self.file_name() + if self.elf != self.original_name: + description += " (%s)" % self.elf + self.description = description + self.load_addr = load_addr + self.a2l_process = None + + def data(self): + if self.deferred: + self._data = self._data.data() + self.deferred = False + return self._data + + def contains(self, addr, size=1): + return self.base_addr <= addr and (addr+size) <= self.end_addr + + def symbolize(self, addr): + addr -= self.load_addr + if self.elf is not None: + return symbolizer.symbolize(self.elf, addr) + + def file_name(self): + return self.original_name + + def __str__(self): + s = "0x%x..0x%x %s" % (self.base_addr, self.end_addr-1, self.description) + return s + + def addr2line(self, addr): + """ + Given an absolute address, map it to a source position. + The result is + (fun, file, line, disc) + fun is the function name string (from DWARF if possible - e.g. inlined function) + file is the source filename, with directory prepended + line is the line number + disc is the DWARF4 discriminator where supplied - normally zero + Return None if the address doesn't resolve to a source line. + TBD: check we do the right thing with column, for those compilers that generate it. + """ + debug = False + addr -= self.load_addr + if False: + pos = symbolizer.symbolize(self.elf, addr)[0] + if pos[0] == "??": + pos = None + return pos + if self.a2l_process is None: + if self.elf is None: + # print "no ELF image for address 0x%x" % addr + return None + if not os.path.isfile(self.elf): + return None + if debug: + print("%s: starting addr2line (load addr = 0x%x)" % (self.elf, self.load_addr), file=sys.stderr) + cmd = binutil("addr2line") + " -f --exe=%s" % self.elf + self.a2l_process = subprocess.Popen(cmd.split(), shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True) + # For a position-independent dynamic module, we need to convert the + # address in the current address space, into an address that will be + # meaningful to addr2info. To do that, we subtract the module load address. + # For executables (or any other image that is loaded at the address specified + # in the ELF image), the load address is zero. + if debug: + print("%s: addr2line 0x%x" % (self.elf, addr), file=sys.stderr) + self.a2l_process.stdin.write("0x%x\n" % addr) + self.a2l_process.stdin.flush() + fun = self.a2l_process.stdout.readline()[:-1] + pos = self.a2l_process.stdout.readline()[:-1] + if is_ARM_mapping_symbol(fun): + # addr2line shouldn't do this: GNUTOOLS-5134 + if False: + print("addr2line returned ARM mapping symbol %s as function name" % fun) + print("%s -f -e %s %x" % (binutil("addr2line"), self.elf, addr)) + fun = "?" + if False: + print("addr2line: 0x%08x -> [%s,%s]" % (addr, fun, pos)) + p = pos.index(':') + if pos[p+1] != "?": + file = pos[:p] + sline = pos[p+1:] + p = sline.find(" (discriminator ") + if p == -1: + line = int(sline) + disc = 0 + else: + line = int(sline[:p]) + sline = sline[p+16:] + p = sline.index(")") + disc = int(sline[:p]) + return (fun, file, line, disc) + else: + return None + + +class imagemap(): + """ + Map one or more address spaces. + An address space is assumed to be covered by multiple images. + Images can be added to (TBD: and removed from) the address space. + An address can be looked up in the map, giving an image and + within that, address properties such as symbol and source position. + """ + def __init__(self): + self.images = [] + self.symtab = Symtab() + + def add_segment(self, bin, addr, name=None, elf=None, original_name=None, load_addr=0, deferred=False): + """ + Add a binary blob at a given address. + The load_addr is the load address of a dynamic module - + this is used to adjust the address passed in to binutils + utilities. + The name parameter is for diagnostic purposes only - + it can be used to indicate where we got this blob from. + """ + assert load_addr <= addr, "%s: adding segment, expected load address 0x%x <= 0x%x" % (elf, load_addr, addr) + im = image(addr, bin, description=name, elf=elf, original_name=original_name, load_addr=load_addr, deferred=deferred) + self.images.append(im) + return im + + def add_bin(self, fn, addr, name=None, offset=0, size=None, original_name=None): + """ + Add a binary blob from a file. + [offset,offset+size) indicates the bloblet within the file. + [addr,addr+size) is where it is loaded into the address space. + """ + f = open(fn, "rb") + bin = bytearray(f.read()) + f.close() + if name is None: + rfn = fn + if original_name is not None: + rfn = original_name + name = "(from %s)" % rfn + if size is not None: + bin = bin[offset:offset+size] + else: + bin = bin[offset:] + return self.add_segment(bin, addr, name=name, original_name=original_name) + + def add_proc_map_images(self, fn, dir="."): + """ + Process /proc//xxx and add any described images to the + image map. + """ + for (base, im) in proc_map_images(fn): + if os.path.exists(im): + self.add_elf(im, load=base) + continue + lfn = dir + os.sep + im + if os.path.exists(lfn): + self.add_elf(lfn, load=base) + else: + print("missing code at 0x%08x: %s" % (base, lfn)) + + def show(self): + # show memory mappings + if not self.images: + print("** no images loaded in address map **") + sorted_images = sorted(self.images, key=lambda im: im.base_addr) + for im in sorted_images: + if im.description is None: + name = "" + else: + name = im.description + if False: + for i in range(0, 20): + byte = im.data()[i] # it's now a bytearray + print("%02x" % (byte), end=' ') + print(" ", end=' ') + print("0x%016x-0x%016x: %s" % (im.base_addr, im.end_addr, name)) + # after all the address ranges, show symbols (summary) + if self.symtab: + print("symbol table:") + print(" 0x%08x (%s) to 0x%08x (%s)" % (self.symtab[0][0], self.symtab[0][1], self.symtab[-1][0], self.symtab[-1][0])) + + def add_nm_syms(self, fn): + """ + Read a file containing the output of 'nm' (or Symtab) and add to the symbol list + This can also be used with /proc/kallsyms. + """ + f = open(fn, "r") + read_nm_symlist(f, self.symtab) + f.close() + + def add_file(self, fn, load=0, offset=0, size=None, original_name=None): + """ + Given a file (maybe ELF, maybe not) map it into the address space. + [offset,offset+size) denotes the region within the file. + [load,load+size) denotes the region within the address space. + """ + if offset > 0: + self.add_bin(fn, load, offset=offset, size=size, original_name=original_name) + return + try: + self.add_elf(fn, load=load, original_name=original_name) + except elf.NotELF: + self.add_bin(fn, load, offset=offset, size=size, original_name=original_name) + + def add_elf_syms(self, fn, load=0): + """ + Given an ELF file, add just the symbols. + """ + #print("read ELF symbols: %s" % fn, file=sys.stderr) + read_elf_symlist(fn, self.symtab, load=load) + + def add_elf(self, fn, load=0, is_ko=False, original_name=None, syms=None): + """ + Given an ELF file, add the symbols and all available text. + The 'load' parameter indicates where in the address space the ELF file was loaded. + """ + # Extract the code sections - objcopy -O binary isn't enough + #print("%s: reading code, loaded at 0x%x..." % (fn, load)) + expected_type = None + trace = False + if is_ko: + expected_type = 1 + e = elf.ELF(fn) + if e.elf_type is None: + print("%s: not an ELF file" % fn) + return None + if expected_type is not None: + if e.elf_type != expected_type: + print("%s: expected ELF type %u, got %u" % (fn, expected_type, e.elf_type)) + return None + else: + if e.elf_type != elf.ET_DYN: + # if it's not ET_DYN, don't do the address adjustment + print("%s: not a shared object (type=%u) - load address ignored" % (fn, e.elf_type)) + load = 0 + if syms is not None: + self.add_nm_syms(syms) + elif fn == "/proc/kcore": + self.add_nm_syms("/proc/kallsyms") + else: + self.add_elf_syms(fn, load=load) + if is_ko: + # loadable kernel module (see add_ko below): emulate layout_sections() + alloc = load + # we should run through the sections several times, for each section class + # (executable sections first etc.) but as we're only interested in executable + # sections, we just do that + for s in e.sections(): + if (s.sflags & elf.SHF_ALLOC) == 0: + continue + if s.stype != elf.SHT_PROGBITS: + continue + if (s.sflags & elf.SHF_EXECINSTR) == 0: + continue + if s.salign == 0: + s.salign = 1 + assert saddr == 0, "expected section address zero in kernel module" + alloc = (alloc+s.salign-1) & ~(s.salign-1) + print(" section #%u at addr=0x%x size=0x%x align=%u" % (i, alloc, s.ssize, s.salign)) + self.add_segment(s.data(), alloc, elf=fn, load_addr=load) + # TBD we should fix up relocations to the kernel / other modules, + # so that BLs point to the right places. We should also patch out + # calls to _mcount, and apply alternative code sequences. + alloc += s.ssize + return + n_segments = 0 + if trace: + print("%s load address 0x%x" % (original_name, load)) + for s in e.segments(): + if s.type != elf.PT_LOAD: + continue + if trace: + print("considering at 0x%x..0x%x size 0x%x" % (s.vaddr+load, s.vaddr+load+s.filesz, s.filesz)) + if (s.flags & elf.PF_X) == 0: + continue # Not a code segment + if s.filesz > 0x100000000: + continue # seen in /proc/kcore, overlays with other segments + im = self.add_segment(s, s.vaddr+load, elf=fn, original_name=original_name, load_addr=load, deferred=True) + if trace: + print(" added segment: %s" % im) + n_segments += 1 + if n_segments == 0: + print("** %s: no load segments!" % fn) + + def add_ko(self, name, load): + """ + Add a loadable kernel module (a xxx.ko file). + Unlike a userspace shared object, a KO is a relocatable file (ET_REL) + described by sections rather than segments. The address layout is done + at load time: see layout_sections(). + """ + self.add_elf(name, load, is_ko=True) + + def find_sym_by_name(self, name): + return self.symtab.find_sym_by_name(name) + + def desc_sym_by_addr(self, addr, decimal=False): + return self.symtab.desc_sym_by_addr(addr, decimal=decimal) + + def find_sym_by_addr(self, addr): + # return None or a tuple (addr, name) + return self.symtab.find_sym_by_addr(addr) + + def find_exact_sym_by_addr(self, addr): + return self.symtab.find_exact_sym_by_addr(addr) + + def find_image(self, addr, size=1): + for im in self.images: + if im.contains(addr, size): + return im + return None + + def is_mapped(self, addr, size=1): + return self.find_image(addr, size) is not None + + def addr2line(self, addr): + im = self.find_image(addr, 1) + if im is not None: + return im.addr2line(addr) + else: + return None + + def symbolize(self, addr): + im = self.find_image(addr, 1) + if im is not None: + return im.symbolize(addr) + else: + return None + + def read(self, addr, size): + im = self.find_image(addr, size) + if im is not None: + return im.data()[addr-im.base_addr:addr-im.base_addr+size] + return None + + def write(self, addr, s): + # patch the image contents. This might be necessary in order to track + # hotpatching events, or apply alternative code sequences (as described + # in the __alt_instructions table) to a kernel image. + # We rely on the image being a bytearray(). + size = len(s) + im = self.find_image(addr, size) + assert im is not None + im.data()[addr-im.base_addr:addr-im.base_addr+size] = s + + def read16(self, addr): + s = self.read(addr, 2) + if s is not None: + s = struct.unpack("H", s)[0] + return s + + def read32(self, addr): + s = self.read(addr, 4) + if s is not None: + s = struct.unpack("I", s)[0] + return s + + +if __name__ == "__main__": + args = sys.argv[1:] + m = imagemap() + while len(args) > 0: + arg = args[0] + del args[0] + if arg.startswith("--"): + if arg == "--elf": + fn = args[0] + del args[0] + m.add_elf(fn) + else: + print("** unknown option: %s" % arg) + else: + addr = int(arg, 16) + print("0x%x -> %s" % (addr, m.desc_sym_by_addr(addr))) + val = m.read32(addr) + if val is not None: + print("0x%x: 0x%08x" % (addr, val)) + else: + print("0x%x: not available" % (addr)) diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_abi.py b/linux_app/pmu_app/pyperf/pyperf/perf_abi.py new file mode 100644 index 00000000..c782ab33 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_abi.py @@ -0,0 +1,739 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This module encapsulates data structures defined by the perf_event_open syscall ABI, +and (as a result) by the perf.data file format: + + PerfRecord - an event record returned by the kernel in the + memory-mapped buffer. + Also recorded in the data section of perf.data. + +Note the terminology: + + - a RECORD (PerfRecord) is a specific occurrence of some event, + generated for us by the kernel. + + - an EVENT (PerfEventAttr) is a descriptor of a set of event occurrences + that we are interested in. An EVENT will (in the kernel) have a file + descriptor and ring buffer associated with it. + + - an EVENT DESCRIPTOR (PerfDataEventDesc) in perf.data describes a + group of events. + +Structures specific to perf.data (i.e. artefacts of the userspace tools) +are defined in the perf_data module. + +""" + +from __future__ import print_function + +from pyperf.perf_enum import * +from pyperf.perf_attr import PerfEventAttr +from pyperf.hexdump import print_hex_dump, str_hex, str_hex_escape + +import struct, sys + + +_PERF_RECORD_MAX_FROM_KERNEL = 64 + +def bits(x, pos, w): + return (x >> pos) & ((1<> p) & 1 + + +def bitbool(x, p): + return bit(x, p) != 0 + + +def ip_perf_context(ip): + # TBD this is wrong on 32-bit systems. + if (ip & 0xfffffffffffff000) == 0xfffffffffffff000: + return ip - 0x10000000000000000 + else: + return None + + +def trailing_string(d, check=None): + # d is a byte array, length a multiple of 8. Extract a string and remove trailing NULs. + # Check that the NUL is in the expected place. + assert isinstance(d, bytearray) or isinstance(d, bytes), "invalid record: %s" % type(d) + ix = d.find(b'\0') + if ix < 0: + if check: + check.note("string does not have trailing NUL: '%s'" % str_hex_escape(d)) + ix = len(d) + if ix < len(d)-8: + if check: + check.note("string has NUL too early: '%s'" % str_hex_escape(d)) + s = d[:ix].decode() + nuls = bytearray(d[ix:]) # should be all NULs + for c in nuls: + if c != 0x00: + # We see this in synthesized MMAP records + if check: + check.note("unexpected character '0x%02x' found in string padding after \"%s\"" % (c, s)) + break + return s + + +def strip_trailing_nuls(s): + if '\0' in s: + s = s[:s.index('\0')] + return s + + +class PerfBranchEntry: + def __init__(self): + pass + + +class PerfRegSample: + """ + Register snapshot - architecture-specific + """ + def __init__(self, sample_regs): + self.sample_regs = sample_regs + + def sample(self, d): + self.abi = struct.unpack("Q", d[:8])[0] + sru = self.sample_regs + d = d[8:] + self.regs = {} + n = 0 + while sru != 0: + if (sru & 1) != 0: + if self.abi == PERF_SAMPLE_REGS_ABI_32: + r = struct.unpack("I", d[:4])[0] + d = d[4:] + elif self.abi == PERF_SAMPLE_REGS_ABI_64: + r = struct.unpack("Q", d[:8])[0] + d = d[8:] + else: + assert False, "unknown PERF_SAMPLE_REGS_USER ABI=%u" % self.abi + self.regs[n] = r + sru >>= 1 + n += 1 + return d + + +class ReadFormat: + """ + One, or several, event values. + """ + def __init__(self, read_format): + self.read_format = read_format + self.values = [] + + def _unpack_times(self, d): + if self.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED: + self.time_enabled = struct.unpack("Q", d[:8]) + d = d[8:] + else: + self.time_enabled = None + if self.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING: + self.time_running = struct.unpack("Q", d[:8]) + d = d[8:] + else: + self.time_running = None + return d + + def unpack(self, d): + if self.read_format & PERF_FORMAT_GROUP: + self.nr = struct.unpack("Q", d[:8])[0] + d = self._unpack_times(d[8:]) + for i in range(0, self.nr): + value = struct.unpack("Q", d[:8])[0] + d = d[8:] + if self.read_format & PERF_FORMAT_ID: + vid = struct.unpack("Q", d[:8])[0] + d = d[8:] + else: + vid = None + self.values.append((value, vid)) + else: + self.nr = 1 + value = struct.unpack("Q", d[:8])[0] + d = self._unpack_times(d[8:]) + if self.read_format & PERF_FORMAT_ID: + vid = struct.unpack("Q", d[:8])[0] + d = d[8:] + else: + vid = None + self.values.append((value, vid)) + return d + + +def record_trailing_bytes(ea): + # Return the size of the standard trailing fields in a non-SAMPLE record, + # given an event attribute with sample type. + # See also PerfRecord.unpack_sample_id(). + if not ea.sample_id_all: + return 0 + st = ea.sample_type + n = 0 + if st & PERF_SAMPLE_IDENTIFIER: + n += 8 + if st & PERF_SAMPLE_CPU: + n += 8 + if st & PERF_SAMPLE_STREAM_ID: + n += 8 + if st & PERF_SAMPLE_ID: + n += 8 + if st & PERF_SAMPLE_TIME: + n += 8 + if st & PERF_SAMPLE_TID: + n += 8 + return n + + +def record_non_sample_id_offset(ea): + # Get the offset (negative from end-of-record) of the id field, + # for a non-sample record. + if not ea.sample_id_all: + return None + st = ea.sample_type + if st & PERF_SAMPLE_IDENTIFIER: + return -8 + if st & PERF_SAMPLE_ID: + n = 0 + if st & PERF_SAMPLE_CPU: + n -= 8 + if st & PERF_SAMPLE_STREAM_ID: + n -= 8 + n -= 8 + return n + return None + + +def record_non_sample_time_offset(ea): + # Get the offset (negative from end-of-record) of the time field, + # for a non-sample record. + if not ea.sample_id_all: + return None + st = ea.sample_type + if st & PERF_SAMPLE_TIME: + n = 0 + if st & PERF_SAMPLE_IDENTIFIER: + n -= 8 + if st & PERF_SAMPLE_CPU: + n -= 8 + if st & PERF_SAMPLE_STREAM_ID: + n -= 8 + if st & PERF_SAMPLE_ID: + n -= 8 + n -= 8 + return n + return None + + +def record_sample_id_offset(ea): + # Get the offset (from start of payload) of the id field for a sample. + st = ea.sample_type + if st & PERF_SAMPLE_IDENTIFIER: + return 0 + if st & PERF_SAMPLE_ID: + n = 0 + if st & PERF_SAMPLE_IP: + n += 8 + if st & PERF_SAMPLE_TID: + n += 8 + if st & PERF_SAMPLE_TIME: + n += 8 + if st & PERF_SAMPLE_ADDR: + n += 8 + return n + return None + + +def record_sample_time_offset(ea): + # Get the offset (from start of payload) of the time field for a sample. + st = ea.sample_type + if st & PERF_SAMPLE_TIME: + n = 0 + if st & PERF_SAMPLE_IDENTIFIER: + n += 8 + if st & PERF_SAMPLE_IP: + n += 8 + if st & PERF_SAMPLE_TID: + n += 8 + return n + return None + + +_non_sample_trailing_sample_fields = PERF_SAMPLE_IDENTIFIER|PERF_SAMPLE_CPU|PERF_SAMPLE_STREAM_ID|PERF_SAMPLE_ID|PERF_SAMPLE_TIME|PERF_SAMPLE_TID + + +def non_sample_sample_type(ea): + if ea.sample_id_all: + return ea.sample_type & _non_sample_trailing_sample_fields + else: + return 0 + + +def non_sample_has_sample_fields(ea): + return non_sample_sample_type(ea) != 0 + + +class PerfRecord: + """ + Maps on to "struct perf_event" defined by the perf_event_open syscall ABI. + This is, basically, a record of an event. + The kernel puts a series of these in the ring buffer, + and "perf record" writes them into perf.data. + + As a Python object, this contains both + - the raw encoded binary data, in 'struct perf_event' format + - separate fields for each data item, as a result of unpacking the raw binary data + The caller must set the event_attr field so that the encoding + can be determined. + """ + def __init__(self, raw=None, type=None, event_attr=None, perf_version=0): + self._abi_errors = [] + self.raw = raw + self.perf_version = perf_version # If read from perf.data - for working around perf inject bugs + if raw is not None: + # it should be str/bytes (Python2) or bytes (Python3), or bytearray + assert type is None + (self.type, self.misc, self.size) = struct.unpack("IHH", raw[0:8]) + assert self.size == len(raw), "record size mismatch: given %u bytes but header says %u" % (len(raw), self.size) + else: + assert type is not None + self.type = type + self.misc = 0 + self.has_been_unpacked = False + if event_attr is not None: + assert isinstance(event_attr, PerfEventAttr) + self.event_attr = event_attr + self.reset() + + def note(self, s, sev=None): + """ + Note that something odd happened during decode. + """ + #print("%s" % s, file=sys.stderr) + if sev != "warning": + self._abi_errors.append(s) + + def time(self): + """ + Get the record's timestamp. If the record hasn't yet been fully unpacked, + get the timestamp as quickly as we can. + """ + if self.t is not None or self.has_been_unpacked: + return self.t + # Don't unpack the whole thing, just get the time as quickly as we can + if self.is_sample(): + off = record_sample_time_offset(self.event_attr) + if off is not None: + off = off + 8 # we got the offset in the payload, need it from the header + self.t = struct.unpack("Q", self.raw[off:off+8])[0] + elif self.is_kernel_type(): + off = record_non_sample_time_offset(self.event_attr) + if off is not None: + if off != -8: + td = self.raw[off:off+8] + else: + td = self.raw[-8:] + self.t = struct.unpack("Q", td)[0] + return self.t + + def data(self): + return self.raw[8:] + + def set_data(self, d): + self.size = 8 + len(d) + self.raw = struct.pack("IHH", self.type, self.misc, self.size) + d + assert self.size == len(self.raw) + + def is_sample(self): + return self.type == PERF_RECORD_SAMPLE + + def is_kernel_type(self): + """ + Return true if the record was of a type that the kernel creates and puts + in the mmap buffer, with a format defined by the kernel ABI (although + any given record might have been synthesized in userspace, e.g. the + synthetic MMAP records created by "perf record"). + """ + return self.type < _PERF_RECORD_MAX_FROM_KERNEL + + def __str__(self): + """ + Return a basic description of the record. + """ + s = "[0x%x]: %s%s" % (self.size, str_PERF_RECORD(self.type), self.payload_str()) + return s + + def payload_str(self): + """ + Return summary details of the record payload, as a string. + This isn't a substitute for the detailed description of "perf report -D". + """ + s = "" + if self.id is not None: + s += " id=%s" % self.id + if self.cpu is not None: + s += " cpu=%d" % self.cpu + if self.pid is not None: + s += " pid=%d" % self.pid + if self.tid is not None: + s += " tid=%d" % self.tid + if self.ip is not None: + s += " ip=0x%x" % self.ip + if self.has_been_unpacked: + if self.type in [PERF_RECORD_MMAP, PERF_RECORD_MMAP2]: + s += " %s @0x%x" % (self.filename, self.pgoff) + elif self.type == PERF_RECORD_COMM: + s += " '%s'" % (self.thread_name) + elif self.type == PERF_RECORD_AUX: + s += " offset=0x%x size=0x%x flags=0x%x" % (self.aux_offset, self.aux_size, self.flags) + elif self.type == PERF_RECORD_LOST: + s += " lost_id=%d n=%d" % (self.lost_id, self.lost_n) + elif self.type == PERF_RECORD_SWITCH_CPU_WIDE: + if (self.misc & PERF_RECORD_MISC_SWITCH_OUT) != 0: + s += " OUT next_pid=%d next_tid=%d" % (self.next_prev_pid, self.next_prev_tid) + else: + s += " IN prev_pid=%d prev_tid=%d" % (self.next_prev_pid, self.next_prev_tid) + else: + s += " " + return s + + def unpack_sample_id(self, d): + """ + When sample_id_all is set, fields such as TID/TIME/ID/STREAM_ID/CPU + (as selected by sample_type) can be included in non-SAMPLE records + as trailing fields. + Retrieve the fields, and strip it from the record data, + updating the record object fields and returning the remaining + record-type-specific payload. + Note that if PERF_SAMPLE_IDENTIFIER and PERF_SAMPLE_ID are set, + the identifier will appear twice. + """ + if self.event_attr is None: + assert False, "attempt to get trailing fields when attributes not set" + if not self.event_attr.sample_id_all: + # This record is associated with an event that doesn't have + # trailing fields. + return d + st = self.event_attr.sample_type + if st & PERF_SAMPLE_IDENTIFIER: + self.id = struct.unpack("Q", d[-8:])[0] + d = d[:-8] + if st & PERF_SAMPLE_CPU: + (self.cpu, res) = struct.unpack("II", d[-8:]) + d = d[:-8] + if st & PERF_SAMPLE_STREAM_ID: + self.stream_id = struct.unpack("Q", d[-8:])[0] + d = d[:-8] + if st & PERF_SAMPLE_ID: + self.id = struct.unpack("Q", d[-8:])[0] + #print("%s ASSIGNED ID : %s" % (self.type, self.id)) + d = d[:-8] + if st & PERF_SAMPLE_TIME: + self.t = struct.unpack("Q", d[-8:])[0] + d = d[:-8] + if st & PERF_SAMPLE_TID: + (self.pid, self.tid) = struct.unpack("ii", d[-8:]) + # Should we assign to self.pid and self.tid? + d = d[:-8] + return d + + def reset(self): + self.id = None + self.ip = None + self.pid = None + self.tid = None + self.addr = None + self.data_src = None + self.phys_addr = None + self.t = None + self.period = None + self.cpu = None + self.callchain = None + self.branch_stack = None + self.read = None + self.weight = None + self.stack_user = None + self.regs_user = None + self.regs_intr = None + + def string(self, d): + return trailing_string(d, check=self) + + def unpack(self): + """ + Unpack the encoded data in the perf record, setting appropriate + fields in the Python object. + + The event attributes tell us the format of sample records. + We will already have got the event attributes, either because we're + parsing the result of a specific mmap buffer, or because we've peeked into + the record and got the identifier at a known offset. + """ + if self.has_been_unpacked: + return self + assert self.event_attr is not None, "event attributes must be set before unpacking: %s" % self + self._abi_errors = [] + d = self.data() + if self.is_sample(): + """ + Process the fields in the sample. These occur in a defined order + and are present/absent depending on the PERF_SAMPLE flags. + See the section beginning "This record indicates a sample" + in the perf_event_open man page. + """ + st = self.event_attr.sample_type + if st & PERF_SAMPLE_IDENTIFIER: + # "This is a duplication of the PERF_SAMPLE_ID id value, + # but included at the beginning of the sample so parsers + # can easily obtain the value." + self.id = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_IDENTIFIER + d = d[8:] + if st & PERF_SAMPLE_IP: + self.ip = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_IP + d = d[8:] + if st & PERF_SAMPLE_TID: + (self.pid, self.tid) = struct.unpack("ii", d[:8]) + st &= ~PERF_SAMPLE_TID + d = d[8:] + if st & PERF_SAMPLE_TIME: + self.t = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_TIME + d = d[8:] + if st & PERF_SAMPLE_ADDR: + self.addr = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_ADDR + d = d[8:] + if st & PERF_SAMPLE_ID: + # Collective identifier for the event - parent of stream id + self.id = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_ID + d = d[8:] + if st & PERF_SAMPLE_STREAM_ID: + # Unique identifier for the event + self.stream_id = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_STREAM_ID + d = d[8:] + if st & PERF_SAMPLE_CPU: + (self.cpu, res) = struct.unpack("II", d[:8]) + st &= ~PERF_SAMPLE_CPU + d = d[8:] + if st & PERF_SAMPLE_PERIOD: + self.period = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_PERIOD + d = d[8:] + else: + if not self.event_attr.freq: + self.period = self.event_attr.sample_period + if st & PERF_SAMPLE_READ: + # "A structure of type read_format is included which + # has values for all events in the event group. + # The values included depend on the read_format + # value used at perf_event_open time." + self.read = ReadFormat(self.event_attr.read_format) + d = self.read.unpack(d) + st &= ~PERF_SAMPLE_READ + if st & PERF_SAMPLE_CALLCHAIN: + nr = struct.unpack("Q", d[:8])[0] + self.callchain = list(struct.unpack("Q"*nr, d[8:8+(nr*8)])) + st &= ~PERF_SAMPLE_CALLCHAIN + d = d[8+(nr*8):] + if st & PERF_SAMPLE_RAW: + size = struct.unpack("I", d[:4])[0] + self.sample_data = d[4:4+size] + st &= ~PERF_SAMPLE_RAW + d = d[4+size:] + if st & PERF_SAMPLE_BRANCH_STACK: + # This samples either an LBR sequence, or callchain information + bnr = struct.unpack("Q", d[:8])[0] + d = d[8:] + expect_hw_idx = (self.event_attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX) != 0 + if expect_hw_idx: + self.hw_idx = struct.unpack("q", d[:8])[0] + d = d[8:] + assert self.hw_idx <= bnr, "bad hw_idx field 0x%x, expected 0..%u" % (self.hw_idx, bnr) + elif bnr > 0 and struct.unpack("q", d[:8])[0] in [-1]: + # Around 2020, "perf inject" had a bug where it used the hw_idx + # field for synthetic samples (from PT or ETM) but didn't set HW_INDEX, + # so there's a spurious extra doubleword in the record. + # Speculatively work around that. The bug is specific to perf userspace. + # so ideally we'd only do it when decoding a perf.data file. + # The check on bnr avoids testing the field when we have an empty + # branch stack, as then we might be at the end of the sample record + # or be followed by unknown data. + # The failure mode is that we guess we have the extra doubleword, + # when it's actually the first branch source address. + # We try and defend against this by assuming that the dummy word will be + # 0xffffffffffffffff and that this is never a valid branch source address. + self.note("working around branch stack format bug", sev="warning") + d = d[8:] + self.hw_idx = None + else: + self.hw_idx = None + # Populate the branch_stack field in the returned record. This is in the + # order as it appears in the branch stack - i.e. most recent branch first, + # and possibly padded out to 32 (or whatever) number with "0->0" records. + self.branch_stack = [] + assert (bnr*24) <= len(d), "invalid branch stack count: %d needs %u bytes, only %u left (HW_INDEX=%u)" % (bnr, bnr*24, len(d), expect_hw_idx) + for i in range(0, bnr): + pbe = PerfBranchEntry() + (pbe.from_addr, pbe.to_addr, pbe.flags) = struct.unpack("QQQ", d[:24]) + pbe.mispred = bitbool(pbe.flags, 0) + pbe.predicted = bitbool(pbe.flags, 1) + pbe.in_tx = bitbool(pbe.flags, 2) + pbe.abort = bitbool(pbe.flags, 3) + pbe.cycles = bits(pbe.flags, 4, 16) + pbe.type = bits(pbe.flags, 20, 4) + self.branch_stack.append(pbe) + d = d[24:] + st &= ~PERF_SAMPLE_BRANCH_STACK + if st & PERF_SAMPLE_REGS_USER: + self.regs_user = PerfRegSample(self.event_attr.sample_regs_user) + d = self.regs_user.sample(d) + st &= ~PERF_SAMPLE_REGS_USER + if st & PERF_SAMPLE_STACK_USER: + size = struct.unpack("Q", d[:8])[0] + self.stack_offset = len(self.data()) - len(d) + 8 # remember offset in raw data + self.stack_user = d[8:8+size] + d = d[8+size:] + if size != 0: + dyn_size = struct.unpack("Q", d[:8])[0] + d = d[8:] + self.stack_dyn_size = dyn_size + else: + self.stack_dyn_size = 0 + st &= ~PERF_SAMPLE_STACK_USER + if st & PERF_SAMPLE_WEIGHT: + self.weight = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_WEIGHT + d = d[8:] + if st & PERF_SAMPLE_DATA_SRC: + self.data_src = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_DATA_SRC + d = d[8:] + if st & PERF_SAMPLE_TRANSACTION: + self.transaction = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_TRANSACTION + d = d[8:] + if st & PERF_SAMPLE_REGS_INTR: + self.regs_intr = PerfRegSample(self.event_attr.sample_regs_intr) + d = self.regs_intr.sample(d) + st &= ~PERF_SAMPLE_REGS_INTR + if st & PERF_SAMPLE_PHYS_ADDR: + self.phys_addr = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_PHYS_ADDR + d = d[8:] + if st & PERF_SAMPLE_CGROUP: + self.cgroup = struct.unpack("Q", d[:8])[0] + st &= ~PERF_SAMPLE_CGROUP + d = d[8:] + if st: + self.note("unconsumed sample_type bits: %s" % str_flags_PERF_SAMPLE(st)) + if d: + self.note("%u bytes unexpected data at end of %s sample" % (len(d), str_flags_PERF_SAMPLE(self.event_attr.sample_type))) + else: + # Record type other than PERF_RECORD_SAMPLE. + # This may be some other event record collected by the kernel perf subsystem and returned via mmap, + # or it may be a kernel-type record synthesized by "perf record", e.g. to provide initial memory mappings, + # or it may be a userspace-specific record used to provide additional metadata in perf.data. + if self.is_kernel_type() and non_sample_has_sample_fields(self.event_attr): + # Kernel-type records (whether synthetic or not) may be followed by trailing fields. + olen = len(d) + d = self.unpack_sample_id(d) + nlen = len(d) + assert nlen + record_trailing_bytes(self.event_attr) == olen + if self.type == PERF_RECORD_MMAP: + stuff = struct.unpack("iiQQQ", d[0:32]) + (self.pid, self.tid, self.addr, self.len, self.pgoff) = stuff + self.prot = 0x04 # PROT_EXEC; other flags unknown + self.flags = None + self.maj = None + self.min = None + self.filename = self.string(d[32:]) + elif self.type == PERF_RECORD_LOST: + (self.lost_id, self.lost_n) = struct.unpack("QQ", d) + elif self.type == PERF_RECORD_COMM: + (self.pid, self.tid) = struct.unpack("ii", d[0:8]) + self.thread_name = self.string(d[8:]) # max 16 chars: see TASK_COMM_LEN + elif self.type == PERF_RECORD_EXIT: + # the sample_id timestamp is preferred to the one in the record + stuff = struct.unpack("IIIIQ", d) + (self.pid, self.ppid, self.tid, self.ptid, ignore_time) = stuff + elif self.type == PERF_RECORD_THROTTLE: + (self.t, self.id, self.stream_id) = struct.unpack("QQQ", d) + elif self.type == PERF_RECORD_UNTHROTTLE: + (self.t, self.id, self.stream_id) = struct.unpack("QQQ", d) + elif self.type == PERF_RECORD_FORK: + # the sample_id timestamp is preferred to the one in the record + stuff = struct.unpack("IIIIQ", d) + (self.pid, self.ppid, self.tid, self.ptid, ignore_time) = stuff + elif self.type == PERF_RECORD_READ: + (self.pid, self.tid) = struct.unpack("ii", d[0:8]) + self.read = ReadFormat(self.event_attr.read_format) + d = self.read.unpack(d) + elif self.type == PERF_RECORD_SAMPLE: + assert False, "shouldn't reach here" + elif self.type == PERF_RECORD_MMAP2: + assert len(d) > 64, "missing filename" + stuff = struct.unpack("iiQQQIIQQII", d[0:64]) + (self.pid, self.tid, self.addr, self.len, self.pgoff, self.maj, self.min, self.ino, self.ino_generation, self.prot, self.flags) = stuff + self.filename = self.string(d[64:]) + elif self.type == PERF_RECORD_AUX: + # PERF_RECORD_AUX is generated by the kernel, to indicate that AUX data was produced. + (self.aux_offset, self.aux_size, self.flags) = struct.unpack("QQQ", d) + elif self.type == PERF_RECORD_ITRACE_START: + (self.pid, self.tid) = struct.unpack("II", d) + elif self.type == PERF_RECORD_LOST_SAMPLES: + self.lost_n = struct.unpack("Q", d)[0] + elif self.type == PERF_RECORD_SWITCH: + # PERF_RECORD_MISC_SWITCH_OUT applies here + pass + elif self.type == PERF_RECORD_SWITCH_CPU_WIDE: + stuff = struct.unpack("II", d) + (self.next_prev_pid, self.next_prev_tid) = stuff + elif self.type == PERF_RECORD_NAMESPACES: + (self.pid, self.tid, self.nr_namespaces) = struct.unpack("IIQ", d[:16]) + self.namespaces = [] + for i in range(0, self.nr_namespaces): + self.namespaces.append(struct.unpack("QQ", d[16+i*16:16+i*16+16])) + elif self.type == PERF_RECORD_KSYMBOL: + (self.addr, self.len, self.ksym_type, self.flags) = struct.unpack("QIHH", d[:16]) + self.name = self.string(d[16:]) + elif self.type == PERF_RECORD_BPF_EVENT: + (self.bpf_type, self.bpf_flags, self.bpf_id) = struct.unpack("HHI", d[:8]) + self.bpf_tag = d[8:16] + elif self.type == PERF_RECORD_CGROUP: + self.cgroup_id = struct.unpack("Q", d[:8])[0] + self.cgroup_name = self.string(d[8:]) + elif self.type == PERF_RECORD_TEXT_POKE: + (self.addr, self.old_len, self.new_len) = struct.unpack("QHH", d[:12]) + self.old_bytes = d[12:12+self.old_len] + self.new_bytes = d[12+self.old_len:12+self.old_len+self.new_len] + elif self.type < _PERF_RECORD_MAX_FROM_KERNEL: + # Unknown kernel (mmap buffer) record type to unpack. + # Maybe one added in a very recent kernel. + self.note("unknown kernel perf record type: %s" % str_PERF_RECORD(self.type)) + pass + else: + # unknown synthetic (perf.data) record type to unpack + pass + self.has_been_unpacked = True + return self diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_attr.py b/linux_app/pmu_app/pyperf/pyperf/perf_attr.py new file mode 100644 index 00000000..a3d1b483 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_attr.py @@ -0,0 +1,454 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Encapsulate the perf_event_attr structure used by the +perf_event_open syscall and in perf.data. + +Python descriptors are used to make the structure look like a +plain C struct but with validity checking on the fields. + +There are two ways to create a PerfEventAttr: + + - with raw data, e.g. as read from perf.data: + + attr = PerfEventAttr(raw) + if attr.type == PERF_TYPE_HARDWARE ... + + - with fields, to set up a new event: + + attr = PerfEventAttr(type=PERF_TYPE_HARDWARE, ...) + perf_event_open(attr._raw ...) +""" + +from __future__ import print_function + +from pyperf.perf_enum import * + +import struct, os, sys, types, copy + +from pyperf.hexdump import print_hex_dump + +perf_attr_size_default = 112 + + +class _FieldBase(object): + def __init__(self): + pass + + def __get__(self, obj, type=None): + if not obj._is_valid(self.ix): + return None + return self.get_value(obj) + + def __set__(self, obj, value): + if value is None: + obj._set_valid(self.ix, False) + else: + assert self.epos <= obj.size + self.set_value(obj, value) + obj._set_valid(self.ix, True) + + +class _Field(_FieldBase): + def __init__(self, fmt, pos): + self.pos = pos + self.ix = pos * 8 + self.fmt = fmt + self.epos = pos + struct.calcsize(fmt) + + def get_value(self, obj): + return struct.unpack(self.fmt, obj._raw[self.pos:self.epos])[0] + + def set_value(self, obj, value): + struct.pack_into(self.fmt, obj._raw, self.pos, value) + + +def setbitof(s, b, n, v): + mask = 1 << (n&7) + b = b + (n // 8) + s[b] = (s[b] & ~mask) | ((v&1) << (n&7)) + + +class _Bit(_FieldBase): + def __init__(self, pos, n): + self.pos = pos + self.ix = pos*8 + n + self.n = n + self.byte = (self.pos + (self.n >> 3)) + self.epos = self.byte + 1 + + def get_value(self, obj): + return (obj._raw[self.byte] >> (self.n&7)) & 1 + + def set_value(self, obj, value): + setbitof(obj._raw, self.pos, self.n, value) + + +class _Bits(_FieldBase): + def __init__(self, fmt, pos, n, b): + self.pos = pos + self.ix = pos*8 + n + self.n = n + self.b = b + self.fmt = fmt + self.epos = pos + struct.calcsize(fmt) + + def get_value(self, obj): + x = struct.unpack(self.fmt, obj._raw[self.pos:self.epos])[0] + return (x >> self.n) & ((1< 0: + self.misc |= PERF_RECORD_MISC_KERNEL + self.addr = p.data_address + self.phys_addr = p.phys_address + self.weight = p.total_latency() - p.issue_latency() + self.t = hw_time_to_kernel_time(p.timestamp) + ds = 0 + if p.op.is_access(): + if not p.op.is_store(): + ds |= (PERF_MEM_OP_LOAD << PERF_MEM_OP_SHIFT) + if p.data_source == 0: + ds |= ((PERF_MEM_LVL_HIT|PERF_MEM_LVL_L1) << PERF_MEM_LVL_SHIFT) + elif p.data_source == 8: + ds |= ((PERF_MEM_LVL_HIT|PERF_MEM_LVL_L2) << PERF_MEM_LVL_SHIFT) + elif p.data_source == 11: + ds |= ((PERF_MEM_LVL_HIT|PERF_MEM_LVL_L3) << PERF_MEM_LVL_SHIFT) + elif p.data_source == 13: + ds |= (PERF_MEM_REMOTE_REMOTE << PERF_MEM_REMOTE_SHIFT) + elif p.data_source == 14: + ds |= ((PERF_MEM_LVL_HIT|PERF_MEM_LVL_LOC_RAM) << PERF_MEM_LVL_SHIFT) + else: + print("UNKNOWN LEVEL: %u" % p.data_source) + else: + ds |= (PERF_MEM_OP_STORE << PERF_MEM_OP_SHIFT) + if p.op.subclass_bit(1): # atomic, exclusive etc. + if p.op.subclass_bit(2) or p.op.subclass_bit(3): + ds |= (PERF_MEM_LOCK_LOCKED << PERF_MEM_LOCK_SHIFT) + self.data_src = ds + + +def arm_spe_records(r): + """ + From an AUXTRACE record conaining ARM SPE data, yield a series of SPERecords that behave like samples. + """ + assert r.type == PERF_RECORD_AUXTRACE and r.auxtrace_info_type == PERF_AUXTRACE_ARM_SPE, "expected AUX with ARM SPE data" + for p in arm_spe.Decoder().records(bytearray(r.aux_data)): + if p.op.is_access() and p.is_retired(): + yield SPERecord(p, pid=r.pid, cpu=r.cpu) + + +class AuxTraceHandlerArmSPE(AuxTraceHandler): + def handle_auxtrace_info(self, pd, r): + r.pmu_type = struct.unpack("Q", r.raw[16:24])[0] + assert pd.pmu_names[r.pmu_type].startswith("arm_spe") + + def report_auxtrace_info(self, r, reporter): + fields = [ + ("PMU Type", "%d") + ] + reporter.print_auxinfo_fields(r, fields, 19) + + def report_auxtrace(self, r, reporter): + dec = arm_spe.Decoder() + if False: + # Compact: print one SPE sample per line + for sr in dec.records(r.aux_data): + print(". %s" % str(sr)) + else: + # perf report -D: print one SPE packet per line + pos = 0 + for sp in dec.decode(r.aux_data): + print(". %08x: " % pos, end="") + pktp = sp.raw + for b in pktp: + print(" %02x" % b, end="") + if len(pktp) < 16: + print(" " * (16-len(pktp)), end="") + print(" %s" % str(sp), end="") + print() + pos += len(pktp) + + +register_auxtrace_handler(PERF_AUXTRACE_ARM_SPE, AuxTraceHandlerArmSPE()) + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py b/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py new file mode 100644 index 00000000..febdabd2 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py @@ -0,0 +1,311 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Decode the PERF_RECORD_AUXTRACE_INFO data for CS_ETM +""" + +from __future__ import print_function + +import struct, os, sys +import pyperf.perf_util as utils +import pyperf.perf_data as perf_data + +cs_etm_enabled = False +if os.path.isdir("./csdecode"): + sys.path.append("./csdecode") # TBD: locate the CoreSight decoder + import cs_decode, cs_decode_etm, cs_viewer_raw, cs_viewer_ds5, cs_viewer_profile, imagemap + cs_etm_enabled = True + +MAGIC_ETM3 = 0x3030303030303030 +MAGIC_ETM4 = 0x4040404040404040 +MAGIC_ETM5 = 0x5050505050505050 + +ETM_MAGICS = [MAGIC_ETM3, MAGIC_ETM4, MAGIC_ETM5] + + +class AuxInfoETMCPU: + """ + Base class for ETM configuration information for a single CPU. + """ + def __init__(self, cpu, magic): + self.cpu = cpu + self.magic = magic + self.regs = {} + + def __getitem__(self, name): + return self.regs[name] + + def __setitem__(self, name, value): + self.regs[name] = value + + def __str__(self): + s = "CPU #%u: %s [%s]" % (self.cpu, self.etm_version_str(), ', '.join([("%s=0x%x" % (rn, self.regs[rn])) for rn in self.regnames])) + return s + + +class AuxInfoETMCPU3(AuxInfoETMCPU): + """ + ETM configuration for a CPU with ETM 3.x. + """ + def __init__(self, cpu): + AuxInfoETMCPU.__init__(self, cpu, MAGIC_ETM3) + self.regnames = ["ETMCR", "ETMTRACEIDR", "ETMCCER", "ETMIDR"] + self.etm_version = 3 + + def atid(self): + return self["ETMTRACEIDR"] & 0x7f + + def etm_version_str(self): + return "ETMv3" + + +class AuxInfoETMCPU4(AuxInfoETMCPU): + """ + ETM configuration for a CPU with ETM 4.x. + """ + def __init__(self, cpu): + AuxInfoETMCPU.__init__(self, cpu, MAGIC_ETM4) + self.regnames = ["TRCCONFIGR", "TRCTRACEIDR", "TRCIDR0", "TRCIDR1", "TRCIDR2", "TRCIDR8", "TRCAUTHSTATUS"] + self.etm_version = 4 + + def atid(self): + return self["TRCTRACEIDR"] & 0x7f + + def use_devarch(self): + return (self["TRCIDR1"] & 0xff0) == 0xff0 + + def is_unformatted(self): + # TBD: this is quite wrong. The metadata should indicate whether the data in the buffer is unformatted. + # However, for the time being, data from ETMv4 is formatted while data from future trace is unformatted, + # and we can use TRCIDR1's major/minor version fields being 0xFF as an indicator of future trace. + if self.use_devarch(): + return True + return False + + def etm_version_str(self): + if not self.use_devarch(): + s = "ETMv4.%u" % ((self["TRCIDR1"] & 0x0f0) >> 4) + else: + s = "ETM-future" + return s + + +class AuxInfoETECPU(AuxInfoETMCPU): + """ + ETM configuration for a CPU with ETE. + """ + def __init__(self, cpu): + AuxInfoETMCPU.__init__(self, cpu, MAGIC_ETM5) + self.regnames = ["TRCCONFIGR", "TRCTRACEIDR", "TRCIDR0", "TRCIDR1", "TRCIDR2", "TRCIDR8", "TRCAUTHSTATUS", "TRCDEVARCH"] + self.etm_version = 5 + + def atid(self): + # TBD: should we fault calling this, since trace is unformatted? + return self["TRCTRACEIDR"] & 0x7f + + def is_unformatted(self): + # TBD: assume ETE is not being collected in a shared trace buffer + return True + + def etm_version_str(self): + return "ETEv%.u" % (self["TRCDEVARCH"] & 0xf) + + +class AuxInfoETM: + """ + Describe a system-wide trace configuration - the ETM configuration for each CPU. + In a heterogeneous (big.LITTLE) system, different CPUs might have different ETM versions. + """ + def __init__(self, raw=None, verbose=0): + self.cpu = {} # Info indexed by CPU + self.id_info = {} # Info indexed by ATB trace id + self.verbose = verbose + if raw is not None: + self.init_from_auxtrace_info(raw) + else: + self.init_from_local() + + def add_info(self, cpu_info): + """ + Add the info for a single CPU. The CPU number is already set in the info object. + """ + assert isinstance(cpu_info, AuxInfoETMCPU) + cpu = cpu_info.cpu + assert cpu not in self.cpu, "duplicate CPU number: %s" % cpu + self.cpu[cpu] = cpu_info + self.id_info[cpu_info.atid()] = cpu_info + + def init_from_auxtrace_info(self, raw): + """ + Construct the ETM trace metadata from the payload of a PERF_RECORD_AUXTRACE_INFO record. + The format is: + 0000: type = 70 (PERF_RECORD_AUXTRACE_INFO) + 0006: record size + 0008: aux type = 3 (PERF_AUXTRACE_CS_ETM) + 0010: version + 0018: n_cpus + 001c: pmu type, as defined by the kernel + 0020: snapshot + 0028: first CPU metadata, starts with 'magic' indicator + """ + (self.version, self.n_cpus, self.pmu_type, self.snapshot) = struct.unpack("QIIQ", raw[16:40]) + if self.verbose: + print("ETM metadata:") + print(" version: %u" % self.version) + print(" cpus: %u" % self.n_cpus) + print(" PMU type: %u" % self.pmu_type) + print(" snapshot: 0x%x" % self.snapshot) + pos = 40 + for c in range(0, self.n_cpus): + magic = struct.unpack("Q", raw[pos:pos+8])[0] + cpu = struct.unpack("Q", raw[pos+8:pos+16])[0] + if self.verbose: + print(" CPU #%u" % cpu) + print(" magic: 0x%016x" % magic) + pos = pos + 16 + if magic == MAGIC_ETM3: + cpu_info = AuxInfoETMCPU3(cpu) + elif magic == MAGIC_ETM4: + cpu_info = AuxInfoETMCPU4(cpu) + elif magic == MAGIC_ETM5: + cpu_info = AuxInfoETECPU(cpu) + else: + # If we get this for other than the first CPU, we probably had the wrong number of registers + assert False, "unknown ETM version for CPU #%u: 0x%x" % (cpu, magic) + break # not safe to continue from here - don't know number of fields + if self.version == 1: + n_regs = struct.unpack("Q", raw[pos:pos+8])[0] + pos = pos + 8 + else: + n_regs = len(cpu_info.regnames) + for fname in cpu_info.regnames[:n_regs]: + cpu_info[fname] = struct.unpack("Q", raw[pos:pos+8])[0] + if self.verbose: + print(" %s = %016x" % (fname, cpu_info[fname])) + pos = pos + 8 + # Check for trailing unknown registers + while pos <= (len(raw)-8) and struct.unpack("Q", raw[pos:pos+8])[0] not in ETM_MAGICS: + print("ETM: CPU #%u: ignoring unknown register: 0x%016x" % (cpu, struct.unpack("Q", raw[pos:pos+8])[0]), file=sys.stderr) + pos = pos + 8 + self.add_info(cpu_info) + assert pos == len(raw), "unexpected length of AUXTRACE_INFO: raw data %u bytes, expected %u bytes" % (len(raw), pos) + + def init_from_local(self): + """ + Construct the ETM trace metadata from the local sysfs. + """ + sysfs = "/sys/bus/event_source/devices/cs_etm" + self.version = 0 + self.pmu_type = utils.file_int(sysfs + "/type") + self.snapshot = None + self.n_cpus = 0 + for d in os.listdir(sysfs): + if d.startswith("cpu"): + try: + cpu = int(d[3:]) + cdir = sysfs + "/" + d + self.n_cpus += 1 + if os.path.exists(cdir + "/trcidr/trcidr0"): + ci = AuxInfoETMCPU4(cpu) + else: + ci = AuxInfoETMCPU3(cpu) + for rn in ci.regnames: + rl = rn.lower() + rv = None + try: + rv = utils.file_hex(cdir + "/trcidr/" + rl) + except IOError: + if rl in ["trcconfigr", "trctraceidr"]: + rl = rl[:-1] + try: + rv = utils.file_hex(cdir + "/mgmt/" + rl) + except IOError: + print("can't get reg for %s" % rl) + ci.regs[rn] = rv + except Exception: + continue + self.add_info(ci) + + def iter_cpu(self): + for c in sorted(self.cpu.keys()): + yield self.cpu[c] + + def print(self): + print("ETM configuration (pmu_type=%d)" % self.pmu_type) + for ci in self.iter_cpu(): + print(" %s" % ci) + + +class AuxTraceHandlerCSETM(perf_data.AuxTraceHandler): + def handle_auxtrace_info(self, pd, r): + e = AuxInfoETM(r.raw) + pd.auxtrace_info_cs_etm = e + + def report_auxtrace_info(self, r, reporter): + def padtabs(s): + ntabs = (31 - len(s)) // 8 + return "\t" + s + ("\t"*ntabs) + " " + print("%s%u" % (padtabs("Header version"), e.version)) + print("%s%x" % (padtabs("PMU type/num cpus"), ((e.pmu_type << 32) | e.n_cpus))) + print("%s%x" % (padtabs("Snapshot"), e.snapshot)) + for cpu_info in e.iter_cpu(): + print("%s%x" % (padtabs("Magic number"), cpu_info.magic)) + print("%s%u" % (padtabs("CPU"), cpu_info.cpu)) + for fname in cpu_info.regnames: + print("%s%x" % (padtabs(fname), cpu_info[fname])) + + def report_auxtrace(self, r, reporter): + if not cs_etm_enabled: + return + decoders = {} + viewer = cs_viewer_raw.viewer() + cs_decode_etm.default_verbose = 0 + images = imagemap.imagemap() + cs_decode_etm.default_map = images + for cpu_info in p.auxtrace_info_cs_etm.iter_cpu(): + config = cs_decode_etm.etm_config(arch=cs_decode_etm.ARCH_ETM4) + for cr in cpu_info.regnames: + config.set_etmv4_reg(cr, cpu_info[cr]) + decoders[cpu_info.atid()] = cs_decode_etm.decode_etm(config, cpu_info.atid(), viewer=viewer) + cs_decode.buffer_decode(r.aux_data, decoders) + + +perf_data.register_auxtrace_handler(perf_data.PERF_AUXTRACE_CS_ETM, AuxTraceHandlerCSETM()) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="Manage ETM metadata in perf.data files") + parser.add_argument("-v", "--verbose", action="count", help="increase verbosity level") + parser.add_argument("-i", "--input", type=str, help="input perf.data file") + opts = parser.parse_args() + if opts.input: + import perf_data, hexdump + pd = perf_data.PerfData(opts.input) + for r in pd.records(): + if r.type == perf_data.PERF_RECORD_AUXTRACE_INFO: + if opts.verbose >= 2: + hexdump.print_hex_dump(r.raw, width=32, prefix=" ") + if r.auxtrace_info_type != perf_data.PERF_AUXTRACE_CS_ETM: + print("AUXTRACE_INFO is not ETM") + sys.exit() + auxinfo = AuxInfoETM(raw=r.raw, verbose=opts.verbose) + auxinfo.print() + else: + # Construct and show AuxInfo from the local sysfs + auxinfo = AuxInfoETM(verbose=opts.verbose) + auxinfo.print() + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py b/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py new file mode 100644 index 00000000..66726b2a --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py @@ -0,0 +1,396 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Manage the perf tool buildid cache in ~/.debug. + +This module doesn't deal directly with perf.data files. +""" + +from __future__ import print_function + +import os, sys, struct, subprocess, shutil + +import pyperf.elf as elf + + +def _home_dir(): + hd = os.path.expanduser("~") + assert os.path.isdir(hd), "missing home directory: %s" % hd + return hd + + +class BuildID(object): + """ + A unique 20-byte build id, possibly with a filename. + """ + def __init__(self, num, filename=None): + self.filename = filename + if isinstance(num, str): + # For Python2, this might be bytes(): a binary string or a text string. + if len(num) == 20: + self.id = _bytearray_int(bytearray(num)) + else: + self.id = int(num, 16) + elif isinstance(num, bytearray) or isinstance(num, bytes): + self.id = _bytearray_int(num) + elif isinstance(num, int) or isinstance(num, long): + self.id = num + else: + assert False, "invalid type '%s' for %s" % (type(num), num) + + def is_valid(self): + return self.filename is not None and self == file_buildid(self.filename) + + def __eq__(self, x): + return x is not None and self.id == x.id + + def __str__(self): + # The 40-character string + return "%040x" % self.id + + def index0(self): + return "%02x" % (self.id >> 152) + + def index1(self): + return str(self)[2:] + + def default(self, obj): + # Encode as JSON + return str(obj) + + +NT_GNU_BUILD_ID = 3 + +KALLSYMS = "[kernel.kallsyms]" + +def _bytearray_int(d): + n = 0 + if not isinstance(d, bytearray): + d = bytearray(d) + for x in d: + n = (n << 8) | x + return n + + +def kernel_buildid(): + """ + Get the build id from the current kernel. + """ + with open("/sys/kernel/notes", "rb") as f: + d = f.read() + # 32-bit fields even on 64-bit kernels + while d: + (namesz, descsz, type) = struct.unpack("III", d[0:12]) + if namesz == 4 and descsz == 20 and type == NT_GNU_BUILD_ID and d[12:15] == b"GNU": + id = _bytearray_int(d[16:36]) + return BuildID(id, filename=KALLSYMS) + d = d[12+namesz+descsz:] + return None + + +def file_buildid(fn): + """ + Get the build identifier for an ELF file. + + We can either invoke readelf, or read the file directly. + """ + if fn == KALLSYMS: + return kernel_buildid() + if not os.path.isfile(fn): + return None + try: + e = elf.ELF(fn) + bid = e.build_id() + if bid is not None: + return BuildID(bid, filename=fn) + except elf.NotELF: + # Unexpected... might be a perf.data where /bin/xxx is a binary, but on our system it's a script + #print("%s: not ELF" % fn, file=sys.stderr) + return None + except IOError: + print("%s: reading build id failed, trying readelf" % (fn), file=sys.stderr) + p = subprocess.Popen(["readelf", "-n", fn], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) + (out, err) = p.communicate() + if p.returncode == 0: + for ln in out.split('\n'): + if ln.startswith(" Build ID:"): + return BuildID(ln[14:54], filename=fn) + else: + print("%s: readelf failed" % (fn), file=sys.stderr) + return None + + +class BuildIDCacheRO(object): + """ + Read-only methods of the buildid cache. + """ + def __init__(self, dir=None): + if dir is None: + dir = os.path.join(_home_dir(), ".debug") + self.dir = dir + self.idx = os.path.join(self.dir, ".build-id") + + def __str__(self): + return "buildid cache in %s" % self.idx + + def __repr__(self): + return 'BuildIDCache("%s")' % self.dir + + def exists(self): + return os.path.exists(self.idx) + + def id_dir(self, id): + return os.path.join(self.idx, id.index0(), id.index1()) + + def id_files(self, id): + """ + Return the list of unqualified filenames cached for an id. Often ["elf"]. + """ + d = self.id_dir(id) + if os.path.isdir(d): + return list(os.listdir(d)) + else: + return None + + def id_file(self, id): + """ + Return the single unqualified filename for an id, if there is exactly one. + """ + files = self.id_files(id) + if files is not None and len(files) == 1: + return files[0] + return None + + def contains_id(self, id): + # Return true if the cache contains the given build id, i.e. the build id directory exists. + # We assume this directory contains a copy of the ELF file (usually, but not always, called "elf") + return os.path.exists(self.id_dir(id)) + + def contains_file(self, fn): + # Return true if the cache has a valid copy of the current version of a given file + assert os.path.exists(fn), "cache contains check needs file to be valid: %s" % fn + return self.contains_id(file_buildid(fn)) + + def id_cache_contents(self, id, name=None): + # Return the full name of a specific cached file for an id - usually "elf", "vdso" or "kallsyms" + if name is None: + name = self.id_file(id) + if name is None: + return None + d = os.path.join(self.id_dir(id), name) + if not os.path.isfile(d): + d = None + return d + + def id_matching_file(self, id, filename, name=None): + # Return the full name of a file that has the given build id. + # This is either a file in the cache (if cached) or on disk (if it has the correct build id) + d = self.id_cache_contents(id, name=name) + if d is None and filename is not None: + fid = file_buildid(filename) + if id == fid: + d = filename + return d + + def list(self): + # List the buildid cache contents, by id + if not self.exists(): + return + # List the top-level 2-digit buildid prefixes + for d0r in sorted(os.listdir(self.idx)): + d0 = os.path.join(self.idx, d0r) + for d1r in sorted(os.listdir(d0)): + d1 = os.path.join(d0, d1r) + bifn = os.readlink(d1) + # The link target is e.g. "../../bin/ls" meaning "~/.debug/bin/ls" + if bifn.startswith("../../"): + bifn = bifn[5:] + elif bifn.startswith(self.dir + os.sep): + bifn = bifn[len(self.dir):] + else: + assert False, "unexpected link target: %s" % bifn + fn = os.path.dirname(bifn) + if fn.startswith("/[") and fn.endswith("]"): + fn = fn[1:] # e.g. [kernel.kallsyms] or [vdso] + buildid = BuildID(os.path.basename(bifn), filename=fn) + yield buildid + + +class BuildIDCache(BuildIDCacheRO): + """ + A cached mapping of buildids to files, as stored in ~/.debug + """ + def __init__(self, dir=None): + BuildIDCacheRO.__init__(self, dir) + + def create(self): + if not self.exists(): + os.mkdir(self.dir) + os.mkdir(self.idx) + + def add_file(self, fn, force=False, verbose=False): + # To add an entry, we must find the build-id, add a path under .debug, + # copy the file to 'elf' and add a link in .build-id. + # The file might already be in cache, under the same or a different build id. + # Exceptionally, an entry for this build id might exist, but with different contents - + # e.g. stripped vs. non-stripped versions of a binary. + assert os.path.isfile(fn), "missing file: %s" % fn + fn = os.path.abspath(fn) + id = file_buildid(fn) + if self.contains_id(id): + if verbose: + print("cache already contains %s %s" % (fn, id)) + if not force: + return False + cp = self.dir + fn # not join: "~/.debug"+"/bin/ls" -> "~/.debug/bin/ls" + if not os.path.exists(cp): + os.makedirs(cp) + ci = os.path.join(cp, str(id)) + if not os.path.exists(ci): + os.mkdir(ci) # 'contains' check will likely mean this doesn't exist + elf = os.path.join(ci, "elf") + try: + shutil.copyfile(fn, elf) + except shutil.Error as e: + # SameFileError: already in the cache with identical contents + print("Couldn't copy file: %s" % (e), file=sys.stderr) + pass + # Make the symbolic link + d0 = os.path.join(self.idx, id.index0()) + if not os.path.exists(d0): + os.mkdir(d0) + d1 = os.path.join(d0, id.index1()) # The link name + ci = os.path.join("../.." + fn, str(id)) + if os.path.exists(d1): + # Unusual, but might happen if we force update, or replace a stripped binary + # with the non-stripped version of the same binary (same build id). + os.remove(d1) + os.symlink(ci, d1) + return True + + def remove_file(self, fn, force=False, verbose=False): + """ + Remove an entry with the buildid of the specified file. I.e. the real file exists, + we get its build-id, and we remove that build-id entry from the cache. + """ + # To remove an entry, we must remove the path under .debug and remove the link in .build-id. + assert os.path.isfile(fn), "missing file: %s" % fn + fn = os.path.abspath(fn) + id = file_buildid(fn) + if not self.contains_id(id): + if verbose: + print("cache does not contain %s %s" % (fn, id)) + if not force: + return False + cp = self.dir + fn # not join + ci = os.path.join(cp, str(id)) + # remove the link + d1 = os.path.join(self.idx, id.index0(), id.index1()) + if os.path.exists(d1): + assert os.path.islink(d1), "expected symbolic link: %s" % d1 + assert d1.startswith(self.dir) + os.remove(d1) + # remove the id-specific subdirectory under the filename path + if os.path.exists(ci): + assert ci.startswith(self.dir) + shutil.rmtree(ci) + # This may leave the bare name e.g. "~/.debug/bin/ls" with no ids. + return True + + def purge_file(self, fn, verbose=False): + # Remove all cached files of a given name. + n = 0 + fn = os.path.abspath(fn) + cp = self.dir + fn # not join + if not os.path.exists(cp): + if verbose: + print("cache does not contain any %s" % (fn)) + return 0 + for id in os.listdir(cp): + ci = os.path.join(cp, id) + ix0 = id[0:2] + ix1 = id[2:40] + d1 = os.path.join(self.idx, ix0, ix1) + if verbose: + print("removing %s %s" % (fn, id)) + assert os.path.islink(d1), "expected symbolic link: %s" % d1 + assert d1.startswith(self.dir) + os.remove(d1) + n += 1 + assert cp.startswith(self.dir) + shutil.rmtree(cp) + return n + + def clear(self): + # Clear the entire cache. + shutil.rmtree(self.dir) + + +def self_test(): + kb = kernel_buildid() + print("Kernel build id: %s" % kb) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="build-id cache") + parser.add_argument("--list", "-l", action="store_true", help="list valid entries in cache") + parser.add_argument("--list-all", action="store_true", help="list all entries in cache") + parser.add_argument("--add", "-a", type=str, help="add file to cache") + parser.add_argument("--remove", "-r", type=str, help="remove current cached copy of file") + parser.add_argument("--update", "-u", type=str, help="update copy of file") + parser.add_argument("--purge", "-p", type=str, help="purge files by name") + parser.add_argument("--purge-all", "-P", action="store_true", help="purge all files") + parser.add_argument("--force", action="store_true", help="force add even if in index") + parser.add_argument("--home", type=str, default=None, help="location of buildid cache") + parser.add_argument("--verbose", "-v", action="store_true", help="print helpful messages") + parser.add_argument("--test", action="store_true", help="run self-tests") + opts = parser.parse_args() + B = BuildIDCache(opts.home) + if opts.test: + self_test() + if opts.list or opts.list_all: + B = BuildIDCacheRO(opts.home) + if not B.exists(): + print("%s: buildid cache does not exist" % B.idx) + n_invalid = 0 + for id in B.list(): + is_valid = id.is_valid() + if not is_valid: + n_invalid += 1 + if is_valid or opts.list_all: + print("%s %s" % (id, id.filename), end="") + if not is_valid: + print(" (invalid)", end="") + #print(" %s" % str(B.id_files(id)), end="") + print() + elif opts.verbose: + print("%s %s != %s" % (id, id.filename, file_buildid(id.filename))) + if n_invalid > 0 and not opts.list_all: + print("%s: %u invalid entries not shown; use --list-all to list" % (B.idx, n_invalid)) + elif opts.add: + B.add_file(opts.add, force=opts.force, verbose=opts.verbose) + elif opts.update: + # Unclear how this differs from --add --force + # See https://lore.kernel.org/lkml/20150211145742.GI24251@kernel.org/ + B.add_file(opts.add, force=True, verbose=opts.verbose) + elif opts.remove: + B.remove_file(opts.remove, force=opts.force, verbose=opts.verbose) + elif opts.purge: + B.purge_file(opts.purge, verbose=opts.verbose) + elif opts.purge_all: + B.clear() + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_data.py b/linux_app/pmu_app/pyperf/pyperf/perf_data.py new file mode 100644 index 00000000..2162fd3d --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_data.py @@ -0,0 +1,1576 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Parse perf.data file. + +perf.data is created by "perf record". Much (but not all) of the format is +determined by the records returned from the perf_event_open syscall, +and which we manage in the perf_abi module. + +This module defines a PerfData object that enscapsulates the various structures +within perf.data. +""" + +from __future__ import print_function + +from pyperf.perf_enum import * +from pyperf.perf_attr import * +from pyperf.perf_abi import * +import pyperf.perf_buildid as perf_buildid + +from pyperf.hexdump import print_hex_dump +import pyperf.datamap as datamap + +import os, sys, struct, time, copy, platform + + +PERF_MAGIC = struct.unpack("Q", b"PERFILE2")[0] + + +# perf.data begins with a set of headers. +# We believe there is at most one header for a given type. +# These aren't enumerated in a public header. See tools/perf/util.h. +HEADER_TRACING_DATA = 1 +HEADER_BUILD_ID = 2 +HEADER_HOSTNAME = 3 +HEADER_OSRELEASE = 4 +HEADER_VERSION = 5 +HEADER_ARCH = 6 +HEADER_NRCPUS = 7 +HEADER_CPUDESC = 8 +HEADER_CPUID = 9 +HEADER_TOTAL_MEM = 10 +HEADER_CMDLINE = 11 +HEADER_EVENT_DESC = 12 +HEADER_CPU_TOPOLOGY = 13 +HEADER_NUMA_TOPOLOGY = 14 +HEADER_BRANCH_STACK = 15 +HEADER_PMU_MAPPINGS = 16 +HEADER_GROUP_DESC = 17 +HEADER_AUXTRACE = 18 +HEADER_STAT = 19 +HEADER_CACHE = 20 +HEADER_SAMPLE_TIME = 21 +HEADER_MEM_TOPOLOGY = 22 +HEADER_CLOCKID = 23 +HEADER_DIR_FORMAT = 24 +HEADER_BPF_PROG_INFO = 25 +HEADER_BPF_BTF = 26 +HEADER_COMPRESSED = 27 +HEADER_CPU_PMU_CAPS = 28 +HEADER_CLOCK_DATA = 29 + +HEADER_MAX = 128 + + +# After the headers, perf.data has records, generally collected from perf_event_open. +# Record types are indicated in the record header. +# The following special (synthetic) PERF_RECORD types are used only in perf.data. +FIRST_SYNTHETIC_PERF_RECORD = 64 +PERF_RECORD_HEADER_ATTR = 64 +PERF_RECORD_HEADER_EVENT_TYPE = 65 +PERF_RECORD_HEADER_TRACING_DATA = 66 +PERF_RECORD_HEADER_BUILD_ID = 67 +PERF_RECORD_FINISHED_ROUND = 68 +PERF_RECORD_ID_INDEX = 69 +PERF_RECORD_AUXTRACE_INFO = 70 +PERF_RECORD_AUXTRACE = 71 +PERF_RECORD_AUXTRACE_ERROR = 72 +PERF_RECORD_THREAD_MAP = 73 +PERF_RECORD_CPU_MAP = 74 +PERF_RECORD_STAT_CONFIG = 75 +PERF_RECORD_STAT = 76 +PERF_RECORD_STAT_ROUND = 77 +PERF_RECORD_EVENT_UPDATE = 78 +PERF_RECORD_TIME_CONV = 79 +PERF_RECORD_HEADER_FEATURE = 80 # subheaders when streaming +PERF_RECORD_COMPRESSED = 81 + +PERF_RECORD_MAX = 82 + + +# Compression types +PERF_COMP_NONE = 0 +PERF_COMP_ZSTD = 1 # Zstd - when libstd-dev is present + + +# Type field of synthetic PERF_RECORD_AUXTRACE_INFO +PERF_AUXTRACE_UNKNOWN = 0 # Unknown trace format +PERF_AUXTRACE_INTEL_PT = 1 # Processor Trace +PERF_AUXTRACE_INTEL_BTS = 2 # Branch Trace Store (not generally used) +PERF_AUXTRACE_CS_ETM = 3 # Arm CoreSight ETM trace +PERF_AUXTRACE_ARM_SPE = 4 # Arm Statistical Profiling Extension +PERF_AUXTRACE_S390_CPUMSF = 5 # S/390 Measurement Sampling Facility + + +class AuxTraceHandler: + def __init__(self): + pass + + def handle_auxtrace_info(self, perf_data, rec): + pass + + def report_auxtrace_info(self, rec, reporter): + pass + + def report_auxtrace(self, rec, reporter): + pass + + +auxtrace_handlers = {} # indexed by PERF_AUXTRACE... + +def register_auxtrace_handler(auxtype, handler): + auxtrace_handlers[auxtype] = handler + + +STROF_HEADER = {} +PERF_DATA_RECORD = {} +for s in list(globals()): + if s.startswith("HEADER_") and s != "HEADER_MAX": + STROF_HEADER[globals()[s]] = s + if s.startswith("PERF_RECORD_") and s != "PERF_RECORD_MAX": + PERF_DATA_RECORD[globals()[s]] = s + + +def record_type_str(type, short=False): + if type < FIRST_SYNTHETIC_PERF_RECORD: + rname = str_PERF_RECORD(type, short=False) + elif type in PERF_DATA_RECORD: + rname = PERF_DATA_RECORD[type] + else: + rname = "PERF_RECORD_%u??" % type + if short: + rname = rname[12:] + return rname + + +assert record_type_str(1) == "PERF_RECORD_MMAP" +assert record_type_str(71) == "PERF_RECORD_AUXTRACE" + + +def clean_str(s): + # Strings in perf.data may be padded, with the size including the padding. + # But sometimes the padding appears to include junk (see strings in + # HEADER_BUILD_ID for example). + # Given something like "hello\0junk\0\0\0" return "hello". + ix = s.find(b'\0') + if ix >= 0: + s = s[:ix] + return s.decode() + + +def header_type_name(n, short=False): + if n in STROF_HEADER: + s = STROF_HEADER[n] + else: + s = "HEADER_%u" % n + if short: + s = s[7:] + return s + + +def header_from_string(s): + s = s.encode() + b'\0' + while (len(s) % 4) != 0: + s += b'\0' + n = len(s) + return struct.pack("I", n) + s + + +def perf_header_string(d): + # return a string and the remaining data + len = struct.unpack("I", d[0:4])[0] + s = clean_str(d[4:4+len]) + return (s, d[4+len:]) + + +def perf_header_string_only(d): + (s, d) = perf_header_string(d) + assert not d + return s + + +def perf_header_string_list(d): + argc = struct.unpack("I", d[0:4])[0] + argv = [] + d = d[4:] + for i in range(0, argc): + (s, d) = perf_header_string(d) + argv.append(s) + return (argv, d) + +def header_from_string_list(sl): + b = struct.pack("I", len(sl)) + for arg in sl: + b += header_from_string(arg) + return b + + +class PerfFileSection: + """ + PerfFileSection is a contiguous area within a perf.data file. + It may be one of the headers, or some other kind of section. + A section descriptor is a pair of doublewords, outside the section itself, + that locates the section. + Three sections are described in the header: + - an array of perf_event_attr's + - the section containing all the data records + - event types + """ + def __init__(self, perf_data, descriptor_offset=None, data=None): + assert isinstance(perf_data, PerfData) + self.descriptor_offset = descriptor_offset + self.perf_data = perf_data # owning object + self.cached_data = data + + def read_descriptor(self): + h = self.perf_data.readat(self.descriptor_offset, 16) + (self.offset, self.size) = struct.unpack("QQ", h) + return self + + def write_descriptor(self): + desc = struct.pack("QQ", self.offset, self.size) + self.perf_data.writeat(self.descriptor_offset, desc) + + def data(self): + if self.cached_data is None: + self.read_descriptor() + self.cached_data = self.perf_data.readat(self.offset, self.size) + return self.cached_data + + def write(self, offset): + assert self.cached_data is not None + self.offset = offset + self.size = len(self.cached_data) + self.write_descriptor() + self.perf_data.writeat(offset, self.cached_data) + return offset + self.size + + def end_offset(self): + return self.offset + self.size + + def set_data(self, data): + self.cached_data = data + return self + + def REMOVETHISstring(self): + # return contents as a string - only valid for some header types (not checked here) + s = perf_header_string(self.data())[0] + return s + + def __str__(self): + return "[0x%x..0x%x] (%u bytes)" % (self.offset, self.offset+self.size, self.size) + + +class PerfDataEventDesc: + """ + An event description, as recorded in a perf.data file. + Generally this will correspond to several perf_event_open events, + one per CPU, perhaps one per thread. + """ + def __init__(self, attr=None, name=None, ids=None, index=None): + self.index = index # descriptor index in this perf.data file, e.g. 0, 1, etc. + self.ids = ids # array of event identifiers for the perf_event_open events (e.g. one per CPU) + self.name = name # descriptive name, as recorded in perf.data + self.attr = attr # PerfEventAttr object + + def id_index(self, id): + # Go from an event identifier that's unique in this perf session (across all event types), + # to a zero-based event index within this descriptor. + # E.g. if the event has ids [140,141,142] then id=141 gives us index=1. + if self.ids is not None: + return self.ids.index(id) + else: + return id # TBD: assume it's zero-based + + def __str__(self): + if self.name is not None: + namestr = self.name + else: + namestr = "" + s = "#%u: %s %s" % (self.index, namestr, self.attr) + if self.ids is not None: + s += " (%u ids)" % (len(self.ids)) + else: + s += " (no ids!)" + return s + + +class PerfDataRecord(PerfRecord): + """ + A record read in a perf.data file. This is a superset of the + type of records found in a perf_event_open mmap buffer. + """ + def __init__(self, *x, **k): + self.file = k["file"] + del k["file"] + if "file_offset" in k: + self.file_offset = k["file_offset"] + del k["file_offset"] + else: + # from a PERF_RECORD_COMPRESSED? + self.file_offset = None + PerfRecord.__init__(self, *x, **k) + + def __str__(self): + if self.file_offset is not None: + s = "@0x%x" % (self.file_offset) + else: + s = "@?" + return s + " " + record_type_str(self.type) + " " + self.payload_str() + + def payload_str(self): + if self.type == PERF_RECORD_AUXTRACE: + return "idx=%u offset=0x%x size=0x%x" % (self.idx, self.auxtrace_offset, self.auxtrace_size) + else: + return PerfRecord.payload_str(self) + + def is_aux(self, typ=None): + return self.type == PERF_RECORD_AUXTRACE and (typ is None or self.auxtrace_info_type == typ) + + def aux_data_segment(self): + # A PERF_RECORD_AUX record is generated by the kernel and describes a segment of data in an AUX buffer. + # Retrieve the actual data. + assert self.type == PERF_RECORD_AUX + self.unpack() + if self.aux_size == 0: + # Seen from the kernel; perf will not create an AUXTRACE record in this case + return b"" + for r in self.file.auxtrace_buffers(idx=self.idx): + if self.aux_offset >= r.auxtrace_offset and (self.aux_offset+self.aux_size) <= (r.auxtrace_offset+r.auxtrace_size): + self.aux_data = self.file.readat(r.auxtrace_file_offset+(self.aux_offset-r.auxtrace_offset), self.aux_size) + return self.aux_data + assert False, "can't find AUXTRACE buffer for AUX: %s" % self + + def aux_data_segments(self): + # For an AUXTRACE record, return the buffer segments as described by PERF_RECORD_AUX records. + # There may be multiple segments for a single AUXTRACE buffer. + # We return them as tuples: + # (PERF_RECORD_AUX record, data) + assert False, "don't call this function, it's broken" + assert self.is_aux() and self.aux_data is not None, "AUXTRACE data is not available" + for ar in self.aux_records: + offset_in_buffer = ar.aux_offset - self.auxtrace_offset + assert 0 <= offset_in_buffer and (offset_in_buffer+ar.aux_size) <= self.auxtrace_size, "%s: bad AUX offset: 0x%x+%x in %x..%x" % (ar, ar.aux_offset, ar.aux_size, self.auxtrace_offset, self.auxtrace_offset+self.auxtrace_size) + if False: + print("offset: %x..%x" % (offset_in_buffer, offset_in_buffer+ar.aux_size)) + data = self.aux_data[offset_in_buffer:offset_in_buffer+ar.aux_size] + yield (ar, data) + + +class PerfData: + """ + A PerfData object represents the contents of a perf.data file. + + perf.data consists of + - a header (about 200 bytes) + - a section describing the events in the data + - a data section, which can be huge + - sub-headers describing the data and environment + The format supports reading the data as a stream, e.g. "perf record | perf report". + So the data is not dependent on the headers. + """ + def __init__(self, fn=None, fd=None, debug=False, buildid_cache=""): + self.file_is_valid = False + self.fn = fn + self.perf_data_version = None + self.set_buildid_cache(buildid_cache) + self.f = fd + self.debug = debug # print helpful diagnostics when reading + self.header_section = {} # Header type -> PerfFileSection + self.section_data = None + self.flags = 0 + self.compression_type = PERF_COMP_NONE + self.attr_entry_size = None + self.pmu_names = {} # type -> name + self.pmu_types = {} # name -> type + self.default_event_attr = None + self.event_index = {} # event id (per cpu) to event number + self.event_attrs = [] # PerfEventAttr, by event number + self.event_descs = [] # event descriptors, by event number + self.aux_event = None # PerfDataEventDesc for the event owning AUX records + self.build_id_map = {} # (pid, filename) -> build id + self.kcore_dir = None + self.auxtrace_info_type = None + self.auxtrace_buffer_cache = None + # Map the section descriptors. This doesn't read the actual descriptors. + self.section_attr = PerfFileSection(self, 24) # Section containing some number of perf_event_attr's + self.section_data = PerfFileSection(self, 40) + self.section_event_types = PerfFileSection(self, 56) + if fn is not None: + self.open_and_read_header(fn) + + def open_and_read_header(self, fn): + self.datamap = datamap.DataMap() + if fn == "-": + if self.f is None: + self.f = sys.stdin + self.is_pipe_mode = True + self.file_size = None + self.datatop = None + else: + assert self.f is None + if os.path.isdir(fn): + # It's a directory containing "data" and "kcore_dir/{kcore,kallsyms,modules}" + self.kcore_dir = os.path.join(fn,"kcore_dir") + assert os.path.isdir(self.kcore_dir), "%s: expected kcore_dir subdirectory" % fn + fn = os.path.join(fn,"data") + self.f = open(fn, "rb") + self.is_pipe_mode = False + self.file_size = os.path.getsize(fn) + self.datatop = self.datamap.add(0, self.file_size, fn) + self.fn = fn + self.is_writing = False + if self.debug: + print("perf.data in %s..." % self.fn) + h = self.f.read(16) + assert len(h) >= 16, "%s: file is empty" % fn + (magic, hsize) = struct.unpack("QQ", h) + # TBD: opposite endianness + assert magic == PERF_MAGIC, "%s: header magic is 0x%x, expected 0x%x" % (fn, magic, PERF_MAGIC) + if self.debug: + print(" header size 0x%x" % hsize) # typically 104 bytes for perf.data on disk + # when reading stream data, we get an empty (16-byte) header, + # and other information is communicated via records. + if hsize == 16: + self.file_is_valid = True # valid because it's legitimate in pipe reading mode + return + h = h + self.f.read(hsize-16) + self.datamap.add(0, hsize, "header") + # Size of an entry in the attribute section: 'struct perf_event_attr' plus 16-byte descriptor for the ids. + self.attr_entry_size = struct.unpack("Q", h[16:24])[0] + self.section_attr.read_descriptor() + if (self.section_attr.size % self.attr_entry_size) != 0: + print("%s: attribute section %s is not a multiple of attribute size %u" % (self.fn, self.section_attr, self.attr_entry_size), file=sys.stderr) + self.section_data.read_descriptor() + if self.section_data.size == 0: + print("%s: data section has size zero; capture session may have been improperly terminated" % (self.fn), file=sys.stderr) + if self.section_attr.offset <= self.section_data.offset and self.section_attr.end_offset() > self.section_data.offset: + print("%s: attribute section %s overlaps data section %s" % (self.fn, self.section_attr, self.section_data), file=sys.stderr) + self.section_event_types.read_descriptor() + self.datamap.add(self.section_attr.offset, self.section_attr.size, "attr (%u-byte entries)" % (self.attr_entry_size)) + self.datamap.add(self.section_data.offset, self.section_data.size, "data") + self.datamap.add(self.section_event_types.offset, self.section_event_types.size, "events") + # TBD there might be more than 2 flags doublewords + (flags, flags1a) = struct.unpack("QQ", h[72:88]) + self.flags = flags | (flags1a << 64) + self.n_events = 0 + if self.debug: + print(" attr: %s (attr entry size %u)" % (self.section_attr, self.attr_entry_size)) + print(" data: %s" % self.section_data) + print(" event_types: %s" % self.section_event_types) + print(" flags: 0x%x" % self.flags) + print(" headers:", end="") + for i in range(0, 128): + if self.has_header(i): + print(" %s" % header_type_name(i, short=True), end="") + print() + if (self.header_descriptor_offset() + (self.n_headers()*16)) > self.file_size: + print("%s: header descriptors incompletely written, cannot read file" % (self.fn), file=sys.stderr) + return + # Read all the headers, populating various metadata about this perf capture. + # HEADER_EVENT_DESC is the standard way of describing events. + for (type, hsect) in self.headers(): + self.header_section[type] = hsect + self.process_header(type, hsect.data()) + for (pid, buildid, filename) in self.build_ids(): + self.build_id_map[(pid, filename)] = buildid + if False: + print("Build id map:") + for (pid, filename) in self.build_id_map.keys(): + print(" %-30s %5d %s" % (self.build_id_map[(pid, filename)], pid, filename)) + sys.exit() + for (name, type) in self.pmu_mappings(): + self.pmu_names[type] = name + self.pmu_types[name] = type + if self.section_attr.size > 0: + # older way of specifying events + assert (self.section_attr.size % self.attr_entry_size) == 0, "unexpected attribute section size %u for %u-byte attribute entries" % (self.section_attr.size, self.attr_entry_size) + attr_n_events = self.section_attr.size // self.attr_entry_size + if self.debug: + print("%s: attributes section has %u events" % (self.fn, attr_n_events), file=sys.stderr) + already_got_events = (self.n_events > 0) + if already_got_events: + if self.debug: + print("%s: already got %u events from HEADER_EVENT_DESC" % (self.fn, self.n_events), file=sys.stderr) + if False and already_got_events: + # already had some events from a header + assert self.n_events == attr_n_events, "mismatch in number of events: %u vs. %u" % (self.n_events, attr_n_events) + if False: + print("already got %u events:" % self.n_events, file=sys.stderr) + for ed in self.event_descs: + print(" %s" % ed.attr, file=sys.stderr) + attr_data = self.section_attr.data() + pos = 0 + for i in range(0, attr_n_events): + this_attr_size = struct.unpack("I", attr_data[pos+4:pos+8])[0] + assert this_attr_size >= 32 and this_attr_size < 256, "invalid attribute size: %u" % this_attr_size + ea_raw = attr_data[pos:pos+this_attr_size] + ea = PerfEventAttr(ea_raw) + if (ea.size + 16) != self.attr_entry_size: + print("%s: mismatch in attribute size: attribute entries are %u (%u-byte descriptors) but %u-byte attribute in section" % (self.fn, self.attr_entry_size, self.attr_entry_size-16, ea.size), file=sys.stderr) + # regardless of the size in the structure, the spacing is set by the global size - + # either the one from the perf.data header, or the one from the HEADER_EVENT_DESC header. + pos = pos + (self.attr_entry_size - 16) + if not already_got_events: + self.add_event(ea, ids=None) + else: + if ea != self.event_attrs[i]: + print("%s: event descriptor #%u: mismatch between attributes section and HEADER_EVENT_DESC:\n %s\nvs.\n %s" % (self.fn, i, ea, self.event_attrs[i]), file=sys.stderr) + (idso, idss) = struct.unpack("QQ", attr_data[pos:pos+16]) + self.datamap.add(idso, idss, "ids for event #%u" % i) + pos = pos + 16 # skip the ids + if self.debug: + print(" events:") + for evd in self.events(): + print(" %s" % evd.attr) + self.file_is_valid = True + + def is_valid(self): + return self.file_is_valid + + def is_compressed(self): + return self.compression_type != PERF_COMP_NONE + + def open_and_write_header(self, fn): + assert self.f is None + self.fn = fn + if fn == "-": + self.f = sys.stdout + self.is_pipe_mode = True + else: + self.f = open(fn, "wb") + self.is_pipe_mode = False + self.is_writing = True + self.update_environment_headers() + # TBD: write header and event description, then leave file position for user to write records + # into the data section. Sub-headers are written at the end. + self.write_headers_at_end = not self.is_pipe_mode + #self.write_headers_at_end = False + self.need_to_write_headers = self.write_headers_at_end + if self.is_pipe_mode: + # Write a minimal header followed by FEATURE records + self.f.write(struct.pack("QQ", PERF_MAGIC, 16)) + else: + # Write a full header, followed by the event section + if self.attr_entry_size is None: + self.attr_entry_size = perf_attr_size_default + 16 + flags = 0 + if self.write_headers_at_end: + for i in range(0, 128): + if i in self.header_section: + flags |= (1 << i) + flags1a = flags >> 64 + flags = flags & 0xffffffffffffffff + # descriptors will be updated when sections are written + h = struct.pack("QQQQQQQQQQQ", self.attr_entry_size, 0, 0, 0, 0, 0, 0, flags, flags1a, 0, 0) + self.f.write(struct.pack("QQ", PERF_MAGIC, len(h)+16) + h) + offset = self.f.tell() + attrs = b'' + for evd in self.event_descs: + attrs += evd.attr.encode() + self.section_attr.set_data(attrs) + offset = self.section_attr.write(offset) + self.section_data.offset = offset + self.section_data.size = 0 # will be updated as we write records + self.seek(offset) + if not self.write_headers_at_end: + self.write_headers_as_records() + else: + # let the caller write some records, then on close() we will write the headers + pass + + def write_headers_as_records(self): + assert self.is_writing + for ht in self.header_section: + r = PerfRecord(type=PERF_RECORD_HEADER_FEATURE) + r.set_data(struct.pack("Q", ht) + self.header_section[ht].data()) + self.write_record(r) + self.need_to_write_headers = False + + def close(self): + if self.f is None: + return + if self.is_writing: + offset = self.f.tell() + if not self.is_pipe_mode: + # Update the data size. We only do this in non-pipe mode, when we are + # following the data section with subheaders. + self.section_data.write_descriptor() + self.seek(offset) + if self.need_to_write_headers: + # Write subheaders after data, if not already written as FEATURE records. + # We only do this in non-pipe mode. + # It is assumed the current file position is after the most recent record. + # We write an array of section descriptors, one per header. + # Each section descriptor describes a header. + dummy_descriptor = struct.pack("QQ", 0, 0) + for i in range(0, HEADER_MAX): + if i in self.header_section: + self.header_section[i].descriptor_offset = offset + self.f.write(dummy_descriptor) + offset += 16 + for i in range(0, HEADER_MAX): + if i in self.header_section: + offset = self.header_section[i].write(offset) + self.f.close() + self.f = None + self.fn = None + self.is_writing = None + + def write_record(self, r): + assert isinstance(r, PerfRecord) + assert self.is_writing + self.f.write(r.raw) + self.section_data.size += r.size + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + def __del__(self): + self.close() + + def update_environment_headers(self): + """ + Populate the headers, e.g. HEADER_HOSTNAME, HEADER_ARCH etc. + """ + self.header_section[HEADER_HOSTNAME] = PerfFileSection(self, data=header_from_string(platform.node())) + self.header_section[HEADER_ARCH] = PerfFileSection(self, data=header_from_string(platform.machine())) + self.header_section[HEADER_OSRELEASE] = PerfFileSection(self, data=header_from_string(platform.release())) + self.header_section[HEADER_CMDLINE] = PerfFileSection(self, data=header_from_string_list(sys.argv)) + + def set_buildid_cache(self, buildid_cache): + """ + Set the buildid cache to be used for looking up build ids that occur in this file. + It can be passed in either as a BuildIDCache object, or as a string ("" means use the default in ~/.debug). + Buildid lookup happens in two stages: + - the pid/filename combination in an MMAP record is looked up in the buildid table from PERF_HEADER_BUILD_ID + - the resulting buildid is looked up in the buildid cache that we set here. + """ + if buildid_cache is None: + pass # Operate without a buildid cache + elif isinstance(buildid_cache, perf_buildid.BuildIDCache): + pass # Caller has already constructed the cache + elif buildid_cache == "": + buildid_cache = perf_buildid.BuildIDCache() # use our home directory on this system + else: + # Assume we've been passed a directory name, so construct the buildid cache + buildid_cache = perf_buildid.BuildIDCache(buildid_cache) + self.buildid_cache = buildid_cache + + def add_events(self, d): + """ + Given an event array (from HEADER_EVENT_DESC or a corresponding PERF_RECORD_HEADER_FEATURE) + remember the event descriptions. + Each event comprises + - a PerfEventAttr structure + - a human-readable string (e.g. "instructions") + - a list of numeric identifiers for the event + """ + self.event_attrs = [] + self.n_events = 0 + (n_events, sect_attr_size) = struct.unpack("II", d[0:8]) + if self.debug: + print("%s: %u events, attr size %u" % (self.fn, n_events, sect_attr_size), file=sys.stderr) + if self.attr_entry_size is not None and self.attr_entry_size != 0 and (self.attr_entry_size-16) != sect_attr_size: + print("%s: file header says attribute size is %u but HEADER_EVENT_DESC says attribute size is %u" % (self.fn, self.attr_entry_size-16, sect_attr_size), file=sys.stderr) + #self.attr_entry_size = sect_attr_size - 16 + d = d[8:] + for i in range(0, n_events): + this_attr_size = struct.unpack("I", d[4:8])[0] + if self.debug: + print(" %u bytes left: this attribute size = %u" % (len(d), this_attr_size)); + assert this_attr_size >= 32 and this_attr_size < 256, "invalid attribute size: %u" % this_attr_size + assert len(d) >= this_attr_size, "attr size %u but only %u bytes left" % (this_attr_size, len(d)) + ea_raw = d[0:this_attr_size] + ea = PerfEventAttr(ea_raw, size=this_attr_size) + # Regardless of the size in the structure, the spacing in the file is set by the global size + d = d[sect_attr_size:] + (nr_ids, nlen) = struct.unpack("II", d[0:8]) + assert nr_ids > 0, "unexpected: no ids for %s" % (ea) + name = d[8:8+nlen].strip(b'\0').decode() + d = d[8+nlen:] + ids = [] + for j in range(0, nr_ids): + ids.append(struct.unpack("Q", d[0:8])[0]) + d = d[8:] + if ea.size != sect_attr_size: + print("%s: attribute size mismatch in HEADER_EVENT_DESC: subheader says %u bytes but event descriptor is %u bytes" % (self.fn, sect_attr_size, ea.size), file=sys.stderr) + self.add_event(ea, ids, name) + + def add_event(self, ea, ids=[], name=None): + """ + Create a PerfDataEventDesc object and add it to this file. + """ + assert isinstance(ea, PerfEventAttr) + # Exceptionally, in pipe mode, we might see events duplicated between different metadata records. + if self.is_pipe_mode and ids is not None: + if set(ids).issubset(self.event_index.keys()): + return + eix = len(self.event_descs) + self.event_attrs.append(ea) + desc = PerfDataEventDesc(attr=ea, ids=ids, name=name, index=eix) + self.event_descs.append(desc) + self.n_events = len(self.event_descs) + # The magic offsets within the records need to be the same across all events - + # we need the offset to get the identifier to identify the event. + sample_id_offset = record_sample_id_offset(ea) + non_sample_id_offset = record_non_sample_id_offset(ea) + if self.n_events == 1: + self.sample_id_offset = sample_id_offset + self.non_sample_id_offset = non_sample_id_offset + else: + assert self.sample_id_offset == sample_id_offset + assert self.non_sample_id_offset == non_sample_id_offset + if self.default_event_attr is None: + assert eix == 0 + # Event #0 becomes the default. Note that "perf inject" may rearrange events. + self.default_event_attr = ea + if ids is not None: + # The event identifiers are meant to uniquely identify the events. + for id in ids: + assert id not in self.event_index, "event id %u is duplicated between descriptors #%u and #%u" % (id, self.event_index[id], eix) + self.event_index[id] = eix + return eix + + def events_all(self): + """ + Return the perf event definitions. + """ + return self.event_descs + + def events(self, type=None): + """ + Iterate over all events, optionally selecting by various criteria. + Yield PerfDataEventDesc's. + """ + for desc in self.events_all(): + if type is not None and desc.attr.type != type: + continue + yield desc + + def event_index_by_id(self, ident): + """ + Given an event identifier (as recorded by PERF_SAMPLE_IDENTIFIER and communicated + in HEADER_EVENT_DESC), get the PerfDataEventDesc. + """ + if ident in self.event_index: + eix = self.event_index[ident] # Some small number e.g. 0 or 1 + elif self.n_events == 1: + # There's only one descriptor so it must be this one + eix = 0 + else: + eix = None + return eix + + def event_desc_by_id(self, ident): + eix = self.event_index_by_id(ident) + if eix is not None: + return self.event_descs[eix] + else: + return None + + def event_attr_by_id(self, ident): + """ + Given an event identifier, get the PerfEventAttr. + """ + desc = self.event_desc_by_id(ident) + if desc is not None: + return desc.attr + else: + return None + + def show_events(self): + # For diagnostics, show all the event descriptors and events known in this file + print("Events:") + print(" Descriptors:") + for eix in range(len(self.event_descs)): + desc = self.event_descs[eix] + print(" %s" % (desc)) + + def has_header(self, i): + return (self.flags & (1<= 8, "%s: invalid perf record at file offset 0x%x (type=0x%x, size=%d)" % (self.fn, eoff, type, size) + # read the rest of the record, as indicated by the size field + try: + e = h + self.read(size-8) + except IOError: + print("** %s: could not read %u-byte payload for record type %u at 0x%x" % (self.fn, size-8, type, eoff)) + r = PerfDataRecord(e, file=self, file_offset=eoff) + if r.type == PERF_RECORD_AUXTRACE: + r.auxtrace_file_offset = eoff + r.size + (r.auxtrace_size, r.auxtrace_offset, r.ref, r.idx, r.tid, r.cpu) = struct.unpack("QQQIii", r.raw[8:44]) + elif r.type == PERF_RECORD_AUX: + self.unpack_record(r) + aux_event = self.event_desc_by_id(r.id) + if aux_event is None: + self.show_events() + assert aux_event is not None, "can't find event descriptor for id=%u" % r.id + assert isinstance(aux_event,PerfDataEventDesc) + if self.aux_event is None: + self.aux_event = aux_event + else: + assert self.aux_event == aux_event + r.idx = aux_event.id_index(r.id) # To correspond with PERF_RECORD_AUXTRACE + return r + + def raw0_records(self, data=True): + """ + Iterate over the records, returning raw PerfRecord objects, in the order they occur in perf.data. + The only processing and conditioning we do here: + - get (or skip over) the raw data buffer following PERF_RECORD_AUXTRACE + - expand PERF_RECORD_COMPRESSED + """ + assert self.file_is_valid, "%s: attempt to read records from invalid file" % (self.fn) + if not self.is_pipe_mode: + eoff = self.section_data.offset + self.data_end = self.section_data.offset + self.section_data.size + self.seek(eoff) + else: + # Reading from stdin - non-seekable. Or possibly reading from a file saved via a pipe. + #if self.f != sys.stdin: + # self.seek(16) + eoff = 0 + self.data_end = None + # Loop through the raw records. Note that a PERF_RECORD_AUXTRACE record will be immediately + # followed by the contents of an AUX buffer, which we need to account for. + itrace_tid = None + while self.data_end is None or eoff < self.data_end: + r = self.read_record(eoff, already_here=True) + if r is None and self.is_pipe_mode: + break + eoff += r.size + # if the record has AUX data immediately following, read it now to avoid getting confused about the offset + if r.type == PERF_RECORD_AUXTRACE: + if data or self.is_pipe_mode: + r.aux_data = self.f.read(r.auxtrace_size) + else: + r.aux_data = None + self.seek(eoff + r.auxtrace_size) # Not reading it this time, so step past it + eoff += r.auxtrace_size + elif r.type == PERF_RECORD_COMPRESSED: + # TBD this section is work-in-progress + # We use our perf_zstd module. zstandard/zstd don't seem to work. + zstd_magic = struct.unpack("I",r.raw[8:12])[0] + assert zstd_magic == 0xFD2FB528, "%s: bad Zstd magic: 0x%X" % (self.fn, zstd_magic) + import pyperf.perf_zstd as perf_zstd + ucd = perf_zstd.decompress(r.raw[8:], ratio=8) + print_hex_dump(ucd) + print("decompressed %u bytes to %u bytes" % (len(r.raw)-8, len(ucd))) + while len(ucd) > 0: + (type, misc, size) = struct.unpack("IHH", ucd[:8]) + e = ucd[:size] + print("uncompressed: %u %u %u" % (type, misc, size)) + r = PerfDataRecord(e, file=self) + #print(r) + yield r + ucd = ucd[size:] + continue + # Old abandoned ways + try: + import zstandard + except: + print("** %s: compressed file needs 'zstandard' module to uncompress" % (self.fn), file=sys.stderr) + if False: + ddd = zstd.ZSTD_compress("ABCD",1,4) + print_hex_dump(ddd) + eee = zstd.ZSTD_uncompress(ddd) + print_hex_dump(eee) + if True: + print("Compressed data:") + print_hex_dump(r.raw[:32]) + fp = zstandard.get_frame_parameters(r.raw[8:]) + print(" content size: 0x%x" % (fp.content_size)) + print(" window size: 0x%x" % (fp.window_size)) + max_size = (self.compression_ratio + 1) * len(r.raw) + print("trying %u bytes -> %u bytes" % (len(r.raw), max_size)) + ucd = zstandard.ZstdDecompressor().decompress(r.raw[8:], max_output_size=max_size) + print_hex_dump(ucd) + yield r + + def raw_records(self, event=False, unpack=False, time=False, data=True): + """ + Iterate over the records, returning raw PerfRecord objects, in the order they occur in perf.data. + + This also updates metadata in response to some record types - this is especially important + in pipe mode when we don't have a proper header. + """ + pending_aux = {} # indexed by event ID: AUX records waiting for AUXTRACE + for r in self.raw0_records(data=data): + if r.type == PERF_RECORD_HEADER_FEATURE: + # pipe mode: this supplies a sub-header + # Process some record types to add global context that we'd normally get from subheaders. + r.header_type = struct.unpack("Q", r.raw[8:16])[0] + r.header_data = r.raw[16:] + # Note that we might see event descriptions duplicated between + # PERF_RECORD_HEADER_FEATURE, subtype HEADER_EVENT_DESC + # PERF_RECORD_HEADER_ATTR + self.process_header(r.header_type, r.header_data) + elif r.type == PERF_RECORD_HEADER_ATTR: + # pipe mode: this supplies a perf_event_attr and some ids + attr_size = struct.unpack("I", r.raw[12:16])[0] # peek from inside the perf_event_attr + assert attr_size > 64 and attr_size <= 1024, "ATTR invalid perf_event_attr size %d" % attr_size + attr = PerfEventAttr(r.raw[8:attr_size+8]) + ids_array = r.raw[attr_size+8:] + assert len(ids_array) > 0 and len(ids_array) % 8 == 0, "bad length of ATTR id array: %d (attr_size=%d)" % (len(ids_array), attr_size) + n_ids = len(ids_array) // 8 + ids = [] + for i in range(n_ids): + id = struct.unpack("Q", ids_array[i*8:i*8+8])[0] + ids.append(id) + self.add_event(attr, ids=ids) + elif r.type == PERF_RECORD_AUXTRACE_INFO: + # The auxtrace info type indicates the type of trace and the format of the info, + # e.g. it might be PERF_AUXTRACE_CS_ETM. + r.auxtrace_info_type = struct.unpack("I", r.raw[8:12])[0] + # Hypothesis: there is at most one type of AUX buffer per perf.data file, + # and one set of info, no matter how many aux buffers are collected. + # So we can set a per-file 'auxtrace_info_type' and info. + # We will need to rethink this. + assert self.auxtrace_info_type is None, "multiple PERF_RECORD_AUXTRACE_INFO, unexpected" + self.auxtrace_info_type = r.auxtrace_info_type + # The private information is at offset 16. + # Some formats have a "PMU type" corresponding perf_event_attr.type and named in HEADER_PMU_MAPPINGS, + # but the location is different for different AUX formats, e.g. + # INTEL_PT: "Q" 16:24 + # CS_ETM: "I" 28:32 + r.pmu_type = None + if r.auxtrace_info_type in auxtrace_handlers: + auxtrace_handlers[r.auxtrace_info_type].handle_auxtrace_info(self,r) + elif r.type == PERF_RECORD_AUX: + # Generated by kernel to indicate that data is available in the AUX buffer. + r.auxtrace_info_type = self.auxtrace_info_type # TBD should check in case we have multiple AUX events + self.unpack_record(r) + # We may see PERF_RECORD_AUX for different events, but they will all be for the same event descriptor. + # r.id gives us the event descriptor and the 0-based index within that descriptor, that corresponds + # to the index in the PERF_RECORD_AUXTRACE record. Using the index and the offset, we can find + # the PERF_RECORD_AUXTRACE buffer for this PERF_RECORD_AUX segment. + # If the PERF_RECORD_AUX doesn't have a valid CPU field, it's probably for a per-thread event. + if r.id not in pending_aux: + pending_aux[r.id] = [] + pending_aux[r.id].append(r) + # We haven't yet seen this AUX record's AUXTRACE buffer, but we will soon... + r.auxtrace_record = None + elif r.type == PERF_RECORD_AUXTRACE: + # Synthesized by perf. Data immediately follows and we will have read it. + assert self.auxtrace_info_type is not None, "seen PERF_RECORD_AUXTRACE without info" + r.auxtrace_info_type = self.auxtrace_info_type + # Fields: + # auxtrace_size: number of bytes in this buffer + # auxtrace_offset: offset into the overall stream, of which this buffer is one chunk + # ref: unique identifier for this buffer, may be random (see e.g. cs_etm_reference()) + # idx: the 0-based index of the event (or event buffer): for events opened per cpu, matches cpu, or 0 if cpu is -1 + # tid: thread id or -1, as for perf_event_open(); actual trace may be from a different thread or even process + # cpu: cpu or -1 + assert r.id is None + if self.aux_event is None: + print("No PERF_RECORD_AUX seen before %s" % (r), file=sys.stderr) + r.aux_records = [] + else: + # The 0-based index gets us the event identifier, which matches this AUXTRACE up with AUX records. + if self.aux_event.ids is not None: + r.id = self.aux_event.ids[r.idx] + else: + # Event wasn't described in HEADER_EVENT_DESC, so has no ids + r.id = r.idx + # Attach the pending PERF_RECORD_AUX record(s) to this trace buffer record. + if r.cpu != -1: + cpu = r.cpu + else: + cpu = None + if r.id in pending_aux: + r.aux_records = pending_aux[r.id] + del pending_aux[r.id] + else: + if False and r.auxtrace_size > 8: + # We sometimes see some anomalous AUXTRACE records at the end of a session. + assert r.id in pending_aux, "PERF_RECORD_AUXTRACE for event %u, no matching PERF_RECORD_AUX seen" % (r.id) + r.aux_records = [] + r.has_been_unpacked = True + r.itrace_tid = itrace_tid + elif r.type == PERF_RECORD_ITRACE_START: + self.unpack_record(r) + itrace_tid = r.tid + if event or time or unpack: + self.get_record_event(r) + if unpack: + self.unpack_record(r) + elif time: + r.t = r.time() + if (not data) and r.file_offset is not None and not self.is_pipe_mode: + # If data is not needed now, and we can re-read from disk, discard it to save memory + r.raw = None + yield r + + def records(self, sorted_time=False, unpack=True, time=True): + """ + Iterate over the perf records, returning PerfRecord objects. + These aren't guaranteed to be in time order, as the perf + subsystem may have combined records from several CPUs. + (Use sorted_time=True to get them yielded in time order.) + Generally the record header indicates the total size of the record. + The exception is PERF_RECORD_AUXTRACE records where the record from + the main mmap is immediately followed by the raw data from the AUX mmap. + We try to avoid doing too much record processing before sorting - + instead, we get the time and not much else, then unpack after sorting. + """ + if sorted_time: + def rectime(r): + t = r.t + if t is None: + return 0 + return t + sorted_recs = sorted(list(self.raw_records(unpack=False, time=True, data=False)), key=rectime) + for r in sorted_recs: + self.get_record_data(r) + if unpack: + self.unpack_record(r) + yield r + else: + for r in self.raw_records(event=True, time=time, unpack=unpack): + yield r + + def reader(self): + return PerfDataReader(self) + + + +""" +In order to resolve program addresses we need to know what context (pid -> memory mapping) +applies at the time of an event. We can do this two ways: + + - we can process events in time order, with the various MMAP, FORK etc. events + being used to update the context: this is what we do below with the + PerfDataReader object. This works for sample events but does not, + in general, work where we have additional streams of events over + multiple pids/tids and a significant time period, as we do with e.g. + PT/ETM trace or SPE. ("perf inject" can turn these into individually + timed and annotated sample events, at the cost of a huge increase in + perf.data size.) + + - we can build, as a property of the perf.data file, a time-aware + database where we can ask questions like "what was the mapping for + address A in thread N at time T?" + +""" + + +class ThreadInfo: + """ + Information about a thread at some current time. + This information may change over time. It is intended to provide context + for other events (e.g. when an IP value needs to be looked up). + """ + def __init__(self, tid, name=None, process=None): + self.tid = tid + self.thread_name = name + self.process = None + if process is not None: + self.set_process(process) + + def set_process(self, process): + if self.process is None: + self.process = process + assert self.tid not in process.threads + process.threads[self.tid] = self + else: + assert process == self.process, "thread %s changed process from %s to %s" % (self, self.process, process) + + def __str__(self): + if self.thread_name is not None: + return "%s:%d" % (self.thread_name, self.tid) + else: + return "[tid=%d]" % (self.tid) + + +def proc_map(m): + """ + Generate a /proc/n/maps style line for a PERF_RECORD_MMAP or PERF_RECORD_MMAP2. + """ + s = "%016x-%016x " % (m.addr, m.addr+m.len) + s += "-r"[(m.prot & 0x01) != 0] + s += "-w"[(m.prot & 0x02) != 0] + s += "-x"[(m.prot & 0x04) != 0] + if m.flags is not None: + # from PERF_RECORD_MMAP2 + s += "-sp?"[((m.flags & 0x01) != 0) + 2*((m.flags & 0x02) != 0)] + else: + s += "?" + s += " %08x" % m.pgoff + if m.maj is not None: + s += " %02x:%02x " % (m.maj, m.min) + s += m.filename + return s + + +class ProcessInfo: + """ + Track information for a process (address space) at a point in time. + """ + def __init__(self, pid): + self.pid = pid # -1 for kernel etc. + self.maps = [] # a list of MMAP/MMAP2 event records + self.threads = {} # threads, indexed by tid + + def proc_maps(self): + # Return something looking like /proc/.../maps + s = "" + for m in self.maps: + s += proc_map(m) + "\n" + return s + + def find_addr(self, addr): + for m in self.maps: + if addr >= m.addr and addr < (m.addr + m.len): + return m + return None + + def __str__(self): + s = "[pid=%d]" % self.pid + return s + + +class PerfDataReader: + """ + Read records from a PerfData object, continually maintaining a context + that can be used to interpret the records. Because we mutate this object's + context in the process of reading, this is a separate object from the + PerfData object, which can be shared between several readers. + """ + def __init__(self, pd): + self.pd = pd + kernel_space = ProcessInfo(-1) + swapper_thread = ThreadInfo(0, name="swapper", process=kernel_space) + self.threads = { 0: swapper_thread } + self.procs = { -1: kernel_space } + + def get_thread(self, tid): + if tid not in self.threads: + t = ThreadInfo(tid) # We don't yet know process + self.threads[tid] = t + else: + t = self.threads[tid] + return t + + def get_proc(self, pid): + if pid not in self.procs: + self.procs[pid] = ProcessInfo(pid) + return self.procs[pid] + + def find_proc(self, tid): + if tid in self.threads: + t = self.threads[tid] + assert t.process is not None, "missing process for thread %u" % tid + return t.process + return None + + def lookup_addr(self, pid, addr): + # Return a PERF_RECORD_MMAP PerfRecord, or None + p = self.find_proc(pid) + if p is not None: + mr = p.find_addr(addr) + if mr is not None: + return mr + # Now look again in all-process maps (e.g. VDSO) + return self.procs[-1].find_addr(addr) + + def lookup_addr_all(self, addr): + """ + Look up the address in all current mappings. + """ + mr = self.lookup_addr(-1, addr) + if mr is not None: + yield (-1, mr) + else: + for p in self.procs.values(): + if p.pid != -1: + m = p.find_addr(addr) + if m is not None: + yield (p.pid, m) + + def proc_maps_all(self): + s = self.procs[-1].proc_maps() + for p in self.procs.values(): + s += "\n[%u]\n" % p.pid + s += p.proc_maps() + return s + + def records(self, sorted_time=False, unpack=True): + """ + Yield all records, sorted or unsorted, with additional tracking of address space mapping events + in the PerfDataReader object. + """ + for r in self.pd.records(sorted_time=sorted_time, unpack=unpack): + if r.type == PERF_RECORD_MMAP or r.type == PERF_RECORD_MMAP2: + if not unpack: + r.unpack() + # Look up the filename in this perf.data file's HEADER_BUILD_ID cache. + r.build_id = self.pd.build_id(r.pid, r.filename) + # If we found a buildid, get the file with this buildid, possibly from the ~/.debug buildid cache. + r.file_cached = None + if r.build_id is not None: + if self.pd.buildid_cache is not None: + r.file_cached = self.pd.buildid_cache.id_matching_file(r.build_id, r.filename) + elif perf_buildid.file_buildid(r.filename) == r.build_id: + r.file_cached = r.filename + yield r + # Update context for the benefit of other events + if r.type == PERF_RECORD_COMM: + if not unpack: + r.unpack() + t = self.get_thread(r.tid) + t.set_process(self.get_proc(r.pid)) + t.thread_name = r.thread_name + elif r.type == PERF_RECORD_FORK: + # We always create a new thread. We might also create a new process. + if not unpack: + r.unpack() + if r.pid != r.ppid: + # Created new process (with its own main thread) + assert r.tid == r.pid, "expected new process to have TID=PID" + p = self.get_proc(r.pid) + if r.ppid in self.procs: + p.maps = copy.copy(self.procs[r.ppid].maps) + else: + # Created new thread in same process + p = self.get_proc(r.pid) + t = self.get_thread(r.tid) + t.set_process(p) + if r.ptid in self.threads: + # Propagate the old thread name to the forked thread name + t.thread_name = self.threads[r.ptid].thread_name + elif r.type == PERF_RECORD_MMAP or r.type == PERF_RECORD_MMAP2: + # Already unpacked + p = self.get_proc(r.pid) + p.maps.append(r) + elif r.type == PERF_RECORD_EXIT: + # Should we delete knowledge of the exiting thread? + pass + + +if __name__ == "__main__": + # As a self-test, print basic details of the current perf.data file. + # For more detailed printing, in the style of "perf report", see perf_report.py. + fn = "perf.data" + for arg in sys.argv[1:]: + if arg == "write": + w = PerfData() + w.add_event(PerfEventAttr(type=PERF_TYPE_HARDWARE, config=PERF_COUNT_HW_CACHE_MISSES)) + w.open_and_write_header("new.perf.data") + w.close() + fn = "new.perf.data" + else: + fn = arg + d = PerfData(fn, debug=True) + for r in d.records(): + print("%8x %s: %s" % (r.file_offset, record_type_str(r.type), r)) + if d.datatop is not None: + datamap.print_datamap(d.datamap, fmt="%-10x") + for r in d.datatop.iter_unmapped(): + print("unmapped area: %s" % r) + data = d.readat(r.base, r.size) + print_hex_dump(data, prefix=" ", base=r.base) + d.close() diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_enum.py b/linux_app/pmu_app/pyperf/pyperf/perf_enum.py new file mode 100644 index 00000000..70589344 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_enum.py @@ -0,0 +1,368 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Manage enumerations relating to the perf_event_open API. + +Enumerations specific to perf.data files are not generally here. +""" + +from __future__ import print_function + +# Values in attr.type; other values are for custom PMUs +PERF_TYPE_HARDWARE = 0 +PERF_TYPE_SOFTWARE = 1 +PERF_TYPE_TRACEPOINT = 2 +PERF_TYPE_HW_CACHE = 3 +PERF_TYPE_RAW = 4 +PERF_TYPE_BREAKPOINT = 5 + +PERF_COUNT_HW_CPU_CYCLES = 0 +PERF_COUNT_HW_INSTRUCTIONS = 1 +PERF_COUNT_HW_CACHE_REFERENCES = 2 +PERF_COUNT_HW_CACHE_MISSES = 3 +PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4 +PERF_COUNT_HW_BRANCH_MISSES = 5 +PERF_COUNT_HW_BUS_CYCLES = 6 +PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7 +PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8 +PERF_COUNT_HW_REF_CPU_CYCLES = 9 + +PERF_COUNT_SW_CPU_CLOCK = 0 +PERF_COUNT_SW_TASK_CLOCK = 1 +PERF_COUNT_SW_PAGE_FAULTS = 2 +PERF_COUNT_SW_CONTEXT_SWITCHES = 3 +PERF_COUNT_SW_CPU_MIGRATIONS = 4 +PERF_COUNT_SW_PAGE_FAULTS_MIN = 5 +PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6 +PERF_COUNT_SW_ALIGNMENT_FAULTS = 7 +PERF_COUNT_SW_EMULATION_FAULTS = 8 +PERF_COUNT_SW_DUMMY = 9 +PERF_COUNT_SW_BPF_OUTPUT = 10 + +# Cache level is at bit position 0 +PERF_COUNT_HW_CACHE_L1D = 0 +PERF_COUNT_HW_CACHE_L1I = 1 +PERF_COUNT_HW_CACHE_LL = 2 +PERF_COUNT_HW_CACHE_DTLB = 3 +PERF_COUNT_HW_CACHE_ITLB = 4 +PERF_COUNT_HW_CACHE_BPU = 5 +PERF_COUNT_HW_CACHE_NODE = 6 +# Access type is at bit position 8 +PERF_COUNT_HW_CACHE_OP_READ = 0 +PERF_COUNT_HW_CACHE_OP_WRITE = 1 +PERF_COUNT_HW_CACHE_OP_PREFETCH = 2 +# Result is at bit position 16 +PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0 +PERF_COUNT_HW_CACHE_RESULT_MISS = 1 + +def PERF_HW_CACHE(unit, op, result): + return (result << 16) | (op << 8) | (unit) + +def PERF_HW_CACHE_UNIT(cfg): + return cfg & 0xff + +def PEFF_HW_CACHE_OP(cfg): + return (cfg >> 8) & 0xff + +def PERF_HW_CACHE_RESULT(cfg): + return (cfg >> 16) & 0xff + + +HW_BREAKPOINT_EMPTY = 0 +HW_BREAKPOINT_R = 1 +HW_BREAKPOINT_W = 2 +HW_BREAKPOINT_RW = 3 +HW_BREAKPOINT_X = 4 + +# Flags in attr.read_format +PERF_FORMAT_TOTAL_TIME_ENABLED = 0x00000001 +PERF_FORMAT_TOTAL_TIME_RUNNING = 0x00000002 +PERF_FORMAT_ID = 0x00000004 +PERF_FORMAT_GROUP = 0x00000008 +PERF_FORMAT_MAX = 0x00000010 + +# Flags in attr.sample_type +PERF_SAMPLE_IP = 0x00000001 +PERF_SAMPLE_TID = 0x00000002 +PERF_SAMPLE_TIME = 0x00000004 +PERF_SAMPLE_ADDR = 0x00000008 +PERF_SAMPLE_READ = 0x00000010 +PERF_SAMPLE_CALLCHAIN = 0x00000020 +PERF_SAMPLE_ID = 0x00000040 +PERF_SAMPLE_CPU = 0x00000080 +PERF_SAMPLE_PERIOD = 0x00000100 +PERF_SAMPLE_STREAM_ID = 0x00000200 +PERF_SAMPLE_RAW = 0x00000400 +PERF_SAMPLE_BRANCH_STACK = 0x00000800 +PERF_SAMPLE_REGS_USER = 0x00001000 +PERF_SAMPLE_STACK_USER = 0x00002000 +PERF_SAMPLE_WEIGHT = 0x00004000 +PERF_SAMPLE_DATA_SRC = 0x00008000 +PERF_SAMPLE_IDENTIFIER = 0x00010000 +PERF_SAMPLE_TRANSACTION = 0x00020000 +PERF_SAMPLE_REGS_INTR = 0x00040000 +PERF_SAMPLE_PHYS_ADDR = 0x00080000 +PERF_SAMPLE_AUX = 0x00100000 +PERF_SAMPLE_CGROUP = 0x00200000 + +# Flags in attr.branch_sample_type +PERF_SAMPLE_BRANCH_USER = 0x00000001 +PERF_SAMPLE_BRANCH_KERNEL = 0x00000002 +PERF_SAMPLE_BRANCH_HV = 0x00000004 +PERF_SAMPLE_BRANCH_PLM_ALL = 0x00000007 +PERF_SAMPLE_BRANCH_ANY = 0x00000008 +PERF_SAMPLE_BRANCH_ANY_CALL = 0x00000010 +PERF_SAMPLE_BRANCH_ANY_RETURN = 0x00000020 +PERF_SAMPLE_BRANCH_IND_CALL = 0x00000040 +PERF_SAMPLE_BRANCH_ABORT_TX = 0x00000080 +PERF_SAMPLE_BRANCH_IN_TX = 0x00000100 +PERF_SAMPLE_BRANCH_NO_TX = 0x00000200 +PERF_SAMPLE_BRANCH_COND = 0x00000400 +PERF_SAMPLE_BRANCH_CALL_STACK = 0x00000800 +PERF_SAMPLE_BRANCH_IND_JUMP = 0x00001000 +PERF_SAMPLE_BRANCH_CALL = 0x00002000 +PERF_SAMPLE_BRANCH_NO_FLAGS = 0x00004000 +PERF_SAMPLE_BRANCH_NO_CYCLES = 0x00008000 +PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x00010000 +PERF_SAMPLE_BRANCH_HW_INDEX = 0x00020000 +PERF_SAMPLE_BRANCH_MAX = 0x00040000 + +PERF_SAMPLE_REGS_ABI_NONE = 0 +PERF_SAMPLE_REGS_ABI_32 = 1 +PERF_SAMPLE_REGS_ABI_64 = 2 + +# Values in record.type +PERF_RECORD_MMAP = 1 +PERF_RECORD_LOST = 2 +PERF_RECORD_COMM = 3 +PERF_RECORD_EXIT = 4 +PERF_RECORD_THROTTLE = 5 +PERF_RECORD_UNTHROTTLE = 6 +PERF_RECORD_FORK = 7 +PERF_RECORD_READ = 8 +PERF_RECORD_SAMPLE = 9 +PERF_RECORD_MMAP2 = 10 +PERF_RECORD_AUX = 11 +PERF_RECORD_ITRACE_START = 12 +PERF_RECORD_LOST_SAMPLES = 13 +PERF_RECORD_SWITCH = 14 +PERF_RECORD_SWITCH_CPU_WIDE = 15 +PERF_RECORD_NAMESPACES = 16 +PERF_RECORD_KSYMBOL = 17 +PERF_RECORD_BPF_EVENT = 18 +PERF_RECORD_CGROUP = 19 +PERF_RECORD_TEXT_POKE = 20 + +PERF_RECORD_MISC_CPUMODE_MASK = 0x7 +PERF_RECORD_MISC_CPUMODE_UNKNOWN = 0 +PERF_RECORD_MISC_KERNEL = 1 +PERF_RECORD_MISC_USER = 2 +PERF_RECORD_MISC_HYPERVISOR = 3 +PERF_RECORD_MISC_GUEST_KERNEL = 4 +PERF_RECORD_MISC_GUEST_USER = 5 +PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT = 0x1000 +PERF_RECORD_MISC_MMAP_DATA = 0x2000 +PERF_RECORD_MISC_COMM_EXEC = 0x2000 +PERF_RECORD_MISC_SWITCH_OUT = 0x2000 +PERF_RECORD_MISC_EXACT_IP = 0x4000 +PERF_RECORD_MISC_SWITCH_OUT_PREEMPT = 0x4000 + +PERF_AUX_FLAG_TRUNCATED = 0x01 +PERF_AUX_FLAG_OVERWRITE = 0x02 +PERF_AUX_FLAG_PARTIAL = 0x04 +PERF_AUX_FLAG_COLLISION = 0x08 + +PERF_MEM_OP_NA = 1 +PERF_MEM_OP_LOAD = 2 +PERF_MEM_OP_STORE = 4 +PERF_MEM_OP_PFETCH = 8 +PERF_MEM_OP_EXEC = 16 +PERF_MEM_OP_SHIFT = 0 + +PERF_MEM_LVL_NA = 1 +PERF_MEM_LVL_HIT = 2 +PERF_MEM_LVL_MISS = 4 +PERF_MEM_LVL_L1 = 8 +PERF_MEM_LVL_LFB = 16 +PERF_MEM_LVL_L2 = 32 +PERF_MEM_LVL_L3 = 64 +PERF_MEM_LVL_LOC_RAM = 128 +PERF_MEM_LVL_REM_RAM1 = 256 +PERF_MEM_LVL_REM_RAM2 = 512 +PERF_MEM_LVL_REM_CCE1 = 1024 +PERF_MEM_LVL_REM_CCE2 = 2048 +PERF_MEM_LVL_IO = 4096 +PERF_MEM_LVL_UNC = 8192 +PERF_MEM_LVL_SHIFT = 5 + +PERF_MEM_SNOOP_NA = 1 +PERF_MEM_SNOOP_NONE = 2 +PERF_MEM_SNOOP_HIT = 4 +PERF_MEM_SNOOP_MISS = 8 +PERF_MEM_SNOOP_HITM = 16 +PERF_MEM_SNOOP_SHIFT = 19 + +PERF_MEM_LOCK_NA = 1 +PERF_MEM_LOCK_LOCKED = 2 +PERF_MEM_LOCK_SHIFT = 24 + +PERF_MEM_TLB_NA = 1 +PERF_MEM_TLB_HIT = 2 +PERF_MEM_TLB_MISS = 4 +PERF_MEM_TLB_L1 = 8 +PERF_MEM_TLB_L2 = 16 +PERF_MEM_TLB_WK = 32 +PERF_MEM_TLB_OS = 64 +PERF_MEM_TLB_SHIFT = 26 + +PERF_MEM_LVLNUM_L1 = 1 +PERF_MEM_LVLNUM_L2 = 2 +PERF_MEM_LVLNUM_L3 = 3 +PERF_MEM_LVLNUM_L4 = 4 +PERF_MEM_LVLNUM_ANY_CACHE = 11 +PERF_MEM_LVLNUM_LFB = 12 +PERF_MEM_LVLNUM_RAM = 13 +PERF_MEM_LVLNUM_PMEM = 14 +PERF_MEM_LVLNUM_SHIFT = 33 + +PERF_MEM_REMOTE_REMOTE = 1 +PERF_MEM_REMOTE_SHIFT = 37 + +PERF_MEM_SNOOPX_FWD = 1 +PERF_MEM_SNOOPX_SHIFT = 38 + +# Special values in branch stack +PERF_CONTEXT_HV = -32 # ...ffe0 +PERF_CONTEXT_KERNEL = -128 # ...ff80 +PERF_CONTEXT_USER = -512 # ...fe00 +PERF_CONTEXT_GUEST = -2048 # ...f800 +PERF_CONTEXT_GUEST_KERNEL = -2176 +PERF_CONTEXT_GUEST_USER = -2560 + + +def _str_enum(pfx, n, exclude=[], short=False): + """ + Resolve a number into a constant name, given a prefix, + e.g. _str_enum("TYPE", 4) == "PERF_TYPE_RAW" + 'exclude' is so we can resolve PERF_RECORD constants but + exclude PERF_RECORD_MISC flags. + """ + if n is None: + return None + s = None + def canon(pfx): + if not pfx.startswith("PERF_"): + pfx = "PERF_" + pfx + if not pfx.endswith("_"): + pfx += "_" + return pfx + pfx = canon(pfx) + exclude = map(canon, exclude) + for (name, value) in globals().items(): + if value == n and name.startswith(pfx): + excluded = False + for e in exclude: + if name.startswith(e): + excluded = True + break + if not excluded: + s = name + break + if s is None: + s = pfx + ("%u??" % n) + if short: + s = s[len(pfx):] + return s + + +assert _str_enum("TYPE", 1) == "PERF_TYPE_SOFTWARE" +assert _str_enum("TYPE", 2, short=True) == "TRACEPOINT" + +def str_PERF_TYPE(n, short=False): + return _str_enum("TYPE", n, short=short) + + +def str_PERF_RECORD(n, short=False): + return _str_enum("RECORD", n, short=short, exclude=["RECORD_MISC"]) + +assert str_PERF_RECORD(2) == "PERF_RECORD_LOST" + + +def _enums(pfx, keys=[]): + if keys: + for k in keys: + g = pfx + "_" + k + yield (k, globals()[g]) + else: + for g in globals(): + if g.startswith(pfx + "_"): + yield (g[len(pfx)+1:], globals()[g]) + + +def _flag_ored_string(x, pfx, keys=[]): + flags = [] + for (k, v) in _enums(pfx, keys=keys): + if x & v: + flags.append(k) + x &= ~v + if x: + flags.append("0x%x" % x) + return "|".join(flags) + + +def str_flags_PERF_SAMPLE(x): + return _flag_ored_string(x, "PERF_SAMPLE", ["IP", "TID", "TIME", "ADDR", "READ", "CALLCHAIN", "ID", "CPU", "PERIOD", "STREAM_ID", "RAW", "BRANCH_STACK", "REGS_USER", "STACK_USER", "WEIGHT", "DATA_SRC", "IDENTIFIER"]) + +assert str_flags_PERF_SAMPLE(PERF_SAMPLE_ID|PERF_SAMPLE_RAW) == "ID|RAW" + + +def str_flags_PERF_SAMPLE_BRANCH(x): + return _flag_ored_string(x, "PERF_SAMPLE_BRANCH", ["USER", "KERNEL", "HV", "ANY", "ANY_CALL", "IND_CALL", "CALL", "HW_INDEX"]) + + +def str_flags_PERF_FORMAT(x): + return _flag_ored_string(x, "PERF_FORMAT", ["TOTAL_TIME_ENABLED","TOTAL_TIME_RUNNING","ID","GROUP"]) + + +def str_PERF_RECORD_MISC(x): + cmode = x & PERF_RECORD_MISC_CPUMODE_MASK + flags = x & ~PERF_RECORD_MISC_CPUMODE_MASK + s = _flag_ored_string(flags, "PERF_RECORD_MISC").split('|') + if s == ['']: + s = [] + s += [_str_enum("PERF_RECORD_MISC", cmode, short=True)] + s = '|'.join(s) + return s + + +def test(): + import os + fn = "/tmp/perf_enum_test.c" + fd = open(fn, "w") + print("#include ", file=fd) + print("#include ", file=fd) + for name in globals(): + if name.startswith("PERF_"): + print("int test_%s[1/(%s==%u)];" % (name, name, globals()[name]), file=fd) + print(file=fd) + print("int main(void) { return 0; }", file=fd) + fd.close() + os.system("cc %s" % fn) + + +if __name__ == "__main__": + test() + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_espec.py b/linux_app/pmu_app/pyperf/pyperf/perf_espec.py new file mode 100644 index 00000000..1491c9b5 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_espec.py @@ -0,0 +1,797 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +perf event parser + +Given a string as passed to the -e argument to perf, +return an event configuration object (EventConfig) +that can be used with the perf events module. + +An EventConfig object is roughly equivalent to the +perf_event_attr structure passed to perf_event_open, +but with additional information such as + - the event description string, as used to select it + - scale and units +""" + +from __future__ import print_function + +import os, sys +sys.path.append(os.path.dirname(__file__)) + +from perf_enum import * +from perf_sysfs import * +from perf_attr import * +import perf_parse +from perf_util import * + +# Experimental support for reading PMU event names from JSON +sys.path.append(os.path.join(os.path.dirname(__file__), "..")) +try: + import PMUdescx +except ImportError: + pass + +o_verbose = 0 + +PRECISE_MAX = 3 + + +# +# This tries to map between the simple names used by 'perf list' +# and the enumerators exported by pysweep. However, those enumerators +# may depend on kernel configuration, e.g. COUNT_SW_BPF_OUTPUT. +# +perf_event_map = { + + "cpu-cycles": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES), + "cycles": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES), + "instructions": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS), + "ref-cycles": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES), + "cache-references": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES), + "cache-misses": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES), + "branch-instructions": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS), + "branches": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS), + "branch-misses": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES), + "bus-cycles": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES), + "stalled-cycles-frontend": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND), + "stalled-cycles-backend": (PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND), + + "cpu-clock": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK), + "task-clock": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK), + "page-faults": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS), + "faults": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS), + "context-switches": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES), + "cs": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES), + "cpu-migrations": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS), + "migrations": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS), + "minor-faults": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN), + "major-faults": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ), + "alignment-faults": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS), + "bpf-output": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT), + "emulation-faults": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS), + "dummy": (PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY) +} + + +def perf_event_name(etype, ecode): + if etype == PERF_TYPE_HW_CACHE: + return hw_cache_event_name(ecode) + ls = [] + for e in perf_event_map: + (type, code) = perf_event_map[e] + if type == etype and code == ecode: + ls.append(e) + return " OR ".join(ls) + +assert perf_event_name(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES) == "cpu-cycles OR cycles" + + +# This list must match perf_hw_cache_id in the kernel +hw_cache_types = [ "L1-dcache", "L1-icache", "LLC", "dTLB", "iTLB", "branch", "node"] + +def hw_cache_event_name(code): + """ + Given a cache event encoding, return the name. + This doesn't indicate that the event is supported on the target. + """ + cix = code & 0xff + aix = (code >> 8) & 0xff + rix = (code >> 16) & 0xff + try: + aname = ["load", "store"][aix] + rname = ["s", "-misses"][rix] + return "%s-%s%s" % (hw_cache_types[cix], aname, rname) + except IndexError: + return None + + +def hwcc(cix, aix, rix): + # form the code from the cache type, access type and result + return cix + (aix<<8) + (rix<<16) + + +def hw_cache_event_code(s): + """ + Given an event name (such as "LLC-load-misses"), + check if it's a cache event, and if so, return the encoding. + This doesn't indicate that the event is supported on the target. + """ + for (cix, ctype) in enumerate(hw_cache_types): + if s.startswith(ctype + "-"): + s = s[len(ctype)+1:] + if s == "loads": + return hwcc(cix,PERF_COUNT_HW_CACHE_OP_READ,PERF_COUNT_HW_CACHE_RESULT_ACCESS) + elif s == "stores": + return hwcc(cix,PERF_COUNT_HW_CACHE_OP_WRITE,PERF_COUNT_HW_CACHE_RESULT_ACCESS) + elif s == "load-misses": + return hwcc(cix,PERF_COUNT_HW_CACHE_OP_READ,PERF_COUNT_HW_CACHE_RESULT_MISS) + elif s == "store-misses": + return hwcc(cix,PERF_COUNT_HW_CACHE_OP_WRITE,PERF_COUNT_HW_CACHE_RESULT_MISS) + else: + return None + return None + + +def hw_cache_event_codes(): + """ + Enumerate the possible HW cache event codes, in the same order as + perf list cache + This does not indicate whether the events are supported on the target. + """ + for cix in range(0, len(hw_cache_types)): + for aix in range(0, 2): + for rix in range(0, 2): + yield hwcc(cix, aix, rix) + + +branch_sample_types = { + "any": PERF_SAMPLE_BRANCH_ANY, + "any_call": PERF_SAMPLE_BRANCH_ANY_CALL, + "any_ret": PERF_SAMPLE_BRANCH_ANY_RETURN, + "ind_jmp": PERF_SAMPLE_BRANCH_IND_JUMP, # not documented + "ind_call": PERF_SAMPLE_BRANCH_IND_CALL, # documented as 'any indirect branch' + "call": PERF_SAMPLE_BRANCH_CALL, + "u": PERF_SAMPLE_BRANCH_USER, + "k": PERF_SAMPLE_BRANCH_KERNEL, + "hv": PERF_SAMPLE_BRANCH_HV, + "in_tx": PERF_SAMPLE_BRANCH_IN_TX, + "no_tx": PERF_SAMPLE_BRANCH_NO_TX, + "abort_tx": PERF_SAMPLE_BRANCH_ABORT_TX, + "cond": PERF_SAMPLE_BRANCH_COND, +} + + +def branch_sample_type(s): + st = 0 + for bf in s.split(','): + if bf in branch_sample_types: + st |= branch_sample_types[bf] + else: + print("** unknown branch sample type: '%s'" % bf) + return st + + +def is_hex(s): + try: + n = int(s, 16) + return True + except ValueError: + return False + + +def parameter_map(flist): + """ + Convert a list of "a=v" strings into a Python map + """ + fmap = {} + for f in flist: + if not f: + # a blank - either "subsys//" or extra comma + continue + # it's either "field=x" or just "field" + if '=' in f: + (field, value) = f.split('=') + else: + field = f + value = "1" # single-bit field, e.g. "inv" on x86_64 + assert field # should look like an identifier + # validate 'value'? should it be a hex number? + fmap[field] = value + return fmap + +assert parameter_map([""]) == {} +assert parameter_map(["a=1"]) == {"a": "1"} +assert parameter_map(["a=1","b=2"]) == {"a": "1", "b": "2"} + +# standard fields in the event config (perf_event_attr). +# Individual event groups may add additional names for subfields. +predefined_fields = [ + "config", + "config1", + "config2", + "name", + "period", + "freq", + "branch-type", + "time", + "call-graph", + "stack-size", + "no-inherit", + "inherit", + "max-stack", + "nr", + "overwrite", + "no-overwrite", + "driver-config", + "percore", + "aux-output", +] + +class EventConfig: + """ + An 'event configuration' object represents, basically, a single event, + but one that might be collected across multiple CPUs and threads. + The -e argument to perf may specify one or more of these events. + The event configuration specifies, directly or by reference to + events in predefined lists and in sysfs, the perf_event_attr structure + passed to perf_event_open, but also other fields used by the userspace tool. + It may also indicate filtering, e.g. to kernel and/or userspace. + At measurement time, there might be multiple perf_events for this event + specification, one per CPU. + + If errors occurred when parsing the event, an EventConfig object will be + constructed with is_valid() false, and error messages logged in error_log. + """ + def __init__(self, e=None): + if e is not None: + self.configure(e) + else: + self.reset() + + def is_simple(self): + """ + Return true if the event has not been modified with suffixes, extra parameters etc. + """ + return self.attr.config1 == 0 and \ + self.attr.config2 == 0 and \ + (not self.modifiers) and \ + (not self.extra_modifiers) and \ + (not self.space) and \ + self.attr.precise_ip == 0 and \ + self.attr.bp_type is None and \ + self.cpumask is None + + def reset(self): + self.error_log = [] + self.attr = PerfEventAttr() + self.attr._set_all_valid() + self.scale = None + self.unit = None + self.cpumask = None + self.modifiers = "" + self.extra_modifiers = "" + self.PMU = None # a SysPMU object + + def configure(self, e, quiet=False): + """ + Configure this descriptor object from an event specifier string. + """ + self.reset() + # Fields for perf_event_attr + self.attr.type = None # e.g. PERF_TYPE_HARDWARE + self.attr.config = None # e.g. PERF_COUNT_HW_CPU_CYCLES + self.attr.config1 = 0 + self.attr.config2 = 0 + self.attr.bp_type = None + self.attr.inherit = None + if True: + # By default, in the perf tool, events get these exclusions. + self.attr.exclude_hv = 1 + self.attr.exclude_guest = 1 + # Fields outside perf_event_attr + self.perf_call_graph = None # a string + self.name = e + # If any inclusion specifiers out of "ukh" are specified, the rest are excluded. + # Similarly for "GH" (guest and host). + self.space = "" # from "u", "k", "h" and also "G", "H" + # Any event may have generic modifiers like 'k' for kernel. + # But tracepoint events are specified as + # abc:xyz + # So we don't know whether a :xyz suffix is a generic modifier or not, + # until after we've processed the event. Split the event spec into + # colon-separated segments - any event can then consume a segment by + # incrementing eix, leaving generic modifiers to be processed at the end. + espec = e.split(':') + e = espec[0] + eix = 0 + if e.find('/') > 0: + ix = e.find('/') + mix = e.rfind('/') + if ix == mix: + self.report("bad event: '%s'" % e) + event_base = e[:ix] + event_parameters = e[ix+1:mix].split(',') + emods = e[mix+1:] + if emods: + espec.insert(1, emods) + else: + event_base = e + event_parameters = [] + if e.startswith("r") and is_hex(e[1:]): + # "-e race" should be valid, equivalent to "-e r0ace" + self.attr.update(type=PERF_TYPE_RAW, config=int(e[1:],16)) + elif event_base in perf_event_map: + # a named event, e.g. "instructions" + self.setup(perf_event_map[event_base]) + # apply generic event parameters e.g. 'config=0x12' + pars = parameter_map(event_parameters) + for p in pars: + self.set_generic_parameter(p, pars[p]) + elif e.startswith("PERF_COUNT_") and e in globals(): + # perf_event.h constants - our extension + if e.startswith("PERF_COUNT_HW_"): + self.setup(PERF_TYPE_HARDWARE, globals()[e]) + elif e.startswith("PERF_COUNT_SW_"): + self.setup(PERF_TYPE_SOFTWARE, globals()[e]) + elif event_parameters: + # custom event in some event subsystem + # e.g. "cpu/branch-instructions/" + subsys = event_base # e.g. "cpu" + spec = event_parameters + pmu_type = system_pmu_type(subsys) + if pmu_type is None: + if not quiet: + self.report("unknown hardware PMU: '%s'" % subsys) + return + self.attr.type = pmu_type + self.PMU = SysPMU(subsys) + self.cpumask = self.PMU.cpumask() + self.attr.config = 0 + self.attr.config1 = 0 + self.attr.config2 = 0 + # look to see if this is a named event + event_name = event_parameters[0] # may be empty string + must_specify_fields = [] + if self.PMU.has_named_events() and event_name.find("=") == -1: + event_specifier = self.PMU.event_specifier(event_name) + if event_specifier is not None: + # this is a named event + self.scale = self.PMU.event_scale(event_name) + self.unit = self.PMU.event_unit(event_name) + event_fields = parameter_map(event_specifier.split(',')) + event_spec = parameter_map(event_parameters[1:]) + # iterate over the predefined or required parameters + for e in event_fields: + if event_fields[e] == "?": + if e in event_spec: + # user supplied a value for this expected parameter + event_fields[e] = event_spec[e] + else: + self.report("missing field '%s' for event '%s'" % (e, event_name)) + else: + if e in event_spec: + self.report("event '%s=%s' already has '%s=%s', not expecting '%s'" % (event_name, e, event_fields[e], e, event_spec[e])) + # add in other supplied parameters + for e in event_spec: + event_fields[e] = event_spec[e] + else: + if not quiet: + self.report("subsystem '%s' does not have event '%s'" % (subsys, event_name)) + self.report("available events: %s" % (", ".join(PMU.event_names()))) + else: + # subsystem has no named events, or event is specified entirely by fields + event_fields = parameter_map(event_parameters) + # for each custom field specified by the user, use the event's + # format specification (if present) to see how it maps on to + # the 'config' fields of the perf_event_open structure. + # some subsystems (e.g. intel-bts//) don't have a format. + for e in event_fields: + vals = event_fields[e] # user-specified or defaulted value + try: + # values are always hex + value = int(vals, 0) + except ValueError: + value = None + if e in predefined_fields: + self.set_generic_parameter(e, vals, value, merge=True) + elif e[0] == '@' and subsys == "cs_etm": + # Sink specifier for CoreSight ETM + sink_dir = "/sys/devices/" + subsys + "/sinks" + assert os.path.isdir(sink_dir), "CoreSight sinks not available" + sp = sink_dir + "/" + e[1:] + if os.path.exists(sp): + value = utils.file_hex(sp) + self.set_custom_parameter("sinkid", value) # somewhere in config2 + else: + print("unknown %s sink: '%s', available sinks are %s" % (subsys, e[1:], list(os.listdir(sink_dir))), file=sys.stderr) + continue + else: + self.set_custom_parameter(e, value) + if False: + print("Raw event: %s" % self) + elif e == "mem" and (len(espec) == 2 or len(espec) == 3): + self.attr.update(type=PERF_TYPE_BREAKPOINT, config=0, bp_addr=int(espec[1],0), bp_len=8) + bp_type = HW_BREAKPOINT_RW + if len(espec) == 3: + bp_type = HW_BREAKPOINT_EMPTY + for c in espec[2]: + if c == 'r': + bp_type |= HW_BREAKPOINT_R + elif c == 'w': + bp_type |= HW_BREAKPOINT_W + elif c == 'x': + bp_type |= HW_BREAKPOINT_X + else: + # actually I think perf just fails here + self.report("breakpoint syntax error: %s" % espec[2]) + self.attr.bp_type = bp_type + return + elif len(espec) == 2: + # could be "sched:sched_switch" or "cache_misses:u" + evid = tracepoint_id(espec[0], espec[1]) + if evid is not None: + self.attr.type = PERF_TYPE_TRACEPOINT + self.attr.config = evid + return # don't do colon-separated modifiers + else: + self.report("unknown or inaccessible tracepoint event: %s (%s)" % (e, espec)) + return + else: + hwcc = hw_cache_event_code(e) + if hwcc is not None: + self.attr.update(type=PERF_TYPE_HW_CACHE, config=hwcc) + else: + # See if this is a cpu event, e.g. "cpu-clock" + # This will only work if /sys/bus/event_source/devices/cpu exists + # It might not exist on ARM systems where CPU PMUs are named e.g. armv8_pmuv3_0 + try: + self.configure("cpu/" + e + "/", quiet=True) + return + except Exception: + self.name = e # restore + pass + # See if this is in the JSON file (our extension) + try: + pmu = PMUdesc.PMUdesc_first() + p = pmu["by_name"][e] + self.attr.type = PERF_TYPE_RAW + self.attr.config = PMUdesc.Intel_config(p) + return + except Exception: + pass + self.report("unknown event: %s" % e) + return + # Process any unused colon-separated segments or g/e/m trailing modifiers. + if len(espec) > eix: + self.modifiers = ''.join(espec[eix+1:]) + # For event modifiers, see perf list --help + for c in self.modifiers: + if c == 'p': + self.attr.precise_ip += 1 + elif c == 'P': + self.attr.precise_ip = PRECISE_MAX + elif c in "ukhGH": + self.space += c + elif c == 'I': + self.attr.exclude_idle = True + elif c == 'D': + self.attr.pinned = True + elif c == 'S': + self.attr.sample_type |= PERF_SAMPLE_READ + else: + self.report("event has invalid modifier suffix '%s': \"%s\"" % (c, e)) + self.extra_modifiers += c + + def setup(self, ptype_config): + # parameter is a tuple: see PEP-3113 + (self.attr.type, self.attr.config) = ptype_config + + def set_custom_parameter(self, e, value=None): + if value is None: + value = 1 + format = self.PMU.field_format(e) + if format is None: + self.report("event %s// unknown field '%s'" % (self.PMU.pmu_name, e)) + self.report("valid fields: %s" % ",".join(self.PMU.field_names() + predefined_fields)) + return False + (struct_field, range) = format + assert struct_field in ["config", "config1", "config2"] + if range.find('-') >= 0: + (rlo, rhi) = range.split('-') + rlo = int(rlo) + rhi = int(rhi) + width = (rhi - rlo) + 1 + else: + # single-bit field + rlo = int(range) + rhi = rlo + width = 1 + maxval = (1 << width) - 1 + if value > maxval: + print("value %u/%x is out of range, max value is %u/%x" % (value, value, maxval, maxval), file=sys.stderr) + value &= maxval + value <<= rlo + self.set_generic_parameter(struct_field, None, value, merge=True) + return True + + def set_generic_parameter(self, p, svalue, value=None, merge=False): + """ + Set a generic parameter, e.g. + perf stat -e cs/config2=123/ + From "perf help record": + "There are also some params which are not defined in + ...//format/* ..." + """ + if value is None: + try: + value = int(svalue, 0) + except ValueError: + value = None + if o_verbose: + print("set generic parameter '%s' adds 0x%x" % (p, value)) + if p == "config": + if merge: + self.attr.config |= value + else: + self.attr.config = value + elif p == "config1": + if merge: + self.attr.config1 |= value + else: + self.attr.config1 = value + elif p == "config2": + if merge: + self.attr.config2 |= value + else: + self.attr.config2 = value + elif p == "name": + self.name = svalue + elif p == "period": + self.attr.sample_period = value + elif p == "freq": + self.attr.sample_freq = value + elif p == "time": + if value: + self.attr.sample_type |= PERF_SAMPLE_TIME + else: + self.attr.sample_type &= ~PERF_SAMPLE_TIME + elif p == "call-graph": + self.attr.sample_type |= PERF_SAMPLE_CALLCHAIN + self.perf_call_graph = svalue + elif p == "stack-size": + self.attr.stack_user = value + elif p == "no-inherit": + self.attr.inherit = False + elif p == "inherit": + self.attr.inherit = True + else: + self.report("unexpected generic parameter: %s=%s" % (p, svalue)) + self.report("valid terms: config,config1,config2,name,period,freq") + + def is_valid(self): + if self.error_log: + return False + if self.attr.config is None: + return False + if self.attr.type is None: + return False + return True + + def report(self, s): + self.error_log.append(s) + print(s, file=sys.stderr) + + def show_raw(self): + print("Event:") + for f in self.__dict__: + print(" %15s: %s" % (f, self.__dict__[f])) + + def has_space(self, spc): + return (self.space == "") or (spc in self.space) + + def __str__(self): + """ + Return a string with a basic definition of the event. + """ + if self.attr.type is None: + return "" + if self.is_simple(): + if self.attr.type == PERF_TYPE_HW_CACHE: + s = hw_cache_event_name(self.attr.config) + if s is not None: + return s + for name in perf_event_map: + if (self.attr.type, self.attr.config) == perf_event_map[name]: + return name + if self.attr.type == PERF_TYPE_RAW: + return "r%x" % self.attr.config + pmu_name = pmu_name_by_type(self.attr.type) + if pmu_name is not None: + s = "%s/" % pmu_name + else: + s = "/type=%u," % self.attr.type + s += "config=0x%x" % (self.attr.config) + if self.attr.config1: + s += ",config1=0x%x" % (self.attr.config1) + if self.attr.config2: + s += ",config2=0x%x" % (self.attr.config2) + s += "/" + if self.cpumask: + s += " (cpumask=0x%x)" % self.cpumask + return s + + +def event(e): + return EventConfig(e) + + +def events(event_spec): + """ + Parse a list of (possibly grouped) events and return + a list of (possibly grouped) EventConfig objects. + """ + espec_groups = perf_parse.perf_parse(event_spec) + egs = [] + for g in espec_groups: + el = [event(es) for es in g] + egs.append(el) + return egs + + +def _test_perf_list_events(): + """ + Check that we recognize all the events listed by "perf list" + """ + print("Checking we recognize all 'perf list' events...") + os.system("perf list >perf_list.out") + n_tested = 0 + f = open("perf_list.out") + in_sqb = False + for ln in f: + if not ln: + continue + if ln[0] != ' ': + continue + ln = ln.strip() + if in_sqb: + if ln.find(']') >= 0: + in_sqb = False + continue + # Deal with the latter half of "perf list", which lists events together + # with detailed descriptions in square brackets, possibly split across lines. + etix = ln.find("[") + if etix >= 0 and ln.find(']') < 0: + in_sqb = True + continue + if etix >= 0: + ln = ln[:etix] + evs = ln.strip() + if not evs: + continue + if evs == "rNNN" or evs == "mem:": + # Hard-coded wildcards in "perf list" output - ignore + continue + #print("EVS: %s" % evs) + evs = evs.split(" OR ") + for (i, e) in enumerate(evs): + try: + c = event(e) + if c.is_valid(): + print(" %s -> %s" % (e, c)) + else: + print("- %s" % (e)) + except Exception: + print("failed to parse: \"%s\"" % e, file=sys.stderr) + raise + n_tested += 1 + # You'd think that if "perf list" lists an event as "x OR y", + # it would end up being the same event for perf_event_open. + # But this isn't the case. E.g. + # branch-instructions OR cpu/branch-instructions/ + # maps to + # PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS + # vs. (on x86_64): + # PERF_TYPE_RAW / 0xC4 + continue + if i == 0: + cbase = c + else: + assert str(c) == str(cbase), "%s: %s vs %s" % (ln, cbase, c) + f.close() + print("perf list test: %u tested" % n_tested) + + +def test_event(spec, **kwargs): + """ + Test an event string produces the same result as an event built from keywords. + """ + e = event(spec) # Build from the event specifier string + attr = PerfEventAttr(**kwargs) # Build from the parameters + attr._set_all_valid() + if e.attr != attr: + print("Mismatch for '%s':" % (spec)) + print(" string: %s" % (e.attr)) + print(" direct: %s" % (attr)) + + +def test(): + print("simple tests...") + e = event("instructions") + assert e.attr.type == PERF_TYPE_HARDWARE and e.attr.config == PERF_COUNT_HW_INSTRUCTIONS + e = event("r010") + assert e.attr.type == PERF_TYPE_RAW and e.attr.config == 16 + test_event("r010", type=PERF_TYPE_RAW, config=0x10) + # examples from http://www.brendangregg.com/perf.html + e = event("block:block_rq_issue") + el = events("cycles,instructions,cache-references,cache-misses,bus-cycles") + el = events("L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores") + el = event("r003c") + if pmu_exists("cpu"): + test_event("cpu/config=0x45/pp", type=PERF_TYPE_RAW, config=0x45, precise_ip=2) + el = event("cpu/event=0x0e,umask=0x01,inv,cmask=0x01/") + test_event("cpu/config2=0x123/", type=PERF_TYPE_RAW, config2=0x123) + else: + print("'cpu/xxx/' events not supported") + e = event("raw_syscalls:sys_inter") + e = event("cpu-clock") + e = event("dummy:u") + assert e.attr.type == PERF_TYPE_SOFTWARE and e.attr.config == PERF_COUNT_SW_DUMMY + e = event("cycles") + assert e.has_space("u") + e = event("cycles:k") + assert e.space == "k" + assert e.has_space("k") + assert not e.has_space("u") + e = event("cycles:u") + assert e.space == "u" + assert e.has_space("u") + assert e.attr.precise_ip == 0 + e = event("cycles:up") + assert e.space == "u" + assert e.attr.precise_ip == 1 + test_event("r01cb:pp", type=PERF_TYPE_RAW, config=0x1cb, precise_ip=2) + e = event("cache-misses:S") + assert (e.attr.sample_type & PERF_SAMPLE_READ) != 0 + el = events("{cycles,cache-misses}:S") + assert len(el[0]) == 2 + e = event("sched:sched_process_exec") + el = events("syscalls:sys_enter_accept*") + e = event("minor-faults") + e = event("probe:tcp_sendmsg") + # these don't work... is max-stack supposed to be a generic perf_event_attr field? + e = event("cpu-clock/max-stack=2/") + e = event("cs/max-stack=5/") + print("simple tests done") + e = event("INST_RETIRED.ANY") + e = event("INST_RETIRED.ANY_P") + _test_perf_list_events() + print("all tests done") + + +if __name__ == "__main__": + import sys + if len(sys.argv) > 1: + for arg in sys.argv[1:]: + if arg == "-v": + o_verbose += 1 + else: + config = event(arg) + print(config) + else: + perf_parse.test() + test() + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_parse.py b/linux_app/pmu_app/pyperf/pyperf/perf_parse.py new file mode 100644 index 00000000..8e6ce771 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_parse.py @@ -0,0 +1,119 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Parse a list of perf events as used in the -e argument to 'perf stat'. + +The output is a list of lists. Each item in the top-level list is a group +of events to be monitored concurrently, corresponding to the +curly braces specification in -e. If there are no groups in the input, +the output is a list of singleton lists. + +This module deals only with syntax. It does not validate or resolve +the event strings against the events exposed in sysfs. + +In particular, this module does not expand wildcarded event names. +Singletons in the list may become multiples after expansion. +""" + +from __future__ import print_function + +def perf_parse(s): + if not s: + return [] + if s[0] == ',': + return perf_parse(s[1:]) + if s[0] == '{': + kix = s.find('}') + assert kix >= 0, "%s: missing closing brace" % s + # we could also check that kix is followed by comma or EOS or a suffix valid for a group + group = perf_parse(s[1:kix]) + suffix = "" + if s[kix+1:].startswith(':'): + # there's a suffix for the whole group: capture it and apply it to each event + cix = s[kix+1].find(",") + if cix >= 0: + suffix = s[kix+1:kix+1+cix] + kix += cix + else: + suffix = s[kix+1:] + kix += len(suffix) + assert suffix.startswith(":") + def flatten(x, suffix): + for sublist in x: + for item in sublist: + yield item + suffix + return [list(flatten(group, suffix))] + perf_parse(s[kix+1:]) + cix = s.find(",") + six = s.find("/") + if six >= 0 and (cix < 0 or six < cix): + # next token has an opening slash - look for the closing slash + csix = s[six+1:].find("/") + assert csix >= 0, "%s: missing trailing slash" % s + csix += six + 1 + cix = s[csix+1:].find(",") + if cix >= 0: + cix += csix + 1 + if cix < 0: + # only one item left + return [[s]] + return [[s[:cix]]] + perf_parse(s[cix+1:]) + + + +""" +Unit tests +""" + +def test_perf_parse(s, ls_expected): + try: + ls_got = perf_parse(s) + except Exception: + if ls_expected is not None: + print("failed: %s -> Exception" % s) + return + assert ls_got == ls_expected, "failed: %s -> %s, expected %s" % (s, ls_got, ls_expected) + + +perf_parse_tests = [ + ( "", [] ), + ( "a", [["a"]] ), + ( "a,", [["a"]] ), + ( "a,b", [["a"], ["b"]] ), + ( "{a,b}", [["a","b"]] ), + ( "{cyc,cyc}", [["cyc","cyc"]] ), + ( "{a,b},c", [["a","b"], ["c"]] ), + ( "{a,b},{c,d}", [["a","b"], ["c","d"]] ), + ( "a,,b", [["a"], ["b"]] ), + ( "a,b/c,d/,e", [["a"], ["b/c,d/"], ["e"]] ), + ( "a,b/cd/,e", [["a"], ["b/cd/"], ["e"]] ), + ( "a,b/c,d/m,e", [["a"], ["b/c,d/m"], ["e"]] ), + ( "a,b/cd/m,e", [["a"], ["b/cd/m"], ["e"]] ), + ( "a:u,b:k", [["a:u"], ["b:k"]] ), + ( "{a,b}:S", [["a:S", "b:S"]] ), # TBD is this the right thing to do? + # broken cases + ( "{a", None ), +# ( "a}", None ), + ( "a,b/c,d", None ), +] + + +def test(): + for (s,ls) in perf_parse_tests: + test_perf_parse(s,ls) + +if __name__ == "__main__": + test() + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py b/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py new file mode 100644 index 00000000..4843a9ae --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py @@ -0,0 +1,251 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This module interfaces to the PMU event descriptions in sysfs. +""" + +from __future__ import print_function + +import perf_util as utils + +import os + +sysfs_pmus_dir = "/sys/bus/event_source/devices" + +def debugfs_dir(): + debugfs = "/sys/kernel/debug" + assert os.path.isdir(debugfs) + return debugfs + + +def _file_scale(fn): + """ + Read a scale factor. This may be a floating-point number, e.g. for converting power readings. + """ + s = utils.file_word(fn) + try: + n = int(s, 0) + except ValueError: + n = float(s) + return n + + +def field_values(s): + """ + Iterate through an event specifier of the form "a=v,b=w" + """ + if s: + for f in s.split(','): + if f.find('=') > 0: + (field, value) = f.split('=') + else: + field = f + value = None + yield (field, value) + + +assert list(field_values("")) == [] +assert list(field_values("a=123,e=?,c,b=0x2")) == [("a","123"),("e","?"),("c",None),("b","0x2")] + + +def pmu_exists(pmu_name): + # Test whether a PMU exists e.g. "cpu", "software", "cs_etm". + return os.path.exists(os.path.join(sysfs_pmus_dir, pmu_name)) + + +class SysPMU(object): + """ + Describes a "PMU" in the kernel sense - corresponding to a value of perf_event_attr.type. + Standard PMUs include: + "software": PERF_TYPE_SOFTWARE + "tracepoint": PERF_TYPE_TRACEPOINT + "cpu": PERF_TYPE_RAW # possibly not on Arm big.LITTLE + """ + def __init__(self, name): + self.pmu_name = name + self.pmu_dir = os.path.join(sysfs_pmus_dir, name) + self.events_dir = os.path.join(self.pmu_dir, "events") + self.format_dir = os.path.join(self.pmu_dir, "format") + + @property + def type(self): + return utils.file_int(os.path.join(self.pmu_dir, "type")) + + def field_names(self): + if os.path.isdir(self.format_dir): + return os.listdir(self.format_dir) + else: + return [] + + def field_format(self, field): + # Get the destination of a field: something like "config:0-7" + format_file = os.path.join(self.format_dir, field) + if os.path.isfile(format_file): + format = utils.file_word(format_file) + (attr, pos) = format.split(':') + assert attr in ["config", "config1", "config2"] + return (attr, pos) + else: + return None + + def cpumask(self): + # Some PMUs must have their events opened on specific CPUs. + cpumask_file = os.path.join(self.pmu_dir, "cpumask") + if os.path.isfile(cpumask_file): + return utils.cpusetstr_mask(utils.file_word(cpumask_file)) + else: + return None + + @property + def nr_addr_filters(self): + try: + return utils.file_int(os.path.join(self.pmu_dir, "nr_addr_filters")) + except IOError: + return 0 + + def has_named_events(self): + return os.path.isdir(self.events_dir) + + def event_names(self): + if os.path.isdir(self.events_dir): + for p in os.listdir(self.events_dir): + if not (p.endswith(".scale") or p.endswith(".unit")): + yield p + else: + pass # do not yield anything + + def event_specifier(self, event_name): + """ + The event specifier is a string assigning values to event fields defined for this PMU. + E.g. "a=1,b=2" where a and b are named fields. + The special syntax "a=?" indicates that the user must specify a value for "a". + """ + event_file = os.path.join(self.events_dir, event_name) + if os.path.isfile(event_file): + return utils.file_word(event_file) + else: + return None + + def event_scale(self, event_name): + event_scale_file = os.path.join(self.events_dir, event_name + ".scale") + if os.path.isfile(event_scale_file): + return _file_scale(event_scale_file) + else: + return None + + def event_unit(self, event_name): + event_unit_file = os.path.join(self.events_dir, event_name + ".unit") + if os.path.isfile(event_unit_file): + return utils.file_word(event_unit_file) + else: + return None + + +def system_pmu_type(pmu_name): + """ + Given a PMU name like "cpu", "cs_etm", "software", return the type number. + Return None if this is not a valid PMU name. + """ + if pmu_exists(pmu_name): + return SysPMU(pmu_name).type + else: + return None + + +def system_pmu_names(sorted_by_type=False): + if sorted_by_type: + m = {} + for pmu_name in system_pmu_names(): + m[system_pmu_type(pmu_name)] = pmu_name + for pmu_type in sorted(m.keys()): + yield m[pmu_type] + else: + for pmu_name in os.listdir(sysfs_pmus_dir): + yield pmu_name + + +def pmu_name_by_type(n): + for pmu_name in system_pmu_names(): + if SysPMU(pmu_name).type == n: + return pmu_name + return None + + +def tracepoint_group_dir(egroup): + events = debugfs_dir() + "/tracing/events" + egdir = "%s/%s" % (events, egroup) + if not os.path.isdir(egdir): + return None + return egdir + + +def tracepoint_id(egroup, event=None): + evid = None + if event is None: + ix = egroup.index(':') + event = egroup[ix+1:] + egroup = egroup[:ix] + edir = "%s/%s" % (tracepoint_group_dir(egroup), event) + if os.path.isdir(edir): + evid = int(utils.file_str(edir + "/id")) + return evid + + +def test(): + if pmu_exists("cpu"): + assert system_pmu_type("cpu") == 4 # PERF_TYPE_RAW + assert pmu_name_by_type(4) == "cpu" + else: + pass # likely Arm big.LITTLE + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="test finding PMU info from sysfs") + parser.add_argument("--detail", action="store_true", help="show details one per line") + opts = parser.parse_args() + for pmu_name in system_pmu_names(sorted_by_type=True): + P = SysPMU(pmu_name) + print("%2u: %-20s in %s" % (P.type, P.pmu_name, P.pmu_dir)) + cpumask = P.cpumask() + if cpumask is not None: + print(" CPU mask: %s" % utils.mask_cpusetstr(cpumask)) + if P.nr_addr_filters: + print(" Address filters: %u" % P.nr_addr_filters) + if P.field_names(): + if opts.detail: + print(" Fields:") + for field_name in P.field_names(): + print(" %24s: %s" % (field_name, P.field_format(field_name))) + else: + print(" Fields: %s" % (','.join(P.field_names()))) + if P.has_named_events(): + if opts.detail: + print(" Named events:") + for event_name in P.event_names(): + es = P.event_specifier(event_name) + print(" %24s: %s" % (event_name, es), end="") + s = P.event_scale(event_name) + if s is not None: + print(" *%s" % s, end="") + u = P.event_unit(event_name) + if u is not None: + print(" %s" % u, end="") + print() + else: + print(" Named events: %s" % (','.join(P.event_names()))) + test() + diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_util.py b/linux_app/pmu_app/pyperf/pyperf/perf_util.py new file mode 100644 index 00000000..d7908c11 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_util.py @@ -0,0 +1,282 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Utility routines for various perf-related tools. + +Mostly related to string conversion, e.g. + - memory sizes, like "64K" + - CPU lists, like "1-3,5" +""" + +from __future__ import print_function + +import os + + +def str_memsize(s): + """ + Turn "2K" into 2048. + Can be used with 'type=' in argparse. + """ + assert s != "" + if s[-1] in "bB": + s = s[:-1] + if s.endswith("K"): + return int(float(s[:-1])*1024) + if s.endswith("M"): + return int(float(s[:-1])*1024*1024) + if s.endswith("G"): + return int(float(s[:-1])*1024*1024*1024) + if s.endswith("T"): + return int(float(s[:-1])*1024*1024*1024*1024) + return int(s) + + +assert str_memsize("2K") == 2048 +assert str_memsize("1.5K") == 1536 + + +def memsize_str(n, B="", unit=None): + """ + Turn 2048 into "2K" + We print fractional values as floating-point, but expect + them to be a small number of decimal places. This is + basically aimed at printing round values like cache sizes. + """ + fmt = "%g" + if unit == "T" or (unit is None and n >= 1024*1024*1024*1024): + s = (fmt + "T") % (n/1024.0/1024/1024/1024) + elif unit == "G" or (unit is None and n >= 1024*1024*1024): + s = (fmt + "G") % (n/1024.0/1024/1024) + elif unit == "M" or (unit is None and n >= 1024*1024): + s = (fmt + "M") % (n/1024.0/1024) + elif unit == "K" or (unit is None and n >= 1024): + s = (fmt + "K") % (n/1024.0) + else: + if not B: + B = "b" + s = "%u" % (n) + s = s + B + return s + + +assert memsize_str(0) == "0b" +assert memsize_str(1) == "1b" +assert memsize_str(2048) == "2K" +assert memsize_str(1536) == "1.5K" +assert memsize_str(2048*1024, "B") == "2MB" +assert memsize_str(2048*1024, unit="K") == "2048K" + +def test_memsize(): + import random + for i in range(10000): + se = random.randrange(10000) + sl = random.randrange(12) + m = se << sl + ms = memsize_str(m) + sm = str_memsize(ms) + if sm != m: + d = (float(sm) / float(m)) + assert d >= 0.999 and d <= 1.001, "mem fail: %u -> \"%s\" -> %u" % (m, ms, sm) + + +def intmask_list(n): + """ + Given an integer mask, return a list of numbers in + ascending order, corresponding to the bits set. + """ + c = [] + for i in range(0, 1000): + if (n & (1<= 1: + stride = 1 + if allow_stride: + strix = s.find(':') + if strix != -1: + stride = int(s[strix+1:]) + s = s[:strix] + [a,b] = s.split('-') + for c in range(int(a),int(b)+1,stride): + yield int(c) + else: + yield int(s) + + +def cpusetstr_list(arg, allow_stride=True): + """ + Given a string specifying a set of CPUs, return the list, + in the original order, and possibly with duplicates. + """ + return list(cpusetstr_iter(arg, allow_stride=allow_stride)) + + +def cpusetstr_mask(arg, allow_stride=True): + """ + Given a string specifying a set of CPUs, return the mask. + """ + cpumask = 0 + for cpu in cpusetstr_iter(arg, allow_stride=allow_stride): + cpumask |= (1 << cpu) + return cpumask + + +assert cpusetstr_mask("3") == 0x08 +assert cpusetstr_mask("1-2,4") == 0x16 +assert cpusetstr_mask("0-31:2") == 0x55555555 + + +def mask_cpusetstr(m): + """ + Turn a CPU mask back into a list. + This should match the rendering of shared_cpu_list in the + sysfs cache topology area. + """ + if m == 0: + return "" + s = "" + i = 0 + while m >= (1 << i): + if (m & (1 << i)) != 0: + if s: + s += "," + s += "%u" % i + if (m & (1 << (i+1))) != 0: + s += "-" + while (m & (1 << i)) != 0: + i += 1 + s += "%u" % (i-1) + else: + i += 1 + else: + i += 1 + return s + + +assert mask_cpusetstr(0x00) == "" +assert mask_cpusetstr(0x01) == "0" +assert mask_cpusetstr(0x16) == "1-2,4" + + +def list_cpusetstr(l): + return mask_cpusetstr(intlist_mask(l)) + +assert list_cpusetstr([]) == "" +assert list_cpusetstr([2,4,8,1,3]) == "1-4,8" + + +def file_str(fn): + """ + For reading sysfs. Return the contents of a file. + """ + with open(fn, "r") as f: + return f.read() + + +def file_word(fn): + """ + For reading sysfs. Return file contents as a stripped token. + """ + return file_str(fn).strip() + + +def file_int(fn): + """ + For reading sysfs. Return integer from a file where it's represented as decimal. + """ + w = file_word(fn) + try: + return int(w) + except ValueError: + assert False, "%s: bad integer value '%s'" % (fn, w) + return None + + +def file_hex(fn): + """ + For reading sysfs. Return integer from a file where it's represented as hex. + """ + w = file_word(fn) + try: + w = ''.join(w.split(',')) + return int(w, 16) + except ValueError: + assert False, "%s: bad hex value '%s'" % (fn, w) + return None + + +def sysctl(p): + """ + Return the value of a system parameter - as a string. + E.g. + sysctl("kernel/osversion") + int(sysctl("kernel/perf_event_paranoid")) + """ + return file_word("/proc/sys/" + p) + + +def pid_tids(pid): + """ + Given a process, get the list of its threads, including itself. + If called with a subthread id, we could either return the list of + the owning process, or we could just return the subthread id as + a singleton. Currently we return the whole list. + """ + def gettgid(tid): + stat = file_str("/proc/%u/status" % tid).split('\n') + assert stat[2].startswith("Tgid:") + tgid = int(stat[2].split()[1].strip()) + return tgid + ls = [] + for d in os.listdir("/proc/%u/task" % pid): + tid = int(d) + ls.append(tid) + return ls + + +if __name__ == "__main__": + import sys + test_memsize() + if len(sys.argv) >= 3 and sys.argv[1] == "tids": + pid = int(sys.argv[2]) + print("process %u tids %s" % (pid, pid_tids(pid))) diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py b/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py new file mode 100644 index 00000000..579f66e1 --- /dev/null +++ b/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py @@ -0,0 +1,151 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Wrap libzstd to decode compressed perf.data files. + +We tried the zstd and zstandard modules, and neither handled the compressed +records in perf.data files. +""" + +from __future__ import print_function + +from ctypes import * + + +class ZSTD_inBuffer(Structure): + _fields_ = [("src", c_void_p), ("size", c_size_t), ("pos", c_size_t)] + + +class ZSTD_outBuffer(Structure): + _fields_ = [("dst", c_void_p), ("size", c_size_t), ("pos", c_size_t)] + + +class ZDS: + def __init__(self, Z): + self.Z = Z + self.ds = Z.createDStream() + Z.initDStream(self.ds) + + def processStream(self, output, input): + assert isinstance(input, ZSTD_inBuffer) + assert isinstance(output, ZSTD_outBuffer) + return self.Z.decompressStream(self.ds, addressof(output), addressof(input)) + + def endStream(self, output): + pass + + def __del__(self): + self.Z.freeDStream(self.ds) + + +class ZCS: + def __init__(self, Z): + self.Z = Z + self.cs = Z.createCStream() + Z.initCStream(self.cs) + + def processStream(self, output, input): + assert isinstance(input, ZSTD_inBuffer) + assert isinstance(output, ZSTD_outBuffer) + return self.Z.compressStream(self.cs, addressof(output), addressof(input)) + + def endStream(self, output): + return self.Z.endStream(self.cs, addressof(output)) + + def __del__(self): + self.Z.freeCStream(self.cs) + + +class ZSTD: + """ + Wrap selected functions from the libzstd library + """ + def __init__(self): + self.Z = CDLL("libzstd.so") + self.isError = self.Z.ZSTD_isError + self.isError.argtypes = [c_size_t] + self.isError.restype = c_int + self.createCStream = self.Z.ZSTD_createCStream + self.createCStream.restype = c_void_p + self.createDStream = self.Z.ZSTD_createDStream + self.createDStream.restype = c_void_p + self.initCStream = self.Z.ZSTD_initCStream + self.initCStream.argtypes = [c_void_p] + self.initDStream = self.Z.ZSTD_initDStream + self.initDStream.argtypes = [c_void_p] + self.compressStream = self.Z.ZSTD_compressStream + self.compressStream.argtypes = [c_void_p, c_void_p, c_void_p] + self.compressStream.restype = c_size_t + self.decompressStream = self.Z.ZSTD_decompressStream + self.decompressStream.argtypes = [c_void_p, c_void_p, c_void_p] + self.decompressStream.restype = c_size_t + self.endStream = self.Z.ZSTD_endStream + self.endStream.argtypes = [c_void_p, c_void_p] + self.endStream.restype = c_size_t + self.freeCStream = self.Z.ZSTD_freeCStream + self.freeCStream.argtypes = [c_void_p] + self.freeDStream = self.Z.ZSTD_freeDStream + self.freeDStream.argtypes = [c_void_p] + + def decompress(self, src, ratio=10, compress=False): + src_buf = create_string_buffer(src) + input = ZSTD_inBuffer() + input.src = addressof(src_buf) + input.size = len(src) + input.pos = 0 + dst_size = max(64, len(src) * ratio) + dst = create_string_buffer(dst_size) + output = ZSTD_outBuffer() + output.dst = addressof(dst) + output.size = dst_size + output.pos = 0 + if compress: + s = ZCS(self) + else: + s = ZDS(self) + while input.pos < input.size: + rc = s.processStream(output, input) + if self.isError(rc): + assert False, "error in (de)compressStream" + output.dst = addressof(dst) + output.pos + output.size = dst_size - output.pos + s.endStream(output) + return bytes(dst.raw[:output.pos]) + + def compress(self, src): + return self.decompress(src, ratio=1.1, compress=True) + + +g_ZSTD = ZSTD() + +def decompress(src, ratio=10): + return g_ZSTD.decompress(src, ratio=ratio) + +def compress(src): + return g_ZSTD.compress(src) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="test the libzstd wrapper") + parser.add_argument("text", type=str, nargs="+", help="text to decompress") + opts = parser.parse_args() + for s in opts.text: + print("%u -> " % (len(s)), end="") + x = compress(bytes(s)) + print("%u -> " % (len(x)), end="") + d = decompress(x) + print("%u" % (len(d))) diff --git a/linux_app/pmu_app/pyperf/setup.py b/linux_app/pmu_app/pyperf/setup.py new file mode 100644 index 00000000..ff6ef31a --- /dev/null +++ b/linux_app/pmu_app/pyperf/setup.py @@ -0,0 +1,30 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#from setuptools import setup +from distutils.core import setup, Extension + +setup( + name='PyPerf', + author='Al Grant', + author_email='al.grant@arm.com', + packages=['pyperf'], + ext_package='pyperf', + ext_modules=[ + Extension('perf_events', ['src/pyperf_events.c'], extra_compile_args=['-Wall']) + ], + license='Apache 2.0', + description='Python interface to Linux perf events' +) diff --git a/linux_app/pmu_app/pyperf/src/NOTES.txt b/linux_app/pmu_app/pyperf/src/NOTES.txt new file mode 100644 index 00000000..e751b8c3 --- /dev/null +++ b/linux_app/pmu_app/pyperf/src/NOTES.txt @@ -0,0 +1,40 @@ +The code for reading events is complicated. +We have to cope with several cases: + + - reading an event using a read() system call on an event descriptor + - reading a sample out of an mmap() buffer + - reading an event using userspace-readable hardware counters + - reading a group of events in a single action + - returning the difference between the current event values + and values taken at the last reset (see comment at event_reset) + +From the user point of view, the interface is as follows: + + - Event::read() creates and returns a Reading or GroupReading object, + depending on whether the event was opened with PERF_FORMAT_GROUP + + - Record::reading() creates and returns a Reading or GroupReading object + from a sample embedded in a Record of type PERF_RECORD_SAMPLE. + +Internally: + + - event_read(e) + - take_reading(e,NULL) + - allocate reading object r (Reading or GroupReading) + - perf_read_count(r) + - perf_read_count_userspace if possible + - read metadata from mmap page and use rdpmc/mrs + - perf_read_count_using_read otherwise + - read(e->fd) to call the kernel + - for a group, this gets all the readings + - postprocess_reading + + + - data for a single event (a single counter, possibly with + time_enabled/time_running) is captured in event_sample_t + + +-------------- + +*Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.* + diff --git a/linux_app/pmu_app/pyperf/src/pyperf_events.c b/linux_app/pmu_app/pyperf/src/pyperf_events.c new file mode 100644 index 00000000..3fca4569 --- /dev/null +++ b/linux_app/pmu_app/pyperf/src/pyperf_events.c @@ -0,0 +1,3261 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#ifndef MODULE_NAME +#define MODULE_NAME perf_events +#endif /* !MODULE_NAME */ + +#define MODULE_NAME_STRING3(m) #m +#define MODULE_NAME_STRING2(m) MODULE_NAME_STRING3(m) +#define MODULE_NAME_STRING MODULE_NAME_STRING2(MODULE_NAME) + +#include + +#if PY_MAJOR_VERSION < 3 +/* Provide a function that can create a byte array (whose elements are 'int') + * Some recent Python2 defines PyBytes_FromStringAndSize as an alias of + * PyString_FromStringAndSize but this isn't suitable. */ +#define MyBytes_FromStringAndSize PyByteArray_FromStringAndSize +#define MyBytes_AsString PyByteArray_AsString +#else +/* Python3. Emulate some Python2 API. */ +#define MyBytes_FromStringAndSize PyBytes_FromStringAndSize +#define MyBytes_AsString PyBytes_AsString +#define PyString_FromFormat PyUnicode_FromFormat +#define PyString_AsString PyUnicode_AsUTF8 +#define PyInt_FromLong PyLong_FromLong +#endif +#include + +#include +#include +#include +#include +#include +#include +#include + +/* +Include the system header that defines the layout of the structure passed +to perf_event_open. This must match the kernel version! +*/ +#include +#ifndef PERF_NO_BREAKPOINTS +#include +#endif /* !PERF_NO_BREAKPOINTS */ +#ifndef PERF_AUX_FLAG_COLLISION +#define PERF_AUX_FLAG_COLLISION 0x08 +#endif /* !PERF_AUX_FLAG_COLLISION */ + +#include +#include +#include +#include + + +#define PRINTF_DIAGNOSTICS + + +/* + * Wrap the magic syscall. + */ +static int perf_event_open(struct perf_event_attr *attr, + pid_t pid, int cpu, int group_fd, + unsigned long flags) +{ + return syscall(__NR_perf_event_open, attr, (int)pid, (int)cpu, (int)group_fd, (int)flags); +} + + +#define PERF_FLAG_READ_USERSPACE 0x80000000 /* Read counters from userspace when possible */ +#define PERF_FLAG_NO_READ_USERSPACE 0x40000000 /* Never read counters from userspace */ +#define PERF_FLAG_WEAK_GROUP 0x20000000 /* Fall back to non-membership */ + + +/* + * Format of the data read using the read() call. + * This is determined by the read_format field when the event is opened. + * Now that we handle different values of read_format, this is not + * directly read by the read call. + */ +typedef struct { + unsigned long long value; /* This is reset when we call reset() */ + unsigned long long time_enabled; /* These aren't */ + unsigned long long time_running; + unsigned long long id; +} event_sample_t; + + +/* + * Capability flags, in case not defined individually + */ +const unsigned int _cap_user_rdpmc = 0x04; +const unsigned int _cap_user_time = 0x08; +const unsigned int _cap_user_time_zero = 0x10; + + +/* + * Python object corresponding to a perf event source - i.e. something + * that we've got as a result of a perf_event_open call. + */ +typedef struct event_object_s EventObject; +struct event_object_s { + PyObject_HEAD + struct perf_event_attr attr; /* kernel perf's info about the event */ + int cpu; /* cpu that this event is bound to, or -1 if all-cpu */ + //int pid; /* PID that this event is bound to, or -1 if system-wide */ + int fd; /* file handle from perf_event_open: unique to this event */ + unsigned long long id; /* event unique identifier */ + int verbose; /* -vv or similar was used */ + int try_userspace_read:1; /* try reading from userspace rather than read() */ + EventObject *group_leader; /* group leader, or NULL */ + EventObject *buffer_owner; /* buffer owner (even if we're not in a group) */ + EventObject *next_sub; /* subordinate event, or NULL */ + unsigned short sample_id_bytes; /* in sample records, no. of trailing bytes for the sample_id */ + /* Data to support collecting individual perf events */ + struct perf_event_mmap_page *mmap_page; + unsigned long mmap_size; /* total size of the area, including header page */ + unsigned long mmap_data_size; /* data size, exclusive of header page */ +#define MMAP_DATA_SIZE_DEFAULT ((unsigned long)(-1)) + unsigned char *mmap_data_start; /* start of data in the allocated area */ + unsigned char *mmap_data_end; /* end of the allocated area */ + unsigned char *mmap_cursor; /* current position in the area */ + int need_aux; /* set if event type needs AUX area */ + void *aux_area; /* AUX area e.g. for h/w trace */ + unsigned long aux_size; /* total size of aux area (or 0) */ + /* We want reset() to start a new measurement window, after which we + can read the event's value and also find out what percentage of + time it was running for. But PERF_EVENT_IOC_RESET doesn't reset + the enabled and running measurements. So instead we have to save + the values at the start of the window. */ + PyObject *datasnap; +}; + + +/* + * Base class for either a reading or a group reading. + */ +typedef struct { + PyObject_HEAD + EventObject *event; + event_sample_t sample; + double fraction_running; +} BaseReadingObject; + +static PyTypeObject BaseReadingType; + + +/* + * A single counter reading. This is either from a non-group event, or as a + * member of a group event reading. + */ +typedef struct { + BaseReadingObject base; + PyObject *adjusted_value; +} ReadingObject; + +static PyTypeObject ReadingType; + + +/* + * Reading from a group leader, with data from multiple events. + */ +typedef struct { + BaseReadingObject base; + unsigned int n_values; + event_sample_t *samples; +} GroupReadingObject; + +static PyTypeObject GroupReadingType; + + +/* + * Time conversion parameters + */ +typedef struct { + PyObject_HEAD + unsigned long time_zero; + unsigned long time_mult; + unsigned long time_shift; +} TimeConvObject; + +static PyTypeObject TimeConvType; + + +/* + * Map from fileno to Event object - useful when using select, poll etc. + * We don't use a Python dict as we don't want this to act as a reference. + */ +static PyObject **fileno_events = NULL; +static unsigned int n_fileno_events = 0; + +/* + * Insert a file handle into the array. + * We assume file handles are small integers and we can directly index into an array. + */ +static void fileno_event_insert(int fd, EventObject *e) +{ + assert(e != NULL); + assert(fd >= 0); + if ((unsigned int)fd >= n_fileno_events) { + if (n_fileno_events == 0) { + n_fileno_events = 32; + fileno_events = (PyObject **)calloc(n_fileno_events, sizeof(PyObject *)); + } else { + unsigned int nn = n_fileno_events * 4; + fileno_events = (PyObject **)realloc(fileno_events, nn*sizeof(PyObject *)); + memset(fileno_events + n_fileno_events, 0, (nn-n_fileno_events)*sizeof(PyObject *)); + n_fileno_events = nn; + } + } + assert(fileno_events[fd] == NULL); + fileno_events[fd] = (PyObject *)e; +} + + +static PyObject *event_new(PyTypeObject *t, PyObject *args, PyObject *kwds) +{ + EventObject *e = (EventObject *)t->tp_alloc(t, 0); + assert(e != NULL); + //memset(&e->attr, 0, sizeof(EventObject) - offsetof(EventObject, attr)); + /* All fields that might be referred to in dealloc must be initialized early, + but we are guaranteed that the block returned by tp_alloc is zero-initialized. */ + e->fd = -1; + e->mmap_data_size = MMAP_DATA_SIZE_DEFAULT; + e->mmap_page = NULL; + e->group_leader = NULL; + e->buffer_owner = NULL; + e->next_sub = NULL; + e->aux_size = MMAP_DATA_SIZE_DEFAULT; + e->datasnap = NULL; + return (PyObject *)e; +} + + +/* + * Calculate the size of the sample_id structure that follows the record-specific + * data when sample_id_all is set. + * This is similar in principle to the initial part of a PERF_RECORD_SAMPLE payload, + * but differs in detail as regards the ordering and selection of fields. + * In particular PERF_SAMPLE_IDENTIFIER puts the identifier first in the + * PERF_RECORD_SAMPLE payload, but last in the sample_id structure. + */ +static unsigned int perf_event_attr_sample_id_size(struct perf_event_attr const *a) +{ + unsigned int size = 0; + if (!a->sample_id_all) { + return 0; + } + if (a->sample_type & PERF_SAMPLE_TID) { + size += 4+4; + } + if (a->sample_type & PERF_SAMPLE_TIME) { + size += 8; + } + if (a->sample_type & PERF_SAMPLE_ID) { + size += 8; + } + if (a->sample_type & PERF_SAMPLE_STREAM_ID) { + size += 8; + } + if (a->sample_type & PERF_SAMPLE_CPU) { + size += 8; + } + if (a->sample_type & PERF_SAMPLE_IDENTIFIER) { + size += 8; + } + return size; +} + + +/* + * Find the offset, in a sample record, of the PERF_SAMPLE_READ data. + * We rely on there being no variable-length (data-dependent) + * items before this data - all the preceding items have sizes + * fixed at event configuration time. + */ +static unsigned int sample_offset_to_read(struct perf_event_attr const *e) +{ + unsigned int rdata_calc = 0; + if (e->sample_type & PERF_SAMPLE_IDENTIFIER) { + rdata_calc += 8; + } + if (e->sample_type & PERF_SAMPLE_IP) { + rdata_calc += 8; + } + if (e->sample_type & PERF_SAMPLE_TID) { + rdata_calc += 4+4; + } + if (e->sample_type & PERF_SAMPLE_TIME) { + rdata_calc += 8; + } + if (e->sample_type & PERF_SAMPLE_ADDR) { + rdata_calc += 8; + } + if (e->sample_type & PERF_SAMPLE_ID) { + rdata_calc += 8; + } + if (e->sample_type & PERF_SAMPLE_STREAM_ID) { + rdata_calc += 8; + } + if (e->sample_type & PERF_SAMPLE_CPU) { + rdata_calc += 4+4; + } + if (e->sample_type & PERF_SAMPLE_PERIOD) { + rdata_calc += 8; + } +#if defined(PERF_SAMPLE_DATA_SRC) || !defined(PERF_RECORD_MMAP) + if (e->sample_type & PERF_SAMPLE_DATA_SRC) { + rdata_calc += 8; + } +#endif +#if defined(PERF_SAMPLE_PHYS_ADDR) || !defined(PERF_RECORD_MMAP) + if (e->sample_type & PERF_SAMPLE_PHYS_ADDR) { + rdata_calc += 8; + } +#endif + /* PERF_DATA_READ data follows. Other data types (CALLCHAIN, TRANSACTION etc.) may follow that. */ + return rdata_calc; +} + + +static int perf_reading_size(EventObject const *e) +{ + int size; + if (e->attr.read_format & PERF_FORMAT_GROUP) { + /* Total size is unknown. */ + size = 8; /* Number of values */ + /* Plus 8 or 16 bytes per value, depending on PERF_FORMAT_ID */ + } else { + size = 8; /* value */ + if (e->attr.read_format & PERF_FORMAT_ID) { + size += 8; + } + } + if (e->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { + size += 8; + } + if (e->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) { + size += 8; + } + return size; +} + + +static int perf_reading_size_group(EventObject const *e, unsigned int n) +{ + int size = perf_reading_size(e); + size += (n * 8); + if (e->attr.read_format & PERF_FORMAT_ID) { + size += (n * 8); + } + return size; +} + + +/* + * Return the standard per-CPU buffer allocation, from /proc/sys/kernel/perf_event_mlock_kb + */ +static unsigned int perf_event_mlock_size(void); + + +#ifdef PRINTF_DIAGNOSTICS +typedef struct { + char const *name; + unsigned int value; +} flagnames_t; + +static void fprint_flags(FILE *fd, unsigned long flags, flagnames_t const *flagnames, unsigned int n) +{ + unsigned int i; + for (i = 0; i < n; ++i) { + if (flags & flagnames[i].value) { + fprintf(fd, "%s", flagnames[i].name); + flags &= ~flagnames[i].value; + if (flags) fprintf(fd, "|"); + } + } + if (flags) { + fprintf(fd, "%#lx", flags); + } +} + +/* flag names, see /usr/include/linux/perf_event.h */ +static flagnames_t const sample_flagnames[] = { +#define FLAG(x) { #x, PERF_SAMPLE_##x } + FLAG(IDENTIFIER), + FLAG(IP), + FLAG(TID), + FLAG(TIME), + FLAG(ADDR), + FLAG(READ), + FLAG(CALLCHAIN), + FLAG(ID), + FLAG(CPU), + FLAG(PERIOD), + FLAG(STREAM_ID), + FLAG(RAW), + FLAG(BRANCH_STACK), + FLAG(REGS_USER), + FLAG(STACK_USER), +#if defined(PERF_SAMPLE_DATA_SRC) || !defined(PERF_RECORD_MMAP) + FLAG(DATA_SRC), +#endif +#if defined(PERF_SAMPLE_PHYS_ADDR) || !defined(PERF_RECORD_MMAP) + FLAG(PHYS_ADDR), +#endif +#undef FLAG +}; + +#define FLAG_NAMES(x) x, sizeof(x)/sizeof(x[0]) + +static void fprint_perf_event_attr(FILE *fd, struct perf_event_attr const *a) +{ + fprintf(fd, "perf_event_attr:\n"); + fprintf(fd, " type %d\n", a->type); + fprintf(fd, " size %d\n", a->size); + fprintf(fd, " config %#llx\n", (unsigned long long)a->config); + if (a->sample_period != 0) { + fprintf(fd, " { sample_period, sample_freq } %lu\n", (unsigned long)a->sample_period); + } + if (a->sample_type != 0) { + /* Show combination of PERF_SAMPLE_XXX flags */ + fprintf(fd, " sample_type: "); + fprint_flags(fd, a->sample_type, FLAG_NAMES(sample_flagnames)); + fprintf(fd, "\n"); + } + if (a->read_format != 0) { + /* Show combination of PERF_FORMAT_XXX flags */ + /* flag names, see /usr/include/linux/perf_event.h */ + static flagnames_t const flagnames[] = { +#define FLAG(x) { #x, PERF_FORMAT_##x } + FLAG(TOTAL_TIME_ENABLED), + FLAG(TOTAL_TIME_RUNNING), + FLAG(ID), + FLAG(GROUP) +#undef FLAG + }; + fprintf(fd, " read_format "); + fprint_flags(fd, a->read_format, FLAG_NAMES(flagnames)); + fprintf(fd, "\n"); + } + fprintf(fd, " disabled %d inherit %d\n", a->disabled, a->inherit); + fprintf(fd, " pinned %d exclusive %d\n", a->pinned, a->exclusive); + fprintf(fd, " exclude_user %d exclude_kernel %d\n", a->exclude_user, a->exclude_kernel); + fprintf(fd, " exclude_hv %d exclude_idle %d\n", a->exclude_hv, a->exclude_idle); + fprintf(fd, " enable_on_exec %d task %d\n", a->enable_on_exec, a->task); + fprintf(fd, " exclude_host %d exclude_guest %d\n", a->exclude_host, a->exclude_guest); +#ifdef PERF_RECORD_MISC_COMM_EXEC + if (a->comm || a->comm_exec) { + fprintf(fd, " comm %d comm_exec %d\n", a->comm, a->comm_exec); + } +#else + if (a->comm) { + fprintf(fd, " comm %d\n", a->comm); + } +#endif + if (a->precise_ip) { + fprintf(fd, " precise_ip %d\n", a->precise_ip); + } + if (a->freq) { + fprintf(fd, " freq %d\n", a->freq); + } + if (a->sample_id_all) { + fprintf(fd, " sample_id_all %d\n", a->sample_id_all); + } + if (a->inherit_stat) { + fprintf(fd, " inherit_stat %d\n", a->inherit_stat); + } + fprintf(fd, " bp_type %#x\n", a->bp_type); + if (a->type != PERF_TYPE_BREAKPOINT) { + if (a->config1) { + fprintf(fd, " config1 %#llx\n", a->config1); + } + if (a->config2) { + fprintf(fd, " config2 %#llx\n", a->config2); + } + } else { + fprintf(fd, " bp_addr %#llx\n", a->bp_addr); + fprintf(fd, " bp_len %#llx\n", a->bp_len); + } + fprintf(fd, " mmap %d\n", a->mmap); + fprintf(fd, " mmap2 %d\n", a->mmap2); +#if defined(PERF_RECORD_SWITCH) || !defined(PERF_RECORD_MMAP) + fprintf(fd, " context_switch %d\n", a->context_switch); /* since 4.3 */ +#endif /* PERF_RECORD_SWITCH */ + if (a->sample_type & PERF_SAMPLE_BRANCH_STACK) { + /* Show branch sample properties - field only valid when this flag set */ + static flagnames_t const flagnames[] = { +#define FLAG(x) { #x, PERF_SAMPLE_BRANCH_##x } + FLAG(USER), + FLAG(KERNEL), + FLAG(HV), + FLAG(ANY), + FLAG(ANY_CALL), + FLAG(ANY_RETURN), + FLAG(IND_CALL), + FLAG(ABORT_TX), + FLAG(IN_TX), + FLAG(NO_TX), + FLAG(COND), + FLAG(CALL_STACK), + FLAG(IND_JUMP), + FLAG(CALL) +#undef FLAG + }; + fprintf(fd, " branch_sample_type "); + fprint_flags(fd, a->branch_sample_type, FLAG_NAMES(flagnames)); + fprintf(fd, "\n"); + } +} +#endif /* PRINTF_DIAGNOSTICS */ + +/* Forward declarations */ +static PyTypeObject EventType; +static PyTypeObject RecordType; + +static int event_setup_buffer(EventObject *); +static int event_setup_buffer_aux(EventObject *, int); +static int event_get_id(EventObject *); +static PyObject *event_close(PyObject *x); + +static int event_is_subordinate(EventObject const *e) +{ + return e->group_leader != NULL && e->group_leader != e; +} + + +/* + * Instance initialization function for Event. + * + * Compared to the perf_event_open syscall (perf_event_attr, pid, cpu, group, flags), + * the constructor for Event has some additional arguments: + * - sizes for the mmap buffer and AUX buffer, for when we allocate them + * - verbosity + * + * Return 0 on success. + * Return -1 on failure to create event. + */ +static int event_init(PyObject *x, PyObject *args, PyObject *kwds) +{ + EventObject *e = (EventObject *)x; + PyObject *e_attr = NULL; + unsigned int n_tries = 0; + int fd; + /* perf event description parameters */ + int is_sampling; + int e_pid = 0, e_tid = 0; + int e_cpu = -1; /* all CPUs */ + int e_verbose = 0; + int e_retry = 1; + unsigned long e_mmap_data_size = MMAP_DATA_SIZE_DEFAULT; + unsigned long e_mmap_aux_size = MMAP_DATA_SIZE_DEFAULT; +#ifdef PERF_FLAG_FD_CLOEXEC + unsigned long e_flags = PERF_FLAG_FD_CLOEXEC; +#else + unsigned long e_flags = 0; +#endif + unsigned long e_custom_flags = 0; + int e_group_fd = -1; + PyObject *e_enabled_obj = NULL; + + PyObject *e_group_obj = NULL; + PyObject *e_buffer_obj = NULL; + EventObject *e_buffer_owner = NULL; + + static char *kwlist[] = {"attr", + "verbose", + "retry", + "pid", + "tid", + "cpu", + "mmap_size", + "aux_size", + "flags", + "enabled", + "group", + "buffer", + NULL}; + + assert(e->fd == -1); + memset(&e->attr, 0, sizeof e->attr); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|iiiiikkkOOO", kwlist, + &e_attr, + &e_verbose, + &e_retry, + &e_pid, + &e_tid, + &e_cpu, + &e_mmap_data_size, + &e_mmap_aux_size, + &e_flags, + &e_enabled_obj, + &e_group_obj, + &e_buffer_obj)) { + /* On failure this will already have raised the appropriate exception. */ +#ifdef PRINTF_DIAGNOSTICS + if (e_verbose) { + fprintf(stderr, "perf event: Python API argument parsing failed\n"); + } +#endif /* PRINTF_DIAGNOSTICS */ + return -1; + } + if (e_mmap_data_size != MMAP_DATA_SIZE_DEFAULT) { + e->mmap_data_size = e_mmap_data_size; + } + if (e_mmap_aux_size != MMAP_DATA_SIZE_DEFAULT) { + e->aux_size = e_mmap_aux_size; + } + e->try_userspace_read = 1; + + /* Process non-canonical flags encoded in the same parameter as PERF_FLAG_... */ + e_custom_flags = e_flags & 0xff000000; + e_flags &= ~e_custom_flags; + if (e_custom_flags & PERF_FLAG_READ_USERSPACE) { + e->try_userspace_read = 1; + } + if (e_custom_flags & PERF_FLAG_NO_READ_USERSPACE) { + e->try_userspace_read = 0; + } + if (e->attr.read_format & PERF_FORMAT_GROUP) { + /* If we want all the counters read at the same time, then it doesn't + make sense to read 'live' values from userspace - unless those + counters have been simultaneously frozen */ + e->try_userspace_read = 0; + } + + { + /* Get the perf_event_attr buffer. The buffer argument may be any of: + bytes() + bytearray() + an object implementing the __bytes__ method, such as PerfEventAttr + */ + char *data = NULL; + unsigned int attr_size; + if (PyBytes_Check(e_attr)) { + attr_size = PyBytes_Size(e_attr); + data = PyBytes_AsString(e_attr); + } else if (PyByteArray_Check(e_attr)) { + attr_size = PyByteArray_Size(e_attr); + data = PyByteArray_AsString(e_attr); + } else { + PyObject *bytes_callable = PyObject_GetAttrString(e_attr, "__bytes__"); + if (bytes_callable) { + PyObject *b_attr = PyObject_CallObject(bytes_callable, NULL); + if (!b_attr) { + /* Call failed and an error has already been set */ + return -1; + } + attr_size = PyBytes_Size(b_attr); + data = PyBytes_AsString(b_attr); + } + } + if (!data) { +#ifdef PRINTF_DIAGNOSTICS + fprintf(stderr, "perf event: expected bytearray or bytes\n"); +#endif /* PRINTF_DIAGNOSTICS */ + PyErr_SetString(PyExc_TypeError, "invalid event object"); + return -1; + } + if (attr_size > sizeof e->attr) { +#ifdef PRINTF_DIAGNOSTICS + fprintf(stderr, "perf event: attribute size %x, only expecting %u\n", + (unsigned int)attr_size, (unsigned int)(sizeof e->attr)); +#endif /* PRINTF_DIAGNOSTICS */ + PyErr_SetString(PyExc_ValueError, "perf_event_open: attribute data too large"); + return -1; + } + memcpy(&e->attr, data, attr_size); + if (e->attr.size != attr_size) { +#ifdef PRINTF_DIAGNOSTICS + fprintf(stderr, "perf event: attribute length %u doesn't match structure size field %u\n", + (unsigned int)attr_size, (unsigned int)(e->attr.size)); +#endif /* PRINTF_DIAGNOSTICS */ + return -1; + } + } + + if (e_enabled_obj != NULL) { + e->attr.disabled = !PyObject_IsTrue(e_enabled_obj); + } + + /* This is a sampling event, which will need a buffer allocated. + Strictly, we don't need to know that when we create the event. + But it helps to create the buffer early so that + (a) we don't lose any events if the target starts running + before we create the buffer + (b) when grouping events we can direct any subordinate + events to the leader's buffer. */ + is_sampling = e->attr.sample_freq != 0; + if (e_tid != 0 && e_pid != 0) { + /* mutually exclusive */ + return -1; + } + + /* Verbosity setting sticks to the event */ + e->verbose = e_verbose; + + /* "This field specifies the format of the data returned by read(2) on a + perf_event_open() file descriptor." Our event_sample_t must be in sync. */ + if (e->attr.read_format == 0) { + if (!is_sampling) { + /* This is a counting event, e.g. a hardware event count. */ + e->attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING|PERF_FORMAT_ID; + } else { + /* This is a sampling event, returning records in the mmap buffer. */ + e->attr.read_format = PERF_FORMAT_ID; + } + } + + /* A "sampling" event is one that generates an overflow notification + every N events, where N is given by some sample_period. + A sampling event has sample_period > 0. When an overflow occurs, + requested data is recorded in the mmap buffer... + sample_freq can be used if you wish to use frequency rather than period... + The kernel will adjust the sampling period to try and achieve the + desired rate. The rate of adjustment is a timer tick. */ + if (e->attr.inherit && (e->attr.sample_type & PERF_SAMPLE_READ)) { + /* Currently the kernel doesn't support this combination and will return EINVAL. */ + PyErr_SetString(PyExc_ValueError, "perf_event_open: PERF_SAMPLE_READ not supported with inherited events"); +#ifdef PRINTF_DIAGNOSTICS + if (e_verbose) { + fprintf(stderr, "perf_event_open: PERF_SAMPLE_READ not supported with inherited events\n"); + } +#endif /* PRINTF_DIAGNOSTICS */ + return -1; + } + + if (e->attr.sample_type & PERF_SAMPLE_BRANCH_STACK) { + /* Default to a usable value if the caller has failed to specify. TBD review */ + if (e->attr.branch_sample_type == 0) { + e->attr.branch_sample_type = PERF_SAMPLE_BRANCH_ANY; + } + } + + if (e->attr.sample_type != 0) { + /* TBD - set some flags that perf seems to set for perf record */ + e->attr.comm = 1; +#ifdef PERF_RECORD_MISC_COMM_EXEC + e->attr.comm_exec = 1; +#endif /* PERF_RECORD_MISC_COMM_EXEC */ + e->sample_id_bytes = perf_event_attr_sample_id_size(&e->attr); + } else { + e->sample_id_bytes = 0; + } + + if (e_group_obj == Py_None) { + e_group_obj = NULL; + } + if (e_buffer_obj == Py_None) { + e_buffer_obj = NULL; + } + if (e_buffer_obj != NULL) { + if (!PyObject_TypeCheck(e_buffer_obj, &EventType)) { + PyErr_SetString(PyExc_TypeError, "buffer must be another Event object"); + return -1; + } + e_buffer_owner = (EventObject *)e_buffer_obj; + } + if (e_group_obj != NULL) { + /* We don't use the "O!" typechecking format as we want None to be + equivalent to not using the argument - so typecheck here. */ + if (!PyObject_TypeCheck(e_group_obj, &EventType)) { + PyErr_SetString(PyExc_TypeError, "group must be another Event object"); + return -1; + } else { + EventObject *ge = (EventObject *)e_group_obj; + /* The group object might be a singleton or a group leader, + but it mustn't be a subordinate. (We could be more flexible + and use the leader if a subordinate was passed in, but we + prefer to fault on the grounds that the caller may be confused.) */ + if (event_is_subordinate(ge)) { + PyErr_SetString(PyExc_ValueError, "perf_event_open: group is not a group leader"); + return -1; + } + if (e_buffer_owner == NULL) { + e_buffer_owner = ge; + } + e_group_fd = ge->fd; + } + /* e_flags |= PERF_FLAG_FD_OUTPUT; "broken since Linux 2.6.35 " */ + /* is that equivalent to PERF_SAMPLE_READ? */ + } +retry:; + if (n_tries == 1 && !e_retry) { + PyErr_SetString(PyExc_ValueError, "perf_event_open: invalid descriptor"); + return -1; + } + n_tries++; + /* "pid == -1 and cpu == -1: This setting is invalid and will return an error." */ + /* even though this is the logical setting for offcore PMUs. */ + int const pidtid = (e_pid == 0 && e_tid != 0) ? e_tid : e_pid; + assert(!(pidtid == -1 && e_cpu == -1)); + /* Userspace PMU read generally doesn't make sense if the live PMC counters are + on other cores. So we should enable it only if monitoring the current thread. */ + if (e_tid != 0) { + e->try_userspace_read = 0; + /* TBD: should we also check attr.inherit=0 ? */ + } +#ifdef PRINTF_DIAGNOSTICS + if (e_verbose) { + if (e_verbose >= 2) { + fprint_perf_event_attr(stderr, &e->attr); + } + fprintf(stderr, "perf_event_open: pid %d cpu %d group_fd %d flags %#lx", + e_pid, e_cpu, e_group_fd, e_flags); + } +#endif /* PRINTF_DIAGNOSTICS */ + /* Allocate a file descriptor for this event. Note that even when we're + supplying a fd for the group leader, we still get a new fd. */ + fd = perf_event_open(&e->attr, /*pid=*/pidtid, /*cpu=*/e_cpu, /*group_fd=*/e_group_fd, /*flags=*/e_flags); + int const perf_event_open_errno = errno; +#ifdef PRINTF_DIAGNOSTICS + if (e_verbose) { + fprintf(stderr, " => %d\n", fd); + } +#endif /* PRINTF_DIAGNOSTICS */ + if (fd < 0) { + /* The perf event couldn't be opened. Maybe it's an invalid event + or maybe we tried to open it with attributes that weren't + valid for this event, in which case we can adjust and retry. + What kind of error should we raise? + We take the view that we should + - raise PermissionError if the operation might have succeeded + with more user privilege, or more relaxed perf_event_paranoid + - raise ValueError if the user's input value was invalid + - raise OSError in other cases + Python 2 doesn't have PermissionError so we have to raise + OSError and have the user check errno. + */ + if (e_verbose) { + fprintf(stderr, "sys_perf_event_open failed, errno = -%d\n", perf_event_open_errno); + errno = perf_event_open_errno; + perror("perf_event_open"); + } + if (perf_event_open_errno == ENOENT || + perf_event_open_errno == EOPNOTSUPP) { + /* Input was ok, we just can't do this event on this system. + E.g. stalled-cycles-frontend. perf stat reports "". */ + if (e_verbose) { + fprintf(stderr, "perf event: raising ValueError\n"); + } + PyErr_SetString(PyExc_ValueError, "perf_event_open: event not supported"); + } else if (perf_event_open_errno == EINVAL) { + /* E.g. passed in an undefined event code, or flags not appropriate + for this event. */ + if (e_group_fd != -1) { + /* Check if it was a bad group (or if we'd reached the group limit), + by trying to open the event outside the group. */ + e->attr.read_format &= ~PERF_FORMAT_GROUP; + int temp_fd = perf_event_open(&e->attr, pidtid, e_cpu, /*group=*/-1, e_flags); + if (temp_fd >= 0) { + /* We could create this event, just not in a group */ + if (e_custom_flags & PERF_FLAG_WEAK_GROUP) { + fd = temp_fd; + goto event_created; + } + close(temp_fd); + PyErr_SetString(PyExc_ValueError, "perf_event_open: invalid group"); + return -1; + } + } + /* Exclusion flags might not be supported for uncore events */ + if (e->attr.exclude_guest) { + if (e_verbose) { +#ifdef PRINTF_DIAGNOSTICS + fprintf(stderr, "perf_event_open: switching off exclude_guest flag\n"); +#endif /* PRINTF_DIAGNOSTICS */ + } + e->attr.exclude_guest = 0; + goto retry; + } + if (e->attr.exclude_hv) { + if (e_verbose) { +#ifdef PRINTF_DIAGNOSTICS + fprintf(stderr, "perf_event_open: switching off exclude_hv flag\n"); +#endif /* PRINTF_DIAGNOSTICS */ + } + e->attr.exclude_hv = 0; + goto retry; + } + PyErr_SetString(PyExc_ValueError, "perf_event_open: invalid value"); + } else { + /* could be EPERM e.g. trying to do system-wide monitoring */ + /* or EOPNOTSUPP */ + /* EOPNOTSUPP: branch tracing requested on inappropriate event (s/w, tracepoint etc.) */ + /* Unexpected error */ + /* TBD: we find on AArch64, raw events 0..63 not in PMCEIDR return EOPNOTSUPP, + so we treat that as ENOENT */ + //fprintf(stderr, "perf event attr: type %d config 0x%llx\n", + // (int)e->attr.type, (unsigned long long)e->attr.config); + if (0 && !e_verbose) { + /* Not already printed */ + fprintf(stderr, "perf_event_open: pid %d cpu %d group_fd %d flags %#lx\n", + e_pid, e_cpu, e_group_fd, e_flags); + errno = perf_event_open_errno; + perror("perf_event_open"); + } + errno = perf_event_open_errno; + PyErr_SetFromErrno(PyExc_OSError); + } + return -1; + } + +event_created: + /* + * The event has been successfully created. + */ + e->cpu = e_cpu; + e->fd = fd; + + /* + * Insert the event into our fileno->event map. + * We don't want this map to act as a retainer for otherwise freed events, + * so we ensure it doesn't contribute to the reference count. + */ + fileno_event_insert(fd, e); + + /* Set need_aux to indicate that if we allocate a mmap buffer for events, + we should also allocate an 'aux' buffer for bulk data. */ + if (e->attr.type == PERF_TYPE_HARDWARE || + e->attr.type == PERF_TYPE_HW_CACHE || + e->attr.type == PERF_TYPE_RAW || + e->attr.type == PERF_TYPE_TRACEPOINT || + e->attr.type == PERF_TYPE_BREAKPOINT || + e->attr.type == PERF_TYPE_SOFTWARE) { + e->need_aux = 0; + } else { + e->need_aux = 1; /* TBD should test event type */ + } + if (e_buffer_owner != NULL) { + Py_INCREF(e_buffer_owner); + e->buffer_owner = e_buffer_owner; + /* Add this event to the group leader's list of subordinates. */ + e->next_sub = e->buffer_owner->next_sub; + e->buffer_owner->next_sub = e; + /* TBD: what happens to this list when we delete events + (in some order?) */ + } + if (is_sampling) { + if (e->buffer_owner == NULL) { + event_setup_buffer(e); + } else { + int bfd = e->buffer_owner->fd; + assert(bfd != -1); + /* It doesn't seem to be possible for subordinate events to have + their own buffer even if we wanted to - mmap() returns invalid. */ + int rc; + rc = ioctl(e->fd, PERF_EVENT_IOC_SET_OUTPUT, bfd); + if (rc) { + perror("ioctl"); + fprintf(stderr, "perf event: error redirecting %d's events to %d's buffer\n", e->fd, bfd); + } + } + event_get_id(e); + } else if (e->attr.read_format & PERF_FORMAT_ID) { + /* We need our id in order to match up when we read it */ + event_get_id(e); + } + if (e->try_userspace_read && !e->mmap_page) { + if (!event_setup_buffer_aux(e, /*quiet=*/1)) { + /* Maybe this kernel doesn't support mmap'ing a non-sampling event */ + e->try_userspace_read = 0; + } + } + /* This is the only success return in this function. We must have created an event. */ + assert(e->fd >= 0); + return 0; +} + + +#ifdef PRINTF_DIAGNOSTICS +/* + * Print the current status of an mmap page, from its header. + * This information will change continuously as the kernel adds more records. + */ +static void fprint_mmap_page_status(FILE *fd, struct perf_event_mmap_page const *mp) +{ + fprintf(fd, "time enabled = %lu, time running = %lu", (unsigned long)mp->time_enabled, (unsigned long)mp->time_running); + /* "data_head points to the head of the data section. The value continually increases, it does not wrap." */ + fprintf(fd, ", data_tail = %lx, ", (unsigned long)mp->data_tail); + /* data_tail should be written by user space to reflect the last read data." */ + fprintf(fd, "data_head = %lx", (unsigned long)mp->data_head); + if (mp->aux_size) { + fprintf(fd, ", aux_size = %lx, ", (unsigned long)mp->aux_size); + fprintf(fd, "aux_tail = %lx, ", (unsigned long)mp->aux_tail); + fprintf(fd, "aux_head = %lx", (unsigned long)mp->aux_head); + } + fprintf(fd, "\n"); + if (mp->capabilities & _cap_user_rdpmc) { + /* Show if a userspace-readable hardware counter is currently mapped to this event */ + /* mp->index is not necessarily small: see IA32_FIXED_CTR... */ + fprintf(fd, "counter index = 0x%x, offset = 0x%lx\n", (int)mp->index, (unsigned long)mp->offset); + } +} + + +static void fprint_mmap_page(FILE *fd, struct perf_event_mmap_page const *mp) +{ + fprintf(fd, "mmap page:\n"); + fprintf(fd, " version = %u, ", mp->version); + fprintf(fd, "index = 0x%x, ", mp->index); + fprintf(fd, "data_size = 0x%lx, data_offset = 0x%lx\n", (unsigned long)mp->data_size, (unsigned long)mp->data_offset); /* since 4.1 */ +#ifndef PERF_NO_CAPABILITIES + /* usually 0x1e: cap_user_time_zero, cap_user_time, cap_user_rdpmc, cap_bit0_is_deprecated */ + fprintf(fd, " capabilities = 0x%llx", mp->capabilities); + if (mp->cap_user_rdpmc) { + fprintf(fd, ", pmc_width = %u", mp->pmc_width); + } + if (mp->cap_user_time_zero) { + fprintf(fd, ", time_zero = %#llx", mp->time_zero); + fprintf(fd, ", time_shift = %d", mp->time_shift); + fprintf(fd, ", time_mult = %d", mp->time_mult); + } + fprintf(fd, "\n"); +#endif /* !PERF_NO_CAPABILITIES */ + fprint_mmap_page_status(fd, mp); +} +#endif /* PRINTF_DIAGNOSTICS */ + + +/* + * Map a userspace-accessible ring buffer on to the event's file descriptor so + * that we can retrieve a series of samples produced by the perf subsystem. + * + * Ability to mmap() is subject to the RLIMIT_MEMLOCK resource limit. + * perf_mmap in events/core.c shows that we get a set amount per CPU + * (see /proc/sys/kernel/perf_event_mlock_kb), and any allocation above + * that is counted against RLIMIT_MEMLOCK. Exceeding the limit results + * in EPERM. + * + * So when sampling multiple events, we would generally want to redirect + * all the events to one sampling buffer per CPU even if the events aren't + * being scheduled on to PMU as a group. + */ +static int event_setup_buffer_aux(EventObject *e, int quiet) +{ + void *pmap; + unsigned int const page_size = sysconf(_SC_PAGESIZE); + /* There's a limit on how much memory we can map, and our various mmap + buffers (main, aux etc.) have to come out of that. So we adjust the + sizes of the requests so that we don't get an error. */ + if (e->mmap_data_size == MMAP_DATA_SIZE_DEFAULT) { + unsigned int data_size; + data_size = perf_event_mlock_size() - page_size; + if (e->need_aux) { + data_size /= 2; + } + e->mmap_data_size = data_size; + } + /* Round up to a page size (it should be already) */ + if (e->mmap_data_size < page_size) { + e->mmap_data_size = page_size; + } + /* Size actually mapped should be 1 + 2^n pages, to allow for the header */ + e->mmap_size = page_size + e->mmap_data_size; + /* Provide the buffer to the file handle */ +#ifdef PRINTF_DIAGNOSTICS + if (e->verbose >= 2) { + fprintf(stderr, "mmap(size=%#lx,fd=%d)", e->mmap_size, e->fd); + } +#endif /* PRINTF_DIAGNOSTICS */ + pmap = mmap(NULL, e->mmap_size, PROT_READ|PROT_WRITE, MAP_SHARED, e->fd, 0); + int const mmap_errno = errno; +#ifdef PRINTF_DIAGNOSTICS + if (e->verbose >= 2) { + fprintf(stderr, " => %p\n", pmap); + } +#endif /* PRINTF_DIAGNOSTICS */ + if (pmap == MAP_FAILED) { + if (!quiet) { + errno = mmap_errno; + perror("mmap"); + if (event_is_subordinate(e)) { + fprintf(stderr, " (event is subordinate to fd=%d)\n", e->buffer_owner->fd); + } + if (mmap_errno == EINVAL || 1) { + fprintf(stderr, " size = %lu/0x%lx, page size = %u/0x%x, fd=%d\n", + e->mmap_size, e->mmap_size, + page_size, page_size, + e->fd); + } + if (mmap_errno == EPERM) { + fprintf(stderr, " maybe exceeded process's MEMLOCK limit?\n"); + } + } + return 0; + } + e->mmap_page = (struct perf_event_mmap_page *)pmap; + e->mmap_data_start = (unsigned char *)pmap + page_size; + e->mmap_data_end = (unsigned char *)pmap + e->mmap_size; + e->mmap_cursor = (unsigned char *)pmap + page_size; +#ifdef PRINTF_DIAGNOSTICS + /* The kernel will have filled in some information fields. */ + if (e->verbose >= 2) { + fprintf(stderr, "%p: perf buffer size = 0x%lx, ", pmap, e->mmap_size); + fprint_mmap_page(stderr, e->mmap_page); + } +#endif /* PRINTF_DIAGNOSTICS */ +#if defined(PERF_RECORD_AUX) || !defined(PERF_RECORD_MMAP) + if (e->need_aux) { + void *paux; + assert(e->aux_area == 0); + if (e->aux_size == MMAP_DATA_SIZE_DEFAULT) { + // TBD follow perf in halving the size + e->aux_size = e->mmap_data_size / 2; + } + /* "To set up an AUX area, first aux_offset nedes to be set with + an offset greater than data_offset+data_size and aux_size + needs to be set to the desired buffer size. The desired offset + and size must be page aligned, and the size must be a power of two." */ + unsigned long aux_offset = e->mmap_size; + assert(aux_offset % page_size == 0); + assert(e->aux_size % page_size == 0); + e->mmap_page->aux_offset = aux_offset; + e->mmap_page->aux_size = e->aux_size; +#ifdef PRINTF_DIAGNOSTICS + if (e->verbose >= 2) { + fprintf(stderr, "mmap(%#lx, fd=%d, %#llx) for aux buffer\n", e->aux_size, e->fd, (unsigned long long)aux_offset); + } +#endif /* PRINTF_DIAGNOSTICS */ + paux = mmap(NULL, e->aux_size, PROT_READ|PROT_WRITE, MAP_SHARED, e->fd, aux_offset); + if (paux == MAP_FAILED) { + perror("mmap(aux)"); + fprintf(stderr, " failed to allocate AUX buffer: %lu/0x%lx, fd=%d, type=%d\n", + e->aux_size, e->aux_size, + e->fd, e->attr.type); + return 0; + } + e->aux_area = paux; + if (e->verbose >= 2) { + fprintf(stderr, "%p: aux buffer size = 0x%lx\n", e->aux_area, e->aux_size); + } + } +#endif /* PERF_RECORD_AUX */ + return 1; +} + + +static int event_setup_buffer(EventObject *e) +{ + return event_setup_buffer_aux(e, /*quiet=*/0); +} + + +/* + * Rebind an event object to a new perf_event_attr. + * Not well tested. + */ +static PyObject *event_bind(PyObject *x, PyObject *args, PyObject *kwds) +{ + EventObject *e = (EventObject *)x; + int rc; + (void)event_close(x); + rc = event_init(x, args, kwds); + if (rc != 0) { + PyErr_SetString(PyExc_ValueError, "bad value"); + return NULL; + } + return (PyObject *)e; +} + + +/* + * Given a leader event and an event id, find the event object. + * We might do this every time we read a sample record from the memory buffer, + * so it needs to be reasonably fast. Currently we scan a linked list of + * the leader's subordinates. Typically we only call this when the id + * is known to be a subordinate (or the leader itself) so we won't be doing + * a lot of full-length scans unnecessarily. + * Chaining lots of events together is likely to hit various other performance + * issues so currently we don't focus on making the lookup quicker. + */ +#if 0 +static EventObject *event_find_subordinate(EventObject const *e, unsigned long long id) +{ + assert(id != 0); + assert(e->buffer_owner == NULL); + while (e) { + /* As this is a frequently called routine, we shouldn't be + discovering the events' ids only now, we should have done + this as soon as we knew we might have to do this lookup. */ + assert(e->id != 0); + if (e->id == id) { + break; + } + e = e->next_sub; + } + /* Generally this will not be NULL. */ + return (EventObject *)e; +} +#endif + + +/* + * The __repr__ should be unambiguous. + * So it should contain the full contents of the object. TBD. + */ +static PyObject *event_repr(PyObject *x) +{ + EventObject const *e = (EventObject *)x; + return PyString_FromFormat("Event(type=%u,n=0x%x,cpu=%d)", + (unsigned int)e->attr.type, (unsigned int)e->attr.config, (int)e->cpu); +} + + +/* + * Return the byte string corresponding to the event's perf_event_attr. + * In Python2, this should be a bytearray(). + * In Python3, this should be a bytes() object. + * + * Better would be to return a PerfEventAttr object, but that would involve this + * module knowing about perf_attr. Instead, caller can do: + * PerfEventAttr(e.attr_struct) + */ +static PyObject *event_attr_struct(PyObject *x) +{ + EventObject const *e = (EventObject *)x; + return MyBytes_FromStringAndSize((char const *)&e->attr, sizeof e->attr); +} + + +/* + * Check whether new event(s) are available in the ring buffer, + * by inspecting the head pointer. + */ +static int event_available(EventObject *e) +{ + assert(e->mmap_page != NULL); + return e->mmap_page->data_tail != e->mmap_page->data_head; +} + + +/* + * Check whether an event record is available in the mmap buffer - + * first making sure that events are actually enabled. Non-blocking. + */ +static PyObject *event_poll(PyObject *x) +{ + EventObject *e = (EventObject *)x; + if (!e->mmap_page) { + if (!event_setup_buffer(e)) { + PyErr_SetString(PyExc_ValueError, "no buffer allocated"); + return NULL; + } + assert(e->mmap_page != NULL); + /* Very unlikely the event occurred between allocation and the below test, + but maybe perf has been waiting to put some events in. */ + } + if (e->attr.disabled && !e->attr.enable_on_exec) { + int rc = ioctl(e->fd, PERF_EVENT_IOC_ENABLE, 0); + if (rc < 0) { + perror("ioctl(ENABLE)"); + } + e->attr.disabled = 0; + } + if (e->verbose >= 1) { + fprintf(stderr, "[%d] polling: ", e->fd); + fprint_mmap_page_status(stderr, e->mmap_page); + } + return PyBool_FromLong(event_available(e)); +} + + +/* + * Test if an event still 'exists'. An event bound to a terminated subprocess will + * cease to exist, and our copy of its file descriptor will report ready when polled. + */ +static PyObject *event_is_active(PyObject *x) +{ + EventObject *e = (EventObject *)x; + static struct timespec const fto = { 0, 0 }; + struct pollfd fds = { e->fd, POLLIN, 0 }; + int rc = ppoll(&fds, 1, &fto, NULL); + if (e->verbose) { + if (rc == 1) { + fprintf(stderr, "poll(%d): revents=0x%x\n", e->fd, (unsigned int)fds.revents); + } else { + fprintf(stderr, "poll(%d): rc=%d\n", e->fd, rc); + perror("poll"); + } + } + /* It's active if the event's not ready, or if it's got some data, or if it's just there and hasn't hung up */ + /* Note that POLLIN takes priority over POLLHUP in case there's unconsumed data ready. */ + int is_active = (rc == 0) || (rc == 1 && ((fds.revents & POLLIN) != 0 || (fds.revents & POLLHUP) == 0)); + if (e->verbose) { + fprintf(stderr, "is_active: %d\n", is_active); + } + return PyBool_FromLong(is_active); +} + + +/* + * To read events from userspace, or to get the capabilities that say + * whether we can do that, we need at least the header page of the mmap buffer. + */ +static void ensure_minimal_mmap_page(EventObject *e) +{ + if (!e->mmap_page) { + if (e->verbose) { + fprintf(stderr, "[%d] ensuring mmap page\n", e->fd); + } + event_setup_buffer(e); + } + assert(e->mmap_page != NULL); +} + + +/* + * Get the event capabilities from the mmap page. If we haven't already + * allocated a page, allocate a minimal one now. + */ +static PyObject *event_capabilities(PyObject *x) +{ + EventObject *e = (EventObject *)x; + ensure_minimal_mmap_page(e); + // fprint_mmap_page(stderr, e->mmap_page); // TBD remove + return PyInt_FromLong(e->mmap_page->capabilities); +} + + +/* + * Close the event's file descriptor. We may need to do this to cause events + * to be flushed into the ring buffer. + */ +static PyObject *event_close(PyObject *x) +{ + EventObject *e = (EventObject *)x; + if (e->fd != -1) { +#ifdef PRINTF_DIAGNOSTICS + if (e->verbose) { + fprintf(stderr, "[%d] close event\n", e->fd); + } +#endif /* PRINTF_DIAGNOSTICS */ + int rc = close(e->fd); + if (rc != 0) { + PyErr_SetFromErrno(PyExc_OSError); + perror("close"); + return NULL; + } + /* Now delete the file handle from the map before it goes away. */ + fileno_events[e->fd] = NULL; + e->fd = -1; + if (e->group_leader) { + Py_DECREF(e->group_leader); + e->group_leader = NULL; + } + } + Py_RETURN_NONE; +} + + +static void event_free_buffers(PyObject *x) +{ + EventObject *e = (EventObject *)x; + if (e->mmap_page != NULL) { + int rc = munmap(e->mmap_page, e->mmap_size); + if (rc) { + perror("munmap"); + } + e->mmap_page = NULL; + } + if (e->aux_area != NULL) { + int rc = munmap(e->aux_area, e->aux_size); + if (rc) { + perror("munmap(aux)"); + } + e->aux_area = NULL; + } +} + + +static void event_dealloc(PyObject *x) +{ + EventObject *e = (EventObject *)x; + //fprintf(stderr, "-- event %p dealloc\n", e); +#ifdef PRINTF_DIAGNOSTICS + if (e->verbose && e->fd >= 0) { + fprintf(stderr, "[%d] event object deallocated when event open: closing\n", e->fd); + } +#endif /* PRINTF_DIAGNOSTICS */ + (void)event_close(x); + if (e->buffer_owner) { + Py_DECREF(e->buffer_owner); + e->buffer_owner = NULL; + } + event_free_buffers(x); + if (e->datasnap) { + Py_DECREF(e->datasnap); + } + x->ob_type->tp_free(x); +} + + +static void fprint_event_sample(FILE *fd, event_sample_t const *ed) +{ + fprintf(fd, "value: %llx, enabled: %llx, running: %llx\n", + ed->value, ed->time_enabled, ed->time_running); +} + + +static void subtract_base_event_values(event_sample_t *a, event_sample_t const *b) +{ + a->value -= b->value; + a->time_enabled -= b->time_enabled; + a->time_running -= b->time_running; +} + + +static void subtract_event_values(PyObject *a, PyObject const *b, EventObject *e) +{ + if (b) { + BaseReadingObject *ae = (BaseReadingObject *)a; + BaseReadingObject const *be = (BaseReadingObject const *)b; + subtract_base_event_values(&ae->sample, &be->sample); + if (e->attr.read_format & PERF_FORMAT_GROUP) { + GroupReadingObject *ag = (GroupReadingObject *)a; + GroupReadingObject const *bg = (GroupReadingObject const *)b; + unsigned int i; + for (i = 0; i < bg->n_values; ++i) { + subtract_base_event_values(&ag->samples[i], &bg->samples[i]); + } + } + } +} + + +/* + * Adjust a single value using the time enabled/running counters. + * After this call, the value is either a float, or None. + */ +static void postprocess_value(PyObject **vp, unsigned long long value, BaseReadingObject *br) +{ + if (*vp && *vp != Py_None) { + Py_DECREF(*vp); + } + if (br->fraction_running != 0.0) { + *vp = PyFloat_FromDouble(value / br->fraction_running); + Py_INCREF(*vp); + } else { + *vp = Py_None; + } +} + + +static void postprocess_reading(PyObject *x) +{ + BaseReadingObject *br = (BaseReadingObject *)x; + if (br->sample.time_enabled != 0.0) { + br->fraction_running = (double)br->sample.time_running / br->sample.time_enabled; + } else { + br->fraction_running = 0.0; + } + if (!(br->event->attr.read_format & PERF_FORMAT_GROUP)) { + ReadingObject *r = (ReadingObject *)x; + postprocess_value(&r->adjusted_value, br->sample.value, br); + } + if (br->event->verbose) { + double scale = (br->fraction_running ? (1.0 / br->fraction_running) : 0.0); + fprintf(stderr, "perf event %p: enabled=%llu running=%llu=%.5f", + br->event, + (unsigned long long)br->sample.time_enabled, + (unsigned long long)br->sample.time_running, + br->fraction_running); + if (!(br->event->attr.read_format & PERF_FORMAT_GROUP)) { + ReadingObject *r = (ReadingObject *)x; + fprintf(stderr, " value=%llu (adj=%.2f)\n", + (unsigned long long)r->base.sample.value, + r->base.sample.value * scale); + } else { + GroupReadingObject *r = (GroupReadingObject *)x; + unsigned int i; + fprintf(stderr, " values=%u:", (unsigned int)r->n_values); + for (i = 0; i < r->n_values; ++i) { + fprintf(stderr, " value=%llu (adj=%.2f)", + (unsigned long long)r->samples[i].value, + r->samples[i].value * scale); + } + fprintf(stderr, "\n"); + } + } +} + + +static PyObject *populate_reading_object_from_data(PyObject *x, void const *data, EventObject *e); + +static PyObject *perf_read_count_using_read(PyObject *x) +{ + /* + * Read counter data for an event using read(). + * x is a Reading or GroupReading object. + * If the event was PERF_FORMAT_GROUP, we are collecting multiple + * events in one operation on this file descriptor. + */ + int n; + int size_expected = -1; + unsigned long long buf[20]; /* 8 counters * (1+1) + 4 header */ + BaseReadingObject *base = (BaseReadingObject *)x; + EventObject *e = base->event; + size_t tr = perf_reading_size(e); + if (e->fd == -1) { + PyErr_SetString(PyExc_ValueError, "counter error - attempt to read closed counter"); + return 0; + } + assert(tr <= sizeof buf); + if (e->attr.read_format & PERF_FORMAT_GROUP) { + /* The amount to read is determined by the size of the group. + The kernel will return ENOSPC if we don't supply a big enough buffer. */ + n = read(e->fd, buf, sizeof buf); + if (n > 0) { + unsigned int n_values = (unsigned int)buf[0]; + size_expected = perf_reading_size_group(e, n_values); + } + } else { + n = read(e->fd, buf, tr); + size_expected = tr; + } + if (n > 0 && n != size_expected) { + PyErr_SetString(PyExc_ValueError, "unexpected size from read()"); + return 0; + } else if (n > 0) { + /* Observation was read as expected. */ + return populate_reading_object_from_data(x, buf, e); + } else if (n == 0) { + fprintf(stderr, "perf_events: tried to read while event in error state\n"); + /* Counter is in error state - see perf_event_open man page under "pinned" */ + PyErr_SetString(PyExc_ValueError, "counter error - event is in error state"); + return 0; + } else if (errno == ENOSPC) { + fprintf(stderr, "perf_events: event reading buffer too small\n"); + PyErr_SetString(PyExc_ValueError, "counter error - buffer not big enough"); + return 0; + } else { + fprintf(stderr, "perf_events: unexpected error, errno=%u\n", errno); + PyErr_SetString(PyExc_ValueError, "counter error"); + return 0; + } +} + + +static inline void barrier(void) +{ +#if defined(__arm64__) || defined(__AARCH64EL__) || defined(__ARM_ARCH_ISA_A64) || defined(__ARMEL__) + __asm__ __volatile__("isb":::); +#elif defined(__x86_64__) + __asm__ __volatile__("sfence":::); +#endif +} + + +/* + * Read the hardware timestamp. + * Note that 0 is a valid (if very unlikely) value of a working timestamp. + */ +static inline unsigned long long hardware_timestamp(void) +{ + unsigned long long cyc = 0; +#if defined(__arm64__) || defined(__AARCH64EL__) || defined(__ARM_ARCH_ISA_A64) + __asm__ __volatile__("mrs %0,cntvct_el0":"=r"(cyc)::); +#elif defined(__ARMEL__) + unsigned int hi, lo; + __asm__ __volatile__("mrrc p15,1,%0,%1,c14":"=r"(lo),"=r"(hi)::); + cyc = ((unsigned long long)hi << 32) | lo; +#elif defined(__x86_64__) + unsigned int hi, lo; + __asm__ __volatile__("rdtsc":"=a"(lo),"=d"(hi)); + cyc = ((unsigned long long)hi << 32) | lo; +#else + cyc = 0xBADBAD; +#endif + return cyc; +} + + +/* + * Frequency of the hardware timestamp (not the core clock frequency). + * This could be derived from the time conversion parameters in the + * mmap header, but we may also be able to get it directly. + */ +static inline unsigned long long hardware_timestamp_frequency(void) +{ + unsigned long long freq = 0; +#if defined(__arm64__) || defined(__AARCH64EL__) || defined(__ARM_ARCH_ISA_A64) + __asm__ __volatile__("mrs %0,cntfrq_el0":"=r"(freq)::); +#elif defined(__ARMEL__) + unsigned int lo; /* In AArch32 we only see a 32-bit CNTFRQ */ + __asm__ __volatile__("mrc p15,0,%0,c14,c0,0":"=r"(lo)::); + freq = lo; +#else + // TBD +#endif + return freq; +} + + +/* + * Read a hardware PMU register, given the register selector. + * + * For general events this will be a small integer from 0 upwards. + * In the mmap header, the number is offset by 1 (because 0 indicates the + * event can't be read from a counter). We are called with the actual + * counter number i.e. 0 means counter #0. + * + * For x86, fixed-function register selectors are: + * 40000000: IA32_FIXED_CTR0 INST_RETIRED.ANY + * 40000001: IA32_FIXED_CTR1 CPU_CLK_UNHALTED.THREAD + * 40000002: IA32_FIXED_CTR2 CPU_CLK_UNHALTED.REF_TSC + * 40000003: IA32_FIXED_CTR3 TOPDOWN.SLOTS + */ +static inline unsigned long long rdpmc(unsigned int idx) +{ + unsigned long long count = 0; +#if defined(__arm64__) || defined(__AARCH64EL__) || defined(__ARM_ARCH_ISA_A64) + switch (idx) { + /* ARM PMU architecture defines up to 31 counter registers */ +#define REV(idx) case (idx): __asm__ __volatile__("mrs %0,pmevcntr" #idx "_el0":"=r"(count)); break + REV(0); + REV(1); + REV(2); + REV(3); + REV(4); + REV(5); + REV(6); + REV(7); + REV(8); + REV(9); + REV(10); + REV(11); + REV(12); + REV(13); + REV(14); + REV(15); + REV(16); + REV(17); + REV(18); + REV(19); + REV(20); + REV(21); + REV(22); + REV(23); + REV(24); + REV(25); + REV(26); + REV(27); + REV(28); + REV(29); + REV(30); +#undef REV + case 31: + /* Counter 31 is the dedicated cycle counter */ + __asm__ __volatile__("mrs %0,pmccntr_el0":"=r"(count)); + break; + default: + assert(0); + } +#elif defined(__x86_64__) + unsigned int hi, lo; + __asm__ __volatile__("rdpmc":"=a"(lo),"=d"(hi):"c"(idx)); + count = ((unsigned long long)hi << 32) | lo; +#endif + return count; +} + + +/* + * Try to read the current event value from userspace, into an event_sample_t. + * Return 1 if successful, 0 if unsuccessful. + * + * This only makes sense if we're monitoring either + * - our own thread, and nothing else + * - this core, and nothing else + * It probably doesn't make sense for grouped objects either, since we + * can't guarantee to read all counters in a group without a schedule. + */ +static int perf_read_count_userspace(event_sample_t *ed, EventObject *e) +{ + if (!e->mmap_page) { + fprintf(stderr, "perf event: read_count_userspace called with no buffer\n"); + ensure_minimal_mmap_page(e); + } + struct perf_event_mmap_page volatile *mp = e->mmap_page; + /* First test to see if this event is readable from userspace. + We assume the 'capabilities' don't change during the lifetime of the event. */ + const unsigned int caps_needed = _cap_user_rdpmc|_cap_user_time; + if ((mp->capabilities & caps_needed) != caps_needed) { + /* Can't read PMU from userspace */ + return 0; + } + unsigned int seq; + unsigned long long enabled, running; + unsigned int time_mult, time_shift; + unsigned long long cyc, time_offset; + unsigned int idx, width=0; + unsigned long long count_offset, count_value=0; + do { + seq = mp->lock; + barrier(); + enabled = mp->time_enabled; + running = mp->time_running; + if (1 /* mp->capabilities & _cap_user_time */) { + cyc = hardware_timestamp(); + time_offset = mp->time_offset; + time_mult = mp->time_mult; + time_shift = mp->time_shift; + } + count_offset = mp->offset; + idx = mp->index; + if ((mp->capabilities & _cap_user_rdpmc) && idx != 0) { /* cap_user_rdpmc */ + /* This event is currently scheduled on to a hardware counter. */ + width = mp->pmc_width; + count_value = rdpmc(idx - 1); + } + barrier(); + } while (mp->lock != seq); + if (0) { + fprintf(stderr, "-- [%u] read_count_userspace, caps=0x%x:\n", e->fd, (unsigned int)mp->capabilities); + if (mp->capabilities & _cap_user_time) { + fprintf(stderr, "-- cyc=0x%llx time_offset=0x%llx 0x%llx time_mult=%u/0x%x time_shift=%u\n", + cyc, time_offset, cyc-time_offset, time_mult, time_mult, time_shift); + } + if ((mp->capabilities & _cap_user_rdpmc) && idx != 0) { + fprintf(stderr, "-- idx=%u/0x%x width=%u count_offset=0x%llx count_value=0x%llx adj-count=0x%llx\n", + idx, idx, width, count_offset, count_value, count_offset+count_value); + } + fprintf(stderr, "-- enabled=%llx running=%llx\n", enabled, running); + } + if (idx != 0) { + /* The hardware counter value needs to be sign-extended before use. */ + count_value = (signed long long)(count_value << (64-width)) >> (64-width); + count_value += count_offset; + } else { + count_value = count_offset; + } + { + unsigned long long quot, rem, delta; + quot = (cyc >> time_shift); + rem = cyc & ((1ULL << time_shift) - 1); + delta = time_offset + quot*time_mult + ((rem*time_mult) >> time_shift); + enabled += delta; + if (idx != 0) { + running += delta; + } + } + ed->value = count_value; + ed->time_enabled = enabled; /* should add current time to this? */ + ed->time_running = running; /* ditto */ + ed->id = e->id; + if (0) { + fprintf(stderr, "-- value in mmap: "); + fprint_event_sample(stderr, ed); + } + return 1; +} + + +/* + * Read a counter event's value(s). + * Use userspace if available, else use read(). + */ +static int perf_read_count(PyObject *x) +{ + int ok; + BaseReadingObject *base = (BaseReadingObject *)x; + EventObject *e = base->event; + if (e->try_userspace_read) { + ok = perf_read_count_userspace(&base->sample, e); + if (ok) { + if (0) { + /* Consistency check against read() values */ + event_sample_t *ed = &base->sample; + event_sample_t edr = *ed; + perf_read_count_using_read(x); + if (ed->value < edr.value) { + fprintf(stderr, "[%u] mmap: ", e->fd); + fprint_event_sample(stderr, ed); + fprintf(stderr, "[%u] read: ", e->fd); + fprint_event_sample(stderr, &edr); + } + assert(ed->value >= edr.value); + } + postprocess_reading(x); + return ok; + } + } + ok = !!perf_read_count_using_read(x); + if (e->datasnap != NULL) { + /* Subtract event data from the baseline. */ + subtract_event_values(x, e->datasnap, e); + } + postprocess_reading(x); + return ok; +} + + +/* +Reset an event's value to zero - at least as far as the API is concerned. + +About PERF_EVENT_IOC_RESET: +"This resets only the counts; there is no way to reset the multiplexing +time_enabled or time_running values." + +So instead, we snapshot the counter values, and present future values as +a delta against that. +*/ +static PyObject *event_read(PyObject *x); +static PyObject *event_reset(PyObject *x) +{ + EventObject *e = (EventObject *)x; + if (0) { + int rc = ioctl(e->fd, PERF_EVENT_IOC_RESET, 0); + if (rc != 0) { + PyErr_SetString(PyExc_ValueError, "bad ioctl(RESET)"); + return NULL; + } + return PyInt_FromLong(rc); + } else { + if (e->datasnap) { + Py_DECREF(e->datasnap); + e->datasnap = NULL; + } + e->datasnap = event_read(x); + //fprintf(stderr, "-- [%u] snapshot %llx\n", e->fd, e->datasnap.value); + return PyInt_FromLong(0); /* success */ + } +} + + +static PyObject *event_refresh(PyObject *x, PyObject *arg) +{ + EventObject *e = (EventObject *)x; + int rc; + int n = PyLong_AsLong(arg); + rc = ioctl(e->fd, PERF_EVENT_IOC_REFRESH, n); + if (rc < 0) { + return NULL; + } + return PyInt_FromLong(rc); +} + + +static PyObject *event_pause(PyObject *x) +{ + EventObject *e = (EventObject *)x; + int rc = ioctl(e->fd, PERF_EVENT_IOC_PAUSE_OUTPUT, 1); + return PyInt_FromLong(rc); +} + + +static PyObject *event_resume(PyObject *x) +{ + EventObject *e = (EventObject *)x; + int rc = ioctl(e->fd, PERF_EVENT_IOC_PAUSE_OUTPUT, 0); + return PyInt_FromLong(rc); +} + + +/* + * fileno() method - as for Python file objects. + * This means the Event object can be used directly in e.g. select.poll.register(). + */ +static PyObject *event_fileno(PyObject *x) +{ + EventObject *e = (EventObject *)x; + return PyInt_FromLong(e->fd); +} + + +static PyObject *event_enable(PyObject *x) +{ + EventObject *e = (EventObject *)x; + int rc = ioctl(e->fd, PERF_EVENT_IOC_ENABLE, 0); + if (rc != 0) { + PyErr_SetString(PyExc_ValueError, "bad ioctl(ENABLE)"); + return NULL; + } + e->attr.disabled = 0; + return PyInt_FromLong(rc); +} + + +static PyObject *event_disable(PyObject *x) +{ + EventObject *e = (EventObject *)x; + int rc = ioctl(e->fd, PERF_EVENT_IOC_DISABLE, 0); + if (rc != 0) { + PyErr_SetString(PyExc_ValueError, "bad ioctl(DISABLE)"); + return NULL; + } + e->attr.disabled = 1; + return PyInt_FromLong(rc); +} + + +/* + * Pass a filter to the kernel. See kernel/events/core.c for syntax. + * Address filters for hardware trace have this syntax: + * + * filter - limit tracing to a range + * start - start when execution enters this range + * stop - stop when execution enters this range + * + * is + * + * [/] - kernel address + * [/]@object - address in module + * + * "perf record" accepts a more general syntax that can resolve + * symbol names: see tools/perf/Documentation/perf-record.txt + */ +static PyObject *event_set_filter(PyObject *x, PyObject *s) +{ + EventObject *e = (EventObject *)x; + char const *str = PyString_AsString(s); + if (str) { + if (e->verbose) { + fprintf(stderr, "[%d]: set filter \"%s\"\n", e->fd, str); + } + int rc = ioctl(e->fd, PERF_EVENT_IOC_SET_FILTER, str); + if (rc != 0) { + if (e->verbose) { + perror("ioctl"); + } + PyErr_SetString(PyExc_ValueError, "bad ioctl(SET_FILTER)"); + return NULL; + } else { + /* filter was set successfully: return self */ + Py_INCREF(x); + return x; + } + } else { + PyErr_SetString(PyExc_ValueError, "expected string"); + return NULL; + } +} + + +static int event_get_id(EventObject *e) +{ + if (e->id == 0) { + int rc = ioctl(e->fd, PERF_EVENT_IOC_ID, &e->id); + if (rc != 0) { + return 0; + } + } + return 1; +} + + +static PyObject *event_id(PyObject *x) +{ + EventObject *e = (EventObject *)x; + if (!event_get_id(e)) { + PyErr_SetString(PyExc_ValueError, "bad ioctl"); + return NULL; + } + return PyLong_FromUnsignedLongLong(e->id); +} + + +static PyObject *basereading_new(PyTypeObject *ot, PyObject *args, PyObject *kwds) +{ + assert(0); + return NULL; +} + +static PyObject *reading_new(PyTypeObject *ot, PyObject *args, PyObject *kwds) +{ + ReadingObject *t = (ReadingObject *)ot->tp_alloc(ot, 0); + assert(t->base.event == NULL); + //fprintf(stderr, "-- reading %p alloc\n", t); + return (PyObject *)t; +} + + +static PyObject *groupreading_new(PyTypeObject *ot, PyObject *args, PyObject *kwds) +{ + GroupReadingObject *t = (GroupReadingObject *)ot->tp_alloc(ot, 0); + assert(t->base.event == NULL); + t->samples = NULL; + return (PyObject *)t; +} + + +static void basereading_dealloc(PyObject *x) +{ + assert(0); +} + +static void reading_dealloc(PyObject *x) +{ + ReadingObject *r = (ReadingObject *)x; + //fprintf(stderr, "-- reading %p dealloc\n", r); + Py_DECREF(r->base.event); + r->base.event = NULL; + if (r->adjusted_value != Py_None) { + Py_DECREF(r->adjusted_value); + } + x->ob_type->tp_free(x); +} + +static void groupreading_dealloc(PyObject *x) +{ + GroupReadingObject *r = (GroupReadingObject *)x; + Py_DECREF(r->base.event); + free(r->samples); + x->ob_type->tp_free(x); +} + + +/* + * A reading is missing if the task was never scheduled, or if it was + * scheduled but the event was never assigned to a counter. + */ +static PyObject *reading_is_missing(PyObject *x) +{ + BaseReadingObject *r = (BaseReadingObject *)x; + return PyBool_FromLong(r->sample.time_running == 0); +} + +/* + * A reading is incomplete if the task was scheduled but the event + * was not always assigned to a counter. This includes both the case + * where the event was sometimes assigned to a counter (and 'value' + * will be scaled) and when it was never assigned to a counter + * (and 'value' is None). + */ +static PyObject *reading_is_incomplete(PyObject *x) +{ + BaseReadingObject *r = (BaseReadingObject *)x; + assert(r->sample.time_running <= r->sample.time_enabled); + return PyBool_FromLong(r->sample.time_running != r->sample.time_enabled); +} + + +static PyObject *reading_str(PyObject *x) +{ + ReadingObject *r = (ReadingObject *)x; + if (!r->base.sample.time_enabled) { + return PyString_FromFormat(""); + } else if (r->base.fraction_running == 1.0) { + return PyString_FromFormat("%llu", r->base.sample.value); + } else { + /* PyString_FromFormat doesn't support floats, so we print + the raw enabled/running values */ + char adj_value_string[100]; + if (r->adjusted_value != Py_None) { + sprintf(adj_value_string, "adjusted value %f", PyFloat_AsDouble(r->adjusted_value)); + } else { + strncpy(adj_value_string, "no value", 10); + } + return PyString_FromFormat("%llu (running %llu enabled %llu, %s)", + r->base.sample.value, r->base.sample.time_running, r->base.sample.time_enabled, adj_value_string); + } +} + + +static PyObject *groupreading_str(PyObject *x) +{ + GroupReadingObject *r = (GroupReadingObject *)x; + if (!r->base.sample.time_enabled) { + return PyString_FromFormat(""); + } else { + return PyString_FromFormat("GroupReading(%u values)", r->n_values); + } +} + + +static Py_ssize_t groupreading_seq_length(PyObject *x) +{ + GroupReadingObject *r = (GroupReadingObject *)x; + return r->n_values; +} + + +static ReadingObject *create_reading_object(EventObject *e); + +static PyObject *groupreading_seq_item(PyObject *x, Py_ssize_t i) +{ + GroupReadingObject *r = (GroupReadingObject *)x; + ReadingObject *nr; + if (i < 0 || i >= r->n_values) { + return NULL; + } + nr = create_reading_object(r->base.event); + nr->base.sample = r->samples[i]; + postprocess_value(&nr->adjusted_value, nr->base.sample.value, &r->base); + return (PyObject *)nr; +} + + +/* + * Create a ReadingObject and bind it to an event. + */ +static ReadingObject *create_reading_object(EventObject *e) +{ + ReadingObject *r = (ReadingObject *)PyObject_CallObject((PyObject *)&ReadingType, NULL); + assert(e != NULL); + Py_INCREF(e); + r->base.event = e; + return r; +} + + +/* + * Create a GroupReading object, but don't yet create the array of samples. + */ +static GroupReadingObject *create_group_reading_object(EventObject *e) +{ + GroupReadingObject *r = (GroupReadingObject *)PyObject_CallObject((PyObject *)&GroupReadingType, NULL); + assert(e != NULL); + Py_INCREF(e); + r->base.event = e; + return r; +} + + +static PyObject *create_correct_reading_object(EventObject *e) +{ + return (e->attr.read_format & PERF_FORMAT_GROUP) ? + (PyObject *)create_group_reading_object(e) : + (PyObject *)create_reading_object(e); +} + + +/* + * Create a Reading object from a 'struct read_format', either read from + * the file descriptor (perf stat) or from a PERF_SAMPLE_READ (perf record). + * Fill in the 'adjusted_value' field with a Python object to represent + * the value adjusted for the event's running-fraction - None if the event + * was never running. + */ +#if 0 +static void perf_update_reading(ReadingObject *, event_sample_t const *); +static ReadingObject *reading_from_data(event_sample_t const *ed, EventObject const *e, ReadingObject *r) +{ + assert(!(e->attr.read_format & PERF_FORMAT_GROUP)); + EventObject *re = (EventObject *)e; + if (ed->id != 0 && ed->id != e->id) { + /* A sampling event might have been written to its parent's buffer. + Look up the actual event. */ + re = event_find_subordinate(e, ed->id); + if (!re) { + fprintf(stderr, "perf event: unexpected event id: 0x%llX\n", ed->id); + assert(0); + } + } + if (!r) { + r = create_reading_object(re); + } + assert(r->base.event == e); + perf_update_reading(r, ed); + return r; +} +#endif + + +#if 0 +static void perf_update_reading(ReadingObject *r, event_sample_t const *ed) +{ + EventObject const *e = r->base.event; + //fprintf(stderr, "-- [%u] org value =%llx datasnap = %llx\n", e->fd, ed->value, e->datasnap.value); + /* Because we implement event_reset() by taking a snapshot, we now recalulate + all the event metrics as a delta against that snapshot. */ + assert(ed->value >= e->datasnap.value); + r->base.sample.value = ed->value - e->datasnap.value; + r->base.sample.time_enabled = ed->time_enabled - e->datasnap.time_enabled; + r->base.sample.time_running = ed->time_running - e->datasnap.time_running; + if (r->base.sample.time_enabled != 0.0) { + r->base.fraction_running = (double)r->base.sample.time_running / r->base.sample.time_enabled; + if (r->base.fraction_running != 0.0) { + /* Increase the value to compensate for partial sampling */ + if (r->adjusted_value && r->adjusted_value != Py_None) { + Py_DECREF(r->adjusted_value); + } + r->adjusted_value = PyFloat_FromDouble(r->base.sample.value / r->base.fraction_running); + } else { + r->adjusted_value = Py_None; + } + } else { + r->base.fraction_running = 0.0; + r->adjusted_value = Py_None; + } + if (e->verbose) { + double adjv = (r->base.fraction_running ? (r->base.sample.value / r->base.fraction_running) : 0.0); + fprintf(stderr, "perf event %p: value=%llu enabled=%llu running=%llu=%.5f adjusted=%.2f\n", + e, + (unsigned long long)r->base.sample.value, + (unsigned long long)r->base.sample.time_enabled, + (unsigned long long)r->base.sample.time_running, + r->base.fraction_running, + adjv); + } + Py_INCREF(r->adjusted_value); +} +#endif + + +static unsigned long long const *read_data_to_sample(event_sample_t *ed, unsigned long long const *p, EventObject const *e) +{ + if (e->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { + ed->time_enabled = *p++; + } else { + ed->time_enabled = 0xCCCCCCCC; + } + if (e->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) { + ed->time_running = *p++; + } else { + ed->time_running = 0xCCCCCCCC; + } + return p; +} + + +/* + * Populate a Reading or GroupReading object from a data buffer either read from read() + * or in a record in the mmap buffer. + */ +static PyObject *populate_reading_object_from_data(PyObject *x, void const *data, EventObject *e) +{ + unsigned long long const *p = (unsigned long long const *)data; + if (!(e->attr.read_format & PERF_FORMAT_GROUP)) { + ReadingObject *r = (ReadingObject *)x; + event_sample_t *ed = &r->base.sample; + ed->value = *p++; + p = read_data_to_sample(ed, p, e); + if (e->attr.read_format & PERF_FORMAT_ID) { + ed->id = *p++; + } else { + ed->id = 0xCCCCCCCC; + } + } else { + GroupReadingObject *g = (GroupReadingObject *)x; + event_sample_t *ed = &g->base.sample; + g->n_values = (unsigned int)*p++; + unsigned int i; + p = read_data_to_sample(ed, p, e); + g->samples = (event_sample_t *)malloc(g->n_values * sizeof(event_sample_t)); + for (i = 0; i < g->n_values; ++i) { + event_sample_t *sed = &g->samples[i]; /* array entry to write into */ + *sed = *ed; + sed->value = *p++; + if (e->attr.read_format & PERF_FORMAT_ID) { + sed->id = *p++; + } else { + sed->id = 0xCCCCCCCC; + } + } + } + return x; +} + + +/* + * Create a Reading or GroupReading object from data. + */ +static PyObject *create_reading_object_from_data(void const *data, EventObject *e) +{ + PyObject *x = create_correct_reading_object(e); + x = populate_reading_object_from_data(x, data, e); + return x; +} + + +/* +Read the current value of an event counter, as a Reading object. +We hope it hasn't wrapped. A Reading object may be passed in - its data +will be discarded. + +We only expect to call this on a counting event, not a sampling event. +*/ +static PyObject *take_reading(EventObject *e, PyObject *r) +{ + if (!r) { + r = create_correct_reading_object(e); + } + if (perf_read_count(r)) { + return (PyObject *)r; + } else { + return NULL; + } +} + + +/* + * Return a new Reading or GroupReading object + */ +static PyObject *event_read(PyObject *x) +{ + EventObject *e = (EventObject *)x; + PyObject *r = take_reading(e, NULL); + //Py_INCREF(r); + return r; +} + + +/* + * Update a Reading object + */ +static PyObject *reading_update(PyObject *x) +{ + ReadingObject *r = (ReadingObject *)x; + //fprintf(stderr, "reading %p event %p\n", r, r->event); + assert(r->base.event != NULL); + PyObject *rn = take_reading(r->base.event, x); + /* Returning 'self' creates a new reference, so we must increment the + reference count to avoid being discarded. */ + Py_INCREF(rn); + return rn; +} + + +/* + * The __str__ should be human-readable. + */ +static PyObject *event_str(PyObject *x) +{ + EventObject const *e = (EventObject *)x; + return PyString_FromFormat("event[%d](type=%u,n=0x%x,cpu=%d)[%sabled]", + e->fd, (unsigned int)e->attr.type, (unsigned int)e->attr.config, (int)e->cpu, (e->attr.disabled ? "dis" : "en")); +} + + +/* + * Python object corresponding to a sampled event or other record - as acquired + * from the memory mapped buffer. This object is logically read-only + * once acquired. + */ +typedef struct { + PyObject_HEAD + EventObject *event; /* back-pointer to the sampling event we got this from */ + unsigned long offset; /* original offset of this record in the buffer */ + size_t data_size; /* total size of the collected data */ + struct perf_event_header head; /* includes type, size etc. */ + void *data; /* variable amount of data, specific to record type: includes header */ + PyObject *aux; /* for PERF_RECORD_AUX: AUX buffer segment corresponding to this record */ +} RecordObject; + + +/* + * Return the previously collected record payload as a binary string object. + * This includes: + * the standard record header (perf_event_header) + * the payload + * the 'struct sample_id' possibly present at the end of the payload + * This matches the record that gets written to perf.data. + * + * N.b. this means we copy twice: once out of perf's mmap ring buffer into the + * Record's malloc'ed buffer, and then again when we return the string object. + * We could do better by creating a string to start with. + */ +static PyObject *record_data(PyObject *x) +{ + RecordObject *s = (RecordObject *)x; + return MyBytes_FromStringAndSize(s->data, s->data_size); +} + + +static PyObject *record_new(PyTypeObject *t, PyObject *args, PyObject *kwds) +{ + RecordObject *s = (RecordObject *)t->tp_alloc(t, 0); + assert(s != NULL); + assert(s->event == NULL); + s->data = NULL; + s->aux = Py_None; + Py_INCREF(s->aux); + return (PyObject *)s; +} + + +static char const *record_type_name(unsigned int type) +{ + unsigned int i; + char const *typestr = NULL; + static struct { + char const *name; + unsigned int type; + } const typestrs[] = { +#define TYPE(x) { #x, PERF_RECORD_##x } + TYPE(MMAP), + TYPE(LOST), + TYPE(COMM), + TYPE(EXIT), + TYPE(THROTTLE), + TYPE(UNTHROTTLE), + TYPE(FORK), + TYPE(READ), + TYPE(SAMPLE), + TYPE(MMAP2), +#ifdef PERF_RECORD_MMAP + /* Older kernels have these as macros, so we can test each one. */ +#ifdef PERF_RECORD_AUX + TYPE(AUX), +#endif /* PERF_RECORD_AUX */ +#ifdef PERF_RECORD_ITRACE_START + TYPE(ITRACE_START), +#endif /* PERF_RECORD_ITRACE_START */ +#ifdef PERF_RECORD_LOST_SAMPLES + TYPE(LOST_SAMPLES), +#endif /* PERF_RECORD_LOST_SAMPLES */ +#ifdef PERF_RECORD_SWITCH + TYPE(SWITCH), +#endif /* PERF_RECORD_SWITCH */ +#ifdef PERF_RECORD_SWITCH_CPU_WIDE + TYPE(SWITCH_CPU_WIDE) +#endif /* PERF_RECORD_SWITCH_CPU_WIDE */ +#else + /* PERF_RECORD_MMAP not being #define'd, indicates we're now using enumerators. + So we have to hope that we have the full set. */ + TYPE(AUX), + TYPE(ITRACE_START), + TYPE(LOST_SAMPLES), + TYPE(SWITCH), + TYPE(SWITCH_CPU_WIDE) +#endif +#undef TYPE + }; + for (i = 0; i < sizeof(typestrs)/sizeof(typestrs[0]); ++i) { + if (type == typestrs[i].type) { + typestr = typestrs[i].name; + break; + } + } + return typestr; +} + + + + +/* + * Create a Reading or GroupReading object from data in a record. + */ +static PyObject *record_reading(PyObject *x) +{ + RecordObject const *s = (RecordObject *)x; + if (s->head.type == PERF_RECORD_SAMPLE && + s->event->attr.sample_type & PERF_SAMPLE_READ) { + /* Find the read object in the sample payload */ + unsigned int const offs = sample_offset_to_read(&s->event->attr); + return create_reading_object_from_data((unsigned char const *)s->data + offs, s->event); + } else { + /* Presence/absence of a read object is a property of the sample type and configuration. + It's reasonable to throw an exception if we ask for one invalidly. */ + PyErr_SetString(PyExc_ValueError, "record does not contain a counter reading"); + return NULL; + } +} + + +static PyObject *record_is_sample(PyObject *x) +{ + RecordObject const *s = (RecordObject *)x; + return PyBool_FromLong(s->head.type == PERF_RECORD_SAMPLE); +} + + +static PyObject *record_str(PyObject *x) +{ + RecordObject const *s = (RecordObject *)x; + char const *typestr = record_type_name(s->head.type); + if (!typestr) { + typestr = "?"; + } + return PyString_FromFormat("Record(%s,databytes=%u)", + typestr, (unsigned int)s->data_size); +} + + +static void record_dealloc(PyObject *x) +{ + RecordObject *s = (RecordObject *)x; + free(s->data); + Py_DECREF(s->event); + Py_DECREF(s->aux); + x->ob_type->tp_free(x); +} + + +static struct PyMethodDef Record_methods[] = { + {"data", (PyCFunction)&record_data, METH_NOARGS, "string: raw data"}, + {"reading", (PyCFunction)&record_reading, METH_NOARGS, "Reading: event value reading"}, + {"is_sample", (PyCFunction)&record_is_sample, METH_NOARGS, "bool: record is a sample"}, + {"__bytes__", (PyCFunction)&record_data, METH_NOARGS, "string: raw data"}, + {NULL} +}; + +static struct PyMemberDef Record_members[] = { + {"event", T_OBJECT, offsetof(RecordObject, event), 0, "event that record was read from"}, + {"offset", T_LONG, offsetof(RecordObject, offset), 0, "byte offset in mmap buffer"}, + {"type", T_INT, offsetof(RecordObject, head.type), 0, "record type"}, + {"misc", T_SHORT, offsetof(RecordObject, head.misc), 0, "record mode and flags"}, + {"size", T_SHORT, offsetof(RecordObject, head.size), 0, "record total size (including header)"}, + {"aux", T_OBJECT, offsetof(RecordObject, aux), 0, "AUX buffer contents"}, + {NULL} +}; + + +static PyTypeObject RecordType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_basicsize = sizeof(RecordObject), + .tp_name = "perf_events.Record", + .tp_doc = "perf event", + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = Record_methods, + .tp_members = Record_members, +// tp_repr: sample_repr, + .tp_str = record_str, + .tp_alloc = 0, + .tp_new = record_new, +// tp_init: sample_init, + .tp_dealloc = record_dealloc +}; + + +/* + * Copy 'len' bytes from a buffer which may have wrapped. + * 'offset' is the non-wrapping offset into the buffer - continually increasing + * (as for perf buffers) which must be wrapped into a real offset before use. + */ +void copy_from_wrapped_buffer(void *dst, void const *vbuf, size_t buf_size, size_t virtual_offset, size_t len) +{ + unsigned int real_offset = virtual_offset % buf_size; + unsigned int fs = buf_size - real_offset; + assert(len <= buf_size); + if (fs > len) { + fs = len; + } + /* fs is now the first part of the data to copy (all of it, unless wrapped) */ + memcpy(dst, (unsigned char const *)vbuf + real_offset, fs); + if (fs < len) { + /* data wrapped, copy remainder from the beginning */ + memcpy((unsigned char *)dst + fs, vbuf, len - fs); + } +} + + +#if defined(PERF_RECORD_AUX) || !defined(PERF_RECORD_MMAP) +/* + * There are two ways we could retrieve data from the AUX buffer: + * + * - we can directly poll and update the head/tail pointers like we do for the + * main mmap ring buffer + * + * - we can use the (offset,size) information that we are given in PERF_RECORD_AUX + * records that we get from the main mmap ring buffer. We would expect these + * notifications to occur in order, so that the oldest such outstanding notification + * has the data at the tail pointer. + */ + +/* Manage the AUX buffer tail - factored out in case we use a read-only AUX buffer */ + +static unsigned long event_aux_tail(EventObject *e) +{ + return e->mmap_page->aux_tail; +} + + +static void event_update_aux_tail(EventObject *e, unsigned long na) +{ + if (e->verbose) { + fprintf(stderr, "updating tail from 0x%llx to 0x%lx; head at 0x%llx\n", e->mmap_page->aux_tail, na, e->mmap_page->aux_head); + } + assert(na <= e->mmap_page->aux_head); /* tail must not advance past head */ + e->mmap_page->aux_tail = na; + __sync_synchronize(); +} +#endif /* PERF_RECORD_AUX */ + + +/* + * Get a chunk of AUX data, of a given length. + * This consumes data directly from the mmap'ed AUX buffer. + * Normally it's better to have the data from the AUX buffer consumed by + * reading the corresponding PERF_RECORD_AUX from the main mmap buffer. + */ +static PyObject *get_aux_data(EventObject *e, unsigned int len) +{ + PyObject *s; + if (!e->mmap_page || !e->aux_area) { + Py_RETURN_NONE; + } + if (len == 0) { + Py_RETURN_NONE; + } + /* Get the AUX data. Python lets us construct a buffer object of the required + length and then write directly into it. */ + s = MyBytes_FromStringAndSize(NULL, len); + copy_from_wrapped_buffer(MyBytes_AsString(s), e->aux_area, e->aux_size, event_aux_tail(e), len); + event_update_aux_tail(e, e->mmap_page->aux_tail + len); + return s; +} + + +/* + * Get as big a chunk of AUX data as we can. + */ +static PyObject *event_get_aux(PyObject *x) +{ +#if defined(PERF_RECORD_AUX) || !defined(PERF_RECORD_MMAP) + EventObject *e = (EventObject *)x; + /* Make sure to read aux_head just once, in case it moves on while we're consuming the tail */ + unsigned int len = e->mmap_page->aux_head - e->mmap_page->aux_tail; + return get_aux_data(e, len); +#else /* !PERF_RECORD_AUX */ + Py_RETURN_NONE; +#endif /* PERF_RECORD_AUX */ +} + + +/* + * Collect one record from the mmap buffer - return a Record event if + * an event is available, otherwise return None. + * Event source must already have been set up for sampling, e.g. by calling poll(). + */ +static PyObject *event_get_record(PyObject *x) +{ + EventObject *e = (EventObject *)x; + if (!e->mmap_page) { + /* Never going to return an event until we set up the buffer - + should we raise an exception? */ + Py_RETURN_NONE; + } + if (!event_available(e)) { + Py_RETURN_NONE; + } + /* A sample is available. Construct a new Record object. */ + struct perf_event_header head; + /* Populate the sample object from the mmap'ed sample buffer. + This is slightly tricky as the buffer may wrap around in the + sample - in the header, between header and data or in the data. */ + copy_from_wrapped_buffer(&head, e->mmap_data_start, e->mmap_data_size, e->mmap_page->data_tail, sizeof(struct perf_event_header)); +#ifdef PRINTF_DIAGNOSTICS + if (e->verbose) { + char const *typestr = record_type_name(head.type); + if (!typestr) { + typestr = "?"; + } + fprintf(stderr, "%u: event record available: total record size: %u type: %u (%s); samples expected: ", + e->fd, head.size, head.type, typestr); + fprint_flags(stderr, e->attr.sample_type, FLAG_NAMES(sample_flagnames)); + fprintf(stderr, "\n"); + } +#endif /* PRINTF_DIAGNOSTICS */ + if (head.size < sizeof(struct perf_event_header) || + head.size > e->mmap_data_size) { + /* Corrupt */ + fprintf(stderr, "sample corrupt: length = %ld\n", (long)head.size); + return NULL; + } + /* We could make Record flexibly sized, but for now we have a separate buffer */ + RecordObject *s = (RecordObject *)PyObject_CallObject((PyObject *)&RecordType, NULL); + s->offset = e->mmap_page->data_tail; + s->head = head; /* Copy the (small) head structure */ + s->data_size = head.size; + s->data = malloc(s->data_size); + /* Copy the complete record, including the header (again) */ + copy_from_wrapped_buffer(s->data, e->mmap_data_start, e->mmap_data_size, e->mmap_page->data_tail, s->data_size); + /* data is in s->data in the Record object */ + /* Now update the read pointer in the shared metadata */ + if (1) { + /* Page is writeable - update the tail pointer so kernel can now + overwrite the record we've just collected. */ + e->mmap_page->data_tail += head.size; + __sync_synchronize(); + } + if (e->aux_area) { + //fprintf(stderr, "aux_head = %llx, aux_tail = %llx\n", e->mmap_page->aux_head, e->mmap_page->aux_tail); + } + if (head.type == PERF_RECORD_AUX) { + /* Get the AUX data now */ + typedef struct { + struct perf_event_header header; + unsigned long long aux_offset; + unsigned long long aux_size; + unsigned long long flags; + } aux_header_t; + aux_header_t const *ah = (aux_header_t const *)s->data; + if (1 || e->verbose) { + /* Show this PERF_RECORD_AUX segment in relation to the AUX ring buffer. + The offset, tail and head pointers are "infinite". */ + fprintf(stderr, "[%d] AUX flags=0x%lx offset 0x%lx size 0x%lx, current AUX tail 0x%lx head 0x%lx size 0x%lx", + e->fd, + (unsigned long)ah->flags, + (unsigned long)ah->aux_offset, (unsigned long)ah->aux_size, + (unsigned long)e->mmap_page->aux_tail, + (unsigned long)e->mmap_page->aux_head, + (unsigned long)e->mmap_page->aux_size); + if (ah->flags & PERF_AUX_FLAG_TRUNCATED) { + fprintf(stderr, " TRUNCATED"); + } + if (ah->flags & PERF_AUX_FLAG_OVERWRITE) { + fprintf(stderr, " OVERWRITE"); + } + if (ah->flags & PERF_AUX_FLAG_PARTIAL) { + fprintf(stderr, " PARTIAL"); + } + if (ah->flags & PERF_AUX_FLAG_COLLISION) { + fprintf(stderr, " COLLISION"); + } + fprintf(stderr, "\n"); + } + /* Guard in case AUX chunk was already consumed by get_aux() */ + if (ah->aux_size == 0) { + /* No data - possibly a TRUNCATED indication */ + event_update_aux_tail(e, ah->aux_offset); + } else if (ah->aux_offset == e->mmap_page->aux_tail) { + /* This AUX record describes the next segment available in the AUX buffer. */ +#ifndef NDEBUG + unsigned long available = e->mmap_page->aux_head - e->mmap_page->aux_tail; +#endif + assert(available >= ah->aux_size); + Py_DECREF(s->aux); /* it was None */ + s->aux = get_aux_data(e, ah->aux_size); + Py_INCREF(s->aux); + } else { + /* Mismatch */ + fprintf(stderr, "** AUX record mismatch\n"); + } + } + /* the Record has a back-pointer to the buffer-owning Event */ + Py_INCREF(e); + s->event = e; + return (PyObject *)s; +} + + +static PyMethodDef Event_methods[] = { + {"attr_struct", (PyCFunction)&event_attr_struct, METH_NOARGS, "string: event attributes as raw string"}, + {"fileno", (PyCFunction)&event_fileno, METH_NOARGS, "int: file handle - not for general use"}, /* this makes it a "waitable object" */ + {"id", (PyCFunction)&event_id, METH_NOARGS, "int: unique id"}, + {"close", (PyCFunction)&event_close, METH_NOARGS, "close the event"}, + {"capabilities", (PyCFunction)&event_capabilities, METH_NOARGS, "int: get capability flags"}, + {"bind", (PyCFunction)&event_bind, METH_VARARGS|METH_KEYWORDS, "int, int -> start collecting an event"}, + {"set_filter", (PyCFunction)&event_set_filter, METH_O, "str: set filter on event"}, + {"reset", (PyCFunction)&event_reset, METH_NOARGS, "int: reset the event count"}, + {"enable", (PyCFunction)&event_enable, METH_NOARGS, "int: enable the event"}, + {"disable", (PyCFunction)&event_disable, METH_NOARGS, "int: disable the event"}, + {"refresh", (PyCFunction)&event_refresh, METH_O, "int -> refresh the wakeup counter"}, + {"pause", (PyCFunction)&event_pause, METH_NOARGS, "pause a sampling event"}, + {"resume", (PyCFunction)&event_resume, METH_NOARGS, "resume a sampling event"}, + {"read", (PyCFunction)&event_read, METH_NOARGS, "Reading: read the current value of a counting event"}, + {"poll", (PyCFunction)&event_poll, METH_NOARGS, "bool: test if event record is available"}, + {"is_active", (PyCFunction)&event_is_active, METH_NOARGS, "bool: test if event was closed by kernel"}, + {"get_record", (PyCFunction)&event_get_record, METH_NOARGS, "Record: get next record from a sampling event"}, + {"get_aux", (PyCFunction)&event_get_aux, METH_NOARGS, "string: get AUX data"}, + {NULL} +}; + + +/* + * Need to explicitly include structmember.h for this? + */ +static struct PyMemberDef Event_members[] = { + {"type", T_INT, offsetof(EventObject, attr.type), 0, "perf event type"}, + {"code", T_INT, offsetof(EventObject, attr.config), 0, "perf event code"}, + {"sample_type", T_ULONGLONG, offsetof(EventObject, attr.sample_type), 0, "mask of data in sample records"}, + {"cpu", T_INT, offsetof(EventObject, cpu), 0, "cpu that this event is bound to, or -1"}, + {"verbose", T_INT, offsetof(EventObject, verbose), 0, "verbosity level"}, + {NULL} +}; + + +static PyTypeObject EventType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_basicsize = sizeof(EventObject), + .tp_name = "perf_events.Event", + .tp_doc = "perf event", + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = Event_methods, + .tp_members = Event_members, + .tp_repr = event_repr, + .tp_str = event_str, + .tp_alloc = 0, + .tp_new = event_new, + .tp_init = event_init, + .tp_dealloc = event_dealloc +}; + + +static PyMethodDef BaseReading_methods[] = { + {"is_incomplete", (PyCFunction)&reading_is_incomplete, METH_NOARGS, "bool: only partial data is available"}, + {"is_missing", (PyCFunction)&reading_is_missing, METH_NOARGS, "bool: no data is available"}, + {"update", (PyCFunction)&reading_update, METH_NOARGS, "take another reading"}, + {NULL} +}; + + +static struct PyMemberDef BaseReading_members[] = { + {"time_enabled_ns", T_LONGLONG, offsetof(BaseReadingObject, sample.time_enabled), 0, "time enabled (ns)"}, + {"time_running_ns", T_LONGLONG, offsetof(BaseReadingObject, sample.time_running), 0, "time running (ns)"}, + {"fraction_running", T_DOUBLE, offsetof(BaseReadingObject, fraction_running), 0, "float: fraction of time event was running"}, + {"event", T_OBJECT, offsetof(BaseReadingObject, event), 0, "Event object this reading was taken from"}, + {"id", T_LONGLONG, offsetof(ReadingObject, base.sample.id), 0, "event id"}, + {NULL} +}; + + +static PyMethodDef Reading_methods[] = { + {NULL} +}; + + +static struct PyMemberDef Reading_members[] = { + {"raw_value", T_LONGLONG, offsetof(ReadingObject, base.sample.value), 0, "raw count"}, + {"value", T_OBJECT, offsetof(ReadingObject, adjusted_value), 0, "adjusted count - None if event was never scheduled"}, + {NULL} +}; + + +static PyMethodDef GroupReading_methods[] = { + {NULL} +}; + + +static PySequenceMethods GroupReading_seqmethods = { + .sq_length = &groupreading_seq_length, + .sq_item = &groupreading_seq_item +}; + + +static struct PyMemberDef GroupReading_members[] = { + {NULL} +}; + + +static PyTypeObject BaseReadingType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_basicsize = sizeof(BaseReadingObject), + .tp_name = "perf_events.BaseReading", + .tp_doc = "Base reading class", + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = BaseReading_methods, + .tp_members = BaseReading_members, + //.tp_str = basereading_str, + .tp_new = basereading_new, /* should not be called */ + .tp_dealloc = basereading_dealloc +}; + + +static PyTypeObject ReadingType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_base = &BaseReadingType, + .tp_basicsize = sizeof(ReadingObject), + .tp_name = "perf_events.Reading", + .tp_doc = "A reading taken from a counting perf event", + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = Reading_methods, + .tp_members = Reading_members, + .tp_str = reading_str, + .tp_new = reading_new, + .tp_dealloc = reading_dealloc +}; + + +static PyTypeObject GroupReadingType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_base = &BaseReadingType, + .tp_basicsize = sizeof(GroupReadingObject), + .tp_name = "perf_events.GroupReading", + .tp_doc = "A reading taken from a counting perf event group", + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = GroupReading_methods, + .tp_members = GroupReading_members, + .tp_as_sequence = &GroupReading_seqmethods, + .tp_str = groupreading_str, + .tp_new = groupreading_new, + .tp_dealloc = groupreading_dealloc +}; + + +/* + * Convert a hardware timestamp to a kernel timestamp as found in perf.data. + */ +static PyObject *timeconv_to_time(PyObject *x, PyObject *v) +{ + TimeConvObject *c = (TimeConvObject *)x; + unsigned long cyc = PyLong_AsLong(v); + unsigned long long quot, rem, st; + quot = (cyc >> c->time_shift); + rem = cyc & ((1ULL << c->time_shift) - 1); + st = c->time_zero + quot*c->time_mult + ((rem*c->time_mult) >> c->time_shift); + return PyLong_FromLong(st); +} + + +static int timeconv_from_mmap(TimeConvObject *c, struct perf_event_mmap_page volatile *mp) +{ + if (!(mp->capabilities & _cap_user_time_zero)) { + /* Can't read timebase from userspace */ + return 0; + } + unsigned int seq; + do { + seq = mp->lock; + barrier(); + if (mp->capabilities & _cap_user_time_zero) { + //cyc = hardware_timestamp(); + c->time_zero = mp->time_zero; + c->time_mult = mp->time_mult; + c->time_shift = mp->time_shift; + } + barrier(); + } while (mp->lock != seq); + return 1; +} + + +/* + * Get the time conversion parameters - these are global, but if we don't + * already have an event we need to open a dummy event to get them. + */ +static int timeconv_from_dummy(TimeConvObject *c) +{ + int ok = 0; + struct perf_event_attr pa; + memset(&pa, 0, sizeof pa); + pa.size = sizeof pa; + pa.type = PERF_TYPE_SOFTWARE; + pa.config = PERF_COUNT_SW_DUMMY; + /* Open a temporary dummy event, which we will close before returning. */ + int e_fd = perf_event_open(&pa, /*pid=*/0, -1, -1, 0); + if (e_fd < 0) { + perror("dummy event"); + return 0; + } + unsigned int size = sysconf(_SC_PAGESIZE); + void *pmap = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, e_fd, 0); + if (pmap != MAP_FAILED) { + ok = timeconv_from_mmap(c, (struct perf_event_mmap_page *)pmap); + if (!ok) { + PyErr_SetString(PyExc_ValueError, "mmap buffer doesn't contain system time base"); + } + munmap(pmap, size); + } else { + perror("mmap"); + } + close(e_fd); /* Close the temporary dummy event. */ + return ok; +} + + +static PyObject *timeconv_new(PyTypeObject *t, PyObject *args, PyObject *kwds) +{ + TimeConvObject *c = (TimeConvObject *)t->tp_alloc(t, 0); + int ok = timeconv_from_dummy(c); + if (!ok) { + t->tp_free(c); + return NULL; + } + return (PyObject *)c; +} + + +static void timeconv_dealloc(PyObject *x) +{ + x->ob_type->tp_free(x); +} + + +static PyMethodDef TimeConv_methods[] = { + {"to_time", (PyCFunction)&timeconv_to_time, METH_O, "convert hardware timestamp to user time"}, + {NULL} +}; + +static struct PyMemberDef TimeConv_members[] = { + {"time_zero", T_LONG, offsetof(TimeConvObject, time_zero), 0, "time zero"}, + {"time_mult", T_LONG, offsetof(TimeConvObject, time_mult), 0, "time multiplier"}, + {"time_shift", T_LONG, offsetof(TimeConvObject, time_shift), 0, "time shift"}, + {NULL} +}; + +static PyTypeObject TimeConvType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_basicsize = sizeof(TimeConvObject), + .tp_name = "perf_events.TimeConv", + .tp_doc = "time conversion parameters", + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = TimeConv_methods, + .tp_members = TimeConv_members, + //.tp_str = timeconv_str, + .tp_new = timeconv_new, + .tp_dealloc = timeconv_dealloc +}; + + +static int sysctl_value(char const *s, int dflt) +{ + FILE *fd = fopen(s, "r"); + if (fd) { + int n; + if (fscanf(fd, "%d", &n) == 1) { + return n; + } + fclose(fd); + } + return dflt; +} + + +/* + * Check if the overall perf_events API is available - might have been configured out. + * + * 2: no measurements + * 1: kernel events + * 0: CPU events + * -1: kernel tracepoints + */ +static PyObject *is_available(void) +{ + int ok = (sysctl_value("/proc/sys/kernel/perf_event_paranoid", 3) <= 2); + return PyBool_FromLong(ok); +} + + +static unsigned int perf_event_mlock_size(void) +{ + static unsigned int size_memo = 0; + if (!size_memo) { + size_memo = 1024 * sysctl_value("/proc/sys/kernel/perf_event_mlock_kb", 0); + } + return size_memo; +} + + +/* + * Get the TID of the current thread. + * This is provided as a convenience function for when we need a TID + * to set up a perf event on a thread. + * + * glibc doesn't have a wrapper for this so we must call via syscall(). + * + * Note that the pthread_t value we get when we start a thread, + * isn't necessarily the thread's TID. + */ +static PyObject *perf_gettid(void) +{ + pid_t tid = (pid_t)syscall(SYS_gettid); + return PyInt_FromLong(tid); +} + + +/* + * Increment the "software increment" event(s), where available. + * This may cause a hardware exception (trap to kernel) if not available from userspace. + * + * On ARM we may have multiple counters configured to count software increments. + * Each counter is incremented by writing a 1 bit to the corresponding bit of SWINC. + * However this doesn't work well when events are dynamically mapped to counters + * by the OS. So we play safe and increment all available s/w increment events. + */ +static PyObject *perf_swinc(PyObject *x) +{ + int ok = 0; +#if defined(__arm64__) || defined(__AARCH64EL__) || defined(__ARM_ARCH_ISA_A64) + /* AArch64: this will get Illegal Instruction if not enabled at EL0 */ + __asm__ __volatile__("msr pmswinc_el0,%0"::"r"((unsigned long long)0x7fffffff)); + ok = 1; +#endif + return PyBool_FromLong(ok); +} + + +/* + * Read a value directly from a hardware event counter (may fault) on the current core. + * This is not generally a safe way to read event values. + * It may fault (if userspace access is not permitted), or race with event scheduling. + */ +static PyObject *perf_rdpmc(PyObject *x, PyObject *vo) +{ + unsigned long ix = PyLong_AsLong(vo); + unsigned long long v = rdpmc(ix); + return PyLong_FromLong(v); +} + + +/* + * Write a value to hardware trace, where supported. + */ +static PyObject *perf_swtrace(PyObject *x, PyObject *vo) +{ + int ok = 0; + unsigned long v = PyLong_AsLong(vo); +#if defined(__x86_64__) + /* This may SIGILL on older cores. We could do a feature check beforehand (TBD). */ + __asm__ __volatile__("ptwrite %0"::"r"(v)); + ok = 1; +#else + (void)v; /* trace is a no-op */ +#endif + return PyBool_FromLong(ok); +} + + +static PyObject *addr_no_randomize(PyObject *x) +{ + int ok = 0; + int prev = personality(0xffffffff); + if (prev == -1) { + perror("personality(-1)"); + } else { + prev = personality(prev | ADDR_NO_RANDOMIZE); + if (prev == -1) { + perror("personality update"); + } else { + ok = 1; + } + } + if (!ok) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + Py_RETURN_NONE; +} + + +/* + * Return the platform-specific hardware timestamp. This can be converted to + * a kernel timestamp using the time conversion factors in the mmap buffer. + * It may appear directly in AUX buffers for various kinds of hardware trace. + */ +static PyObject *perf_hardware_timestamp(PyObject *x) +{ + return PyLong_FromUnsignedLongLong(hardware_timestamp()); +} + + +/* + * Return the platform-specific hardware timestamp frequency, + * if directly available. If not available this way, it might be + * available in the mmap header. + */ +static PyObject *perf_hardware_timestamp_frequency(PyObject *x) +{ + unsigned long long freq = hardware_timestamp_frequency(); + if (freq > 0) { + return PyLong_FromUnsignedLongLong(freq); + } else { + Py_RETURN_NONE; + } +} + + +/* + * Return an integer timestamp with the same timebase as the timestamp in + * perf records (PERF_SAMPLE_TIME). This is typically a count of nanoseconds + * since boot, as returned by sched_clock(). + */ +static PyObject *perf_kernel_timestamp(PyObject *x) +{ + unsigned long long t; + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + t = (unsigned long long)ts.tv_sec * 1000000000 + ts.tv_nsec; + return PyLong_FromUnsignedLongLong(t); +} + + +static PyObject *perf_fileno_event(PyObject *x, PyObject *ixo) +{ + int ix = PyLong_AsLong(ixo); + if (ix < 0 || (unsigned int)ix >= n_fileno_events) { + Py_RETURN_NONE; + } else if (fileno_events[ix] == NULL) { + Py_RETURN_NONE; + } else { + PyObject *e = (PyObject *)fileno_events[ix]; + Py_INCREF(e); + return e; + } +} + + +/* + * General useful global functions. + */ +static PyMethodDef funcs[] = { + {"is_available", (PyCFunction)&is_available, METH_NOARGS, PyDoc_STR("None -> bool: test if perf events is available")}, + {"gettid", (PyCFunction)&perf_gettid, METH_NOARGS, PyDoc_STR("None -> int: get current OS thread id")}, + {"swinc", (PyCFunction)&perf_swinc, METH_NOARGS, PyDoc_STR("None -> bool: increment the Software Increment register")}, + {"swtrace", (PyCFunction)&perf_swtrace, METH_O, PyDoc_STR("int -> write a value to hardware trace")}, + {"rdpmc", (PyCFunction)&perf_rdpmc, METH_O, PyDoc_STR("int -> read a value from a hardware event counter")}, + {"addr_no_randomize", (PyCFunction)&addr_no_randomize, METH_NOARGS, PyDoc_STR("disable ASLR in this and child processes")}, + {"hardware_timestamp", (PyCFunction)&perf_hardware_timestamp, METH_NOARGS, PyDoc_STR("None -> int: read hardware timestamp")}, + {"hardware_timestamp_frequency", (PyCFunction)&perf_hardware_timestamp_frequency, METH_NOARGS, PyDoc_STR("None -> int: read hardware timestamp frequency (Hz)")}, + {"kernel_timestamp", (PyCFunction)&perf_kernel_timestamp, METH_NOARGS, PyDoc_STR("None -> int: read kernel timestamp")}, + {"fileno_event", (PyCFunction)&perf_fileno_event, METH_O, PyDoc_STR("int -> get perf event for an OS file handle")}, + {NULL} +}; + + +#define CON(x) { #x, x } +static struct { + char const *name; + unsigned long value; +} constants[] = { + CON(PERF_FLAG_READ_USERSPACE), + CON(PERF_FLAG_NO_READ_USERSPACE), + CON(PERF_FLAG_WEAK_GROUP), +}; + + +#if PY_MAJOR_VERSION < 3 +#define INIT_NAME2(m) init##m +#else +#define INIT_NAME2(m) PyInit_##m +#endif +#define INIT_NAME(m) INIT_NAME2(m) + +PyMODINIT_FUNC INIT_NAME(MODULE_NAME)(void) +{ + PyObject *pmod; +#if PY_MAJOR_VERSION < 3 + pmod = Py_InitModule3(MODULE_NAME_STRING, funcs, "perf_events API"); +#else + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + .m_name = MODULE_NAME_STRING, + .m_doc = PyDoc_STR("perf_events API"), + .m_size = -1, + .m_methods = funcs + }; + pmod = PyModule_Create(&moduledef); +#endif + PyType_Ready(&EventType); + PyObject_SetAttrString(pmod, "Event", (PyObject *)&EventType); + PyType_Ready(&RecordType); + PyObject_SetAttrString(pmod, "Record", (PyObject *)&RecordType); + PyType_Ready(&ReadingType); + PyObject_SetAttrString(pmod, "Reading", (PyObject *)&ReadingType); + PyType_Ready(&GroupReadingType); + PyObject_SetAttrString(pmod, "GroupReading", (PyObject *)&ReadingType); + PyType_Ready(&TimeConvType); + PyObject_SetAttrString(pmod, "TimeConv", (PyObject *)&TimeConvType); + { + unsigned int i; + for (i = 0; i < (sizeof constants / sizeof constants[0]); ++i) { + PyModule_AddIntConstant(pmod, constants[i].name, constants[i].value); + } + } +#if PY_MAJOR_VERSION >= 3 + return pmod; +#endif +} + +/* end of pyperf_events.c */ diff --git a/linux_app/pmu_app/pysweep/Makefile b/linux_app/pmu_app/pysweep/Makefile new file mode 100644 index 00000000..20166d60 --- /dev/null +++ b/linux_app/pmu_app/pysweep/Makefile @@ -0,0 +1,21 @@ +#PYTHON=python + +default: install +install: + $(PYTHON) setup.py install --prefix=$(CROSSBASE) + +test_denormals: + $(CC) src/denormals.c -pedantic -Wall -Werror -O2 -DCOMPILE_DENORMALS_AS_MAIN + ./a.out + $(CXX) src/denormals.c -pedantic -Wall -Werror -DCOMPILE_DENORMALS_AS_MAIN + ./a.out + rm a.out + +template: + $(CC) -O2 $(COPTS) tests/code_template.c -c -o template.o + objdump -d template.o + +.PHONY: clean +clean: + rm -rf build template.o + diff --git a/linux_app/pmu_app/pysweep/setup.py b/linux_app/pmu_app/pysweep/setup.py new file mode 100644 index 00000000..4c09bf6b --- /dev/null +++ b/linux_app/pmu_app/pysweep/setup.py @@ -0,0 +1,38 @@ +# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# SPDX-License-Identifier : Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from distutils.core import setup, Extension + +src = [ + 'src/pysweep.c', + 'src/loadcode.c', + 'src/loadinst.c', + 'src/denormals.c', + 'src/loaddata.c', + 'src/loadgen.c', + 'src/prepcode.c', + 'src/genelf.c', + 'src/sleep.c', + 'src/branch_prediction.c', +] + +setup( + name='PySweep', + author='Al Grant', + author_email='al.grant@arm.com', + ext_modules=[Extension('pysweep', src, extra_compile_args=['-Wall'])], + license='Apache 2.0', + description='Dynamically generate and run stressing workloads' +) diff --git a/linux_app/pmu_app/pysweep/src/arch.h b/linux_app/pmu_app/pysweep/src/arch.h new file mode 100644 index 00000000..225fc98b --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/arch.h @@ -0,0 +1,42 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Detect if the architecture being compiled for is any ARM-based architecture + * and define a macro to indicate ISA if so. + */ + +#ifndef __included_arch_h +#define __included_arch_h + +#if defined(__arm64__) || defined(__AARCH64EL__) || defined(__ARM_ARCH_ISA_A64) +#define ARCH_A64 /* meaning the instruction set */ +#define ARCH_AARCH64 /* meaning the execution mode */ +#define ARCH_ARM +#elif defined(__thumb__) +#define ARCH_T32 +#define ARCH_AARCH32 +#define ARCH_ARM +#elif defined(__ARMEL__) +#define ARCH_A32 +#define ARCH_AARCH32 +#define ARCH_ARM +#endif + +#endif /* included */ + +/* end of arch.h */ diff --git a/linux_app/pmu_app/pysweep/src/branch_prediction.c b/linux_app/pmu_app/pysweep/src/branch_prediction.c new file mode 100644 index 00000000..9c6695b0 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/branch_prediction.c @@ -0,0 +1,103 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include +#include +#include +#include + +#define MAX_LENGTH 5 + +void resetOnly(int *len, char *addr) +{ + if (len == NULL|| addr == NULL) + return; + + memset(addr, 0, *len); + *len = 0; + + return; +} + +void printAndReset(int *len, char *addr) +{ + int i; + + if (len == NULL|| addr == NULL) + return; + +// printf("length = %d\n", (*len)); + for (i = 0; i < (*len); i++) { +// printf("%c ", addr[i]); + } + +// printf("\n"); + + memset(addr, 0, *len); + *len = 0; + + return; +} + +int branch_load_gen(int scale) +{ + int j, i, acronymLength = 0, blockCount; + char acronym[MAX_LENGTH] = {0}; + char c; + int length = 100; // string length + char string[] = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.-#'?!"; + + srand(time(NULL)); + + // A: loop not entered 1/LOOP_COUNT times + for(j = 0; j < scale; j++) { + //printf("Starting iteration #%d\n", j); + blockCount = 0; + c = 0; + resetOnly(&acronymLength, acronym); + // B: loop not entered 1/length times + for(i = 0; i < length; i++) { + c = string[(rand() % (int)(sizeof(string) - 1))]; + // C: condition true + // (number_of_block_letters)/(total_characters_in_string) times + if (c >= 'A' && c <= 'Z') { + blockCount++; + // D: condition true up to MAX_LENGTH times consecutively + if (acronymLength < MAX_LENGTH) { + acronym[acronymLength] = c; + } + // E: condition true up to MAX_LENGTH+1 times consecutively + if (acronymLength <= MAX_LENGTH) { + acronymLength++; + } + } + else { + // F: condition true if E was true then C was false + if (acronymLength > 1 && acronymLength <= MAX_LENGTH) { + printAndReset(&acronymLength, acronym); + } + // G: condition true if E was false then C was false + else if (acronymLength != 0) { + resetOnly(&acronymLength, acronym); + } + } + } + } + + return 0; +} diff --git a/linux_app/pmu_app/pysweep/src/branch_prediction.h b/linux_app/pmu_app/pysweep/src/branch_prediction.h new file mode 100644 index 00000000..ff4132ed --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/branch_prediction.h @@ -0,0 +1,22 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +#ifndef __included_br_pred_h +#define __included_br_pred_h + +int branch_load_gen(int scale); + +#endif diff --git a/linux_app/pmu_app/pysweep/src/denormals.c b/linux_app/pmu_app/pysweep/src/denormals.c new file mode 100644 index 00000000..fba07c9b --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/denormals.c @@ -0,0 +1,194 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +/* + * Enable/disable support for denormal FP operations. + */ + +#include "denormals.h" + +#include "arch.h" + +#include +#include +#if defined(__x86_64__) +#include +#endif + + +#if defined(__x86_64__) + +#define FPCR_FZ 0x8040 +#define get_fpcr _mm_getcsr +#define set_fpcr _mm_setcsr + +#elif defined(ARCH_A64) + +#define FPCR_FZ 0x01000000 + +static uint32_t get_fpcr(void) +{ + uint32_t r; + __asm__ __volatile__("mrs %0,fpcr":"=r"(r)::); + return r; +} + +static void set_fpcr(uint32_t x) +{ + __asm__ __volatile__("msr fpcr,%0"::"r"(x):); +} + +#else +/* On other architectures, we don't know how to get the FPCR */ +#endif + + +/* + * Interrogate the floating-point control word to see if denormals are enabled. + */ +static int __attribute__((unused)) get_denormals_enabled_hw(void) +{ +#ifdef FPCR_FZ + return (get_fpcr() & FPCR_FZ) == 0; +#else + fprintf(stderr, "** Can't get denormal status from hardware on this architecture\n"); + assert(0); + return 0; +#endif +} + + +/* + * Discover if denormals are enabled, empirically + */ +static int denormals_are_enabled_empirical(void) +{ + double volatile x = DOUBLE_DENORMAL; + x += DOUBLE_DENORMAL; + return (x != 0.0); +} + + +/* + * Discover if denormals are enabled, empirically and (if possible) by interrogating + * the floating-point control word. If these tests don't correspond, raise an error. + */ +int denormals_are_enabled(void) +{ + int enabled = denormals_are_enabled_empirical(); +#ifdef FPCR_FZ + assert(enabled == get_denormals_enabled_hw()); +#endif + return enabled; +} + + +int denormals_set_enabled(int enable) +{ + if (enable) { + /* Clear DAZ and FTZ - denormals participate in arithmetic */ +#ifdef FPCR_FZ + set_fpcr(get_fpcr() & ~FPCR_FZ); +#else + /* Can't control - succeed if denormals are already enabled */ +#endif + } else { + /* Set DAZ and FTZ - denormals will be eliminated */ +#ifdef FPCR_FZ + set_fpcr(get_fpcr() | FPCR_FZ); +#else + /* Can't control - succeed if denormals are already disabled */ +#endif + } + /* If we can't control, we succeed iff denormals are already in + the enablement state we wanted. */ + return enable == denormals_are_enabled(); +} + + +/* + * Get the raw representation of floating-point numbers. + * Simplest is + * *(unsigned int *)&x; + * but that will be faulted (at -O2) by -Werror=strict-aliasing + */ +static unsigned int float_as_int(float x) +{ + union { + float f; + unsigned int i; + } u; + u.f = x; + return u.i; +} + + +static unsigned long long double_as_int(double x) +{ + union { + double f; + unsigned long long i; + } u; + u.f = x; + return u.i; +} + + +void test_denormals(void) +{ + float volatile xf; + double volatile xd; + int was_enabled = denormals_are_enabled(); + printf("Denormals test: "); +#ifdef __cplusplus + printf("C++"); +#else + printf("C"); +#endif + printf("\n"); + printf("No-denormals:\n"); + denormals_set_enabled(0); + xd = DOUBLE_DENORMAL; + printf(" %016llx (%.20g)\n", double_as_int(xd), xd); + xf = FLOAT_DENORMAL; + /* The float-to-double conversion will be flushed-to-zero on input */ + printf(" %08x (%.10g) - will print as zero\n", float_as_int(xf), xf); + assert(xd == 0.0); /* It will compare equal to zero, even though it's not */ + xd += DOUBLE_DENORMAL; + printf(" %016llx CSR=0x%04x\n", double_as_int(xd), (unsigned int)get_fpcr()); + assert(xd == 0.0); + printf("Denormals:\n"); + denormals_set_enabled(1); + xd = DOUBLE_DENORMAL; + printf(" %016llx (%g)\n", double_as_int(xd), xd); + assert(xd != 0.0); + xf = FLOAT_DENORMAL; + printf(" %08x (%g)\n", float_as_int(xf), xf); + xd += DOUBLE_DENORMAL; + printf(" %016llx CSR=0x%04x\n", double_as_int(xd), (unsigned int)get_fpcr()); + assert(xd != 0.0); + /* Restore original state */ + denormals_set_enabled(was_enabled); +} + + +#ifdef COMPILE_DENORMALS_AS_MAIN +int main(void) +{ + test_denormals(); + return 0; +} +#endif diff --git a/linux_app/pmu_app/pysweep/src/denormals.h b/linux_app/pmu_app/pysweep/src/denormals.h new file mode 100644 index 00000000..bf63cfdb --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/denormals.h @@ -0,0 +1,45 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +#ifndef __included_denormals_h +#define __included_denormals_h + +#include + +/* Sample denormal values */ +static double DOUBLE_DENORMAL = 7.9e-323; /* 0x1p-1070 */ +static float FLOAT_DENORMAL = 2.2e-44f; /* 0x1p-145f */ + +/* + * Check if denormals are enabled, without affecting + * current state. + */ +extern int denormals_are_enabled(void); + +/* + * Attempt to set denormals-enabled state. Return the + * resulting state - which can be testing to determine + * success or failure. + */ +extern int denormals_set_enabled(int enable); + +/* + * Run some self-tests. + */ +extern void test_denormals(void); + +#endif /* included */ + diff --git a/linux_app/pmu_app/pysweep/src/genelf.c b/linux_app/pmu_app/pysweep/src/genelf.c new file mode 100644 index 00000000..b5b2ae85 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/genelf.c @@ -0,0 +1,677 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +/* + * Generate a minimal ELF image to describe code. + */ + +#include "genelf.h" + +#include "arch.h" + +#include +#include +#include +#include +#include + + +#define SEGMENT_TYPE_CODE 0 +#define SEGMENT_TYPE_DATA 1 +#define BUFFER_SIZE 20 /* based on elf_add_string call */ + +struct string { + struct string *next; + unsigned int offset; /* offset in section-header string section */ + char name[1]; +}; + +struct segment { + struct segment *next; + struct elf *elf; + void const *base; /* Segment data in client's memory */ + unsigned long size; + unsigned int type; + unsigned long file_offset; + unsigned int section_type; + unsigned int link; + unsigned int align; + unsigned int entsize; + struct string *name; + unsigned int section_index; +}; + +struct symbol { + struct symbol *next; + struct string *name; + void const *address; + unsigned long size; + unsigned int type; + struct segment *segment; +}; + +struct elf { + struct segment *segments; + unsigned int n_segments; + struct symbol *symbols; + struct symbol *last_symbol; + unsigned int n_symbols; + void const *entry; /* Entry point in client's memory */ + unsigned char *image; + size_t image_size; + int is_64:1; + int do_segments:1; + int do_sections:1; + unsigned int e_ehsize; + unsigned int e_phentsize; + unsigned int e_shentsize; + struct segment string_table; /* special segment: string table section */ + struct string *strings; + struct string *last_string; + struct segment symbol_table; /* special segment: symbol table section */ + unsigned int offset_to_segment_table; + unsigned int offset_to_section_table; + unsigned int offset_to_string_data; + unsigned int offset_to_symbol_data; +}; + + +static struct string *elf_add_string(elf_t e, char const *str); + +#define STRING_TABLE_INDEX 1 + +static void elf_show(elf_t e); + +elf_t elf_create(void) +{ + /* Freed in elf_destroy */ + elf_t e = (struct elf *)malloc(sizeof(struct elf)); + if (e) { + memset(e, 0, sizeof(struct elf)); + e->is_64 = (sizeof(void *) == 8); + e->e_ehsize = (e->is_64 ? 0x40 : 0x34); + e->e_phentsize = (e->is_64 ? 0x38 : 0x20); + e->e_shentsize = (e->is_64 ? 0x40 : 0x28); + /* Set up string table. In a normal ELF file there would be separate + string tables, .shstrtab for the section headers and .strtab for + symbol strings. But we combine the two. */ + e->string_table.elf = e; + e->string_table.section_type = 3; /* SHT_STRTAB */ + e->string_table.size = 1; /* for the leading NUL */ + e->string_table.align = 1; + e->string_table.name = elf_add_string(e, ".strtab"); + /* String section starts with a zero byte - so that the index of + all the strings are non-zero */ + /* Set up symbol table. We don't create the name yet - if we have + no symbols and don't create a symbol table section, we avoid + adding the symbol table section name to the string table. */ + e->symbol_table.elf = e; + e->symbol_table.section_type = 2; /* SHT_SYMTAB */ + e->symbol_table.link = STRING_TABLE_INDEX; + e->symbol_table.align = sizeof(uintptr_t); + e->symbol_table.entsize = (e->is_64 ? 0x18 : 0x10); + } + return e; +} + + +static int segment_contains(struct segment const *s, void const *addr, unsigned long size) +{ + return ((unsigned char const *)s->base <= (unsigned char const *)addr && + (unsigned char const *)addr + size <= (unsigned char const *)s->base + s->size); +} + + +static struct segment *elf_find_segment(elf_t e, void const *addr, unsigned long size) +{ + struct segment *s; + for (s = e->segments; s != NULL; s = s->next) { + if (segment_contains(s, addr, size)) { + return s; + } + } + return NULL; +} + + +static struct segment *elf_add_segment(elf_t e, void const *base, unsigned long size, unsigned int type) +{ + struct segment *s; + assert(e != NULL); + assert(base != NULL); + assert(size > 0); + /* We should only build an image when we've added all the code segments. */ + assert(!e->image); + + s = (struct segment *)malloc(sizeof(struct segment)); + memset(s, 0, sizeof(struct segment)); + s->elf = e; + s->type = type; + s->base = base; + s->size = size; + s->section_type = 1; /* SHT_PROGBITS */ + s->name = elf_add_string(e, (type == SEGMENT_TYPE_CODE ? ".text" : ".data")); + /* add this section to the list */ + s->next = e->segments; + e->segments = s; + ++e->n_segments; + return s; +} + + +struct segment *elf_add_code(elf_t e, void const *base, unsigned long size) +{ + return elf_add_segment(e, base, size, SEGMENT_TYPE_CODE); +} + + +/* TBD: eliminate duplicates */ +static struct string *elf_add_string(elf_t e, char const *str) +{ + struct string *s; + assert(e != NULL); + assert(str != NULL); + size_t len = strnlen(str, BUFFER_SIZE); + assert(len > 0); + s = (struct string *)malloc(sizeof(struct string) + len); + assert(s); + strncpy(s->name, str, len + 1); + /* extend the string section */ + s->offset = e->string_table.size; + e->string_table.size += len + 1; + /* add this string to the end of the list */ + s->next = NULL; + if (e->last_string == NULL) { + e->strings = s; + } else { + e->last_string->next = s; + } + e->last_string = s; + return s; +} + + +struct symbol *elf_add_symbol(elf_t e, char const *str, void const *address, unsigned long size) +{ + struct symbol *s; + assert(e != NULL); + assert(str != NULL); + s = (struct symbol *)malloc(sizeof(struct symbol)); + assert(s); + memset(s, 0, sizeof(struct symbol)); + if (!e->symbol_table.name) { + e->symbol_table.name = elf_add_string(e, ".symtab"); + } + s->name = elf_add_string(e, str); + s->address = address; + s->size = size; + s->segment = elf_find_segment(e, address, size); + if (s->segment == NULL) { + fprintf(stderr, "Tried to create symbol \"%s\" @%p %lu outside segment\n", + str, address, size); + elf_show(e); + } + assert(s->segment != NULL); + e->symbol_table.size += e->symbol_table.entsize; + e->n_symbols += 1; + if (e->last_symbol == NULL) { + e->symbols = s; + } else { + e->last_symbol->next = s; + } + e->last_symbol = s; + return s; +} + + +struct segment *elf_add_data(elf_t e, void const *base, unsigned long size) +{ + return elf_add_segment(e, base, size, SEGMENT_TYPE_DATA); +} + + +/* + * Set entry point. We'd expect this to be within an executable (code) segment. + */ +void elf_set_entry(elf_t e, void const *entry) +{ + assert(e != NULL); + e->entry = entry; +} + + +static unsigned int elf_segment_table_size(elf_t e) +{ + if (e->do_segments) { + return e->e_phentsize * e->n_segments; + } else { + return 0; + } +} + +static unsigned int elf_n_sections(elf_t e) +{ + if (e->do_sections) { + /* First add 1 for the NULL section table entry (SHN_UNDEF is 0) */ + unsigned int n = 1 + e->n_segments; + if (e->string_table.size > 1) { + n += 1; + } + if (e->symbol_table.size > 0) { + n += 1; + } + return n; + } else { + return 0; + } +} + +static unsigned int elf_section_table_size(elf_t e) +{ + if (e->do_sections) { + return e->e_shentsize * elf_n_sections(e); + } else { + return 0; + } +} + +#define STRING_ALIGNMENT 8 + +static unsigned int elf_string_section_size(elf_t e) +{ + if (e->do_sections) { + unsigned int size = (e->string_table.size + (STRING_ALIGNMENT-1)) & ~(STRING_ALIGNMENT-1); + assert((size & (STRING_ALIGNMENT-1)) == 0); + assert(size >= e->string_table.size); + return size; + } else { + return 0; + } +} + +static unsigned int elf_symbol_section_size(elf_t e) +{ + return e->do_sections ? e->symbol_table.size : 0; +} + + +/* + * Find the total size of ELF headers and other metadata (e.g. string section) + */ +static unsigned int elf_total_headers(elf_t e) +{ + unsigned int n; + n = e->e_ehsize + elf_segment_table_size(e) + elf_section_table_size(e); + n += elf_string_section_size(e); + n += elf_symbol_section_size(e); + return n; +} + + +/* + * Generate ELF header in memory, and also update the offsets + */ +static unsigned int elf_gen_header(elf_t e, unsigned char *h) +{ + unsigned int const len = e->e_ehsize; + unsigned int offset; + + assert(e->do_segments || e->do_sections); + memset(h, 0, len); + e->offset_to_segment_table = len; + /* prepare for writing sections, by updating the section counter */ + offset = len; + offset += elf_segment_table_size(e); + if (elf_n_sections(e) > 0) { + e->offset_to_section_table = offset; + offset += elf_section_table_size(e); + } else { + e->offset_to_section_table = 0; + } + if (e->strings != NULL) { + e->offset_to_string_data = offset; + offset += elf_string_section_size(e); + } else { + e->offset_to_string_data = 0; + } + if (e->symbols != NULL) { + e->offset_to_symbol_data = offset; + offset += e->symbol_table.size; + } else { + e->offset_to_symbol_data = 0; + } + h[0] = 0x7f; + h[1] = 0x45; + h[2] = 0x4c; + h[3] = 0x46; + h[4] = e->is_64 ? 2 : 1; + h[5] = 1; /* little endian */ + h[6] = 1; + h[7] = 0; /* System V */ + *(uint16_t *)(h + 0x10) = 2; /* 1: relocatable, 2: executable, 4: core */ +#if defined(ARCH_AARCH32) +#define ELF_MACHINE_TYPE 0x28 +#elif defined(ARCH_AARCH64) +#define ELF_MACHINE_TYPE 0xB7 +#else +/* TBD: default to x86 */ +#define ELF_MACHINE_TYPE (e->is_64 ? 0x3E : 0x03) +#endif + *(uint16_t *)(h + 0x12) = ELF_MACHINE_TYPE; + *(uint32_t *)(h + 0x14) = 1; + *(uintptr_t *)(h + 0x18) = (uintptr_t)e->entry; + *(uintptr_t *)(h + (e->is_64 ? 0x20 : 0x1C)) = e->offset_to_segment_table; + *(uintptr_t *)(h + (e->is_64 ? 0x28 : 0x20)) = e->offset_to_section_table; /* or zero */ + *(uint16_t *)(h + (e->is_64 ? 0x34 : 0x28)) = e->e_ehsize; + *(uint16_t *)(h + (e->is_64 ? 0x36 : 0x2a)) = e->e_phentsize; + *(uint16_t *)(h + (e->is_64 ? 0x38 : 0x2c)) = e->n_segments; + *(uint16_t *)(h + (e->is_64 ? 0x3a : 0x2e)) = e->e_shentsize; /* maybe zero if no sections? */ + *(uint16_t *)(h + (e->is_64 ? 0x3c : 0x30)) = elf_n_sections(e); + *(uint16_t *)(h + (e->is_64 ? 0x3e : 0x32)) = STRING_TABLE_INDEX; + return e->e_ehsize; +} + + +static unsigned int elf_gen_pheader(struct segment *s, unsigned char *h, unsigned int file_offset) +{ + elf_t const e = s->elf; + assert(e != NULL); + assert(e->e_phentsize > 0); + assert(s->size > 0); + memset(h, 0, e->e_phentsize); + *(uint32_t *)(h + 0x00) = 1; /* PT_LOAD */ + *(uint32_t *)(h + (e->is_64 ? 0x04 : 0x18)) = (s->type == SEGMENT_TYPE_CODE ? 0x05 : 0x04); /* (PF_X+)PF_R */ + *(uintptr_t *)(h + (e->is_64 ? 0x08 : 0x04)) = file_offset; + *(uintptr_t *)(h + (e->is_64 ? 0x20 : 0x10)) = s->size; + *(uintptr_t *)(h + (e->is_64 ? 0x28 : 0x14)) = s->size; + *(uintptr_t *)(h + (e->is_64 ? 0x10 : 0x08)) = (uintptr_t)s->base; + return e->e_phentsize; +} + + +static unsigned int elf_gen_sheader(struct segment *s, unsigned char *h, unsigned int file_offset) +{ + elf_t const e = s->elf; + unsigned int flags = 0; + assert(e != NULL); + assert(e->e_shentsize > 0); + assert(e->e_shentsize <= 0x100); + if (s->section_type == 1) { /* SHT_PROGBITS */ + flags |= 0x002; /* SHF_ALLOC */ + if (s->type == SEGMENT_TYPE_CODE) { + flags |= 0x004; /* SHF_EXECINSTR */ + } + } else if (s->section_type == 3) { + //flags |= 0x020; /* SHF_STRINGS */ + } + /* now clear the section table entry and fill in the fields */ + memset(h, 0, e->e_shentsize); + if (s->name != NULL) { + /* Index in the section header string table of the section's name. */ + *(uint32_t *)(h + 0x00) = s->name->offset; + } + *(uint32_t *)(h + 0x04) = s->section_type; + *(uintptr_t *)(h + 0x08) = flags; + *(uintptr_t *)(h + (e->is_64 ? 0x10 : 0x0c)) = (uintptr_t)s->base; + *(uintptr_t *)(h + (e->is_64 ? 0x18 : 0x10)) = file_offset; + *(uintptr_t *)(h + (e->is_64 ? 0x20 : 0x14)) = (uintptr_t)s->size; + *(uint32_t *)(h + (e->is_64 ? 0x28 : 0x18)) = s->link; + *(uintptr_t *)(h + (e->is_64 ? 0x30 : 0x20)) = (uintptr_t)s->align; + *(uintptr_t *)(h + (e->is_64 ? 0x38 : 0x24)) = (uintptr_t)s->entsize; + return e->e_shentsize; +} + + +static void elf_show(elf_t e) +{ + fprintf(stderr, "ELF:\n"); + fprintf(stderr, " Total header size: %u\n", elf_total_headers(e)); + { + struct segment const *s; + fprintf(stderr, " Segments (%u):\n", e->n_segments); + for (s = e->segments; s != NULL; s = s->next) { + fprintf(stderr, " %016llx %016llx type=%u", + (unsigned long long)s->base, (unsigned long long)s->size, s->type); + if (s->name) { + fprintf(stderr, " name=\"%s\"@%u", s->name->name, s->name->offset); + } + fprintf(stderr, "\n"); + } + } + { + struct string const *s; + fprintf(stderr, " Strings (total %u bytes):\n", (unsigned int)e->string_table.size); + for (s = e->strings; s != NULL; s = s->next) { + fprintf(stderr, " \"%s\"@%u\n", s->name, s->offset); + } + } + { + struct symbol const *s; + fprintf(stderr, " Symbols (%u)\n", e->n_symbols); + for (s = e->symbols; s != NULL; s = s->next) { + fprintf(stderr, " %s @ %p size %lu", + (s->name ? s->name->name : ""), s->address, s->size); + if (s->segment) { + fprintf(stderr, " in #%p", s->segment); + } + fprintf(stderr, "\n"); + } + } +} + + +/* + * Generate a contiguous ELF image in memory. + * The ELF image includes the ELF header and tables, but not the code/data. + * The tables point to the actual code and data in their current locations. + * So the total image is not contiguous, rather we're generating a + * contiguous descriptor for memory areas. + * + * We dynamically allocate a buffer, and the caller must free it. + */ +static void *elf_gen_image(elf_t e, int file_offsets) +{ + void *image; + unsigned char *image_base; + struct segment *s; + size_t image_size; + unsigned int file_offset_for_data; + unsigned char *p; + assert(e != NULL); + assert(e->n_segments > 0); + + e->do_segments = 1; + e->do_sections = 1; + if (0) { + elf_show(e); + } + image_size = elf_total_headers(e); + image = malloc(image_size); + if (!image) { + return NULL; + } + image_base = (unsigned char *)image; + p = image_base; + p += elf_gen_header(e, image); + file_offset_for_data = elf_total_headers(e); + for (s = e->segments; s != NULL; s = s->next) { + s->file_offset = (file_offsets ? file_offset_for_data : 0); + file_offset_for_data += s->size; + } + if (e->do_segments) { + for (s = e->segments; s != NULL; s = s->next) { + unsigned int len = elf_gen_pheader(s, p, s->file_offset); + p += len; + } + } + if (e->do_sections) { + struct string *str; + struct symbol *sym; + unsigned int section_index = 0; + /* Section table */ + assert((p - image_base) == e->offset_to_section_table); + /* Start with section table entries for special (non-segment) sections */ + /* Null entry */ + memset(p, 0, e->e_shentsize); + p += e->e_shentsize; + ++section_index; + /* Entry for the string section. We always expect to generate this, + if only for the section names. */ + if (e->string_table.size > 1) { + //e->string_table.base = image_base + e->offset_to_string_data; + unsigned int len = elf_gen_sheader(&e->string_table, p, e->offset_to_string_data); + p += len; + ++section_index; + } + if (e->symbol_table.size > 0) { + unsigned int len = elf_gen_sheader(&e->symbol_table, p, e->offset_to_symbol_data); + p += len; + ++section_index; + } + /* Iterate the segments again, but this time as sections */ + for (s = e->segments; s != NULL; s = s->next) { + s->section_index = section_index; + unsigned int len = elf_gen_sheader(s, p, s->file_offset); + p += len; + ++section_index; + } + /* We've completed the section table. */ + assert(section_index == elf_n_sections(e)); + /* Now output the special (metadata) section contents. */ + /* string section */ + assert((p - image_base) == e->offset_to_string_data); + unsigned int sp = 0; + /* start with a NUL */ + *p++ = '\0'; + sp += 1; + for (str = e->strings; str != NULL; str = str->next) { + unsigned int templen = strnlen(str->name, BUFFER_SIZE); + strncpy((char *)p, str->name, templen + 1); + unsigned int len = templen + 1; + p += len; + sp += len; + } + while ((sp & (STRING_ALIGNMENT-1)) != 0) { + *p++ = '\0'; + sp += 1; + } + /* symbol section */ + for (sym = e->symbols; sym != NULL; sym = sym->next) { + unsigned char info = 0; /* type in low nybble, binding in high nybble */ + memset(p, 0, e->symbol_table.entsize); + *(uint32_t *)(p + 0) = sym->name ? sym->name->offset : 0; + *(uintptr_t *)(p + (e->is_64 ? 0x08 : 0x04)) = (uintptr_t)sym->address; + *(uintptr_t *)(p + (e->is_64 ? 0x10 : 0x08)) = sym->size; + *(unsigned char *)(p + (e->is_64 ? 0x04 : 0x0c)) = info; + if (sym->segment != NULL) { + *(uint16_t *)(p + (e->is_64 ? 0x06 : 0x0e)) = sym->segment->section_index; + } + p += e->symbol_table.entsize; + } + } + /* check we hit the predicted end of buffer */ + if ((size_t)(p - (unsigned char *)image) != image_size) { + fprintf(stderr, "Image:\n"); + fprintf(stderr, " Start: %p\n", image); + fprintf(stderr, " Segment table: %lx\n", (unsigned long)e->offset_to_segment_table); + fprintf(stderr, " Size: %lx\n", (unsigned long)elf_segment_table_size(e)); + fprintf(stderr, " Section table: %lx\n", (unsigned long)e->offset_to_section_table); + fprintf(stderr, " Size: %lx\n", (unsigned long)elf_section_table_size(e)); + fprintf(stderr, " Strings: %lx\n", (unsigned long)e->offset_to_string_data); + fprintf(stderr, " Size: %lx\n", (unsigned long)elf_string_section_size(e)); + fprintf(stderr, " Symbols: %lx\n", (unsigned long)e->offset_to_symbol_data); + fprintf(stderr, " Size: %lx\n", (unsigned long)e->symbol_table.size); + fprintf(stderr, " Current: %lx\n", (unsigned long)(p - image_base)); + fprintf(stderr, " Predicted: %lx\n", (unsigned long)image_size); + } + assert((p - (unsigned char *)image) == image_size); + e->image_size = image_size; + return image; +} + + +/* +Generate the ELF image in memory. Idempotent. +*/ +void const *elf_image(elf_t e) +{ + assert(e != NULL); + if (!e->image) { + e->image = elf_gen_image(e, 0); + } + return e->image; +} + + +unsigned int elf_image_size(elf_t e) +{ + (void)elf_image(e); + return e->image_size; +} + + + +int elf_dump(elf_t e, char const *fn) +{ + void *image; + struct segment *s; + FILE *fd; + + assert(e != NULL); + + fd = fopen(fn, "wb"); + if (!fd) { + return -1; + } + /* generate and output the contiguous part of the ELF file, same as + we generate in-memory */ + image = elf_gen_image(e, /*file_offsets=*/1); + fwrite(image, e->image_size, 1, fd); + /* last of all, output the data contents from memory to the file */ + for (s = e->segments; s != NULL; s = s->next) { + assert(s->size > 0); + fwrite(s->base, s->size, 1, fd); + } + fclose(fd); + return 0; +} + + +void elf_destroy(elf_t e) +{ + if (e) { + while (e->segments != NULL) { + struct segment *s = e->segments; + e->segments = s->next; + free(s); + } + while (e->strings != NULL) { + struct string *s = e->strings; + e->strings = s->next; + free(s); + } + while (e->symbols != NULL) { + struct symbol *s = e->symbols; + e->symbols = s->next; + free(s); + } + if (e->image) { + free(e->image); + } + free(e); + } +} + diff --git a/linux_app/pmu_app/pysweep/src/genelf.h b/linux_app/pmu_app/pysweep/src/genelf.h new file mode 100644 index 00000000..9c4ad4ab --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/genelf.h @@ -0,0 +1,71 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +/* + * Generate an ELF image describing code regions. + */ + +#ifndef __included_genelf_h +#define __included_genelf_h + +typedef struct elf *elf_t; +typedef struct segment *elf_segment_t; +typedef struct symbol *elf_symbol_t; + +elf_t elf_create(void); + +/* + * Add a code segment. + */ +elf_segment_t elf_add_code(elf_t, void const *addr, unsigned long size); + +/* + * Add a data segment. + */ +elf_segment_t elf_add_data(elf_t, void const *addr, unsigned long size); + +/* + * Add a symbol. + */ +elf_symbol_t elf_add_symbol(elf_t, char const *name, void const *addr, unsigned long size); + +/* + * Set the entry point. + */ +void elf_set_entry(elf_t, void const *entry); + +/* + * Return a location to the ELF image in memory. + */ +void const *elf_image(elf_t); + +/* + * Return the image size in bytes, exclusive of the actual code/data. + */ +unsigned int elf_image_size(elf_t); + +/* + * Write the ELF image to a file, including the described code. + */ +int elf_dump(elf_t, char const *fn); + +/* + * Destroy an ELF object, freeing its image in memory. + */ +void elf_destroy(elf_t); + +#endif /* included */ + diff --git a/linux_app/pmu_app/pysweep/src/loadcode.c b/linux_app/pmu_app/pysweep/src/loadcode.c new file mode 100644 index 00000000..b2844374 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loadcode.c @@ -0,0 +1,623 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Generate code for a runnable workload in memory, based on a set of workload characteristics. + * + * Much of this unit is about generating instructions for x86 and ARM. + * A future direction would be for this function to be performed via some + * existing tool such as LLVM or DynamoRIO. + */ + +#include "loadgenp.h" + +#include "loadinst.h" +#include "prepcode.h" +#include "arch.h" +#include "genelf.h" + +#include + +#include +#include +#include +#include + + +/* +Make a data buffer pointer into a function pointer. +This is trivial except in ARM32 where we have to create an interworking pointer +(LSB set to indicate Thumb). We assume - locally to this program - that the +data buffer has been created with code in the same mode as we're currently executing. +*/ +static dummy_fn_t make_fn(void const *p) +{ +#ifdef __thumb__ + return (dummy_fn_t)((unsigned char const *)p + 1); +#else + return (dummy_fn_t)p; +#endif +} + + +void fprint_mem(FILE *fd, void const *pv, size_t size) +{ + unsigned char const *p = (unsigned char const *)pv; + unsigned int i; + for (i = 0; i < size; ++i) { + if ((i % 32) == 0) { + fprintf(fd, " %p ", (p + i)); + } + fprintf(fd, " %02x", p[i]); + if (((i+1) % 32) == 0 || (i+1) == size) { + fprintf(fd, "\n"); + } + } +} + + +void fprint_code(FILE *fd, void const *pv, size_t size) +{ + fprint_mem(fd, pv, size); +} + + +static void character_print(Character const *c) +{ + static char const *const fp_prec_names[] = {"?", "half", "single", "double"}; + static char const *const fp_op_names[] = { + "mov", + "iadd", "ixor", + "fneg", "fadd", "fmul", "fdiv", "fsqrt", + "fma", "fma(acc)", "dot2", "dot3", "dot4", + }; + printf(" page size: %lu\n", (unsigned long)sysconf(_SC_PAGESIZE)); + printf(" inst working set: %lu\n", (unsigned long)c->inst_working_set); + printf(" data working set: %lu\n", (unsigned long)c->data_working_set); + if (c->data_pointer_offset != 0) { + printf(" data pointer offset: %d\n", c->data_pointer_offset); + } + if (c->data_dispersion > 1) { + printf(" data dispersion: %d\n", c->data_dispersion); + } + if (c->data_alignment != 0) { + printf(" data alignment: %d\n", c->data_alignment); + } + printf(" flags: %#x\n", (unsigned int)c->workload_flags); + printf(" FP intensity: %lu\n", (unsigned long)c->fp_intensity); + if (c->fp_intensity > 0) { + printf(" Precision: %s\n", fp_prec_names[c->fp_precision]); + printf(" Operation: %s\n", fp_op_names[c->fp_operation]); + printf(" Concurrency: %u\n", (unsigned int)c->fp_concurrency); + printf(" SIMD: %u-way\n", (unsigned int)c->fp_simd); + printf(" Flags: %#x\n", (unsigned int)c->fp_flags); + } + if (c->debug_flags != 0) { + printf(" debug flags: %#x\n", (unsigned int)c->debug_flags); + } +} + + +static flavor_t character_flavor(Character const *c) +{ + flavor_t flavor = c->fp_precision == FP_PRECISION_DOUBLE ? F64 : + c->fp_precision == FP_PRECISION_SINGLE ? F32 : + c->fp_precision == FP_PRECISION_FP16 ? F16 : 0; + return flavor; +} + + +static unsigned int load_prepcode_flags(Character const *c) +{ + unsigned int pflags = PREPCODE_ALL; + int allow_write_and_exec = !(c->debug_flags & WORKLOAD_DEBUG_NO_WX); + if (c->debug_flags & WORKLOAD_DEBUG_NO_UNIFICATION) { + pflags &= ~PREPCODE_COHERENCE; + } + if (allow_write_and_exec || + (c->debug_flags & WORKLOAD_DEBUG_NO_MPROTECT)) { + pflags &= ~PREPCODE_PROTECT; + } + return pflags; +} + + +static int gen_fp_move(CS *cs, Character const *c, freg_t Rd, freg_t Rn) +{ + int ok; + flavor_t const flavor = character_flavor(c); + if (!(c->fp_flags & FP_FLAG_LOAD_CONST)) { + if (Rd == Rn) { + ok = 1; + } else { + ok = codestream_gen_op(cs, FP_OP_MOV, flavor, Rd, Rn, NR, NR); + } + } else { + /* On some cores, internal result caches have separate slots + for the results of loads, and it can be advantageous + for loop-invariant data to be in these slots. */ + /* FSTR ,[Rscratch,#0] */ + ok = codestream_gen_fp_store(cs, flavor, Rn, 2, 0, 0); + /* FLDR ,[Rscratch,#0] */ + ok = codestream_gen_fp_load(cs, flavor, Rd, 2, 0, 0); + } + return ok; +} + + +/* +Construct some code, representing a workload with given code +characteristics, and traversing the data structure we've constructed. +*/ +void *load_construct_code(Workload *w) +{ + Character const *c = &w->c; + struct workload_mem *m = &w->code_mem; + void *code_entry; + CS *cs; + unsigned int LINE = 64; + size_t const size_rounded_to_lines = round_size(c->inst_working_set, LINE); + size_t const size = size_rounded_to_lines; + dummy_fn_t fp; + void *code_area; + + /* If allow_write_and_exec is set, we allocate code memory with + both PROT_WRITE and PROT_EXEC set. We can then build the code + and execute it immediately (Intel) or after a userspace cache + unification (ARM). */ + int allow_write_and_exec = !(c->debug_flags & WORKLOAD_DEBUG_NO_WX); + + void **dummy_data; + dummy_data = (void **)&dummy_data; /* Dummy circular chain */ + + assert(size_rounded_to_lines > 0); + assert(size_rounded_to_lines % LINE == 0); + + if (workload_verbose) { + printf("loadgen: %p: creating workload code\n", w); + character_print(c); + } + + /* Allocate a page-aligned block of memory to be used for the generated code. */ + m->size_req = size_rounded_to_lines; + if (allow_write_and_exec) { + m->is_exec = 1; + } + code_area = load_alloc_mem(m); + if (!code_area) { + return NULL; + } + if (workload_verbose) { + printf(" constructing branch code at %p, size 0x%lx\n", + code_area, (unsigned long)size); + } + assert(code_area == m->base); + assert(m->size >= size); + elf_add_code(w->elf_image, m->base, m->size); +#if defined(ARCH_A32) || defined(ARCH_T32) || defined(ARCH_A64) + /* Add a mapping symbol for the whole code area */ + { +#ifdef ARCH_A64 + char const *ms = "$x"; +#elif defined(ARCH_A32) + char const *ms = "$a"; +#else + char const *ms = "$t"; +#endif + elf_add_symbol(w->elf_image, ms, code_area, 0); + } +#endif + + /* For the roofline model, we want to be able to generate workloads + with a given "arithmetic intensity". The intensity is a number N + where the ratio of bytes to ops is 1:N. There seems to be an + implicit assumption that data is dense, so when we bring in a + cache line, we count the entire line as used for the purposes of + calculating "arithmetic intensity". */ + unsigned int const fpop_per_mem = c->fp_intensity; + int const any_data = (c->data_working_set > 0); + + cs = codestream_init(&w->expected, code_area, size, LINE); + if (c->fp_flags & FP_FLAG_ALTERNATE) { + codestream_use_alternate(cs); + } + if (workload_verbose) { + codestream_show(cs); + } + + /* Construct code until we fill up the code working set. */ + code_entry = codestream_addr(cs); + + flavor_t flavor = character_flavor(c); + unsigned int const ewidth = FLOAT_BITS(flavor) / 8; + if (c->fp_simd*ewidth == 8) { + flavor |= S64; + } else if (c->fp_simd*ewidth == 16) { + flavor |= S128; + } else if (c->fp_simd*ewidth == 32) { + flavor |= S256; + } else if (c->fp_simd*ewidth == 64) { + flavor |= S512; + } else if (c->fp_simd*ewidth == 128) { + flavor |= S1024; + } else if (c->fp_simd > 1) { + /* Invalid number of lanes */ + load_free_mem(m); + return NULL; + } + + /* Set up the register pool */ + +/* How many floating-point registers are we allowed to clobber? */ +#if defined(ARCH_T32) || defined(ARCH_A32) +#define FP_REGS_AVAIL 16 +#elif defined(ARCH_A64) +#define FP_REGS_AVAIL 32 +#elif defined(__x86_64__) +/* According to the System V ABI for x86_64, a callee can use %xmm0 to %xmm15 */ +#define FP_REGS_AVAIL 16 +#else +#error Unknown architecture +#endif + /* Current state, for generating the instruction mix */ + int op_needs_2_regs = (c->fp_operation >= FP_OP_DOT2); + unsigned int op_regs_used = (op_needs_2_regs ? 2 : 1); + unsigned int fp_regs_cycle = c->fp_concurrency * op_regs_used; + + unsigned int fp_regs_const = 1; + if (fp_regs_cycle > (FP_REGS_AVAIL - fp_regs_const)) { + fp_regs_cycle = FP_REGS_AVAIL - fp_regs_const; + } else if (fp_regs_cycle == 0) { + fp_regs_cycle = 1; + } + unsigned int const reg_first_const = (fp_regs_const > 0) ? fp_regs_cycle : NR; + assert(fp_regs_cycle > 0); + + if (workload_verbose) { + printf(" total regs available: %u\n", FP_REGS_AVAIL); + printf(" regs in recirculation cycle: %u\n", fp_regs_cycle); + printf(" constant regs: %u\n", fp_regs_const); + } + + /* First copy from FP register 0 into the other registers to ensure + none of them contain a NaN, denormal etc. Assume we've got + enough space for this. Assume the workload runner has set up + FP register 0 with a suitable value, e.g. 1.0. + On ARM we could use FCONST instruction to construct suitable + values directly here, but that's harder on x86. + If we request an invalid SIMD size, we'll fail here. + */ + if (fpop_per_mem > 0) { + unsigned int i; + int ok; + unsigned int constval_source = 2; /* i.e. D2, or S2 */ + unsigned int workval_source = 1; /* i.e. D1, or S1 */ + /* Save the const value from R2 before we clobber it. */ + if (reg_first_const != NR && reg_first_const > constval_source) { + for (i = 0; i < fp_regs_const; ++i) { + ok = gen_fp_move(cs, c, reg_first_const+i, constval_source); + if (!ok) { + break; + } + } + } + for (i = 0; i < fp_regs_cycle; ++i) { + if (i != workval_source) { + ok = codestream_gen_op(cs, FP_OP_MOV, flavor, i, workval_source, NR, NR); + if (!ok) { + break; + } + } + if (!codestream_reserve(cs, 8)) { + assert(0); + } + } + if (reg_first_const != NR && reg_first_const <= constval_source) { + gen_fp_move(cs, c, reg_first_const, constval_source); + } + /* We now have all work (recirculation) regs with the initial work + value from R1, and the FIRST_CONST reg with the value from R2. */ + if (codestream_errors(cs) > 0) { + goto generation_failed; + } + } + + /* For small instruction-working-set workloads, we create an inner + loop round the workload to reduce the effect of overhead. + Essentially we aim to execute some reasonably large number + (say 100000 or 50000) 4-byte instructions per outer call + Roughly estimate number of instructions (size/4) and then iterate + that for as many times as we need to hit the target. We don't + need to be super accurate, as the actual instruction counts will + be calculated from the outer iteration count (which is accurate + apart from a possible iteration in progress) and the instruction + counts we record when generating the code. + */ + unsigned int n_iters = (c->inst_target / (size / 4)); + if (n_iters == 0) { + n_iters = 1; + } + void *work_kernel = NULL; +#define IRBASE IR0 /* Memory chain pointer */ +#define IROFFSET IR1 /* Offset for chain pointer */ +#define IRSCRATCH IR2 +#define IRLOOP IR3 /* Top-level loop count */ + assert(n_iters >= 1); + if (n_iters > 1) { + /* Set up a fixed-count loop within the workload. */ + codestream_gen_movi32(cs, IRLOOP, n_iters); + work_kernel = codestream_addr(cs); + /* Instructions generated within the loop add an appropriately scaled + count to the overall workload instruction metrics. */ + codestream_push_multiplier(cs, n_iters); + } + elf_add_symbol(w->elf_image, "kernel", codestream_addr(cs), 0); + + unsigned int fp_reg = 0; /* Cycle through available FP regs */ + + w->n_chain_steps = 0; + + /* Fill the code buffer with instructions implementing the requested code mix. + This is a sequence of operations cycling through the available FP registers. + We might bail out mid-way through an operation. */ + unsigned int load_flags = 0; + if (c->workload_flags & WL_MEM_NONTEMPORAL) { + load_flags |= CS_LOAD_NONTEMPORAL; + } + if (c->workload_flags & WL_MEM_ACQUIRE) { + load_flags |= CS_LOAD_ACQUIRE; + } + if (c->workload_flags & WL_MEM_ATOMIC) { + load_flags |= CS_LOAD_ATOMIC; + } + if (c->workload_flags & WL_MEM_LOAD_PAIR) { + load_flags |= CS_LOAD_PAIR; + } +#ifdef ARCH_A64 + if (c->fp_flags & FP_FLAG_ALTERNATE) { + codestream_gen_direct(cs, 0x2520e020); /* pseudo SVE instruction to ask ArmIE to start trace */ + } +#endif + while (codestream_reserve(cs, 12)) { + unsigned int j; + if (any_data) { + /* Generate a load to follow the chain in the data working set. + This will count as a load instruction in our general code metrics + accumulator, but we also count it specifically as a chain step. */ + w->n_chain_steps += 1; + if (c->workload_flags & WL_MEM_PREFETCH) { + codestream_gen_load(cs, NR, IRBASE, NR, 0, CS_LOAD_PREFETCH); + } + if (c->data_pointer_offset != 0) { + /* Load from the current data-pointer (R0) indexed by the constant offset register (R1) */ + codestream_gen_load(cs, IRBASE, IRBASE, IROFFSET, 0, load_flags); + } else { + if (c->workload_flags & WL_MEM_LOAD_EXTRA) { + codestream_gen_load(cs, IRSCRATCH, IRBASE, NR, 8, load_flags); /* TBD do this better */ + } + codestream_gen_load(cs, IRBASE, IRBASE, NR, 0, load_flags); + } + if (c->workload_flags & WL_MEM_STORE) { + if (!codestream_reserve(cs, 12)) { + break; + } + unsigned int store_flags = CS_STORE_DEFAULT; + if (c->workload_flags & WL_MEM_RELEASE) { + store_flags |= CS_STORE_RELEASE; + } +#ifdef ARCH_A64 + if (c->workload_flags & WL_MEM_RELEASE) { + /* ADD ,,#8 */ + codestream_gen_iopk(cs, CS_IOP_ADD, IRSCRATCH, IRBASE, 8); + /* STLR ,[,#0] - IR1 used as an available value to store */ + codestream_gen_store(cs, IR1, IRSCRATCH, NR, 0, store_flags); + } else + /* ** Careful: next line is the 'else' clause */ +#endif + codestream_gen_store(cs, IR1, IRBASE, NR, 8, store_flags); + } + if (c->workload_flags & WL_MEM_BARRIER) { + unsigned int fence_flags = (c->workload_flags & WL_MEM_STORE) ? CS_FENCE_STORE : CS_FENCE_LOAD; + if (c->workload_flags & WL_MEM_BARRIER_SYSTEM) fence_flags |= CS_FENCE_SYSTEM; + if (c->workload_flags & WL_MEM_BARRIER_SYNC) fence_flags |= CS_FENCE_SYNC; + codestream_gen_fence(cs, fence_flags); + } + if (c->workload_flags & WL_MEM_NOP) { + codestream_gen_nop(cs); + } + } else if (fpop_per_mem == 0) { + /* No data or FP accesses - just generate NOPs to force a code working set */ + codestream_gen_nop(cs); + } + for (j = 0; (j < fpop_per_mem) && codestream_reserve(cs, 8); ++j) { + unsigned int k; + freg_t R1 = fp_reg; + freg_t R2 = (op_regs_used == 2) ? ((fp_reg + 1) % fp_regs_cycle) : NR; + if (c->workload_flags & WL_MEM_NOP) { + codestream_gen_nop(cs); + } + switch (c->fp_operation) { + case FP_OP_MOV: + case FP_OP_NEG: + codestream_gen_op(cs, c->fp_operation, flavor, R1, R1, NR, NR); + break; + case FP_OP_SQRT: + /* x := sqrt(x) converges to 1.0 very rapidly, and might then + take a fast path. So we insert an ADD into the path to + restore the value to something harder. */ + if (!(c->fp_flags & FP_FLAG_CONVERGE)) { + codestream_gen_op(cs, FP_OP_ADD, flavor, R1, R1, reg_first_const, NR); + if (!codestream_reserve(cs, 8)) { + break; + } + } + codestream_gen_op(cs, c->fp_operation, flavor, R1, R1, NR, NR); + break; + case FP_OP_ADD: + case FP_OP_MUL: + case FP_OP_DIV: + case FP_OP_IADD: + case FP_OP_IXOR: + if (c->fp_flags & FP_FLAG_CONVERGE) { + /* x := x/x converges immediately to 1.0, which may then + take a fast path. */ + codestream_gen_op(cs, c->fp_operation, flavor, R1, R1, R1, NR); + } else { + /* With a constant numerator, the result of the divide (and denominator + for the next divide) will oscillate between two values. + We also hope the numerator and denominator will be different. + Data-dependency chain is through the denominator. */ + codestream_gen_op(cs, c->fp_operation, flavor, R1, reg_first_const, R1, NR); + } + break; + case FP_OP_MULADD: + codestream_gen_op(cs, FP_OP_MUL, flavor, R1, R1, R1, NR); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_ADD, flavor, R1, R1, R1, NR); + break; + case FP_OP_FMA: + codestream_gen_op(cs, c->fp_operation, flavor, R1, R1, R1, R1); + break; + case FP_OP_FMAA: + /* Accumulator latency (FMAA). Writes back to its accumulator operand, + but the multiplier operands are not written. */ + codestream_gen_op(cs, FP_OP_FMA, flavor, R1, reg_first_const, reg_first_const, R1); + break; + case FP_OP_DOT2: + /* 2-term dot product (DOT2) */ + codestream_gen_op(cs, FP_OP_MUL, flavor, R1, R1, R1, NR); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_FMA, flavor, R1, R2, R2, R1); + break; + case FP_OP_DOT4: + /* 4-term dot product */ + codestream_gen_op(cs, FP_OP_MUL, flavor, R1, R1, R1, NR); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_FMA, flavor, R1, R2, R2, R1); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_FMA, flavor, R1, R2, R2, R1); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_FMA, flavor, R1, R2, R2, R1); + break; + case FP_OP_DIST2: + /* 2-term distance */ + codestream_gen_op(cs, FP_OP_MUL, flavor, R1, R1, R1, NR); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_FMA, flavor, R1, R2, R2, R1); + if (!codestream_reserve(cs, 8)) goto end_of_loop; + codestream_gen_op(cs, FP_OP_SQRT, flavor, R1, R1, NR, NR); + break; + default: + assert(0); + } + if (c->workload_flags & WL_DEPEND) { + /* The destination register (R1) is also the first input register, + so there is already a loop-carried dependency on R1. If there are + other iput registers, copy R1 to them to make them all + loop-carried dependencies. */ + for (k = 1; k < op_regs_used; ++k) { + if (!codestream_reserve(cs, 4)) { + break; + } + codestream_gen_op(cs, FP_OP_MOV, flavor, ((fp_reg + k) % fp_regs_cycle), R1, NR, NR); + } + } + w->expected.n[COUNT_UNIT] += n_iters; + /* Set up for the next iteration */ + fp_reg = (fp_reg + op_regs_used) % fp_regs_cycle; + } + } +end_of_loop:; + + if (n_iters > 1) { + codestream_gen_decs(cs, IRLOOP); + codestream_gen_branch(cs, work_kernel, CC_NE); + codestream_pop_multiplier(cs, n_iters); + } + +#ifdef ARCH_A64 + if (c->fp_flags & FP_FLAG_ALTERNATE) { + codestream_gen_direct(cs, 0x2520e040); /* pseudo SVE instruction to ask ArmIE to stop trace */ + } +#endif + + /* Add the return in the last instruction block */ + codestream_gen_ret_abi(cs); + + if (codestream_errors(cs) > 0) { +generation_failed: + if (workload_verbose) { + printf(" workload generation failed\n"); + } + codestream_free(cs); + load_free_mem(m); + return NULL; + } + + codestream_free(cs); + + if (workload_verbose) { + fprint_code(stderr, code_area, 200); + } + { + w->entry = make_fn(code_entry); + elf_set_entry(w->elf_image, w->entry); + elf_add_symbol(w->elf_image, "payload", w->entry, 0); + } + /* Prepare the code for execution. This might include: + * - changing the memory protection if not already done + * - cache unification (e.g. on ARM) + * - calling any debugger hooks for JIT + */ + { + int rc; + rc = prepare_code_elf(m->base, m->size, load_prepcode_flags(c), + elf_image(w->elf_image), elf_image_size(w->elf_image)); + if (rc) { + /* Generated code, but failed to mark it executable */ + load_free_mem(m); + return NULL; + } + } + if (c->debug_flags & WORKLOAD_DEBUG_TRIAL_RUN) { + /* test it - probably segfault if not right */ + printf("Testing generated branches at %p... 1 of 2\n", code_area); + fprint_mem(stdout, code_area, 32); + fp = make_fn(code_area); + printf(" function pointer: %p\n", fp); + fp(dummy_data, w->entry_args[1], w->scratch); + printf(" returned ok\n"); + printf("Testing generated branches... 2 of 2\n"); + fp = make_fn(code_area + LINE*2); + printf(" function pointer: %p\n", fp); + fp(dummy_data, w->entry_args[1], w->scratch); + printf(" branches ok\n"); + } + return code_area; +} + + +void load_free_code(Workload *w) +{ + (void)unprepare_code(w->code_mem.base, w->code_mem.size, load_prepcode_flags(&w->c)); + if (w->elf_image) { + elf_destroy(w->elf_image); + w->elf_image = NULL; + } + load_free_mem(&w->code_mem); +} + diff --git a/linux_app/pmu_app/pysweep/src/loaddata.c b/linux_app/pmu_app/pysweep/src/loaddata.c new file mode 100644 index 00000000..ba204274 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loaddata.c @@ -0,0 +1,458 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Generate a runnable workload in memory, based on a set of workload characteristics. + */ + +#include "loadgenp.h" + +#include "arch.h" + +#include + +#include +#include +#include +#include + + +/* +Test the length of a chain of data. The chain must be completely circular +i.e. we must get back to the beginning. Given bad data, this function will +crash or loop infinitely. +*/ +static unsigned int chain_length(void const *chainp, int offset) +{ + unsigned int n = 0; + void const *p = chainp; + do { + ++n; + void const * const*load_addr = (void const * const*)((unsigned char *)p + offset); + p = *((void const **)load_addr); + } while (p != chainp); + return n; +} + + +/* + * Construct a random maximal cycle, returned as an array of integers, + * caller to free. + * We use Sattolo's algorithm (a variant on Fisher-Yates). + */ +static int *random_maximal_cycle(unsigned int n) +{ + unsigned int i; + int *order = malloc(sizeof(int) * n); /* This could be problematic if w.s. very large */ + assert(order != NULL); + assert(n > 0); + for (i = 0; i < n; ++i) { + order[i] = i; + } + for (i = n-1; i >= 1; --i) { + unsigned int j = rand() % (i); + int temp; + assert(j < n); + temp = order[j]; + order[j] = order[i]; + order[i] = temp; + } + /* order now contains a random maximal cycle. */ + return order; +} + + +/* + * WorkingSet object. + * + * This object captures post-facto characteristics of a working set. + * Can be fed a trace and will update the working set properties. + * + * Currently this is very simplistic. + * + * We don't attempt to characterize how this working set would + * interact with various cache geometries. For example, + * a working set which consisted of accesses at n, n+4K, n+8K + * etc. might have a lot of conflicts due to aliasing. + * + * Nor do we characterize how many distinct + * granules of size N are touched, where interesting values of + * N would relate to various caching mechanisms such as + * - data cache line: 64-bytes or (occasionally) 128-bytes + * - TLB entry for 4K page + * - TLB entry for huge (512K) page + * Nor do we characterize the "page walk working set" or the + * amount of space that would be taken up by caching one or more + * levels of page table. + * + * Other things being equal, for a dense working set we'd expect + * - number of 4K pages to be size / 4K + * - one TLB entry per page assuming no compression + * So for an 8M working set with no huge pages we'd have + * - 2048 pages + * - 2048 last-level page table entries + * - 16K of last-level page tables + */ +typedef struct Footprint { + struct Footprint *next_in_bucket; + void const *granule_address; +#define FOOTPRINT_GRANULE_BITS (8 * sizeof(unsigned long)) + unsigned long bitmap_touch1; /* touch1 and touchm form a saturating-to-2 counter */ + unsigned long bitmap_touchm; + unsigned int n_access; +} Footprint; + +typedef struct WorkingSet { + void const *min_address; /* lowest address accessed */ + void const *max_access_address; /* max (base) address of access */ + void const *hwm; /* high water mark allowing for access size */ + unsigned int n_access; /* number of accesses */ + unsigned int n_unaligned; /* number of unaligned accesses */ + void const *most_recent_access; /* the most recent access - to detect simple streaming */ + unsigned int n_contig_access; /* number of accesses on same line or next line */ +#define FOOTPRINT_N_BUCKETS 16384 + Footprint *cache_lines_touched[FOOTPRINT_N_BUCKETS]; + unsigned int n_cache_lines_touched; +} WorkingSetCharacteristics; + +static void ws_init(WorkingSetCharacteristics *ws) +{ + memset(ws, 0, sizeof *ws); + ws->n_access = 0; + ws->n_unaligned = 0; + ws->min_address = 0; + ws->max_access_address = 0; + ws->hwm = 0; + ws->most_recent_access = 0; + ws->n_contig_access = 0; +} + +/* +Incrementally update working set characteristics, given another access. +Currently we don't distinguish reads and writes. +*/ +static void ws_update(WorkingSetCharacteristics *ws, void const *p, size_t access_size) +{ + ws->n_access++; + void const *pe = (char const *)p + access_size; + unsigned int const LINE = 64; + + assert(p != 0); + assert(access_size > 0); + assert(access_size == (access_size & -access_size)); /* check it's a power of 2 */ + if (ws->n_access == 1) { + /* This is the first access */ + ws->min_address = p; + ws->max_access_address = p; + ws->hwm = pe; + } else { + /* Check if this access is contiguous with the previous access. */ + unsigned long pline = (unsigned long)(ws->most_recent_access) & ~(unsigned long)(LINE-1); + unsigned long line = (unsigned long)p & ~(unsigned long)(LINE-1); + if (line == pline || line == pline+LINE) { + ws->n_contig_access++; + } + if ((char const *)p < (char const *)ws->min_address) { + ws->min_address = p; + } + if ((char const *)p > (char const *)ws->max_access_address) { + ws->max_access_address = p; + } + if ((char const *)pe > (char const *)ws->hwm) { + ws->hwm = pe; + } + } + if (((unsigned long)p & (access_size-1)) != 0) { + ws->n_unaligned += 1; + } + ws->most_recent_access = p; + { + void const *line_address = (void const *)((unsigned long)p & ~(unsigned long)(LINE-1)); + unsigned long line = (unsigned long)line_address / LINE; + unsigned int const bytes_per_granule = (LINE * FOOTPRINT_GRANULE_BITS); + void const *granule_address = (void const *)((unsigned long)p & ~(bytes_per_granule-1)); + unsigned long granule = (unsigned long)granule_address / bytes_per_granule; + unsigned int const bucket = granule % FOOTPRINT_N_BUCKETS; + Footprint *fp; + for (fp = ws->cache_lines_touched[bucket]; fp; fp = fp->next_in_bucket) { + if (fp->granule_address == granule_address) { + break; + } + } + if (!fp) { + fp = (Footprint *)malloc(sizeof *fp); + fp->granule_address = granule_address; + fp->n_access = 0; + fp->bitmap_touch1 = 0; + fp->bitmap_touchm = 0; + fp->next_in_bucket = ws->cache_lines_touched[bucket]; + ws->cache_lines_touched[bucket] = fp; + } + ++fp->n_access; + { + unsigned int offset = line & (FOOTPRINT_GRANULE_BITS-1); + unsigned long mask = 1ULL << offset; + if ((fp->bitmap_touch1 & mask) == 0) { + ++ws->n_cache_lines_touched; + fp->bitmap_touch1 |= mask; + } else if ((fp->bitmap_touchm & mask) == 0) { + fprintf(stderr, "repeat access to %p\n", line_address); + fp->bitmap_touchm |= mask; + } + } + } +} + + +/* + * Queries on the working set characteristics. + */ +static size_t ws_range(WorkingSetCharacteristics const *ws) +{ + return (char const *)ws->hwm - (char const *)ws->min_address; +} + +static void ws_show(WorkingSetCharacteristics const *ws) +{ + printf("Working set (%u accesses):\n", ws->n_access); + printf(" From: %p\n", ws->min_address); + printf(" To: %p\n", ws->hwm); + printf(" Range: %#lx\n", (unsigned long)ws_range(ws)); + printf(" Contig: %u\n", ws->n_contig_access); + printf(" Lines: %u\n", ws->n_cache_lines_touched); + printf(" Unalign:%u\n", ws->n_unaligned); +} + +static void ws_free(WorkingSetCharacteristics *ws) +{ + unsigned int b; + for (b = 0; b < FOOTPRINT_N_BUCKETS; ++b) { + while (ws->cache_lines_touched[b]) { + Footprint *fp = ws->cache_lines_touched[b]; + ws->cache_lines_touched[b] = fp->next_in_bucket; + free(fp); + } + } +} + + +static unsigned int cache_line_length(Character const *c) +{ + static unsigned int line_size = 0; + if (!line_size) { + long line = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); + if (line < 0) { + perror("sysconf(_SC_LEVEL1_DCACHE_LINESIZE)"); + line = 64; /* Fall back to sensible guess at line size */ + } else if (line == 0) { + fprintf(stderr, "sysconf(_SC_LEVEL1_DCACHE_LINESIZE) reports line size zero: assume 64\n"); + line = 64; + } + line_size = (unsigned int)line; + } + return line_size; +} + + +static unsigned int hash_uint(unsigned int n) +{ + return n * (1024+17); +} + + +/* + * Return the placement of the data chain pointer within the cache line or line group. + * This needs to be a deterministic function if i, so if we want to randomize + * the placement we've got to use a pseudo-random function of i. + * We mustn't overspill the end of the line group, as we risk bumping into + * the next line group or unrelated data. + * Exceptionally, the first item is always at offset 0, so that the client + * knows where to start. + */ +static unsigned int line_data_placement(Character const *c, unsigned int i) +{ + unsigned int ix; + unsigned int const LINE = cache_line_length(c); + unsigned int const dispersion = (c->data_dispersion >= 1) ? c->data_dispersion : 1; + unsigned int const chunk = LINE * dispersion; + unsigned int alignment = c->data_alignment ? c->data_alignment : sizeof(void *); + unsigned int range = (chunk - sizeof(void *)) / alignment; + ix = (hash_uint(i) % range) * alignment; + assert((ix + sizeof(void *)) <= chunk); + return (i == 0) ? 0 : ix; +} + + +/* +Construct a data working set, given some characteristics. The output is a contiguous +area of memory consisting of a granules (generally of cache line size) with a pointer +at the start of each granule. The pointers form a linked chain of pointers, which when +followed, will exhibit the desired working set characteristics. + +Return NULL if we fail to allocate the data working set. + +The input characteristics are as follows: + + - the total working set span (c->data_working_set) + + - TBD: add working set density e.g. number of cache lines touched + +The first word of this working set should be the first link in a circular chain of data. + +Layout is randomized in order to avoid hardware prefetching. + +When the workload is run, it starts at the first link in the chain, and progressively +steps through the chain. To fully utilize the working set, we need to process the +whole chain - so the workload must do at least that number of loads before being +reset to the beginning of the chain. If the workload is a relatively small number of +instructions it must either be wrapped by a loop or must remember its state from +one run to the next. +*/ +void *load_construct_data(Character const *c, struct workload_mem *m) +{ + unsigned int i; + int debug = workload_verbose; + unsigned int const LINE = cache_line_length(c); + unsigned int const dispersion = (c->data_dispersion >= 1) ? c->data_dispersion : 1; + unsigned int const chunk = LINE * dispersion; + size_t const size_rounded_to_lines = round_size(c->data_working_set*dispersion, chunk); + unsigned int const n_lines = (size_rounded_to_lines / chunk); + int *order; + void *data; + void *adjusted_data; + unsigned int expected_chain_length = n_lines; + + if (debug >= 1) { + printf("Constructing data working set: size=%lu rounded=%lu lines=%u\n", + (unsigned long)c->data_working_set, + (unsigned long)size_rounded_to_lines, n_lines); + } + assert(size_rounded_to_lines >= c->data_working_set); + if (size_rounded_to_lines == 0) { + /* No data working set required - presumably testing compute only */ + assert(c->data_working_set == 0); + m->size_req = 0; + m->size = 0; + m->base = NULL; + return NULL; + } + /* + * Allocate the actual data area in which we construct the chain of pointers. + * We're possibly asking for a large amount of space here (it's the data + * working set) so we should be prepared for allocation to fail. + */ + memset(m, 0, sizeof(struct workload_mem)); + m->size_req = size_rounded_to_lines; + m->is_no_hugepage = (c->workload_flags & WL_MEM_NO_HUGEPAGE) != 0; + m->is_hugepage = (c->workload_flags & WL_MEM_HUGEPAGE) != 0; + m->is_force_hugepage = (c->workload_flags & WL_MEM_FORCE_HUGEPAGE) != 0; + data = load_alloc_mem(m); + if (!data) { + fprintf(stderr, "loadgen: couldn't allocate %llu bytes for data working set\n", + (unsigned long long)size_rounded_to_lines); + return NULL; + } + /* + * Any placement of links within lines relies on the area being at least line-aligned. + * Check here just to make sure. + */ + assert(((unsigned long)data % LINE) == 0); + adjusted_data = (void *)((unsigned char *)data - c->data_pointer_offset); + if (!(c->workload_flags & WL_MEM_STREAM)) { + /* Construct a random cycle. */ + order = random_maximal_cycle(n_lines); + if (debug >= 3) { + unsigned int i; + for (i = 0; i < n_lines; ++i) { + printf(" %d", order[i]); + } + printf("\n"); + } + /* Use the random cycle to build a chain of pointers in the data area. */ + /* Each link in the chain can, in principle, be allocated anywhere in the line, + or if we're using dispersion, in the group of lines. We can also try to + use unaligned and cross-line data placement. */ + for (i = 0; i < n_lines; ++i) { + assert(order[i] < n_lines); + *(void **)((unsigned char *)data + i*chunk + line_data_placement(c, i)) = + ((unsigned char *)adjusted_data + order[i]*chunk + line_data_placement(c, order[i])); + } + free(order); + } else { + /* Construct a sequential cycle. */ + for (i = 0; i < n_lines; ++i) { + *(void **)((unsigned char *)data + i*chunk) = ((unsigned char *)adjusted_data + ((i+1)%n_lines)*chunk); + } + } + if (debug >= 2) { + printf("Data working set:\n"); + unsigned int lines_to_show = n_lines; + if (lines_to_show > 10) { + lines_to_show = 10; + } + for (i = 0; i < lines_to_show; ++i) { + unsigned int j; + void **p; + unsigned int ix = (c->workload_flags & WL_MEM_STREAM) ? 0 : line_data_placement(c, i); + p = (void **)((unsigned char *)adjusted_data + i*chunk + ix); + printf(" from %2u: ", i); + for (j = 0; j < 10; ++j) { + printf("*(%p+%d) -> ", p, c->data_pointer_offset); + p = (void **)*(void **)((unsigned char *)p + c->data_pointer_offset); + } + printf("...\n"); + } + } + if (debug >= 1) { + /* Do a post-facto check on the data, to check it has the right parameters */ + void *p = adjusted_data; + WorkingSetCharacteristics ws; + printf("Collecting data working set characteristics...\n"); + ws_init(&ws); + do { + void **load_addr = (void **)((unsigned char *)p + c->data_pointer_offset); + ws_update(&ws, load_addr, sizeof(void *)); + p = *load_addr; + if (ws.n_access > expected_chain_length) { + fprintf(stderr, "working set corrupt\n"); + assert(0); + } + } while (p != adjusted_data); + assert(round_size(ws_range(&ws), chunk) == size_rounded_to_lines); + if (debug >= 1) { + ws_show(&ws); + } + ws_free(&ws); + } + if (1) { + unsigned int cl = chain_length(adjusted_data, c->data_pointer_offset); + assert(cl == expected_chain_length); + if (debug >= 1) { + printf("Data chain length verified as %lu (%lu-byte footprint in %u-byte lines)\n", + (unsigned long)cl, ((unsigned long)cl * LINE), LINE); + } + } + if (debug >= 1) { + printf("Constructed data working set.\n"); + } + /* Return the initial offsetted pointer that the client should use when + iterating through the working set. Each load will add the fixed offset to + the current pointer. The actual memory area is remembered in the + memory descriptor structure and will be used on free. */ + return adjusted_data; +} + diff --git a/linux_app/pmu_app/pysweep/src/loadgen.c b/linux_app/pmu_app/pysweep/src/loadgen.c new file mode 100644 index 00000000..5b7ef31f --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loadgen.c @@ -0,0 +1,644 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Generate a runnable workload in memory, based on a set of workload characteristics. + */ + +/* + * Have to define this to get sigaction, MAP_ANONYMOUS etc. + * Define it now in case our headers pull in any system headers. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include "loadgenp.h" + +#include "arch.h" +#include "genelf.h" +#include "denormals.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +int workload_verbose = 0; + + +static unsigned long round_size_to_pages(unsigned long size) +{ + return round_size(size, sysconf(_SC_PAGESIZE)); +} + + +/* + * Find out the system's huge page size, so that we can safely use MAP_HUGETLB. + * MAP_HUGETLB allocations must be rounded up to this size. + * + * Return 0 if we can't find the size. + */ +static unsigned long huge_page_size(void) +{ + static unsigned long size = 1; /* Never valid; initiates discovery */ + if (size == 1) { + FILE *fd = fopen("/proc/meminfo", "r"); + char buf[100]; + while (fgets(buf, sizeof buf, fd)) { + if (!memcmp(buf, "Hugepagesize:", 13)) { + long sizek = 0; + if (sscanf(buf+13, "%ld", &sizek) == 1) { + size = sizek * 1024; + if (size != 0) { + assert((size & -size) == size); /* power of 2 */ + assert((long)size > sysconf(_SC_PAGESIZE)); /* TBD: always? */ + } + break; + } + } + } + fclose(fd); + if (!size) { + fprintf(stderr, "Couldn't get huge page size\n"); + size = 0; + } + } + return size; +} + + +static unsigned long total_mmap_size = 0; +static unsigned int total_mmap_count = 0; + + +/* + * Allocate some memory, e.g. for data or code working set. + * The memory is page-aligned, so that we can later change its protection. + * On return, the workload_mem structure is filled in. + * TBD: What should we do for size zero? + */ +void *load_alloc_mem(struct workload_mem *m) +{ + void *p; + unsigned long rsize; + /* MAP_POPULATE is documented as pre-populating the page tables. */ + int flags = MAP_PRIVATE|MAP_ANONYMOUS; + assert(m->size_req > 0); + rsize = round_size_to_pages(m->size_req); + /* MAP_HUGETLB is only available if the size is a multiple of the + huge page size. When the user requests HUGETLB for a smaller allocation, + do they want us to round up the size, or ignore HUGETLB? */ + if ((m->is_hugepage && rsize >= huge_page_size()) || + m->is_force_hugepage) { + /* Is it even worth doing this if /proc/sys/vm/nr_hugepages is 0? */ + flags |= MAP_HUGETLB; + rsize = round_size(rsize, huge_page_size()); + } + /* We can't force mmap() to allocate with small pages. + But we can allocate without population, then madvise(MADV_NOHUGEPAGE), + then populate. */ + if (!m->is_no_hugepage) { + flags |= MAP_POPULATE; + } + m->size = rsize; + m->base = NULL; + if (1) { + /* _GNU_SOURCE should have ensured we see MAP_ANONYMOUS */ + unsigned int prot = PROT_READ|PROT_WRITE; + if (m->is_exec) { + prot |= PROT_EXEC; + } + assert(!(flags & MAP_HUGETLB) || (rsize % huge_page_size()) == 0); + if (workload_verbose) { + fprintf(stderr, "loadgen: mmap %lu/%#lx bytes, prot=%04x, flags=%04x\n", + (unsigned long)rsize, (unsigned long)rsize, (unsigned int)prot, (unsigned int)flags); + } + p = mmap(NULL, rsize, prot, flags, -1, 0); + if (p == MAP_FAILED && (flags & MAP_HUGETLB) != 0 && errno == ENOMEM) { + if (workload_verbose) { + fprintf(stderr, "loadgen: mmap(MAP_HUGETLB) failed, will retry and use madvise(MADV_HUGEPAGE)\n"); + } + /* Try again, using madvise() to force huge pages */ + flags = flags & ~MAP_HUGETLB; + /* We don't want the pages to be allocated until we've done madvise() */ + flags = flags & ~MAP_POPULATE; + p = mmap(NULL, rsize, prot, flags, -1, 0); + } + if (p == MAP_FAILED) { + perror("mmap"); + fprintf(stderr, "Failed to allocate %lu/%#lx bytes (flags 0x%x, page size %lu): total out %u, %lu bytes\n", + (unsigned long)rsize, (unsigned long)rsize, + (unsigned int)flags, + (unsigned long)sysconf(_SC_PAGESIZE), + total_mmap_count, + (unsigned long)total_mmap_size); + return NULL; + } + total_mmap_count += 1; + total_mmap_size += rsize; + m->is_mmap = 1; + /* We don't need to use MADV_HUGEPAGE, as we will have mmap'ed with MAP_HUGETLB */ + if ((m->is_hugepage || m->is_force_hugepage) && !(flags & MAP_HUGETLB)) { +#ifdef MADV_HUGEPAGE + int rc = madvise(p, rsize, MADV_HUGEPAGE); + if (rc < 0) { + perror("madvise"); + m->is_hugepage = 0; + } +#else + fprintf(stderr, "MADV_HUGEPAGE not available when this module was built\n"); + m->is_hugepage = 0; +#endif + } + if (m->is_no_hugepage) { +#ifdef MADV_NOHUGEPAGE + int rc = madvise(p, rsize, MADV_NOHUGEPAGE); + if (rc < 0) { + perror("madvise"); + m->is_no_hugepage = 0; + } +#else + fprintf(stderr, "MADV_NOHUGEPAGE not available when this module was built\n"); + m->is_no_hugepage = 0; +#endif + } + } + m->base = p; + if (workload_verbose) { + fprintf(stderr, "loadgen: alloc %p size %lu\n", m->base, m->size); + } + assert(p != NULL); + return p; +} + + +void load_free_mem(struct workload_mem *m) +{ + if (m->base) { + if (workload_verbose) { + fprintf(stderr, "loadgen: free %p size %lu\n", m->base, m->size); + } + if (m->is_mmap) { + unsigned long rsize = round_size_to_pages(m->size); + assert(total_mmap_size >= rsize); + munmap(m->base, rsize); + total_mmap_count -= 1; + total_mmap_size -= rsize; + } else { + free(m->base); + } + m->base = NULL; + } +} + + +/* +This function has the same API as the workload we create, and can be used +as a stub when we're diagnosing crashes with the workload. +*/ +static void *dummy_workload_code(void *p, void *offsetp, void *scratch) +{ + unsigned long offset = (unsigned long)offsetp; + void **actualp = (void **)((unsigned char *)p + offset); + void *next; + if (0) { + fprintf(stderr, "data step: input pointer %p, add %ld, actual address %p:\n", + p, offset, actualp); + } + next = *actualp; + if (0) { + fprintf(stderr, " -> %p\n", next); + } + return next; +} + + +static void *dummy_workload_code_nodata(void *p, void *unused, void *scratch) +{ + return 0; +} + + +static int workload_code_is_trivial(Character const *c) +{ + if (c->debug_flags & WORKLOAD_DEBUG_DUMMY_CODE) { + return 1; + } + return (c->inst_working_set == 0 && c->fp_intensity == 0); +} + + +void workload_init(Character *c) +{ + memset(c, 0, sizeof(Character)); + c->fp_value = 1.0; + c->fp_value2 = 1.0; + c->inst_target = 50000; +} + + +/* + * Construct a new workload. + * All memory needed for this workload is newly allocated. + * Return NULL if we can't create the workload. + */ +Workload *workload_create(Character const *c) +{ + void *data; + Workload *w = (Workload *)malloc(sizeof(Workload)); + + if (workload_verbose) { + fprintf(stderr, "loadgen: creating workload...\n"); + } + memset(w, 0, sizeof(Workload)); + w->elf_image = elf_create(); + /* Take a copy of the supplied workload characteristics. + Later changes made by the caller will not take effect. */ + w->c = *c; + data = load_construct_data(&w->c, &w->data_mem); + if (c->data_working_set > 0 && !data) { + /* Data working set was requested but couldn't be constructed */ + free(w); + if (workload_verbose) { + fprintf(stderr, "loadgen: couldn't create data working set\n"); + } + return NULL; + } + if (w->data_mem.base != NULL) { + elf_add_data(w->elf_image, w->data_mem.base, w->data_mem.size); + } + if (workload_code_is_trivial(c)) { + w->expected.n[COUNT_INST] = 100; /* Just a guess */ + if (c->data_working_set) { + w->entry = &dummy_workload_code; + w->expected.n[COUNT_INST_RD] = 1; + w->expected.n[COUNT_BYTES_RD] = sizeof(void *); + } else { + /* We mustn't try to run a chain pointer step when there's no + data working set. */ + w->entry = &dummy_workload_code_nodata; + } + } else if (load_construct_code(w)) { + /* We've now dynamically constructed a workload code sequence. */ + assert(w->entry != NULL); + } else { + /* Code was requested but couldn't be constructed - + e.g. maybe self-modifying code has been locked out by the OS. + If we didn't need a code workload with specific code footprint, + we might be able to fall back to a predefined function + that would iterate through the data working set. But we don't + currently support that. */ + free(w); + if (workload_verbose) { + fprintf(stderr, "loadgen: couldn't create code working set\n"); + } + return NULL; + } + w->entry_args[0] = data; + w->entry_args[1] = (void *)(unsigned long)w->c.data_pointer_offset; + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: set up workload entry %p with args [%p, %p]\n", + w, w->entry, + w->entry_args[0], w->entry_args[1]); + fprint_code(stderr, w->entry, 32); + } + + /* WORKLOAD_KEEP presets the workload reference counter to a high + number so that the workload isn't deleted even when not in use. + When we later want to delete the workload, we subtract WORKLOAD_KEEP + so that when the reference counter drops to zero the workload can + be deleted. */ +#define WORKLOAD_KEEP 100000 + w->references = WORKLOAD_KEEP; /* Make it stick until deleted */ + if (0) { + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: trial run...\n", w); + } + /* Run the workload once, just to check */ + workload_run_once(w); + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: trial run successful\n", w); + } + } + assert(w->references == WORKLOAD_KEEP); + return w; +} + + +/* + * Create an image file containing the code for the workload. + * The flags option currently isn't used. + * The file is generated in ELF format for direct viewing with e.g. "objdump -d". + * TBD: generate jitdump. + */ +int workload_dump(Workload *w, char const *fn, unsigned int flags) +{ + int rc; + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: dumping image: %s\n", w, fn); + } + rc = elf_dump(w->elf_image, fn); + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: dumped image: %s\n", w, fn); + } + return rc; +} + + +/* + * Clean up and destroy a workload. + * The workload must not be currently running. + * This function must be called once, by only one thread. + */ +static void workload_destroy(Workload *w) +{ + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: destroy\n", w); + } + if (w->references != 0) { + fprintf(stderr, "** loadgen: %p: workload_destroy called when references=%d\n", w, w->references); + /* How did this happen? We shouldn't have been called unless and until + 'running' was finally set to zero, and no more iterations should + have been started after that point. */ + } + assert(!w->references); +#if 0 + if (w->elf_image != NULL) { + elf_destroy(w->elf_image); + w->elf_image = NULL; + } +#endif + if (!(w->c.debug_flags & WORKLOAD_DEBUG_NO_FREE)) { + load_free_mem(&w->data_mem); + load_free_code(w); + } else { + fprintf(stderr, "loadgen: %p: debug request to not free working sets\n", w); + } + /* If somehow we've still got a workload running, it's possibly + crashed by now, as we've released the code and data. */ + assert(!w->references); + free(w); + if (workload_verbose) { + fprintf(stderr, "loadgen: %p (freed): workload destroyed\n", w); + } +} + + +/* + * User request to delete the workload. If the workload is not in use (running), + * it is deleted right now, otherwise it is marked for deletion when the last + * runner completes. + * This function must be called only once per workload. + */ +int workload_free(Workload *w) +{ + int destroyed = 0; + if (w) { + int now_running; + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: free\n", w); + } + now_running = __sync_sub_and_fetch(&w->references, WORKLOAD_KEEP); + if (!now_running) { + workload_destroy(w); + destroyed = 1; + } else { + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: pending delete (%d)\n", w, now_running); + } + assert(destroyed == 0); + } + } + return destroyed; +} + + +void workload_add_reference(Workload *w) +{ + __sync_fetch_and_add(&w->references, 1); +} + + +void workload_remove_reference(Workload *w) +{ + int now_running = __sync_sub_and_fetch(&w->references, 1); + assert(now_running >= 0); + if (__builtin_expect((now_running == 0), 0)) { + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: workload was marked for delete, now deleting\n", w); + } + workload_destroy(w); + } +} + + +/* +This is a dubious way to ensure the FP registers have known values +before we go into the generated workload code. Only the first three +registers need to be set. The workload code will copy them to the +remaining work registers. +*/ +__attribute__((noinline,used)) +static double fp_regs_clearer_double(double a, double b, double c) +{ + __asm__(""); + return a + b + c; +} + +__attribute__((noinline,used)) +static float fp_regs_clearer_float(float a, float b, float c) +{ + __asm__(""); + return a + b + c; +} + + +/* + * As preparation for running a sequence of generated floating-point instructions, + * set up the floating-point work registers. + */ +static void fp_regs_clear_double(double workval, double constval) +{ + fp_regs_clearer_double(0.0, workval, constval); +} + +static void fp_regs_clear_float(double workval, double constval) +{ + fp_regs_clearer_float(0.0, workval, constval); +} + + +/* +If we want to see the effect of denormals on +instruction timings, when we're using the output of one instruction as +a data input of the next, we need to ensure that denormals don't quickly +evaporate. So for example MUL of two denormals would go to zero. +A better result is to MUL a denormal with a value close to 1 (but not +exactly 1 as that might take a fast path): + + x = DENORMAL; + x = NEAR1 * x; + x = NEAR1 * x; + +or + + x = DENORMAL; + x = NEAR1 / x; // x now large finite (not denormal) + x = NEAR1 / x; // x now denormal again + +For division, in order that NEAR1/x doesn't overflow to infinity, +we should pick a value of NEAR1 that's somewhat less than 1, +e.g. 1e-7 for float and 1e-15 for double. +*/ + + +static void signal_handler(int sig, siginfo_t *si, void *unused) +{ + unsigned int i; + if (sig == SIGILL) { + unsigned char const *p = (unsigned char const *)si->si_addr; + fprintf(stderr, "loadgen: SIGILL from illegal instruction at %p\n", p); + fprint_code(stderr, si->si_addr, 32); + } else if (sig == SIGSEGV) { + unsigned char const *p = (unsigned char const *)si->si_addr; + fprintf(stderr, "loadgen: SIGSEGV from illegal address at %p\n", p); + } else { + fprintf(stderr, "loadgen: signal %d at %p\n", sig, si->si_addr); + } + const int MAX_BACKTRACE = 20; + void *array[MAX_BACKTRACE]; + size_t size = backtrace(array, MAX_BACKTRACE); + char **strings = backtrace_symbols(array, size); + for (i = 0; i < size; ++i) { + printf("%s\n", strings[i]); + } + free(strings); + exit(EXIT_FAILURE); +} + + +__attribute__((noinline)) +static void *workload_enter(Workload *w, void *data, unsigned int n_iters) +{ + unsigned int i; + /* Run some iterations of the workload. This may take some time. */ + /* FP operations will use the ambient contents of the FP registers. */ + for (i = 0; i < n_iters; ++i) { + if (0) { + fprintf(stderr, "loadgen: %p: run iteration %u with %p\n", w, i, data); + } + data = (w->entry)(data, w->entry_args[1], w->scratch); + } + return data; +} + + +/* +Run the next 'chunk' of a workload using some prior state, +perhaps the state returned from last time in argument 0. +Other arguments will be picked up from the work descriptor. + +This may be run from multiple threads, so we should avoid updating +any shared state. +*/ +void *workload_run(Workload *w, void *data, unsigned int n_iters) +{ + assert(w != NULL); + if (workload_verbose >= 2) { + fprintf(stderr, "loadgen: %p: run workload entry %p with args [%p (originally %p), %p], %u iterations\n", + w, w->entry, + data, w->entry_args[0], w->entry_args[1], + n_iters); + } + static int sigdone; + if (!sigdone) { + int rc; + struct sigaction sa; + sa.sa_flags = SA_SIGINFO; + sigemptyset(&sa.sa_mask); + sa.sa_sigaction = signal_handler; + sigdone = 1; + rc = sigaction(SIGSEGV, &sa, NULL); + if (rc != -1) { + rc = sigaction(SIGILL, &sa, NULL); + } + if (rc == -1) { + perror("sigaction"); + fprintf(stderr, "loadgen: %p: could not set trap handler\n", w); + } + } + //fp_regs_clear(1.0); + if (!denormals_set_enabled((w->c.fp_flags & FP_FLAG_DENORMAL_FTZ) == 0)) { + /* TBD we should have done this earlier and returned a failure code */ + fprintf(stderr, "** Could not set required denormal handling mode\n"); + assert(0); + } +#if defined(__x86_64__) + /* On x86 with AVX, we can take an ongoing penalty when doing XMM operations, + on 128-bit values, if the upper 128 bits of 256-bit registers are non-zero. + To fix this, we need to do a VZEROALL or VZEROUPPER. + The performance penalty seems to be about 1 cycle per operation. + It doesn't seem to be well indicated by hardware events. It doesn't + correspond to an assist, for example. + */ + __asm__("vzeroupper"); + //_mm256_zeroupper(); +#endif + /* Provide suitable input values. + The sequence of FP operations modifies the values in registers so + (the back-to-back chaining is critical to measuring latency) so the + values we provide here may quickly vanish, diverge etc. TBD do better. + */ + if (w->c.fp_precision == FP_PRECISION_DOUBLE) { + fp_regs_clear_double((w->c.fp_flags & FP_FLAG_DENORMAL_GEN) ? DOUBLE_DENORMAL : w->c.fp_value, + (w->c.fp_operation == FP_OP_DIV ? 1e-15 : w->c.fp_value2)); + } else { + fp_regs_clear_float((w->c.fp_flags & FP_FLAG_DENORMAL_GEN) ? FLOAT_DENORMAL : (float)w->c.fp_value, + (w->c.fp_operation == FP_OP_DIV ? 1e-7 : (float)w->c.fp_value2)); + } + data = workload_enter(w, data, n_iters); + return data; +} + + +void workload_run_once(Workload *w) +{ + void *ndata; + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: run workload entry %p with args %p %p\n", + w, w->entry, + w->entry_args[0], w->entry_args[1]); + } + ndata = workload_run(w, w->entry_args[0], 1); + if (workload_verbose) { + fprintf(stderr, "loadgen: %p: workload returned %p\n", w, ndata); + } +} + + +/* end of loadgen.c */ + diff --git a/linux_app/pmu_app/pysweep/src/loadgen.h b/linux_app/pmu_app/pysweep/src/loadgen.h new file mode 100644 index 00000000..1a357607 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loadgen.h @@ -0,0 +1,258 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* +Synthetic workload generator / executor. + +This module constructs and executes synthetic workloads based on a set of +generic input parameters (characteristics) describing aspects such as + + - code working set + - data working set + - branch predictability + - use of various instruction groups + +The resulting workload, when run, should consume CPU and system resources +corresponding to its characteristics. +*/ + + +#ifndef __included_loadgen_h +#define __included_loadgen_h + +#include "genelf.h" + +#include + +/* +Workload characteristics structure. + +This is filled in by the client, to specify the workload. +*/ +typedef struct { + /* Data working set in bytes. Currently assumed to be flat + (i.e. randomly distributed, not clumped). */ + unsigned long data_working_set; + /* The data pointer offset can be set non-zero to try and defeat + linked-list prefetchers. The offset will be applied to pointers + stored in the data working set, and adjusted for in the loads. */ + unsigned int data_pointer_offset; + /* How sparse is the data? This multiplier is applied to the + addresses within the data. (A default of 0 has the effect of 1.) */ + unsigned int data_dispersion; + /* Alignment of pointers in the data working set - e.g. 1 for + byte alignment. Set to 0 for natural alignment. */ + unsigned int data_alignment; + /* Instruction working set in bytes. */ + unsigned long inst_working_set; + unsigned int inst_mispredict_rate; +#define WL_MEM_BW 0x01 /* Measure for memory bandwidth not latency */ +#define WL_MEM_NONTEMPORAL 0x02 /* Use non-temporal loads where possible */ +#define WL_MEM_LOAD_EXTRA 0x04 /* Generate an additional (unused) load */ +#define WL_MEM_LOAD_PAIR 0x08 /* Use a non-temporal load */ +#define WL_MEM_PREFETCH 0x10 /* Issue a software prefetch before loading */ +#define WL_MEM_STREAM 0x20 /* Use stream rather than random workload */ +#define WL_MEM_NO_HUGEPAGE 0x40 /* Request no huge-pages */ +#define WL_MEM_HUGEPAGE 0x80 /* Request huge-pages */ +#define WL_MEM_FORCE_HUGEPAGE 0x100 /* Request huge-pages even when small */ +#define WL_MEM_BARRIER 0x200 /* Generate a load barrier after each load */ +#define WL_MEM_ACQUIRE 0x400 /* Use load-acquire instruction */ +#define WL_MEM_NOP 0x800 /* Generate a NOP after each load */ +#define WL_MEM_STORE 0x1000 /* Generate stores as well as loads */ +#define WL_MEM_RELEASE 0x2000 /* Use store-release instruction */ +#define WL_MEM_ATOMIC 0x4000 /* Use atomic instruction */ +#define WL_DEPEND 0x8000 /* Force total dependency chain */ +#define WL_MEM_BARRIER_SYSTEM 0x10000 /* e.g. DMB SY */ +#define WL_MEM_BARRIER_SYNC 0x20000 /* serializing wrt instructions: DSB instead of DMB */ + unsigned int workload_flags; /* WL_xxx flags */ + /* Floating-point intensity - FP ops per memory reference. */ + unsigned int fp_intensity; + /* Arithmetic precision */ +#define FP_PRECISION_FP16 1 +#define FP_PRECISION_SINGLE 2 +#define FP_PRECISION_DOUBLE 3 + unsigned int fp_precision; /* 1: FP16, 2: SP, 3: DP */ + unsigned int fp_simd; /* 0: scalar, N: N-way SIMD */ +#define FP_OP_MOV 0 +#define FP_OP_IADD 1 +#define FP_OP_IXOR 2 +#define FP_OP_NEG 3 +#define FP_OP_ADD 4 +#define FP_OP_MUL 5 +#define FP_OP_DIV 6 +#define FP_OP_SQRT 7 +#define FP_OP_FMA 8 /* up to here, we must match arrays in loadinst.c */ +#define FP_OP_FMAA 9 +#define FP_OP_MULADD 10 +#define FP_OP_DOT2 11 +#define FP_OP_DOT4 12 +#define FP_OP_DIST2 13 + unsigned int fp_operation; + unsigned int fp_concurrency; /* Number of concurrent ops: 1 = back-to-back */ + double fp_value; /* Floating-point data value initializer */ + double fp_value2; /* Floating-point data value corrector */ + + /* Floating-point flags can modify both the target configuration and + our generated code. */ +#define FP_FLAG_DENORMAL_GEN 0x01 /* Code generation: use denormal inputs */ +#define FP_FLAG_DENORMAL_FTZI 0x02 /* Target mode: flush to zero on input */ +#define FP_FLAG_DENORMAL_FTZO 0x04 /* Target mode: flush to zero on output */ +#define FP_FLAG_DENORMAL_FTZ (FP_FLAG_DENORMAL_FTZI|FP_FLAG_DENORMAL_FTZO) +#define FP_FLAG_ALTERNATE 0x08 /* Use alternate instruction form (whatever it is) */ +#define FP_FLAG_SIMPLE_VAL 0x10 /* Use simple (possibly fast) value */ +#define FP_FLAG_CONVERGE 0x20 /* For DIV, converge to result of 1.0 */ +#define FP_FLAG_LOAD_CONST 0x40 /* Load constants from memory */ + unsigned int fp_flags; + + /* Debugging/diagnostic flags for workload generation. */ +#define WORKLOAD_DEBUG_NO_MPROTECT 1 /* don't do mprotect() even if we need to */ +#define WORKLOAD_DEBUG_NO_UNIFICATION 2 /* don't do cache unification even if we need to */ +#define WORKLOAD_DEBUG_DUMMY_CODE 4 /* never generate code */ +#define WORKLOAD_DEBUG_NO_WX 8 /* avoid write+execute */ +#define WORKLOAD_DEBUG_NO_FREE 0x10 /* don't free any memory - in case race */ +#define WORKLOAD_DEBUG_TRIAL_RUN 0x20 /* check workload runs, immediately after construction */ + unsigned int debug_flags; + unsigned long inst_target; /* Target no. of insts for one execution of workload */ +} Character; + + +void workload_init(Character *); + + +/* +What the entry point for a workload looks like. +There may also be implicit floating-point arguments (TBD improve). +*/ +typedef void *(* dummy_fn_t)(void *, void *, void *); + + +/* +When generating the workload code, we keep track of how +many instructions of these different categories we expect +to execute. This can then be calibrated against observed +performance events. +*/ +typedef enum InstCounter { + /* The following correspond to hardware counters. */ + COUNT_INST, /* Total instructions */ + COUNT_BRANCH, /* Any kind of branch or transfer of control */ + COUNT_FLOP_HALF, /* Half-precision floating-point operations */ + COUNT_FLOP_SP, /* SP floating-point operations: FMA counts 2, SIMD counts N */ + COUNT_FLOP_DP, /* DP floating-point operations: FMA counts 2, SIMD counts N */ + COUNT_MOVE, /* Register moves (any kind) */ + COUNT_INST_RD, /* Memory read instructions */ + COUNT_BYTES_RD, /* Memory read bytes */ + COUNT_INST_WR, /* Memory write instructions */ + COUNT_BYTES_WR, /* Memory write bytes */ + COUNT_FENCE, /* Fences/barriers */ +#define COUNT_MEM_PREFETCH COUNT_INST /* Don't count prefetches as reads */ + /* The following are more arbitrary measures, when we are generating + sequences of instructions (e.g. dot-product). */ + COUNT_UNIT, + /* Number of counter types, for sizing counter arrays */ + COUNT_MAX +} inst_counter_t; + + +struct inst_counters { + unsigned int n[COUNT_MAX]; +}; + + +/* Properties of an allocated memory block - useful for when we want to free */ +struct workload_mem { + /* Input parameters */ + unsigned long size_req; /* Size actually wanted */ + int is_exec:1; /* Allocate as executable */ + int is_no_hugepage:1; /* Forbid allocation as huge pages */ + int is_hugepage:1; /* Request opportunistic promotion to huge pages if large enough */ + int is_force_hugepage:1; /* Request promotion to huge pages even for small allocations */ + /* Output */ + void *base; /* Base virtual address */ + unsigned long size; /* Size obtained - maybe rounded up to pages etc. */ + int is_mmap:1; /* Obtained by mmap (not malloc) */ +}; + +/* +Details of a workload created to implement the workload characteristics +requested by a client. +*/ +typedef struct { + /* Data passed in by client */ + Character c; /* Copy of workload characteristics as specified by client */ + + /* Data about the generated workload code */ + struct inst_counters expected; /* Count values per entry call */ + unsigned int n_chain_steps; /* number of data steps per iteration */ + elf_t elf_image; /* Internal descriptor for ELF generation */ + + /* Data required to run the workload */ + dummy_fn_t entry; /* Code entry point */ + void *entry_args[2]; /* Arguments for entry point */ + + /* Following are internal details - shouldn't really be exposed here */ + struct workload_mem code_mem; + struct workload_mem data_mem; + + /* Current status of the workload */ + volatile unsigned int references; /* Number of threads running this workload */ + + /* Anything else needed by the workload */ + uint64_t scratch[16]; /* Scratch space for spills etc. */ +} Workload; + + +/* + * Builds a workload with the given characteristics. + * Returns a workload object. + */ +Workload *workload_create(Character const *); + +/* + * Increment the reference count on a workload. + */ +void workload_add_reference(Workload *); + +/* + * Decrement the reference count and possibly destroy the workload. + */ +void workload_remove_reference(Workload *); + +/* + * Destroy a workload object. + * Return 1 if the workload was actually freed, 0 if deferred. + */ +int workload_free(Workload *); + +/* + * Run the first iteration of a workload in the current thread, and then stop. + * Multiple threads can concurrently run the same workload. + */ +void workload_run_once(Workload *); + +/* + * Run N iterations of a workload in the current thread. + */ +void *workload_run(Workload *, void *, unsigned int); + +/* + * Dump workload to an ELF file. + */ +int workload_dump(Workload *, char const *fn, unsigned int flags); + +#endif /* included */ + diff --git a/linux_app/pmu_app/pysweep/src/loadgenp.h b/linux_app/pmu_app/pysweep/src/loadgenp.h new file mode 100644 index 00000000..2bedc45b --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loadgenp.h @@ -0,0 +1,56 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* Private header for load generation */ + +#ifndef __included_loadgenp_h +#define __included_loadgenp_h + +#include "loadgen.h" + +#include +#include + +extern int workload_verbose; + +extern void *load_alloc_mem(struct workload_mem *); + +extern void load_free_mem(struct workload_mem *); + +extern void *load_construct_code(Workload *); + +extern void load_free_code(Workload *); + +extern void *load_construct_data(Character const *, struct workload_mem *); + +#ifdef __cplusplus +template +inline T round_size(T size, unsigned int granule) +{ + return (size + (granule-1)) & ~(T)(granule-1); +} +#else +/* Round the size by ANDing with a suitable constant. + The constant must be as wide as the size. */ +#define round_size(size, granule) ((size + ((granule)-1)) & ~((size)*0+(granule)-1)) +#endif + +extern void fprint_mem(FILE *, void const *, size_t); + +extern void fprint_code(FILE *, void const *, size_t); + +#endif /* included */ diff --git a/linux_app/pmu_app/pysweep/src/loadinst.c b/linux_app/pmu_app/pysweep/src/loadinst.c new file mode 100644 index 00000000..58e2c2f7 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loadinst.c @@ -0,0 +1,1117 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Generate code for a runnable workload in memory, based on a set of workload characteristics. + * + * Much of this unit is about generating instructions for x86 and ARM. + * A future direction would be for this function to be performed via some + * existing tool such as LLVM or DynamoRIO. + */ + +#include "loadinst.h" + +#include "loadgenp.h" + +#include +#include +#include +#include +#include +#include + + +/* +Define a type corresponding to a code address. + +Note that for ARM/Thumb we assume that we're generating code according to the +instruction set with which this translation unit is compiled. +*/ +#ifdef ARCH_T32_ +typedef unsigned short code_t; +#elif defined(ARCH_A32) +typedef unsigned int code_t; +#elif defined(ARCH_A64) +typedef unsigned int code_t; +#elif defined(__x86_64__) +typedef unsigned char code_t; +#else +#error "Unexpected architecture" +#endif + + +/* + * This structure maintains a pointer into the instruction stream + * we're building, and allows the code builder to generate branches + * when needed to move to the next cache line. + */ +struct codestream { + struct inst_counters *metrics; /* For counting instructions of different types */ + unsigned int multiplier; + int use_alternate; + unsigned char *base; /* Base of the whole area */ + size_t size; /* Size of the whole area */ + unsigned int line_size; /* Line size e.g. 64 */ + /* The following fields are updated as we generate code */ + unsigned int line_reserve; + unsigned char *line; + unsigned char *line_end; + code_t *p; /* running code pointer */ + int ran_out_of_space; + int error; +}; + + +static void expect_ops(CS *cs, inst_counter_t type, unsigned int n) +{ + cs->metrics->n[type] += n * cs->multiplier; +} + + +static void expect_op(CS *cs, inst_counter_t type) +{ + expect_ops(cs, type, 1); +} + + +static void expect_inst(CS *cs, inst_counter_t type) +{ + expect_op(cs, type); + if (type != COUNT_INST) { + expect_op(cs, COUNT_INST); + } +} + + +void codestream_show(CS const *cs) +{ + fprintf(stderr, "code stream [%p..%p size %#zx] at %p in %p..%p\n", + cs->base, cs->base+cs->size, cs->size, + cs->p, cs->line, cs->line_end); +} + + +static void codestream_start_line(CS *cs, unsigned char *line) +{ + cs->line = line; + cs->line_end = cs->line + cs->line_size; + cs->p = (code_t *)cs->line; +#ifdef __x86_64__ + memset(cs->p, 0xCC, cs->line_size); +#endif +} + + +/* + * Initialize a code writing stream in a code buffer. + * In order to get some diversity in code locations, we arrange the + * buffer as a sequence of code lines. + * The stream actually goes backwards, starting with the last line. + * As we reach the end of a line we hop backwards to the previous line. + */ +CS *codestream_init(struct inst_counters *counters, + void *base, size_t size, unsigned int line_size) +{ + CS *cs = (CS *)malloc(sizeof(CS)); + if (!cs) { + return cs; + } + memset(cs, 0, sizeof *cs); + cs->metrics = counters; + cs->multiplier = 1; + /* line_size must be a suitable cache line size */ + assert(line_size > 0 && (line_size % 32) == 0); + /* base is the code area we dynamically allocated */ + assert((unsigned long)base % line_size == 0); + cs->base = (unsigned char *)base; + /* The user-provided buffer size doesn't have to be a multiple + of the line size. We'll have rounded it up when allocating. */ + cs->size = (size + line_size - 1) & (~(line_size-1)); + assert(cs->size >= size); + assert(cs->size < (size + line_size)); + assert((cs->size % line_size) == 0); + cs->line_size = line_size; + cs->ran_out_of_space = 0; + cs->error = 0; + codestream_start_line(cs, base + (cs->size - cs->line_size)); + cs->line_reserve = 4; /* Enough for a short branch */ + return cs; +} + +void codestream_use_alternate(CS *cs) +{ + cs->use_alternate = 1; +} + +void codestream_set_multiplier(CS *cs, int m) +{ + assert(m >= 0); + cs->multiplier = m; +} + +int codestream_push_multiplier(CS *cs, int m) +{ + assert(m >= 0); + cs->multiplier *= m; + return cs->multiplier; +} + +int codestream_pop_multiplier(CS *cs, int m) +{ + assert(m >= 0); + assert((cs->multiplier % m) == 0); + cs->multiplier /= m; + return cs->multiplier; +} + + +void codestream_free(CS *cs) +{ + free(cs); +} + +void *codestream_addr(CS const *cs) +{ + return cs->p; +} + + +/* + * Set the error flag, which we'll test later + */ +static void codestream_error(CS *cs, char const *reason, ...) +{ + va_list args; + va_start(args, reason); + fprintf(stderr, "codegen error: "); + vfprintf(stderr, reason, args); + fprintf(stderr, "\n"); + va_end(args); + cs->error += 1; +} + +int codestream_errors(CS const *cs) +{ + return cs->error; +} + +static void codestream_gen(CS *cs, code_t data) +{ + *(cs->p++) = data; +} + +void codestream_gen_direct(CS *cs, unsigned int data) +{ + codestream_gen(cs, (code_t)data); +} + +static void __attribute__((unused)) codestream_gen2(CS *cs, code_t a, code_t b) +{ + codestream_gen(cs, a); + codestream_gen(cs, b); +} + +static void __attribute__((unused)) codestream_gen3(CS *cs, code_t a, code_t b, code_t c) +{ + codestream_gen(cs, a); + codestream_gen(cs, b); + codestream_gen(cs, c); +} + +static void __attribute__((unused)) codestream_gen4(CS *cs, code_t a, code_t b, code_t c, code_t d) +{ + codestream_gen(cs, a); + codestream_gen(cs, b); + codestream_gen(cs, c); + codestream_gen(cs, d); +} + +#ifdef __x86_64__ +static void codestream_gen32(CS *cs, int data) +{ + *(signed int *)(cs->p) = data; + cs->p += 4; +} +#endif + + +/* + * See how many contiguous bytes are left in the current code line. + * If the next instruction needs more than this we'll need to first + * branch to a new code line. + */ +static unsigned int codestream_bytes_left(CS const *cs) +{ + int bytes_left_s = (cs->line_end - (unsigned char *)cs->p) - cs->line_reserve; + if (bytes_left_s < 0) { + fprintf(stderr, "overran buffer (reserving %u): p=%p, end=%p\n", + cs->line_reserve, cs->p, cs->line_end); + /* we hope the caller will assert on -ve result */ + bytes_left_s = 0; + } + return (unsigned int)bytes_left_s; +} + + +int codestream_gen_call(CS *cs, void *dest) +{ + int disp; +#ifdef ARCH_T32 +#error TBD +#elif defined(ARCH_A32) +#error TBD +#elif defined(ARCH_A64) + disp = ((code_t *)dest - cs->p); + codestream_gen(cs, 0x97000000 | (disp & 0xffffff)); +#elif defined(__x86_64__) + disp = ((code_t *)dest - (cs->p + 5)); + codestream_gen(cs, 0xE8); /* Relative call */ + codestream_gen32(cs, disp); +#endif + expect_inst(cs, COUNT_BRANCH); + return 1; +} + + +int codestream_gen_ret(CS *cs) +{ +#ifdef ARCH_T32 + codestream_gen(cs, 0x4770); +#elif defined(ARCH_A32) + codestream_gen(cs, 0xe12fff1e); +#elif defined(ARCH_A64) + codestream_gen(cs, 0xd65f03c0); +#elif defined(__x86_64__) + codestream_gen(cs, 0xC3); /* retq */ +#endif + expect_inst(cs, COUNT_BRANCH); + return 1; +} + + +int codestream_gen_ret_abi(CS *cs) +{ +#if defined(__x86_64__) + /* Argument in RDI, return in RAX */ + if (cs->metrics->n[COUNT_FLOP_DP] || cs->metrics->n[COUNT_FLOP_SP]) { + codestream_gen2(cs, 0x0F, 0x77); /* EMMS after using MMX instructions */ + expect_inst(cs, COUNT_INST); + } + codestream_gen3(cs, 0x48, 0x89, 0xF8); /* mov %rdi,%rax */ + expect_inst(cs, COUNT_MOVE); +#endif + return codestream_gen_ret(cs); +} + + + +#if defined(ARCH_T32) || defined(ARCH_A32) || defined(ARCH_A64) +static unsigned char const arm_cc[] = { + 0xe, /* AL */ + 0x0, /* EQ */ + 0x1, /* NE */ + 0x8, /* HI */ + 0x9, /* LS */ + 0x2, /* HS */ + 0x3, /* LO */ + 0xc, /* GT */ + 0xd, /* LE */ + 0xa, /* GE */ + 0xb, /* LT */ + 0x4, /* MI */ + 0x5, /* PL: positive or zero */ + 0x2, /* CS */ + 0x3, /* CC */ + 0x6, /* VS */ + 0x7 /* VC */ +}; +typedef int cc_size_check[1/(sizeof arm_cc == CC_MAX)]; +#elif defined(__x86_64__) +static unsigned char const x86_cc[] = { + 0xEB, /* j */ + 0x74, /* je */ + 0x75, /* jne */ + 0x77, /* ja (above) / jnbe */ + 0x76, /* jbe / jna */ + 0x73, /* jae / jnb */ + 0x72, /* jb (below) / jnae */ + 0x7F, /* jg (greater) */ + 0x7E, /* jle */ + 0x7D, /* jge */ + 0x7C, /* jl */ + 0x78, /* js (sign) */ + 0x79, /* jns (not sign) */ + 0x72, /* jc (carry) */ + 0x73, /* jnc (not carry) */ + 0x70, /* jo */ + 0x71 /* jno */ +}; +typedef int cc_size_check[1/(sizeof x86_cc == CC_MAX)]; +#else +#error Unsupported architecture +#endif + +int codestream_gen_branch(CS *cs, void *dest, cc_t cc) +{ + int disp; + /* Note that the pointer subtractions rely on code_t having the right size. */ +#ifdef ARCH_T32 + disp = ((code_t *)dest - (cs->p + 2)); + if (cc == CC_AL) { + // TBD should use Thumb2 long branch if displacement too large + codestream_gen(cs, 0xe000 + ((disp>>1) & 0x7ff)); + } else { + assert(0); // TBD + } +#elif defined(ARCH_A32) + disp = ((code_t *)dest - (cs->p + 2)); + codestream_gen(cs, 0x0a000000 + (arm_cc[cc] << 28) + (disp & 0x00ffffff)); +#elif defined(ARCH_A64) + disp = ((code_t *)dest - cs->p); + if (cc == CC_AL) { + codestream_gen(cs, 0x17000000 + (disp & 0x00ffffff)); + } else { + codestream_gen(cs, 0x54000000 + ((disp & 0x0007ffff) << 5) + arm_cc[cc]); + } +#elif defined(__x86_64__) + disp = ((code_t *)dest - (cs->p + 2)); + if (disp == (signed char)disp) { + unsigned char op = x86_cc[cc]; + assert(op != 0); + codestream_gen(cs, op); /* Short jump */ + codestream_gen(cs, (signed char)disp); + } else { + if (cc == CC_AL) { + disp -= 3; /* Adjust for instruction size difference */ + codestream_gen(cs, 0xE9); /* Near relative jump */ + } else { + disp -= 4; + codestream_gen(cs, 0x0F); /* Prefix */ + codestream_gen(cs, x86_cc[cc] + 0x10); /* 0x7x --> 0x8x */ + } + codestream_gen32(cs, disp); + } +#endif + expect_inst(cs, COUNT_BRANCH); + return 1; +} + + +/* + * Check there are enough consecutive bytes left in the current line + * for the instruction we're about to generate. If so, do nothing. + * If not, generate a branch to the next line if possible, otherwise + * report failure. + */ +int codestream_reserve(CS *cs, unsigned int bytes) +{ + unsigned int bytes_left = codestream_bytes_left(cs); + if (cs->error > 0) { + /* If we've previously reported an error on a stream, + indicate that we can't generate any more code. + This avoids us repeatedly trying to generate an + unavailable instruction. */ + return 0; + } else if (bytes_left >= bytes) { + return 1; + } else if (cs->line == cs->base) { + /* This was the last line */ + cs->ran_out_of_space = 1; + return 0; + } else { + /* Generate a branch to the previous line */ + unsigned char *dest = (cs->line - cs->line_size); + codestream_gen_branch(cs, dest, CC_AL); + codestream_start_line(cs, dest); + if (cs->line == cs->base) { + /* The last line might need a return epilogue - allow space */ + cs->line_reserve = 20; + } + assert(codestream_bytes_left(cs) >= bytes); + return 1; + } +} + + +/* + * Generate a data-processing operation, with up to four register operands. + * + * Return 0 if the operation cannot be done on this target, e.g. SIMD size unsupported. + * Assert if the request is badly formed on any target, e.g. too many registers for operation. + */ +int codestream_gen_op(CS *cs, unsigned int op, flavor_t flavor, freg_t Rd, freg_t Rx, freg_t Ry, freg_t Ra) +{ + unsigned int const esize_bits = FLOAT_BITS(flavor); + unsigned int const esize_bytes = esize_bits / 8; + int const is_simd = IS_SIMD(flavor); + unsigned int const simd_bytes = is_simd ? SIMD_SIZE(flavor) : 0; + assert(!is_simd || ((simd_bytes*8) >= esize_bits)); + unsigned int const simd_lanes = is_simd ? (simd_bytes / esize_bytes) : 1; + assert(esize_bits == 16 || esize_bits == 32 || esize_bits == 64); + + //fprintf(stderr, "op=%u flav=%u Rd=%d Rx=%d Ry=%d Ra=%d\n", op, flavor, Rd, Rx, Ry, Ra); + + assert(Rd != NR); + assert(Rx != NR); + if (op == FP_OP_MOV || op == FP_OP_NEG || op == FP_OP_SQRT) { + assert(Ry == NR); + } else { + assert(Ry != NR); + if (op == FP_OP_FMA) { + assert(Ra != NR); + } else { + assert(Ra == NR); + } + } + /* n.b. we don't reserve space in the code buffer here. */ +#if defined(ARCH_A64) + int is_bitwise_simd = (is_simd && (op == FP_OP_MOV || op == FP_OP_IXOR)); + unsigned int inst = 0xffffffff; + if (is_simd && cs->use_alternate) { + /* SVE instructions */ + static unsigned int const vinsts[] = { + 0x04603000, /* FMOV */ + 0x04200000, /* ADD */ + 0x04a03000, /* EOR */ + 0x041da000, /* FNEG (predicated) */ + 0x65000000, /* FADD */ + 0x65000800, /* FMUL */ + 0x650d8000, /* FDIV (predicated) */ + 0x650da000, /* FSQRT (predicated) */ + 0x65200000, /* FMLA (predicated) with Rd==Ra */ + }; + assert(op < (sizeof vinsts / sizeof vinsts[0])); + inst = vinsts[op]; + if (!inst) { + codestream_error(cs, "arm64: no SVE instruction for op %u", op); + return 0; + } + if (!is_bitwise_simd) { + if (esize_bits == 64) { + inst |= 0x00c00000; + } else if (esize_bits == 32) { + inst |= 0x00800000; + } + } + goto a64regs; + } + /* For NEON, we support 64-bit and 128-bit operations */ + if (is_simd && !(simd_bytes == 8 || simd_bytes == 16)) { + codestream_error(cs, "arm64: invalid SIMD size %u bytes", simd_bytes); + return 0; + } + /* AArch64 instruction templates */ + static unsigned int const insts[] = { + 0x1e204000, /* FMOV */ + 0, + 0, + 0x1e214000, /* FNEG */ + 0x1e202800, /* FADD */ + 0x1e200800, /* FMUL */ + 0x1e201800, /* FDIV */ + 0x1e21c000, /* FSQRT */ + 0x1f000000, /* FFMA */ + }; + static unsigned int const vinsts[] = { + 0x0ea01c00, /* FMOV (vector): alias of ORR */ + 0x0e208400, /* ADD (vector) */ + 0x2e201c00, /* EOR (vector) */ + 0x2ea0f800, /* FNEG (vector) */ + 0x0e20d400, /* FADD (vector) */ + 0x2e20dc00, /* FMUL (vector) */ + 0, /* no vector FDIV */ + 0, /* no vector FSQRT */ + 0x0e20cc00, /* FMLA (vector) */ + }; + assert(op < (sizeof insts / sizeof insts[0])); + inst = (is_simd ? vinsts[op] : insts[op]); + if (inst == 0) { + /* Something we can't do - e.g. vector DIV on ARM */ + codestream_error(cs, "no encoding for operation %u", op); + return 0; + } + if (is_simd && (esize_bytes == simd_bytes)) { + /* Single-element double-precision isn't really SIMD */ + codestream_error(cs, "can't do single-element SIMD"); + return 0; + } + if (simd_bytes == 16) { + inst |= 0x40000000; /* Set Q [30] */ + } + if (esize_bits == 64 && !is_bitwise_simd) { + inst |= 0x00400000; /* Set sz */ + } else if (esize_bits == 16 && !is_bitwise_simd) { + /* ARMv8.2 half-precision */ + inst ^= 0x0020c000; + } +a64regs: + /* Now add in the registers */ + inst |= (Rd << 0); /* Rd */ + switch (op) { + case FP_OP_ADD: + case FP_OP_MUL: + case FP_OP_DIV: + case FP_OP_IADD: + case FP_OP_IXOR: + /* for add, mul, div but not sqrt, there's a third operand */ + inst |= (Rx << 5) | (Ry << 16); + break; + case FP_OP_MOV: + if (is_simd) { + /* AArch64 MOV (vector) is an alias of ORR */ + inst |= (Rx << 16); + } + /* fall through */ + case FP_OP_NEG: + case FP_OP_SQRT: + inst |= (Rx << 5); /* SQRT has only one source operand */ + break; + case FP_OP_FMA: + /* for FMA scalar, there are four operands */ + if (is_simd && Rd != Ra) { + assert(Rd != Rx); + assert(Rd != Ry); + codestream_gen_op(cs, FP_OP_MOV, flavor, Rd, Ra, NR, NR); + } + inst |= (Rx << 5) | (Ry << 16); /* multiplier */ + if (!is_simd) { + inst |= (Ra << 10); /* accumulator input */ + } + break; + default: + assert(0); + } + codestream_gen(cs, inst); +#elif defined(__x86_64__) + if (esize_bits == 16) { + codestream_error(cs, "x86: can't do FP16"); + return 0; + } + int const is_dp = (esize_bits == 64); + int is_evex = (simd_bytes == 64); /* i.e. AVX512 */ + if (is_simd && !(simd_bytes == 16 || simd_bytes == 32 || simd_bytes == 64)) { + codestream_error(cs, "x86: invalid SIMD size %u bytes", simd_bytes); + return 0; + } + static unsigned char const inst[] = { + 0x28, /* mov */ + 0xfe, /* iadd */ + 0xef, /* ixor */ + 0x57, /* neg - actually xor */ + 0x58, /* add */ + 0x59, /* mul */ + 0x5e, /* div */ + 0x51, /* sqrt */ + 0xb9, /* fma */ + }; + assert(op < (sizeof inst / sizeof inst[0])); + if (is_evex) { + /* e.g. AVX512 */ + int const single_input = (op == FP_OP_SQRT || op == FP_OP_MOV); + unsigned char P1 = 0x01, P2 = 0x04, P3 = 0x00; + unsigned char opcode = inst[op]; + if (op == FP_OP_FMA && Rd != Ra) { + assert(Rd != Rx); + assert(Rd != Ry); + codestream_gen_op(cs, FP_OP_MOV, flavor, Rd, Ra, NR, NR); + } + P1 |= 0x70; + if (single_input) { + assert(Ry == NR); + Ry = Rx; + P2 |= 0x78; + P3 |= 0x08; + } else { + unsigned char nRx = Rx ^ 0x1f; + P2 |= ((nRx & 15) << 3); + P3 |= (((nRx & 0x10) >> 4) << 3); + } + if (op == FP_OP_FMA) { + P1 ^= 0x03; + P2 &= 0xfc; /* .66 */ + P2 |= 0x01; + if (is_dp) { + P2 |= 0x80; /* .W1 */ + } + opcode = 0x98; + } else { + if (!is_simd) { + P2 |= 0x02; + } + if (is_dp) { + P2 |= 0x81; + } + } + if (simd_bytes == 64) { + P3 |= 0x40; + } else if (simd_bytes == 32) { + P3 |= 0x20; + } + if (!single_input && (Ry & 8)) { + P1 &= 0xdf; + } + if (Rd & 8) { + P1 &= 0x7f; + } else { + P1 |= 0x80; + } + codestream_gen4(cs, 0x62, P1, P2, P3); + codestream_gen2(cs, opcode, (0xc0 | ((Rd & 7)<<3) | (Ry & 7))); + } else if (op == FP_OP_MOV || op == FP_OP_IADD || op == FP_OP_IXOR) { + /* copy Rx to Rd */ + if (esize_bits == 64 || op != FP_OP_MOV) { + codestream_gen(cs, 0x66); + } + if ((Rd & 8) || (Rx & 8)) { + unsigned char rex = 0x40; + if (Rd & 8) { + rex |= 0x04; + } + if (Rx & 8) { + rex |= 0x01; + } + codestream_gen(cs, rex); + } + codestream_gen3(cs, 0x0f, inst[op], (0xc0 | ((Rd & 7)<<3) | (Rx & 7))); + } else if (op == FP_OP_FMA) { + /* Intel processors only support FMA3 instruction set with Rd=Ra */ + unsigned char vex1, vex2, opcode; + freg_t Rda = Rd; + if (Rd != Ra) { + assert(Rd != Rx); + assert(Rd != Ry); + codestream_gen_op(cs, FP_OP_MOV, flavor, Rd, Ra, NR, NR); + } + codestream_gen(cs, 0xc4); /* 3-byte VEX prefix */ + vex1 = (Rda & 8) ? 0x62 : 0xe2; + if (Ry & 8) { + /* first operand */ + vex1 ^= 0x20; + } + codestream_gen(cs, vex1); + vex2 = (is_dp ? 0xf8 : 0x78); + vex2 ^= ((Rx & 0xf) << 3); + if (SIMD_SIZE(flavor) == 32) { + vex2 |= 0x04; + } + vex2 |= 0x01; + opcode = inst[op]; + if (is_simd) { + opcode &= 0xFE; + } + codestream_gen3(cs, vex2, opcode, (0xc0 | ((Rda & 7)<<3) | (Ry & 7))); + } else if (cs->use_alternate) { + /* old 2-operand style: addss, addsd, addpd etc. */ + if (Rd != Rx) { + codestream_gen_op(cs, FP_OP_MOV, flavor, Rd, Rx, NR, NR); + } + /* Add REX prefix if necessary */ + unsigned char rex = 0x40; + unsigned char pfx; + if (!is_simd) { + pfx = (is_dp ? 0xf2 : 0xf3); + } else { + pfx = (is_dp ? 0x66 : 0x00); + } + if (pfx != 0x00) { + codestream_gen(cs, pfx); + } + if (Rd & 8) { + rex |= 0x04; /* REX.R */ + } + if (Ry & 8) { + rex |= 0x01; /* REX.B */ + } + if (rex != 0x40) { + codestream_gen(cs, rex); + } + codestream_gen3(cs, 0x0f, inst[op], (0xc0 | ((Rd & 7)<<3) | (Rx & 7))); + } else { + /* new 3-operand style: vaddss, vaddsd etc. */ + /* Floating-point negation is not primitive in x86 */ + /* Compilers do it by XORing with -0.0 */ + /* Another way would be subtracting from 0.0 */ + /* For now, we just generate the VXORPS/D, which won't calculate the + right result, but gets the right performance if we had preloaded + constant -0.0 into a register. In case there's a special optimization + for XOR of a register with itself, we force XOR with another register. */ + unsigned char vex; + int const is_vex3 = ((Ry & 8) != 0); + int const single_input = (op == FP_OP_SQRT); + if (op == FP_OP_NEG) { + Ry = Rx ^ 1; /* see comment about defeating XOR optimization */ + } + if (single_input) { + Ry = Rx; + Rx = 0xCC; /* not to be used */ + } + codestream_gen(cs, (is_vex3 ? 0xc4 : 0xc5)); /* VEX prefix length */ + /* 2nd byte of 2-byte VEX prefix */ + /* 0x80: inverted REX.R */ + vex = 0; + if (!(Rd & 8)) { + vex |= 0x80; /* VEX.R = ~REX.R */ + } + if (is_vex3) { + vex |= 0x01; /* leading 0F, same as 2-byte VEX */ + vex |= 0x40; /* VEX.X = ~REX.X = 0 */ + if ((Ry & 8) == 0) { + vex |= 0x20; /* VEX.B = 1 */ + } + codestream_gen(cs, vex); + vex = 0; + } + /* Last or only byte of VEX prefix */ + /* Set VEX.L */ + if (SIMD_SIZE(flavor) == 32) { + vex |= 0x04; /* 256-bit vectors */ + } + /* Set VEX.pp */ + if (!(is_simd || op == FP_OP_NEG)) { + vex |= (is_dp ? 0x03 : 0x02); /* Implied prefix: DP:F2 vs. SP:F3 */ + } else { + vex |= (is_dp ? 0x01 : 0x00); /* Implied prefix: DP:66 vs. SP:none */ + } + /* register specifier in 1s-complement form */ + if (!single_input) { + vex |= ((Rx & 15) ^ 0xf) << 3; + } else { + /* single-input */ + vex |= (0xf << 3); + } + codestream_gen3(cs, vex, inst[op], (0xc0 | ((Rd & 7)<<3) | (Ry & 7))); + } +#else +#error Unsupported architecture +#endif + if (op == FP_OP_MOV) { + /* A register move doesn't count as a floating-point operation */ + expect_inst(cs, COUNT_MOVE); + } else { + unsigned int n = simd_lanes; + if (op == FP_OP_FMA) { + /* FMA counts as two FP operations */ + n *= 2; + } + expect_inst(cs, COUNT_INST); + expect_ops(cs, (esize_bits == 64) ? COUNT_FLOP_DP : (esize_bits == 16) ? COUNT_FLOP_HALF : COUNT_FLOP_SP, n); + } + return 1; +} + + +int codestream_gen_nop(CS *cs) +{ +#if defined(ARCH_A64) + codestream_gen(cs, 0xd503201f); +#elif defined(__x86_64__) + codestream_gen(cs, 0x90); +#else +#error Unsupported architecture +#endif + expect_inst(cs, COUNT_INST); + return 1; +} + + +#ifdef __x86_64__ +/* Map logical (argument index) reg no. to actual reg no. */ +static unsigned char reg_map(ireg_t r) +{ + /* Argument registers are RDI, RSI, RDX, RCX, R8, R9 */ + /* To use R8, R9 we'd need to use a prefix e.g. 0x41 */ + static unsigned char const reg_map_a[] = { + 0x7, /* RDI */ + 0x6, /* RSI */ + 0x2, /* RDX */ + 0x1, /* RCX */ + /* EAX is 0 */ + /* EBX is 3 */ + /* EBP is 5 */ + }; + assert(r < sizeof reg_map_a); + return reg_map_a[r]; +} +#endif + + +/* + * Decrement a register by 1 and set the Z flag. + */ +int codestream_gen_decs(CS *cs, ireg_t Rd) +{ + unsigned char k = 1; /* The constant */ +#if defined(ARCH_A64) + codestream_gen(cs, (0x71000000 | (k << 10) | (Rd << 5) | (Rd))); +#elif defined(__x86_64__) + if (Rd < 4) { + codestream_gen3(cs, 0x83, (0xe8 | reg_map(Rd)), k); + } else { + codestream_gen4(cs, 0x41, 0x83, (0xe8 | (Rd-4)), k); + } +#else +#error Unsupported architecture +#endif + expect_inst(cs, COUNT_INST); + return 1; +} + + +int codestream_gen_iopk(CS *cs, unsigned int iop, ireg_t Rd, ireg_t Rn, int k) +{ +#if defined(ARCH_A64) + unsigned int opcode = 0xBAD; + if (iop == CS_IOP_ADD) { + opcode = 0x91000000; + } else if (iop == CS_IOP_SUB) { + opcode = 0xd1000000; + } else { + assert(0); + } + codestream_gen(cs, (opcode | (k << 10) | (Rn << 5) | (Rd))); +#elif defined(__x86_64__) + assert(0); +#else +#error Unsupported architecture +#endif + expect_inst(cs, COUNT_INST); + return 1; +} + + +/* + * Load a register with an immediate value. + */ +int codestream_gen_movi32(CS *cs, ireg_t Rd, uint32_t n) +{ +#if defined(ARCH_A64) + /* On AArch64, constants must be done 16 bits at a time */ + codestream_gen(cs, 0xd2800000 | ((n & 0xffff) << 5) | Rd); + if (n >= 0x10000) { + n >>= 16; + /* MOVK into bits 31:16 */ + codestream_gen(cs, 0xf2a00000 | ((n & 0xffff) << 5) | Rd); + } +#elif defined(__x86_64__) + codestream_gen(cs, 0xb8 | reg_map(Rd)); + codestream_gen32(cs, n); +#else +#error Unsupported architecture +#endif + expect_inst(cs, COUNT_INST); + return 1; +} + + +/* + * Check if an immediate fits in a given signed/unsigned bit width. + */ +static int __attribute__((unused)) fits_simm(long x, unsigned int n_bits) +{ + return x >= (-1U << (n_bits-1)) && x < (1U << (n_bits-1)); +} + +static int __attribute__((unused)) fits_uimm(long x, unsigned int n_bits) +{ + return x >= 0 && x < (1U << n_bits); +} + + +/* To share code between load and store, we add an internal-only flag. */ +#define _internal_STORE 0x80000000 + +/* + * Generate a single load instruction. + * Will return zero if the requested combination of index register and offset can't be done. + */ +int codestream_gen_load(CS *cs, ireg_t Rt, ireg_t Rn, ireg_t Radd, int offset, unsigned int flags) +{ + assert((Rt == NR) == ((flags & CS_LOAD_PREFETCH) != 0)); +#if defined(ARCH_A64) + /* flags[0] set to 1 for STRM */ + /* flags[2:1] set to 00 for L1, 01 for L2, 10 for L3 */ + /* flags[4:3] set to 00 for LD, 01 for LI, 10 for ST */ + unsigned int prefetch_flags = 0; /* LOAD KEEP L1 */ + unsigned int flavor_flags = (flags & _internal_STORE) ? 0x00000000 : 0x00400000; + if (flags & CS_LOAD_NONTEMPORAL) { + prefetch_flags |= 0x01; + } + if (flags & _internal_STORE) { + prefetch_flags |= 0x10; + } + if ((flags & CS_LOAD_NONTEMPORAL) && !(flags & CS_LOAD_PREFETCH) && offset != 0) { + codestream_error(cs, "load offset invalid with non-temporal demand-load"); + return 0; + } + if ((flags & CS_LOAD_ATOMIC) && (offset != 0)) { + codestream_error(cs, "load offset invalid with atomic load"); + return 0; + } + if ((flags & CS_LOAD_ATOMIC) && (flags & CS_LOAD_NONTEMPORAL)) { + codestream_error(cs, "unsupported combination of atomic and non-temporal"); + return 0; + } + if ((flags & CS_LOAD_ACQUIRE) && (Radd != NR || offset != 0)) { + codestream_error(cs, "offset or index invalid with load-acquire/store-release"); + return 0; + } + if (Radd == NR) { + unsigned int opcode = 0x00000000; + if ((offset & 7) != 0 || !fits_uimm(offset>>3, 12)) { + codestream_error(cs, "load offset %ld is invalid", (long)offset); + return 0; + } + if (flags & CS_LOAD_PREFETCH) { + /* Store and non-temporality in prefetch_flags */ + opcode = (0xf9800000 | (Rn << 5) | ((offset>>3) << 10) | prefetch_flags); /* PRFM Rt,[Rn,#offset] */ + } else if (flags & CS_LOAD_NONTEMPORAL) { + if (flags & _internal_STORE) { + codestream_error(cs, "can't do non-temporal single-word store"); + return 0; + } + opcode = (0xa8400000 | (31 << 10) | (Rn << 5) | ((offset>>3) << 15) | Rt); /* LDNP Rt,xzr,[Rn,#offset] */ + } else if (flags & CS_LOAD_PAIR) { + if (flags & CS_LOAD_ACQUIRE) { + codestream_error(cs, "can't do pair load-acquire"); + return 0; + } + opcode = (0xa8c00000 | (31 << 10) | (Rn << 5) | ((offset>>3) << 15) | Rt); /* LDP Rt,xzr,[Rn,#offset] */ + } else if (flags & CS_LOAD_ATOMIC) { + opcode = (0xf8202000 | (0x1f << 16) | (Rn << 5) | Rt); /* LDEOR xzr,Rt,[Rn] */ + if (flags & CS_LOAD_ACQUIRE) { + opcode |= 0x00800000; + } + } else if (flags & CS_LOAD_ACQUIRE) { + /* Also CS_STORE_RELEASE: store done in flavor_flags */ + opcode = (0xc89ffc00 | flavor_flags | (Rn << 5) | Rt); /* LDAR Rt,[Rn] */ + } else { + opcode = (0xf9000000 | flavor_flags | (Rn << 5) | ((offset>>3) << 10) | Rt); /* LDR Rt,[Rn,#offset] */ + } + codestream_gen(cs, opcode); + } else { + if (offset != 0) { + codestream_error(cs, "cannot combine register and immediate offset"); + return 0; + } + if (flags & CS_LOAD_PREFETCH) { + /* Store and non-temporality in prefetch_flags */ + codestream_gen(cs, (0xf8a0c800 | (Rn << 5) | (Radd << 16) | prefetch_flags)); /* PRFM Rt,[Rn,Radd,sxtw] */ + } else { + codestream_gen(cs, (0xf860c800 | flavor_flags | (Rn << 5) | (Radd << 16) | Rt)); /* LDR Rt,[Rn,Radd,sxtw] */ + } + } +#elif defined(__x86_64__) + /* Argument registers are RDI, RSI, RDX, RCX, R8, R9 */ + assert(Rt == NR || Rt < sizeof reg_map); + assert(Rn < sizeof reg_map); + if (offset != 0) { + codestream_error(cs, "x86 load immediate offset TBD"); + return 0; /* TBD */ + } + if (Radd == NR) { + if (flags & CS_LOAD_PREFETCH) { + codestream_gen3(cs, 0x0f, 0x18, (0x08 | (reg_map(Rn)))); + } else { + codestream_gen3(cs, 0x48, 0x8b, ((reg_map(Rt) << 3) | (reg_map(Rn) << 0))); /* e.g. (%rdi),%rdi */ + } + } else { + /* e.g. mov %rdi,(%rdi+%rsi*1) */ + if (flags & CS_LOAD_PREFETCH) { + codestream_gen4(cs, 0x0f, 0x18, 0x0c, ((reg_map(Rn) << 3) | (reg_map(Radd) << 0))); + } else { + codestream_gen4(cs, 0x48, 0x8b, ((reg_map(Rt) << 3) | 0x04), ((reg_map(Rn) << 3) | (reg_map(Radd) << 0))); + } + } +#else +#error Unsupported architecture +#endif + expect_inst(cs, ((flags & CS_LOAD_PREFETCH) ? COUNT_MEM_PREFETCH : (flags & _internal_STORE) ? COUNT_INST_WR : COUNT_INST_RD)); + expect_ops(cs, ((flags & _internal_STORE) ? COUNT_BYTES_WR : COUNT_BYTES_RD), sizeof(void *)); + return 1; +} + + +int codestream_gen_store(CS *cs, ireg_t Rt, ireg_t Rn, ireg_t Radd, int offset, unsigned int flags) +{ + return codestream_gen_load(cs, Rt, Rn, Radd, offset, flags|_internal_STORE); +} + + +int codestream_gen_fp_load(CS *cs, flavor_t flavor, freg_t Rt, ireg_t Rn, int offset, unsigned int flags) +{ + assert(!(flags & CS_LOAD_PREFETCH)); +#if defined(ARCH_A64) + unsigned int xflags = (flags & _internal_STORE) ? 0x00000000 : 0x00400000; + uint32_t opcode = 0xbd000000 | xflags | (offset << 10) | (Rn << 5) | (Rt << 0); + unsigned int const esize_bits = FLOAT_BITS(flavor); + if (esize_bits == 64) { + opcode |= 0x40000000; /* 0xbd...... -> 0xfd...... */ + } + assert(offset >= 0 && offset <= 64); + codestream_gen(cs, opcode); +#elif defined(__x86_64__) + fprintf(stderr, "x86: FP load/store not implemented\n"); + return 0; +#else +#error Unsupported architecture +#endif + expect_inst(cs, ((flags & _internal_STORE) ? COUNT_INST_WR : COUNT_INST_RD)); + expect_ops(cs, ((flags & _internal_STORE) ? COUNT_BYTES_WR : COUNT_BYTES_RD), esize_bits / 8); + return 1; +} + + +int codestream_gen_fp_store(CS *cs, flavor_t flavor, freg_t Rt, ireg_t Rn, int offset, unsigned int flags) +{ + return codestream_gen_fp_load(cs, flavor, Rt, Rn, offset, flags|_internal_STORE); +} + + +int codestream_gen_fence(CS *cs, unsigned int flags) +{ + assert((flags & (CS_FENCE_STORE|CS_FENCE_LOAD)) != 0); +#if defined(ARCH_A64) + unsigned int opcode = 0xd50338bf; /* DMB ISH */ + if (flags & CS_FENCE_LOAD) { + opcode |= 0x00000100; + } + if (flags & CS_FENCE_STORE) { + opcode |= 0x00000200; + } + if (flags & CS_FENCE_SYSTEM) { + opcode |= 0x00000400; /* change ISH to SY */ + } + if (flags & CS_FENCE_SYNC) { + opcode &= ~0x00000020; /* change DMB to DSB */ + } + codestream_gen(cs, opcode); +#elif defined(__x86_64__) + unsigned int const lsflags = flags & (CS_FENCE_STORE|CS_FENCE_LOAD); + /* TBD: not sure I understand x86 fences. Useful exposition at + https://hadibrais.wordpress.com/2018/05/14/the-significance-of-the-x86-lfence-instruction/ */ + if (lsflags == CS_FENCE_LOAD) { + codestream_gen3(cs, 0x0F, 0xAE, 0xE8); /* LFENCE */ + } else if (flags == CS_FENCE_STORE) { + codestream_gen3(cs, 0x0F, 0xAE, 0xF8); /* SFENCE */ + } else if (lsflags == (CS_FENCE_STORE|CS_FENCE_LOAD)) { + codestream_gen3(cs, 0x0F, 0xAE, 0xF0); /* MFENCE */ + } +#endif + expect_inst(cs, COUNT_FENCE); + return 1; +} + diff --git a/linux_app/pmu_app/pysweep/src/loadinst.h b/linux_app/pmu_app/pysweep/src/loadinst.h new file mode 100644 index 00000000..e367731d --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/loadinst.h @@ -0,0 +1,202 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Generate instructions in memory. + * + * This is a set of general-purpose routines suitable for JITting code. + */ + +#ifndef __included_loadinst_h +#define __included_loadinst_h + +#include "arch.h" + +#include +#include + + +typedef struct codestream CS; + + +/* Code stream management */ + +void codestream_show(CS const *); + +struct inst_counters; + +CS *codestream_init(struct inst_counters *m, void *base, size_t size, unsigned int line_size); + +void *codestream_addr(CS const *); + +void codestream_use_alternate(CS *); + +void codestream_set_multiplier(CS *, int); + +/* Push and pop a multiple, e.g. when looping by a fixed amount */ +int codestream_push_multiplier(CS *, int); +int codestream_pop_multiplier(CS *, int); + +int codestream_errors(CS const *); + +void codestream_free(CS *); + +/* + * Check there are enough consecutive bytes left in the current line + * for the instruction we're about to generate. If so, do nothing. + * If not, generate a branch to the next line if possible, otherwise + * report failure. + */ +int codestream_reserve(CS *, unsigned int bytes); + + +/* Instruction generators */ + +typedef unsigned int ireg_t; +/* Integer argument registers */ +#define IR0 0 +#define IR1 1 +#define IR2 2 +#define IR3 3 +#define IR4 4 +#define IR5 5 + +typedef unsigned int freg_t; +#define NR 0xFF /* no register - placeholder for instructions with less than max no. of regs */ + +/* + * We define various 'flavors' of FP/SIMD operation. + */ +typedef unsigned int flavor_t; +#define F16 0x01 +#define F32 0x02 +#define F64 0x03 +#define S64 0x08 +#define S128 0x10 /* 16 bytes */ +#define S256 0x20 /* 32 bytes */ +#define S512 0x40 /* 64 bytes */ +#define S1024 0x80 /* 128 bytes */ + +#define FLOAT_BITS(t) (8U << ((t) & 0x03)) +#define SIMD_SIZE(t) ((t) & 0xff8) +#define IS_SIMD(t) (((t) & 0xff8) != 0) + + +/* + * Move an immediate value into a register, or return 0 if not possible in one instruction. + */ +int codestream_gen_movi32(CS *, ireg_t Rd, uint32_t n); + +/* + * Decrement an integer register and set the Z flag. + */ +int codestream_gen_decs(CS *, ireg_t Rd); + +/* + * Integer operation + */ +#define CS_IOP_ADD 0 +#define CS_IOP_SUB 1 +int codestream_gen_iopk(CS *, unsigned int iop, ireg_t Rd, ireg_t Rn, int k); + +/* + * Floating-point (or vector) operation on floating-point/vector registers. + */ +int codestream_gen_op(CS *, unsigned int op, flavor_t flavor, freg_t Rd, freg_t Rx, freg_t Ry, freg_t Ra); + +/* + * Generate a load: + * Rt = *(Rn + Radd + offset). + * Radd may be NR. + */ +#define CS_LOAD_DEFAULT 0x00 +#define CS_LOAD_NONTEMPORAL 0x01 /* Use a non-temporal (streaming) load */ +#define CS_LOAD_PAIR 0x02 /* Use a load-pair instruction */ +#define CS_LOAD_PREFETCH 0x04 /* Generate a prefetch instead of a load (Rt==NR) */ +#define CS_LOAD_ACQUIRE 0x08 /* Use load-acquire if available */ +#define CS_LOAD_ATOMIC 0x10 /* Use a load-atomic */ +int codestream_gen_load(CS *, ireg_t Rt, ireg_t Rn, ireg_t Radd, int offset, unsigned int flags); + +int codestream_gen_fp_load(CS *, flavor_t flavor, freg_t Rt, ireg_t Rn, int offset, unsigned int flags); + + +/* + * Generate a store. This has similar constraints as load. + */ +#define CS_STORE_DEFAULT 0x00 +#define CS_STORE_NONTEMPORAL 0x01 +#define CS_STORE_RELEASE 0x08 +int codestream_gen_store(CS *, ireg_t Rt, ireg_t Rn, ireg_t Radd, int offset, unsigned int flags); + +int codestream_gen_fp_store(CS *, flavor_t flavor, freg_t Rt, ireg_t Rn, int offset, unsigned int flags); + +/* Generate an explicit barrier/fence instruction */ +#define CS_FENCE_LOAD 0x01 +#define CS_FENCE_STORE 0x02 +#define CS_FENCE_SYSTEM 0x04 /* Domain: on Arm, use SY instead of ISH */ +#define CS_FENCE_SYNC 0x08 /* Synchronize: on Arm, use DSB instead of DMB */ +int codestream_gen_fence(CS *, unsigned int flags); + +int codestream_gen_nop(CS *); + +int codestream_gen_call(CS *, void *dest); + +int codestream_gen_ret(CS *); + +int codestream_gen_ret_abi(CS *); + +/* + * Generate an instruction or part of an instruction directly. Specialist use only. + */ +void codestream_gen_direct(CS *, unsigned int x); + + +/* + * Condition encodings. Several abstract conditions might have the same encoding, + * but this is different for different ISAs. E.g. "unsigned less than" + * is the same as "carry set" for x86, but "carry clear" for ARM. + * + * N.b. tables in loadinst.c are indexed by this enum. Keep in sync. + */ +typedef enum { + CC_AL, + CC_EQ, + CC_NE, + CC_UGT, + CC_ULE, + CC_UGE, + CC_ULT, + CC_SGT, + CC_SLE, + CC_SGE, + CC_SLT, + CC_NEG, + CC_NNG, + CC_CS, + CC_CC, + CC_VS, + CC_VC, + CC_MAX +} cc_t; + +int codestream_gen_branch(CS *, void *dest, cc_t cc); + + + +#endif /* included */ + +/* end of loadinst.h */ diff --git a/linux_app/pmu_app/pysweep/src/prepcode.c b/linux_app/pmu_app/pysweep/src/prepcode.c new file mode 100644 index 00000000..880d0744 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/prepcode.c @@ -0,0 +1,160 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +/* +Given a block of machine code, generated elsewhere, prepare it for execution. + +Platform-specific functions are used for cache unification etc. +*/ + +#include "prepcode.h" + +#include "arch.h" + +#include +#include +#include /* for perror */ +#include + + +#ifdef ARCH_ARM +//#if defined(__ARMEL__) +//#include +extern void __clear_cache(char *beg, char *end); +//#endif + +int cacheflush(char *p, int s, int flag) +{ + __clear_cache(p, p+s); + return 0; +} +#define BCACHE 3 +#endif + +#define GDB_JIT +#ifdef GDB_JIT +typedef enum { + JIT_NOACTION = 0, + JIT_REGISTER_FN, + JIT_UNREGISTER_FN +} jit_actions_t; + +struct jit_code_entry { + struct jit_code_entry *next_entry; + struct jit_code_entry *prev_entry; + char const *symfile_addr; /* sic - not an 'unsigned char *' */ + unsigned long long symfile_size; +}; + +struct jit_descriptor { + unsigned int version; + unsigned int action_flag; + struct jit_code_entry *relevant_entry; + struct jit_code_entry *first_entry; +}; + +struct jit_descriptor __jit_debug_descriptor = {1,0,0,0}; + +void __attribute__((noinline)) __jit_debug_register_code() {} +#endif /* GDB_JIT */ + + +int prepare_code_protection(void const *p, size_t size) +{ + assert(((unsigned long)p & (sysconf(_SC_PAGESIZE)-1)) == 0); + assert((size & (sysconf(_SC_PAGESIZE)-1)) == 0); + if (0 > mprotect((void *)p, size, PROT_READ|PROT_EXEC)) { + perror("mprotect"); + fprintf(stderr, "prepcode: failed to mark %p size %#lx as executable\n", + p, (unsigned long)size); + return -1; + } + return 0; +} + + +int prepare_code_coherence(void const *p, size_t size) +{ +#ifdef ARCH_ARM + if (0 > cacheflush((char *)p, size, BCACHE)) { + perror("cacheflush"); + return -1; + } +#else + /* On other platforms, the D-cache and I-cache are coherent */ +#endif + return 0; +} + + +static struct jit_code_entry the_entry = {NULL, NULL, NULL, 0}; + + +int prepare_code_elf(void const *p, size_t size, unsigned int flags, void const *elf, size_t elf_size) +{ + int rc; + assert(p != NULL); + if (flags & PREPCODE_DEBUGGER) { +#ifdef GDB_JIT + /* TBD - we should support several descriptors active */ + the_entry.symfile_addr = (char *)elf; + the_entry.symfile_size = elf_size; + __jit_debug_descriptor.action_flag = JIT_REGISTER_FN; + __jit_debug_descriptor.relevant_entry = &the_entry; + __jit_debug_descriptor.first_entry = &the_entry; + __jit_debug_register_code(); + /* We need to call this again when we've finished with the code buffer */ +#endif /* GDB_JIT */ + } + if (flags & PREPCODE_PROTECT) { + rc = prepare_code_protection(p, size); + if (rc) { + return rc; + } + } + if ((flags & PREPCODE_COHERENCE) && !(flags & PREPCODE_PROTECT)) { + /* If we've done mprotect() above, we believe we don't have to do + a userspace cache-unification sequence as well. */ + rc = prepare_code_coherence(p, size); + if (rc) { + return rc; + } + } + return 0; +} + + +int prepare_code(void const *p, size_t size, unsigned int flags) +{ + return prepare_code_elf(p, size, flags, NULL, 0); +} + + +int unprepare_code(void const *p, size_t size, unsigned int flags) +{ + if (flags & PREPCODE_DEBUGGER) { +#ifdef GDB_JIT + /* TBD - we might have several descriptors active */ + __jit_debug_descriptor.action_flag = JIT_UNREGISTER_FN; + __jit_debug_register_code(); +#endif /* GDB_JIT */ + } + return 0; +} + + +/* end of prepcode.c */ + diff --git a/linux_app/pmu_app/pysweep/src/prepcode.h b/linux_app/pmu_app/pysweep/src/prepcode.h new file mode 100644 index 00000000..83aecd5f --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/prepcode.h @@ -0,0 +1,47 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +/* + * Prepare code block for execution + * + * This might involve changing memory protection, synchronizing cache etc. + */ + +#ifndef __included_prepcode_h +#define __included_prepcode_h + +#include + +/* + * Do all necessary prep for executing a block of data as code. + */ +#define PREPCODE_PROTECT 1 +#define PREPCODE_COHERENCE 2 +#define PREPCODE_DEBUGGER 4 /* Notify debugger about new code */ +#define PREPCODE_ALL 0xff +int prepare_code(void const *, size_t size, unsigned int flags); +int prepare_code_elf(void const *, size_t size, unsigned int flags, void const *elf, size_t elf_size); + +int unprepare_code(void const *, size_t size, unsigned int flags); + +/* Just change protection (if needed) */ +int prepare_code_protection(void const *, size_t size); + +/* Just ensure coherence (if needed) */ +int prepare_code_coherence(void const *, size_t size); + +#endif /* included */ + diff --git a/linux_app/pmu_app/pysweep/src/pysweep.c b/linux_app/pmu_app/pysweep/src/pysweep.c new file mode 100644 index 00000000..cc857ff7 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/pysweep.c @@ -0,0 +1,1341 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * Python module to generate artificial loads. + */ + +/* + * The main object created by this module is an object of type Load. + * + * load = pyperf.create(spec) + * load.start() + * load.update(new_spec) + * load.stop() + * + * Internally, some worker threads are created, which all run the workload. + * (If you want to have threads running different workloads, then just create + * multiple Load objects.) + * + * As seen above, the characteristics of a workload can be dynamically updated + * while the workload is running. How this is achieved is described in a + * comment below. + */ + + +#ifndef MODULE_NAME +#define MODULE_NAME pysweep +#endif /* !MODULE_NAME */ + +#include +#if PY_MAJOR_VERSION < 3 +#define PyBytes_FromStringAndSize PyString_FromStringAndSize +#else +#define PyString_FromFormat PyUnicode_FromFormat +#define PyInt_FromLong PyLong_FromLong +#define PyInt_AsLong PyLong_AsLong +#define PyInt_Check PyLong_Check +#define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask +#endif + + +#include "loadgen.h" +#include "loadgenp.h" /* for diagnostics and benchmarking */ +#include "prepcode.h" +#include "sleep.h" +#include "branch_prediction.h" +#include "arch.h" + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif /* _GNU_SOURCE */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define MODULE_NAME_STRING3(m) #m +#define MODULE_NAME_STRING2(m) MODULE_NAME_STRING3(m) +#define MODULE_NAME_STRING MODULE_NAME_STRING2(MODULE_NAME) + +extern int workload_verbose; + + +/* +Dynamically updating workloads. + +Internally, workloads use the workload object managed by "loadgen.h". +A workload consists of a code sequence which can be executed repeatedly. +After each repetition we might take some other action. + +We want to be able to dynamically change the characteristics of a workload +while it's running - not just changing scheduling/pinning of the worker threads, +but changing the code they are executing. We want to free up any resources +used by the old workload, but not while it's still running. + +We could do this in different ways: + + - keep the worker threads running, but have them switch to a new load object + if available at the end of an iteration. Ensure that an old load object + is cleaned up when no longer needed. + + - cancel the worker threads (pthread_cancel). Create new threads. + Disadvantage: any external monitoring, such as perf events, that is tied + to the worker threads, would have to be set up for the new threads. +*/ + + +typedef struct load_thread load_thread_t; +typedef struct load_thread_local load_thread_local_t; + + +/* + * pysweep.Load: a Python object representing a workload that we can + * dynamically vary and which has one or more workload execution + * threads associated with it. + */ +typedef struct { + PyObject_HEAD + unsigned int n_threads; /* Number of threads requested */ + /* The workload itself - executable code and its characteristics. + This is a central copy of the pointer. The threads each have + their own pointer to the workload, which they will monitor + for changes. */ + Workload *work; /* Workload as created by loadgen.c */ + load_thread_t *first_thread; /* List of execution threads */ + unsigned int suspend_reasons; /* Supension reason(s) */ +#define SUSPEND_REQUEST 0x01 /* Suspended because requested to be suspended */ +#define SUSPEND_ZEROAFF 0x02 /* Suspended because pinned to the empty set of threads */ +#define SUSPEND_BADWORK 0x04 /* Suspended because couldn't create workload */ + pthread_attr_t thread_attr; /* Default thread attributes (including affinity) */ +} LoadObject; + + +/* + * Description for a workload executor thread. + * Always on the thread list of its owning LoadObject. + * The expectation is that this is mostly unchanging and can live + * as a shared copy in the worker's and master's caches. + */ +struct load_thread { + PyObject_HEAD + struct load_thread *next_thread; + LoadObject *load; /* Point back to the load */ + pthread_t pthread_id; /* The pthread thread id, not the OS thread id */ + pid_t os_tid; /* OS tid, as used for e.g. perf_event_open */ + sem_t sem_started; /* Thread has started and OS tid is available */ + sem_t sem_worktodo; /* Contoller signals thread that there is work to do */ + load_thread_local_t volatile *loc; /* Local, rapidly changing data */ +}; + +typedef load_thread_t ThreadObject; +static PyTypeObject ThreadType; + + +/* + * Local data for a thread. The intention is that this has + * rapidly changing data and will live as an exclusive copy in the + * worker's cache. + */ +struct load_thread_local { + struct load_thread *thread; /* Point back to the thread */ + Workload *volatile vol_work; /* Copy of the workload - NULL if nothing to run */ + unsigned int volatile n_iters;/* Number of times through this workload */ +}; + + +/* + * Some distributions provide a gettid(), others don't. + */ +static pid_t _private_gettid(void) +{ + return (pid_t)syscall(SYS_gettid); +} + +#undef gettid +#define gettid() _private_gettid() + + +static PyObject *load_new(PyTypeObject *t, PyObject *args, PyObject *kwds) +{ + LoadObject *p = (LoadObject *)t->tp_alloc(t, 0); + assert(p != NULL); + p->n_threads = 1; + p->first_thread = NULL; + p->suspend_reasons = 0; + p->work = NULL; + pthread_attr_init(&p->thread_attr); + return (PyObject *)p; +} + + +/* +Given a Python dictionary object of characteristics, update a loadgen +characteristics structure. +Return -1 if unsuccessful. +*/ +static int update_field_long(unsigned long *field, PyObject *spec, char *name) +{ + PyObject *oval = PyDict_GetItemString(spec, name); + if (oval == Py_None) { + /* The value might be 'None'. Should we treat this as + the field not being present? (TBD) */ + /* ignore */ + } else if (oval) { + /* To avoid a DeprecationWarning, check for float and use a different converter */ + if (PyFloat_Check(oval)) { + double d = PyFloat_AsDouble(oval); + if (d < 0) { + PyErr_SetString(PyExc_ValueError, "parameter must be non-negative"); + return -1; + } + *field = (unsigned long)d; + } else { + *field = PyInt_AsLong(oval); + } + if (PyErr_Occurred()) { + return -1; + } + } else { + /* ignore if value not supplied - not an error */ + } + return 0; +} + + +static int update_field_int(unsigned int *field, PyObject *spec, char *name) +{ + unsigned long lfield = *field; + int rc = update_field_long(&lfield, spec, name); + *field = lfield; + return rc; +} + + +static int update_field_float(double *field, PyObject *spec, char *name) +{ + PyObject *oval = PyDict_GetItemString(spec, name); + if (oval) { + *field = PyFloat_AsDouble(oval); + if (PyErr_Occurred()) { + return -1; + } + } + return 0; +} + + +/* +Given a Python map containing workload attributes, +populate fields in a Character object. Fields that aren't +mentioned in the input map are not affected. +*/ +static int setup_char(PyObject *spec, Character *c) +{ + int rc; + /* The working set sizes are 64-bit */ + rc = update_field_long(&c->inst_working_set, spec, "inst"); + if (rc) return rc; + rc = update_field_long(&c->data_working_set, spec, "data"); + if (rc) return rc; + /* Remaining fields control aspects of the workload */ + rc = update_field_int(&c->workload_flags, spec, "flags"); + if (rc) return rc; + rc = update_field_int(&c->debug_flags, spec, "debug_flags"); + if (rc) return rc; + rc = update_field_long(&c->inst_target, spec, "inst_target"); + if (rc) return rc; + rc = update_field_int(&c->data_pointer_offset, spec, "data_pointer_offset"); + if (rc) return rc; + rc = update_field_int(&c->data_dispersion, spec, "data_dispersion"); + if (rc) return rc; + rc = update_field_int(&c->data_alignment, spec, "data_alignment"); + if (rc) return rc; + rc = update_field_int(&c->fp_intensity, spec, "fp_intensity"); + if (rc) return rc; + rc = update_field_int(&c->fp_operation, spec, "fp_operation"); + if (rc) return rc; + rc = update_field_int(&c->fp_precision, spec, "fp_precision"); + if (rc) return rc; + rc = update_field_int(&c->fp_concurrency, spec, "fp_concurrency"); + if (rc) return rc; + rc = update_field_int(&c->fp_simd, spec, "fp_simd"); + if (rc) return rc; + rc = update_field_int(&c->fp_flags, spec, "fp_flags"); + if (rc) return rc; + rc = update_field_float(&c->fp_value, spec, "fp_value1"); + if (rc) return rc; + rc = update_field_float(&c->fp_value2, spec, "fp_value2"); + if (rc) return rc; + /* Force the instruction working set to a suitable minimum? */ +#define MINIMUM_INST_WORKING_SET 64 + if (c->inst_working_set < MINIMUM_INST_WORKING_SET) { + c->inst_working_set = MINIMUM_INST_WORKING_SET; + } + return 0; +} + + +/* +Instance initialization function. Called when a Load object is created: + + w = Load(...) + +Should return 0 on success and -1 on error (see Python issue 17380). +*/ +static int load_init(PyObject *x, PyObject *args, PyObject *kwds) +{ + LoadObject *p = (LoadObject *)x; + PyObject *spec = NULL; + static char *keys[] = { "spec", "threads", "verbose", NULL }; + int verbose = 0; + int n_threads = p->n_threads; /* load_new will have defaulted this to 1 */ + Character c; + /* The default workload characteristics have no data and no FP operations. + setup_char() will default the code working set to at least 1024 bytes. */ + workload_init(&c); + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|ii", keys, &spec, &n_threads, &verbose)) { + return -1; + } + assert(spec != NULL); + + if (setup_char(spec, &c) < 0) { + return -1; + } + + if (n_threads <= 0) { + return -1; + } + p->n_threads = n_threads; + + if (verbose) { + workload_verbose = verbose; + fprintf(stderr, "pysweep: setting verbosity level to %d\n", verbose); + } + assert(p->work == NULL); + p->work = workload_create(&c); + if (p->work == NULL) { + PyErr_SetString(PyExc_RuntimeError, "load could not be created"); + return -1; + } + if (workload_verbose) { + fprintf(stderr, "pysweep: %p: workload created\n", p->work); + } + assert(p->work != NULL); + if (0) { + /* Run the workload once on the current thread, as a check */ + /* This might trap with SIGILL if we've generated an invalid instruction */ + if (workload_verbose) { + fprintf(stderr, "pysweep: %p: run once...\n", p->work); + } + workload_run_once(p->work); + if (workload_verbose) { + fprintf(stderr, "pysweep: finished running workload once.\n"); + } + } + return 0; +} + + +#define BENCH_NO_TRIAL 0x8000 +#define BENCH_MMAP 0x4000 +#define BENCH_CODE 0x2000 + + +static PyObject *gfn_bench(PyObject *x, PyObject *args) +{ + int n_iters, flags; + PyObject *spec = NULL; + Character c; + int i; + if (!PyArg_ParseTuple(args, "Oii", &spec, &n_iters, &flags)) { + return NULL; + } + workload_init(&c); + if (setup_char(spec, &c) < 0) { + return NULL; + } + flags |= c.debug_flags; + if (flags & BENCH_MMAP) { + /* Just mmap/munmap */ + unsigned long map_size = sysconf(_SC_PAGESIZE); + unsigned int prot = PROT_READ|PROT_WRITE; + if (flags & BENCH_CODE) { + prot |= PROT_EXEC; + } + if (workload_verbose) { + fprintf(stderr, "pysweep: benchmark mmap size %lu prot %#x\n", map_size, prot); + } + for (i = 0; i < n_iters; ++i) { + void *p = mmap(NULL, map_size, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + assert(p != MAP_FAILED); + munmap(p, map_size); + } + } else if (flags & BENCH_CODE) { + /* Just coherency */ + unsigned int code_size = c.inst_working_set; + unsigned long map_size = round_size(code_size, sysconf(_SC_PAGESIZE)); + void *p; + if (workload_verbose) { + fprintf(stderr, "pysweep: benchmark coherence size %u\n", code_size); + } + p = mmap(NULL, map_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + for (i = 0; i < n_iters; ++i) { + memset(p, (unsigned char)i, code_size); + prepare_code(p, code_size, (PREPCODE_ALL & ~PREPCODE_PROTECT)); + } + munmap(p, map_size); + } else for (i = 0; i < n_iters; ++i) { + Workload *w = workload_create(&c); + if (w == NULL) { + PyErr_SetString(PyExc_RuntimeError, "load could not be created"); + return NULL; + } + if (!(flags & BENCH_NO_TRIAL)) { + workload_run_once(w); + } + workload_free(w); + } + Py_RETURN_NONE; +} + + +static PyObject *gfn_debug(PyObject *x, PyObject *args) +{ + int flags; + if (!PyArg_ParseTuple(args, "i", &flags)) { + return NULL; + } + workload_verbose = flags; + fprintf(stderr, "pysweep: set diagnostic level to %u\n", workload_verbose); + Py_RETURN_NONE; +} + + +#ifdef ARCH_AARCH64 +static unsigned long long get_ctr(void) +{ + unsigned long ctr; + __asm__ __volatile__("mrs %0,ctr_el0":"=r"(ctr)::); + return ctr; +} + +static PyObject *gfn_ctr(PyObject *x) +{ + return PyInt_FromLong(get_ctr()); +} +#endif /* ARCH_AARCH64 */ + + +/* + * Sleep for a given amount of time, handling EINTR. + */ +static PyObject *gfn_sleep(PyObject *x, PyObject *args) +{ + int n_wait; + double t; + if (!PyArg_ParseTuple(args, "d", &t)) { + return NULL; + } + n_wait = microsleep(t); + return PyInt_FromLong(n_wait); +} + +/* + * Branch prediction code gen + */ +static PyObject *gfn_br_pred(PyObject *x, PyObject *args) +{ + int s; + int ret; + + if (!PyArg_ParseTuple(args, "i", &s)) { + return NULL; + } + ret = branch_load_gen(s); + return PyInt_FromLong(ret); +} + + +/* +Thread 'main' function for the worker threads. +*/ +static void *thread_start(void *ltv) +{ + load_thread_t *const lt = (load_thread_t *)ltv; + load_thread_local_t volatile *const loc = lt->loc; + LoadObject const *const lob = lt->load; + Workload *last_work = NULL; + void *work_data = NULL; + int otype; + /* The tid of this worker thread can be used to control it and also appears + in diagnostic messages. */ + lt->os_tid = gettid(); + /* Allow the thread to be cancelled immediately without waiting until it + encounters a system call. */ + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &otype); + /* We are good to go and can signal the parent to return to its caller. */ + sem_post(<->sem_started); + /* Wait for the controller thread to release us */ + sem_wait(<->sem_worktodo); + /* This loop runs continually, even while the workload is being updated. */ + for (;;) { + /* The workload code doesn't take long, so we iterate it several times + in order to get a suitable chunk of work, after which we can check + for new work. To avoid resonance with working set sizes etc., + pick a prime number. */ + const unsigned int N_ITERS = 1; /* or 3, 117 etc. */ + /* Each iteration, we load whatever the workload is, and then run it. + The workload might have changed since last time! */ + Workload *work = loc->vol_work; + if (__builtin_expect(work != last_work, 0) || work == NULL) { + /* Workload has been changed! */ + if (last_work != NULL) { + if (workload_verbose) { + fprintf(stderr, "pysweep: [W %u] workload changed from %p to %p!\n", (unsigned int)lt->os_tid, last_work, work); + } + workload_remove_reference(last_work); + } + /* If we try to update the workload to a new specification + and fail, workload_create() will be null. There's no + point asking the executor threads to keep executing + so we hope the caller will have suspended us. */ + while (work == NULL) { + /* Wait for master to give us some work again */ + if (workload_verbose) { + fprintf(stderr, "pysweep: [W %u] waiting for work...\n", (unsigned int)lt->os_tid); + } + sem_wait(<->sem_worktodo); + if (workload_verbose) { + fprintf(stderr, "pysweep: [W %u] resumed (suspend=%#x)\n", (unsigned int)lt->os_tid, lob->suspend_reasons); + } + work = loc->vol_work; + } + work_data = work->entry_args[0]; /* Reset - including first time round */ + if (workload_verbose) { + /* Report that the workload for the worker threads changed. */ + fprintf(stderr, "pysweep: [W %u] workload updated to code=%p with argument data=%p\n", + (unsigned int)lt->os_tid, work, work_data); + } + last_work = work; + } + if (0 && workload_verbose) { + unsigned int const n_steps = N_ITERS * work->n_chain_steps; + printf(" run %p for %u iters, %u steps, touched %#x\n", + work_data, N_ITERS, n_steps, n_steps*64); + } + assert(work != NULL); + work_data = workload_run(work, work_data, N_ITERS); + /* Update iteration count for this thread */ + loc->n_iters += N_ITERS; + /* TBD: should we put a memory fence here to flush the store? */ + } + /* Don't expect to get here? */ + return NULL; +} + + +static PyObject *thread_new(PyTypeObject *ot, PyObject *args, PyObject *kwds) +{ + ThreadObject *t = (ThreadObject *)ot->tp_alloc(ot, 0); + return (PyObject *)t; +} + + +/* + * Update all threads' local copy of the workload. + * This might be called with NULL, to temporarily stop a thread + * working on anything. + */ +static void load_update_thread_work(LoadObject *p, Workload *w) +{ + load_thread_t *t; + for (t = p->first_thread; t != NULL; t = t->next_thread) { + int was_null = (t->loc->vol_work == NULL); + if (w != NULL) { + workload_add_reference(w); + } + t->loc->vol_work = w; + if (w != NULL && was_null) { + sem_post(&t->sem_worktodo); + } + } +} + + +/* + * Create the worker threads for the load, using pthread_create(). + */ +static PyObject *load_start(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + unsigned int i; + assert(p->n_threads > 0); + if (p->first_thread != NULL) { + /* Load is already started */ + PyErr_SetString(PyExc_RuntimeError, "load is already started"); + return NULL; + } + if (workload_verbose) { + fprintf(stderr, "pysweep: starting workload %p...\n", p->work); + } + for (i = 0; i < p->n_threads; ++i) { + int rc; + char name[32]; + //load_thread_t *lt = (load_thread_t *)malloc(sizeof(load_thread_t)); + load_thread_local_t *loc = NULL; + load_thread_t *lt = (ThreadObject *)PyObject_CallObject((PyObject *)&ThreadType, NULL); + if (posix_memalign((void **)&loc, 64, sizeof(load_thread_local_t)) != 0) { + PyErr_SetString(PyExc_RuntimeError, "could not allocate aligned memory"); + return NULL; + } + lt->loc = loc; + loc->thread = lt; + lt->load = p; + sem_init(<->sem_started, 0, 0); + sem_init(<->sem_worktodo, 0, 0); + lt->os_tid = 0; /* don't know it yet, will be found in-thread */ + loc->vol_work = NULL; + loc->n_iters = 0; + lt->next_thread = p->first_thread; + p->first_thread = lt; + rc = pthread_create(<->pthread_id, &p->thread_attr, &thread_start, lt); + if (rc < 0) { + perror("pthread_create"); + break; + } + sprintf(name, "sweep-%u", i); + rc = pthread_setname_np(lt->pthread_id, name); + if (rc != 0) { + perror("pthread_setname_np"); + /* Failure to set thread name isn't fatal */ + } + if (workload_verbose) { + fprintf(stderr, "pysweep: [* %u] created thread \"%s\"\n", + (unsigned int)gettid(), name); + } + } + /* At this point we should wait for all the threads to start and + progress to the point where we know their thread identifiers. */ + { + load_thread_t *lt; + for (lt = p->first_thread; lt != NULL; lt = lt->next_thread) { + sem_wait(<->sem_started); + /* The thread should have started and recorded its tid. */ + assert(lt->os_tid > 0); + if (workload_verbose) { + fprintf(stderr, "pysweep: [* %u] has noted start of worker thread [W %u]\n", + (unsigned int)gettid(), (unsigned int)lt->os_tid); + } + } + } + /* All the threads have recorded their identifiers. We can now return + to the caller and they can call the tids() method to get the tids. */ + /* First we release the threads, by setting the workload. */ + (void)sched_yield(); + load_update_thread_work(p, p->work); + assert(p->first_thread != NULL); + if (workload_verbose) { + fprintf(stderr, "pysweep: workload threads started\n"); + } + Py_RETURN_NONE; +} + + +static char const *signame(int sig) +{ + switch (sig) { + case SIGSTOP: + return "SIGSTOP"; + case SIGCONT: + return "SIGCONT"; + case SIGKILL: + return "SIGKILL"; + default: + return "?"; + } +} + + +/* + * Send a signal to all threads in the workload. + */ +static PyObject *load_signal_internal(PyObject *x, int sig) +{ + LoadObject *p = (LoadObject *)x; + load_thread_t *t; + for (t = p->first_thread; t != NULL; t = t->next_thread) { + if (workload_verbose) { + fprintf(stderr, "pysweep: [* %u] sending %s to thread [W %u]\n", + (unsigned int)gettid(), + signame(sig), + (unsigned int)t->os_tid); + } + pthread_kill(t->pthread_id, sig); + } + Py_RETURN_NONE; +} + + +static PyObject *load_signal(PyObject *x, PyObject *arg) +{ + return load_signal_internal(x, PyInt_AsLong(arg)); +} + + +/* + * We've got a reason to suspend the workers. If we hadn't already + * suspended them for any other reason, suspend them now. + */ +static PyObject *load_suspend_internal(LoadObject *p, unsigned int reason) +{ + int was_suspended = (p->suspend_reasons != 0); + p->suspend_reasons |= reason; + if (!was_suspended) { + if (workload_verbose) { + fprintf(stderr, "pysweep: [* %u] suspending workers because %#x\n", + (unsigned int)gettid(), + reason); + } + /* Remove the threads' workload */ + load_update_thread_work(p, NULL); + Py_RETURN_NONE; + } else { + /* Workload was already suspended - but this is another reason + to suspend, which we musn't forget about. */ + if (workload_verbose) { + fprintf(stderr, "pysweep: [* %u] re-suspending workers because %#x: now %#x\n", + (unsigned int)gettid(), + reason, + p->suspend_reasons); + } + Py_RETURN_NONE; + } +} + + +/* + * We've removed a reason to suspend the workers. If there's no + * longer any reason to suspend the workers, resume them. + */ +static PyObject *load_release_internal(LoadObject *p, unsigned int reason) +{ + if ((p->suspend_reasons & reason) != 0) { + /* Was previously suspended because of request for zero affinity - + but should not be suspended (for that reason) any more. */ + p->suspend_reasons &= ~reason; + if (!p->suspend_reasons) { + load_update_thread_work(p, p->work); + } + } + Py_RETURN_NONE; +} + + +/* + * Update the characteristics of an active workload object. + * This will generally involve creating a new workload, + * and deleting the old workload. + * Active threads may be running the old workload, + * so its destruction may be deferred. + */ +static PyObject *load_update(PyObject *x, PyObject *args) +{ + Workload *w, *w_old; + Character c; + LoadObject *p = (LoadObject *)x; + PyObject *spec; + if (!PyArg_ParseTuple(args, "O", &spec)) { + return NULL; + } + if (workload_verbose) { + fprintf(stderr, "pysweep: creating new workload for spec update\n"); + } + workload_init(&c); + if (setup_char(spec, &c)) { + return NULL; + } + /* Try to create a new workload with these characteristics. */ + w = workload_create(&c); + /* Update the workload. At some point the worker threads will pick up this + new workload and start running it. It's possible that we failed + to create the workload and that w is NULL. */ + w_old = p->work; + p->work = w; + if (w_old != NULL && w == NULL) { + /* Now have no workload, so suspend the executors. */ + load_suspend_internal(p, SUSPEND_BADWORK); + /* TBD: perhaps we should wait until the threads have suspended */ + } else if (w_old == NULL && w != NULL) { + load_release_internal(p, SUSPEND_BADWORK); + } else if (!p->suspend_reasons) { + load_update_thread_work(p, w); + } + if (workload_verbose) { + fprintf(stderr, "pysweep: destroying old workload %p\n", w_old); + } + workload_free(w_old); /* Will be deferred until no longer in use */ + if (workload_verbose) { + fprintf(stderr, "pysweep: workload updated\n"); + } + Py_RETURN_NONE; +} + + +/* +Stop (cancel and destroy) the object's threads. +If there are no threads this is a no-op. +This also means that any tids we have got for the load, or any events on +the load, become invalid. +*/ +static PyObject *load_stop(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + load_thread_t *t, *t_next; + void *retval; + if (workload_verbose) { + fprintf(stderr, "pysweep: stop workload\n"); + } + /* Send cancellation requests to all threads */ + for (t = p->first_thread; t != NULL; t = t->next_thread) { + int rc = pthread_cancel(t->pthread_id); + if (rc) { + perror("pthread_cancel"); + } + } + /* We should arrange to clean up thread resources once the thread has + been cancelled. We can do that two ways: + - use pthread_join waiting to see PTHREAD_CANCELED as exit status + - use pthread_cleanup_push to push a cleanup handler + */ + for (t = p->first_thread; t != NULL; t = t_next) { + int rc; + t_next = t->next_thread; + rc = pthread_join(t->pthread_id, &retval); + if (rc) { + perror("pthread_join"); + } + if (t->loc->vol_work) { + workload_remove_reference(t->loc->vol_work); + } + assert(retval == PTHREAD_CANCELED); + sem_destroy(&t->sem_started); + free((void *)t->loc); + Py_DECREF(t); + //free(t); + } + p->first_thread = NULL; + Py_RETURN_NONE; +} + + +/* + * Return the list of OS thread identifiers for the workload. + * This list is non-empty if the workload has been started. + */ +static PyObject *load_tids(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + load_thread_t *t; + PyObject *list; + /* If load is not started, it will return an empty list */ + list = PyList_New(0); + for (t = p->first_thread; t != NULL; t = t->next_thread) { + PyList_Append(list, PyInt_FromLong(t->os_tid)); + } + return list; +} + + +static PyObject *thread_tid(PyObject *x) +{ + ThreadObject *t = (ThreadObject *)x; + if (!t->os_tid) { + Py_RETURN_NONE; + } + return PyInt_FromLong(t->os_tid); +} + + +/* + * Provide our own definition so we can build with Python 2.6 + */ +static int MyPyLong_AsLongAndOverflow(PyObject *x, int *overflow) +{ + int n = PyLong_AsLong(x); + if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_OverflowError)) { + *overflow = 1; + PyErr_Clear(); + } else { + *overflow = 0; + } + return n; +} + + +static int affinity_object_to_set(PyObject *x, cpu_set_t *cpus) +{ + CPU_ZERO(cpus); + if (PyInt_Check(x)) { + unsigned long long cpumask = PyInt_AsUnsignedLongLongMask(x); + unsigned int i; + //printf("cpuset: int 0x%lx\n", cpumask); + for (i = 0; i < 64; ++i) { + if ((cpumask & (1ULL<= CPU_SETSIZE) { + PyErr_SetString(PyExc_ValueError, "CPU number out of range"); + return 0; + } + CPU_SET(i+pos, cpus); + } + } + x = PyNumber_Rshift(x, PyInt_FromLong(64)); + pos += 64; + done = (MyPyLong_AsLongAndOverflow(x, &overflow) == 0) && !overflow; + } while (!done); + } else if (PyList_Check(x)) { + unsigned int const size = PyList_Size(x); + unsigned int i; + CPU_ZERO(cpus); + for (i = 0; i < size; ++i) { + unsigned int n = PyInt_AsLong(PyList_GET_ITEM(x, i)); + if (n >= CPU_SETSIZE) { + PyErr_SetString(PyExc_ValueError, "CPU number out of range"); + return 0; + } + CPU_SET(n, cpus); + } + } else { + PyErr_SetString(PyExc_TypeError, "Expected list or mask"); + return 0; + } + //printf("cpuset done: %u cpus\n", CPU_COUNT(cpus)); + return 1; +} + +static PyObject *cpu_set_to_list(cpu_set_t const *cpus) +{ + unsigned int i; + PyObject *r = PyList_New(0); + for (i = 0; i < CPU_SETSIZE; ++i) { + if (CPU_ISSET(i, cpus)) { + PyList_Append(r, PyInt_FromLong(i)); + } + } + return r; +} + + +/* + * Report total iterations across all threads + */ +static PyObject *load_iterations(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + unsigned long long n_iters = 0; + load_thread_t *t; + for (t = p->first_thread; t != NULL; t = t->next_thread) { + n_iters += t->loc->n_iters; + } + return PyInt_FromLong(n_iters); +} + + +static PyObject *load_thread_iterations(PyObject *x, PyObject *args) +{ + LoadObject *p = (LoadObject *)x; + unsigned int tid; + load_thread_t *t; + if (!PyArg_ParseTuple(args, "I", &tid)) { + return NULL; + } + for (t = p->first_thread; t != NULL; t = t->next_thread) { + if (t->os_tid == (pid_t)tid) { + return PyInt_FromLong(t->loc->n_iters); + } + } + /* Either None or an exception will hopefully fault the caller. */ + return NULL; +} + + +static PyObject *thread_iterations(PyObject *x) +{ + ThreadObject *t = (ThreadObject *)x; + return PyInt_FromLong(t->loc->n_iters); +} + + +/* + * Set CPU affinity for the current workload. Affinity is supplied as a bitmask. + * The threads of the workload are each free to use any of the given CPUs. + * The set may be zero in which case the workload is suspended. + * TBD: allow fine-grained pinning of individual threads. + */ +static PyObject *load_setaffinity(PyObject *x, PyObject *mask) +{ + load_thread_t *t; + LoadObject *p = (LoadObject *)x; + cpu_set_t affinity; + if (!affinity_object_to_set(mask, &affinity)) { + return NULL; + } + + /* Set the affinity in the thread attributes. If we haven't created + the threads yet, they will pick it up from here. */ + pthread_attr_setaffinity_np(&p->thread_attr, sizeof affinity, &affinity); + + /* Update running threads. We might not have started any threads yet. */ + + /* If the mask is zero, sched_setaffinity will fail. So instead, + suspend the thread. */ + if (CPU_COUNT(&affinity) == 0) { + return load_suspend_internal(p, SUSPEND_ZEROAFF); + } + + for (t = p->first_thread; t != NULL; t = t->next_thread) { + int rc = sched_setaffinity(t->os_tid, sizeof affinity, &affinity); + if (rc != 0) { + PyErr_SetString(PyExc_RuntimeError, "sched_setaffinity failed"); + return NULL; + } + } + + return load_release_internal(p, SUSPEND_ZEROAFF); +} + +static PyObject *load_getaffinity(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + cpu_set_t affinity; + pthread_attr_getaffinity_np(&p->thread_attr, sizeof affinity, &affinity); + return cpu_set_to_list(&affinity); +} + + +/* + * Set affinity for a single thread. + */ +static PyObject *thread_setaffinity(PyObject *x, PyObject *mask) +{ + int rc; + ThreadObject *t = (ThreadObject *)x; + cpu_set_t affinity; + if (!affinity_object_to_set(mask, &affinity)) { + return NULL; + } + rc = sched_setaffinity(t->os_tid, sizeof affinity, &affinity); + if (rc != 0) { + PyErr_SetString(PyExc_RuntimeError, "sched_setaffinity failed"); + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject *thread_getaffinity(PyObject *x) +{ + ThreadObject *t = (ThreadObject *)x; + cpu_set_t affinity; + int rc = sched_getaffinity(t->os_tid, sizeof affinity, &affinity); + if (rc) { + PyErr_SetString(PyExc_RuntimeError, "sched_getaffinity failed"); + return NULL; + } + return cpu_set_to_list(&affinity); +} + + +/* +Set affinity for the current (monitoring) thread. +Input is an integer (up to 64 bits) representing a CPU mask. +TBD: handle larger integers. +*/ +static PyObject *gfn_setaffinity(PyObject *x, PyObject *mask) +{ + cpu_set_t cpus; + int rc; + if (!affinity_object_to_set(mask, &cpus)) { + return NULL; + } + rc = sched_setaffinity(0, sizeof cpus, &cpus); + if (rc != 0) { + PyErr_SetString(PyExc_RuntimeError, "sched_setaffinity failed"); + return NULL; + } + Py_RETURN_NONE; +} + + +static PyObject *gfn_sched_yield(PyObject *x) +{ + (void)sched_yield(); + Py_RETURN_NONE; +} + + +static PyObject *load_suspend(PyObject *x) +{ + if (workload_verbose) { + fprintf(stderr, "pysweep: suspending workload\n"); + } + load_suspend_internal((LoadObject *)x, SUSPEND_REQUEST); + Py_RETURN_NONE; +} + + +static PyObject *load_resume(PyObject *x) +{ + return load_release_internal((LoadObject *)x, SUSPEND_REQUEST); +} + + +static PyObject *load_suspense(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + return PyInt_FromLong(p->suspend_reasons); +} + + +static PyObject *load_expected(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + Workload *w = p->work; + struct inst_counters const *e = &w->expected; + + if (e->n[COUNT_INST] == 0) { + /* Either we haven't built the workload yet or something went wrong + when we generated the metrics? */ + Py_RETURN_NONE; + } + /* Build a data structure with the expected workload metrics */ + PyObject *data = PyDict_New(); + PyDict_SetItemString(data, "n_inst", PyInt_FromLong(e->n[COUNT_INST])); +#define SETITEM(x, K) \ + PyDict_SetItemString(data, #x, PyFloat_FromDouble((float)e->n[COUNT_##K] / e->n[COUNT_INST])) + SETITEM(branch, BRANCH); + SETITEM(mem_read, INST_RD); + SETITEM(bytes_read, BYTES_RD); + SETITEM(mem_write, INST_WR); + SETITEM(bytes_write, BYTES_WR); + SETITEM(flop_sp, FLOP_SP); + SETITEM(flop_dp, FLOP_DP); + SETITEM(fence, FENCE); + SETITEM(unit, UNIT); +#undef SETITEM + return data; +} + + +static PyObject *load_threads(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + ThreadObject *t; + PyObject *tmap = PyDict_New(); + for (t = p->first_thread; t != NULL; t = t->next_thread) { + PyDict_SetItem(tmap, PyInt_FromLong(t->os_tid), (PyObject *)t); + } + return tmap; +} + + +static PyObject *load_dump(PyObject *x, PyObject *args) +{ + LoadObject *p = (LoadObject *)x; + int rc; + char *fn; + Workload *w = p->work; + if (!PyArg_ParseTuple(args, "s", &fn)) { + PyErr_SetString(PyExc_TypeError, "expected file name"); + return 0; + } + if (!w) { + PyErr_SetString(PyExc_RuntimeError, "no workload to dump"); + return 0; + } + rc = workload_dump(w, fn, /*flags=*/0); + /* TBD: bad file name etc. ought to be a Python exception */ + return PyInt_FromLong(rc); +} + + +static void load_dealloc(PyObject *x) +{ + LoadObject *p = (LoadObject *)x; + if (workload_verbose) { + fprintf(stderr, "pysweep: dealloc\n"); + } + (void)load_stop(x); + /* Any worker threads have now been cancelled and joined, + so it's safe to free the workload. */ + workload_free(p->work); + pthread_attr_destroy(&p->thread_attr); + /* "finally (as its last action) call the type's tp_free function." */ + x->ob_type->tp_free(x); +} + + +static PyObject *thread_str(PyObject *x) +{ + ThreadObject *t = (ThreadObject *)x; + return PyString_FromFormat("[%u]", (unsigned int)t->os_tid); +} + + +static PyMethodDef Load_methods[] = { + {"start", (PyCFunction)&load_start, METH_VARARGS|METH_KEYWORDS, "None: start running a load"}, + {"update", (PyCFunction)&load_update, METH_VARARGS, "spec -> None: update load specification"}, + {"setaffinity", (PyCFunction)&load_setaffinity, METH_O, "list or mask -> None: set CPU affinity mask for workload"}, + {"getaffinity", (PyCFunction)&load_getaffinity, METH_NOARGS, "list: get CPU affinity"}, + {"stop", (PyCFunction)&load_stop, METH_NOARGS, "None: stop (cancel) load threads"}, + {"suspend", (PyCFunction)&load_suspend, METH_NOARGS, "None: suspend load threads"}, + {"resume", (PyCFunction)&load_resume, METH_NOARGS, "None: resume load threads"}, + {"signal", (PyCFunction)&load_signal, METH_O, "int: send signal to load threads"}, + {"suspense", (PyCFunction)&load_suspense, METH_NOARGS, "int: suspension status"}, + {"iterations", (PyCFunction)&load_iterations, METH_NOARGS, "int: total iterations so far"}, + {"thread_iterations", (PyCFunction)&load_thread_iterations, METH_VARARGS, "int -> int: iterations of a thread"}, + {"threads", (PyCFunction)&load_threads, METH_NOARGS, "{}: get set of threads"}, + {"tids", (PyCFunction)&load_tids, METH_NOARGS, "[tids]: get OS thread ids"}, + {"expected", (PyCFunction)&load_expected, METH_NOARGS, "{}: get expected instruction counts"}, + {"dump", (PyCFunction)&load_dump, METH_VARARGS, "str -> int: generate program image file"}, + {NULL} +}; + + +static PyTypeObject LoadType = { + PyVarObject_HEAD_INIT(NULL, 0) + tp_basicsize: sizeof(LoadObject), + tp_name: "pysweep.Load", + tp_doc: "system load", + tp_flags: Py_TPFLAGS_DEFAULT, + tp_methods: Load_methods, + //tp_members: Load_members, + tp_new: load_new, + tp_init: load_init, + tp_dealloc: load_dealloc +}; + + +static PyMethodDef Thread_methods[] = { + {"tid", (PyCFunction)&thread_tid, METH_NOARGS, "int: OS thread id"}, + {"setaffinity", (PyCFunction)&thread_setaffinity, METH_O, "list or mask -> None: set CPU affinity mask for thread"}, + {"getaffinity", (PyCFunction)&thread_getaffinity, METH_NOARGS, "list: get CPU affinity"}, + {"iterations", (PyCFunction)&thread_iterations, METH_NOARGS, "int: iterations so far"}, + {NULL} +}; + + +static PyTypeObject ThreadType = { + PyVarObject_HEAD_INIT(NULL, 0) + tp_basicsize: sizeof(ThreadObject), + tp_name: "pysweep.Thread", + tp_doc: "system load thread", + tp_flags: Py_TPFLAGS_DEFAULT, + tp_methods: Thread_methods, + tp_new: thread_new, + tp_str: thread_str +}; + + +/* Static functions of this module */ +static PyMethodDef funcs[] = { + {"setaffinity", (PyCFunction)&gfn_setaffinity, METH_O, "list or mask -> None: set CPU affinity mask for future workloads"}, + {"sleep", (PyCFunction)&gfn_sleep, METH_VARARGS, "float -> int: sleep; like time.sleep() but correctly handling interrupts"}, + {"sched_yield", (PyCFunction)&gfn_sched_yield, METH_NOARGS, "None: yield to scheduler"}, + {"bench", (PyCFunction)&gfn_bench, METH_VARARGS, "(spec, int, int) -> None: measure workload creation time"}, + {"debug", (PyCFunction)&gfn_debug, METH_VARARGS, "int -> None: set diagnostic options"}, + {"br_pred", (PyCFunction)&gfn_br_pred, METH_VARARGS, "int -> scaling factor: Run Branch Prediction workload"}, +#ifdef ARCH_AARCH64 + {"ctr", (PyCFunction)&gfn_ctr, METH_NOARGS, "-> int: get value of Cache Type Register"}, +#endif /* ARCH_AARCH64 */ + {NULL} +}; + +static struct { + char const *name; + unsigned int value; +} const constants[] = { + { "MEM_PREFETCH", WL_MEM_PREFETCH }, + { "MEM_NONTEMPORAL", WL_MEM_NONTEMPORAL }, + { "MEM_STREAM", WL_MEM_STREAM }, + { "MEM_HUGEPAGE", WL_MEM_HUGEPAGE }, + { "MEM_NO_HUGEPAGE", WL_MEM_NO_HUGEPAGE }, + { "MEM_FORCE_HUGEPAGE", WL_MEM_FORCE_HUGEPAGE }, + { "MEM_ACQUIRE", WL_MEM_ACQUIRE }, + { "MEM_BARRIER", WL_MEM_BARRIER }, + { "DEBUG_NO_CODE", WORKLOAD_DEBUG_DUMMY_CODE }, + { "DEBUG_NO_COHERENCE", WORKLOAD_DEBUG_NO_UNIFICATION }, + { "DEBUG_NO_MPROTECT", WORKLOAD_DEBUG_NO_MPROTECT }, + { "DEBUG_NO_WX", WORKLOAD_DEBUG_NO_WX }, + { "DEBUG_MMAP", BENCH_MMAP }, + { "DEBUG_CODE", BENCH_CODE }, + { "DEBUG_NO_TRIAL", BENCH_NO_TRIAL } +}; + +#if PY_MAJOR_VERSION < 3 +#define INIT_NAME2(m) init##m +#else +#define INIT_NAME2(m) PyInit_##m +#endif +#define INIT_NAME(m) INIT_NAME2(m) +PyMODINIT_FUNC INIT_NAME(MODULE_NAME)(void) +{ + unsigned int i; + PyObject *pmod; +#if PY_MAJOR_VERSION < 3 + pmod = Py_InitModule3(MODULE_NAME_STRING, funcs, "load generator"); +#else + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + .m_name = MODULE_NAME_STRING, + .m_doc = "load generator", + .m_size = -1, + .m_methods = funcs + }; + pmod = PyModule_Create(&moduledef); +#endif + PyType_Ready(&LoadType); + PyObject_SetAttrString(pmod, "Load", (PyObject *)&LoadType); + PyType_Ready(&ThreadType); + for (i = 0; i < (sizeof constants / sizeof constants[0]); ++i) { + PyModule_AddIntConstant(pmod, constants[i].name, constants[i].value); + } +#if PY_MAJOR_VERSION >= 3 + return pmod; +#endif +} + +/* end of pysweep.c */ diff --git a/linux_app/pmu_app/pysweep/src/sleep.c b/linux_app/pmu_app/pysweep/src/sleep.c new file mode 100644 index 00000000..53e09b71 --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/sleep.c @@ -0,0 +1,131 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +/* + * High-resolution sleep. The aim is to wait for the given duration, + * even if some kind of userspace-interrupt-driven profiling is active. + * + * We use a timed select() call. This may return early with EINTR, + * e.g. after a SIGPROF interrupt. We can calculate the remaining time + * and re-execute a select() for the remaining time. + * + * However, we do want to be able to break out of a long wait with a SIGINT. + * + * TBD: this is not thread-safe! + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif /* _GNU_SOURCE */ + +#include "sleep.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#define SECONDS 1000000000 +#define MAX_BLOCKING (1ULL*SECONDS) + + +static unsigned long long nowns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * 1000000000ULL) + ts.tv_nsec; +} + + +static int volatile sigint_received = 0; + + +static void sigint_handler(int sig) +{ + sigint_received = 1; +} + + +int microsleep_ns(long long sleep_nano) +{ + int n_iters = 0; + int rc; + unsigned long long const then = nowns() + sleep_nano; + int const handle_sigint = 1 && (sleep_nano >= MAX_BLOCKING); + struct sigaction oldact; + if (handle_sigint) { + int rc; + struct sigaction act; + memset(&act, 0, sizeof act); + act.sa_handler = sigint_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + act.sa_restorer = NULL; + sigint_received = 0; + rc = sigaction(SIGINT, &act, &oldact); + if (rc) { + perror("sigaction"); + } + } + while (sleep_nano > 0) { + struct timespec ts_wait; + ts_wait.tv_sec = (sleep_nano / 1000000000); + ts_wait.tv_nsec = (sleep_nano % 1000000000); + rc = pselect(0, NULL, NULL, NULL, &ts_wait, NULL); + if (rc == -1 && errno == EINTR) { + /* woken up by interrupt - perhaps SIGPROF or SIGINT? */ + /* Ideally, we should be able to find out what kind of interrupt + caused the EINTR, but I don't know how to do that. + sigpending() doesn't help. */ + unsigned long long now = nowns(); + if (now >= then) { + /* but rolled off the end anyway */ + rc = n_iters; + break; + } + if (sigint_received) { + break; + } + /* resume the wait, but with a shorter time */ + sleep_nano = then - now; + } else if (rc < 0) { + break; + } else { + rc = n_iters; + break; + } + ++n_iters; + } + if (handle_sigint) { + sigaction(SIGINT, &oldact, NULL); + if (sigint_received) { + raise(SIGINT); + return -1; + } + } + return rc; +} + + +int microsleep(double t) +{ + return microsleep_ns(t * 1e9); +} diff --git a/linux_app/pmu_app/pysweep/src/sleep.h b/linux_app/pmu_app/pysweep/src/sleep.h new file mode 100644 index 00000000..9ab03b7a --- /dev/null +++ b/linux_app/pmu_app/pysweep/src/sleep.h @@ -0,0 +1,39 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +#ifndef __included_sleep_h +#define __included_sleep_h + +/* + * Wait for a high-resolution amount of time, handling EINTR. + * The standard way is to use select() or pselect(). The underlying + * system call adjusts the time argument to show how much time remains, + * but this is hidden by the library. So to know how long we actually + * slept we have to read the current time, and iterate. + */ + +/* For glibc versions before 2.17, link with -lrt */ + +/* + * Result is a negative return code (with errno set) + * or a non-negative count of the number of times we had to iterate. + */ + +int microsleep_ns(long long); + +int microsleep(double); + +#endif diff --git a/linux_app/pmu_app/pysweep/tests/code_template.c b/linux_app/pmu_app/pysweep/tests/code_template.c new file mode 100644 index 00000000..2a8200ac --- /dev/null +++ b/linux_app/pmu_app/pysweep/tests/code_template.c @@ -0,0 +1,115 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +/* + * Templates for the kind of code we're going to be dynamically generating. + * We don't auto-generate the generator from this, it's just for convenience. + */ + +#include + +int *arg_to_return(int *p) { return p; } + +int *arg_load_to_return(int **p) { return *p; } + +int *arg_load_load_to_return(int ***p) { return **p; } + +extern int *giver(void); +extern void takerp(int *p); +extern void takerpp(int *p, int *q); + +void arg_load_to_arg(int **p) { takerp(*p); } +void arg_load_to_arg2(int **p) { takerpp(0,*p); } +void arg2_load_to_arg(int **p, int **q) { takerp(*q); } + +int *arg_load_indexed(int a, int **b, int c) { return *(int **)((unsigned char *)b + c); } +int *arg_load_indexed2(int a, int b, int **c) { return *(int **)((unsigned char *)c + b); } +void arg_load_indexed_to_arg(int a, int **b, int c) { takerpp(0,*(int **)((unsigned char *)b + c)); } + +void arg_store(int *p) { *p = 1; } + +void return_to_arg(void) { takerp(giver()); } + +extern void taker2(float, float); +extern void taker3(float, float, float); +void float_to_arg2(float x) { taker2(0.0, x); } + +int mul32(int x, int y) { return x * y; } +long long mul64(long long x, long long y) { return x * y; } +int div32(int x, int y) { return x / y; } +long long div64(long long x, long long y) { return x / y; } + +float add_float00(float x, float y) { return x + x; } +float add_float01(float x, float y) { return x + y; } +float add_float11(float x, float y) { return add_float00(x, y+y); } + +void sub_float01to2(float x, float y) { taker3(0.0, 0.0, x - y); } + +double neg_double(double x) { return -x; } +double add_double(double x, double y) { return x + y; } +double mul_double(double x, double y) { return x * y; } +double div_double(double x, double y) { return x / y; } +double sqrt_double(double x) { return __builtin_sqrt(x); } +double fma_double(double x, double y, double z) { return x + (y*z); } +#ifdef FP_FAST_FMA +float fma2_float(float x, float y, float z) { return fmaf(y,z,x); } +float fma2_float11(float x, float y, float z) { return fmaf(y,y,x); } +float fma2_float22(float x, float y, float z) { return fmaf(z,z,x); } +double fma2_double(double x, double y, double z) { return fma(y,z,x); } +#endif + +double load_double_r0(double *p) { return *p; } +double load_double_r1(double *p, double *q) { return *q; } +float load_float_r0(float *p) { return *p; } +void store_float_r0(float *p, float x) { *p = x; } +void store_float1_r0(float *p, float x, float y) { *p = y; } + +#if 1 +/* + * Try to generate a vector instruction by auto-vectorization. + */ +#define GENVEC(name, T, op) \ +void vec_##name(T *__restrict a, T const *__restrict b, T const *__restrict c) { \ + int i; for (i = 0; i < 4; ++i) { \ + T cb = b[i] op c[i]; T r = cb + cb; a[i] += r; } } + +GENVEC(fadd, float, +) +GENVEC(fmul, float, *) +GENVEC(dadd, double, +) +GENVEC(iadd, int, +) +GENVEC(ieor, int, ^) +GENVEC(imul, int, *) +GENVEC(ladd, long long, +) +#endif + +void countdown(int n) { + do { + taker2(0.0, 0.0); + n--; + } while (n >= 0); +} + +int small_integer(void) { return 12; } +int small_neg_integer(void) { return -12; } +int large_integer(void) { return 12983489; } + + +void pfetch(void *p) { __builtin_prefetch(p); } +void pfetch2(void *x, void *p) { __builtin_prefetch(p); } +void pfetcha(void *p, int n) { __builtin_prefetch((char *)p + n); } +void pfetcha2(void *p, int a, int n) { __builtin_prefetch((char *)p + n); } +void pfetcha3(void *x, void *p, int n) { __builtin_prefetch((char *)p + n); } + diff --git a/linux_app/sbsa-acs-app/include/sbsa_app.h b/linux_app/sbsa-acs-app/include/sbsa_app.h index e24132e5..bc59f0f5 100644 --- a/linux_app/sbsa-acs-app/include/sbsa_app.h +++ b/linux_app/sbsa-acs-app/include/sbsa_app.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,8 +20,8 @@ #define __SBSA_APP_LINUX_H__ -#define SBSA_APP_VERSION_MAJOR 6 -#define SBSA_APP_VERSION_MINOR 1 +#define SBSA_APP_VERSION_MAJOR 7 +#define SBSA_APP_VERSION_MINOR 1 #define SBSA_APP_VERSION_SUBMINOR 0 #include "sbsa_drv_intf.h" @@ -35,4 +35,7 @@ execute_tests_pcie(int num_pe, int level, unsigned int print_level); int execute_tests_exerciser(int num_pe, int level, unsigned int print_level); + +int +execute_tests_smmu(int num_pe, int level, unsigned int print_level); #endif diff --git a/linux_app/sbsa-acs-app/include/sbsa_drv_intf.h b/linux_app/sbsa-acs-app/include/sbsa_drv_intf.h index 1ad7171d..4eebb814 100644 --- a/linux_app/sbsa-acs-app/include/sbsa_drv_intf.h +++ b/linux_app/sbsa-acs-app/include/sbsa_drv_intf.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,6 +26,7 @@ #define SBSA_PCIE_EXECUTE_TEST 0x2000 #define SBSA_UPDATE_SKIP_LIST 0x3000 #define SBSA_EXERCISER_EXECUTE_TEST 0x4000 +#define SBSA_SMMU_EXECUTE_TEST 0x5000 #define SBSA_FREE_INFO_TABLES 0x9000 diff --git a/linux_app/sbsa-acs-app/sbsa_app_main.c b/linux_app/sbsa-acs-app/sbsa_app_main.c index a7519a0a..94f1676b 100644 --- a/linux_app/sbsa-acs-app/sbsa_app_main.c +++ b/linux_app/sbsa-acs-app/sbsa_app_main.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -117,7 +117,8 @@ main (int argc, char **argv) printf ("\n ************ SBSA Architecture Compliance Suite ********* \n"); - printf (" Version %d.%d.%d \n", SBSA_APP_VERSION_MAJOR, SBSA_APP_VERSION_MINOR, SBSA_APP_VERSION_SUBMINOR); + printf (" Version %d.%d.%d\n", SBSA_APP_VERSION_MAJOR, + SBSA_APP_VERSION_MINOR, SBSA_APP_VERSION_SUBMINOR); printf ("\n Starting tests for level %2d (Print level is %2d)\n\n", g_sbsa_level, g_print_level); @@ -129,14 +130,18 @@ main (int argc, char **argv) return 0; } + if (g_sbsa_level > 6) + { + printf("\n *** Starting SMMU tests *** \n"); + execute_tests_smmu(1, g_sbsa_level, g_print_level); + } + printf("\n *** Starting PCIe tests *** \n"); + execute_tests_pcie(1, g_sbsa_level, g_print_level); + if (run_exerciser) { printf("\n *** PCIe Exerciser tests only runs on UEFI *** \n"); //execute_tests_exerciser(1, g_sbsa_level, g_print_level); - } else { - printf("\n *** Starting PCIe tests *** \n"); - execute_tests_pcie(1, g_sbsa_level, g_print_level); } - printf("\n *** SBSA tests complete *** \n\n"); cleanup_test_environment(); diff --git a/linux_app/sbsa-acs-app/sbsa_app_smmu.c b/linux_app/sbsa-acs-app/sbsa_app_smmu.c new file mode 100644 index 00000000..4c97382b --- /dev/null +++ b/linux_app/sbsa-acs-app/sbsa_app_smmu.c @@ -0,0 +1,47 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + + +#include +#include +#include +#include +#include +#include + +#include "include/sbsa_app.h" +#include "include/sbsa_drv_intf.h" + + +extern int g_skip_test_num[3]; + +/** + This function calls the SBSA Kernel Module in a loop to execute all the SMMU tests +**/ +int +execute_tests_smmu(int num_pe, int level, unsigned int print_level) +{ + + int status; + + call_update_skip_list(SBSA_UPDATE_SKIP_LIST, g_skip_test_num); + call_drv_execute_test(SBSA_SMMU_EXECUTE_TEST, num_pe, level, print_level, 0); + status = call_drv_wait_for_completion(); + + return status; +} + diff --git a/platform/pal_uefi/include/pal_exerciser.h b/platform/pal_uefi/include/pal_exerciser.h index 3c53dc3b..cc94c20d 100644 --- a/platform/pal_uefi/include/pal_exerciser.h +++ b/platform/pal_uefi/include/pal_exerciser.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,6 +28,15 @@ #define BUS_MEM_EN_MASK 0x06 +#define PCIE_EXTRACT_BDF_SEG(bdf) ((bdf >> 24) & 0xFF) +#define PCIE_EXTRACT_BDF_BUS(bdf) ((bdf >> 16) & 0xFF) +#define PCIE_EXTRACT_BDF_DEV(bdf) ((bdf >> 8) & 0xFF) +#define PCIE_EXTRACT_BDF_FUNC(bdf) (bdf & 0xFF) + +#define PCIE_CREATE_BDF_PACKED(bdf) PCIE_EXTRACT_BDF_FUNC(bdf) | \ + (PCIE_EXTRACT_BDF_DEV(bdf) << 3) | \ + (PCIE_EXTRACT_BDF_BUS(bdf) << 8) + /* PCIe Config space Offset */ #define BAR0_OFFSET 0x10 #define COMMAND_REG_OFFSET 0x04 diff --git a/test_pool/Makefile b/test_pool/Makefile index a85eb76f..26d951c9 100644 --- a/test_pool/Makefile +++ b/test_pool/Makefile @@ -1,5 +1,5 @@ ## @file - # Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. + # Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,15 +25,9 @@ TEST_POOL = $(ACS_DIR)/ obj-m += sbsa_acs_test.o sbsa_acs_test-objs += $(TEST_POOL)/pcie/test_p001.o \ - $(TEST_POOL)/pcie/test_p002.o \ - $(TEST_POOL)/pcie/test_p005.o $(TEST_POOL)/pcie/test_p006.o \ - $(TEST_POOL)/pcie/test_p007.o $(TEST_POOL)/pcie/test_p008.o \ - $(TEST_POOL)/pcie/test_p009.o $(TEST_POOL)/pcie/test_p010.o \ - $(TEST_POOL)/pcie/test_p011.o $(TEST_POOL)/pcie/test_p012.o \ - $(TEST_POOL)/pcie/test_p013.o $(TEST_POOL)/pcie/test_p014.o \ - $(TEST_POOL)/pcie/test_p015.o $(TEST_POOL)/pcie/test_p016.o \ - $(TEST_POOL)/pcie/test_p017.o $(TEST_POOL)/pcie/test_p018.o \ - $(TEST_POOL)/pcie/test_p019.o \ + $(TEST_POOL)/pcie/test_p002.o $(TEST_POOL)/pcie/test_p005.o \ + $(TEST_POOL)/pcie/operating_system/test_p009.o \ + $(TEST_POOL)/smmu/operating_system/test_i016.o ccflags-y=-I$(PWD)/$(ACS_DIR)/.. -I$(PWD)/$(ACS_DIR)/val/ -I$(PWD)/$(ACS_DIR)/ -DTARGET_LINUX -Wall -Werror diff --git a/val/Makefile b/val/Makefile index c87a66a2..3dad6fa0 100644 --- a/val/Makefile +++ b/val/Makefile @@ -1,5 +1,5 @@ ## @file - # Copyright (c) 2016-2020, Arm Limited or its affiliates. All rights reserved. + # Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -30,7 +30,7 @@ sbsa_acs_val-objs += $(VAL_SRC)/avs_status.o $(VAL_SRC)/avs_memory.o \ $(VAL_SRC)/avs_iovirt.o \ $(ACS_DIR)/sys_arch_src/smmu_v3/smmu_v3.o -ccflags-y=-I$(PWD)/$(ACS_DIR)/include -I$(PWD)/$(ACS_DIR)/ -DTARGET_LINUX -DONLY_SBSA_RULE_TESTS -Wall -Werror +ccflags-y=-I$(PWD)/$(ACS_DIR)/include -I$(PWD)/$(ACS_DIR)/ -DTARGET_LINUX -Wall -Werror all: ifeq ($(KERNEL_SRC),) From 6b135359687dc7a8c019ea15a7adfe6518e25594 Mon Sep 17 00:00:00 2001 From: Sujana M Date: Fri, 13 Jan 2023 10:19:08 +0530 Subject: [PATCH 5/8] SBSA ACS 7.1: Exerciser tests - Added exerciser tests to check AER functionality - Updated Exerciser porting guide Signed-off-by: Sujana M --- docs/Exerciser_porting_guide.md | 47 +- platform/pal_uefi/include/pal_exerciser.h | 66 ++- platform/pal_uefi/src/pal_exerciser.c | 83 +++- .../exerciser/operating_system/test_e017.c | 206 ++++++++ .../exerciser/operating_system/test_e018.c | 438 ++++++++++++++++++ .../exerciser/operating_system/test_e019.c | 362 +++++++++++++++ .../exerciser/operating_system/test_e020.c | 254 ++++++++++ uefi_app/SbsaAvs.inf | 4 + uefi_app/SbsaAvsNist.inf | 4 + val/include/sbsa_avs_exerciser.h | 63 ++- val/src/avs_exerciser.c | 174 +++++-- 11 files changed, 1647 insertions(+), 54 deletions(-) create mode 100644 test_pool/exerciser/operating_system/test_e017.c create mode 100644 test_pool/exerciser/operating_system/test_e018.c create mode 100644 test_pool/exerciser/operating_system/test_e019.c create mode 100644 test_pool/exerciser/operating_system/test_e020.c diff --git a/docs/Exerciser_porting_guide.md b/docs/Exerciser_porting_guide.md index 27eb372a..25f54798 100644 --- a/docs/Exerciser_porting_guide.md +++ b/docs/Exerciser_porting_guide.md @@ -145,6 +145,51 @@ Value1 - Requested transaction data
Value2 - Null
Bdf - BDF of the exerciser

+ +### Error Injection +Error injection capability enables user to inject error in a PCIe endpoint.
+- The user can inject an error at that endpoint with the error configured using the error_code field. The error_codes are defined in Error Codes section. This bit is cleared once the error has been injected. +**pal_exerciser_get_param(Type, Value1, Value2, Bdf)**
+Type - ERRR_INJECT_TYPE
+Value1 - Type of error to inject(Refer error code section)
+Value2 - Null
+Bdf - BDF of the exerciser
+**pal_exerciser_ops(Ops, Param, Bdf)**
+Ops - INJECT_ERROR
+Param - Type of error to inject(Refer error code section)
+Bdf - BDF of the exerciser
+
+ +## Error Codes + |Error Name |Error Code| + |------------------------------------------|----------| + |Correctable Receiver Error |0x00 | + |Correctable Bad TLP |0x01 | + |Correctable Bad DLLP |0x02 | + |Correctable Replay Num Rollover |0x03 | + |Correctable Replay Timer Timeout |0x04 | + |Correctable Advisory Non-Fatal Error |0x05 | + |Correctable Internal Error |0x06 | + |Correctable Header Log OverFlow |0x07 | + |Uncorrectable Data Link Error |0x08 | + |Uncorrectable Surprise Down Error |0x09 | + |Uncorrectable Poisoned TLP Received |0x0A | + |Uncorrectable Flow Control Error |0x0B | + |Uncorrectable Completion Timeout |0x0C | + |Uncorrectable Completer Abort |0x0D | + |Uncorrectable Unexpected Completion |0x0E | + |Uncorrectable Receiver Overflow |0x0F | + |Uncorrectable Malformed TLP |0x10 | + |Uncorrectable ECRC Error |0x11 | + |Uncorrectable Unsupported Request |0x12 | + |Uncorrectable ACS Violation |0x13 | + |Uncorrectable Internal Error |0x14 | + |Uncorrectable MultiCast Blocked TLP |0x15 | + |Uncorrectable Atomic Op Egress Blocked |0x16 | + |Uncorrectable TLP Prefix Blocked Egress |0x17 | + |Uncorrectable Poisoned TLP Egress Blocked |0x18 | + |Invalid configuration |0x19 | +

## License @@ -152,5 +197,5 @@ Arm SBSA ACS is distributed under Apache v2.0 License. -------------- -*Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.* +*Copyright (c) 2022-2023, Arm Limited and Contributors. All rights reserved.* diff --git a/platform/pal_uefi/include/pal_exerciser.h b/platform/pal_uefi/include/pal_exerciser.h index cc94c20d..9f480ed2 100644 --- a/platform/pal_uefi/include/pal_exerciser.h +++ b/platform/pal_uefi/include/pal_exerciser.h @@ -46,22 +46,27 @@ #define PCIE_CAP_CTRL_OFFSET 0x4// offset from the extended capability header /* Exerciser MMIO Offsets */ -#define INTXCTL 0x004 -#define MSICTL 0x000 -#define DMACTL1 0x08 -#define DMA_BUS_ADDR 0x010 -#define DMA_LEN 0x018 -#define DMASTATUS 0x01C -#define PASID_VAL 0x020 -#define ATSCTL 0x024 -#define ATS_ADDR 0x028 +#define INTXCTL 0x004 +#define MSICTL 0x000 +#define DMACTL1 0x08 +#define DMA_BUS_ADDR 0x010 +#define DMA_LEN 0x018 +#define DMASTATUS 0x01C +#define PASID_VAL 0x020 +#define ATSCTL 0x024 +#define ATS_ADDR 0x028 +#define TXN_TRACE 0x40 +#define TXN_CTRL_BASE 0x44 #define PCI_MAX_BUS 255 #define PCI_MAX_DEVICE 31 +#define DVSEC_CTRL 0x8 #define PCI_EXT_CAP_ID 0x10 #define PASID 0x1B #define PCIE 0x1 #define PCI 0x0 +#define DVSEC 0x0023 +#define AER 0x0001 /* PCI/PCIe express extended capability structure's next capability pointer mask and cap ID mask */ @@ -87,6 +92,9 @@ #define SHITT_8BIT 8 #define MASK_BIT 1 #define PREFETCHABLE_BIT_SHIFT 3 +#define ERR_CODE_SHIFT 20 +#define FATAL_SHIFT 31 +#define ERROR_INJECT_BIT 17 #define PCI_CAP_PTR_OFFSET 8 #define PCIE_CAP_PTR_OFFSET 20 @@ -105,6 +113,9 @@ #define RID_NOT_VALID 0 #define ATS_TRIGGER 1 #define ATS_STATUS (1ul << 7) +#define TXN_INVALID 0xFFFFFFFF +#define TXN_START 1 +#define TXN_STOP 0 typedef enum { TYPE0 = 0x0, @@ -134,7 +145,10 @@ typedef enum { CFG_TXN_ATTRIBUTES = 0x7, ATS_RES_ATTRIBUTES = 0x8, TRANSACTION_TYPE = 0x9, - NUM_TRANSACTIONS = 0xA + NUM_TRANSACTIONS = 0xA, + ADDRESS_ATTRIBUTES = 0xB, + DATA_ATTRIBUTES = 0xC, + ERROR_INJECT_TYPE = 0xD } EXERCISER_PARAM_TYPE; typedef enum { @@ -170,7 +184,8 @@ typedef enum { TXN_NO_SNOOP_DISABLE = 0xa, START_TXN_MONITOR = 0xb, STOP_TXN_MONITOR = 0xc, - ATS_TXN_REQ = 0xd + ATS_TXN_REQ = 0xd, + INJECT_ERROR = 0xe } EXERCISER_OPS; typedef enum { @@ -221,6 +236,35 @@ typedef enum { EXERCISER_DATA_MMIO_SPACE = 0x3, } EXERCISER_DATA_TYPE; +typedef enum { + CORR_RCVR_ERR = 0x0, + CORR_BAD_TLP = 0x1, + CORR_BAD_DLLP = 0x2, + CORR_RPL_NUM_ROLL = 0x3, + CORR_RPL_TMR_TIMEOUT = 0x4, + CORR_ADV_NF_ERR = 0x5, + CORR_INT_ERR = 0x6, + CORR_HDR_LOG_OVRFL = 0x7, + UNCORR_DL_ERROR = 0x8, + UNCORR_SD_ERROR = 0x9, + UNCORR_PTLP_REC = 0xA, + UNCORR_FL_CTRL_ERR = 0xB, + UNCORR_CMPT_TO = 0xC, + UNCORR_AMPT_ABORT = 0xD, + UNCORR_UNEXP_CMPT = 0xE, + UNCORR_RCVR_ERR = 0xF, + UNCORR_MAL_TLP = 0x10, + UNCORR_ECRC_ERR = 0x11, + UNCORR_UR = 0x12, + UNCORR_ACS_VIOL = 0x13, + UNCORR_INT_ERR = 0x14, + UNCORR_MC_BLK_TLP = 0x15, + UNCORR_ATOP_EGR_BLK = 0x16, + UNCORR_TLP_PFX_EGR_BLK = 0x17, + UNCORR_PTLP_EGR_BLK = 0x18, + INVALID_CFG = 0x19 +} EXERCISER_ERROR_CODE; + UINT32 pal_exerciser_set_param(EXERCISER_PARAM_TYPE Type, UINT64 Value1, UINT64 Value2, UINT32 Bdf); UINT32 pal_exerciser_get_param(EXERCISER_PARAM_TYPE Type, UINT64 *Value1, UINT64 *Value2, UINT32 Bdf); UINT32 pal_exerciser_set_state(EXERCISER_STATE State, UINT64 *Value, UINT32 Bdf); diff --git a/platform/pal_uefi/src/pal_exerciser.c b/platform/pal_uefi/src/pal_exerciser.c index b479cc1b..2f9752d7 100644 --- a/platform/pal_uefi/src/pal_exerciser.c +++ b/platform/pal_uefi/src/pal_exerciser.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -134,7 +134,7 @@ pal_exerciser_find_pcie_capability ( UINT32 *Offset ) { - UINT64 NxtPtr; + UINT64 NxtPtr = 0; UINT32 Data; UINT32 TempId; UINT64 Ecam; @@ -186,9 +186,13 @@ UINT32 pal_exerciser_set_param ( ) { UINT32 Data; + UINT32 CapabilityOffset = 0; UINT64 Base; + UINT64 Ecam; Base = pal_exerciser_get_ecsr_base(Bdf,0); + Ecam = pal_pcie_get_mcfg_ecam(); // Getting the ECAM address + switch (Type) { case SNOOP_ATTRIBUTES: @@ -257,6 +261,18 @@ UINT32 pal_exerciser_set_param ( return 1; } + case ERROR_INJECT_TYPE: + pal_exerciser_find_pcie_capability(DVSEC, Bdf, PCIE, &CapabilityOffset); + Data = pal_mmio_read(Ecam + CapabilityOffset + + pal_exerciser_get_pcie_config_offset(Bdf) + DVSEC_CTRL); + Data = ((Value1 << ERR_CODE_SHIFT) | (Value2 << FATAL_SHIFT)); + pal_mmio_write(Ecam + CapabilityOffset + DVSEC_CTRL + + pal_exerciser_get_pcie_config_offset(Bdf), Data); + if (Value1 <= 0x7) + return 2; + else + return 3; + default: return 1; } @@ -281,6 +297,11 @@ pal_exerciser_get_param ( UINT32 Status; UINT32 Temp; UINT64 Base; + UINT32 tx_attr; + UINT32 addr_low = 0; + UINT32 addr_high = 0; + UINT32 data_low = 0; + UINT32 data_high = 0; Base = pal_exerciser_get_ecsr_base(Bdf,0); switch (Type) { @@ -307,6 +328,46 @@ pal_exerciser_get_param ( case ATS_RES_ATTRIBUTES: *Value1 = pal_mmio_read(Base + ATS_ADDR); return 0; + case CFG_TXN_ATTRIBUTES: + case TRANSACTION_TYPE: + case ADDRESS_ATTRIBUTES: + case DATA_ATTRIBUTES: + /* Get the first entry and check for validity */ + tx_attr = pal_mmio_read(Base + TXN_TRACE); + if (tx_attr == TXN_INVALID) + return 1; + + /* Obtain all the recorded information of the packet in the format. + ________________________________ + | TX ATTRIBUTES | + | CFG/MEM ADDRESS_LO | + | CFG/MEM ADDRESS_HI | + | DATA_LO | + | DATA_HI | + |________________________________| + */ + addr_low = pal_mmio_read(Base + TXN_TRACE); + addr_high = pal_mmio_read(Base + TXN_TRACE); + data_low = pal_mmio_read(Base + TXN_TRACE); + data_high = pal_mmio_read(Base + TXN_TRACE); + + if (Type == CFG_TXN_ATTRIBUTES) + *Value1 = tx_attr & MASK_BIT; + + /* 0 - Read, 1 - Write */ + else if (Type == TRANSACTION_TYPE) + if (tx_attr & 0x2) + *Value2 = CFG_READ; + else + *Value2 = CFG_WRITE; + + else if (Type == ADDRESS_ATTRIBUTES) + *Value1 = addr_low | ((UINT64)addr_high << 32); + + else if (Type == DATA_ATTRIBUTES) + *Value1 = data_low | ((UINT64)data_high << 32); + + return 0; default: return 1; } @@ -361,7 +422,7 @@ pal_exerciser_ops ( { UINT64 Base; UINT64 Ecam; - UINT32 CapabilityOffset; + UINT32 CapabilityOffset = 0; UINT32 data; Base = pal_exerciser_get_ecsr_base(Bdf,0); Ecam = pal_pcie_get_mcfg_ecam(); // Getting the ECAM address @@ -440,6 +501,22 @@ pal_exerciser_ops ( pal_mmio_write(Base + ATSCTL, ATS_TRIGGER); return !(pal_mmio_read(Base + ATSCTL) & ATS_STATUS); + case START_TXN_MONITOR: + pal_mmio_write(Base + TXN_CTRL_BASE, TXN_START); + return 0; + case STOP_TXN_MONITOR: + pal_mmio_write(Base + TXN_CTRL_BASE, TXN_STOP); + return 0; + + case INJECT_ERROR: + pal_exerciser_find_pcie_capability(DVSEC, Bdf, PCIE, &CapabilityOffset); + data = pal_mmio_read(Ecam + pal_exerciser_get_pcie_config_offset(Bdf) + + CapabilityOffset + DVSEC_CTRL); + data = data | (1 << ERROR_INJECT_BIT); + pal_mmio_write(Ecam + pal_exerciser_get_pcie_config_offset(Bdf) + CapabilityOffset + + DVSEC_CTRL, data); + return Param; + default: return PCIE_CAP_NOT_FOUND; } diff --git a/test_pool/exerciser/operating_system/test_e017.c b/test_pool/exerciser/operating_system/test_e017.c new file mode 100644 index 00000000..02fe26c0 --- /dev/null +++ b/test_pool/exerciser/operating_system/test_e017.c @@ -0,0 +1,206 @@ +/** @file + * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie_enumeration.h" +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_exerciser.h" + +#define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 17) +#define TEST_DESC "PE 2/4/8B writes tp PCIe as 2/4/8B" +#define TEST_RULE "S_PCIe_03" + +static uint32_t transaction_size = 4; +static uint32_t run_flag; +static uint32_t fail_cnt; + +static uint32_t test_sequence_check(uint32_t instance, uint64_t write_value) +{ + uint64_t idx; + uint64_t transaction_data; + + for (idx = 0; idx < transaction_size; idx++) { + val_exerciser_get_param(DATA_ATTRIBUTES, &transaction_data, &idx, instance); + if (transaction_data != write_value) { + val_print(AVS_PRINT_ERR, "\n Exerciser %d arrival order check failed", instance); + return 1; + } + } + + return 0; +} + +/* Performs write on 2B data */ +static uint32_t test_sequence_2B(uint16_t *addr, uint32_t instance) +{ + uint64_t idx; + uint64_t write_val = 0xABCD; + + /* Start monitoring exerciser transactions */ + if (val_exerciser_ops(START_TXN_MONITOR, CFG_READ, instance)) + return AVS_STATUS_SKIP; + + run_flag = 1; + + /* Send the transaction on incremental addresses */ + for (idx = 0; idx < transaction_size; idx++) { + /* Write transaction */ + val_mmio_write16((addr_t)addr, write_val); + addr++; + } + + /* Stop monitoring exerciser transactions */ + val_exerciser_ops(STOP_TXN_MONITOR, CFG_READ, instance); + + return test_sequence_check(instance, write_val); +} + +/* Performs write on 4B data */ +static uint32_t test_sequence_4B(uint32_t *addr, uint32_t instance) +{ + uint64_t idx; + uint64_t write_val = 0xC0DEC0DE; + + /* Start monitoring exerciser transactions */ + if (val_exerciser_ops(START_TXN_MONITOR, CFG_READ, instance)) + return AVS_STATUS_SKIP; + + run_flag = 1; + + /* Send the transaction on incremental addresses */ + for (idx = 0; idx < transaction_size; idx++) { + val_mmio_write((addr_t)addr, write_val); + addr++; + } + + /* Stop monitoring exerciser transactions */ + val_exerciser_ops(STOP_TXN_MONITOR, CFG_READ, instance); + + return test_sequence_check(instance, write_val); +} + +/* Performs write on 8B data */ +static uint32_t test_sequence_8B(uint64_t *addr, uint32_t instance) +{ + uint64_t idx; + uint64_t write_val = 0xCAFECAFECAFECAFE; + + /* Start monitoring exerciser transactions */ + if (val_exerciser_ops(START_TXN_MONITOR, CFG_READ, instance)) + return AVS_STATUS_SKIP; + + run_flag = 1; + + /* Send the transaction on incremental addresses */ + for (idx = 0; idx < transaction_size; idx++) { + /* Write transaction */ + val_mmio_write64((addr_t)addr, write_val); + addr++; + } + + /* Stop monitoring exerciser transactions */ + val_exerciser_ops(STOP_TXN_MONITOR, CFG_READ, instance); + + return test_sequence_check(instance, write_val); +} + +/* Read and Write on BAR space mapped to Device memory */ +static +void +barspace_transactions_order_check(void) +{ + uint32_t instance; + exerciser_data_t e_data; + char *baseptr; + uint32_t status; + + /* Read the number of excerciser cards */ + instance = val_exerciser_get_info(EXERCISER_NUM_CARDS, 0); + + while (instance-- != 0) { + + /* if init fail moves to next exerciser */ + if (val_exerciser_init(instance)) + continue; + + /* Get BAR 0 details for this instance */ + status = val_exerciser_get_data(EXERCISER_DATA_MMIO_SPACE, &e_data, instance); + if (status == NOT_IMPLEMENTED) { + val_print(AVS_PRINT_ERR, "\n pal_exerciser_get_data() for MMIO not implemented", 0); + continue; + } else if (status) { + val_print(AVS_PRINT_ERR, "\n Exerciser %d data read error ", instance); + continue; + } + + /* Map mmio space to ARM device memory in MMU page tables */ + baseptr = (char *)e_data.bar_space.base_addr; + if (!baseptr) { + val_print(AVS_PRINT_ERR, "\n Failed in BAR ioremap for instance %x", instance); + continue; + } + + /* Test Scenario 1 : Transactions on incremental aligned address */ + fail_cnt += test_sequence_2B((uint16_t *)baseptr, instance); + fail_cnt += test_sequence_4B((uint32_t *)baseptr, instance); + fail_cnt += test_sequence_8B((uint64_t *)baseptr, instance); + } +} + +static +void +payload(void) +{ + uint32_t pe_index; + + pe_index = val_pe_get_index_mpid (val_pe_get_mpid()); + + barspace_transactions_order_check(); + + if (!run_flag) { + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + if (fail_cnt) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, fail_cnt)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); +} + +uint32_t +e017_entry(void) +{ + uint32_t num_pe = 1; + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* Get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/exerciser/operating_system/test_e018.c b/test_pool/exerciser/operating_system/test_e018.c new file mode 100644 index 00000000..f8514267 --- /dev/null +++ b/test_pool/exerciser/operating_system/test_e018.c @@ -0,0 +1,438 @@ +/** @file + * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie_enumeration.h" +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_gic.h" +#include "val/include/sbsa_avs_iovirt.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_exerciser.h" + +#define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 18) +#define TEST_DESC "RP's must support AER feature " +#define TEST_RULE "PCI_ER_01, PCI_ER_02, PCI_ER_03" + +#define ERR_CORR 0x2 +#define ERR_UNCORR 0x3 +#define CLEAR_STATUS 0xFFFFFFFF + +static uint32_t irq_pending; +static uint32_t lpi_int_id = 0x204C; +static uint32_t mask_value; + +static +void +intr_handler(void) +{ + /* Clear the interrupt pending state */ + irq_pending = 0; + + val_print(AVS_PRINT_INFO, "\n Received MSI interrupt %x ", lpi_int_id); + val_gic_end_of_interrupt(lpi_int_id); + return; +} + +/* Clear all the status bits and set the mask and severity + * @param e_bdf - Exerciser bdf + * aer_offset - AER capability offset of bdf + * mask - Whether error to be masked or not + * 0 - no mask 0xFFFFFFFF - mask all errors + * severity - Whether error is fatal or non-fatal + * 0 - non-fatal 0xFFFFFFFF - fatal + **/ +static void +clear_status_bits(uint32_t e_bdf, uint32_t aer_offset, uint32_t mask, uint32_t severity) +{ + + /* Clear all status bits of Correctable and Unconrrectable errors */ + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_STATUS_OFFSET, CLEAR_STATUS); + val_pcie_write_cfg(e_bdf, aer_offset + AER_CORR_STATUS_OFFSET, CLEAR_STATUS); + + /* Mask or UnMask all errors */ + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_MASK_OFFSET, mask); + val_pcie_write_cfg(e_bdf, aer_offset + AER_CORR_MASK_OFFSET, mask); + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_SEVR_OFFSET, severity); +} + +static uint32_t +correctable_err_status_chk(uint32_t e_bdf, uint32_t aer_offset, uint32_t err_code) +{ + uint32_t erp_bdf, reg_bdf, rp_aer_offset; + uint32_t value, err_bit; + uint32_t pciecs_base, reg_value; + uint32_t fail_cnt = 0; + + val_pcie_get_rootport(e_bdf, &erp_bdf); + val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_AER, &rp_aer_offset); + err_bit = val_get_exerciser_err_info(err_code); + + /* Check if corresponding error bit is set */ + val_pcie_read_cfg(e_bdf, aer_offset + AER_CORR_STATUS_OFFSET, &value); + if (!((value >> err_bit) & 0x1)) + { + val_print(AVS_PRINT_ERR, "\n Err bit for error not set", 0); + fail_cnt++; + } + + /* Check if the RP has received the corresponding error type if error is not masked */ + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_OFFSET, &value); + if ((mask_value == 0) && ((value & 0x1) == 0)) + { + val_print(AVS_PRINT_ERR, "\n Root error status not set", 0); + fail_cnt++; + } + + if ((mask_value == 1) && ((value & 0x1) == 1)) + { + val_print(AVS_PRINT_ERR, "\n Root error status set when error is masked", 0); + fail_cnt++; + } + + /* Check if the Reg ID matches with the error source ID */ + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_SOURCE_ID, &value); + reg_bdf = PCIE_CREATE_BDF_PACKED(e_bdf); + if ((mask_value == 0) && ((value & AER_SOURCE_ID_MASK) != reg_bdf)) + { + val_print(AVS_PRINT_ERR, "\n Error source Identification failed", 0); + fail_cnt++; + } + + /* Check if the appropriate status bit is set in Device status register */ + val_pcie_find_capability(e_bdf, PCIE_CAP, CID_PCIECS, &pciecs_base); + val_pcie_read_cfg(e_bdf, pciecs_base + DCTLR_OFFSET, ®_value); + if (!((reg_value >> DSTS_SHIFT) & 0x1)) + { + val_print(AVS_PRINT_ERR, "\n Device reg of EP not set %x ", reg_value); + fail_cnt++; + } + + /* Clear the Error status bit in the RP */ + val_pcie_write_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_OFFSET, 0x1); + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_OFFSET, &value); + if ((value & 0x1)) + { + val_print(AVS_PRINT_ERR, "\n Err bit is not cleared %x ", value); + fail_cnt++; + } + + if (fail_cnt) + return 1; + + return 0; +} + +static uint32_t +uncorrectable_error_chk(uint32_t e_bdf, uint32_t aer_offset, uint32_t err_code) +{ + uint32_t erp_bdf, reg_bdf, rp_aer_offset; + uint32_t value, err_bit; + uint32_t pciecs_base, reg_value; + uint32_t fail_cnt = 0; + + val_pcie_get_rootport(e_bdf, &erp_bdf); + val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_AER, &rp_aer_offset); + err_bit = val_get_exerciser_err_info(err_code); + + /* Check if corresponding error bit is set */ + val_pcie_read_cfg(e_bdf, aer_offset + AER_UNCORR_STATUS_OFFSET, &value); + if (!((value >> err_bit) & 0x1)) + { + val_print(AVS_PRINT_ERR, "\n Err bit not set %x", value); + fail_cnt++; + } + + /* Check if the RP has received the corresponding error type if error is not masked */ + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_OFFSET, &value); + if ((mask_value == 0) && ((value & 0x4) == 0)) + { + val_print(AVS_PRINT_ERR, "\n Root Error status not set", 0); + fail_cnt++; + } + + if ((mask_value == 1) && ((value & 0x4) == 0x4)) + { + val_print(AVS_PRINT_ERR, "\n Root error status set when error is masked", 0); + fail_cnt++; + } + + /* Check if the Reg ID matches with the error source ID */ + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_SOURCE_ID, &value); + reg_bdf = PCIE_CREATE_BDF_PACKED(e_bdf); + if ((mask_value == 0) && (((value >> AER_SOURCE_ID_SHIFT) & AER_SOURCE_ID_MASK) != reg_bdf)) + { + val_print(AVS_PRINT_ERR, "\n Error source Identification failed", 0); + fail_cnt++; + } + + /* Check if the appropriate status bit is set in Device status register */ + val_pcie_find_capability(e_bdf, PCIE_CAP, CID_PCIECS, &pciecs_base); + val_pcie_read_cfg(e_bdf, pciecs_base + DCTLR_OFFSET, ®_value); + if (!((reg_value >> DSTS_SHIFT) & DS_UNCORR_MASK)) + { + val_print(AVS_PRINT_ERR, "\n Device reg of EP not set", 0); + fail_cnt++; + } + + /* Clear the Error status bit in the RP */ + val_pcie_write_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_OFFSET, 0x7F); + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_OFFSET, &value); + if ((value & 0x7F)) + { + val_print(AVS_PRINT_ERR, "\n Err bit is not cleared %x", value); + fail_cnt++; + } + + if (fail_cnt) + return 1; + + return 0; + +} + +static +uint32_t +inject_error(uint32_t e_bdf, uint32_t instance, uint32_t aer_offset) +{ + uint32_t err_code; + uint32_t status, value; + uint32_t res, timeout; + + for (err_code = 0; err_code <= ERR_CNT; err_code++) + { + irq_pending = 1; + + status = val_exerciser_set_param(ERROR_INJECT_TYPE, err_code, 0, instance); + value = val_exerciser_ops(INJECT_ERROR, err_code, instance); + + /*Interrupt should be generated on error detection if errors are not masked*/ + if (mask_value == 0) { + timeout = TIMEOUT_LARGE; + while ((--timeout > 0) && irq_pending) + {}; + + if (timeout == 0) + { + val_gic_free_irq(irq_pending, 0); + val_print(AVS_PRINT_ERR, "\n Intr not trigerred on err injection bdf 0x%x", e_bdf); + return 1; + } + } + + /* Check if error injected is correctable or uncorrectable*/ + if (status == ERR_CORR) { + val_print(AVS_PRINT_INFO, "\n Correctable error recieved", 0); + res = correctable_err_status_chk(e_bdf, aer_offset, value); + if (res) { + val_print(AVS_PRINT_ERR, "\n Correctable error check failed for bdf %x", e_bdf); + return 1; + } + } + + else if (status == ERR_UNCORR) { + val_print(AVS_PRINT_INFO, "\n UnCorrectable error recieved", 0); + res = uncorrectable_error_chk(e_bdf, aer_offset, value); + if (res) { + val_print(AVS_PRINT_ERR, "\n Uncorrectable error check failed for bdf %x", e_bdf); + return 1; + } + } + } + + return 0; +} + + +static +void +payload(void) +{ + + uint32_t instance; + uint32_t pe_index; + uint32_t e_bdf; + uint32_t erp_bdf; + uint32_t aer_offset; + uint32_t rp_aer_offset; + uint32_t value = 0; + uint32_t reg_value = 0; + uint32_t test_skip = 1; + + uint32_t status; + uint32_t device_id = 0; + uint32_t stream_id = 0; + uint32_t its_id = 0; + uint32_t msi_index = 0; + uint32_t msi_cap_offset = 0; + uint32_t dpc_cap_base = 0; + + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + instance = val_exerciser_get_info(EXERCISER_NUM_CARDS, 0); + + while (instance-- != 0) { + + /* if init fail moves to next exerciser */ + if (val_exerciser_init(instance)) + continue; + + e_bdf = val_exerciser_get_bdf(instance); + val_pcie_enable_eru(e_bdf); + if (val_pcie_get_rootport(e_bdf, &erp_bdf)) + continue; + + val_pcie_enable_eru(erp_bdf); + + /*Check AER capability for exerciser and its RP */ + if (val_pcie_find_capability(e_bdf, PCIE_ECAP, ECID_AER, &aer_offset) != PCIE_SUCCESS) { + val_print(AVS_PRINT_ERR, "\n No AER Capability, Skipping for Bdf : 0x%x", e_bdf); + continue; + } + + if (val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_AER, &rp_aer_offset) != PCIE_SUCCESS) { + val_print(AVS_PRINT_ERR, "\n AER Capability not supported for RP : 0x%x", erp_bdf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Check DPC capability */ + status = val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_DPC, &dpc_cap_base); + if (status == PCIE_CAP_NOT_FOUND) + { + val_print(AVS_PRINT_ERR, "\n ECID_DPC not found", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Warn if DPC enabled */ + val_pcie_read_cfg(erp_bdf, dpc_cap_base + DPC_CTRL_OFFSET, ®_value); + if ((reg_value & 0x3) != 0) + val_print(AVS_PRINT_WARN, "\n DPC enabled for bdf : 0x%x", erp_bdf); + + + /* Search for MSI-X Capability */ + if (val_pcie_find_capability(e_bdf, PCIE_CAP, CID_MSIX, &msi_cap_offset)) { + val_print(AVS_PRINT_ERR, "\n No MSI-X Capability, Skipping for Bdf 0x%x", e_bdf); + continue; + } + + if (val_pcie_find_capability(erp_bdf, PCIE_CAP, CID_MSIX, &msi_cap_offset)) { + val_print(AVS_PRINT_ERR, "\n No MSI-X Capability for RP Bdf 0x%x", erp_bdf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Get DeviceID & ITS_ID for this device */ + status = val_iovirt_get_device_info(PCIE_CREATE_BDF_PACKED(erp_bdf), + PCIE_EXTRACT_BDF_SEG(erp_bdf), &device_id, + &stream_id, &its_id); + + if (status) { + val_print(AVS_PRINT_ERR, "\n iovirt_get_device failed for bdf 0x%x", e_bdf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* MSI assignment */ + status = val_gic_request_msi(erp_bdf, device_id, its_id, lpi_int_id + instance, msi_index); + if (status) { + val_print(AVS_PRINT_ERR, "\n MSI Assignment failed for bdf : 0x%x", erp_bdf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + status = val_gic_install_isr(lpi_int_id + instance, intr_handler); + + if (status) { + val_print(AVS_PRINT_ERR, "\n Intr handler registration failed: 0x%x", lpi_int_id); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + test_skip = 0; + val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_AER, &rp_aer_offset); + val_pcie_read_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_CMD_OFFSET, &value); + val_pcie_write_cfg(erp_bdf, rp_aer_offset + AER_ROOT_ERR_CMD_OFFSET, (value | 0x7)); + + /* Errors not masked and severity is non-fatal */ + mask_value = 0; + clear_status_bits(e_bdf, aer_offset, 0, 0); + if (inject_error(e_bdf, instance, aer_offset)) + { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 03)); + return; + } + + /* Errors masked and severity is non-fatal */ + mask_value = 1; + clear_status_bits(e_bdf, aer_offset, AER_ERROR_MASK, 0); + if (inject_error(e_bdf, instance, aer_offset)) + { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 04)); + return; + } + mask_value = 0; + + /* Errors not masked and severity is fatal */ + clear_status_bits(e_bdf, aer_offset, 0, AER_UNCORR_SEVR_FATAL); + if (inject_error(e_bdf, instance, aer_offset)) + { + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 05)); + return; + } + + /* Disable error reporting of Exerciser and upstream Root Port */ + val_pcie_disable_eru(e_bdf); + val_pcie_disable_eru(erp_bdf); + + /* + * Clear unsupported request detected bit in Exerciser upstream + * Rootport's Device Status Register to clear any pending urd status. + */ + val_pcie_clear_urd(erp_bdf); + val_gic_free_msi(erp_bdf, device_id, its_id, lpi_int_id + instance, msi_index); + } + + if (test_skip == 1) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + + return; + +} + +uint32_t +e018_entry(void) +{ + uint32_t num_pe = 1; + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* Get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/exerciser/operating_system/test_e019.c b/test_pool/exerciser/operating_system/test_e019.c new file mode 100644 index 00000000..1d9ea2df --- /dev/null +++ b/test_pool/exerciser/operating_system/test_e019.c @@ -0,0 +1,362 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie_enumeration.h" +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_pcie_spec.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_iovirt.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_exerciser.h" + +#define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 19) +#define TEST_DESC "RP's must support DPC " +#define TEST_RULE "PCI_ER_05, PCI_ER_06" + +#define ERR_FATAL 1 +#define ERR_FATAL_NONFATAL 2 +#define ERR_UNCORR 0x3 + +static uint32_t msg_type[] = {ERR_FATAL_NONFATAL, ERR_FATAL}; +static uint32_t irq_pending; +static uint32_t lpi_int_id = 0x204C; + +static +void +intr_handler(void) +{ + /* Clear the interrupt pending state */ + irq_pending = 0; + + val_print(AVS_PRINT_INFO, "\n Received MSI interrupt %x ", lpi_int_id); + val_gic_end_of_interrupt(lpi_int_id); + return; +} + +static +void +payload(void) +{ + + uint32_t pe_index; + uint32_t e_bdf; + uint32_t erp_bdf; + uint32_t reg_value; + uint32_t instance; + uint32_t fail_cnt; + uint32_t test_skip = 1; + uint32_t status; + uint32_t dpc_cap_base; + uint32_t rp_dpc_cap_base; + uint32_t aer_offset; + uint32_t rp_aer_offset; + uint32_t error_source_id; + uint32_t source_id; + uint32_t dpc_trigger_reason; + uint32_t timeout; + + uint32_t device_id = 0; + uint32_t stream_id = 0; + uint32_t its_id = 0; + uint32_t msi_index = 0; + uint32_t msi_cap_offset = 0; + + void *cfg_space_buf; + addr_t cfg_space_addr; + uint32_t idx; + cfg_space_buf = NULL; + + fail_cnt = 0; + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + instance = val_exerciser_get_info(EXERCISER_NUM_CARDS, 0); + + while (instance-- != 0) + { + if (val_exerciser_init(instance)) + continue; + + e_bdf = val_exerciser_get_bdf(instance); + + val_pcie_enable_eru(e_bdf); + + if (val_pcie_get_rootport(e_bdf, &erp_bdf)) + continue; + + val_pcie_enable_eru(erp_bdf); + + /* Check DPC capability */ + status = val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_DPC, &rp_dpc_cap_base); + if (status == PCIE_CAP_NOT_FOUND) + { + val_print(AVS_PRINT_ERR, "\n ECID_DPC not found", 0); + continue; + } + + status = val_pcie_find_capability(e_bdf, PCIE_ECAP, ECID_DPC, &dpc_cap_base); + test_skip = 0; + + /* Check AER capability for both exerciser and RP */ + if (val_pcie_find_capability(e_bdf, PCIE_ECAP, ECID_AER, &aer_offset) != PCIE_SUCCESS) { + val_print(AVS_PRINT_ERR, "\n AER Capability not supported, Bdf : 0x%x", e_bdf); + continue; + } + + if (val_pcie_find_capability(erp_bdf, PCIE_ECAP, ECID_AER, &rp_aer_offset) != PCIE_SUCCESS) { + val_print(AVS_PRINT_ERR, "\n AER Capability not supported for RP : 0x%x", erp_bdf); + fail_cnt++; + } + + /* Search for MSI-X Capability */ + if (val_pcie_find_capability(e_bdf, PCIE_CAP, CID_MSIX, &msi_cap_offset)) { + val_print(AVS_PRINT_ERR, "\n No MSI-X Capability, Skipping for Bdf 0x%x", e_bdf); + continue; + } + + /* Get DeviceID & ITS_ID for this device */ + status = val_iovirt_get_device_info(PCIE_CREATE_BDF_PACKED(erp_bdf), + PCIE_EXTRACT_BDF_SEG(erp_bdf), &device_id, + &stream_id, &its_id); + + if (status) { + val_print(AVS_PRINT_ERR, "\n iovirt_get_device failed for bdf 0x%x", e_bdf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 01)); + return; + } + + /* Get DeviceID & ITS_ID for this device */ + status = val_gic_request_msi(erp_bdf, device_id, its_id, lpi_int_id + instance, msi_index); + if (status) { + val_print(AVS_PRINT_ERR, "\n MSI Assignment failed for bdf : 0x%x", erp_bdf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 2)); + return; + } + + status = val_gic_install_isr(lpi_int_id + instance, intr_handler); + + if (status) { + val_print(AVS_PRINT_ERR, "\n Intr handler registration failed: 0x%x", lpi_int_id); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + status = val_exerciser_set_param(ERROR_INJECT_TYPE, UNCORR_CMPT_TO, 1, instance); + if (status != ERR_UNCORR) { + val_print(AVS_PRINT_ERR, "\n Error Injection failed, Bdf : 0x%x", e_bdf); + continue; + } + + /* check for both fatal and non-fatal error */ + for (int i = 0; i < 2; i++) + { + val_pcie_data_link_layer_status(erp_bdf); + cfg_space_buf = val_memory_alloc(PCIE_CFG_SIZE); + if (cfg_space_buf == NULL) + { + val_print(AVS_PRINT_ERR, "\n Memory allocation failed.", 0); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + /* Get configuration space address for EP */ + cfg_space_addr = val_pcie_get_bdf_config_addr(e_bdf); + val_print(AVS_PRINT_INFO, "\n EP BDF 0x%x : ", e_bdf); + val_print(AVS_PRINT_INFO, "Config space addr 0x%x", cfg_space_addr); + + /* Save the EP config space to restore after Secondary Bus Reset */ + for (idx = 0; idx < PCIE_CFG_SIZE/4; idx++) { + *((uint32_t *)cfg_space_buf + idx) = *((uint32_t *)cfg_space_addr + idx); + } + + irq_pending = 1; + val_pcie_read_cfg(erp_bdf, rp_dpc_cap_base + DPC_CTRL_OFFSET, ®_value); + reg_value &= DPC_DISABLE_MASK; + reg_value |= DPC_INTR_ENABLE; + reg_value = reg_value | (msg_type[i] << DPC_CTRL_TRG_EN_SHIFT); + val_pcie_write_cfg(erp_bdf, rp_dpc_cap_base + DPC_CTRL_OFFSET, reg_value); + + val_pcie_read_cfg(erp_bdf, rp_dpc_cap_base + DPC_CTRL_OFFSET, ®_value); + + if (msg_type[i] == ERR_FATAL) + { + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_SEVR_OFFSET, AER_UNCORR_SEVR_FATAL); + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_MASK_OFFSET, 0x0); + } + else + { + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_SEVR_OFFSET, 0x0); + } + + /*Inject error immediately*/ + val_exerciser_ops(INJECT_ERROR, CFG_READ, instance); + + val_pcie_read_cfg(e_bdf, CFG_READ, ®_value); + if (reg_value != PCIE_UNKNOWN_RESPONSE) + { + val_print(AVS_PRINT_ERR, "\n EP not contained due to DPC", 0); + fail_cnt++; + } + + val_pcie_read_cfg(erp_bdf, rp_dpc_cap_base + DPC_STATUS_OFFSET, ®_value); + + /* Check DPC Trigger status */ + if ((reg_value & 1) == 0) + { + val_print(AVS_PRINT_ERR, "\n DPC Trigger status bit not set %x", reg_value); + fail_cnt++; + } + + dpc_trigger_reason = (reg_value & DPC_TRIGGER_MASK) >> 1; + if (msg_type[i] == ERR_FATAL) + { + if (dpc_trigger_reason != 2) + { + val_print(AVS_PRINT_ERR, "\n DPC Trigger reason incorrect", 0); + fail_cnt++; + } + } else { + if (dpc_trigger_reason != 1) + { + val_print(AVS_PRINT_ERR, "\n DPC Trigger reason incorrect", 0); + fail_cnt++; + } + } + + source_id = PCIE_CREATE_BDF_PACKED(e_bdf); + error_source_id = (reg_value >> DPC_SOURCE_ID_SHIFT); + if (source_id != error_source_id) + { + val_print(AVS_PRINT_ERR, "\n DPC Error source Identification failed", 0); + fail_cnt++; + } + + timeout = TIMEOUT_LARGE; + while ((--timeout > 0) && irq_pending) + {}; + + if (timeout == 0) { + val_gic_free_irq(irq_pending, 0); + val_print(AVS_PRINT_ERR, "\n Interrupt trigger failed for bdf 0x%lx", e_bdf); + fail_cnt++; + continue; + } + + val_pcie_read_cfg(erp_bdf, rp_dpc_cap_base + DPC_STATUS_OFFSET, ®_value); + while (reg_value & 0x10) + {}; + val_pcie_write_cfg(erp_bdf, rp_dpc_cap_base + DPC_STATUS_OFFSET, 1); + + val_pcie_read_cfg(erp_bdf, TYPE01_ILR, ®_value); + reg_value = reg_value | BRIDGE_CTRL_SBR_SET; + val_pcie_write_cfg(erp_bdf, TYPE01_ILR, reg_value); + + /* Wait for Timeout */ + val_time_delay_ms(2 * ONE_MILLISECOND); + + val_pcie_read_cfg(erp_bdf, TYPE01_ILR, ®_value); + reg_value = reg_value & ~BRIDGE_CTRL_SBR_SET; + val_pcie_write_cfg(erp_bdf, TYPE01_ILR, reg_value); + + timeout = TIMEOUT_LARGE; + while (--timeout) + {}; + + status = val_pcie_data_link_layer_status(erp_bdf); + if (status != PCIE_DLL_LINK_ACTIVE_NOT_SUPPORTED) + { + if (!status) + { + /* Wait for for additional Timeout and check the status*/ + uint32_t delay_status = val_time_delay_ms(100 * ONE_MILLISECOND); + if (!delay_status) + { + val_print(AVS_PRINT_ERR, "\n Failed to time delay for BDF 0x%x ", erp_bdf); + val_memory_free(cfg_space_buf); + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, 02)); + return; + } + + status = val_pcie_data_link_layer_status(erp_bdf); + } + } + + if (status == PCIE_DLL_LINK_STATUS_NOT_ACTIVE) + { + val_print(AVS_PRINT_ERR, "\nThe link not active after reset for BDF 0x%x: ", erp_bdf); + return ; + } + + /*Disable the DPC*/ + + val_pcie_read_cfg(erp_bdf, rp_dpc_cap_base + DPC_STATUS_OFFSET, ®_value); + val_pcie_write_cfg(erp_bdf, rp_dpc_cap_base + DPC_STATUS_OFFSET, reg_value | 0x1); + + val_pcie_read_cfg(e_bdf, dpc_cap_base + DPC_STATUS_OFFSET, ®_value); + val_pcie_write_cfg(e_bdf, dpc_cap_base + DPC_STATUS_OFFSET, reg_value | 0x1); + + val_pcie_read_cfg(erp_bdf, rp_dpc_cap_base + DPC_CTRL_OFFSET, ®_value); + val_pcie_write_cfg(erp_bdf, rp_dpc_cap_base + DPC_CTRL_OFFSET, reg_value & 0xFFFCFFFF); + + val_pcie_read_cfg(e_bdf, aer_offset + AER_UNCORR_STATUS_OFFSET, ®_value); + val_pcie_write_cfg(e_bdf, aer_offset + AER_UNCORR_STATUS_OFFSET, reg_value & 0xFFFFFFFF); + + val_pcie_read_cfg(e_bdf, CFG_READ, ®_value); + if (reg_value == PCIE_UNKNOWN_RESPONSE) + { + val_print(AVS_PRINT_ERR, "\n EP not recovered from DPC", 0); + fail_cnt++; + } + + /* Restore EP Config Space */ + for (idx = 0; idx < PCIE_CFG_SIZE/4; idx++) { + *((uint32_t *)cfg_space_addr + idx) = *((uint32_t *)cfg_space_buf + idx); + } + + } + + } + if (test_skip) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + else if (fail_cnt) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, fail_cnt)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + + return; + +} + +uint32_t +e019_entry(void) +{ + uint32_t num_pe = 1; + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* Get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/test_pool/exerciser/operating_system/test_e020.c b/test_pool/exerciser/operating_system/test_e020.c new file mode 100644 index 00000000..6baf5e3e --- /dev/null +++ b/test_pool/exerciser/operating_system/test_e020.c @@ -0,0 +1,254 @@ +/** @file + * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * SPDX-License-Identifier : Apache-2.0 + + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +#include "val/include/sbsa_avs_val.h" +#include "val/include/val_interface.h" + +#include "val/include/sbsa_avs_pcie_enumeration.h" +#include "val/include/sbsa_avs_pcie.h" +#include "val/include/sbsa_avs_pe.h" +#include "val/include/sbsa_avs_smmu.h" +#include "val/include/sbsa_avs_memory.h" +#include "val/include/sbsa_avs_exerciser.h" +#include "val/include/sbsa_avs_pcie.h" + +#define TEST_NUM (AVS_EXERCISER_TEST_NUM_BASE + 20) +#define TEST_DESC "Check 2/4/8 Bytes targeted writes" +#define TEST_RULE "S_PCIe_04" + + +static +uint32_t +get_target_exer_bdf(uint32_t req_rp_bdf, uint32_t *tgt_e_bdf, + uint32_t *tgt_rp_bdf, uint64_t *bar_base, uint32_t *tgt_instance) +{ + + uint32_t erp_bdf; + uint32_t e_bdf; + uint32_t instance; + uint32_t req_rp_ecam_index; + uint32_t erp_ecam_index; + uint32_t status; + + instance = val_exerciser_get_info(EXERCISER_NUM_CARDS, 0); + + while (instance-- != 0) + { + /* if init fail moves to next exerciser */ + if (val_exerciser_init(instance)) + continue; + + e_bdf = val_exerciser_get_bdf(instance); + + /* Read e_bdf BAR Register to get the Address to perform P2P */ + /* If No BAR Space, continue */ + val_pcie_get_mmio_bar(e_bdf, bar_base); + if (*bar_base == 0) + continue; + + /* Get RP of the exerciser */ + if (val_pcie_get_rootport(e_bdf, &erp_bdf)) + continue; + + if (req_rp_bdf != erp_bdf) + { + status = val_pcie_get_ecam_index(req_rp_bdf, &req_rp_ecam_index); + if (status) + { + val_print(AVS_PRINT_ERR, "\n Error Ecam index for req RP BDF: 0x%x", req_rp_bdf); + goto clean_fail; + } + + status = val_pcie_get_ecam_index(erp_bdf, &erp_ecam_index); + if (status) + { + val_print(AVS_PRINT_ERR, "\n Error Ecam index for tgt RP BDF: 0x%x", erp_bdf); + goto clean_fail; + } + + if (req_rp_ecam_index != erp_ecam_index) + continue; + + *tgt_e_bdf = e_bdf; + *tgt_rp_bdf = erp_bdf; + + /* Enable Bus Master Enable */ + val_pcie_enable_bme(e_bdf); + /* Enable Memory Space Access */ + val_pcie_enable_msa(e_bdf); + + *tgt_instance = instance; + + return AVS_STATUS_PASS; + } + } + +clean_fail: + /* Return failure if No Such Exerciser Found */ + *tgt_e_bdf = 0; + *tgt_rp_bdf = 0; + *bar_base = 0; + return AVS_STATUS_FAIL; +} + +static +uint32_t +check_sequence(uint64_t dma_buffer, uint32_t tgt_instance, uint32_t req_instance, + uint64_t bar_base, uint32_t size) +{ + uint32_t status; + uint64_t transaction_data; + uint64_t idx; + + /* Copy the contents of the memory to requestor exercise's memory */ + val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)dma_buffer, size, req_instance); + val_exerciser_ops(START_DMA, EDMA_TO_DEVICE, req_instance); + + /* Set the destination buffer as BAR base address of target exerciser */ + val_exerciser_set_param(DMA_ATTRIBUTES, (uint64_t)bar_base, size, req_instance); + + /* Start the transaction monitoring in the target exerciser */ + status = val_exerciser_ops(START_TXN_MONITOR, CFG_READ, tgt_instance); + if (status == PCIE_CAP_NOT_FOUND) + { + val_print(AVS_PRINT_ERR, "\n Transaction Monitoring capability not found", 0); + return 1; + } + + /* Copy the contents from requestor exerciser to target exerciser's BAR address */ + val_exerciser_ops(START_DMA, EDMA_FROM_DEVICE, req_instance); + + /* Stop the transaction monitoring in the target exerciser */ + status = val_exerciser_ops(STOP_TXN_MONITOR, CFG_READ, tgt_instance); + if (status == PCIE_CAP_NOT_FOUND) + { + val_print(AVS_PRINT_ERR, "\n Transaction Monitoring capability not found", 0); + return 1; + } + + /* Compare the transaction data */ + val_exerciser_get_param(DATA_ATTRIBUTES, &transaction_data, &idx, tgt_instance); + if (val_memory_compare(&transaction_data, &dma_buffer, size)) + { + val_print(AVS_PRINT_ERR, "\nData mismatch for target exerciser instance: %x", tgt_instance); + val_print(AVS_PRINT_ERR, " with value: %x", transaction_data); + return 1; + } + + return 0; +} + +static +void +payload(void) +{ + + uint32_t status; + uint32_t pe_index; + uint32_t req_instance; + uint32_t fail_cnt; + uint32_t test_skip; + uint32_t req_e_bdf, req_rp_bdf, tgt_e_bdf, tgt_rp_bdf, tgt_instance; + uint64_t bar_base; + uint64_t dma_buffer = 0xABCDC0DEABCDC0DE; + + + fail_cnt = 0; + test_skip = 1; + pe_index = val_pe_get_index_mpid(val_pe_get_mpid()); + req_instance = val_exerciser_get_info(EXERCISER_NUM_CARDS, 0); + + status = val_pcie_p2p_support(); + /* Check If PCIe Hierarchy supports P2P. */ + if (status) { + val_print(AVS_PRINT_DEBUG, "\nPCIe hierarchy does not support P2P: %x", status); + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 01)); + return; + } + + + while (req_instance-- != 0) + { + + /* if init fail moves to next exerciser */ + if (val_exerciser_init(req_instance)) + continue; + + req_e_bdf = val_exerciser_get_bdf(req_instance); + + /* Get RP of the exerciser */ + if (val_pcie_get_rootport(req_e_bdf, &req_rp_bdf)) + continue; + + /* Find another exerciser on other rootport, + Break from the test if no such exerciser if found */ + if (get_target_exer_bdf(req_rp_bdf, &tgt_e_bdf, &tgt_rp_bdf, &bar_base, &tgt_instance)) + continue; + + test_skip = 0; + + status = check_sequence(dma_buffer, tgt_instance, req_instance, bar_base, 2); + if (status) + { + val_print(AVS_PRINT_ERR, "\nFailed for 2B transaction from exerciser: %x", req_instance); + fail_cnt++; + } + + status = check_sequence(dma_buffer, tgt_instance, req_instance, bar_base, 4); + if (status) + { + val_print(AVS_PRINT_ERR, "\nFailed for 4B transaction from exerciser: %x", req_instance); + fail_cnt++; + } + + status = check_sequence(dma_buffer, tgt_instance, req_instance, bar_base, 8); + if (status) + { + val_print(AVS_PRINT_ERR, "\nFailed for 8B transaction from exerciser: %x", req_instance); + fail_cnt++; + } + + } + + if (test_skip == 1) + val_set_status(pe_index, RESULT_SKIP(g_sbsa_level, TEST_NUM, 02)); + else if (fail_cnt) + val_set_status(pe_index, RESULT_FAIL(g_sbsa_level, TEST_NUM, fail_cnt)); + else + val_set_status(pe_index, RESULT_PASS(g_sbsa_level, TEST_NUM, 01)); + + return; + +} + +uint32_t +e020_entry(void) +{ + uint32_t num_pe = 1; + uint32_t status = AVS_STATUS_FAIL; + + status = val_initialize_test(TEST_NUM, TEST_DESC, num_pe, g_sbsa_level, TEST_RULE); + if (status != AVS_STATUS_SKIP) + val_run_test_payload(TEST_NUM, num_pe, payload, 0); + + /* Get the result from all PE and check for failure */ + status = val_check_for_error(TEST_NUM, num_pe, TEST_RULE); + + val_report_status(0, SBSA_AVS_END(g_sbsa_level, TEST_NUM), TEST_RULE); + + return status; +} diff --git a/uefi_app/SbsaAvs.inf b/uefi_app/SbsaAvs.inf index 61d05276..b07490eb 100644 --- a/uefi_app/SbsaAvs.inf +++ b/uefi_app/SbsaAvs.inf @@ -148,6 +148,10 @@ ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c ../test_pool/exerciser/test_e016.c + ../test_pool/exerciser/operating_system/test_e017.c + ../test_pool/exerciser/operating_system/test_e018.c + ../test_pool/exerciser/operating_system/test_e019.c + ../test_pool/exerciser/operating_system/test_e020.c ../test_pool/mpam/operating_system/test_mpam001.c ../test_pool/mpam/operating_system/test_mpam002.c diff --git a/uefi_app/SbsaAvsNist.inf b/uefi_app/SbsaAvsNist.inf index a6769aa8..a5a54a95 100644 --- a/uefi_app/SbsaAvsNist.inf +++ b/uefi_app/SbsaAvsNist.inf @@ -148,6 +148,10 @@ ../test_pool/exerciser/test_e014.c ../test_pool/exerciser/test_e015.c ../test_pool/exerciser/test_e016.c + ../test_pool/exerciser/operating_system/test_e017.c + ../test_pool/exerciser/operating_system/test_e018.c + ../test_pool/exerciser/operating_system/test_e019.c + ../test_pool/exerciser/operating_system/test_e020.c ../test_pool/mpam/operating_system/test_mpam001.c ../test_pool/mpam/operating_system/test_mpam002.c diff --git a/val/include/sbsa_avs_exerciser.h b/val/include/sbsa_avs_exerciser.h index 8d807351..1c94c9be 100644 --- a/val/include/sbsa_avs_exerciser.h +++ b/val/include/sbsa_avs_exerciser.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,6 +28,32 @@ #define MASTER_ABORT_MASK 0x20000000 #define MASTER_ABORT_SHIFT 29 +#define CORR_RCVR_ERR_OFFSET 0 +#define CORR_BAD_TLP_OFFSET 6 +#define CORR_BAD_DLLP_OFFSET 7 +#define CORR_RPL_NUM_ROLL_OFFSET 8 +#define CORR_RPL_TMR_TIMEOUT_OFFSET 12 +#define CORR_ADV_NF_ERR_OFFSET 13 +#define CORR_INT_ERR_OFFSET 14 +#define CORR_HDR_LOG_OVRFL_OFFSET 15 +#define UNCORR_DL_ERROR_OFFSET 4 +#define UNCORR_SD_ERROR_OFFSET 5 +#define UNCORR_PTLP_REC_OFFSET 12 +#define UNCORR_FL_CTRL_ERR_OFFSET 13 +#define UNCORR_CMPT_TO_OFFSET 14 +#define UNCORR_AMPT_ABORT_OFFSET 15 +#define UNCORR_UNEXP_CMPT_OFFSET 16 +#define UNCORR_RCVR_ERR_OFFSET 17 +#define UNCORR_MAL_TLP_OFFSET 18 +#define UNCORR_ECRC_ERR_OFFSET 19 +#define UNCORR_UR_OFFSET 20 +#define UNCORR_ACS_VIOL_OFFSET 21 +#define UNCORR_INT_ERR_OFFSET 22 +#define UNCORR_MC_BLK_TLP_OFFSET 23 +#define UNCORR_ATOP_EGR_BLK_OFFSET 24 +#define UNCORR_TLP_PFX_EGR_BLK_OFFSET 25 +#define UNCORR_PTLP_EGR_BLK_OFFSET 26 + typedef struct { uint32_t bdf; uint32_t initialized; @@ -42,8 +68,36 @@ typedef enum { EXERCISER_NUM_CARDS = 0x1 } EXERCISER_INFO_TYPE; +typedef enum { + CORR_RCVR_ERR = 0x0, + CORR_BAD_TLP = 0x1, + CORR_BAD_DLLP = 0x2, + CORR_RPL_NUM_ROLL = 0x3, + CORR_RPL_TMR_TIMEOUT = 0x4, + CORR_ADV_NF_ERR = 0x5, + CORR_INT_ERR = 0x6, + CORR_HDR_LOG_OVRFL = 0x7, + UNCORR_DL_ERROR = 0x8, + UNCORR_SD_ERROR = 0x9, + UNCORR_PTLP_REC = 0xA, + UNCORR_FL_CTRL_ERR = 0xB, + UNCORR_CMPT_TO = 0xC, + UNCORR_AMPT_ABORT = 0xD, + UNCORR_UNEXP_CMPT = 0xE, + UNCORR_RCVR_ERR = 0xF, + UNCORR_MAL_TLP = 0x10, + UNCORR_ECRC_ERR = 0x11, + UNCORR_UR = 0x12, + UNCORR_ACS_VIOL = 0x13, + UNCORR_INT_ERR = 0x14, + UNCORR_MC_BLK_TLP = 0x15, + UNCORR_ATOP_EGR_BLK = 0x16, + UNCORR_TLP_PFX_EGR_BLK = 0x17, + UNCORR_PTLP_EGR_BLK = 0x18, + INVALID_CFG = 0x19 +} EXERCISER_ERROR_CODE; -void val_exerciser_create_info_table(void); +uint32_t val_exerciser_create_info_table(void); uint32_t val_exerciser_init(uint32_t instance); uint32_t val_exerciser_get_info(EXERCISER_INFO_TYPE type, uint32_t instance); uint32_t val_exerciser_set_param(EXERCISER_PARAM_TYPE type, uint64_t value1, uint64_t value2, uint32_t instance); @@ -54,6 +108,7 @@ uint32_t val_exerciser_ops(EXERCISER_OPS ops, uint64_t param, uint32_t instance) uint32_t val_exerciser_get_data(EXERCISER_DATA_TYPE type, exerciser_data_t *data, uint32_t instance); uint32_t val_exerciser_execute_tests(uint32_t level); uint32_t val_exerciser_get_bdf(uint32_t instance); +uint32_t val_get_exerciser_err_info(uint32_t type); uint32_t e001_entry(void); uint32_t e002_entry(void); @@ -71,5 +126,9 @@ uint32_t e013_entry(void); uint32_t e014_entry(void); uint32_t e015_entry(void); uint32_t e016_entry(void); +uint32_t e017_entry(void); +uint32_t e018_entry(void); +uint32_t e019_entry(void); +uint32_t e020_entry(void); #endif diff --git a/val/src/avs_exerciser.c b/val/src/avs_exerciser.c index 20d4e129..376fe2fe 100644 --- a/val/src/avs_exerciser.c +++ b/val/src/avs_exerciser.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,44 +29,146 @@ extern uint32_t pcie_bdf_table_list_flag; @param exerciser_info_table - Table pointer to be filled by this API @return exerciser_info_table - Contains info to communicate with stimulus generation hardware **/ -void val_exerciser_create_info_table(void) +uint32_t val_exerciser_create_info_table(void) { - uint32_t Bdf; + uint32_t num_ecam; + uint32_t seg_num; + uint32_t start_bus; + uint32_t end_bus; + uint32_t bus_index; + uint32_t dev_index; + uint32_t func_index; + uint32_t ecam_index; + uint32_t bdf; uint32_t reg_value; - uint32_t num_bdf; - pcie_device_bdf_table *bdf_table; + uint32_t cid_offset; + uint32_t dp_type; - bdf_table = val_pcie_bdf_table_ptr(); - /* if no bdf table ptr return error */ - if (bdf_table->num_entries == 0) + num_ecam = val_pcie_get_info(PCIE_INFO_NUM_ECAM, 0); + if (num_ecam == 0) { - val_print(AVS_PRINT_DEBUG, "\n No BDFs discovered ", 0); - return; + val_print(AVS_PRINT_ERR, "\n No ECAMs discovered ", 0); + return 1; } - num_bdf = bdf_table->num_entries; - while (num_bdf-- != 0) + for (ecam_index = 0; ecam_index < num_ecam; ecam_index++) { + /* Derive ecam specific information */ + seg_num = val_pcie_get_info(PCIE_INFO_SEGMENT, ecam_index); + start_bus = val_pcie_get_info(PCIE_INFO_START_BUS, ecam_index); + end_bus = val_pcie_get_info(PCIE_INFO_END_BUS, ecam_index); - Bdf = bdf_table->device[num_bdf].bdf; - /* Probe pcie device Function with this bdf */ - if (val_pcie_read_cfg(Bdf, TYPE01_VIDR, ®_value) == PCIE_NO_MAPPING) + /* Iterate over all buses, devices and functions in this ecam */ + for (bus_index = start_bus; bus_index <= end_bus; bus_index++) { - /* Return if there is a bdf mapping issue */ - val_print(AVS_PRINT_ERR, "\n BDF 0x%x mapping issue", Bdf); - return; - } - - /* Store the Function's BDF if there was a valid response */ - if (pal_is_bdf_exerciser(Bdf)) - { - g_exercier_info_table.e_info[g_exercier_info_table.num_exerciser].bdf = Bdf; - g_exercier_info_table.e_info[g_exercier_info_table.num_exerciser++].initialized = 0; - val_print(AVS_PRINT_DEBUG, " exerciser Bdf %x\n", Bdf); + for (dev_index = 0; dev_index < PCIE_MAX_DEV; dev_index++) + { + for (func_index = 0; func_index < PCIE_MAX_FUNC; func_index++) + { + /* Form bdf using seg, bus, device, function numbers */ + bdf = PCIE_CREATE_BDF(seg_num, bus_index, dev_index, func_index); + + /* Probe pcie device Function with this bdf */ + if (val_pcie_read_cfg(bdf, TYPE01_VIDR, ®_value) == PCIE_NO_MAPPING) + { + /* Return if there is a bdf mapping issue */ + val_print(AVS_PRINT_ERR, "\n BDF 0x%x mapping issue", bdf); + return 1; + } + + /* Store the Function's BDF if there was a valid response */ + if (reg_value != PCIE_UNKNOWN_RESPONSE) + { + /* Skip if the device is a host bridge */ + if (val_pcie_is_host_bridge(bdf)) + continue; + + /* Skip if the device is a PCI legacy device */ + if (val_pcie_find_capability(bdf, PCIE_CAP, CID_PCIECS, &cid_offset) + != PCIE_SUCCESS) + continue; + + dp_type = val_pcie_device_port_type(bdf); + val_print(AVS_PRINT_INFO, "\n dp_type 0x%x ", dp_type); + + /* Store the Function's BDF if there was a valid response */ + if (pal_is_bdf_exerciser(bdf)) + { + g_exercier_info_table.e_info[g_exercier_info_table.num_exerciser].bdf + = bdf; + g_exercier_info_table.e_info[g_exercier_info_table.num_exerciser++] + .initialized = 0; + val_print(AVS_PRINT_DEBUG, " exerciser Bdf %x\n", bdf); + } + + } + } + } } } - val_print(AVS_PRINT_DEBUG, " exerciser cards in the system %x \n", - g_exercier_info_table.num_exerciser); + + val_print(AVS_PRINT_ERR, " PCIE_INFO: Number of exerciser cards : %4d \n", + g_exercier_info_table.num_exerciser); + return 0; +} + +uint32_t val_get_exerciser_err_info(EXERCISER_ERROR_CODE type) +{ + switch (type) { + case CORR_RCVR_ERR: + return CORR_RCVR_ERR_OFFSET; + case CORR_BAD_TLP: + return CORR_BAD_TLP_OFFSET; + case CORR_BAD_DLLP: + return CORR_BAD_DLLP_OFFSET; + case CORR_RPL_NUM_ROLL: + return CORR_RPL_NUM_ROLL_OFFSET; + case CORR_RPL_TMR_TIMEOUT: + return CORR_RPL_TMR_TIMEOUT_OFFSET; + case CORR_ADV_NF_ERR: + return CORR_ADV_NF_ERR_OFFSET; + case CORR_INT_ERR: + return CORR_INT_ERR_OFFSET; + case CORR_HDR_LOG_OVRFL: + return CORR_HDR_LOG_OVRFL_OFFSET; + case UNCORR_DL_ERROR: + return UNCORR_DL_ERROR_OFFSET; + case UNCORR_SD_ERROR: + return UNCORR_SD_ERROR_OFFSET; + case UNCORR_PTLP_REC: + return UNCORR_PTLP_REC_OFFSET; + case UNCORR_FL_CTRL_ERR: + return UNCORR_FL_CTRL_ERR_OFFSET; + case UNCORR_CMPT_TO: + return UNCORR_CMPT_TO_OFFSET; + case UNCORR_AMPT_ABORT: + return UNCORR_AMPT_ABORT_OFFSET; + case UNCORR_UNEXP_CMPT: + return UNCORR_UNEXP_CMPT_OFFSET; + case UNCORR_RCVR_ERR: + return UNCORR_RCVR_ERR_OFFSET; + case UNCORR_MAL_TLP: + return UNCORR_MAL_TLP_OFFSET; + case UNCORR_ECRC_ERR: + return UNCORR_ECRC_ERR_OFFSET; + case UNCORR_UR: + return UNCORR_UR_OFFSET; + case UNCORR_ACS_VIOL: + return UNCORR_ACS_VIOL_OFFSET; + case UNCORR_INT_ERR: + return UNCORR_INT_ERR_OFFSET; + case UNCORR_MC_BLK_TLP: + return UNCORR_MC_BLK_TLP_OFFSET; + case UNCORR_ATOP_EGR_BLK: + return UNCORR_ATOP_EGR_BLK_OFFSET; + case UNCORR_TLP_PFX_EGR_BLK: + return UNCORR_TLP_PFX_EGR_BLK_OFFSET; + case UNCORR_PTLP_EGR_BLK: + return UNCORR_PTLP_EGR_BLK_OFFSET; + default: + val_print(AVS_PRINT_ERR, "\n Invalid error offset ", 0); + return 0; + } } @@ -243,19 +345,11 @@ val_exerciser_execute_tests(uint32_t level) return AVS_STATUS_SKIP; } - /* Create the list of valid Pcie Device Functions */ - if (val_pcie_create_device_bdf_table()) { + if (val_exerciser_create_info_table()) { val_print(AVS_PRINT_WARN, "\n Create BDF Table Failed, Skipping Exerciser tests...\n", 0); return AVS_STATUS_SKIP; } - if (pcie_bdf_table_list_flag == 1) { - val_print(AVS_PRINT_WARN, "\n *** Created device list with valid bdf doesn't match \ - with the platform pcie device hierarchy, Skipping exerciser tests *** \n", 0); - return AVS_STATUS_SKIP; - } - - val_exerciser_create_info_table(); num_instances = val_exerciser_get_info(EXERCISER_NUM_CARDS, 0); if (num_instances == 0) { @@ -290,6 +384,12 @@ val_exerciser_execute_tests(uint32_t level) status |= e015_entry(); status |= e016_entry(); + if (level > 6) { + status = e017_entry(); + status |= e018_entry(); + status |= e019_entry(); + status |= e020_entry(); + } val_print_test_end(status, "Exerciser"); val_smmu_stop(); From 73ea2d53a25cf02037940723d01c3b3d73b2d44b Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Fri, 13 Jan 2023 13:08:37 +0530 Subject: [PATCH 6/8] SBSA Document Changes - Updated README & Documents. - Updated Copyright Headers. Signed-off-by: Rajat Goyal --- README.md | 82 ++-- ..._Architecture_Compliance_Test_Scenario.pdf | Bin 646689 -> 569606 bytes ...BSA_Architecture_Compliance_User_Guide.pdf | Bin 236986 -> 263314 bytes ...ture_Compliance_Validation_Methodology.pdf | Bin 502745 -> 596973 bytes docs/Arm_SBSA_NIST_User_Guide.md | 24 +- docs/testcase-checklist.md | 396 +++++++++--------- .../exerciser/operating_system/test_e017.c | 2 +- .../exerciser/operating_system/test_e018.c | 2 +- .../exerciser/operating_system/test_e019.c | 2 +- .../exerciser/operating_system/test_e020.c | 2 +- 10 files changed, 245 insertions(+), 265 deletions(-) diff --git a/README.md b/README.md index 0d5a140f..9de58423 100644 --- a/README.md +++ b/README.md @@ -3,27 +3,27 @@ ## Server Base System Architecture -**Server Base System Architecture** (SBSA) specification specifies a hardware system architecture based on the Arm 64-bit architecture. Server system software such as operating systems, hypervisors, and firmware rely on this. It addresses processing element features and key aspects of system architecture. +**Server Base System Architecture** (SBSA) specification specifies a hardware system architecture based on the Arm 64-bit architecture. +Server system software such as operating systems, hypervisors, and firmware rely on this. It addresses processing element features and key aspects of system architecture. -For more information, download the [SBSA specification](https://developer.arm.com/documentation/den0029/e/?lang=en) +For more information, download the [SBSA specification](https://developer.arm.com/documentation/den0029/h/?lang=en) ## SBSA - Architecture Compliance Suite -SBSA **Architecture Compliance Suite** (ACS) is a collection of self-checking, portable C-based tests. -This suite includes a set of examples of the invariant behaviors that are provided by the [SBSA specification](https://developer.arm.com/documentation/den0029/e/?lang=en), so that implementers can verify if these behaviours have been interpreted correctly. -Most of the tests are executed from UEFI Shell by executing the SBSA UEFI shell application. -A few tests are executed by running the SBSA ACS Linux application which in turn depends on the SBSA ACS Linux kernel module. +SBSA **Architecture Compliance Suite** (ACS) is a collection of self-checking, portable C-based tests. +This suite includes a set of examples of the invariant behaviors that are provided by the [SBSA specification](https://developer.arm.com/documentation/den0029/h/?lang=en), so that implementers can verify if these behaviours have been interpreted correctly. +Most of the tests are executed from UEFI Shell by executing the SBSA UEFI shell application. +A few tests are executed by running the SBSA ACS Linux application which in turn depends on the SBSA ACS Linux kernel module. ## Release details - - Code Quality: REL v6.1.0 - - The tests are written for version 6.1 of the SBSA specification. - - BSA rules referenced in SBSA checklist and common in BSA and SBSA checklist are covered as part of BSA ACS - - For complete SBSA 6.1 coverage, run BSA binary and SBSA binary. + - Code Quality: REL v7.1 BETA-0 + - The tests are written for version 7.1 of the SBSA specification. + - The release includes test which are not verified due to platform dependency. Please refer to [testcase-checklist](docs/testcase-checklist.md) for these tests. - The compliance suite is not a substitute for design verification. - To review the SBSA ACS logs, Arm licensees can contact Arm directly through their partner managers. - - To know about the gaps in the test coverage, see [Testcase checklist](docs/testcase-checklist.md). + - To know about the gaps in the test coverage, see [Test Scenario Document](docs/Arm_SBSA_Architecture_Compliance_Test_Scenario.pdf). ## GitHub branch @@ -31,9 +31,9 @@ A few tests are executed by running the SBSA ACS Linux application which in turn - To get the latest version of the code with bug fixes and new features, use the master branch. ## Additional reading - - For details on the SBSA ACS UEFI Shell Application, see the [Arm SBSA ACS User Guide](docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf). + - For details on the SBSA ACS UEFI Shell Application, Linux Application and PMU Linux Application see the [Arm SBSA ACS User Guide](docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf). - For details on the design of the SBSA ACS, see the [Arm SBSA Validation Methodology Document](docs/Arm_SBSA_Architecture_Compliance_Validation_Methodology.pdf). - - For information about the test coverage scenarios that are implemented in the current release of ACS and the scenarios that are planned for the future releases, see the [Testcase checklist](docs/testcase-checklist.md). + - For information about the test coverage scenarios that are implemented in the current release of ACS and the scenarios that are planned for the future releases, see the [Test Scenario Document](docs/Arm_SBSA_Architecture_Compliance_Test_Scenario.pdf). ## SBSA ACS Baremetal Reference Code Bare-metal reference code is added as part of this release. For more information, see @@ -50,19 +50,18 @@ To enable the export of a few kernel APIs that are necessary for PCIe and IOMMU ## ACS build steps - UEFI Shell application ### Prebuilt images -Prebuilt images for v22_10_REL6.1.0 release is available in the prebuilt_images folder of the master branch. The prebuilt images of previous release are present in [release branch](https://github.com/chetan-rathore/sbsa-acs/tree/release/prebuilt_images). You can choose to use this images or build your own image by following the steps below. If you choose to use the prebuilt image, jump to the test suite execution section below for details on how to run the application. +Prebuilt images for v23_01_REL7.1.0_BETA-0 release is available in the prebuilt_images folder of the master branch. The prebuilt images of previous release are present in [release branch](https://github.com/chetan-rathore/sbsa-acs/tree/release/prebuilt_images). You can choose to use this images or build your own image by following the steps below. If you choose to use the prebuilt image, jump to the test suite execution section below for details on how to run the application. ### Prerequisites - Before starting the ACS build, ensure that the following requirements are met. +Before starting the build, ensure that the following requirements are met. - Any mainstream Linux based OS distribution running on a x86 or AArch64 machine. +- Install GCC-ARM 10.3 or later toolchain for Linux from [here](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads). - git clone the edk2-stable202208 tag of [EDK2 tree](https://github.com/tianocore/edk2). - git clone the [EDK2 port of libc](https://github.com/tianocore/edk2-libc) SHA: 61687168fe02ac4d933a36c9145fdd242ac424d1. -- Install GCC 7.5 or later toolchain for Linux from [here](https://releases.linaro.org/components/toolchain/binaries/). - Install the build prerequisite packages to build EDK2.
Note:
- The details of the packages are beyond the scope of this document. -- GCC 7.5 is recommended toolchain, build issues are observed with toolchain version 10.xx and above. To start the ACS build, perform the following steps: @@ -77,22 +76,12 @@ To start the ACS build, perform the following steps: ### Linux build environment If the build environment is Linux, perform the following steps: -1. export GCC49_AARCH64_PREFIX= GCC7.5 toolchain path pointing to /bin/aarch64-linux-gnu- in case of x86 machine.
For AArch64 build it should point to /usr/bin/ +1. export GCC49_AARCH64_PREFIX= GCC 10.3 toolchain path pointing to /bin/aarch64-none-linux-gnu- in case of x86 machine.
For AArch64 build it should point to /usr/bin/ 2. export PACKAGES_PATH= path pointing to edk2-libc 3. source edksetup.sh 4. make -C BaseTools/Source/C 5. source ShellPkg/Application/sbsa-acs/tools/scripts/avsbuild.sh -### Windows build environment -If the build environment is Windows, perform the following steps: -1. Set the toolchain path to GCC53 or above. -2. Setup the environment for AArch64 EDK2 build. -3. Setup the environment for PACKAGES_PATH. -4. Build the SBSA shell application. - For example, - build -a AARCH64 -t GCC49 -p ShellPkg/ShellPkg.dsc -m - ShellPkg/Application/sbsa-acs/uefi_app/SbsaAvs.inf - **Note:** To build the ACS with NIST Statistical Test Suite, see the [SBSA_NIST_User_Guide](docs/Arm_SBSA_NIST_User_Guide.md) ### Build output @@ -135,14 +124,16 @@ On an emulation environment with secondary storage, perform the following steps: 1. Create an image file which contains the 'Sbsa.efi' file. For Example: - mkfs.vfat -C -n HD0 hda.img 2097152 - - sudo mount -o rw,loop=/dev/loop0,uid=`whoami`,gid=`whoami` hda.img /mnt/sbsa. If loop0 is busy, specify the loop that is free + - sudo mount -o rw,loop=/dev/loop0,uid=`whoami`,gid=`whoami` hda.img /mnt/sbsa. + If loop0 is busy, specify the loop that is free - cp "/Sbsa.efi" /mnt/sbsa/ - sudo umount /mnt/sbsa -2. Load the image file to the secondary storage using a backdoor. The steps followed to load the image file are emulation environment-specific and beyond the scope of this document. +2. Load the image file to the secondary storage using a backdoor. + The steps followed to load the image file are emulation environment-specific and beyond the scope of this document. 3. Boot the system to UEFI shell. 4. To determine the file system number of the secondary storage, execute 'map -r' command. 5. Type 'fsx' where 'x' is replaced by the number determined in step 4. -6. To start the compliance tests, run the executable Sbsa.efi with the appropriate parameters. +6. To start the compliance tests, run the executable Sbsa.efi with the appropriate parameters. For details on the parameters, see the [SBSA ACS User Guide](docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf) 7. Copy the UART console output to a log file for analysis and certification. @@ -154,8 +145,9 @@ On an emulation platform where secondary storage is not available, perform the f 1. Add the path to 'Sbsa.efi' file in the UEFI FD file. 2. Build UEFI image including the UEFI Shell. 3. Boot the system to UEFI shell. -4. Run the executable 'Sbsa.efi' to start the compliance tests. For details about the parameters, - see the [SBSA ACS User Guide](docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf). +4. Run the executable 'Sbsa.efi' to start the compliance tests. + For details about the parameters, see the [SBSA ACS User Guide](docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf). +> shell> Sbsa.efi 5. Copy the UART console output to a log file for analysis and certification. @@ -170,17 +162,17 @@ The patch for the kernel tree and the Linux PAL are hosted separately on [linux- ### 1.1 Building the kernel module #### Prerequisites - Linux kernel source version 5.11, 5.13, 5.15, 6.0. -- Linaro GCC tool chain 7.5 or above. +- Linaro GCC tool chain 10.3 or above. - Build environment for AArch64 Linux kernel.
NOTE:
- Linux version 6.0 is recommened version. -- GCC 7.5 is recommended toolchain, build issues are observed with toolchain version 10.xx and above. +- GCC 10.3 is recommended toolchain. #### Porting steps for Linux kernel 1. git clone https://gitlab.arm.com/linux-arm/linux-acs sbsa-acs-drv 2. git clone https://github.com/ARM-software/sbsa-acs.git sbsa-acs 3. git clone https://github.com/torvalds/linux.git -b v6.0 -4. export CROSS_COMPILE= pointing to /bin/aarch64-linux-gnu- +4. export CROSS_COMPILE= pointing to /bin/aarch64-linux-gnu- 5. git apply /sbsa-acs-drv/kernel/src/0001-BSA-ACS-Linux-6.0.patch to your kernel source tree. 6. make ARCH=arm64 defconfig && make -j $(nproc) ARCH=arm64 @@ -222,8 +214,18 @@ Arm Enterprise ACS test suite may run at higher privilege level. An attacker may Validating the compliance of certain PCIe rules defined in the SBSA specification requires the PCIe end-point to generate specific stimulus during the runtime of the test. Examples of such stimulus are P2P, PASID, ATC, etc. The tests that requires these stimuli are grouped together in the exerciser module. The exerciser layer is an abstraction layer that enables the integration of hardware capable of generating such stimuli to the test framework. The details of the hardware or Verification IP which enable these exerciser tests are platform specific and are beyond the scope of this document. - - Some PCIe and Exerciser test are dependent on PCIe features supported by the test system. - Please fill the required API's with test system information. +### SBSA Level 7 tests dependencies + - MPAM test will require EL3 firmware to enable access to MPAM registers from lower EL's. + If arm trusted firmware is used as EL3 fimrware, enable ENABLE_MPAM_FOR_LOWER_ELS=1 in tf build + - RAS test will require EL3 firmware to enable access to RAS registers from lower EL's and forward RAS related exceptions to lower EL's. + If arm trusted firmware is used as EL3 fimrware, enable EL3_EXCEPTION_HANDLING=1 RAS_EXTENSION=1 HANDLE_EA_EL3_FIRST=1 RAS_TRAP_LOWER_EL_ERR_ACCESS=0 in tf build + - If the above flags are not enabled, MPAM and RAS test can lead to exception at EL3. + - MPAM test will require system to implement MPAM, SRAT, HMAT, PPTT tables. + - RAS test will require system to implement AEST, RAS2, SRAT, HMAT, PPTT tables. + - PMU test will require system to implement APMT table. + - Entrophy rule will require ACS to build with STS package + +**Note:** To build the ACS with NIST Statistical Test Suite, see the [SBSA_NIST_User_Guide](docs/Arm_SBSA_NIST_User_Guide.md) |APIs |Description |Affected tests | |-----------------------------|------------------------------------------------------------------------------|------------------------| @@ -246,10 +248,10 @@ SBSA ACS is distributed under Apache v2.0 License. ## Feedback, contributions, and support - For feedback, use the GitHub Issue Tracker that is associated with this repository. - - For support, send an email to "support-enterprise-acs@arm.com" with details. + - For support, send an email to "support-systemready-acs@arm.com" with details. - Arm licensees may contact Arm directly through their partner managers. - Arm welcomes code contributions through GitHub pull requests. See GitHub documentation on how to raise pull requests. -------------- -*Copyright (c) 2018-2022, Arm Limited and Contributors. All rights reserved.* +*Copyright (c) 2018-2023 Arm Limited and Contributors. All rights reserved.* diff --git a/docs/Arm_SBSA_Architecture_Compliance_Test_Scenario.pdf b/docs/Arm_SBSA_Architecture_Compliance_Test_Scenario.pdf index f6258902406e5b344aaf7fbedf0931cea351416f..0ac5276207e060f25d9faf2449436ae0cbf059d8 100644 GIT binary patch literal 569606 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 ZpyJ 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�hF?g(N+m6b6KTRXGC-=RW5I?$9mFp-yKG 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 z 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%0AIhA7L<`C~`nL&BR46g|9>gM#C;7>Yu{2wJYad z5&h_=ac+MWZ88rH{_K^q^?=NpD-rjqVi&J)Nf75^qBtZf?O5_N7uNLFuY^U(j$M3J zv3iN4`_@^$qk{9apL@ArD=x`pr2O&r>4UxIHcWShMy#YqHZ56mhPM zu>iP>xm_(geUgeYor{YyC|mUSMSpy?&HQi&em})T2Y-)?k9|*hk$thBgbT3Z(|9*Y zDu>q7HzVoznyWHlf7=I`OrWpFtAson&Q!N(7vCfb1D+vb&{!0C znGPTUMj*(8z+c7%4dwH)a8(5;6bzMwN-8KTz@f?tN>DgVNd*FzgeWLV!ypJ*C72RS zRaHt64wnK;sX(QrrBqavAmk$$SV=+^N`6)xsDZa40H9LaTIu~U%D^S0fO-T1X{%r> zhE5NtkM+Q89qrtyGuFdc0gcW}03ZMf({J~bZ2HDq8iL+Ba=!dBHF{z;p$lt$tBnJ4 z0%A4sFgmrwK_&3=zKmYM!i`;u;t?~fQjc>3X&*}s0ThL({mb))lbJ0ad3GWDbDAnn z@*mHR94(UbnBVXoSsj|ac(J8=qnTbim=7Cq#XaBI=&|jBsbs#rRjJDCymvua$Gd4o zwRx@==-zSn3@_CXAlo$;Y*$QD+Nwc;>P?o>sD|1+=`tmgQLgxfvXR))Ca1)XV|tU1 zMBx3)Wl`ewH!B;gh^<+D&1(-P#gs=0YER4A>a1mrk~}9X@?)xM;}AJdzq|_`$xKwS z6Zd@hE@URM-^uB@)7ZtiU@k8+pqkw=kwY<==AQWAmDmbwL;1~aiVqtuk%Xn#ZpVfj zMg2+>;SJPqA-m&85)RsoW~Rv*i3={qzTt|Yc2S$Kt*s+=*8AYjoG8-2xvEESzukxG zv^m_`w#Mp&4)u6)76A*&iJW>}3q_UAU`U9R{a zvwdP&y);L&dCTlx|Hi=Q{FCG@td1^bmj0q=k=NUZBsU_)ijGD?0!~N6&#$7RN=Nhm E0BShy8~^|S literal 646689 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%0D<%!~F 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 diff --git a/docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf b/docs/Arm_SBSA_Architecture_Compliance_User_Guide.pdf index 94d66dc3d33c81b9c7efb22b94007fb8e1a63d2a..ec34a9c8a8e76b55b6901252b0a9a095cb2fa00e 100644 GIT binary patch delta 214499 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

k&5?Z%}~6qyK3k%s%`SyAQhdn~5sz@5%*%v1V= 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 delta 187766 zcmb@t1z40@*Dy>-NGb{i56@`(OWXdClDG-g~dyYpuQ3Ha7HDeFGjqtMFKi1=N={CQHa|bEv5nF7VwC^+;9|Ks7@Pcsi3{Mw#RC2P0mCSN{Gzn^ z34?HfxPF7dq3plH*uk8fzrmoO-(eh3$bXLmKnPm7!2b;dfuIoZZKOKnUvBaWF0zoDzW_@%azOoRHs%;pF^%G8dQ&p{M_z%f$))4F(5;e?tuC z0Kx!}JN2t#ba z-{wNV?7td1Cjf>*ejUgOhH?CA3!Gs1Z%8;HP>x?Y=7ezkwo4F7;{26BID`X!t)^@F z|08}l1kUxVfxy|pzYz#$hk$?K1PnsR|92P{$8RtW@V|G-5B-Bd98k_*^n`%He|0K| znF!bL-moNuNm;?S;1S*CwC{a$h5J;HoF+VTj8zCB)s0aiKc`OR$ z5aIxdafv`VIE4}Xh>D2vYqKdh7`yxk$eiqm5RB#Mr0?MLSI`CFV$sry%8TJ*{S}Y_ zN=jTT2m~R)pD|y|+{($=flbUx-^uu~v7xPzF`FbMn1c(BNB|Jdnw?F?*v8b!j1q?U ziO2*vI5^pqC=nZji=W@o$-!9P8W+oK!9Y(>&p>Z6-$c()PcNmFvg;X=pCA~9PJ|wX zj}v@~BSK7!_w2C%j2C#>bF#9y^C9X6y4Y({Mt!M=R@D&@3{y6(S%vphK4PB;|;`bk~q$|hIr8Sm)2vvCPeT*KD$x|)Hctw#VrF*r-^74YQMVnE0% zGoxgqb(iTLiZJcO!pcIZ>JDt~_^e$!tv|_-9@s7N*kWrXn4-$W0{5qVJN1V}(vL!P znKh5rr*@8lrD18`SPolEPd$nv{cmZiEoWeSQj0uta~s0zce-!s-?Pu?oPYgph&H!>x~-q zJxS{%5eqtOjj<#T;dBr=42{yVo4LcDhZxK(dW*&Ky5Aor(L6FM1{p zhDtJCri=y#tE|=iTIkXc>f4*atO~66oEkWZP)wLv4WlNI5nE77;G?eYV*((EQQ~rM*2BDqDqN6d07QgPh&*tf11QTJse-z!g1+8NfSEB&NZE??^>)e}E*2s;1^%|#zthye_T|s)SKr2z!PtgH zS?Lj*tg(~6k-n2YVy_}16k@N+J3Cn+vSUX?@{4da2!MjVsj-Z{fw2_=bnTJ;2FYG; zAZ176pW}awyB>n@9f%>oQ+GRKHW9?iR<@@9NtY1`HsbZ)bO>7+8ygARx@lgo3IjtZ z5owP$n~1HAld+AHqb4HQTrY*#gV%GezY(G5$M+Ay5YGrFeEobK)PH>cK#h1tcpZRJ z5wVnmt=(_y%NiS*>;DE-(04!}{fB%-V@F$O2g7SIu>Zh{aBofs$3Y2Vd+K0r{oC{( z++IuSC#!%3?q4(i=2gVj%GN>2PT$ZN;WHl_o9H`RIVp+@BbfLhc7A>~F$CX;cVdX> z0KSeI2qB6gygiux2bYN7a7r-eU*1&=kr9BQe+gO)p%cXU`%yl(DgU+-y#j6@z3A_g>n27 zPHM*bP)Cpv2Ni@=e%Y-*bo-N)pCbJsQIWqSDr0VH=JY#PoQVADe<@M`A=4kTe#rWV z75+=6Kdkeb5KT5o5fNboDTos@$B!MM{qqP6zCO496#Q?z|A%!r_#f7>+)}mUXTxSe zw}OD(!@Ko!I?QkJ-n#1FjE@&)^~f}*XiZ!#&MJ>w(OTVM+Dge)5W#CP5o7<@^?KRv z!ig+cneby$cgAwznLdtmqg+jg_;|-5=u6cT{k@|6iygL|Mkd9*&pz5KYh1^16>fpE z%;{2u0wWn)^>gE+ogn9Zf2{J46D=%MtnF@qihK)RUgzd#*kH>FZB!BCp$3`AB@3SJ z%&DbkXkphmFNKH$$;7!M*44)TA-}kB#l+ZR-mNmnt(B3ejapBp(Mna@jM2)EE?0v( z;{nc1fNfH+XGXfW3U@&Tl(r`mrN=~BnITEp@QJcY^^}Db`nb^=$rv_l-;4GO;rJ_n ztdN@Z6)&uSJ@Y-$e!Rw6WWF>*$_VZ0lv2BDIBxUI>qW=0SNi#SL!dDZte}_8X2hvR zx6mzyL1SzT#3bEFBBEs+IFb1eNE?WW$)+Pg3dy&F@X$o4(^H?wZs3|4eMT!e}NU#2K~uwep*d-OcSR~Rpkk-egoL<~tg>$+wqCpaaug7_{Tn42`~9vJNg%Lixa${c$?NHNrsnZ(~A zV_R{yc~!7d08qG0B)_#KQvU4fSemQ-)`ow9RhpL~$Of9OyyHBQ@WDu60$}a+Vwb0w zEsvs*A#K?CUQ-w8D3IDWTJ~*aWoMsT7FdSkg?EoOa8-S_J-*C&*{rf*RuR8(I#e2d zwszcTb5*mvVIB5?*7|eS{aLrXd9AMZ3EucCFU7Vjnu3R!!ivVej3G_0qzoP$3CnCXy?R(E)uWpK(p#g9Dwj~h zV8)cjO4;ZupaRHb}>=lc}V6}=){u~(V%PJ)VR*mV)Wip-Ej`A1N3>ke-OjmZ??oZEN&PL3d92q`?O}gutnv#s0 zn*lZ}6%@;c>+&mAJ5mAw@+}No??0OBb-?()Irx8^92g9P{>NM;Lbp}>ZRWUen$I77 zMR_8+Nx^^xjWZfvsOJ&H7n0j~8~$(<5OtWI)a{A2(oiuSc@TELHJSLWc~~~TPj+@5 za=@#P%Jruq%cJ^kjF4MTB+L8+qbELn{fv5^uYE>wl!0!VEfxVbvdpK+%%LX<`zokW zwm_~hcOgy3&)i3Lgp8g&$xxiw7PKuRdDrPa?q{N*kd3nTBOf zk9Gy{yOA1ipWFJ!wDm&-db+fY-bDv$2+NNKs^=G(V0M0YBJ5}QO7Ma?ssfs(ehkCU zZG?1eJu$mkss5G;o#W7JG`wLW2M>VBxXd2TVK;2$V7%8x6JDaZp*&9vn=#3X^TET+ zw5WK5LL|T&OztK)N$IN&ZF;2Q)ko5myg^5R9O~TmS%y1%a~Sutlc;l=8$J1xn&h&$ zL@OC#POKQS%2%%vT#COLzRYqHx18yIa%m+EHsF2xd305*rk2E9L`x~yv#tQpN!8gm z{{S)zD~Y#KOS0-FcIF;^buYVY~-q3n#g=WGnn-OB8oo9T5xu`NwQ1*vo9Vk#PZ>b=N_*)Zx>@BajT>F@QTD^P1+Tq6C=Z_a z$`Y!r?}iPjeKZhnPcSd9guF-xWY?RjaKqx*;fdUPARb0*YGs@)?y1A60q}dzkcN2I@&(EC;TF>9ib{mtt-EOY^ahLeJ~a zba`g>avg^X&@w0j5BxrE$6@t!)$}OsU4Vw-lpn&)hTkZP&-Js3?9HZw&QbC4Dx^Q_F;r^N%4*=9kbQRe6~C&5Oj`Fu~%nynG`Fo zH}t`H>0$VT4&89OXQ~mXrbPCVClBYqBaR)DQDE!%c?Qpccdfv^7NXOH#zae z;luC=U^+;#>XGB4(9|_Dr<|zKZT|;-dG;D(_~FSxqkT@Uh7U5T+IzDcY^xfMnvxDR z$8vDzQ#22a8N>2Qb)b`xPEs1!L_(fDTgHCM6FWfpVSGsZ+vU< z>(wfztPlBe_KH;NvEA)CLUhi<4xUMJZfguWIDirnm#lcoYNDjSwwf)*V7Qzm8U-Hy z@_owFg09LlrzYdU;=>1bBYeTCAHFK?6^h$U-qX72H)#3THF9`d#A6F}j0&=1njK)2A}RbjPjz3CLZ&oEjlGo&X%jESnR5!fBUhu$NY>|*Tk2r)$P zg$kfggL(X-g-PTi3Jwzc`IER`^z)Z`t~2icSv_38sD}rk9-JW8G{1ZKLQf{PZlulP zk%!4y$Ku)hdVD^T)>L^QHvym!?a9LkU!FbmqIv%wst`dQ+{#Qs{wRo*t{YC^8k<@g zZyMSBY21r+BHKqp2HHfIwIP0ZTuR8F)Ti5iX5zV3R>L4I?g5rx?^OHl*R8YdA@`m5 zQ`SW@uahsQ$b|xb{kt?t>34KyZ0^bLrw7)v^=bgaJGI}O)LN~a^(ukPy!-z=RFdSRJF zmqfR-#&4q|N)bUKdPI?Ocl|>p>sbj%CFNWXG+xPjm^YJ5WV_7CKz#sNVR`)itrV4$ z7wiB@iH()z_oLhHTaO3(4G-syh&}B$V+)_LZ#PJH=ID5&hR6ER_hof#d&X# zN3;d88{0i(WB;hee-#>js_}O%B6>*wZ#NmDpEBpHxChsmoRw>j-1RUmQ&+yA&Bs&SoN>Ibu`n+_z?yHz}R>GBY{l zAnJ?nNa(^8BE0C-jNT83Vo|-@cmB%9Ma{+E-djgL_g?OE%rJE&H-rT+ZrV9Du>O;a}NO6Zrs+1hgtpSE&pe#-Q_#-epD@wZP6vyv)ewfMRhUWM{A^@KSb zF?1R^xM+&rZ@xi{#N#8O_b03PQHA`UeKh1>{RG6`o&=;V+68gY7n|h4^tU`BAncu8 zg%}Lhh|_D`)hh=pMNV^JSD`&akYT?_>?zT)&)LgtJFP=)N!OCb2h?1_QI^ko^~rCB zs`KufKnI&;GVUmCjbkaX9lo)Id#661w&80^_-0NqDL-R;Mt4-7D`@muG@-zBQ9EsWl>sK0BOFbMkQZ z0yu-egG*0g!%5*YBZ&dlX*K^nBx40R`8sD35yAWMl}e>wvTysat{t$nBH6y+ocg0i zt_zI+lSTkacJ}|&3HA9|f$4~|?ZdD9 zH#cHa1F(Y4J?#ZHbpuve4J|X;;J5L&2&r5m2q}iD;31# z{PM=E&o3R4(l3YWcLj)ci&`|8j^vVfc4fZD-(DL#Ti^I%`u2TO!Fle{+;Y||@7_kn zu47tZN%URFnpuJ^YwCbx_&puKso`)3bP(}mkvQsV?LP+b)^0fqr@LL+1uR#F*xKz% z1MjLC5ytf?egpF@5xTL$gH(sw1FiiD48%LRjqI^S39g_OeR5086pSCk`ibQJHp>s6 z2@&?=)}vmlf^aSm(hkVlCf*^|^jE@DO@}irAgofMhwY9xHVCQPk_K^=>i4qwbqD^Z zLauAo*A0RsJ3&;UKQsWYuNnO>OXUay`m5*irv|`}PRrjm{S!CakCMGGlSq<69?IQ6 z5%Ht9^S|suTwftVv}68A#J{_1|J64TWfDpXeT<6p2O{AApCs{DW9g4X{68I5Nd766 zL7!A;RW>h%wK^Y01QzxG+uWj89B${&~df0eskUx4j^|hQ3C!T9DJ+&2=d@QSP_fId7?XfC?w*MxJ5)1>;|B&QQ zPmY**J>;4N$bT4NQ`H0|mG+{}0own%u?dF#EBgH3-8SSu5dhJxN@=wN@UOOZu}^@j zt2WR(Yz?s&O-X{x5} z!d+vGrW2VhD_Pi76RW2ZSLdT#rw?M^OK#K185o;0OIMU=B;J*bN`YF7)YE?MQIN_) z6Yf=%z;>Y2es-Mj_AdI1fj%GwBkMUnd%K`7QPA5~fA=w!h22!owH!&!#r=(`gfDd) z7hm8lhnmeTA9uC#FsTC$h9uuV9Q^d9{sX*&?UG(twk2SpyLC8zD7kqGZ)dk{V`Fqb z`84CR&sRF(6DG_xA0s*kEAG>d*{f&K7I%avzFKurFgH4zB4w@j3x4DVu*py5vj}Si zZhlj)JS^CPxStKa`<}OSnG~be`n-175p&Jf|6F(Qyeypkg(qfKBF~ae$k~R7tJksg zw|CzSG4Ja}cE%RSV8489cJ6J&n~vFG*kgw=hbr*N{OiWm1+kAnFn?$J%r-qd%|p1E@s zQ4lXT8Qw8p7|BRfKl25=bxGvwM^Z;oyl%G9`V{I?QZFyB^7PB&p^sQa-al)4r@qA8 z*YtEyQ(u#Zo~~2oQoH$PIKCKP1HE3?V;F78w$$N3)tsg$GWeC5k)7q|nr9&_-!Bmt zhtobFs|oZ^){Z#j3BKq%LQh{FiWfAI@TBt&FmiYXDX`Ot-gvkR=mC-L%2V)x$akt? zm5UmBZP+~NchLtmE*{^0s@U~7JDEtP)hMwSYFT}P@t)S<Ea?vx#oxbi#luE4WXO`xAv-jb$DDDH zEHYsz5&>pwy?KHwpvcAZC|j8ls#@O)hwzubN5k+^{(KR=#;vNcLN*NtS7>fSle2WC z&#}{_C3fc7%d=HHN2fk!s7w-2qmAz9_E77d?j?LcAG%>lo}%{fo&WrC2HH`qv1K2T z8}lqIbY=DS8}E@7|1=!btM;LWC(668T4@8Sh@ulYBRyF4fQW+9D!HnF7j65YRWl=O zIJu5(3<*SUYJBtw5?j<1p2c7tealGGVvHZpy=NhtKuJfwEvvaDwUs9QLJODD)PaLL zNzH-9fz^IhV_R#vyZU_{4Yg{VqoiDE&Hyc1T_QZmp{si4QSInSG?TUnskqi>jTwpB zku|yafwJ#RZa^{8gI;|bWH%aB_C1NxgjVW0jc4KxB`6QN$FX>0i*OMycn~k}7Gt#1 zRJ4ToQc*gbV-TkmdVWV)^9LU@kw6H zS2`~D0uilPxoqsPx9=zAK?=xb7FlD7RD1lpJlf{5i_w_J5v~w3$x0pIR?z*jk2iKC z{e*VCKHxJWgEWH#gNfAiF^|#i)noO!CWtaWoUvbAr1X4%6V_s&@*-xtODg%#h5kL+!IP_tokJp=nh-B}f~$1E_jI>Oh29QFvH{m0&CbNroM^_ASzzor-ya zZrx#8CV>qsTd&LV^NZBqWZ%aIuh@j5+NyBG(eSo7hN~+dbFuiPNLXV&tLxp+aWEw3 z(%ZH8Hg#q*D7INN@)bUsVo}Cz-oiew<4HtB_W@;2M-tV-K5t%dQ@i?2u~VqMdh6Ky zA`P(Ygo;G+YzYW_gm+a^{QQmlUQRE{tqQr1CK>NnC~u3oT!|Q6nS|3InNt*LJ_usj z65R;+gy)m*oR`vekF!Pkil|kqcr;ftvuQlp#=jRcW`?p$nb=PuF<}%&5AOVm39aE_ zLmCh?#DId#Be>c0X4uhjXDZ`{aD)x-Wl;f<^8rE74>xhmx2d4sLsQab5{496RFOA@ zMM(ICR{}ryAbwzA;+m7uK(p;bhH!*dNDz=$oTY&U|MNj%-ZE zYx*6!tiZDU2)~dJ+d?EQ{~oT#+3jAvpbq;0IK%2I5Ow=QI;8iFfZqx#1HJgV2t-}) z#-qCq6tTVj2i8q|B#{I9m1FTLj0wioGY{s*)CN8|Gs;D>xM<=}j#yPbEhLuC(Vm@a zm+-gSGI^tJXyZS)tNA7M>wt9;t0Qbuoogp}%*)=|QCn0suB1cbrEckgc|WUCd2ex` zW%ZPCbOo2p!9_@|Il7k0d%t&|aG>RhHo+>*=_D@@sSU1>n1VhX-WX2m5P-BTjoRg(uIgxU2fA)TQ z-N_A(@aH-{{;s}#VNVh|`-G$J6EC%@y+94of7l0$aMDmt*9ro{?7?MY;~J!%FNkF0 z#Aev66WROZT|atdURI~!H#(esWy0U~YVx`2AGE?+s7}IV6>u8G7x;4MeG$wlbiU%b zi)HP{G0WD{t>WOGne{;4lp`qf9L&&@;5vW30|HHTyV$r6{@pdW)C z-^K-oA;3FLuxHI?+Xw#qb=;bVdoy?reIrpMF8D1MDc(nWz4c+2iK3p-q)*j}+)Bz# zIZyLHFHBaRo?MFEYB5jJFeH!>6IV)ZD#r>s!*g$Vy@LCF6^KT`sx3+SXaJyiDpTI8 zzkKEUVre3#%EaoOp?GmbOu39!R5?no8Z&n5ooN95>Y*2uuDywFq9~j1}+xgBq5Hir@ zUE1<(QLw4>@i<_e5<#O;*5tMo@-2vsqHbNQa8Tg`nK>WStYv44<=lp(jI}cUvzRuY zOaI>V?!3p2Ql5Cj^Yjec;_PE*cFZM$JoNLkJ&F1oZ%g8RwTb+4lS^`As+2aDvL86K zOK|dMoIIvNH3`MLRT;2TVHG`3$7lY`TmE@SyV-nx9*!?C$xdt)dh1yTEaKct-j7s` z$=%qVg)Y|s)Duekq%6^rnPkM@bu5G5>I-HrmK6oq*xKnTd33m0 zLtQzz^6v1Q-wU#QKm<)pIEoY(Cy-AknejLy4R7XY1Z zp83A4TW%DN>@TLMTgh3WIQgQjX`N8psOHKv-wWOYh5^GQAzL24o`-!9-fe&6Q5K9k zOZO=K7v}cZZ-nkXrgSoVd+$s4t$EWM{_5)@s$j;qpR7%iD=?2u3yOPRQV88bokv{t z$g?=a3Ro&f?O&n)24^Eb#@GGW!^-A39?ZlE$4SZEo$gIlS5KAvTFu@<(~P!{`Efu1 z!_D-u3m{JzlE{a&6@=6VB08n47$;;T6l}L}TgJ%Lu_kJw8SV6ywk0KJSu>V}y&j%; zsnt*Rm7DOWUH_^U*t0v0VNC~ zjc@V&pR^Zh#VnBS64f8S{i0!2e`9&f<3Z?l6Z_Oenj1~k)dw*m*V>F`xBilqw@dtA zmISN|qaw-38rK3z?+kvdtZWJ`4|DN)&}z*2{suMUVZ0qP0|)4#`TY-(UHRab?m01= z!zP`;nwq>f`u1HntKq$dd$O?p154)f1N-XcHzqnGzqj?w_HOIC%fQ*eUl zI?yNcs>M6!g?1^Ca}5Sa0+o1`X8JkNJ6!B8)bfNiBtStc=r(?xJd{)sImnHlNiAY~ z0-_Wn^g8jdD>Ti4u>p&DMbLo@Tbw|xG)SAoWLBdN-&{GEj`cNmM(qXRRo^7&YCm}4 z#Z)QC%vttzcyn^69F9%%KDLr}aAyz;H!zonr=60m_Z9T)2@RA#LsQRLoioGx^M{mX zXA?)CWF>~X-%ur)^Hy8@Z;UOO`;!GdqA3aPLXXBLz<}~SOahbLTMbFTk{B}k zs!}AB#av)LGBsaI%4tjV-%nxS}q@-T5}FWR{-dcNs`YtN+Ng6@#7nKXGgx-$i}Srd7Lwzymd z#n<2PJ_WtP`?FS^yhpDw)?Pg17kfN3BP{F7O>x)Yg9#dDN?BEPNb3T+x+(pH;EPwE z7|^UDS{z4{-SoRnH%}gF-%Wv(y{!)eilnOGfpzI0M$x{d8o1n#JP&)L{d$m@ul7Jj zQ@oj5_nyl{D8JZ2DOyO!X+9x~Tm0$bC>@Ep=x8-nT|`p%Dc7>l0WX%IflMR~Bg!2k zV*{rWcYI+=s?aJe844PS9@f#Xvw<&@p6a93=l=+F^p&N< zzkQD@DWPuxb^p@zyR=MMQn^mB!+zjjeSe^WEg*^Hzt+PqBCxCg72jehiv=T-2F;Sk%=2pdbdcsCQ!1ufUMhhUqAHM$qS@m7LSTodn8OK`OP|$H9D4jA}@?x zdXX*o0yv*?HjE19-)Hvh7x)%$GC~r(GPZRx+;Fv&s56;<=XEtZSOE!aC>455E!(*xNymua^jd;s8sea%ZvOTx^D z+H(XAcK%7Hd5*~f{G{uHff@Z5`*Wd5a<=a0fGz)_>@sR}(i;loY3|`v@y|E3lLTdq zvk6KqN{j;go~!Ftl$L#5$cP}ah2y1k2w}~}y54=;H_iz2k0DnjvVczH_Lqn(>4#f$ zjm=iRo-Pdb>#r9eHV1evlDC5SCI!lg&%Fd@Q_C0`nJjpnw!SpgkQcL+F(z$R&+67L zb#Z?~1`SY!Q`lqMF33u<^Kagd-lbztsWs7S&htnFN zf^t8Mt8Xr<<4G{!-MKu4?_)P9u&^NDbW9<4wdlO=-kGQ_Z)?|8e}HvZ_B}iUyFazX z$8PO8jSLbSr$3p@trSUF`<^)LqZ{uCk^Iz^*q`J|RFKm8Wf=<{ z(&z7-&=_9A*HQI(>6sm3S9}I(_N#%OE-p}GvD0CTA#c)E>XyK%DcJ$v`j5M0W;Wm9 z3a00}PIzPWm&7673^n-*nw)O3x|6=?VNva!w%k6oudjmW@1fi3q?SDBdNfYV8Tr9= z&Ito&9#do<8+a}%f3br3El@a8k29&proei3#LCrX#`7KL=_lM2SzM87du1VOrJc~z zFFXCpVNh%&PAb+WG7%A);w79fBg#>%oq4)D_Bk zr`WFlXu;{*QRr}B?n1C%v!`E)o@iT8x$ki-S@V0h4O$Dyj}ijBb5}!)rEN;`d2(Lg z{9n%$is_F5`P86?2KVy(T<%-!)gGE3Kg(VfVywQIEisK65uXK#9Jk>J-(Z1K(cb4w z>_%1vm00H7K-qOAl^USE-ue!In+O{NyT!wz^cOc4oH_<+_4D~X@9ZQ z{rQG3mMI<`FBL1&Bi{A{8NpCOEG+y3R0-C+(8g_~)g$}+pBnMR*3?Q{_nFcgHt+Du zCsXRtYy)?WcgVket%CAc_DDMiDk!h7TxemX6%o3@{Zr;swF7hBAu+mfz>KnjTzV(M zzD>Y52Yl|>!j?Jx_U>RNK%*A@k1s=8WxTyzMRmR&)wP~Z50*9Q->>D zT}e8AAbY1Z>SgZbrS+Y(Ngumi7NrO;kI9pZYU*v zd^f3&w)!1!c;6xPQE|Fn@j{GJco|or#M01lRMJf)4@)I=^|*e$H!(%Zz(Y@^1+&pD z>quZkJu>1VP=(gPqfk~M*LVKTjaCLc^G8C&CP%Be1j+qDDmM)%HT?T~E$r83Zbr3* zh*naAwU6tP)M2A~Ge$OS-D7XIdvy!*pDrbh=g#rQkpR-l>OuofQxt^NNi0BfPT*03 z^IbO0Q^&fTUR|awqJRa+gyu`>L7G+*=4Zg+5lv5`{`=ZYkIYBxXp!)<55A4Ll2hUZCGP)wcH!H;HXlm#$Dg>&y5=pV0PwHHB%ce(~@(T1_ zbxRbrH@IIdc&|_g(+gA&>2ks*lTV#?_|IL70+lpzj<_!(kEf^W29CXVjB_IW$H##j ztog5ndeOv~vIEz-gLVISAZDC5f>-g`BC@6F~Myx0Rw;tf93l+YWrnfEx(xx?A$WYU|+ z&h`X{5uN9eF?*M&oRqZ~nh}v3(_lHk3@_K_nRBEvO{#mDKC&Lo80Ku)AT!{X+=!aM zy)PCWn_!a8ubci&TNII;?>X3vQzz%OAU!)m%OOE=TDV$d!kHvSyDV})BXbw}vO?f9 zoxCMmLR(V8R5LBgP_$rEXL? z2jMas03;`(@cd={@Ik`Il8fSZA)b)IEk^V7(BZeewhjq;o!_&4ltp}$0jY&}!6^Ll zSpTu4je@p;$joZg$${gbGwzy_!Y&0`rA^D~Ei(LQLyl<+4&sg^=`m?dm|M~J{7?QA z0wdO6(#;xn-jdg_q8Z?`ZG*@wJjT(Y7DQ0}+5Hn}sZ9+qY>2_CF3<1mIx{LevqpIs z&5nIe^Is~T5I#S}@8c)i1*~q))eY)oGTwXZq}mWfZ=s3rR*Y{T{cR!l?f$W1cT&zp zFRtexts(}gpJ3l<_kvfIA59(dK}pb(R=jj92)7%n*nz#jy(`#pWsP)NiAg`#ZjE!0 z7u8(Nq%-b5o7#iWorY6+-;1yLy`yqpH5jP5=NUJQZv;!eyO(`Ns08q-;qQAqa4H@c z>_ww>452m!)JErm`aRNQc&jP%3~D9YFC67^DWYCDJvsJW%dS;TB;(nylA@cX-X)z#8{G?;9Aa+A^0XLv)1u+?<>;R7>R^+$ zs5NSIlsD=@JOPbcj}%a~sz)#v-dB!w`&cSi5Y#6ldpp{9${;EPx5Rozr7LraQ-_tc z_f$FR?7WVy-Ek_z{bJ3)aDdIBitQ6)bFzD5HWEb<^8l}|!n^!E+p*0))O81|lD-%3 z4;LJwH`F)j>Ev(U)Sl*5XXfU3iGq~{<+A}hnzA>Q8GB^*UG4+3L|;1Dikn)9bHKOX z*ch^QN!!*IFhXBi1S@BnZ)%`mM$wr((;J!USG0yM;d@#iX+NNuYc@lqLbs#~_!ExtZkB_>JKC59bTi=RmDLr0D%xx-B zWT+*kEm4{kIbIn6bSwH7HuQ;-+zh57q(!3439Ued14~?shX+j*OBHPWJ%oZ+Dfzo0(_)~tP zO5CJ!{7puth~6wn+4yE4k3Z4{hLAv0E0ASm81bACdkv_TdHbeE&I%`5h%OI}=gou( zUEYkAt^Pny&6ss5MzSx8P|Zjt)5aiqsX43Hd96Y(EfYy3VSURT%R`YjQMc`+{7EF% zvgvIeS7C-S%W~)R2^9~fMOg&95m7xzH1!Q;ZoDK^hiPWYaAedq3qYS5Q>1TxN++pU zqOO;6KI{hidA>w?2FvS&^m*^QwUob|O?20qH~&s|ejaCP5rkiJj2=`Rr4NYdY(q45 zSe7tEg0pUrH7@N>H;;MMawr)v5L$zfxQbBV<5bV{W|0YBq%}_l-9p=-?&MY)e0u7rGtR&qtcLhy)(Cl&t*ctiW6qlQGqyZEyz}7b>A{8MqOT9WuV$@I+Rke&Z{EdA#8zo* z;^B}OV8E(|(Rp{x`wp%3GTf}&zJE-Q1~VF`j3iT!335kUW7fa8dni?3kl1{upLd{H zYLE@s{#0oYQ+{j^-#D1Z@#yQ`mPhu>s`zH~g#C!G=}^zwHc+L^vE51`w46Eegx}d? zWorVLhJQb>P}|y3&1v^QSh;doC4%ykYvYrqvGe`u?X9t(G=Fm1Q}=3So3h?!C1anx zJlcygf6t2DryT3`4z?WK+Q+_pP>ItO(B=`~WKH1cj6{z~5ZwTZaOx3KOxm8Na!;9_ zoK;YLA{KY=OiZc#<=f(%h#BVs>d%v<9cxG91mBtPO)_mg-V}OBzj;kvn^SLLS6?d7rTw{P`YJPm~^J}TZziR~2OPA+2nE+>iDAIgv9@oCYQ0}@4Rk%20 zqu>)O6~H?8`F`A;u*+ntIEPY$^-?sfIs82^{_0|Lmj233$USbX<#@EsTDbb82K3$1 zEar;njDb{aCl%M)_!4yhnZ-k@FZiE$4`o;5=aH&xvktc%mmO2_)*L_Hs0URw3G!g;i+eWEygZbH zPWy_-OrlfkWGyQ56Hn{L))n}-5@&cVOaz#!jfbwp3s}UD<|4*aG9P~7QRKm>-fzfx z8!KHHtH^VY&^$cHg=7a#18LRzIFV}=?QE{vYTmJ{>*Ad+NtZnruoH4y$H1vRl!HrR`js&EfrqB{i$!YVBQQ{0l+f5%SBbS zwXwkEf5+o^Brk4=;&m178^v~ImlpvWAx~F^l5UV3Jibv1{*>ms|3uB0bUSu0w6Xl8 z{IQz}jFt;!T-eZC#2>p^BcQ+#MNpl2`8j%^HMZmBs=fZA8`oXl2Y8rK(@z-}o~YK; z)_#&B4_A8VN(s|dWnm8bKfJwFR3zQHu8BK^ySux)ySo?e?oLp+yE}y!?pnB8LE%ui zQ&6~D^KV(}-@Vs9O%=tdgr`FgH)F`v2aO1+kiPc-lE^p@} z!KSXgRA`szEn|KP`6`308v!K-OTvMN>fyLT88a-VlBi4S1m`OjX~vC-f%^-w5}pz~ z(uqISjcNeJlb%J5i?^wI6)}5sJWrY(0v9&88F@-nP?=yeiDG3sF|Ba&(uDRrmP7Y>rfY|XhO(P^Q2Jow5VvDizpu0X|4P@3Ab-mQeSH` z!q%S5R`1h5KiDsnL+M@)>3nk8tYE?Z4Z}Y#4l+*LK=BrqDlEXvey%hLTYv1yVSjJv z0DJz;^rm~J35wN!My^0ycy~t5g8%{(%#D6RQs}0*d>r;7#Mq+WEJ`&LBxi|*7 za7KtJhUp2dPuob7*zRsbbvvVuj2|ny7_70dNNY(nsfG^B&`aY9qO{bQTzK0y>q@>i zRM<5E0HXlCE{E_ow#l(IY6Y3UMumuy)a`KqNZbf!!pJjTuJasq5fPrt=V6wjjXc%V zPj=|>9%Wy2NK6HC;N28da3PMCu2tH{ORQMM0~%4A915B9zFxu4T1wzRQx@ehltLf#0eW_)QEXd`w*`<>hGjheU@SH(1cTmue`#zSK{ZV4z*HAE_VF#8EdH; zr0BI#Q zkm@9QMc-gaMQ|zS|7F35Wc-zSKc84PWV&-!5^HOWd!LM0hd49#^q899$InDdHFZ^3 zxGvZP5tm@8(BmwKrdPL=3lF>CR&gupiPf0wuhKT_xMK@@A*ZIFcPQwl$o&PyXK!T< z<9mHrcqN&=6dN{?*Zq|n!kbgY#YgWRfRY=EXqsqs)bn^G9dTq1nLB=wAbN=sIYm=cjhM!g4cx9@c;3>5VC53dIP6O8GC&c>wDvB(vxqJWHK6O@~YZh`^1{;B+RQuP^5#;O&CW9ih3K>)otL%2qYV)LSQXS=CMQ?nKnw$Fmx z@8z8)XmG`JUiK}@%!2_-{;6V$q=dh| zRxTCZ&{J|Pn{lr|MrYK*aU{i<69h<)4c!zTWkSiOQrjB*P@_qV1tIKUQg`rE&19v? z2gY=$ty_wT4H3hWz?|?es6^-BQMMe$k-RCHvtvXgFycY!D(dnPAWUYDrMVN}q%1?c zNb%)D)GnODkriRbR+dG{0cvuwLhtQSQEtc*Y_tAZGklBKQrgfVo$@Zsq@A=<6A|iX zqvZa1QCaO`C8&WhuR%awAKfAkR_YZcNg-TqELKU3gadp{AuK*T$-x+Z5G~>%dCUpq zXg5-uKP_;OEz1qA&Vv@8I27w5fISC6NkUX7l5udiP`p=(wm0)*{TcZzIz+WX*@QPO zLn$f>?isDWN{EFhnhEkW zxv*mG+z_>Zx;1i+2Wn|X*b`_r892l}odhv%T5mM%x5*%Y65^-h7n1XOac;2qZddid zSo$zh6c++Tm<~uAg(& zK)mhVzT0f~05=z~-`7^gI~8v867C6OUhf~*fc&1<>gmn5tk)vXeAhGapkX_=eU_iA zu&4sCWkQ*fSMR)?<3C2#j@CLU)0n&0(ua56t;oAW%wCnm?~$4{ugb%Id0o9kokcn5 zH1|^slC8C*OxUCTi->(d2KdJk7srP=@h?8%<4$pKGyh{_{eW`*vebTz{nr%!-%yqR zIfc*iH(K(q6#h(a?;r>S;ur$RCsNS6zg2?lKWtQ-|113DAN0wGxR~=F>HCi?KIcD? z>sHbka7awcza9La$Nn3L@{cm(`T*Ac1MuMdcT?Kms*Hv6Z&k+0{okuBo#@A3g0jDt z)n6Cz&$9Y=$U^$xyRa)eEdrP9gz9o zz&f~&z{!RFOF?n{4ZiuG3yPKNpN@pqk|S{Be=T6+`rkoEiT@6cepDy%%B+|GIJiJt#I~%r)mIov{8y@;!RTLMi@IRTM|M_Eo*#20!{!ye%w0!iuk zm0%>mgR}|Vw6RW-{ZPZcwkkd}42_iZ)Jjr_D)qj!TEWctHk=*!YxAk7=kXg{=h~l^ zlF*+&|CF6#Vs_{eYX)p)-tUpY&fF~tacv(@Wj{_&dUoG?TEO(f6hgS6*N?W_*ERLO z&o~Yv+W^ouQUcHeqEqXeyzu*4Ti(8Y9wtwK)|ik#7Rd{_=t(Cf82s)FxM?tq^;Tzx z!_ULJ(&aZiVLqSjG7D5%c9a*5hi=gBYpSw=aEob-?=YK41K1nFGrN-G`5<KmJBpo#?v< z8jqCT*`NSlWh4Mi^i&UK=uf&3!P?lS`=!9$YxH@vp{?;l_Hw?#ixEbY5UkTru2l%Y zR;79pNx7BHF^QLYbDGdHpsU6o%lDZ#gXON&-O2XQ*N8y#yq~M@w+CGK*HKFG*|=@R zbmE&Fv8=beayzFbrzTo9-920aEKE-TK`ImMz7eiim@wX(e$Fh4R13X1n{S#lW>sqK zRK+eDu4wm;+7zuz^oGx0WxC`i7t;ia;i1DJa!mH}V>SD4SMVUp6>2z#BR5fEd zPt;SGKV!PU_$mZ;IGq!?sGskqQwmqBg!uud@FvDk(H*rV8~EoS&qyL$H0fw=p2yg$ zqTD=cJ(Hj(4`UVWkoxrT2QY2T_X{h-Qr}(@A4v+ouT3hlh)n!LOx&M^s;R2Q-+Z6OSJ}pJHLnLdsp|C4?pUsFUEEZgA21pCfaPH72v<|83 zLacFpgVj|S6t#Ofp3ksc0`|dx(I4stiJy68zo#= z^LYyQg&G={N1Mm9@=vmdwO;c?V6tvLQ#o~rwy74E7I9lkLmgEjeGzwta|&WO!uw1* z7`)KJ0OmW^L_x{s7M;!p40-&7G|QiFGommE1hD37EElMlonT3Vamp76C8jJ{hEuel z@N`Ax5AU|i7k^Q@NiGnl(6Wu{Wi!Lg36;zl7mL{2M;FP-u-dYlOihBbQVgsjX!_1u z>GkjBg1J$itFNKTZCJNZ#C6Tt%kg_#E~lC82`VG$Sskk9b+A~cXeVn?Lo z@WsEn+Lq1#fY}p4HGZ-{Vef!4HD#SNgw~{lM2C1QB31#+I~Q7ynBhftNn@Ign{}Kb zOvQPy(F#J2sAoMb-!ITU5RgnIW=zh31xdRCu&Rno(QK}uyJo|0vPFZRB8T&=iEgus z>^j%rr{p{N(8h}fp$t|>5UIZyb2>s0W*LXY)-ig`>KJv=$(vwS6F|d#YC04tc$kn3 zMH!2NqecZT)~Iyb7uo~&Z$qHK<}WZKp$;U86~L?GXobBYjEmZ%*(^wh6;PqhoEKwI@BNNZcdP7LG9jT0 zS0$MzV;M)1z^Q`4TB_9VtE)X~!n;Z3D;abxzwZDA_AN(Hze(lgLm=zE<3la)MDT(% z`AhWg%v1E6L#cQMCPfUm2hM`vyyQRE#ides_9exBbqVr>7GUT8s!+pWYkGIJn!q7d?uvM4Ej5tM&nLc*%{}_?{*r^Rx9uIvO z27$)wukB;t!EW{mgEc-m-ij@S60oX(lucI8+Zuo+3eamZhV&77ESOPi5-$L65*IGB zpB=`S!MPF<3I2FxX&o6zSSOLKDSS8z4T(653W_*~3L3kdr|crn?`6{{iP24+z3EB) zN9|PA=1XOApoK3ZL%$QPaP$%Ql*jSyQ3;Nahsq&|k=XO08iiiPvS-F`&nXSRg9kqbSa zpSyTLD7^7S8Rw2tri{sclnQD1M3O=f2>o=>tKH6A3UUoQV;Jb6hF#dT`xE>j3v|S9 zbPmo)0g|}|a=4|}2d;4o0A22XMxhOAAw4ogXhR=ZjWVvLNXSkVHvIhonmB^zoCy;> zdxYRKOVZ3#rF4DyY(CS2zp$pu@GpkL`c5fQ_3>8?=w3-ntyMMGb7s@iNgTjV=E%X!hG&@4cTWvwIkeuQVOL*J z*DS_PHb3Bp=R8(uzA(zHZ>X;8m%K|rnqaGO-8T=t;P2(k{(qbttYu`}eXRow3RyV#H2k+E z`nHj`w*Nd^k>opqI*Uikv#|B!hsg^~S%<*Icpy8wi=b_MU1Ir$UfE~H&ak6pS~9sE zAPRXyJ9-K(Y>6>0#W6k3KS}zFVL;d)s-6%#m`H^G{CJxg81Tyc9K$*{r>d5OHZRMg zYMiQ{YBz*2CGVa(WcSll+n2a3aABz0V^w>XHM2DHDr3(2#xV!CkjK9 zsR?Qt2|wLm9BXrZPM-ceZ3Vxf6Ko@na+&mubcec)?oFzI7CCWEFk{Ex3pZjV+G7&@ zJh{bZR*Ia$HlxQVD_)%6vCtn2U~2L8weyUpj2y~tmM!_@dHn=&R}H^%s;9djy17=R ziC3vb1%RE!^_exl|Q@FRw$WUH!&fc~&c29I6@!N_|O@~Qp8*(0Km*Qn<$1Lmo zh53Z0>>+3mJ5RzGVHx@S{tX9z6*B48C<7G@jIahlZKGevSQK07z}bF*!ysJ~#xf^O zBX(w@X*%gbT*I@~XYe-H>q6ULF#ojVzV>QpBfpKd5D7U&cE(VosJ5c{quA0m({yBe zBT?`7ij0DfgO7toSxFO4QhNW>S!{J9xcM1}H(aPPaR%P=8HRm6qrPDD~8JS!Ok4sXzX zFnx?Uu0pC`L19~}w3INCokM~!(`EgrVPy;Yt#QqOtKr;H&_fXQ@vdGWJIXoVkltAJtMi1x}hY-r7j8MOz;BzV7K*SOUF~k4d z8v0Hdypl0e`LkNPxE6&Rl$~FRGF;SLg0^G%QQc`P>r2vX(NZUoHD0yi;qpmtvW982 z*aR1|*5;MQj|&&pXG|-G4lk5-?@NJS6Wzs)#K{Q9`=cRdcATn=#(r^Aahkdmz)ObI zGLkaXlZ?_lNSYvt7-;D#NEj~LdZxgvTSc6Xnq@bFgFwW@J}R_a;RHl;|4-g8QlDG2 za5?e5P#7~y@A{Zjfn*AqNBlTKq~1=7p-*aE1vNqOxptHcJ2MMvvguskO-ths zPlx-%!EDr(!4l$uCJr7UKEb0)UCH&g5la3tvgxy;2VVb;yRCx~IBmWR>2uo>mM-IhsU17j$ zT?un^T2b0OYwroQ)ywiefClh_kRJT0Y$A@{vYQKq4`cY*@2<5*q&hs$;)hCqZ2nsM zPLnp)S_Upb!f66bZALYfkLn~4Lw_eJw&x*0y2zS^B%rtyC92rqm|6`y1v2 zeF?VK$%-M9o)Z)+VsO|6(xug*K-| zGJzJeAA=ZjpkEw+SvGAoiAEHh)(muB&up5Bmb^g&`Cb>>Dp7n)7}7pL)bp8S!o59RVWq`iUVC~EbMf16n63-7)GkZz}aJ<~3}y{G8O`F?Ap zn%)hWLo!-`e=`8Tg8=lJ?H_LVJo9`G3k&zYK8ePa1t54mvOd(KryNc$jAz`&*(D`W zLEcDm13mQye(Wwwb9Z4rh^i8 zb5sy1?u^X7Mlrq8+otHWO&4}{yJQt)nBaPA-vUxVYAF_i7;%&Fe8e-E{gd1*5xZLFS9f9&uG*? zo4FftFF}e*a?wB;n^4bOa6UCrMihQk12+NAT_G9x_oYr-s>be=RJHcQCwo55v=lDy zn(y1XN@}iqlOgZj6RCy1Me7`jK1Ki}F0L)A6?2W_EF%5`o-+%if zO$MnT4idIrDw;{6DW>Ayz=F9jGYHJe+uZ1c zduB6LWGx@G8u!~2u%s^^ovv*t9>a)2kQ3*^GbU72#v(VWRYmJ8wDneU4yG8(a8OT8 zQAgFu?|Cq6kbgsO_{!J>?f;m`PBsyQ5hP)4tO7s|z6Bp%gOGFU?19phpj@Eq5FpkE z@n2e10Ju&df$xJN28?AL#e5-P_rqia64IBoMIcMi+m1Z*1IthNWa?tZ}&AozF3VqJ!b}eK}(k zGgtKGglP4s`$9gGs*erZM8c?li(y_qe*j3Ac7G+Mz{@W0w71x$OSg48w&@-lt?+*- zVLTR9t{!ych`UcwKg+ST5n^r(F{b=~nSI&BMOTr%S7nE}G6qhfyK(6(wPO(G3_A}$ao6M@W~)`8?JxFIoP zP~Rz4DnN{QB4bmQ!JxEjijV1SO(Gk?PI^#%#VQl6(d)UE8`s!nUNZNmEZfYcG)vb< zm?woYCg!SSCO9To?7_OJ4%B`ddDvV(P!FzCSOqtR4dByiUeiw`BEZDnj{?ji+bF2& z(>K(6Gs2>hRx~0M7DX#oV_Y;EnTxUl^#ot#(#1s^!n2ywF4;p^$Dh=E%W9PrY}Wr& zoCtCot$C8GHaj-Dv!kCHR(%P4iR-&0YgFjOZ5WqwT#=aE$2xDhne<5hiPg>DVX7l` z^h%4JMFe`sp9&EJThS|8I}R|$d$Ev(GD{)#O~o_%@w2cGZr;oy(VX3j3Eog^8zDA# zMS73n5(~D8gyC+2F$?IhPF@S5;wX!;l1chhwT&bkqchruL4lDC2hy)(&)PIwRIeoE zJB}rzNp1IjeJD}aoS(<-g-KVvHjV6*6Ig59w!ne~BYL`84xW1c_R()kL(lEt7ag93 zG_m#s<)2^FLxG*`BSI%X9>!&f+cH;V-Tf%udGzRF;KvjoXmi^Uc_dcLw-;E!Ts>01YkyXz0EBlSzJiI z!n5ROi2Z4MVEi43Eg21*C`UK4=)t?dZKyErn!5yGCSpfJPtYX~ftw&>h@!|AfGpW^ zmg&I3MZ3-4)JS49SAI%CHZ#{MYSBd}BHf;>Y<=C5EUWNPGyd-DlhQJtvj&GvA5=#`V*HXY>30v?$uCUC0&ASzXz3&)B4DE(LGf`(~F?2IDN!SM@5nq8Dh1i zW5vH;w3x)WFqd3l6465Eg{xqLx=^KhtPzxvl0f?t4khb3%0Mg7K#>`S`7*3yHS6Tt zhniE2WVEKfw_pkQ)*#Xc*JrLZECFd(ORX?ZUt5_hg0Zsp^+$HAnSkAIzL~_eoM~3r zV@RC+;8@DA%1rM1AM>fh+ac_7!~XFs21WIg{u5X$l__?z+g}Ls*Q_-v2xLE9uS}2S zWfF9r=ag$yjuYGO6Y;Y-6()W^=)c`VvA*MeArE4#r(VwlL=i$A-AyA-=jwh6A}ZqV z_uQ%o#rk##D=Jl|s_74*>)Pl#eUkH+DFk0yB;RhKgFnfB$ZIR;CX9TcXDojpjQUZX zFySa3Pb$F5ef$aY5*759UW(GB)7f|!4o0;e$8o8d*yj$->^w{Astr^o%Iu#U3p-B^ z(CzPt%UP=Pz+M#-ZOAVH*hco_?Os_?RYcA}l6o$2T*eMG9Hn3*RaY0409lkH;6S#3 zT4FM^nZx!j6gvwyC|)`(Q=zTYznk*m;tQf)T<-0n(%DK{ay2`7n&V23^H$3k)br?+ zFBks$Jo|utawdV;X~O3@o$g#{Z_G-5FjU)irxRa7h> zeX75Nr_fxb4g}J4y3_r6Rj$|0CJ3wJG+3F=dV9AEM3LDhs(;NFy^FC9VuR$qtVAiq-s{$ z#L`MZY4AYeY@zAjaa9!WKE^-Jd@`@VtYmO{Z+AW?9Mvf-w1-(w}j6&a1m8eYk z)41inpHJxMDDXy*aDZ0%(>GE7qcSDyK9*tAWdM$_F(<~Y8aI!VFH6J zGNDD`mfT2MPBK9iM|~K4RjAc65IeEQh!@5k-u7FlKE`rxT+2y!mY|-DL#lFWZfd53 zwCX{*%O1a~QD~TjzmX$-uM)TbeuCHrr9+abiv1Eq=b#1NBE*1^5BFjNvk=GoRs%E=@fbIei;*z-%x#tfWaLfG9724zt=x^wG6s>G9{BnHQCOQL5`bMP<}(%oKtub{EvkQ@r7p{Ss+DFS$P zl8N(@sgKk25Y3xua#>{fG#4%}KFhu+_#EUNelExVK7`SUr4_S&O6z^{(!b(luzgT5 zT`RQB?{_C$<+JsLsYU4)ok3{$)#lNW7K+l=v8S=e?nga=d-6c_Q`3m!x_fwQmOjg% zo1qV?i4xw5Qo|QFOQVi`x*B5-gBt)NzAB2|!dXa0c4Kk)CY>+_L`~PbL^M@PXuj)u zc)eu5GtOas&tXhSTDiE)0Y9&N?LHNpA$GeK`d8V>^7k%&wNbk)-C^o={6|C{Zb7#ynH2xKG2j)zE?G>M4K?=Rq)k z2}*2Izo0M*m>LWAd?QlwXxnwg*4DzM0Jw`;qO<6)dW)LR-Cs^|na>lj&v!cU;TzUP zJjk1gM|8|QTk)zejrx58C)n|_P9iO(1I5+AAwG=AX-z49IM{pxSxpSxg<=A#vNoT3 zb`rlW?fZn@N8$V;m}8(2*o_751KfAF+5Ut=Q~pk-=WPsHf=|^0Tkmwht;dQFplEtd z`)-c0W|_Tu7|n=qn3PB>&bk1$3~_IfhW9*QYq}9{t@~)1nu7U5EDY_d z!F7`^i`F(D`xzse6to^dFS7k9JA9O7;u!7u+}8Tl!fMGr@7vSXE84Tt;^<1#(=4#I za-0LWy$iiL`4u}ZFL~Um6^5oetpD8f)ZndBh;m)QBblC(c|`VFni5epIw|4= z?;LF83e72OA)CvD#F*(%cJhE^-#GnxsmVCL5WE)Ft1*dCi{1v*Kva+mS7-9qD;>!m zW`r~a#XJ*QcH9lI4k_P6C6=YUk97zWx{T?l;4VX<3MB|bO$FgLRF#G6B*y8d6me<( zrZ_9&+tAEu)s$AK<%}cEw1Uccz zf-gCPOZ*-^4xyh8TQO5^q`bwRu z(7M#PTPaGtrNP&n$me;V?{O|cCwk41*CS16^$<1bOwUK*ek%#oY#6C2m>bPe27 zj}-_2if$e_By@O-jb(Ltv5KK6N8~AgB62-)zYETaFPH$U^dUJ1VjF3Il?jOVfnk)u zN=f?A#y$ppZPa%%xswQicA4bC0D86h1_(&avDi==m#PG+iyYPNNs3u`Fv%9_?4qf$ z_KRA{%NpTt3sy~~4c0U?SOM9(ChTd&KeNFBh<9D)jgf~=ktM18Me9rsD0_;9yd-*D zCS7)VgRZfi3X$Ys5j}8Pj#^xH7PNP>U`aM-bx}0y&UVFBCQBOGtp=@S-`tL9t41qW7xP#6+$;;~cW0J{??k0jY&_ub2D*RhOvm! z{y_Nt%g{MK4TxKgR0H_=I6dy-%QWqPp~R&>xcFVao5`GgFT=0V&<^XLZp5_x16+0< zmx%~@FQ<x+FwtU3 zi(}Mi2*IKlzk+Hzn~4|gn$|j>EaSP@_bYY@dH9GIZ95Bs+bvA6pA;@H-N3y7c1eOQ zh7|)74`&b(cH)V}gZXNdgAhRzu~<6#!Gw@RpqDXTWt8BP=t*&ZKvVtbR;r~b!mXR9 z?5bn_pe;&Mja>10X%yP^7@#xIcG}uL4VxctOw&H?V0K34bS)^zN3;*YV*x*aSHh@c>P>5t zW8JaTbgw*UaTY7oJ=T=CxyLpsVw85XTN##c;{g7*Ub_LW`za;^|64gOPbGE;qUB%i zdw7H%C;eliLcf|_4-MXtzg*G$;QE*^{PRs?E+@tU`X&gRYD3jj(ro7dN@E*hv@bAK z=43u(o^C@exdsL~iJ8F{P?VqVeo;LYqknhu-gW;GYD%QY+^T-oUHV*jbftK(oB#5f z=Zn-t|DN0S=b>E`wY|3F^Y_|j3quOnW2W}nW}m^S>xo0jv>&&&NnS5Ik2hsZa2uhPSY}uNx90B|~*b5k@Zp znlxG)akuxiN-y!Hv;J^^-+j>cs zNnZ*9Hn!JY+PBh4Af8Mj73a?Ek45t*O(GWVpL0V@z3ng$ujE@fGIp{Dy4ejuE|+D? zDY#?BPD)P^GS<85^$yH5MF>$PPwbKWZ>92)J>#|-ruFLIgW5GJ4c>xOM_wXyWR>aj z=WQ}SoA+ORI{qvPF0dAyF&gMy3gIFecN}JfB+@`V45aIr06xQ77W566nGzV}cifwz zr_Ku9ZiKo=Moa6{Gjr=)-Nx^oWrT75P8)~bm=lWkz}uFWbsD9d9@kyy*pQ*0`A8h} zMt70b81nkY@4hM`HhTDvD5PhOW#6m|32T%Y5<|;yf4wP%zY1%c!gC z=%XQ;ff7*i$auzU$9bLmi^z!lF7hNV6f#$sFRjk#)E^3~-CT8Dxt8Cw^w96QC)a|4$e}?pia}YoL`lCbToMA5{<5vm5w=Mqoj_> z%8;$-12$DCM^`eU_Hw@}^jf@e4Pqi^2d2=q8127=`iJ!p!5&Gn1dvrUdYvBpPMmvC zklf`e2`cnpSDWl33*n+el`ujsk&AICju4^HUqXnNKriU~{+LD(| zZs1~)^^c)fNmNgT@gvv(2mL$I3s=iBA}>MrIPPyVU2cif5K*#pTXgP%E$UhyCc)vP zSBOxrX;DUOqtk)!-rnpkC|tksE==J>3`Zxe;G@sRpxzE4o6he|4g1Dk0OXguOBuRt7`ZPaa6Cr@z{u$@VdOt598CTJXk@D^o<63qmmHz9jB_JnG~O zxFGEv@pFmSSPI{bU#>~&KT7N=IjazUUmz0V!BmikPpfX^z}8Jt<^KAegQi`3xSDI{ z@_SM9qp&RPQjTV3>+k7E#4!m(iATMTtl00?@&U=-17?O5&%cFw4z2+&kEdQwmggZf z;DVC;dUa*_xvU5Cd0&V~@Bwad-4!_P`9V~EPq4{)YI5R0P>xqVX7~Nz*y%P8%p+RA z`*AB*Kq41o#hO7axMAIuVR(4U-<0a}`%dZWj}gI_an;k;vOBjXTCrIQ+ZBAn?muCAoYrhy#{M{$|CwBg-rkmT+o%ODw(Ch3R{VjuhqOk9 z`*^Jv<^}h)#|Z+aY6U;GkKoxko}Te1?@EPx24=Rf4|0gYeEs|A=!MBQ|#GI z%OpqBnjFGWtdcc#CgnjQ3cTrJxXV=%eC>WqN_n+f8sFv$p58KS=rQv*8rj>^q?s31 z?(1Oc1SPlc$1YxPX0zK3#Tpw}?zp^NCj~b9Wbdf-IewC?pz(&~MB>$Z?ZYhv5kY}{ zs7)1RXP7B?6Zqz?;#q+Vs%TRw-31>WMJ@6RSpmg4Y`tS`g;@IZTix-&knKd08E>~4Yu#pA3FWRno-YRcQS*Yc zjVp0^B9^X=O*W2PVaeT+_wm#4l|1ADWFtL?LHgV3{y^39fD0hDEXf#s5$-iA>zwsq zkuQdbKpr2H25mS}kMK;H@g{gPEpa6FCWMIo`RKQVBKaWWc!y~?i4lM+L`!_d3GRIp_O3sqdl4~ zlm^J(CNRIHGXYI+^~&z4>OD`;=!mJT?aVK=Go<(YKB;U4GIyTk$oWzu%b-@9v6Stf z-Ee!p{4wheS9Bejb#}n>@9B3GMFE>&EMkBN^TuBo?T$DoWPtc#;gz@RsuEU(mkZ^4 zL)(gRX35Py&>iD3s`wT0f#-(X&vP3PZ3R0$yFedsMFf1wz7_3q8@+kXR-U$kgcG`P zHBDVO&N(Xv%iAZEiRht?2R>V4vfcRHN&;vL30 z4(WDhX%@J@e2iuq#hfAe!#%yye9@+Ll^!aUHYe1m=aMtW znSYn2olwD9Vob%LMzkVM1J&wQr>$&Du*g=|ECQN}g{1c(QXH(3$0Lt?$9j^+aZ`+6 z+SM0H7(-LXeFn?OlQo>lNx3EKDa>P%NO-X(5PmYxsb)&}PsXZdijCRf=RxzZ%Y2*$ zkfNRV^5!UO4p~JbLvDV)X9$)BO~L?L4kH8R!Rxk+aWB@@6v2&mXl!3*UEPAf z8QPW4`nFM?*wL-89~+5P)TEcctEkscDg=i=7%fvz7UEX0y_BanQ=u=1! z*$(p&!|_RgUX+|{>h+fT)@9J>2w?7WaTc{g#3al>-%n)o9f-O>X5UYO{%DDTcyK@s z_kyAGHy;`K%JSdsq*Eta^%c-hny;|jhU0(Wj55j*5b0=D5ouM!PL3QAt9u&ipo_Ay~KCCefZ8C26bO6FalT^J} zC@(x-XdD@(IT=B`K@0h{%by~(-x9Vk`&}Js9ajaoC?H0JRO|=2ILc zp}HoN5KRO&W8c0928Fi_%~}O#G4Hdp&<0><662IA3o`Q`sbUoSES|V4!LJ>zyKWR% zsuEkZKn}bW)GY{MAcP1ccLTv%2ci+vbhsSvaJP}LxZ#*c916SWmL}X0E4Qj-(#!m0 znQTI-V;W+ZphwnYU6BnsEf)TQFeLr+8Q$-EZ>e;WK!j?nkpR*Tr(^|VTmxZkyU-Xx z6~_Wtu39k^%Z}~ks9v8cI*w?M%$S`+DJ8G`@nMm_1ge9Xs^LVxVkTit|;f(l)yu(s`u1$&9E-7qn^m{D}|+VC$UE?VbvC5Tv zJkA-^?6juqvp3Fdfhg~ZnurP3O}xnB5vBVAtuxXTBA1gz0<3OIRsY`aAPjsAYKmRn zqLB&kcf0*8L#Szq${^Y`%n(ZHoXx64bGdRy;(#Ll>4AD^=S)0+vYZ2bKSNszr3~jA z5m<>y;En*3ip+cx%!m6Dao9B}REG|a;Y2&O?#SW7 zLMM%b;CO9Y91vABDVIZ0v_k%PC#TvxKEOOAb4nHPAxzWM6ENxS9`Becs76iJDDT#8 zgGPS{KZ*AtW(#CpXd!`W^d*p6lVnt`U1qivF2N33U{ki7R5zFVAV5}Yb|Y+2`vFJh zKs4ztdNJgN!7x)R1)6olXOn!@57oV+;uY1rNB3lbu|yEmdhy2zoiu)CSrcNFpQp;F z$PU7?eTxh2YV`oh3cp8k+tv-6n(<2;b!utBFI`Bo9owJl!*_q`J9qn#!*i0XjJ)SV zNZ|`e10{P*5yo1keF=C!!+C@v!7crF9paU+J(Zrp;e(d2u9PN)Pqy<>uH!~;*o%pg z|D??>k9ks`1{d$aou!iF;kx_?{dIlE!Zr4}xc-1qDRxj?D&r0mS2T}Xk`M$0cGA{!+(e8f8!!)|S zZRH3dPv|$vW$Utk6uO3T7!BGJ0pY#zSmZFW!C-U4%8Tlbqw5X`*?3g#Ave41! z!=%Q>d3QHYVvV5pLEJPk{M-4?(9-N@Na2h3VRqJFX?RyeccJ+G9>nofTc1K-2m|wT z0r+XCL*k1Z*cFHjzSH}JQ#dD~Bc#U>ux@S%vc|@4p7?AtPqepSL0zni(1Gsu%dKB- z(q<`}0#x!Hho!-6@T7WR-LRrK;WN0U0;1&k2+w67RtyX3t!ss97Xf4hMcBDNGzGQi z1)K101-Zh=(tU`ql!+L;WWN3ed3Je)Uu7HaX|tOw0NQ)A zYBX0tPwa6z*3aT-Fkl?V@RO+Qf_$0OrKouPFfPhEnwl0EA8b}*a-F;?+iw0P?6qLh zQ|RF7AdyG#udwpoA0Ydpy#dI{3CfC3U<5C0Nt|Eyl*E6b2^Iu!us1VJK7!BO{?r7; zWIcz6811x;bILVpZ?DzJ$VHfbAnSKy?MIL`&8mbefDL*kb{bIFbHevYZ1$myQdMonL~Mxw-zyy8GhLVt9hT1AJ%ur}Bc#vU8DeIy z^y73@J9(rC^=ez*iLQk@%WNo0ou@Y8+s9IPgJO*; zZq1qZp8liUZ*9jBRYAcGA$)g2qEbW5tJ|C%>i(STHo%gv+O3bsGDxakVV1O!_UFEz z=opXRBA3X5~X#CM{jG2SuzktSEe|4<-zZ0Qi|4xL;|JC{M{{asQ{4bh( zeek>g=wJ3oIvj0~!sM^Qg|C?RDxc<7=s{ai^{uczY#~zq*`sN-Ob2|J!7(Vz1 zYn)EG55|SZ&dEc}%ECj;@j)kZeRSw!{pirf#mYtee^K_1(V0a1zHV&W=%8cU=-5ej zY}@W672CFLTOAu6+h%v{leO=;Yps3n+T))4VScC@RW%E9jQ6dY&+q@Rb8@A)AAo86 zcQF{}e+XUw$2jai3~8VCL4(gE_-FRpNsIZjo6j@-|LO7j46FkGxW0di*Zxhn_8C0? z=acxKQ=$K6y!*c#Wg318qG5h7hY#2YvIt~&OrRiL#}EboaUB0wN*efdzkgcV{^uUJ zSw4sF|1BwF=3r<2SM2n&$BUmo)wPzAt~QVIzJ`XNfQ<)}4d6?45<`K5{b35lsjZ9Z z)em$Qq7jLw03GsJiB4$U-&mCUy*_WTYQbZ{!`})>oi@5X-)&4SS@blvIQ=ZSNU_Lh zo?Bbvl}lf<^JL{%Z+hU~Mdg*sSQ8vp=drr#y5Br|TC*ZH3PcsLIHog1h}c$_@7tCg+9oT5*NtjkZ@MH`bko5rHUyO+ljBCy~qyXHwJADF7XzYZNr7zE0WZ#E`Uv}*0uL6pE1-)Tbi8XJt zqIdM_w*3Ae3u}cwVhzUCq~Yfwz8sVp&VF+=Vzd-3z3GYnqplq(=8~ss{(-T|m?!u# zE%o?^1Q}oyIj?}R;VbfS*u(iaK0G@o=GX#awRk-qf3D=%zUSC5yraE{mq$Hsm!Ptj z`}f|V+&KM)z7;)xNh7|%%h4xZ9b_Hf?1->C@*!TMSg@MeOoo>lVURpNcCS%G;Zut< zm?tZXmW`A_#420oW&K)7NSKm}wk3mCDD2Z?vuM~PJwi*`QgsB^H^M)65nHQ+W_kz^ zpc!F<`QIL(hS6rVDo49q>H=3gqYf35mKyljg>i8X75jfRA2+&r8Cajdl)0U$ z>4nQl_t*n(#>w`;VCoLh$u~wG5pH3OWhF`}Mc60RO*?gK#QJ{d*2syF?d30>#j1CJ zoY_+dpoF@`M9OqlX(_L?3wzZBnh^kKW-Wf&BKlc57g!^qo!n2!k7>F+1FD*NTlAH% zR<-w@hRusTdmN0B?a`6_u|ZTt=jXBR9fhuHI>M3Gc$jQ98yrk^Rcl|F z8=TPY``^*@PGaX>{b0)6UTPf8RY_EJ@+p!svB)_wXA?G8?UTR zxN0!e_1r&^GaaTks1k}Yr0{jc- z;9eH&o#Eoz!oIW@Mbe-ZqO@vXOTZnm~E3qfP|n*{=&%+uuH%L^FOM5{Met{DtemrFGAH!%I? zJ3nNbT2bO-NaS|-O1A_#YnD}q*lqovpL4W520zr}%)g5S`Cg&o9yC9IrL>^of11cr zXgF#KLFO7~ZKc3R$zZ&jed=-lEP`6H@}Qm{)e06YIG6{a((#oC*Oi`I8K}bdZ=nm*fch+cyI#1ImsD#1z!QWGq<>44 z>i(lCKL!X@xIXYjBry)@snQi2(lv}seE0qaRLC*=<_{;2z2(+R$;)$XkRnIPmw`I| z*At?W7x_x_4hW^(mhVh@9L40n4 zv2y}$nEtsy{<(m#LmC)!?F`N=;|{a)l`jwmg-9gSwajIF!l{td1%zFpOg`72EjxF| zUwnk2$;P24hK=e0tO&*}RXNaQmVt2DFe(+bLU9p*D1xzy z|J-Kuotu8RFudfFMv6?@`p?M8eA=#JHCC(e6T}Yq1JNPPIx|BrboRPN>BZbOxKX)7 zARG6!Uq=K-Sgb9Afc^Au8GF)z7X_a6xZir>BOq?f;OlKH^1Vmgfh>7hu&)}>C}XyM z(~No6PoyH;pnpyeFm_2RyxC1Cch>7PGXBD8b;-^SE9n%(k{s=q|y+&YABWn1BY|Qv_lu%Rn3O_ z`iKad`>sKrjc%ItUyDnaOvMD?DSkF4MTFW$0SR@OxZ5hG*5>6k9e8g&Q_kt~EE?nIzCqo@^4~L1- z*P1s(>{05?j33Lcg?S#WlS;bD#DXg7IvOj-)eN@OtZ5HvcT3$2Tv=dVtuftgniFpR zYcu?^6mwIV!CDU4;}8HL4k1PLT^~v}1#QCYfhum5E3Qn8{!ulfo#M^(i$dSt&xxtOb7sP%_~akn&Ep8QjcOd zcOW!>JSKs)aOy7yEQZHO>_AXhuIQX^e8h*p;+~u_GDA>@b5{tBbW@u1`DiQn)QZ+r z77#?(@qeLaMb?407+^J;B34p=ZRw5<)e1$#5hot5lwNR3VTjtvIX6Y%F=NMK!xua| zSoo}&TDO>TSmq3Pxq5hg?39^(Um1M4kTpv0CP##B432_-Tk27p)t}sN*OYsr)G;x6 zg9xM9-}DOL@9z#~QKG=}%!43HHizN_Rbz-$Srg~m#xsrYM?g0bD&yyc;$k3)`NDJj z)>&1b-x#`dpl0xuGOqY|rjnyJ{D~Wemz7N#f29*Fh5Z`XUELW?dqZ_tH>Ju#7+T|% zcZG|NTON!du!Ucs=XOFkr|5FMM;DCTavDu~ZT&cj>nOpu{5lm)037zaWtuZxv@NDt z<;MC7k?~CfSg+X%McDiZ5Mm$+4@Bfx>Y+iNM*O^_a#c4u-cE@VxL|M4E1ZgimM-i^ zBEJ_5qRjxPUnYFx*USS>bjYwH_3mi5g?I&0>WtyR(qlG7NrM9b1#c3q{)8o_#n>sf z?}wxtse99({e9=XI^JQLD#E=uC-A2J4Y|XvRkn@pRZ$zG7`jGm*U5JL;dV3)mFgmNj<8qG=HR$Y*T3B@B#Fp7zALW z!v4{5P5?nbv@fM@IPfTB*%Km%3tlh4+n+lJ)*xOq?)PfH%L1-yB^8@ghvL}^x953( zYsQUO!fMHpZAfd&Y+S#4_p`hIs2G`9?+%==D^n*aN6(~F_op|jXpCSxbHy}?-H+a4 zeRbdv{hU|{tG@Mb{dYe2Wc+VyCl(trDjfmr6*7pC=}ow2XR>yxk60;d4W3hUvREw& zS=IH-3KIf+$q7drMyNSjo7>BJ*tAwRDa(Sncx)%Xonk{z`1&0Y2CN~&G%zXOKLs7> zH|FzvdY9ow0ej3Q)&d!$!#}4wW>;&`H1MmTSOsoalC6?P<&@=jy~8wx#-Ml3dZ` zqe@*zcH<_l3`}uMyHhSYb=5RPyA(_3L=1Mz1?TNc>pN@ZOV?VK;_W6Dv5w*9`F`t1 z`3)H8s2GV_U{1084v@;SDh7p>1oH-(=@7W$d3q&vanInm9Giu!9mwyNR~M45|IR50 zzVEjcQsZCY&zh8SyyuR#e2X@GTg9J-4w(KdA$|XRb8|D@(~Z^oTnDd$h^T@s;L844 z>7F{x=alBgduuqCx#{zWB zVQ@$!dKcF)hx~ePSJFPs*Rl;nPs($Zf9T{)m0tIGQ&gFJ&NN?F@Jd>D;Fko%brhc>Z{B&O z@vg5nSIT(~!BK zw;)GvX!ZvqJOw?8z3?Yt(qlqGQXpoFFP)TOxv3}>D^e!jxu2awm&4t!oFZ{FG7yy6 znCCu6fnQ6XSBwN!R)h6A3MpajiVw|_P&?^UeeDPZ$81#p5flZaN}AL49wMzrf_AH) zJkvu(yg=gv1Z+5|#J(=yq1b%_rx)vMx}Thpj1vIL3B_5h=yN3ke z9oFQ}SKn=2b(Srbn%@qJfMlJvmenM0#hf_Rd5#6nM#lkNPM#hvLCq!aibi);9({J4 zM$?LZmqwG%2q3^885B^^R24ytc_i?=?~ScuUP<%kZDPfnq}C5H8$EsfL)N3<*Wq#m zk7hWn&G+7}5T5A97U|)na6(!3YjnbQtxYPL^tN5HMOJoAb<2~`Lb|`Ps`;i z4J7b96}ZC`fLBG`aa61XvN%xkbB!9z{6be`xnux^VJHI-)vJAShbJ0iGH*IquR1+l z3u*ezuRf$N=11EW$&QAyAZ>{iXn>07ip+1xEBCU?ouvxhGQS!WezH}%w+mp3%Evg1_JoK8LqJ^eLokgpEO zO*hR6cpL>N{}cc+uQM#T!S(g^`;T=SD16g4Od%ZaT>2yW-QetTJSs87+YNL3c-*2t zFCI)oR;;Iu8g5TQRn=R5DQySh2|*iZgn4S~fPD|v|8Y>NXq0?F$(}m@g{GD%DjP)5 zcxoZQ9@C^P=}@{$D#u6?9AwrYD;Z1@J;;mJ%D4)EOJ$?I&SU6hE36bB`V(ZQitrVR zvzzO2K-l`8-@VW01omP*#I&M9JO%3V=YaQ7L|D`w!1>zuRjZ^uq6P?m$ypNI^872i zG)CB;)c+@dza>0ih1jdp<1#MntjB+Y zDLuH=3(cz;y4(RX*eX{!3g06-ZwcN}yH_skae9}f#51pp^?Mh?Zalwv%%nP0TB<~~ zkfQw@3B64)nmUErf%yICoU4(l@ZkBb^4SU?SxsklQ}!T-?S>|JWNa{gZ6iUr)!J97 z+w+h&tR+Is_sbadr8g_%#;>kkDbI?r4b)wO3+k1ZjFz_~@*7q#pQ4ebvWULMXdWah zEFdN zguT4KhRPBgS6oU$9i*b&?8EAbIdO4%#&lMl6k>oi)IfQIY2P_h(&QNPvxsg3rVJvS?m&+9{b*%0rq{ zh_Zs~vmS@;>rv1<^vB6Bwd?Je{x@Xc{o!Hj&r{MOy55%iQ;3_k&I+(=)f#*Z#|@$3 z%4m!}i@BF5c5r6TKd>+jmIE70HE8Z}!+xnJ9AoL++XOJ`vtSrOlxRdJ8rNaaF}lNK z7exjuX@n`prdUaeF0^WL7q-n4I=M}L5(M-=(!N5)qw7p{;nAyk?LH`EJq-cg*(zJT zp2v4l$#BmIRV%83OlR%a;|i0`j6gnTPhmN^-Vbg}Lf{$OigD*Tr#k&&Bk91RxG!D= z{X5>r{khFnyIt%vC+N{6`%FO$i38NJ637Ena6WT?osSUgX%eKum`bj=*-s-;Zyl4T zY(A<~*?ktJ9!U5~skZZer3Ao=Vf#!a$jAvggNB5ZYJ8K4Sj)$~(9NW?`q_Sd0rp`k z&nYK6Ou)YIyH>i%0e4o}Jo^EWUPc)$5x-zjnwNcZ-UPqW7SX+{iItO6>nrRrwO}Fv zUYFBQQrf2T$kypg#zJ=WHn&=^W>SLc((Hz@6QlOAW%ebl8>=Eb!6}ew$ykb$YQ>3* z!`+MwKD7?c9tlZUtd@#RS6ENf82fd7yYp`sWrja8bxZTiFqoQlbVdhia%WCUvG1t6 ziheokn?##nytR`YM@eki!F->y!^P}eUt33Ib8tr&?9buh7;D1x&{G;9AbnPd?(ld=eiJXl&UQdSC&#Gs;s!a zvawTLZi_h9GexFLkjWN&`CbcxOe=0}eO6_@?f9Z_BKETZn;IV<*j9+Ai|n*$k+k-@iYUGm@w zT!_@Dk#dvE<&@XZ&Cs_Ml$=(FIg}a~cVZlchQH@Nv^LB)?qYBd3P*S{dj-vWXfbqN z3<%e`MIL9Jy8;03%XBrLp1Lx_?p{HpACF!x~(ai#-_HYClKUDd>wVH^)p zrJ>~b6wJa+$k~Y@ZOt0Crk(bzL3qGt&s>4>1qZ_w&u6cmvf-@!Co;ep!=9$;C7Y!c zKkgNa!45znUhXyA?bou_9e5nFIjuH*7#QkJcHIB`8C1rSGC4lkb)T^=ts-BfQSFS= zy3{ol0lYuu?Yi!qMjb&jGJIyf6o}g{){qgzy8Rbow%(DE5hmRj1X+Riq?jCgdcg6$ zk5)mUo?UPKaWh8YXU_ZJOONjv05(wZumOid0KA?KU1fLN;ag=t)fg6dbtm<8?cnw% zTJH-n;|e(=g@&?>sF}`uPJ^y1UJr`QB|*pzBzSgUQ@D7?20T(jKxD6ZPP&nWEEP53 z(bA4Z9Cu8B$x7=UESA`A`asL+F(|!06~9?usZLSmE|07yRUaXVv^QrxeoMOO=&yeM z0~Fm{UFBcBgQZAZ39Kk`did-okEbw9Tna9?D2+T|&aGeD{O2tydvONo0;iy3S@=e&?gv%U(hFy?X$f#jQAD`h0?7F{uMUlU z%*QAhQIY4vGh8n+#wH(F9?Rp$0M!Fddz4Cnl6*jMTg0*1BQMj(7oH#h`K?E6T*v2@-ECfK5wci6~WvNL0QZph$!6?2JfWKWJ37H<5i`xk1EocO?bz+YCUYbuV zqSuez;=I7z05?g3=~N-oP@4V}B;rIBVWVtL#9ph0p&7)&T_sYXgy@z5h*&8SJut#m ziA{Pb=DBG1#jdKw{Ed_kk{5j%n(sb2wkr09vl05~I0=^(*18T3mlgEe@oSiBEpOk0 zq6Kpjc?hnuIaCpI1l(l4#bKw2Qz?uW$s8YCJv63f5JYW(Y{e`>i$orK?vfdXX2h5E z91P8pC-#p-kuxQ^d-foCK-6W(CrEzy0q3(w6exSDPxVZiWP(=7j0P2B3w)ar2F>~p z3<*-U7=J3*KU&eR_UbUDNT&&!j}BDd$!;gXYCyCrwvVVl8j;0F#38x#lV`vh(T))s zJ-2xSzu}N72=1o-x!;lJonrE$trRBGy^ToDF&?WLgly(v27WuhU8-gV?w`bSyMt`@LuX%gV@09 zOYNTzaIVMP;$~lS1*JW#3`$lr%u{_m2FjU_Wk8VAP=n1dJdX^#a9nZ0=)*Ec2&1Zo zL~ni-Dqhy0oLX910fg5JR1?*3Al$RHjA$sq$yi=ttRmBCu{d1lf8h^)8M7>E>U7oD z@5)vWQ6r_^wsEUl{+N;Zk{xM-DxfLUm+KIJO!Uzxc8a0no!GU`klmrV-{sPL( zKpv29Z>%qg6CH+{re#nIKRn?61tSWkX==3!5&hkrDp{5b9muO?#mlK7y2LNH_eY~% z8&^#zfQ=(G;8sNROH1fQE2b2)-+~RjXJ`oby4%|B|-AzIrjH!SKmYD_*I2MClmaavciFA879%@4LUir`Vi|Ch{?=? z6w}vpomnc%v{FT>C9e*6WDa;*f2XRxkCE$e!WbEEf!KtxeZq8b&mzvm`FWXs-?mb} z(5`faid!pkcO^HU)1C>!pFt%$Y2A~bXys2Q5duG?ZD*&asP(AOf%xA2G}BK`Dru-QrP6 z7xq*v(=m!G6=gbk1qxAw?|midlkvX(VO5w_j5hL*u9rnkCkAUWOdadWSC^WKr z#JxE(D2~}pA$W-zqibbgH4YP4A zDt*nNQ|Bw(Sej7wxU}tK^R>PF3N3J;*5j{#11IqQu^zd|$je75^@cvUuR=sfHt>+l-V9c3AAbDz?w56)T#)L#rUZ8$>OPx8%DuaNJePHB zg-2C_1_8$lrN!_q_mX%!$-aCTLm08Ycw)v8uoos+kPIe26|sm|AGT_L{VaUitgfQuAukw!LKsC$n}gN zXn8BOsrARobd*DH0*>^V$n+77jC7OUU+B=f$ntWAzZ+3s5}wMCao zMV%3BPM{^fH7=3Z}`JVVM*| zsUG$V;4{j}=zoWAFw%vG9At2+B>|~uEQSy=+8`+3DPKr{bAkpK{xbh2`+G8!wKVGF z;)ky+ir4ryB5_zhcdD549kdiz&)PV=ehfqRT+t(=H(Ai;WzhH<{atkI1CsySkxbi% z7xlxEC-sBwt%P0A;XOXAr)hzkyHxYp8;*xcG{*;{2tJslDCf&wTX?s(yBFaebQfCk zhp47CVOhIgr0gxgj`^oFo=w|AV3I!F^+(W9w4h7^YYnbXcXKsA4pq`ZCeR@H}i@g8kn5`!(G_ zuB2Q#q2_Rore=4tgW}T91?sNy#*YZ)?E^Fd(w_PsRFaXgle43Vfz3Y!3!MK+u)xmt zFTC#mC0O`>;C26-uH*jnd3>T-A|iI~DF(7&nE3xLSojor{5wvUqTmdMqxIhqI(kk< zISVHz3tKZa3u9+<5_TpgMiplh8&wjff8kpHpuimeOI+~p;MPB#3jb0n{8tCSe_exz z)8|p7Y)$PxsVfCXV-v^EE~tKps!%h2njI`YZ-xhzu(6$?3H2xSW^Zq8Vq;?KO!BFw z_{Yxwr_|hkb}0NOaYwuhSUAAULBht({ohmypZbpf1Nw}Wn?*q2e?PxZ7)&SOvt&3E zO5l|T9Pyke1P25fb@=z9@_{@-nhS88pHgw*bqECRFL*IxMVe#NW>*ZXQ{-(w6o8}? z%H+-t;RUw3X4chNt_gWmtK-cyLTp(#%W#a%AB-0aeiz32@d8HR=R65!3}S~M!hB>;!=9Wtj&NjlkY?bUN1S!R%{>8jo`ElDjtI^Yfp z7BtGSAQp;PrCb4jg-nomb|VAeV!@Jf5uD)?hsRipVPe0Tc`Q zn19a~`LK8U4ubc3$!j&CCf^=3O^DZnR&3Na;RyA&rl^mwCH(=2N>q)4?gNF%si)(h z!jOq7i!%fp0GD^UiMG=RRHT31?LXmuT>qob0x+^O{-+g%h3(&;XhyI5RUUdjTJc>^ z&xe68I5dcZ88p^^Jp4ZZRlEN$n2?#9^WUT^tZZ!DpEM!xuMu?K1?%-)teHvIR+Y3EhYOZSqOh6w^0x^~t&$PQOJ1k_WMaG_BMmIG#n_X9a z*`kw2!}omiAzXM3U}*C(%;Tu(`2OzZgXNnto8J9S&;wsZy=top z+F(b?6olUlLj{}4PvYgPrPcywAW_6bfS+^a^8;0*@T3eR7(UGn1tpw>!cM5|w?^?> zD_N(ncU3I}BF8KgBBx(lV^DT&#cW}^&XxDYsGPnzUX?J0@Qo-So3Tt}DE^GzADAY1 z+?0Rgc5lbY$8yH05^2fJ5z@r55W2v#JaZwJM;BKeeWA1Ot(9c}d*INX8N&xr48f zc)Pr*1jTTclfsO35lN6~yAx{ef)9qK)X$LBhMU_&;FbtGAR)iiOgT)NjW2~goiitK z-))M?8$NdtlTjpYM-Z)^V>1H!-N71Sbw&iny18F_ zeoL_Gn*T)7jA9T@$EQA&pZBMJ&&nJsrj=JNocf=~6!JtnMwrJb$RJFmZkl zXtH|c5M^(WZ-6_80P({wDxyKXZG$1G+X~~=RM0~vd?RGXo7UlAx8kZ3zgz4RSyQcI z!JD;-@x*SU+#H@;HcM^X<^@Qs60lindj5r7d zjQ)0Ds=u^NaVK_cP4VZZI}x{P(s~+Dn|Q~k$Xehs} z$HM){Iim$2@kV3~&NIUfY%1Gi*=*W`t#zfR=&cmM}GQ+1; zq){9TzhdzGl7*7jnj|uAW{Fs#U$4?e^g*u*5kM{I-^ztG2df5M?Fw%96$v`uTc<4) zON-~H)*3u!S+XY{#kof&fv#Zge@9{*5Ov2g0=EVzQt_2gcKL|>?cpkWTl{X^_B=}C zdB=38Wli2;ENskK-w`Jq7%h$NclAJYXbkvW_cR`fnjv(eJ3#RFW~2`}F!XuSK(24J zZ?7JQm*Hq1AZ92B=tK!BjM8TfOhFajepnlZUmx_ARLoFzqGE0vbP{(>tosjbW4xRt zOzi;LP&ovBYb&GXyaK$K1SaztwS^;Ff~ILN@aOvqK%dtb8B-ezLI?h zUx(q5>GtRS^1|%5vb4OH28j!J*2(7hU{?X)=dw^I&9IBVjc<{fcOtGmw1d-zOjxjU zZ6@~CJ8*dy4F#XQp;Xm9v8(&?B7Hkp@VtoZAI1KL1YhlPIH);zubbp%$otNB;%$Uq zickA;v=QH`VqCj3=--IM@>k`Og)32)`>rhHItkIp`E_dKe!=de)0$zKk8T(G`;Gzd z`!@#!r$arq!kp5J(vo&Tv&|PBJF0&y<(>&ct@{yu>oFrTy)=27Xqsr4uq?*x3fMHr zF-v#^b58Au){2>uAay3<5S=#ilNKm-^FCxhrbliQeopD9f$X04O7|eUsn`*n*$iO1 z*E%@LRXA{=!k!%1vS*-^kxxyitSSSlr6Y;exSR7kD;o>Bbib>kj8Bh8iTCB{_cA_q zaucJ1A}ca#VwNZyPLV)H!OZwQue=W|Pk`!{I1>j0>QCRzA-EUNKd=p! z2ZZ*`QG2llxq!U9DGHamRi;wi?oo(%1O2C%_-84fZ{E#T^De*I6WeP+Y}Bkk=0WD| zkX>zu@9|_ohjayfcmoo7aK87@a@BQj;buyT&rAoOWoSN|Wqp2%%3r(EQ&gXcIZF?a zc~QE~^bw835_W0K@bS>;@plEt8sk@T<@)aZ-|%aQ_h)}oFx$w~7M=7xy;;wJ{SIM< zdXqnIso_23!VDUcbGfO(%{nvXT;$b+MB8ZngO>-KdE7`GJ%{z^gEoS?q}lh!My*<(#E0eI2HlQ7)z%3>uQqTtZ{J75C4v(Tu0kHtI@n2@oo8CcF zXxn(5FxpOoqMQz)-`<)oxBZL5vM;b29qv~NrwX_E_)BW_dF?PzJ9O+~L8@%oV(~@` zQ0V1zEgB@4B1S{~ReVXGgG@oiSp;F6%E@)h(QK@%0}Zb=eDhQRc*Vjdy&o;cWP;g+ z3D0l!OvD%*K2g5l{-QumR`zf5qLKdBrBL5M1#xx6zYX>P-C|CTg8DZlXtp5c#Tj=o zgI}k@#q7(Y@F*b9GjzQ+bN+uEgnG6VU^*?B!jeS_fqsvh!B*eoc4$QwBCVNeI#TYJ z2JXc+ax+m5v%=?i68pdM-#8!_eN2q^bNpJ;&eS5WhMTWO<->rdxhZ6MUb`KyJfA%@ z*p|7&Of2*pT8Y2prCZvZIWDYd1FahA@Uk8|k_KpLH5W&H*9!7!?IwzO5Y>g$>gLBs zDY95^kd{3k(5iS7UQ(8`+uzwOQs4HBN`}!(1{LtLUCH3V55G(_a>H}le$Po>0zot1 z8w$>ysdX3~D*gpb1Q!YWA=|DaLP;7MnZ3o+i9xgeP&4{UlO6c2fl2R2ts*dTuPLh^NCQ@D$oPOd3CiwrMBNpt50CL!Hv4Nph!~# zYI-ed9uI&s{O!2roujr*xW;MRgvq>62yyKoT)1)rwp@G&)mO~24Z-)Tda^?q2KfbS zWad~}3XdV{J% zso$uAD((;-&D|ct9^#K+OVQtoW~FLrUsjn{vo8I>7{Z73O{>ky49iN?X3yfHloCBp zG4Hb5;56zSt?x)~)Rh5aKB6r}Rv#}HIsM87q4-XJ*lCt7OCHPT-vgxRcGBtUDgm3u zEXM%&Vr>k@j*>4jlOL2F$@UFYpHcYW084iywN+?J66P?t5nenwvr8e;68rq(0)-WL zkV6}%^7qt?y*MMW_hn-+_K};n%JCZIy6`%qp}>CCCV9qX8!0`pI-7u~x~#~3_aO7Y z0W$nAvirt};qXoDQdw143+ENw-}@K2z8(OA(s5g%Mi3t$1LfjixnRh8*CCI2tL3Bx zqXJ0ya(l9SGxkju+UtH#HTW^aLa)dX?5>NP8 z#oOgg$z6z0zN{jd%c0YNpNjFOU-zak*NrB{6P=JwD}3RS?T8<0tL1)xp`>C%24z19+;=g?HQM%!|kyy#W zsIl6|rqzs+4VQAL8dJTK*2!Qt(KS`me5?FbW5`Yuv={@!fiR_scY47lds+!#zQNq+ zvoZPwagJywIH$h;CC5nknkO6LmGc_=TKX!}CMyuSwY38Rg+BnPHuz}gJ8UTWNue^M z<*#b?{h$~WqK^7j)-{sM9Zi?E$LkTXX}Fc(L7c{Vbv5G=wJCkl0K&doE&eSud48F$ zvtv<&Z%_X)qi|)rYC*kMrTiD5f`a^8Q06d|tqCq-2qJBJg--luRFJ!A#4izP0?Bj` z#fm1rd59PT#BLe_vPR-J4PSaH93jku(n<_!s*@@#EsYbLY8w9A3BTK;W#?^N>+F}! z#i}dR5aO+zcQpKmi{a05v^`HNIWe!d*##0pU`>7y>Cla3154z?-3$PrGfEIktjO{} z4ZRO8-7Hfl{ELlNGm+lbHR1)7+o{YBdULdvXiJ(nfN7XXw`f$DBKX&71Ir>*$-=2U zl&ptCd?|HnZEG%xF2M+^<)=;Ev(irS><-VRHx(a+LM|1VbqD@!$G(?%q>7FrtUWw9 zK0N$)ypTn{a`eOJ1a2=dDdiNMqq2W+m@X^cBu(EM%~j_V+r~H=BjJ;`f4EyUC|l>W zUP!4FC<$hqxQ!zq@ST^fejBJQd}Ltun?^&>8KDw}tXua)d_f2WX!^f{ns*m`S{1-y74?!S=eIWgfX8+-0Z*$%t46u_LpQs%`fvLHcrs|j^UweTu~Rln zGInGlc}2yT4pM-w!9uj?LD8UawRxm)jmbhNI}iH8Laz7Od_b$=S6Ymnd|@w%-{`n| z4+VjSms}sRSB7>WDR=F7(uWY}9;!gRBrN_&z`lPpUnX!=S))?>H*~e8%{+h#R{vya z(XfwsE@p2TMbHaj-e>Q2XNUCLHxV-T{vn4yr1=)-d*X>mpu>KbdE_+&Kcl6t11AlB zMlFP(T{;Nxse(*9BYm@JLL#o`wJaY#`VPw3iuNO^n_0j(O}{YQzqa_;z`;a?fmvF+ zp4EU_?PoSH<`sCJHa#;iVFu2gTt_1A3Ss>tdkmF35WhoFjckE1iNxr8?ss&oYnreD zhilbPKhC(&)G#a*8gzO*(W;O}@Kn;EY;ykvkxr#AP=#9DO6=S?t@J2ieJSP`v@mv$ zU;**_rD8Fp4VrXt9=h9`%$NtWlBF={&2%P=;K7an*MvAPSxu(*BqA#s;-H$KK%K=O z+G)WaU5kY@f?j9&pV!sVFD==eyl<~fM?{;iIQZkB?_Dcr_1qQtNqdHvKiY@_R!}>w z{|@%ZLehDrJSf$SThRZ-T&m9CA|t{cQ~TajC6Q|bHzEM| z&TPgvd~&-FVV(b@h`Gx?9hRLGC8hFf<#+@>nyNydX~XHBPZZB|45t&^zD(c&YL9SO zQguC8A$DhQW*T>d6OUsnf!T=|XLx36lID*@095!Z;*SL)@Hh%hzQB!cQK~G|JWbgQ zOxCv5UH;r*IN_MVMjlXfe%1J=xqI_#j0Y4#sP(VXL?UX6^s`qOtObdPQ#tpNTPDD< z6tdvk<{hI7^PKQ&H3N;Q&+}@Q8=-*Lk^)kL%$26I!ByU+&dEfA1$P{?Ys1PEMQEfH z(6Z@xypUn%afdQB?K+BoT${R|vNaw)=h%vFtarDH`P#gO(l3Af%vjp= zRvT{rityTWH$GHGnA?h2{hGsp3=mV&`2q&}W|XEm9fq5R`DV?a7bTzb2 zs)pj2AlIFD8`o>I1>FVj3jI0XFiEZEIh0a~vWc>2*@Cgf)$mk#wECC0o0@-3sErae znD{+`oel1o%-U(Qw2hBy>3Dc$Q=hMn*zH`|uU~rhK7%A8ipz=z%I*`IGP(g`!yZ{RxwOJ~0(!Z$x(Pj=v3n5lyU}i%Ec#4dr&8pt6LQ70E4$`{o<06P1)ydppus5xY-^S)}BDPFF3KCq43I z)$_dJTdE;%QgO^y^FtaZ5up40+nUy{vE=gSPSGuFrN;?p<&^00wN=jeWp?9ELe9FI z`(L_<4IJJh!wG>8v_&-PHqcr^Xlvd$UtPK8avL{|H047AQ;xX_zF|JI_pBSjIo>I^ zjgRp^epkdCS#t?j)MhkYDjP@749<+VF0E@`DIGO#TL*39FNG5`X29AWcP|lB*RjVe zt(t(9Gb~u&a_U|SEmx0HLDrtMwOA{9DPO3dG-VLmr6i`HtzUy50x*VE3y1y{04aqEnRsOVm zPqb^$$U3)U5DnRG*TA5j-XGOx7>>?sIMr#V?rx781MK$`@9CvP+)QyYJs#u^JukHJ zxeuSg;$fmTzw1+FHb4AfISFxRliwXW(MdEvVEn|YmB}h8Yf<$nSZJ_!gkP_b3U!S$ zbNi6V*nQwE(s*OzR)P~B%RrxO`9`c|%J*i9=K@W2LAhZ3<$&EtBWQN1Xhg(cg8O`z zIF5g}bqeUhPk;ep-x*=Qc*A8BLyLSGYjl^t%J-fbL&pf2ufabcGsUB#(gHv7T=23E zZ!2%#LmZ56@S^zxeN!aTxTKzrve6vDE zlPve_k;c&1?~T zOI?h7nNd&ur}HF*#A2847HRtVKD^eJx7%44@Qki_!?7J3K^>xatmq5FcVUR%Iz z#5PRFqRaqlo0bd8KuRFOCANze=qJ`_?xr1m&`aLH0Lk_&!8&?fN8C$JLl@?XiAB+! z)$wS|2ppiPdjGXUODQ}^l(84Q#BPHiTZXWIY12}oK$nXK1dl`+=X{G*FC}X7m#+U8 zZ*Kuq$J(ro26qVVP6!g*J-EBOyE_CKG!P_saDoO4?he5{c+lX%-GkhfkiB>Eoqhg$ z?q9bKRZwfz4E?q|-Tl_AHBW12eEsGf*xK=Ry`YmS1^rx%=DFvlr|-t%K3@d#S|`{0 z^7rr6p z90tvj8k<270Vyx{7Mlf2#@qgx&=NrzRP1MxxVTA=PSp3KyXWg7jBn)6Jr)v-ai{Sd zSwxSwk|cOb$1J#GD z*4Qeuzpx3Q;R-<`qB?tDZr1I7w;4Pvfwq~JmF*`%_6<2tYNz3Kdg-c$x@j&wE`O?B zKzPmbYEMP*R^0)K=n`Jje*>vYzHQyL$y-~-gUNY4m#)d!RDhIy!vV}WDJW;+O=~KO z&aL(Gst_yIgEz;CIWmPg?0pK51m$KHPV+9|ETKH?%T;XQGX&jJ=~ux^0n#*f1s)_1 zE3v{cGd^W-;$&smzNk!iWJR&B^aCGa1B$)z5$uldKGl^hL#>EDgfOMMGr$sJGC!4@ z>hUO3|5HF_8EoVmfHVC=Xdt!7 zk_YM@vsDMnBo-z$VL8LdsCr?%)K?-iLK>4=N>^CQ)s4YVL>L`0f(!N5E#D|n)^NKT zqOsenz_lUDpj#0gz&?#a8^`uK-b-h!q$hx$Nww5s6u@tK%SM#*U1vGP{&m+{Y!=Pa zZpSZ3u{rhzB3991ltU=1$iM(n0!f-I`8Pr>e;bio7jh-TQ-42Plvpjp52n&OS?QdJ50 z-8sxY&xn_W?aec>^o&>B-+3Q$f-lu37fvy2z7SrtWx8K7t6n8MnT&ZO+|(G2|?Qg2Ts0lM-w`M|S#i7vJ!LZ zGMe|_dCt>!?oqZsFa>>yYOs&Nwpq${zWh7+9mo4JqVN>568s@Hxn4EHk7kr>iIjGT zhr`}c&ub~&lY#qT>uNH~1$rUN=?nTDmnC#N9b^KQ9_*|)J+L=;oRfb{h5=3PgL<-N zEU7BT)?27ZVMEmQKwDU;UaULS3{HE&sGi09!4^AShX@&IRe-Ob2ca`f>vEQ;8LS*F z8^&V&%I3z=DhGuF84UUDv5Ge$QaB7Y`Mky}txX3H6Pl=@gf3)E4?9meG@gVDitHK6 z_1j`Ja03zJNFbNiZ`2P-w76SLK2fZ;NON-aT)C{|es)*?KxcxV9M|zk>{K3_{Sa{I zOi+jCj*Co|Dj!@-k-PQ=md-!bVXjp8ruJJlu5{}!U0LuQmNNyP)uXRz+%TSc=|ILd zzu5MGz5^o^)h9#d>sSHIeFN_e6s|BLR;j(8gQl}^0x(>#$^`iQuUFTd%22;osbNvV z?AtezkC23izy3;t#69Km^;~e%=fW7*vkJR6>VT1HXE|d?J#?6Wm`Y_+Rsk#xL5Ml! z8o$!N%Iy9kNW5&E_8hUo@_I-eg6l>|iJZ8$v4b~R{BQzBrZ`?N3J!CnKn5Fj=Wgml zfK{?2B{0!Y)Y0g9{U%nSW=Zq*luv{HgehzKX~LO`+fyz>H1|9*e=KHE@2-_<9$UHM ziPiXiz5{}~nSE#H6AKECSnU2N2d7B25>?9ttzb1ub8;|asyC1zUQtnqA8nM;cW<6zF14d`E zWJnULW1J4>(`7EC<=OKZ!BtT@cEXp-6+m}PI?)Qo=y=k_U(`{vOU&zI;o$e-RSfkW$OSoPu-fp|!s}u=-nBGBnrPs~t z4^gM4TkbpDv6IP?#NP;9rl=P|j6A(Kd`?ge&N>GFS%iDN>v>!Ex@Qv-{IKB5 zMY`;4N0D$gQG`!VGR54I2x{1~<<77G_mW}5!9v%k@@z?5QpmleyXa^G&@A>5T^+1} zS1c4Nl3B??+~i!<+%&}V6We57`Nl~Z~KJY0vOguXb z#&i2PSO!^JBUIz=Ed?`7q@>NIX6zRXaQRsGb;6g^Bm19pE1-<;GLlAN%N}N0Vk)dar26(srt?^Ung%P@?v^XR=`J~(!%wogwOdlh{7k) z=gPA;EV;oJMQ>?KpfE6*F|#gB7TtjA!gV8rW}Huz-3tN&Ad8roG`p?{_?9c zZfZ-oY>{K^LKl2anW1M~a@^o2vym-f%7*TcXcHZoT@LBZqlrv?0SIJo;$-GS>HLs0 z2?CqQn7g8wG}uT!%;Ahs{kuMdM9R^8?Fe)AAj?q$(zA}1k zD3f`_+R?xwEd{k~36(Dc17p(t4oW=IwSsPW7h$m_b71=;Usx(SnQ91Ovwi%(K@^>k zsRT$v;~u~Tfr~~cv4_SyQPCex>=K$s0< zU-#VA(RzH&(r0QwGab{X>3C3rTR*dIP4zaUE2*T2>3aFa7wwDXm>>aJs0OxK{W7DTZu&^ciwy$R0-pN0RxH_M4)aRRV>f< zw`Sh>RhVB#&(;VdZosYs!_q5t!@gnIQ@^dppwAnlZyhbadJ(Z96w+l2v2*3NEyrqs$FdFztyN?R zO?4N&rRe~o`kx8&?}F_LWsR?2A)Syri5(1}j0kFVSdpqbK}&~#?)B7go{H(`htCxE zR$}ke)TqkcCqYbqJWX0lQe3#YE%!QGPfMWD`ACf{JJ3Q>_v|vO9U|-bvE8up((`N> z69#G&=R=yPettzfTOBz11Xb&uBbi~0Lnx2ZkBVbJfn~>_iERr1rqX%dQcde_vzNC# zj9aj6`+I$4iz}US>bmd+F^v*yF!q3UkyW;4wyT!QL-$s$(2ec3{a5a%RXOxaz{N;O zU8^v`(WLcgUYqac%bUS(M4X}taSRLJ^92^A?P-n#zr+}wsh3~#W=g=s;~mgNDz{m2 zT#)qx<{Oy?QhU%a_BnEBVVN#vc4u!gxK!;T|Ys7Ati%h{wWc_J>6Wxj( z$WrSMgc~H$OP)+h7Fp1+_Fm}2yIfA_i%^x+9S;hZCHzqGL0vX&+wzuE!^Ch8#;XQO zWcRqI6eWs7>YH-=hU%HVttxLu%M&W6=yv~j@`(GH9?qk?f-BrHmMY0Kn-V<59Dz`I zo_CRkI&Nn06M*qeBDMmmp!_ZS$_XPq(3nA~f||^kIE6Z(Xlxl?znIh^4?xC$q1$z2FY)>;*wYOHsFd?51EP3pI7;p zvxYxAL$TE3Z^WqAH_q{%986~C89IHCRBl?h%}nM}cza5By^`I0d$JJbm^J6%3h3Eh zOAQWWnkD1H3>y#03^B7D?jOx>ybl(j6+q=zEF~Z&(r;z1t~5$D)m9)Xf`vxS$t6?7 zQtvmBQuWIks*Nj8iE@E&l0c*MjLdSwIK_OYxJgTIN5w!-Pm6-_PCaz=1=~&iS&x#5 zSXE#6+a|H33KF65=NlWkI3t7MK>!5QiUKDF8qEM5Cgz6VvQ*W}_nR;=4P+)UP!(O- zClcA2FBCO26xuD&D9M#58FOl*%~^_&4PG~OW;I}X9jRfw#?Upte(fX%T2WtVy_06Wjy$XjSnGGPc&jn;;ue2H` zvuDs;ssJQ)jGU;iL&=>y&8j9Wz8)dwA91*)yFcqmbb?8jp7q&+wTeMY3o$Id;c7KU z?HXm~X>EFegJF)TzI9zx^wH61gkW(6K0$j6F0f)jCISOC?{dTA%*T!KbkeKHS4x6h(OWlzgbT|TRQjxsj%1n(? zE+S(bc`(Nhvz8 zG%uQ;CF3aPIcCH-#?8#Pwxcx&wmFwl12pNx~(uR`fqf%z-wnKLIt0u9}V4CZK@h7x|9Y|mxj03nHb zDYU#d3S>!r0?!o_3nb#7qxCm7&J7IA88B+8V3g>R&=Plv@&q?FS$lpOv5PR(YWwvk*rXJ=QR@4O+RS5>y>aUZ)W&6^i zV-Na-F?r%y7p0?|z~&PoOV+pHJpHQlE7*N}n|Mw~y%J=S(L&fxN5V&3opHM46|K~# zJfC(b-%OEuo4}NF^X)K0NnY`LvZ1WJhgnc%8>f!VMep;pjwXfx&ac4>hMs3pmc6!W z#@;#7OD}nc5;2)Qg?NO@^(t{JizPl0$&8=KPocU-ls*rFcCh)qihn)pE4B|>ROh}< zG*858hV_ggyS0=#I;@MjyNdC5nWl|ary^ZXpZKeb%egZh-|i4(eOP#+SJ=H>y3!v$ zt#lHEDHMk>jbw(r2Q1UA7wo@Of_YgE&ns};dP;@lc1NQ_b0Al>yL=W5_Mr`a0-HRV zt-p+$ZF{u+Z)&#cQ;cV(fYD`Iky;iT9s&nUg@{56(JCS=ND<)p`hSYiU?U z%)m=0;j7s*S@={rEylI+(eQ9_bLC}vUQJ2ozRDYLd{Lyr8i3kRbuptgtqEOCmD(3x z26>&43!EwatDZk?1dFTWcevB95O@imDV|maPVUEY$*TBkMsi#_?nUf`opONd*7 z!zog-JxWy;*B-8oSE2oD$Q~RX6_=%cGx)Ie5FHwDV^X5sXHzwNh17I3G}K64Qo}UI zW6?5hiB~2P!9dKQ(C{;_3c~p{v!+EO03<)9;Z?vKvpB;6oiZm}YwIRp2Ue3DJw!bcG_wKMknKCi)7q8j(q=&#!MFjzO8o z-ontVgrvyMQUPX`!LemZYGZk;z2nJW-K%D{V;hG?tMg{KTIkcKE=V!Ico1dC24BGN zW7|{X-S0^acoEUGVHy}GyQpEZRhlu+i(-Lqav$4V(9u_haCfFhw#DK`OIV@GAFcMxLf1~w<=_N zEh?5sNO->V1c(*)MCyFXELC;)J3e%p!{e#e*mXIx#c{2m+n;(HdAn)1Q21T=scTXg zhM3AOBGcQKI%7{Mu!8K7{F(>CsCq5MYs}N;#}R<%1f6Ox2)nc}@8S3I%~fKohFY1L z-xNZENC_B?8bjJhQzCV_ZR;BoGtYu8hgcRNJ&2CnX!q>V7fK4Av?L*>I~b?WZ7DPuIJ2PmLFL^9#|4vP z>=hlg$WLUbhl?l9%e23l=Ew~`txtUjI(d3 zeR$8+RW2oG>FR)NO&{00p_OwXRXWa{oNANaJ6ttXH{w1rs{5K@Q%xgrK9MK!o8Evf zVAL|<7IG(OhJQ)BtM;AVjDf>qzfNG=oB2|7{`5j%4tf5;h{r6-(#B3Z;?1nlg>~A@ zI=|7pwU^vQ+J^3Y@0IcQx*@pvI=38;*sO2jZ<$}H0r3==F0UEk;j&CZ?_ytS3zxnA zGV=NL)6NjH;3S2u(gg*o6#S!aWF=`TeSr2yt+GbRZafwKDH+V~!SDj5bNSptXysC_ zi86VygWy`Y&+7{`hWp>}I6LW#_$|9EjC|SqWMF1hIXO@fAll;?FlAJsMb}W?@50%! z?#`TKSg~9VVFMbHT@^3|{mf>F-y37rk)f|QXT7(;U=)&z6~@>NIsYx?ZE28!+!nA7 zSEB#ag}bD=)1R=-)yS!fKrl7Ee-+-GnM3VB=5@~UhDV2UV>^WLbg~3}e|Lk|F#{@u zu8q{3t#h(Tf4$S|cw-4J%6|O8WWn3PTsg`Y6-K-EbPHzELSnvq8ajdjgb8Z{maLRw zS@?KD2&_RjtU)~zNvyMb8%_Cebr=8>I4M*W~ZEVBEiB;t`mN?;Q^gx zE0_4mmb&W>EpVGHpD_vZQ;12^oAGw`9)Uh(V(wwS#dW?c(B*0jK6X@qfG<^4JRU?sumxEH$v=M8< z%0kMWt_h10txJIG#{R-)7!M6VT;NgeROcCW_v}>qUEqa4%7e+n&@GA=r5(k&n`U1i zHo51~Dj12p<>xM^NSlR2SFY$6TY_?B(fHI3$g83}kR2+Fq4r-;3+X3>>jzcnP}HJu zyBc%nw1!{tu4&9%T@ig0CfW>p&Nkv`%Ita3FWpi2oT2xnwhwF&xbtc~aJ6T8l_Ysn z@`W?!41O@f=W><03^sTeOAd=3g|b4^OmYIP%0Urv{3=jgJlPi!*_?#Mrody!NvvTP36Hd}CX#T|cFmo3#-< za(cFs>Mjnv^z{a8XusB+0ndqbH4wF_L$bd0k63cNm)CEz)o~dcR^7l#NFOc9Xgd75 zx!{ju18&verzNNoK`dt#4*pKTvmO8RrX_~Y;28$8Ec$*!Bte`IwHyTL?~{%WT#T6TEJ<|X0edhaFfuX z#S)WG5sP)XOySdY)O=EkpgZcU*|zC6_PXawn$6_p91lqQ-*-@IJ_HYdZffJHGHQFP zmC^McK&E57Bu!`k_@= zx1A8aGoxXuy8s1~5C{L|Z|zRZcrwsxrBjwJ5zT&s@L)Ax^ymtUn%#FMXHpIJqj|+a} z^qX0tmf?0=79t7VyPYziVP~7kwWeEJzs*K2uhVQY`J@O)UHTTWFf-PxJT)@XGdOz*HQZR_llxm$1 zy--ETI|(0ZKI{TA?tOrjT4+cy-dBY2*?03&FDPK-C{@Q}RA0zQ4GpEE4h$oOfHOrd z2|aj6%Vc$$nT(z8C~*24Il0mue#4j!N+r-}n1b$3gcn<(5y2ugfgORjgIyw6z`JFp zLg7YuZO`j^fjC(2Xrj%?O0g&ujt#l4uCeC3l{0hL;)e&EH;w3;g)f<%m;mPt_b2qy zq{kdIUmer6dKfRistfGH=WCX5zzn7v*Ma7Qo{^bhesuUMtsOc_&*weA5I?x5k`!2a zJwLuNImCgxKcqZve*!@A^bXD<8~+NyW~(8vp3BZXd&(MP&qL(UL1*6P_9E! z?BW;$kmS8iX{qD}f+d^Vp2T0+SX9GRql%FWO=#3bWArIxfarN_UJPD%jMadVliLpy zzGxxp=-A)eblYHa9;^%vqvzNk+>{CK zq}r6C;xm@OIS$u%Y+O7?@=_en3S?+T@IGVefU$X7?FFKD<*Hb0hv5%z33aqT# zMYsd|pQ!luYZFoITKAU)H9+6y9N)uV5bq0Pw^6TH?++(nkldWG4$&{J=3aE71y4oR zRE4$P$1BFF;5B<^Jy~9+;M}ZM1;ZeebUh{4G+_DNW>UG`cw*aCkWOEe*Z`*rQ0e46 zz-zf;LF-NC$q$Rsjr|%{RTR=XiauHch9zu>xE@{UrcfT${V5#`%(Kr#4r&f{ ze%27~usWpmsU5Zubzloh4vB$HNNErY-VVDRgb?me%AW=vK{(LnvP-szE-yh|veq{& zUxe+i1}+GGz*~lFSABW_kqGY2Q%~wp2Lu$y_nc}|8OP3jN3EaPk_mHoA}gp4zKPpK zhTy5*u2<{}&e-$PE;a#u?z3kp*0zYFQ4SM0i$qjuq5&42h`Tf+M^OYK*Jnq#cjPG7 z{iMN|TU=?h9a1V0I%ppQnBPm6Lt`>o!A)C|%j7}sTE2RR1$QS(em1^!7;6AceFj`g zGls*T&r>AftBSp@zNw?oczbqZjP~*6@J$(o#v6j0@MjvqXRjO3J_@=CS3&Nsn{{%- zO;5OB8NLl>vMAwDNHR#OTM{+ok_A0P1)tIy{z(d6K-w@N$Qc#Ok^U3eh^R(a1FUn- zKqx1+A?i1>7ppo!qG{pfp^xVQ?tQ4~nP(aTv86<83`n@nBw~j91ulI45ODCPCPV&` z80-)>@I!g!rYfGaw&q;HwmIYJ)dzU+O_s^URB0?l5%w4a*&Fux4*bD~IS!=3b?6#g zR<{F+K9=Hn)>Y1)u*e#kttI?~Rhu*^bPEn!uC$wHzdJV+OE#%@vb z{iAO$AYO7@J!Q8gND$&jlNo|`1y6;oWhpuwJr8zGXn|Y(E`y6 zE%kQvI~IwY*%!#tM57!iU|fCdSRc_cxA%dUQnGlzTC`$GC$vT=Vp-1b_-wqAy6~Hu zMC1e(3g`-lmNW;DX>L2UUVg>Bm8!O#1C<8CEom3K`fMDKD*oc01;)OGl?vWegHmd z$Sl#jj;oaI=BjNnEN*H{o^1_D(8CR*Jv$gu{u>zKgO<&NS}*WA-o31loIA+zrvBU( z^umuEXYfLLliKNB=q10FdY7%6Obcsk*gI@-Va}|`6CL=0@RGQSXf;^#Tq@B%4J?V4 z62IH2Y8{w}z|Zd@w1K^H zD_h17lsK}fA_+uN@0T7_qD<&&#~d#rR+E%jF}A(JthFqgg#kQK6x%vnrNlAMho^d| z7E#H8G#Rxg!VuY8AM#!B#>d37bHS>>hoaEm+j zeH7tc4^SD-xg8fYHH@ODsYJ6&?lR2p5u;G%(f#HVFJ=NsD`xiMg6q}d(}Ab0Xw;OY zGjeYxDsKTw4qxDFTGcIU@am?`02+MsbQ1}ms5aKO*aS>67h(HEx2rJ%;tGg#|g>jveU;4l54Mtr9)pprH-`U z3Ft3=eGUgV{d~+L%;{BXwOtpHTI6c#u>x~(@;gcL1Kcq{GB+LCQpNm&S4+vf=E+JS zCC%3nJ(hHr1P;j>b>$4p1QXHs6mZJz>H+ceBc+$ss2PPk+N05ws|9P-Gpe8Uy>m@& zBaX2n<4K))u}`MQnq3(KFgDKIthj0>W~-wtXpQopj_5z%IG5n96v8`Z)~XUMa^~OQ zXO7~R>gF#5F6|^QMsrvWV$NiC^qFTg$*&G_PntqX_qN=RdS|UGB(=zGW9=-nxEYHd zB&B_-YpLwTqzfi3&s)8w!rh29*>XivRdW2CWZ}oP@~U0Q*943s5d~}sAKGlCS zOUZrmaWO_0FfZlHF1b%P%9Z?N#ZodwR&s>g&wq^o(0!HaonxVSi1)S6JD+}AG)3m9 z&XN$6Z*{K7rRp#@Ag!olTKHM^Ty`|{0G)zJPH~$_UMsbb#iR!yrdN)gl#Enp2rgBM z(bgJWey2A;CtEFR*rn7rXH&x3<{Bh0+9Mhl6b1TzGU{6XTCQsE-lrnT!t+zjT|3erLb9t zsY%jdv$=mvVR9ace@*R*zA2N;C7d)%lE#x)>f3XD{wYYZYIiq(W;BU>%f(r(9ab{f z6p$UJX4Ya38aa47qT+t2#k>%cC8s%6-CX0-z?j$45Q->m0cCP=o*R^B9b7}`lWXS; zLxRw=G_wSr^NjBNL!V#Lq;#r2qI=d=s>rafcCrQc67hS$rPn%zQx3irUn#B@y ztu$F(d+GKPoiDv`bK10I*xXoDV`*`6N&18E4tq^?HQJ_y6?!A}cdY1jyD)d|Ko$Uc zX1X!V3B^Syyc)qLoucw1W>2(s%=3@iTdno^>L&H3evETky(w;4RrZ$J)}!#_Op_Rv zRYjI1PtYM6-AbQ*;S27W@S^lcsoa}1Nu8U4*YznR8b?@xf9c@f#F}SkNmlJL8uqre z7AuRVrV(>`0G3a#6NVbbM7{%2OQaHrbs~>DAQ{YVsVi)_w0TW}ZWAlkw)dVx{xv`K zRK^Z8VqL9puqp<}nyU#DUEpi4KB@6-yv#xy)0o13w5?rBtqi;@8FTF-xJvc9i)wK7 zcA1&nckoYy-CK+TXQyUqD&SZN^~aiu=;YAWl)j5ni01Rux#|}AERL%nVC-1~`WaTw z2c?q6W}1+V`21opKOa@9X;|%lx-R)F{*{>utP-gn(6h2c`ItNjw9aUnETr4|@Ciw~ zVDO6-z&2AqF-M?VBs96J6Z!s1+uvT~wbUEW{1_q=eP?_9A|z(`psB)EHNWYYh>X@+ zJwF4Bm)#i;RUPcE9H_H`TZwskfb*{W9Mn^y#bH??gs06A>-~|7#ai=V7X77{)0BpE z!{A&{p%_&+uejkwR`Y_~n1c_HnM8;bP<4hdqmS4PX>c*LIRh zJKQx>PCY>D4ncKzmiHJon#%cAeDBh*o%wsSOaJ-d14H8Lhb;#=*~JHf&v&C>i@=88 zfeii4d*Q|huH5fsMB{IG&jnyyA8rDjIA2f4KKAN8L0{eTorF7ZbO>p8v;df{cJnZ>uG`C? z#Fgx`ueE1e3Wyhc9m)d8sl7-{QF8bEpo}LKK@VIjd=jqEhRPZQ3 z6Lc*P_)bQx^CFl-FbQR4SjhvT$&zG+MMhyv0QCmy3fBQ~Xg|YWl118G*}w)9 zs@6ogcFzyvE97%8ln7vl2xp3qvB=9nMc*$fYl<$q6>7Zh(v}iL~dBwL1WlPTR5^+OVbD=aKh~*14Yuboh_DVza zfu93jJc}S_f^Ft8_0#vTD<+|F4rud?jAQD&S?H_bq*4C&5;r0^ogz3BA}`S-8{ihy z9KC1YF;MR)MLWqF!_PonM?F50paLlOEM4d>G}yRFJmU z$-6O7LW1xuL$?fB}w zI{1*~-dJ^~<-RU7wVF*Hl6ePlFfy;Gsw&l4$z-(Ek1AYJ3`{a+r4B=|Ze)3NR4}gd z;y4k>u;HKj8~eFtTM*X^FTeF8hm8UU%?yj6l3|2D`2d-ok&2busu1|#@Fo`F24 z#%FmoM~k$uAvzYJLZ=`O!PJ@b9QG<{n&i5w{qC@*^jqBv!oG&FIasQ{A}P2+yrn&8}SZ8ZZJ&8&Pi-H<>OR@>l7nj{Cyyo^_(swEM^sS;d>WVMRg3D{~&22d8?C6eO%xK#)F?L)>JW!rT%HD@jg&SZ@CR)7d8_;vKX42D(G z#DM+)Ter#xwLLY07C zc*E6+8c3`|T}R!r`zgWTs|%GTwfh#o+M?WQZI`al_SwD}b9HI>d+NHJ>RFfmtKsgh z)vaqF#uRuAY5EnHb!-)u6B(E|PrG8qQ&}h0jegoRVA9&*?d1l+)^N&{dBwsvnEhC^MQa8& z2ZXIKy#jx=uFYY5xQdFDewTi6VFjWjCS_i_aGA z;=~N|7VMJPyz))n!M~bvBgQCJF3H$z^_kZ3Dw=z)ff*=ksNJnb?2fP~YEv9+TT@<= z4QR&O_J0hiR(Z2Q@9FQ;j@(P)Pb)cG)3f$IJ#m(|?3vv&VllWDd1U-joN>Ai!7;YD z_x(8tzNTB;0X#k-rClYSbl1^KD7uaXL}PTZRNh9N+usdW*yO)n?yBDv^J{tDoVzMq z$0o_&a{Jpy6UUxvUj{UN1R}~L4a1!Ez04ge8s;~!TsBSWM;;n?1!cGm+4N&XKS)GlS+MGc*1%ADQ#d`N)Y5 zFCnnB{vdQ@{J-UM1JOa#CR zSvzHlsG_<5(4TIh)`{btz3U?VRz?0BlTEdvuS?Zaph+5=LzLgUQQy3gpp%grfdL3# zEmS#XcxV{eE+z84DalA}QtIVrBZfY%no{SW5qfLS2q11T^u#SMdJ?6Ktp@W2}rMZO*2|FjpKRu6y@voA>0($Xx$zWq;A)y1EBVl4;WFi5H zd+d3C)r_C!DE+)%&d}C0(N6>d^Z%!&$MtVb?}z;VwTi*@KW}<1W)R;0Q89jNdjI`s zdlvS8lDsa^9Kz$korX6fYY z0+29q{oFG!$QU}ikT8Q<8)yUZ8yWV`v-XdjT9Aa9>G5JYQxDL^Og}KD#Gqj4^uv)% zKZS$#5tc4Crd0P2PXwPhJ+XaK`h?_(@)IG@uOR5vkN1q9SUjBY6MBx{xJ8KtA3d)NYC`&i1@8y z34&OvC5FR}k&%P)8Q@J3>q1UM=1yO{^R*aul}d!nI88Cj~4to_~rS(oc&AbM^hhB z!b;CfqGAe)oRg`etEJOVuJoS~08H&b9O_m`%#6Pk0+9cH?b{y1&ir@SAK(7vzQ;oS z%g#r`{v894DnDw%LQkS9Dke$dY+-6+Lt>biCI*i1hcADtAs{{eSmW{FZ)<;xN+OLo zILRMkeoJkTm`4r%<3E4->CvX2+9k$|gFpKtB){b`NX(;=|Dfs@sD4juraz+psN%nR zh3PTAk6vM>Cy{qEb#k*bbtg$27Xe56Lx~^q|HcKV)BOPBugdTrF8STl%%D^eG%^CE zp{1eAe`efIHUE+Mhn~!goFu@{g7Y(lnI6~pOHr0bAW4e+k-^KpM>r0+(5PUA1?uqS;6#2X0!fL=$L;=d4v&YG{8SKf{C7mMBc^1)QQB>&dlD) z_NV{gXJ&fz|F4+-SViW)l>48{{MAGreF4(i1*G+#f%qZnmlH&^9}7g{Jp~vJ zz@W?^Zm(kh*e(TsdhfU5^Hcx7oyYn+ihnxcZ+-s5?B5C+6%(k+s5+aPx!Qp0jI+I~ zldn=MFg}LzF9b6GlPmUSBrc$`_RlIm7WpG* z+5Rd_z|ZE%%=kN)KxOeqKLPbNOIuSCQ#&_HCwsdeb0q$V)o?$VJ8y%9eybWALM&IXJ>MobgOX2t05$oZ=>CfcH%^5;`TS<6#!XJ zuT%bEf?=Zb>x`MzOhmC}pbBtE*UTb3d^DJc9HfbFHx(HDnKmxCSvF7Me5Gz8YNh1; zhmeP~uA#`m;7|0y@I6%t4S9%&nMjIE*vBd;FUBy0)SBO7#=y2=^v|x=k`0K;4l8w; zTi5mI^xVI|gHx_Jw(HAHTF@a2E;VxA7L|5XLbQZ)Bc>yb!Py*tI?N78v|3r31w;F$ z(lF;<`&2@|6HeJ;M_$lmCD5Pc!0)@Viby?#<7?^`jC`I(D5if^R9@wdwSddLIP+CU zh4K`K^`%)3_fGq=rO`r+01bLKC&lXwoAI|ZU92Jr2Sg-c-t-u$M5*zjWnKG=FW4vH2aDA86%jZQ!AHP_KnqKlqeaZ zMzO~6Xv`wC#f_yS7H>jPWs3AoDHc>u#Ufb0Bk7BG$7FKgiD+Wg({v=Th_u$rOY!Jx zBw!MOqzAJkYo{fR#3XNx(#6%L$tHDr=Uk|`wf4f%R_`V?4XAlhLT2WF8{Au~JrPP6 zslK`srT^3N`nZkIM1v1u3b|Pv#5;leVK*Y53}XVg70Z}a*0OO5-9B35M>Wpm0$mFyK zQek~K8$XD4R|B|;-6vNKLwwJR=pzN%!fS=@y8WojktB2r?zwGKT*VCK%c&q{rE(qn zYD=i}b9w~dMpoX@1|^JG4i<%4iRQ_^Qi;M#kyGAIwWX#CCF2DbUbneGSaY)2pv6%~ zWV35?+3u=0>2{=e+Mbibi&gnbzq4JbY;Kt4nPTZ2Z46M=%f>R+UN4F6H`^)uam)Gy zOwKr(AQ3jQaKTz2vl-EewUAm~wNVQiex+{8g}PjJc>>;yO*!npw->9Xf%Gdwfbbw6x5Qy%!%NqrEZDGrd~f zP_lOC4=0G5T;yIPm=-kK)#Y;V2fGWYx0T9l44zRpYu$sT%kEUu7&MWV99Djrc|XyX zGYx=vFA-GkkSOjBtItqH_Pnlp<&>W}z7JRPK3@Tjc&w?{$JIh#oV>g$o#l!VDrFWR z-6F}tj?CCGD(hv&mJD_sEhb=>Mz2sAd;qfP-fe5tEKm5>$p$n%Y0zS4_m04+eT&0w zG)!8Qc!If|YMMNeLgPTkgQhQUP>d&`Pf3sTQN8Co`15)K2zXcL5A_hXCbr+qZ4qBY zQEbKo2(qsX6V0cqCM{Llr`2Dy?!4de!S*V1Ms~lV@tYSRdU6mPvIJH?7;-0Kvf)!` z6$qo1ldw-&BB!cFsMwYFY#E&9RF|G%{AAoK#cl@B%_D(rZxICOk#+<)dqHSVd!Ku}KVr7Xyn^tE zYV6KuwD{2HUhuELGINJ#{36Nxa!7SbQFim_^lPhk4?Q}?smQ2AOBjY4A7T)a~jfA#mxS6 z&0Y9nk&Xm^zasczuxB>*!pDwt`2s!;gp;FUgQC!pM&!VI`-z@S)8l)-W<5vFBy(cJ_N*T@~a=!a@=_P(Y@Z>qqS;qRN-oE1`xa6 zCZowlFYW+h0mMkrk6>Dx^ur+qR_AMcJA__tr)%vY3j#J5YkcVld_1=dLm>@(o1O77 zyc_Ky++Nf?RA~gMIs|FxTVJ&{h3f{u>uAZA_Iv{*0Rb}EQ?;BQpK4@W^VTBdLLqti z)&1!`Z%ebpps$xaaGFsW1ALI~d3SFvo$i;yss(}870xH0!|RyHRe`Lh#3s$!UfiSm zYrEcvu~6Zm;fD#Mc)L?OQb-9Y1K2?kyX?$85~RQ{)K7G85GSj7L^uYiY-J0=#-?fr z5#smub;oK1Zb+SFRWo;(UU}Cfoq0$!H=04a<*qG+lC_8x$HXdYKUH0#wkjMwJWm>} zRtkXnzEHQqcsE|eTCuk;xsp6I!e2>RMnJ{iz7WLU`q;u%*sgyts%O1Rrd4aMUX{OD zz%U;6+>7w3}b`GjnI9c8>y*pGh;Y!?}aAL zqSN1e9mYs6hI2Mz{?4!takopLI*F*4d_}S<%m%I)hrlcU}J(^#6c1A@ijR;7rq_xF%lqA zPk&3`>skZZ@@!?}=j#9eY2M*;95j^ksfO8B55}$jW{lD1zzj4mCh>`5TYE1*5ixLY znzMpS%pZ_5*!v*Bf_10A84xFr$#DKUcf|Ox+|%N+!gdT`G$VOm?ILUxFVBjJbLCq7 z<6HF92Y@UlF~IG*rd;cE@Fr1C0N#an_DX+dVq(sjd>E>c;P76*_2Dsup%(jL$y%>p z4goxrw$9&_A-uuYl|EcMx}ji+x$?wrtkdx%#Fc9o+GJ%;@H?mqWI)P|kC*bjg#IX# zEFXlNb%e57x{ibO6t%-W-zRTiL26wS{u2KJ; zdJoatlI$2JPXF8W&p{AJte5DsCbvJj;fs&TRWh$fS%lBXY4aCz?Y;>mjx6VKv?)8* zECFQkSTUOc}P^Q_-7%B8Hc2346bIKm%~~ATv$DabMG6$q@7IW`)deBu?t(Ym7=y zVt25lQ&-V_KM{70p$bQA0*d(q0*adfe5+(L)SNkX;!1NZ$FnL=?Bn$nyH{2!xT|^s zUO_Y~dTFRUbZ);p`UipFuHrx0Nlr{NTr= zt^mFrF{)MnQ=Ad|-s_&fcRqvr6{7}h{$D|!ze5`~HnvWVM1Q)*|HV1|)BP3xUpuD& zs68-7;3fcZ~bL1a>_A8?F>SF)$xL@B$&`Z8v zBWdWQ#l*o$$N35~GBR<{y+%@4UwwKGcGg$N`SoMwSC8KLw#X=M+$pllp#Pj0``}0!=(%{SU$Z02s{q06YN~@mF1t7QasPEj9 z&keKu=1A^kkjwrQNZjm1qMlsKI-#$~qUZO90bU;0E=D3^T9lKSSnc1RIoe4cN% zcGj|dIK7@vM4g(xPh>On2yWdt5>)pvB7rOgKo`9u$h?S^kOL$1!Y7O@wCi~{mwKzi z2n^#k&l85YnGW6=)AgLBnvu&y(d$`Z%P}|8!rx$V;~m!#p)9hlNhleR2xJ* zxhFi<^tULFb+-mXYt)>_fJC_wz~okJbbk%2+rT)@0GVw3Nib4R?qnJRGtcdN=ySuY zjb7+D?dEh%*zENjnaku`6vNg#SdW(k3b=7#rFDu=#Z1ha;dsp=M^~(3b(1y&9(3mm zktq^3+=cLAsp+8I?nO0t(T3SJjFph4gRJ|>AGAa5uU}Ui(;`X-M8?Tpk zxh2SouF4qmxV=s_z8}#$m*Mr1n}xwZ-57IJfEj@yZi2&6w7tYb>lpa4n^3Wq;9Vog zjp)!YD$Db#ktsTR<(tF2Y{gxgH#c?rBMwf&qBS3;dXoeKg!E@b#o|M8H86Pn%r#uT zF?00xbjR2tbD1;{@5$Lq#7ubI62uf@$hYnD&NAYF(T99Rzqp+@Z8aYX<*i8^D|Bf` zy=h%eE2XeY@e$KWu-nXeLNOpH(Um{~k<)SClZkwa0ntzO6N4jJJR02NvGEis=DBpR zF^ZHqA@4N04_dQx$M|%+7XgG=tzRi=7=|ocii`J|nogs4BTlnw0Y604yNW(|P3aZJye2 ztUxg)t~e+p*y4rx(?7`Uyh($R_J1E5$9yN7&D4Dc0zheUnnqevBup$hq5GV^k63cV z?uo7?`9W_?$a_wCa3VFG;0;S%+C>I8ZG>a>ePWogLh zQ4mDMgg4G%x}3F91p<)a-RqOC{VkGJ)YL5YPJmC?6b+&5{M3jLGGZ&Gjo6vw^KKxb zX-LSoIBC8E#WEELMxW8A)YC<&T1NkYkm1X|%mlD@c<7U%Z_XZbPVX~=;iD2g*uUxY z>GTAimadbv`yE`iqDwg}2S}Ub?pk9zXrMW!qI#hfDx34wo$3I>9`7v$9oF1;B3(TM z6k@(=mB3tHv_&$Y=#qSjy*yP*2v{MCwjlf``~aj7e>@y@4PL=C`u`NmDX#kmny(?Q@?@7HPtF2s>!Zf))nFTu?4Etfp$L4dOF46I>P-^t&EuTkK6yjncSvXDf(bCA4 zca!rx74T9&Sl)hplR&y80arq7cUJwigrW+}8TIXO8nZyl~;5u2!F z+9G%C+DOp_6p@g#_MTGPB`&>QIC+}c@Xl>-&VP5u!-FCr=}Cj7PhpP6Q1DeF@hI0m z^crMH(iVjeTeJ$ih=FGQA#4n5#4MM*Guv^S=gxfe&OLV;jOUQNN^5!4WwiTjyp*k6 z{S!Iea`J{gq2eh7BJJ>sN{)w?Q8XAB76>?R2qs-J;00$Aghm949#2)1va8{=yqRc_ z-o(_tXk@qhZa5CnIr2I7nkYcnPMEr1fZ~E}QJ#`jubUeML*FN47!(v{SeE~d44)mp z3Y9Fr4G9Q@a#8Y|{$U7ToKg*S%$qnORAfAwS@JuMUJBvia(@oIX~V139u|Sa`2u3G zaCK~LfC~xRh|A(x5Rwaq@LB>D~~#F*H>vrdi0{#$Pazw;GrQ*Mbm@<)}}mY zbk7bNZ_R*nvQ_qSY_5`NgB)_e?W$J{LnY`Nz!-vDie=-T`?mdH<9!Sx7z6&oYTT5h z?;c51pFlt)!)!im!2EVBKEXWM$EuT>{<#6RpL5m_hV{1#nWS^$9Zb43>UEnl>!n6( z2$J|z70&k{>q?&PX8S6#Fz=a$S8LU}N3ts{sHfAxCDX0zoGCJaDQl{=tM!@pvO=jw2KyvlzR%M~r)c0{lL7*or9} z1k8UuQWacx|3O6&4z0?j;^*-;DFhN5G*2VE6PZ- z_a`=d0!&N3hWFGD?<;(@cLjz>-*v`kuHhE4z1QU6%>AW5F+@@tPEVW5xjY0|m<;6L zeS17u(_!$*$P64zCi+?E(LOsCJR@Ko{9d@+XNK`^_c*fNwOEvU|?wi*Hm7Fpbmouf-=#I{w zffO>5-{H~g4W~M)jrMu=)|3I1Y;LGJWXp&qXYr^aOpSf>)L;xJOab<=!r z#W=``C}sBPG6A1s6M7)Q#ZQu4Oq$}LZ4%kaLgRE%*8o#`lMltVx1@@IuFqX7Q0%8O z)d5u^8jW!+ioVdym{lK5z&OKpt_gqXQ@uE&VUYHK($}p^`c~~86s`nd+RG3xZu!Zj z|4|2qvT&1*W`SDvhWw7YG-+4JNG)t$x3vv7MD*k4`405AuL1&-4Nd}=srU(91tpoA zNvYGduB~n4Yg+}E+i^+XKTJ+ajg5fqu#DM56;O>9x@{O>j^87SGOKE{@mva`XME4TuZAvA z_uwW`Z%Y=7HJ5cA9?|nR`sr&s3tJUQZtnxwGKTtxGpYtwqUlzD4ol*LNS5Qz~PANS4rV zuxnHWq>evIk*Nw&dU1V9TX+f=*!qF1aU$P9syDB;2yJFe{S{!PEuYr0ZOj!$&~fYo z`{HN35buqCX)`;zSKX}I(uz0W5=h+Wn(Z^whT^Rp^AX&R$3Y@Tb>@pY$j!Y}hh_rB z2gca?#pCYI=Fe1^+Gq>8ip(0zW85Q!<80^OkB>39-MB{ITzeYFek@vuhdbVBF@6;? z9}i03Q_J2{n?nTp4ztSaf5^mth}My8@*tC3DGt&%4mUA2RQlmlFJ!2LE^q#ke&WG# zrE-Y^ziZM+PKNe$6lWI=LCI{UCOY~IWVuC1ZlGYtOZ5)T){|UFUwgs0tq8?t3E{nK zijdIp_g2Sn0g^}71hw%>3uBLf{G%TPXH=`)-&L$FmSo8R?7a*{A^WDV=u>XvY=Lb8 zsw+3Nw?+L0{)w7Z6;#++%zg<1V_?6gNygC&DQ!gAdx-ODy#XF$5I3 zjWh!bPA754$Z$T(dVPBy4rd`7>rUDsPm^_OjW^N)Eykor;nYZK(+L8YWKEPG*On(N zdiO>nkpy>uq~m6;$CAiPwBn~xQ-#d%l-3_bbl-`TgF|g(>h0QD>QyQhf3_HN;pwcA zaBJD0<8WHJE_~{Y3=Oi=IoWHw@}YP1cxH>0co{ee8PUsQ-voKj>Xfi{icsNquZ-K~ zlx}lfca0q1%}mj%a9QV();czDd@E@xNSVCjA%QZMiQh|Ii&g40gh7c@DNoNEuRRAFEGK5Wk!_+9S65zD zP*s2;Hlhs8G!v%XE+yDVz@-Kkp%&-!ewHIn$NAz&miN=9Nh-o6?Uge`AtR@8MR_Z{ zSd7ygAeR0uoFx;gHX`YbNp1HMExkvXiUq8c-6~z*F#6(hur5E#6xAggLIG5cGhX4B z^Rj78_MnR{O~Dh|svL)aFB)4=Pl(PxMhb^@E$t&Xmt<$?_Kc*%u84b#2}p7*N{c%; zG)ZqTmOuINY7ppZwO5yq80g@0Eu-+hjpxgz02o0ZYU(P!=UBq-xQx=|!h7s|@E}Yx z&L2FtykSsGn1fYOythBpCeu`5I1S}N=tuAfvNVPw4J2pvMolAivKtSmGa^vfo02et z%Y5c(#rg=V>uYC!yW_bTVp8H5pr@6}Cs^-v08bBb?oz)Ypx~Vta*YmxG5;KUJQ2Y2 z9$@O#feWWYiEFq0FkRT*yrS2P>oO9X7m@T;n>tOp<0n5`D;qI;XfLpNkDcJ!^`F~CAFAVR zd>vo~VzcCD^hD}c=zC_lu{^;~a2UkW!2v$#?#y>_rV@cAu~wLG-S58>&bQ(ZAiL9U ztU(*RcTy>Yn@aZ3;XC?FAsa{(O*!v4?(ZIV`DkCQyRUt^V9Gut8Y0&3{^E6av~?0! z1P|c0BLa`kjGG8xWFdmncTukE^`Ua={9nKO>G6-?h24zXYI2d+^0?(G?1An-wE>@f z?vWo?Qzx_N;Y4TXX&lOK|nS z;6rCXvEpGK!1t4C-OHNpLVbhrX0CRtwi7{G-oxVouad?$SbKosvc{-u&RW_|hG><9 zI#7AR05ErA(={I zuAC!Zqr1Az{|L7xnO%I>089KsS8L}{589@=F7NT(4Ku3>MCT7Z7lBW4>1kxVF+s!m zV+FO4Or3rcZ%+*D_P%9)Lx$0~l#K*+qI#?kEHlx)=B9@XP7@3|7>qM&YH$SAV6FB0 zz&Xrl;BffUzmc2wZUUN}T+tiQP1tR=|0(A_UCrvvZC{j1Xj&-~$-NacsOwt-l8?~X z6-Ige6XP9PjSXutd^de(7N+|5N^v~i@~2{0gw_`%dL-t)|G@SA184jT092+|Rg(PU zkHXB!$ z#KHea4*K80um2!KY5hrd{3rhU@1(-N*na;)U|%uV|AfFYzY?gJSXqgf+5bdf8JS-Z zSQaAYKY-caL16z*J^Y^`SaudpHa_6rAlSZWlAgF zNeo7Lece)5vTgFfBISDx>T=%HSGdS15n=?MAxpDy-H zA7}cH3cC7kJ?vc^zSZ@ZIAA_vHf_Cx!=>oGJYRN(6!8O1u5K^qYqpKAGK28X-=5Fc zF1Awm*DL(9_*Y-97CC%+G6cD|Tl7qALv*iQ?%!<*X_It}d(e%QMW=m>6*KH+N% zfAp#(T~6)`G8Fv9X~tZ-*_jJoUuX<`Pe7>Tqc>OE+h{LB?~0vtW?gSdcOzVq4qxx(E6P`)t>2 z(M&ziAeGB(9$v6+Y&TQ*1!8Q;ZFI>M&e6kM(dkAzzch2cR`E@}5UQ%EscY83CNuh^ z_Vv6OopTAJ0`yXe|1<&5VWWo0lO&p}vE$D532k2SPn%$>kzlGK)Y^Eb+f~R#5-4N$ zi=wTe8uVedce1a(Eugn!rLaaH&JPQ{9619#*gP`zR+lcY^F5Gq{2X=~5_4H`ZT)ns zzaKS?%geND@8BB}Jn!4D^07&fGl{@_PswhE+xBSDgC|YdZno9v(=y#<*^EXF+p?=f z0(O#^Mbtc2kNX;iWO2rT0=fjgD`)GjPdfHqqppWzFuRNG^5D;&KBe!{be?G@fHn~z zN?*Q0?9wlortek8!jjaK7I$&-XzmEl7nYOReetb9YO_mm4be|r%kzr2w{(UinEFB7S zXJ!N@=$@5AvqX@LOYlXHMu-LPPjGjjpVwe{#A5ZZ&lb$}CYG<<w#U)yY`{+SeN#~9fw+nUyJ9(aOh4jq8&tbQna^ACzr4JAw`}zN;f>*RX#&gT+z+ z9MvaOnG2-8$weEOEXKyj#kZsaN5VU`!A=LvG@%|?F1;c+eWGIbx~m(!zB56Rc?t6> zZWU+B#F=#2w#I%=vZH~D?C;dN4Cq&4_QotWH-<)D|JMPLJDOYlQoW6_?8Jk+lQFVT ziwZb7#ib7Er(E&wHHo|r4Z1 zP?p7}?@6GaF&XxpIf3(tm=V_4={u6gBb4kah94B(=byl0FA(~T{7@CUm?kOLG&+=fjTHjAX* zREuWm^OMxDbe*vZ*J^#ZL{!v%>vfFru>rih80?;i0uS?EQQL*3V|tE~Oqu%dRMNj( z>%0C!Re^SS=yK_8p#ejI34O4#;Y>9nyW?9f`R<=0swlLj#jcV7{&q@?rwO-{B`m~e zw$#BKkDEih-bK^wXCDW%)QJl394^LOIajkjuSTpp8_7g2)YB1z=IWqk;=G< zNi;n4L6@_{!3HccymTL*UKXqm+|PTG#gaZDg?{#D|TV>W;ysjUkDbu0zb__s@%JME*gsrJ|H)Cm)Y z!5kdfK7RZB+#OEfP1;?oxgWa4NQ$+SX2YQe?zX}obork47FP6{wZ@sl122mkuqqhJ zc+(aqNoyShoKePqMJIB)@(G3Mq>n@1bI*tYPR3yr=EX%9lo zQ5l=UAZyu%-=u5vwBqi<&#jQ0uLRTV2iYM%gFCZs-s)p1`qS zCsC#zO!Ht!c^pTnoEEGdZ@}RW#bDC_hb8mchp7_iuS!Ziag5Iq0T%hMx0I7y%i>kN zeJ%3JYg!OFuoW^ku8vvOO~3p1P#&`dm>zSa-2nG(8upWKrF>kt-QFk<8b7a&mbB=} zIxozZqdR{ezBf5GeXhZ-J!@cRmCQBe6jLtRs5^YsXY_`V}kVUzHqVNhE<$ij-H ziDVUsDBGETEW1Gk8`AWyEP+a&{=k70qpI_@FT+_ZwQcx1c&W9sQHL>WvBrlBdA03& z4d0iXDk)qcu~e=~j?^{(Exb*MS;m8m5)M;+Sg9=4kf^tFKxzNLX<$d~RLh3d;-P73 zuKF6Xyb3akSBSjQL#yNBO}FgQA{lSW%PcPt^U!KcIc84KG)t*UM|3V|t!QZKN6~q7 zqutss*F>oB6=AD)xJSrJ^(mzN2o8g2B|UdKfwz7;fkx=9+$+vlQR#{q=NlpF3r(}=~EYg zovg{3$E0s@*Ai7gJHKcPN7!BOy3^)VTnpzw7+G0i;;rO57^QdJu;50#a<(c6*1GpO zI^;tipnU5cd|2j45F2Xd%-67c&m{!W2-Ya@C|Hh5ye-=S)0Uf*bBxi z(-ra%9XJLYyp3ZRi-_69Fc_M@jrrWvX3Ip!5J|APHI#Y{X;imY~)bEQHn;in4*5WT=Kr&+(s_&&X1o z1R1G(@t_*15s}T`3GSBO-J;cJ2VIfd=zZF(?}A->sqyUa2{8q7hZ6HUyl#*0$m!&L zIH4~ld}d)HzZptZ_XnQ zULY?7-MIPdQ4C>ZrrTl@d>lx`Ua6W((4`Uge%C3N+aw{&_H8kY=Dot*?dG@(U10@C zJ5sKsCzji2FL8Q7>Hs(07hT@ zL!!3axv0I_7*~%&R)qYZP5p71T=GPyW`YK)+U-vm-8y<$qk5ul0e3LmW>?+*<_d!N z==D?|zn^k0^km__;-;w+>6^%^r|}{|y`5I>A^m5r@WUS{&|iXqdCrq9diW+4)2%3H zf7q?ur7`6wt~EO%N>__nO_3$ulDxXpPFQdWIh)Iog^=Cov>3ObV7IvItv4)T=8AQ$ zUzC^m!rUK3<1m*fRW+Z}K25F6j?YOmTaP$jUc?DxJ&V4%OxN^zE=<Bo9ZS+{@#b0BcThjb5R!!Z8yt4rj&L8ZB?ZQ`iz zdm@>!;U`SXb^MlV?2q!D@kF~@Z&Rm4w6NMp9hP`K6_9@V0Gy!e`zHkXW@AI^blyj8 zu5p*XqKBTHI$Yzjf~>KDqNOzM?V#;!c4X#$NbHeF z=wtj4jdtC;34lb@(btLHZ{*J(f$k#apS)Kos^FE$!Ge*7JYSN;cg`m?+m8795hj0+ zlh~nNlaq3cE!S&&Eb&!<}h6)(ow2&cXD>F>D-kq?{%wee$YKxpY+2>vk z+iCp##v^rLpf({s4Y75e4DEO>x!Eu?cMcbbxhnFIO%jNY41qzvOd+}2PRTq&)&KS@ zhPkFnl{+Bn#(<)N6fS&fo&Kcl=@0rrQK74Ans~fO>ttYUo%vN7ZljzmFwDVSEN)i+ z#VBItdJC*+y@3qYJ!%@?vMTL5>?A=yF(FDVbMnimvfZ+z7{zjew6eT>xSAe4|eT)jA)vWGinB24LcBVQBebTEAOaaoMfP2Y0yOp?H;l_uul@d5Au`W`v5sD z^s%9L84MMbX_@HuY%Wj`S<&+S>&-4(2A@-OXASRk$M4DMMyB@^jc@>|M zVe8M0dU!B1JNcY#{817V8K&`Ow~jsF~TFNjqU1f*^Eup#-;rz88>qp_m#z z8!XEyQ+_JR{UyaF`+2WVcSkVjJQ;M#FDr$N6Ok%blSK*?tPrw9G4Ja2v5;O zWtUtcDk{XS+2A0lUbrMgI9*8wrh3Zq7+kIli(Nm+^E+GK%ixrM%gY_a>PDu2>!atUvt8JN;<+@oNTp?~1SS-jJe ztoY75CD3GIR=~htV*^#BM=lr@`vh|oc)e!1GfKZ0X5S)Hfo_aq(HZp!gx;^@XOD@* zM<|yBEL4Ap)=>fSAq@I^19!)qLi~@ksv_mG%o^IcUwuazcxYLE62|#=cbSz$v$q~{ zp^}S#E^4BXl**<>17Q*0+1r8O>hSj+kCG1i$#b&Y(=9U&>6S++sgGXXETI5K2E;;6 z8&FJt_kb(Gz}KLsG!SQ#5h5doan;W4c{k?gA=K7_ry_U?MZR^znxrG^#|>-og#|wd znoMXWz1SLpNi5I=7rG%ianx~Szk+ws*uqefdX$Rx{^Bmo9ScTsot_Vr25gV!f_Ygq zgoq06vUhlk#vS(=UJ#y>5ms5K5-1yE=Z37#Vk#J$F!6(Qx*}5b#|>>jFB(D^Brqs9 z^Bf<71M$g#?T5e~($*tE0wLo}3-}o51;75Y!I-GDqj#RYI}C*z=6xndU^*W=%FmVM zk6je<%#`Yg5nd#-20s`K4+E1R;#s(EcE0eH5Ag$9VY-^1!PaMkcYIkxQAOxbUDZXt zP=dgLT4O3&OT#jHh4?20i5Q)ylg57r>CVsrfmJ5Wsm*9Ea_39JC!y6YMJg#kqufd5qZleE_*#>zpPwyE0IOoJ6J9ChR7H z-Q%zl^-&MCShHh&VwEf+=_VDWKqvVdCt>{}e?2WRl~=JfpWHsBw3B3@vWEppNGKJy z``hY);fHB*g^ux$6Y2&um56s$c?6x1pLv<#IC0=;=K{$g?a_C<`mDt#2ywgu7zN6# z=|`|fE0#}P-FLiM{Kx^AMnC61%=OQKzHiMaL1xCI}Vx zC6Edbfkd~5y6xz5C`NfK!IGwMDbB4fNFag;k1!XLO|0InK5I$Uaf^)X#o1D@ysQXq z2XQMOOsewAZ~_`!VMk^pLd* zzUD%#8{MM~D~(de%RD&Lx57iEQ%S|+Q5ctpMF(DBdii6$FSzy#;aq=Zl3B$j4pIw% zK77L26Ty&+p_H?M*+8u)4+IrTr}{)$s~s--*ePN-*YP%)UXuh}PzA&V2f1vwl$44z z3GPs|>RP3xtydV3%^C1dorA?BUZy10qGgzkgof3te6OWnpN-5NA$Vz5Y+O0 z!AO;{opT)lvXEwEPRd@*su*EAJRb^;llW9^(BkMh#{BfM4n6?hg5s1QIbyY_GTiP;KIf2!P!e_ZgrC^eG;p1OSU?Tm^5j%w3M;}P` z#pf;%Aa1s}F%B)jG?DB=X=wy`;8e)1#odT(^v&fOKuB{}X!M-*KU|xcju|d4c2tZH zdR1A^#=bEF!mS0H~*yOwC>GMeDNoWD1fe z42f?ttX)44A}5@3>lla`JU>+Oa=jTUxG=0V)XbL2W%9<%Gj`WYupff%<1yLN%zR}# zwTp*?1h=6XhQdgTQmn~y8ot$N+2R;zc^{dYtXim_or|m;4eE!d&Es!O$u5ABgbHOa zd^1r66taoJ8Kf0`FsMdWPv-0o(h)5lpa&CLq%vRWZ7`LC!c2y1+Gt``Mzijm(MBc0 zQCA_MgQA!8yz@UM#1dpetoiPD=cXW8*!EFc(FvV#NWL_MRQnr)3bOn=%k7SLism0Q zt&O5Jtv0RN>d{W-ZB+knjE`goow+|h1S z7(inSL)PWX`}aciq`};{5D}7gB5kdtFc|SM23sN!Wf~pcIDWqB!trD(- z(5nDyw2%zb!zWTG1NV?81H4rV2!i-!(q>80*#!YAK;K`zAwhQ@+Jq?gy&rMp@ zSd6PabL$T6?h8E2v^7pphv@W#$C~rNEpR;D|9qA}-L2*rQ^ERtt_40dK(MnAZE#yx z+i_r!d_3)^-x*PM6~)y#bH?KaQc`ERA3Y(}b3?TZjDK%#5Vo$DMk3g}!*R8Jk_#?h z!78JRCS0DdGwjSh8D7C%p?}=cU}>S&RAv7vGdIgtox9>Qe5XYpL3GWHm&6Qq1>ke2 zA&oaQQ0|U(hU>1ueqW=?JHO(HI_5|fKDw_Td+t95{jrglc-G9e@vyGD)>|fSEBKg^ zKE&Hn`<&x=PS7Oln2v4hQa$V3c@yu6Qh{}oQnG*B&f&T~vjWbAM3%#CX{W1rg)wY4;)&!KZ8XC;i_^^+-)PE?MKb29S8fKF_5p#uYBdz zJ3z#k)Do93h1RpwQ5xC#Aime3UEk@lABCrxaj^VAgN9E24)}p$}2RokPzJmsb9Lw_t0%7n}omWt?IO_7F;1gdD|v+-Sam3 zvrFmm<4new`t``JRAM%5GuvcRJM%%)+E**ap-1=Nx`)WGJ-N`XmWsQ%lEinvc}W6G zqUSU}M=12#Vjvw{os{WY`N6;0uH8U&ykYvn%f`)8ZsoeT^MqCC28>$0_0H^ zK$;?B?x8{*1E_DpRi?J|#_TbN99KJd$4JN44tzg)Cr~s9?pUZhRYCYV(xT$+z z-f?*}*n(RvkzC3iQ86Vxa`8NWzEop!ez2CCd^4aQ#XlY{P0W4&!ZOjCZh{Opg25G0 ze-tg3p<&_9Ffj&y3aEtU@dQ3ue}%h~;S2IP=*?JbN7a6xI$^L`<~sOedY>%Vk9}e zM|Oi|(fzj6r4tjnpC?Q-EM_525~N(C58cjv+67|`w7qhH1W7 z`?9MJz7BRWR1a10Rs2Y>27;ltw$t`0HXcnFibf3t@}j+*=VZ+r#M&HoR2K#u>t~L7 z<~oWT>5j4;oB?YmYAx~|?i+?<=8_KD8yiZV6$>YZcT~o;T+VN>W;$*>`^8Y*^FLda z#R@x!825vQ2VM0a*$p_9#e3-j9#}e_7f2`8Hsu}%3DVXJoFmvgmwPE}!OhI!ncVJ- zE~s*Z#R>vbQ4Yyr=%=X@Iz5`L4V@u9Hue|gfbGhK>S%#nt~N)$wm?Eq?~p|B}x7E2<9sPl_9V zski(ehSh&Nst){1?BhR3Zv1-IKd1y+f9k>fE3W=;iA{g$@%%lm{vX5Y%q(=QuQFon z3=DLyDqbv%uj(wot0FA>>l@bJimU%tY7^tDT!qBq#!TXrZP!KS1VDHPj2 z`VGlA>{|ORLh%B%W`1Cvvn?+Bev3}^t~b3eb0P1WOt^qmBD;Y#a@ z&tl7&XHH|-sCpK;9TWq-o)$Q2Yk=!k0FlhgqjO`cO;%>x?+voh-_TF0ThMh6Nq$$ymPL+kWf!BS z0oYjb3DAMun|%(_H93M)9nf(1Q~Lp40bxh~?lKZ?&y_7Ik_1Y7uIf?Vm*m`*cGRE% zHdV)tH>hx&#f7vYT{w$a3d$JEf` z=Nk~7iihY4yIi5!<3j3nPo-w;$S5G~pq@P%pEQX?2Mu@B;(gmms}+QjM@u5aXS z&vyvB*UPyZPB7GVeQfhb9?-?%9@&Aj-8}|bb&~+6Dm%oaM>DocVbozGdFHmRxkF8| zgrr%;w3+EcHy$4?i0sLp%3pWprdXl}dgZ2EFhsUYespRleQ_wy?lD-m=Zzm-E+@iH z%B-ut_C+EQr-y85vX z8HngrR0!21^xx|RF}-}gRT@#t*aGdPt33U{?bT(#xGzOlA;pfP!rz32G-E3EAs6z9 zNy33qQ7bgOj7)jN_dxY_kvJk*?ezjZBF8lU!3PCOY~3T5UZ@3aMAHnzA)|^#mko8M ztV}xEJdf(I?_nxXO74f_bC=(00RJZjp^?lKaqWxF%qLLiKN1kS(@(#`9-fkjR&ysN zz59lZM?Ylq+0jWWsDGqYMW%!1KOIy5k@ID3U~c7P%k_FjS^vkw>6P&X{DUbb_}A(5 zTb!@IG@Sk~98Rw)l>ZWh`rmQBehE_kI-Hn(DRsT7Qoa)3l!#tWlwU8u)ZB=eex(o- zG5yNRC1U!OD@?@nD;1ZB=}%QTBBozP6EXi;&7VoZM9hCy!~AD8%zswH{AV?PDsKJr zH2l^6UyM7!SDM%#?bH9a(~yIej)9poAt(St{Wp?&f7$l0CjJ_wf2I=u=S<=Rm_WSW zs{9XA|5^E8N^Ae^`4i%Pv+}=Zb-y0^ztuSjI6-)?)V%+i>-=kU|Mld*hU_nrixfhCYrXv1DE>78es8@e%!U3|cm3La z{#E(!t@OXTiRf-@DGdF znCM>bQ256LU}k@%;{KjRf2^E;S@e55L&8(|?^*P3?$2L}#Q&|k{$UX#E8VMN>OU=F zVtXzA))@WU&hVEc@qcSH0V(qLEc)9H@IO+5#6o%lVONA6r|NwV!p6P3{WY{g^Svl|we zw61MiwO8aGR$g*}NrINA7~pAZ#pe$5VZ`m}e)`?8WOwJm!PkLl(8q!-ih#(^J;bi{-T*PzzkY0QW1e-&lc4 zZs{y{GV+{RE`3VtjGla{xq}wMUggrZ&29DQMmqV<7mxU~0X(0N+^fA@EfBt((67}? zdFsMn`7qAimCejQeb({S)*+TX$O93bMEUN^Mi9Q*IrY{z8_v*QXI`q<*L!IN?MKxz#e>1 znW~nvz51zSulc&-`|s;d9Tcm$byq7KNTh1)a3OYRbtty*lVb0E>{s1s3k5m#$${sR z`Ws?Krkc!_ z>mqg%>MG5;9w?AV2TgU)4$t@=#vRV2+&#J$-Bnm~?sR?oz11IO8*9eNb&1?{%N9pW z3S5uqv7x``NRNIty2c#r>o$J(`5oGCoZR^& zJ^V%3q_kxVS#e}>>Aj{f_95@;`7NygDn)vAiyg)RMQs00apo5Cw!D47-mA-X!;j@$ z#^)3d1BQ!dr$($Eo%DO2`D@hA;7Vt5=6K4N=)(zE#d*su^`!l*=4jMR^9nE5-8zL(J3rIS)StY4@eWvX#JX(KoW9B#KXlO4{fflm)Ox6LOzr_3H%ytU(WW$HBqi)xS!MMD$3RU z$Q9+Ku{yCu=$E`uf6w@Xvuf$YvtOz?LpmD}buo;Yz7M;~Tgv+xj=8Ij+g?9e=G1zT zc`3iX+$$H(HGZo?_cgxC-kW>kS-+DN?i((B3!Hff^UcRr=zme9sAQgP-cn zi7eUWJ>8DeHd^vkxz0LVEXjh*&)Ld&f>w1C5;CX_Lxo?t%9t1l8-Lp2a1t~R_U~gY zu&QT`c%Ajt=bfLR{oT|o!|Ja&=j|V-Wqpn2VJ?{JzjEQzG0tG;6s?e4Rf_y^)uQJ z;c(UT>ijWfdrZ@9zwH{epa7eTpKk?j-?~kQm>bvrxK(4cN*CHqT!fafKTV=6AOEs_ zS^4$X-$PtBbRNtt<)bB}Dr&m^bjQnfu`v{za%ouk7AHn@kgKPB3nd}#(^ifVQ}HR) z9?OIQb*5r29?L3yk{c;~6IT(sY>>Y7g2N?DxxM^*pLhu6a?2J^iTnvFr*=n@LY1^7 z3!@obu*7e%Cp4r|nu{$rGL){qj4jQQKc41n@`B5T!sThYvxyckcX&L=oh83z?|M)G zl^>Q^*8A0?b*n*5csnM7vQ5|Ve3F1R6UpIgzK&pb#2uz$8iQ};(U*hSY+N&;&O;*- z34O zTOFPeU#(r(t0a8+y^97VB!tfEbLBH7BucDmw|&*%n*qZRsMJV-w1afa8R|B-S+P^5 zIsnT~zOmrs3LmM=oQ$pr>>KYVS*8ZA4YH-vk5+!}eO};fE5uy%?B1aA&0gg3UaJHH z;EDjm$mcS)@K0h%XEW{XrEeptmR=VO7>fLY+npJ5BDD$Ev)YzETg=R2Kg1q>tz`|> z+=r;?-D0rgx7JdtIAJL4D$M5G5MP#bGm^qfnS01!ZFl~qJs$^U0q+ZE!*uzN#*YPm zcn+px`La@+8shasURXIIhC>IEy}Z;}=%&*bC{(voT4nN9g?$cLzN8Ba4t~EOF&rvA zd_2##lC@;{i<{$BhcgZkDU(_37?T|2YpC?seBUH7=}4!BktK>jW4pRAn=^wO(ft9% zjJf`tRnj6rrc5t9$dxb7seyCjSk?F29c*IdU-nThiU3$p^!8s20_eT&eKZkN*PMNO zXhRzK71Ce3d^N)E(hl`D{q*{Tj7qOWb8 zk1#iD&#Hf8xi}rD5GBtd!|^_VIc&d1y7c>~g85`!MDF(CX)BA{f_ueFh}5a&ic<%( zgy$6lO-`1%mex%kYK~mQjH))1XfA}LetSK&f8$2fRN;C- zj7~vpQs6X+Gnz!V#IQ76P;=0&z)@to33VOr6lOH5kUkz2aJsj0;__Do*(?b*c1Y3p z1N%D+MgBI7QJfQ(sg{u|BiA3EEN3mau~mOnYi&7QKvHSATn<|bqp{f+e@IEB&~WVd zI*j;OUauuibKEJ(U{RZs!?J5^n!}UEKIyK7XWp-~rL4*O=V-F)ZI_U6ORKahs-|Nk zx<#HJ`q0<;Mbine?_h~oQIeVJJRiO4-S|oD%n@8Gjf`?3 zLae?QqQ0({-|EEr&-p^Miw0y`y=<6^2GrG&^bN=8D;!vu-c4N`UAQc0c9w$eK8eMT z-IBs!+~oQ%mMaHFUg4rS#%tL{ zYBy#``S9wR42@x;hL4_$*vHAGd3Rn)Jpt+7a~Gy@RoZPYFbpkGMAflV$K#DJgeFHE zYZ_(_#WV%l@7JVp-g$WPNy*!Ye#+w)zL=XcKR))foA`_@WEhf)l4IZ0d`XQ%{D=D1;hx8R??@zWLlLp(3*WU|RPI$#MN+|J7 z+V=ZEm2RxWRR;!9u(?Dtq|ZMRtTA}Ed^eOMG{ZI5<`o^54{A9v7^9F*iKh^{-lqJ` zE--{N9Qi3Qz)-HjM6_Y$+JubH?%CrPMw4y(L&RQ-^qiugs}x_$2)K1gdwWk8Ts-m{ zI)+Vw`HsgZgz_BAXTEF{3w`Go{caaXm-|I0x+So@&6)W%ana`{q|thVvb)_8ULn|o zD%raZ_a4l}!e1vg*POtMHLWGd9nd_A2`g0hJEbze^^P&|N&Wr&CUusR>POFXSqg?W zmme27b~S%^n;+5dCvte{i_G5M+lboHi{H5quGL3+rS2@BdLI;eQO|r_?)Q>)?c3%; z?)lAU_5B51Tdh>zH^)*|^40ylHn*lO?IbtJXDU_&(1&A7M_$0;j3d&f7)*#4YbQ_7l+%(zjNK~LM-TQHA8eJFkUftVfEHoY>dh%C-)?P)#vxS(Bhv3i) z@Lwn;M450k!T#1;v&j&gjpNWmxK8p7SqLWED>@ch{-RX=kmv)4za4pCj=|(|p+u?n zthBmPHxLK`sS~ljaQOR?GIIzxMcO#LeC_jbtUte(LmIJ|6x&jMqptq?XtA5;~$ zTCHNCD!_ljz#kr|cS6p_0)zR$^+A*>!>sC8JA}SfdERkDo+avqdL5DYNWRp9hIf8Q zkDF#o}H% zt$Yf?WjMtK!FyuFDUl1#Po!{`7)+-ZA3ID)(@T&Y=4|v-EbV%?mpD6&E$T(?Cn7Op z*KVKn)q>f63Dw&U16Yo+8Nv4KqP)%-V;Nz zB&O3h5{Yf{EO#K7A6zi;<17hT9LIQhJ*qHd$zlCF7y+$032|g`smo9}-0I!s_u34! zZ^x7cLj(JN!dWGiB7Nd}l~C>#Pn(FuZ_AG2ycrLxOgkV?JIb){%^7IJzlpGe8fbZQz};l$ zn@`$G!cN1k`x`6Eh2l2u8$`h2)T2MFRSoq5IKRW)s-{m;aKLVTGP?$vz%`c0k(w=M z#>)eTkE+;UF&NrH3vJe@GrAGi(?PgEyQ5rr&9zd_5F5?HU`!5h){z#9)}c z#Q{uXp=dT;)E#Bd%N#H(j^Jwu?stg*pg-rH8k0&KRHgXgZg9@8B(D7%)sSMZyR7r& zPmZt$%E3-Mn`*&JGkIsjjtwsbZ99lGZg-X#U>`b!`|As3bq^aKtR~cLPt}&KE7afr zZ8Y_hlwh&WYhs=6lV=bYqDC*eE(nL> z%#zPXiJ{!a4llw}KYlY!QAHQE6kyyJ`v~33FU?ZyaEN^ZFQKS~%lZAo#Xda#$&zH0 z7#0=juL@HYD6VRi;Jr|+7)b@a9%*(Jr__ZMEGBt#Ny;-lS^ zL9cUGs*#n{hO#(PTNIGAi0NC|r|LExR1IzFs^w^5PnOJ68u2+TfQB7zxiYIkoR?*| z1W?hoDJ;-JrX}@$Br{rmkIlL+%d59`o1Aj|HaZXqJ$y;?b59C6={^;NYx}m>oyB44 z_jB$`HlC>O8vCL?UrQ2ke%+?kGtF8AXmcE~WX@AB7 zli(Lser>13ef*(I5GRzb4d&_+6c2T{yoXA=LB&leeSA;H*Aetgj@r}O?-gHRu3NIB>0s2x@9$8G9X zUWhyl4w>dx#P(?_7au&5iZe0csK+PmRd1Hm`F`i_*NL1>sC%qyj1DWl)$CeGe z=Ck)!IgMLKgdx)9-Et5QbQEA2I-TqRhyJNVWm=vdzTheVNj=-HVFQnRZrsP5&B0^x zQHIKq#?YQ?Q^WNW^F^twNret#QFmVbyvb`j^Z)^KIvbkW4Q?s@gznKRm#`9H=op9s zQ0Z?Dj-q(dk;P3F&cpb}md)+SWx%8-CQKN4L4tIAgzUWd_IXNaWHI^|TwC(Byi5y( zsP1MkLY9MO2309_LZl^afj{2);3exP*Yriexs}`H9n13=`|s8qpbbZ+>bs7q*jA;6 zf);#;-7qG5O6AAbIv!yRv;T~t7~+GO;BzS$n!Di^CfjVu6FADB@v#-!ozx4e&?qKy z4iJ!8Bo}rJE>9tG#|%uaF^inh>Ic)N9hcDy4gX4~i;JVy_mIx%_R#Y)TD zMl)z~$^YE_GYbaIq?r7xlBI%B>}L&?XCly<57Gop>pQm9iWuB=k&u+tJ)>_2Vg#?> zoqO*umA;)_Y3BYNXX}@lPwjQ%P5u!T_FTN52DK0O`~85Qg;)+IjRA{L*;@WE!7E>H0V7a%4)v!Kl{Cm2n zJLqpWf;ip{=Srj{3h|a<(|HAuHW`ZRzX$^DJ||!|a=Xm=(F|u!?UU-!C4JO`xsDvLgbC1ns zIln*-s8fS%A2XpPfvyE_M_M%s3WIt0(6)up#kRZr(%rmxUA$L*8_chwBr9eP^*9Ss9k^r-v;-BBxaci#0Xb^Anp zEwhJLrrC9zePlZYnIof@Qm(tJqB|2xt8gO51G=$UDtx>ngV^~92-cjM zyoF#h6}@4K4SdQT7eAO4k^tSsdnlabUFhk0JBdIfno#p0`+KjNSaHBh7^_HEJ0IHP zf24=PKbF_!cN$B9UXV_N+A?|tqF*TIZdb$W%j+ft=d94Cw^N8jwWbZUCGO2xzQQe4 z+;Wh5vMrQ=QPW&!0ZCyI8j2 ze;{LCrbyr13-j&a&U{W#dhgL(Rk|Lv`X}tBjw)d|o)P!y}mG z@0K22L-(38oY0MDh%P_j%T<=w z#)|RWot=wQ?@D*j{QUAXhZX#CCk&&?qVY^8J|#JfYVwLY4>UFVY?f&kKI4-(wm??A zzPv@N_9c`vR^0J22Rul&)QGAT&wC;%^_zs!aml53$@6;wU0Pmb{DDVxHx=|rn=j@r_QOo1>RB%Ey$hS&*~A8;AShdGp%G;`K5vzygenTE zvu?BJdfO65J=46K0`;q*4RNHw~h|KQ4zq>|u{AdPq$mqv-os=11Xn1K&BvObl%HCxLHt*~Z&*admo z8L^2~L|l-Gy$$r9-e7EC_!Z8h^4_fERuFUv)zVqYnpD}Pl0aA zf-Kc+p}W3Er%=Ibn|gWTh;y5(zwZJha`{*Q*D`%nFx8KZ{y>TP;I*m4F1#<$#2#lt=Cx1I45b-iKM;zFm=j-I6G_pQ~wQ@*w zj?UdN{||tS;vW??tUkc_#!2%X zT{D&6mexV7f#nYzc@SSk)x#Auz`I|iA#pYbH?)u}0}>Gvw;1eAhE5?SZ57{NHhlu^ zVYBn_Z-tm_CW8aM<|#9@^>&S$h!~c`O0iHOOkEuH;H6Mh%Z6OkMZX49O9aBg_rO<+ z1F1()IQ@!{yfas)wrj3<7Gs;io?=MH(!=-S}=+84R9Icim8yjbjtv0ib~U39``*>qHu} z?d+cNx7Vb*A4G6E_gx0QOZ!@AE#oCokMKxr$Yi#P^wIB^L~Tham_DIkd-a$p_DEXGUwpaXw_3@cgF{JeRrI*TfL-tC4o{0X&zjMmpg7VqfH%$ z6B;tfsV-oHYzlmTNV{)+DIbNKbdN_~V~1V>5f)o=8~`*fFB5B5fi?(8^n zS7D25I7?fPe`9pb9C$%xMoKMM4B;H02}S^K0b`_;qn%7262->uEzoRWz{ak1<`fv7 zhh2u@pq$c@%Yw|QEs3)jW^fk_*rVh~)sgI^H(<9qkvYE^3~93Ss~!W+?#_rCz6)kv zQn6j(JcPM0ItR50Is{AndLpDAq7fgLvHwx%#YkThh z7AF-mKKm5irL9oY!uiQ zZyS|z8rJbvqrDXlZ4qaQ1~nfGQ&vV?JnxR_kN$%+`{Jl=#r#kG%t8I^vx}L+z(mS= z2bD7FtqAu?#&8gmotQ0rssmDHDosvTf^@g`54lifWt4KXzpNCJCGIY;%$c*)kP449 z5CYSAnZX>XpL2hT>=E%;VOECl;#;4H_QI?kpv%V5g`!R0T4G+FXJrT~zx9crJvDHX zS{aeAC&t?bJd#$ZN1lTmu4ruT$+@O|3VdV`Z0fQpIpoL831KFhEmYx`u&D>Ht8&7Jg(UAQe9NL7d zf}q{5zrEW{>^8McVPd51)ZYRL`*x{#Fp@%Y1cg^Vg2LSra-Q?6VoGfrzCcuL`JPIe zt&c8uH_a+5r(N(sV@jp_1EF;7!yt{g2+}OW*nkKizahw|dXQ5C>{K>x*g!Um6n10&`NVrQKQwkH90zhl| zp)u3VTu@5RJh>TVNw8i20}_Q&m{8#6gvIAB9e3f;iIqnnS>mx-C9=Hr#cDWk?+}|& zR#ti(-TcU&MnFOf&@;5DeWW18yGG_>GJ^+`SIOz3JkZ$72;K!wt_{`1x?$|a$0IZ; z3fS)lY`4rFLud96^jlX`?T=yyS-RIMu(hYqcXvoW>NeYSlT&pDGJ6IOXco_Y#wu`m zXa($d9;IWkqGdCpzxOWx-gj8R{$93DUR}t|TH4gb#!sHM(bjiaxpss10k04G4$gpP zq1-YM*CF^BQ6G?z+(rKqL+Xl$>VH$VCh#MpxZ-vD@8Gs1(`(o%i%mCh7mnw|JE2^|BV5!D z-do*4k4)34_A8e^_9hANI`tTho??b>yAIy%X~mN`?-P1(=z(I}(s6NApV5TwELTVT zD7KFsX2f-NcDeHyt;yRaL1QH9u~C-)G2XOBlhe03QhA?9w4LW4;Xi~U%*&~_*_<$q z>0fCq@w#AQVvGy6Y(M)_i#bw+bc~>R8}hY5SF8MK0Dq_5vIj>8B>LkQDJg^=CCQEv zg6u7x3PkG&;!X>RP0D!uvf)D5%!noAV0qw7lG`1@ID(4kX+Msh3LFF>l^`AQnFV6c z(tMh2VcX_*#eq#AO$qPW))Zz7kOL zVY#L1X>!K5 zh3|G6oPPF#NPI>h#V8>}bsaGRW^+bbRQ6Jfy6zwG4+-dUD_{sxnd_xg%HJv#Lu3* z;qw7X2iH7g@hjpDr|)K| zl8T+pUexU`^<%$PY_%;)Cgs$z$yg6pD0B=}_#}n-)@oY&`>pQz?~VVI&$$1lGIjrq z+4A0M)sfmw>mOMP`PlZEQa>|~nWeqC3DI@uNr~N>H!DSBVvAa}Tf<-4t<>vM5_i?M z$MT?5!`=vPmoIe@`#;lb)1Xw6Pb5%$mt6AcXrJ-Cdar{;v%IDGE9H7mA7f7yWRi1PvxNUNNI*FEA$oJ4#C+m-yAy$)%XkH$BNwy4jO;$`(O^Sn;}^6 zF*5BQ%^v_s$fz+Z>`w`vxI1f1A%T*FRM%2~EV1=HLbu3BzCMSW15FT?Y)%ql$1RW4 z^OTg9P_-umNT7_ryhyhM);i36Rc$&KA9Th+Z`GIN^5gOG*IZ3<>!+q7lU;mO?I}Oy zeYeE%Ggp=gA$!Yi%`p`5>`L`ZrrDbp-Zx|K(TkjMS3s=sW5hqk@M$@qWWIeYlmI4`(iz zwlglwGGexJ+jY0rhZq`qf!}_lT;~ROB9(il4_0*!mMS?SpDU0xbbtl|HIp*ir_qIX zeHmAOM`^I=o6bN}pl^Rx95CJ5XUGb>)`#_#=j*^f%5cb|qkRhUqCtt)Re2(lJQ zd-XfywSgg|8=wtlp>=f|AhxZez#v;}iWivG7a?n4;s>u1uz+jiu0z&cv|_!~ZLrEZ zvsKzBS&vxPU1`O;Z~URv0SF;j;2^aE%jF0ZG zG+zOS;Wl;-E34i4H)>#LL3Xx%9RtY!Sg>2o?8trvyPvl^TJU9_!(oRBBCq&L-~N1L z4D1)Tz{b-3b)nbQ*hN;;IUik_-$*Iqk!R9emGE|%4`IAvenab9fd;?h@8~dp_bH2+ zN3Clw3fEY-FBMDTNJUeU2}f$AW=R?oR7EnW9wRNOV|I4d~uHfNz=dib<0|aaAG64^GG_!;t^B%>vTL|walg50rwmJgrmBnX&P zoJUH1nO{Rog8474?Vna3$LN2Q=M%C`_N72WoT*-C0yh^QnS3$S$%?UjQ+AyQ`xY$b zog|8_q9pJf`Nl(W6}i=TM4#G--FcwBqG^>ANqZTqxTD_hNw+9eQd|>fel(U;{ripQ zs`J^c`B&Jlv^SZ$Ck(JP*z5>-VgECTh(L7?wM;svQ!2EqBEHY5U`+vVA!J#Z6z|fi zZnX^o8q1|9w2;rz9i#MsE7DxZ5Bp?mTHcsAS3VKteIqkg2&cU45Ki^7Pj4i2z7#+8?LHBrrZ~3G2pi^7L^RZ{^>J9shl&yoee;(4%4&1ETKEvDJ zJ}qxVn6mTK^tE$^vIn6EFeB~`0ukoE8B^59kp+cTZdh%I4MA*3Bf*mBFjvvGE4;Z%-! z23@%9o4gwpVd$RebgKiJ@HcKr%0}R(!O?XCte8%+9YP7MNV`Oeg~L_4qEBP&@ufrZ*U}2#x)6%Y?q7ESoIP=IwV`OEp9kOpPEd5l z7U%4jVs{0L;TaBBkI6Co4EAdbix=uC*>Nu}|;L=}jZZ<{yfM>>(tXkH3< zjFZ21*ZKtS675LMTTWPx--By-XtCI~+i7Ne^FZ|#E||}QEL7ULcfKx3P!r@c$m zw$8eQM%~ff`UVMaefQ|~7r%3NuP%$L{ESd6aeI2CAmakw$M0VqNnh)IzP2FFHk+a+ zvk|s(cy#Gr1sD|`QGao9d(VTdwm4F7X~Lcknente1JmfNEpXyN2@lK-=n#vRYu&BH zZz);4J*{@F-fKTX8xJwbHZR71=o=;ABQzALriVq&SKiP{mnqxxsxsV=cS?#+1G0A* zYXSpb`W8M5Mvt>4;pbwF{mpQ;xQ?T_cR%cf3c}-(udR@1o-;4>F7!N2=ZQ?dhP}z0 zy@mdge9I24_@v(9=Z4gUU~|shcuM(a!tx%SJg=8g4?;qr{_SE2#OOrBrDj4)SV5ne zaQ(4P!g{ZOYGYr0Y?nh2nwYcF%CBm(Z`AP&hRlH(n_muu=--rEJB&#Nas z@hzEH4iv;5bPv!aH$0J1Ij`p~tk$Xpk2Wq#reE z#>yz&pEIkLeT`KYXAI+pC78e{JzI$X5I_@VL!ufp$%_7@8VB^x}Bp6 zPxG>mb>V=YcG=#t0b3znNL!)63jCUJz593*;Tt!ra&|Y1>j#ZYdFHe2% zM;8LsU+y;7ZNvxIM3-53wx*9QZ$hqu8UIJ`tIqQ-tm%ZI4b(~vUh&iiuj_tkImYPu z4B6Zj_+bV{9xn}#usbk@zYd)f?*-RIlbg2|reAvQG4x4i>zF*a-ak+Lqz%fe9%WAD z=pOujRu$7f|MMqpc(xbTzA(fZH*=#B7#WF2H$lJ$sLCxoyB;#lUJk1|Po-xhH7XD9 z9<;fnYG|rZRpp1eqm?UBKk4oYOh}a}N5tGy6%aY^y^TYgUZFnT7U{_Kpo(Gc-hu#< zC0dJ|J>sbdR^MjUUxMMv-t5n0y!MOR?PTMnwDW{+Y@#|4!sV=wjlBT#I9VjjHH34f zAQ)1g9UD6ZJIwZgF#x0zvSHDUJ7|6R%2+`jl$+0&+renIJi@t{9Hzym&^P1~%XAJlCye|~eC@&ts79<7+wm*I*6Tk8$ot|_Vq)Xw$CV6(f z4hY>jIDX{|lj(@myt_wlTk?QnSIUp0+^I~L8S}#3ql!zuHcw2kYpR!(n&!+bKdr2% zAp8>@7#(+aYHIH~b$y^IQ$qQNxwE9-x6<0nGu~6Tbtkmk)1>EJi0`Y%zeb60Jn3Pw zW!f|T$;i&no7AdxlTVkBeeWhc61#NmhyePpskJdrzZHA%5M8KnO|}dMW*e8s_}W!3zC;5F{JPN!w=tCc)bH>#FzF;hWQ9hdBO@%b|Rfq8xlCaHn`V_FXt~4tEco3+%jZ}OAe*PmP9xPDSf*_ z%h6-gb9dV+D=W29P7SzoOvbmMZ>pWMpEA6h2B@U1NoG^S+!%prqsPWPJuygGBunh< zYjW*Dfi1bf0+8t`ASXfF{4F>1noU(eqU+j4BIcepXb>`BElnBND3F;9GO_<7R}2;D za}sD80}DF;M-xKUTqA4lF*sTUQqSB4>3VXy8nk>`KJW^tDbRre9n3VDfHR|`6?g=? zoJ~#nhqF1E^B|dv44Dg_jMxScuzzZY%D0#5@$gRV1VsYmqP@Z7U`WUhp#G1lR0N2k z4Gqb5c+SM#+nK$VCUkm5I*l-Aa-0v|AL7;2?uTWMeBPUN?j$m2@2Tm5W#hL<0$38z z@u|4!EfaOYS=!+eLY|S@_N}Y;GXcZ}fkHMcSS{ARJ+k~$(-vKB(d?85F0m7NWBAB` zb5GhLtZ0z+JsI_5z(`A2Y_uh4g43I)Z)9_y(sA z`EgWJlh7@j&ca%X!OUYL~*zHu};e(l{O`Clh4I<_V!CSchvjbF(e zNZ%6Sb@z|ZO7LZcSt!m%@HJQ0$Tk_SPDWswP}d}Yiyuo30$Ut3!R|5F zC&x^tM1g`E8Jldx8DOWj96+)Ncr01A7*MbW6d)WLasZ?kprtv1lRf@K1S)bD3Jj9f zR7yIl>5~62(0^z*wWk6Q9#CWy^)&fnewmn%agDf`ow-}gUAd>^;kqcyQqVp^ie;F+WMza$-EUtJ^K2Lvjbg_SH(ToV zs=_*XR>jTw3%)muKPu3Sxr^CITnby<*mk3?txM!{YM5jumRo^gI4Mt-YQtIYEQRA& z{w6rj{l}Bc+Cz!5?vJiUNb{ehuu6c11y(bLD=U%g8lfL!gzllwQclXiPf{551xC9D zHCH&xou!b<`o)#RE>xWtuZykx+#sIjG&RAVD&-VyLnZohhD8CSh|hH`ywra^A4sg1 z=6(+KpAPg*j}9+uQ*289lM%6>r2SP1J{*DY%Ni%W^W z#by*IT7dPtBRAh9Cv$UPF-@cR>)f4B^rx6pZw9hCS6q@odd(+7ZP)LEjp6)_aFmL( z)=3<+it#jZK?V+-mcSeaAuSisx)EAPI9b(xXVh7QQ*#x6qd3Cp)FgXk1+5zvcmgMj z-tb6ZZpK$?;H}Z$qMm@8!Mk&C8;3uVEMXLJ zEayW;EoWR*!Y%s`0ltkITX)drUve4#SZ;Co9rrJeWGiXTz;r59tP4nHfSQ5kBG)-r zQMGZ5_sV%tMptMR}6|J*X$qOIb98)QPhWh zy>P^%%PkcNCA%Pp3!6~w!c1>TCB8#PBf4K_bAQb|eoT3z7|`|IG} zVp7^PE&Q(2L2#bfk21yDkhz>0?(9~EILNYHJXi2Ergao2ckB|(PbK>a+;ie5;IZJk|XI1L0j&*NS^Yf2$nORnRl9L zZvG~wg}eJaQZg;aeS@}BwLEa_M~NJ;vdu|# zdXxv-6D!C9Ha1bLi`6_v8^6&eX1BA@K^@r@?{O`FL8e4VFuFEue)Nqux!?)(Npl|y z9c;pWOmY=$@&~695HeA1dE?DbEkryyXW{eeyaiYoCrh`Gr6nMq@7Q5JaVW5>fBoF? z)q%3^M>5<5hVaUpsaT%WcxLi>Iry$Z>esV<>;wkdfdL=+Q@m}(z_x`D40%CTv0R&o ziMYr@bwS3$T1KZ~sT>vbr!{{iN-{I~As{F`Wq=dN{fdWxbP-;sH9$$Yr z&{Bt2UP$H9iQ!}69Vy1$0o(3?${)EqeJ$gV2ZUzX?D5|_KP&=vFJZ$rvCfgJ%h-cO zZ_#1o6v4MAV0io|-HiH?eYxo2_|YQx9N<@v7L!`D8G=z&XxgP(*6rUl-vfRtWX^e< zswXAVR$Yod>Xcq7x7k?S7+M>&|82;m-gL@8^}+iOt2mE?>Ft zq9nygemZ~mt4A+ZULS6>43%^QWGq)61zGerujrqXDQ`TpSgme1GvXfo`|$LcH)?9b z&!#P~?uR~oo5sJ^@mQ0G-^J7G9+^y3>`uC*9_>MVYKre;*AGvAud5$dtbFm6v&KFm zQ)0!^FJb?DU+=boOw#(xzOLl6T}cP;X_gy?pCOOty-B%aslNViv~NGI59`|a0BLnA zoh+C1r!& z()nLlOZ_9z8QMhlui#n$DVCCtg5`g&FbLW6?|4H0QjOK-qhS9J-2V}V=wE80|KKhm zD@%?B^j}c_N5~-n^e2wpAE4Odd=#ht1NVPK4g$J=;#K`= z2sid$aQ{aHFto|#KYi>E5c=;Hl({SgzO4G+ApMVS2ip9<>#ctRTK&5R{jElBJc<9c zyZi}N^=~zCu|JWk{tL%R|Br6=x86TJCoLl-BJtZSRC|Lgk`Tx=L z#Kr!)vj20B{c{WW+vMLtA*KK7ZU5mzz|wz(D*MktA+a(bs`91F5@w>>R_-8#G6(_r zS4^<~A3g;9hbo!9i8Q(Q-r|w|)7$?Ys*#*4{(s_v$@~fV_@4vA2~TqUH{l5X82gv+ zKxAbygZ~IF2`;0{AZnYq*d-7KS%ODORzgG!)I(fcmYn`qXfUj;=*|DHh=hM!|F_-$ z@9169GBQ&C4BoYDc0FQLwzzhvutm|5(IAqF=J><6z8|ZkKYu*S=@Gv?@rmp8z62H< z3=<4#6vbw?=-GW}^Qv0T`F~h@$LLDiZCf<9ZKIM3D|S+`ZQH2WGe!j!+qP||V%xUu zo3HjdYklXQz3*E0w)=C=Hs%vWJE+G>v*a6VF6@b4vsS7|8%$o^MxX z=x<$U777o!jAw=p#~+!!%Q+o#I>(P+NpW1B-*jaOdHLS9`sLnc4ghqVX9ksreAcp= zof+P5q;D8UJCM)G@3#vx2Os#U&B9D)oU*wEXosnh7W*FtXI;03fZk?z0+{-Ujl;{UN5+q+O zQ=Lg!Ec)eTygC$60zgOif6X`W{{GEAJGlgTk&eRhV666e($T{Wh zr;7BU0-VtJ>`~3TR8B)qp((0Tw$F|;k`5-t`Bd)72tzcyKPK+>6{uPe$n=eA3`u91 zQRrN?B3($pP&h+5*MYT8vNSUSAAb2^(pbM{pEDN&4@z8tDj zJI;6StbPH$$q+3Wlyu`PGc-DwRGmdRiwM6C*z)1o1}3RwbC$RPI_BR$g&@M$dFS^9 zs%1776gEnJP-~Z27E3BJt?U%$#KkP(f6TOLFx~&&R|2FHs)S$+JVZZJXqojch*q8{ zZJWk^TSE<`ou~Xrn>WiI3n7Q@JL?|*)zzifaOBXhu-PD<%oD91a$i^Vw(s3Rj`c`1Gq6TWhL z4DV=p*z74}H4D0TN#L7|Lx_}Ov*JyDRVK=Cu(eB>Gt3IMiATthpqGPtS;^{ zj0z-%`X`~N(T0*VW6C#Uq#02bDmDGY`gnOrUj?TF&1ey%PIER;6YM#CSDDA5Qbe?l zSHx5-2E;ZdS|-aJ^@|3&HTF?^ly-!pc+PQ4mts4c6xEDQhxN-$Y7Ip~2q1?g!YBGo z&&dJQ)$N^?5UE3wvAEX1VVJYA->m{@Va2LdI$WXSg%fLR%;T}M17_)(EW}ug^t0}Tjf>}kmWM^oiXm$H@pS$`h`8Nq?D0mu3sp7ZgO)fr7~M7oMN(?K|Fx=FbJvD9zMST>WaWB;KI&{;T(& zDB?@I#15X)=Em$W@<<%4WBDp;IqJ1)D4AOpEOPZ~M{g~+*>M*68k}Wz` z8I}VS$(P+-`|W!rPf_VEW!KsC5o+$Q1^F83)5(*L;aCt*wE{-Eq1)6&#t$lB9LB>BV}aJ z1e)@;=u$?UnIViOp=NH$asP`oW>kkKWOap9*o{;f zsp%^Sg}?~ROB|PFm8_}*D<~6ERGSz2XG!XyVfs-xv0?OadGX-_vUab?(0WB;bph;D zEQr(9X+>iBihN4wOG~e@>-RB-SeRp605_@?sk0b=eJG!I^bV6`&7#U_vyWe@N4)VO zp5=6`0gCM0Wh{IV z<`N<@v-4$Qri78e_4gIdynm2~`k-s(ug(FXB)#`OU~g2&|DtH7oQpVfCrzw$<^Ly2rJu z++hu5gUFE`n?jh#zQLhtdVXP7cqdt^?n4@8(UH$rj@Soa7sm*xTHv+i*K1fwir&IT ziVL4-_ws_09Fv3+OIHeCo$a2ftCPex`sKHU&y7btD=eNXyd+e$huj%~xcu7GobHG^ zL2^TMb20Zy&=)`K<>*U<^F|mqvUPn;<}3Zw_>v_LSo+07YChyJB{z+eUDPhMI@DLb zL?nsJ#XW9J%F2$E zhFlVgjA&WV;Go~DTLZ|@+&Gtoj zE7mo-xb2WO^HS{Zh?@xB#MT2v2X0m`>o-d~1WJBqyk33YSC>efW&nK+|Hv-52IUoq zGJ?YHh?wWo(l6hiRAyJ+BTNBckIvk^9-D+cwW7(t9D!XzZW3tR(|c7>FF+E@6=0oP z>>={y&R4kYxjb5B6E5{j>&?O;#+rH82}0%qY|a`AmhcM;Ozl!JsDzq-`QQ^5HRV%m zvhZ#y2UV;dHuWkDj{%5O>CGh0-rP8>fae!(dIKk$1WF?lt!r{)4jBVy$B>1J8APAwmgE*dZV&xXhFi%pym-(I65T!V z_*IV-EMGOwU)q4~vg?-dEQNFk(t#$5+K|rhZFW3Q^!2vKTMa;O1rhiq-pmM%?jZWx zEY1MF_fZdn%^Nro37V86>tpfT7SEjHjee4}#$O1Wxv zm;)<6cuV{+Cggyw5&e>aG=<_`ydk$grQAKD)`9OJW%AU9pHL($Kk}5P!MShu4kjJ* zH~8RXHR^b$4JJUe<#6VSF5bDT?k?y&(>L)Z&+Fwk^guz9&R&gL$B*Fo?W|cZr8ouN z?6b8Y?LbiD`+O8*VEO1il!I#oBX-kWpGJOm^Y5HJeRqnx0MzJ@BK}Dkc9KrI%Yq(c z!{g`Zw6pT+!MJl(q{t+oCB9O9%uZb|1w#nqpAhU$snUQgsWXcvAXP7#z0Bc*F(m`3 zblbs~&cW@?UQ8~dmq~xjl{gQ{_qVOK5AzFO!esDNv_%S6rIb_ffqeEb6i|AVhANT( z{C?E)=$lst!vT9!cS<} zjmH!Vv+LBA{AM@Bk7a(>#4fB_vXPb#?VuM^ba$rU23Y*&jGYis1N8Iyup>N*g))2a z_Vh|mRG>FdjU8a6pdZ%I0`KeK12N;vTM3LN%N~B zi2IaFJNz`&5<;~hYjHVP%`bB0VKev41ZHCoDIuwno+wa|67C|J$Mu(2WN>$ALm}Po zMB#%2LiF00i>}rq-kCM)%>C??T8}_XFz?+J0Z8!Um*b{45$DjeQguNH)ed_n=DGcC z`ZmB~aI;!D?-hkVzHowyj3~tfcjukZJQG#r#z#F?tkdV)=fhrfeeyL+{S0^|@i;v% z8-W18KH3P)jeSTO5vJ6XMXQeqE8{6MYDg}kF>SG0s`cri+uyZ#y|>2ma3|jt^Pr=4 zlZ!8s%PPKU`oV*GA`vvOR%h6A4JZ3l+6^$t>PQ!j%W85pMN)WuH2qZ&<1MWj{EK5Z zywf-r$$;YsenG{0^5dy(? z=nz5#&IB6Ed);B$>%;fc;4TRv6MF!XWFP^|1EvvFl0EMt?jIV|kDFAp{)1eE{TM3; zU6rt^)`MRbXNloAh;5%Yd6Y4OHug1R5`DpI{01QpOKn>@_1Nl8Zshsbm0s|o<(~W| zVr8^#$EF3|Co|4x{2MLa+~r)o9MY==Y;(RiOY(ITH&0J&kB&PCBsF>jUP{Ei-bknm zx0>rtX^+)Ri)|KQSqTBp(x`#5u15S07#?zxZ`3u5LPH_ zruB2%O7mvt@{mQXW{%zLeOfBrs(G@)Jgm1+rL_D#kf$=Wp?A;Tr9#MY<6#daQAX>h zHkrh2qIzef_r8eH2|DVbk<-SNJ#?#<6U8UOCIsYWB$nPb9D*goUWC`D-jTw-K29Ke z`$1h#)kz);s%%~}gMUroch&1rXja>WVk5muc=1XE7Zdc^#{*^K${{dT?T!^x^oArh z`VLD#7!GV51 zkWRPGC#))ipR4nbztda33*`idF!uk}Jqc2RipR>qVn>>%y`Dm(l}pv#b;zj=r6OyT zVfYC&I2a=Nddn$7**D0H;kvEevda6Rcc%W{AZb^Cr6+?dbDMKMGJ==xp}# zrF%qr+#d#ZOsqr1b_IslY@v6mp8`H^-wv-?`4USKMHccpOY0urfj4W;rMqOv96}mZ zlKP9WzC+04vrz3q+0#pX(Q*8l6axQZo@G>TrJ+lTrwbq0YmxW*WHt7dv(w-=Im| zp0PjBPMfbGy0}bYqvSNifz6H3g;kgaZc6&l-fqKNBKXDU%OW|(!4e5k+A zLap8|UTydeNE4k-bh^%5s&vwtn{^48^l2U{oLb?kYdL|XOf_&DVkST@f1vuYWCavU zH3V^L8b7^$;X-4P+IvVjLSDZ%{;FD3#g{v{3mc1fpe-B@T*5g6d(f<&bM<#P40uRL zcO^I#DJ=u0N30iZpeVKI35{57J->zR`&85~DM39-zcdCLNtRcllx&CUNthVGYSPKP zGsaGH6%M^Rf7-p@4(kBkoPpExO%PB+OzMSqdQ_&g#CkWQ=bzto$Y` zO?Y>E>nl-`WpEKo5ICZh;wDxQAAmiTdYfM~SYK~J!Aj{wcMq1`=WJ_h8$3eTG`?U0)@cG~M`P*>Ayfhxi}XYbkWLOZJ{G88nuOy!jD9^rAL1cZuSLJCPY=POQplg6f@vu8~FJ0zf%X!HN3Jjtg(~k>*c^GvY;Py=a z(p!%6<-bXA{egJ@fsOuC!7mp14L5dU3!3a-8LdBP?f>2Gi+{uvGt>z~X3 z5$hk2pNRFpU~|?#usIRyA58yKv5!dQFEE|$528)P_9q2L^qKql{PLgB`X6`ySU>?H zw*N|1{9ApB)))N$1X=$x$bUKiM?&J?=pQk$eP)%IK4->G$HxARi1AZB=G!N*&dSF2 z*XREQtQ!OVXJGx$qWmlDpSAh-fc`(iekyygf9ghkV`uo2o@8bE)EoL+*ndV9F{b}> zjQ)1Q{tEQ3uz&XA--eC#cqjNz)Smuq?f+}%5Fh`U^S=(vznuS9O6cDnf|38s`R6hG zn{)R6EO!&11Wfp!oUlJ<`=29c|Iczaj0~UhG#qS1e+lm}{k7K&pK315>_p6;$~&yg z9RKTx$^Ad%ZvH$>|BCzP(fYT0ou~`~O!%K{_Md0;U*7+5P5qnaCXpTVKU}lFoj=xF?H(%5&&9>!CY)S#aRp{k{zb#{;tvGHU!w%xcC~g zc6y$YoI$D{gDM{7h0rRFaiY^t@{)+@!T9)s|B+bQ+V*mJJu*UgSy{g#8LGN-(!W$1 zR?ow#>eAi0N&BIy)%5ySNzeECdTq ze$4D0e3-5E6r{p0gs5ANxdQC_Q(qMafavNYPfpSTa&bCSZNWn;-(L?BH?F2G==nY_ z!djP=5=0X78TEK9HKSRHh$!~@^M@iId_r4ei|F4cb<+xprgtmd&QG4(6c@;(?^AA; zm!5fbGE@w{U$m*$aE?u{$pU$8w7wjl16Ro88uYx*GHw-`OJPe&od8Iz{l97V)?Kpg z2r~)1&vXrN|N5E3=CwsGJ5mh!N(UuzS2Ym-pw)(`#3RiTcETH!mcS9}HN*rSz;gNiKNm zP&6!vqBgPR;;!Y-H%z_HaF9qoj;(NOWYIby1`}SUMf3tl#ud)Ul zb6X}Z%_zP`0q%Ar_kG^?;~|mn9s1%OJN9iy zSY(T)^~bv0XYilT?$oWC~Py z(cEMTcdpmhGILhG;x$6ZO92NvN_OQajL!Nb|GDc0973SV-eMVM9~Y*Wi%~k5i$u(W zW0tbzlU_i-Xc1PdsuL@V;~vW$N5iVJY3lR0ai~xNArwOFuW5D>nb2s*J({7Vo*AvjJ9ga* zAbsuMwCrMK+~KB*qx1t0>7IlXR3ivl$!BJXDoPWM1tY7&^YG6yCKD_)a!D8#?61HTOW73qqO z*$Ng1Tf7snI+|_Ef7LpNLfE^qZ=l{Hk&B1z;RMiC&w01gmm)AvBvG z;3Gy7ZQ>z%lgNHVVtUNa@EI%MT4n%TDs5}_1{MIL2`-**2fMp*ogev4*BL8(k52XH z=Ys?%g;Zw^SZF(O>09dgty`R*&3~ndr{7Qi*BIp;3<@oOvJf_`}k zy0x_5ze>^V4a~ix96Q|C$(Bse*Hq86r?o!cWKm?oi?F(1XB%)ovr3LlYBe>GQIG5n z(g@?f%lXz$VT}{6cyct{72OAYwm~|&c)XLXSux*uCzzSgJf%2oSabnwUxH=Q`ma4) zUWD}ys8yD>w_{#Qr2tsgDY-u?H7PotUM8Min0&{`_e*hOJj&ck&MnjvIhrgi9%or( zc^6A>n42@3_CrA>H!b2nZ_hF7{R1OYws95bw#rNY1bIHo>@MbqWLm+$u0hlKb!{up zQa1&c`+Dn+7bm{d8bAQ@SF2%^b6cqKj_QUVPeM+!PdVgHIWth|4+;k;PEKD{@D*u$ z6-vj(Nrl$xcxo&@yPoBq*s?V@A0W2!h+}oyeM<=tUO3#%M zAsZ6#zxlkjFohZ_zOBM^@-x*2&?xqPxzTvR(>#Z{JLj=HW^s@dt$d~qp(*idIEEzv zL>Rxb^o3_D9ATk+_A0#=4xjvw|IlfFQxk{<_%N*n!cNbE8*eFl~d_8;a z%hx8vMoA9=0%U{+d#Ce!SS#JyIo#M##%YrrGXu01%^N0yHP}cXHk8?wU;CVJ=YB zs*Cr!XNOqeHb!#flL-0qwxy+s-Y3m%96I>&#``qxug7WzL~p5JSZ8`2dlqyD!EF5&gE1aiIWuZI3qh7Pgof}x+O7ATN8@K)Te=#X?Jr=T-4wLaem3#iHm~70@Kn?*8de1W3)1z{ESYx0axvHFjx1#REa{Yb& z2iCYn&0S6)Ere~L)v`HWZID7GZ-ipSUhxe33V=g4b3h$tUn;$ZOoJssC)wqFGs2x( zi03qWem;V+uv8HvWP8b<;#aoP$YPy8#mOG8%u@Uc`@pe#!gX(v5ZchbV(F@MUdGDQ zfL5I))xGzQXhzwybH|}bXc4`RKDl%a0choxVY4ZJx&rJMF@XD+aFI;W_ojU(J{J-5 z3+D~-bt_91aKn zfimFkd-u_y6(+t{xS6wb_+pcJ-`g3aPgjG7?0<$Q}i zp^lB$pRPR79V4>oZNV@09}Wd<>u5iBqBkPwr9IA5b*fmpK{U(mBBMNi_(b5HYypHb z&Ytz`xZIW)wl>Szk?^cv6SiW7ni-SeBJJui%d$XGamLv6gP$6`85t=;>!IN{)V%AV zb_9#%KYI_qq+5S~kGTSk#ZqC#+OYMW&?~ySd6^eBH>m7vXRhlo&zjTZQ&PT zye^|%IZ%X55^si$U2KMhr2>paug$K`??E+_Y&||e1Sh!Wu)b<>FFH>W$R-I1g6VtZ zbNS@w8F-r6E}e$bHyE}>IT(9HN0*VMq+gQk9fLO*G@Gob3VFRQ#Ui*G5UJ(!5yM+Z z8FYlZaP%zd_-!@VR9$Y;eFG>^Re5HdHDd(SbT@E-MB(7&ec{i^g3^+i&Sf9{ePT3u z?r>G?^WCQ9IrYpjl*SJ#JdRN}Jj?h*zN?oU@?MN6_W>$->D=pX(~;Tb6`a+ZAGW9~C((Mf8<{4LA z$EZ*#xjEjzTVHx`nzy7u)5m*}^zg0oi=R#CUa+mf(^0>D;TWZ69Aand(?U6G=hdcz z#Z6^Em@NnMCa$aJcMZUC2N+GXit_iesAV7KTR2B}t0pZKnEP_x9MK#$y=+`HWI#PD z+2GOCX=o%(_0IHbWG|MT4aCi-4y23VCL0#;4}5$}sPwOtX6y3iG>APc%Ltujs27tf zrd2%Xk|4R59Q>ibhxLImAy`2K)>vMy1c0#t?mn)tdKfOrqQL+FW+2D54-EbHr0}npmu!euPP13Bid}F|x9*slh)vCjT&fxc! z(6rM^ipTU?R70E`xX!Q?rwq@$BRuLM5zFH{Wu)E3yBs!6PSeNsfQe_*6HM$&x*A07 zlM+;|5?gW$Jn|35fj(KKRA>j@BSt#D;QnQ;B$>8;T9XVgv5h!nD6Ck0t*=h=g|J!N zDqyb@Fzjd}czNWEkAk&C0vE4}HQsw5wy4m?RwLBf1*eh;SWn(v&E^?C)n}UKiUixb zPEaS}4OOG=wB2he2e}TO&n64N*8^ikw2ULW)XP|__pK2s6)wPtwo*aHkiwb+-O=;J zZB4h7t?B|$gQU1o5Nl)r7VCQZOrwBiJFG;$Cw1!WR@QgEnMgna_BBb+4mJ}#(_u{*$Sci z%{en!ZGr%w?(6KeTLF~?wdUHG${z|LqZui7l9?9E> zC>qRIBJ>KXD1$#+VORVXX$+;f8g`c&<11O-0bD+{PH`;bH|1Q<=br>t!g(N9j^9-t z$)@}O3rOQ#LEt8Yiy0_n6ap<%9iApM`rh_MvTV2{Ay{4-Pe9! zxP4O*j%wCI4@QOidS-@TY&IdU6mRte zl#69v!j|MNvBj797kK*_?R<6avc^L=oTGfQi8rEM)R2#n808{P1wetApBluP%=A=) z(r?6=G|W~7>`+fIqE|tnC`d?FNHP}8q73a<6=BX(ZuEw%aIJ@`#TzIVoUcK+4TYQm zE71+Bz0KBJ(LehT@%qErB?^LK0=Pn;qOG9fL22b0!eCQIW!8BGYLo zzpc}EMHq7>;0nm;&kFNoYk$65oeV4kfK@;Q!y?8u``|XD4Wt-QPQN>F7B{%Qp{%4r zlNWee2nwma8q_2SX>NTNysDc-;}iOZgPL2+>8)xBD%DmKuyXk*jT#f@qX`9Mhp=gW z(B~8Y0bGC^kCKY&09uV4>+0J%6+mVOwV;!y2tpDCHm^@L-}nPI2m@Qa!%c)AppqFN zB!YCl2{{yF#?PbO)r_wua0x-W*GL*aCYFSg(4tg=AeTq>*{ZlY;xZgLdr3sVMrrD9 zHRjn8(Ixq_Sqr#DJ~1DmPEs&%EZO@2rCpd0=g4cg%M@|Q@V2|rfqg<7JOEw*jl&DA zARtRU*VY}zg3s7Kw{RQ;+U(dDPy)u(rFp%WrouEy`<>9t>)RP@*Bd8u+*em-(;339 zE}`3_{6xW!21t3Kl0+ve&o-uK+Qk@vIm-OgrGQlfYA?!N_A zKzYb;6RU5d6DT{3K{ZErPWD4zM|m%FLnN1`8SEm8Z&E&`CL_YJ#6d&&06uLRN zUr3@o62wIOn9fh_lW2e4?1W;w$}W5VseaDrjQRw6CfH_ZTm1o4QL<*E+vOcgyBJtL4I6Pt(NuHck*1&nmZ9@-)f`)}P9(^9< zEQ%iYlu;{dnJImUQQd5)VEA|qt@%RIf~(|xa+U21Xy5X^y`-=A-A}+Umu)UIx4pELKY*;k1dM>^J{Nv9raO@ND%?b_lD|Df%Uul$} zFMYCiU}0IVz-%h+Xh5LshbY=rj^wdvh4!VUclEuQk$;|I1~J7L{tTnmc9?A(q(ZJk1_)OOrq{#MrgBZlgD7p zS3r5O2OUR1Q%yi7tJxDM$LImGFg1lnN&*I~7Ye%aLX05)I$~3&l=$ogj02$JB3pL3 zy1E1_K%s6u(G?Dw7(cX6V)fhCKx)6;z(p z3rzlru?yqI5?-fJ`Y`MB;6HpJj`ur^t+`k@n7q5OhRknIN6IQYpcX;$io_@kNc?3x zUvU%(3w#DHAn+3CnQU8h{RS`wow343wipg(%hN^FPz82H)5e+1)dSMMoMt#MI1X&n zK>uwrkY{<^Jv>$OQ8^_=wt*Ix8(6%Ww&(#`PI;>x47AK*kUideb@2}H*IqYZ1MYgdLA1c_HS0VuKDRx?2LJ{ci zu3+1rGq-w;tcn||@B@NPDwAaeS9+w^u;L#ONXj{qbi&j7j2;TCr$X z4x+;?S;g)dzgoJft%(4JuA*st$Qk;vNO~0XB^DLWlY|;7ImT=7p)3nb;%Tu$zF;L< z@)JR#{?b!lhHncQhWDSmd7CXOwx04^dY-3t!~hwY&eb|p4rn<=M%q>pe-Sz7abRky z(q82{*JKhFh+=TUg{H$1QzD~-pbhmn61YJm6!?ZP+vxk`swWO;=rWL$mjY!RlPymq z*Q%CN(vuaiG}(#@VTLSc{U%DwS@S7%5QRzB9ZAd`)HdV~hER-F-9^iBNo2d7O%4g1 zO|-U`aF$q-{e%sgIo`C5DTiTToh?f;Xe^<%I}UWKe-h2pc$`zU#2pjjGNNvWFDD<= zEH-ckwTVRavmzKk_C0$r!On-Q+o1Yw+KTNpH2Wh~2z(l7u-Z6mvk90_o{UixrWG@V z;ygWp42CD7DTX+0s|Ugn*e1)ZamW5W- zfP1y(%f0m)bIKPs?kVdx(>}k0>HcPBJesCbc*>~lrG3qX{jx#2EihO-y<=^@y<4Mn z*}({j1@6R~NRQHMPnHAra={3|X~yas+uV|ec)8ZuTk!zgjt8iB3vt0l(0DKKNtj#N zwQ^SC41O{<_@dE+P^$<+l%c7 zkCxW#y_VaCe>6*{U3uf==>+0et_MPT=JgaishSrXoHw@J?o}9EAO`z1qRmq(Am@Dh ztw!;h=Ohf8H}=+0c-0)PUQk=~mPGcp1lf}vv%^deD6$sb!tUfd8XWHDPX*;O_L#QS zV&NvP-JllY+q9FOM)>Uu-;!;b04ker#(gu1lBNoTL#RDA;4I=?bBFw#JIR!L#~ph>m-cOfs=&B+AQf;wtRg;ubFa%!P;P)i1- ztD@!;pmsh|yh*n2jF9Rj#o~kPUB^Iv&wsCo;)w~jf9SJQM{@yk8JGW+@LDSXW|VK2 zK9}UEZl=I5?-*?j|A`&{DVi>lb60c#%%yoosye9xaY96mlaV*lJj3oI^KLkPBpCyI zGYP{`C%K-i(aD#~(!hybsm6O_fpv|VaQzDgfGXUu%I(@(31r>2F7~7Z0#a7)a)&vC z^Myplq(e}6ukL>TJg=jfox|Bs^Io*`*GK|v<>)en|8z?=LySOlzk)rHW;>dXt|9%e zgI1m)up!6SR@(WXh@qNZ6se7dBcbYji-Mc!x8vwx+SB&fUc40nhS?X3Swy94693*o z03v^U@xw1rG8gWJ_VhKnlQevi70Pe#m!TnJ%T5e;OB-e3_S{hy%jYOe+cq508w!D_ z(jp|5tj4+mn+;`x65dG>!Q;!7hx<;Ofp=N8Xni&34qP^*rX%!HyQ!FdOt51q-*Lyc zt~yjZo)&{k7?sv?QjT9_-g+N310BE;0av~z?mah8emZZcky#dRgQ-+fsQv3$`;x%A z(L`=ZO0BWAYmrYsloWR^D76sLM{C{A43oC0L9j;@T}R5Jr&yEQ4%QcGR?1iP5|Bww z!AprV6cBV+Bb$p6(G|z)Illy3*?bKqA`hi8s|_~KoJ1g9{*iL7oIG*R8$o7@1<)WL zaZ`N_J~x(eJusGr=}2GGAJ*cwm90{dIctll`4)f|UAA`@cNcVEiN_PSvf-OV)tY&4 zNcD2JH{vb)W5X`YDM9$6?Ds-(@fAEGS#8C-$%95mH_{a4e0#8U+fFclvZ#tEq903Y zet#Fv{CMzO3q$FTyBd5Ba837Xc>uac{Z$*)70gh?9wgw20T1d&*sd=*jT|~R$hAa_ z160Nw;vQ+ZPvZA)>wdNq*uHOd2g<@&bR-j+o!`Ss>2g|Dyj@mI1!Ww_3bi6IHGVV( z?Fftsj;5q9=}?=}o$aXF2Ts466l$xPt4k?9It?BQREs|J^ZmeHyzVa-qyb>K&h;V- zq#_m;CAvjKIlL<^HZ5FVz3FiU|HjS$HR+d-X^n@K4DK~vWG`|V6i78 zDoqthebtrNyBB2Ly|He^eTWiL>2#|T)@amyMW~A*TlE|?_Jk!L=+zlOI5F%c zyJtfmC-lhW;M}ZydmRVeya5PY6Stfr^UhiBuRG87droq-B3`C-wwyD^U~bOD!Tl%z zy`Y>uBL&ZVb60!BP|f(LiEi1xA=G=eI^JTg&V2lyz`37ZX>+F1yb8*#tL>$cbMNT1 zq^)>Lmt#!q`L%o<<$eV`rjR~LOHr5NItaJeA)X6X$Y^++6v41_KEPHq#c*raaPHT0 ze8t^J%2z46dPSeMdvnOxV=Lhae`U2+=wO6GzR5zb5G(N?h#2K0PZ`ZlIK#x_*{BF?b=tQC-mcHk^b337u9xqk(e?U$aHfC=kjnGnjQ{1$Xg?V`EyrPBJS}dmY3@JLi(MQ z%;EXqpinonqj2NE-s`8g9BX~+hgRr)W*B(^JC+Usm*<|vwxwEBFrs4=-gBj&DU2}!&RyG&Bg#wcTL{LAuD)1XHcr_ z3|MlS6On$-{%To;Oi>PmNa@#B4f*P5K2?iLZ=%qSuc*I#r76n~SD=^+=J2>Ku=)Bz z1qQ*A(oH%yl~IGxK&zQpI4d{QXH~Alt^BCtwwmz$76L;(UJnPRrH$4$`-2=kArrFU zj(SC>NjB&mL+1cLSrnI#}WN;nG2Gi<{ z4ryf^>?Lv*!}uzf6-x}~J&3^7$I!FHFHbGCOH-&j(+Ezx%Oa(K91;dY#Bq@cU59O| zg?m>TT7|#^cZI5%29A`pCxsHjvl{h#FNw@v8Ljq+k?}*J1}WTG>;{UzM}?3#QUNrh7oo-KTdfvwBCR~5)5sBKV3{7g zBWjk^4UQeR=k@CaTGgc(_}$%M=HcRrT^c>bwlcqi9AP8+Zx5|Y)}yUsihM}={4Z+j zl=lMDe{qpUn8dPuf-r!d5W!60MneF5oL`}f>Y`| zY*;(Wbyw&g;Q=^p!H|=f`#OPCOtT!`IiQyzN1>)u0 zkm%Q;9Pgy2z989NcCPVbNF)x@&=+t<&W|Z{Ac83}(^wxKT3K;cey@2y=(q38S5DzJ z43b;hmFG#ZFPkYVkLc|9bZJHX*!S7kos0G(N8x@eaQpg+FXNp{-KYB(^D8lgJ=740 zmddOOeB^4q(T%ze_uGBt%mh>Jbp-5fcT$8ffEUW_`JAR)x{ast+W1*1HJFkUL-t@yGMPsO)X8GyGs>ulGMx`+OsJ1)d z!%}e0^yoeAg9NW@yEp7j#^kP!ZgvINgz@_PA{X4sh&RjJ$wZLDmY5zod-=MqrGC={ zr9R=f>efP2@hLlZ3FqG8?@YP z`*?IdTDPCGgfrel?D3|A>h?EGa`4rOA~O@q<u}zEZ6f9Sy2|)#|n>TdK!mXSoJY&>#CJ9}kBE zT9F)u1C_yXV}z93up&;$am1DTM-E4GU|afh=V4|t23x~Vv4?6OjeiV@m5lpRS)dTs zVJhf{8FimC9`3|n`AV?mPJ7ir6)Emyg0-=M^Ya{hmKSIuU8zs`qp*6k5lP0cffjod zHIJKU?#meSJ8v$v$#?^}RY+Y>TwqT0+YAY^DiR{@^gi2Kn_DE`Z#E^b2shoFM^yJ5 zv`}`#S2@essI)Q~DOU05C>rwRXg1qKw)WDVlWpOXrIl=6aSJfc{!UZliA-tS%E49y=_>+*5Lu5GJXmANpDPf)x>Fu zcDo+=;wpzlc7TDaTLrF#cdHMJ*U*J8(E|R&(IBsZ;8tZ!q~Fr}jhzM*dM2=HnU*5G zL|wlgjvKbi2Z*u}gn?)_vJP02VyFy(7{l7;_-G2@XmTd_^DooX!H`vzBG$22H@0dq zJ07vTEjwPjzV;2k`DmMc7PUdd_M2_4u^ZC1)Bgwowz^m4?5WRxB+K?5$Q0EDEE~3d z$%dZ%oGQ16c3PXiBWgTb6Y?7Ww@YcY+DO-{&fdnWRy)Z$)GYqcFO}b)RxoTtLc1B9#MT8UkPcBV>iss}GV5AsA=LuCr{>NBg zzghHQn<#0c0G>?1igcn_k45kRAM<;{z{V|0lf4KG;WNylMx{V%0~gTVyd@SIVpcqx z+d&A@x1?H&UtlyIl-5p{18aVgSW1n-dA1xCens=+M~`m^Pc&>i`(A_a&u!>2=}Q?% z%qS9km`EIePJ26{IJ_v&g?ah-g|3Fk%cqYOctYvEpO8j`QSB2yy(dpiK%JHPkkQY& zgPJhqfV<&xz~E~6Q4F)_Lti_}BlravpjZ98>Y-vSl3hCw996V?+4L$ml1D3v@w-tW zPuoK(7=KoCFY}s52I%k|IswCyzq;vd`39oYT45LhTs8#oZ@;dj3T=aSzfFp`f;eql zVT%}qR2ndN1T;Q0p^iVf5k)2=%W6wReuaZ=>Uc|LE08N~*IN`;Xp6fhB4|n;&&U8# z31AX6o6r|t#aR~QQ*W;irroaWg<&rPiWVKclE)*o7uMSgde=hxJ_2Gr>BohN#dH#V zRI%~_=t^IeB-+|R26yo3)Bav|jEfjaC_$uJJA%RW)oi;Pto1Muwu^LY3Dgx~Gy1Y@ z{}g&H3`*$(benPyVH3ge)SbjGEw#wy|Dx?4gDY*45d9Fzaf|p(S?6jYcS^+ zVN1??z}zO zQixOkx74{(B^EUmF>}*=Qk@@t;GL=0M*&ZeTLK7IxVzL^E789Tq%aYt(AY$sTEl6( zH?~VIS83|_Vn#0jE-oRdJ_cpK9*HliyK0f&Xs|lolibecNIWLJfL)!{f0BZo32v?< zD3op>&sZPnfg#7@k9rav$q;>0&DXGzfzIoTo?_X))#Otg(|-1A15*t#Vu~ zO?R)34RHAZfOdU+;==^}dvkDk#)Okx)hU-6b!HUDfsUOWvq_C&?hn&>>SB6d0xct% z)(Q{nA;n?Sf$1l{hM!xRr8LYaTJ#iYSdYf~8XT|A!>*Wnu=}p)r6_hjR~kazca?FB z;ndTWYbe$%Fnc~5^ONa(`CHR2j_h(y?W(+lp8Csg0Op2)!AwprZW6rd2QLf#XGpS| zDw`86pG)<5MInJ?@qmMcL2RoXkcnR?%$2+;*K_Z6uFs$M-_}js zdG9q&0y447pVY?Rl(AlDY@^Ngs245BK-Vj6AiC|thQ$M7+|Z5)PO7K5rmKD+Sy9jr z#YaWOTKtg*gRqR2@Lyi8uFM)b9*V%#CY)JvG=3z1#{t<2op+z-DNOoyM^8_j9(rz; zpRudqTqE1vYurR9{=jpAreSA@|A+*8vR7U941muZX0~r)=$svSg7$WX7SY6xPQ8u1 zqDRg!2OWv;NS{rq?E2Zdmf5Q2%Qh!TW&7PiN4Bt6g`F0$QrFWcnXKux`WlUhjc7*D zl>!rWu^ezjg9hsVUat#Cs?QHCU%?HfAV}7NQ99R&yxKIfR%- z1CV8IMnxv_Gh2l&l(Pk`c9p6LZC^iyOTkZCbh~Aw6DDW^SKWt)tTd9)x&1k9o(fs( zjz3wR&a6cpQ{GI4L$AfaS1@IF*HJOEy#la4S!jWF#9B&Zg&RQ&1e)t9MpYe8uUmUmwjEipM#eEPjIH^o3#VSQT9 zd!5r@ANu`;^Pns9shBhe7l0-O?30x*&|%ttq4Ec`tJ*IYY8R66G#g=xea0|9dG`P)3)s8-yG|VdR#f7};+*e`NwiitqejK;O?p zKRYuzLSlEt50 znf(<_q)WV622!;>LZ56D>5wv?IvsfxnWdt1U zsFTn;?wP((g;+rH>_)PVFOVECB`#5{OwT93^zcRf7?LGcqrT-vU2Ipn$REg#1i6=g zlbQadg8nZ9yT4~_|1+=yeCDSJj znZ1RJB@r_l2g|=CcDh;)cpPwk+XhU4-ik|5D3HY%y*vjY_$Hb*wI1J^sUwUkRE$vQ(X-Rl0ao&loya!8@@GXsk%Y zv7GS+&!D{Jz7CkF$iQBO_dKHjO&NS}J?K+%we(1!d*1ZyN%Ln#0d?dE2}GOB{xJYF z;3)h?;p5Zvs9RDCYg|R^2v(*8ZO@4E%&$&!fc(n zA}2{Son)L<$-MsH9MRhy+%sF`o(-^>IaLszpkwaiKhD_E&s<}%&X#GEg&BY^oeroYz+ovh za{C@k`A&9i~ItCDdMc82qBR8+2Q-~kB%J+~Q zB|kI{c_s>cV1DAddkL$B%+c)fJ21Tf6*h5>WgO>P&8$}QJ{pPE?igv4S(l@ z%J}i6ivxEh-8E2T^8K~S&KESe#E14baY*yFaHqFLK*1_8H z5Q=71DPqQYblh=JFy7;h$aPWT6IC6mh-}H8UW!d`CED67GR9Lq_(u6;jH-h&_v&Yt zKbUePhRSDc(w0O4!Eq`phbC+04p9jbs-ld+Bjm$GR{5ra_Y!kYL#EdC@%g;J3npT) z)h4W)vn+8**2Do}9ZBY18AXt@FuY)ONj|;g(#%{AZo*8~UL~AOe_rmNvc4+W`u7>H zTBBc@+Y6LqLVg3y?S59|e!kef`X&x^%pu^cq=~Ui9Ll~xs0vWr=ef{(X4vmK+zAlo zndI`=%Xqx1l^Psfd7fSl+*=fUhAwm%=Wu+f2Fh54Qk#v z5UbIayc2&)e3d}3@$y_|IbTLT6Z5h>RyJ*MRrk-B-Fg_YILy z^O@C)Cib8OLgV`eHV=^pS4l|rO6j!Kj&4XlCXhz8GNdh#9rrmpW^g#*dCS`kd4e=} zbhK2rM7jY~kOY@Nr?59;znu&W@8?qBdu)7%_9q()Q-W@GTfCRO;fGp8Cl9>}2CA6x z_lE<)38P1%gduM;wLWP|3gbmk=qZ88&C@GeS3eU{ZJlU1jE%QmzMF9E{ymRvDoFM~ zG{7=uxiDrndd-XU0$}<$KctJn#bZBSGYPb+ATT%3jzFgm4p5)g@>3~aL3HS0nMOxQjKcaFFK{GD}$$E>jit#Asd&T^qpqd z$@UByO_)8Gw^aOp?78r9f@IAegC+<7a_=}hm*6$?dT>6PkVqXf&TKy|hg!m;&aCEP z@VD)cj}jAoe#ZJ}UlI)cxVl+rU1mMY5YzD=Xe7f}Od3@ljMZt0oCjDHscU|}~M z%IR`GMVosVuGa=7u#BPB^K*29CxXD@Yalmg!8bNlglCE)(mC(rz|U5evY;JJz$g@qwPON96V;iCoNz5B*irZ<@moeo~|c^1Fdif*vt(VJIrC z3I%P@*Q#qH8ZAbo5_}Kf8X|d9`(~_~mOwg-vQ~bOn1a!Zg`eooGE)!jfUkQSXtQ{> zD|bIixON}z)>U)>rf7_W20ppl{M+m#g~0Q?K0h%IJZm1MS;RVGl!8E+4acYF{4~Tw z{{SC>EzkVBgYiF&@BbmTaQ=g)`0rv1;4he5#KGR>OD15m0sn5W z{U5gqbh!R9FaDEU`Rnl?2Yw+UuK%4K!TjZmb9{9wFf%gIe~~CeEX-d#$`|{>%*6Qh z3}F2awBrB4toZA#{NE?-tX%(n(jL3fjQ(|Q&lfOE{_@5Hfwmsn1-GMcjz!{1i>#DZ zz!OpdpC1WmQuyJyWY(-K9d7KyrtYnscsaN;a*J1pohF~#9oGY#b04=4J5QkspDfLH z)2BI7zo55ZFNOsg^j$s+$q)r96*me0czL|PU#G_QKV9+vVb5%A0loX>k_OtZu=IHWnd)UaDJ?f|an_4!@Cqvg20Qy~)#y0Aj&W5M6Ztp!mTPOVjGgA#xt%Y#r;(#*B%vGxEv}lPj4_>k65-$VfyZ zJvR3s#TG6L{2}v{#i)FmbdZJ4kBOw61fY9<_*8jYV1(3wG($pE3No!9tDQqeYh;A^ z06Z@-_D^DWQ?T1uY+M)oumVJ@z2&%zR+t`ep`f3SoHseMUD0sdoW19MPq6yvCGN`} zZjXu6Zwj>3EM5@xLgpx(){r~tjBc@nOK~Z6rr5H!VIvZPKfu1Q@ftCHI+yVMW{YuF zszhj`tS9LS!5E@Vk}`0M$qW~n_~(#0z~)~wcK5FtdjUU7{Gur<3Y8?{OBN0^f9Xe@ z+158}MHnF_Z~1G*0Gw0yMFpr?3ZYC8J8qfj$9jcty*9c9cE=cOu-{Ug@yIj@uhya_RQ8wET$Bx_8;9@3*tr&HXs%@mpQM|!o_l@JI#{f+#W*RjO+(Bm$p=Eh)&oJu~5Eq~ot{KDIiw`^`xIrDPadUdw zPBUr;GqFI*IU;WmD0zdTjH6F7|~G3Q$q_ zH1*NMf!!Cg8sx$+YnmR=h-^IwON=p$^M||%Y>PXAwJa-B?NSO@nKt0$W57y2Q&UBe zb9;u4dD$~@a)@-BURQ*ZziMAg2h_nhHu`2O|Gn86W#5DITavZQijkPpH*qx5LvsqU zvyE8^fn~te0}|3j6FKIhuqi8Qe}>;J3pHMU8<=R0glmNH~R@#=AgOreovcBJkE0 zYp7dSoElf~@-ut@v|Hb1V((O7cF_g8lKAW&$#>StILPQyH?}|KSe@7qp`79fQt#;b z+HZ3RR4xqDwh#LVjuJOteb_C9$4O^_RYif(e7H6X9AwvmgvEN4^&Bi|r>$vr$UFfY zwdRa#TM8wizlOQV$b{iK-`1%1W{Uefw+b%|%rE3+FDhRF(h?tgJ3WY%E#tw4nfSrb z0*y_5{b{b`3*N!+H#3(lNG+#rxSZk3*gRrqMW-8+2soX|yVyKnU~M}M8-`GE#e!N< z3Gh^{7;Cx13Q;VFJ-&wI%~&9I6E{p4RKxyycwZj35klXQ@9qYVud%L5(aY4Lfg}cK zpm1@njZG`SO7;g!b>`F0k*;7t6I-1iqg8W^a*9~vLK?Iydxg@f5b{~(@9%^BFagLZ zxBzv4vz3iK$w|F}W<#EfBqdhKW9#Jt%=vd5T!4njcCR|xkdAY(>+Uwo>k?=8IJft` zc2k7D(Qp-nd^n!fH+!LVZ3Ffxs#3e8?jN=^_GVxJCeb(xA=?^-#_!WO-XYI7xet;y z?gB$x94~LMmbqD|I2oLnK;_-pF0DCIYcYseDO@$on{G3$@urJ853plO50U@56j40c{nM#)n)Fq#|PC zBa2l4G)grwKI6mHLiFM2bp4=xynyQcSQ|+F2eR?_V{XtIw1Q*1ODSRusZ9`0_7N2- z4vfhwL)KXGNwS=VN3dJ*;gSl-1(oe5rUBvSTGfj<&cx|{2w?~`{$4fI>T@^TT~>bq zQI5t-z2ku8DPGa1lpEPZ_ZdU@?4)S2J7Pb;^!3Tb2Ss-*H#sFdLDCP{wUJy0|HMguIY+8H)`Q11Z% z-{%vH?I(?%l|KZ#v_{E8ynx(*iIBVo@!4m~h93ZMRetMMh8@gRh+gC0r|nFt1Sh*1 z-V#yf?eAQ=y;6rjVyBaW*s#tiVTK{R#SZqZSYl=+a2PeG3Y=GMFcQT$<5DN;{XN2J zYHIbVo%IaK7H$RlIg#9Dw(2u433$|iw#NmOvt~)xvLf9u*YV;sBZ_(ho&!xNi)XcZ zv;++5>IKP-cDjK`zj4@VGL6J&OwkQ)kU`i(r0hY=|$8SNiKHPr5$y*Q?88D{91 zF5_ye+2!fIMX4<3MXI%$sBzkZuhyIiHk{VzXJ^MPk^3n}yrKDA@RTMZDCVUAnu*Oj z)(5SKl?4%YT%->4}NHlAH>@KJYzP9$RZU_EnG(@hM zNj=>Vk8{U3G0enD!jNu*jE{qver#Ir(4EG<_JazKf&6pnSz|m#@hl^5f%0bz_0Fys z>!m#gf4j<6oz{E(imm_|htUXtPKN$C z)D$aT87EW~VrwR1VZU-bqUth_aR~-!8EQ~kt&;@eNhxA%acBNEqhdG!Jb*u?S*8Sy zaQ6B=DS9v2WJ_?GD(cBfT#;+=?gL3EWR>XHwqFK1qp+$Gi${kga4`IPn0;*#^OXrs zrIe`XK|)?Y(DBWayeZrLC1ZRpdl+x#wKB<3Q8wdUP+_v$h@!%q9hg4a*n}oP#gO&e30vBh4)DV z5PTM>`qX(0{%9~&Ez)L`OxGaO*suy|V1F7GH|R}FxnQ}yg$P_r8~i}P9@7=Cwn5ZOql@67gp=j^q>g7k9x#UZl zL}r&W5lfMxR|m2Q!aRIndLfm(YWeEWay&(l_D|nTW*zPn2=7d6)7=nYr4@aUd3dzP zk3pi;Rn0nQ+Hl^|R?{;N=~fw0xG1s})Sa%?oK+>Dq?UC=gG8K*rA9Jwp24q49LpB$ zTwAqpV}4Aas?$Ee;=oRCpYJH$?E<_G4B3Fd&%J^=!QiT^9=*%RC8`?E&dbWi8 zrcUo{1(Iw*K57-ex=A9_%)dVl%5FOnGRRM)`sbUR{xNBzHZD)~DM5szVHp>t8*|be zK}w*T=-V|Q6<&we?9F4wN96Ih$|l1m9aFC2esTJGKq=WOC%E!rr>lP)QV*pe^BAG; zGQM`s6ojgGk@q~avBdIkVa|3ZdK^b0G%8>k+syFghf^J9RMI=&lPqc)_Nwe3Rn;f= zt;ZAEq1X}l1G84Q>r%FOtk6fXRt_1Vc3BTFQv)`D0?fd=0bBQa=$7;g>MYkuG}?3% z@hbzn=GSYd^&Fse{yh2!&0dqE4K5hWk<#fl)@`~dA*fF3HY6QB%Wh7nd^%5tK?m_J z>@Hnv79&v>{uTd#W@&HhcD6B(@h7f0%OHCMycp9ad|XIIIJrUdIQz4*I6DHy6=#26 zw?9SzZ%>H^-^h=JeyRJl2j$p21}3w0Y`9o&=t5XhFPWL3o*a{OQ|b^(4x%eUqA-d5Vfk-QTC zPo+QHJ=}peisBMG7vGY+r|fsXH9fsbFCoR&VUd8y4HfFV)0eJxzTtng-W6Z|nxa3{ z-3PA%PP4~{cy$WP5T|2H&wpZynHu!NJ)}G?a5g8k*WX9&NVzyUPZbSI+qLUO6?Uobr=z+EQ_^8a3whm>t%N%%tl%#TNG9^;uh)iCSyD zu(l&C z3z+zcHGP!yApQG6PK`V#qM_GU;Xa;+6<2(F=j^-UXOHL*HVXn~ddxMr2OB7yK&G<( z4lbyt52l+3 zd|ZX-Ng7|G^9w{IyLyl=R`{({4kmbXSq}%yMWEVmUS+s}E}ZhS%C^prTS?KG8#pMY zEgmb!w)|*b?-$6G7LDV5ngDIBe>?b;e>^9l}abV)!JL#J$ zM-b$l-#CJofz=`)5$2-L((^KO+K8Oon)=$TKN5dgv!Oy^hBX>Q-kGy)tv$4bd;lQ^ znscQ5Kog*={=phJHNaYl>yVCcMST_2k+ThD9irV`l@-ddsdJLGSidtoab94$dmolgtVljC6)U=NplKe0|IW!p1S zaDu~0+Bs#|#j?+*Y5$A2@GKMa!UCe*1r-7c;d$i()3aG-XN1eV%m1Fb(`!e_RoJC+tp0{mVbuby3O6~KQZ{@ z@q9foK-kThB=B+jq*f>*1@Wih^M2xK!QeB@06doP+TmltK%wW|`zMC_k}VdAR~6gd zlz+mzK{}3OxteZ718TE1;Ju{BOp^9>Vw>P|R0F{MaVvmmUt2yYmv#8CPn@hsVG*f}2z2DY^A@*0C&(aXBU2=^ASiQ9Uk4{hKF={0v>h`K3_%ak&W3 zI54JTy`<(X=;F#)d>>aa=TC+|-~bGh(JZXD-@R7RoB&4Z%}0sW57DWOPp}k96L@=H zZ+5X+YHB4l z2L349z;RIoO0$P&Sg1^MA4g^7IUXk_E%bc8-9IgPY==bMp4`V2n|0pdLP`d~?0eJP zRl6!QFag**L$N&JMDPg@y0A0f++L43p8?*_69!6;4#($z2#U}j>#dFiGzOZcAF9S@ zZJigNw|P|!s~U}vd_y5>%RQP6pkhz~FyG*C^#pN>7HmlrFgl`X>AcRX z(ATDDQ*?3z^`%W?13(vsB1KWf=Et`DOVPMz5`cl<{qnIdee2Uea&Fx2>Q<^CNG;O^ znI+hFNL}0BIzuk)?6OOC8n=7KZvfxX^3?gOQbl-PD#~DJ34Ft(`QmW|M_ZLJCyBT14kU{g@XOWo zf~-8>o*aEC2!*qzE4QyO!6%hB6f zy&3CxYE%9Mn)TX$?jg0u)3NmIx7=2~Fr7$Hdd;Ea#Fi==Deuul2TAEo{U;8dCLcWPtfM zrMWg!;S|Gl1*WbWY1!?T6N*nqy-a86JP2>kbM9R=7@8=LZ~=Ajk6@!hvWC}j=Yr0a z;>Rpy1+lTNqa2=+go9JcJx#uh>>$)o`z`wlyVL$v_6yjG&EPTQ?Z%}N3RIkGZIJLSAiJ8?ZnMk zP6Xcq^}_2wu9l>%WWQfU)2!5(Hr5)cpCdK{iwuWYW~YUgF6z_X6pZWj!_+CzpzMvx62eEo7gbrFY;l| zRPqh6npVs!kML18pR1mP#sd!2Gtnt>ms|*z(g1fsXPcE{%?F(g^pS_l!znu-<14l~ zlOh}TN{+G<&N86=X|}1G@N3MaxR$)^BCP~?c$gOhQFmcb?uQi4a=ZFOCGAea+5*yP zB?=ODN{MuvC{rIUWWNd-)S^^}99PD8?1Qi3k5rl4 zSsYd5h&gQM+%bi5$Es)<9qrSW~8{2=#BU-2^``Y)D9nuJ9E)okps-N`%s-- z%A2yLhzjwi7IXba%Yf%>eBsaZl$R@>wPx7KmJ2lH+PkD;Z=8Xr5<3hz%+#A$r;XUw zgg@tD-B%;+X0CoQmb&VX`UVS;4jDZ@O|$9@aXN+iO6M3=+dFp(H%~w;TU;M)_HMzSM?);P2r$*}6aWJFhMn9&y*X-oqAwgq zMA*BYFdJT2noW!%&`g`v6CHHc4c_Xl6RpQxM^kjLMOK!(5)8QspwF-t>q(4W51ZYr za5jk*pZIkjQK~7B2|BKw@}AOjWm0Vfa?)CjKS(oMb^dfb^vu29=}g&HU&aXx+PO~v zTHbr$Cu*+ZvjLz2c0YTY;Ck9yu3D#5Thhv?!f}7Ss_GQE70G|}CkzG9MWwpUXEg+u z_wu#s^mmYV&Y{dJ&|er#z}H1QhDKM<9zJB0_oQk@Z@XuX?X7Z+u}CjoxhN-U10Lc-;ZH*T145m&p2-#Oj7qCqxQUbDQ)HzP&+O8TV;G8 zTL^r3z>9_+_)*$4@fxjsfh%fOEJXNJtV}N|S9rVeVLt!*%tv ze(DrPr9^vZP^ft>zwswlOI}+l9=-E6^AQ}-xWFU>Ot|s8fN;c}Ue@Cb7&X>t)SUM% zRXfnD*T1T>g`Y!>Mc|+>iP9Y*%d(GDK`>NVP>)6Rh)P{J}D zO*)#mrT)rRB?b{&04{whg5QA8;(F}l41Dhv`_ivp`doh3#8s^phLsh0f%?Z;v8qbGuLr>mcvbDH=178Y1PgZYJ={M-=!h^3w}iJx?}_UT*TWw@g1!khghZH7 z4cNH;9+aZW3@G?05-LOVLmq^=S-7rxOiAK+jbx4uaj~uK#;W15qB*W6*$TWo+amoc1@7={z_db9=wK1oCrwatiZpeBmM_iGn4xp5KzgT*50`)J3@}w=h@^d&N zX5_m{Q#S7L6J22Uhdi>2JZ;bR(Cy36_rfV2oh0{}YJjfI9SZ|MUnTPok*?2lKJYeN zb$m)Y1F%ey+Cj2ZZC8~Lju&JwQPk-D#8~%|#G>Rq1g(pR5&iI599{?H3M&3B@Bzr@ zxH%jrM{2ECyvGC9I|QkSuJ#CC|7h~2Ww)}`Btt)uANdHw8rY4~1Aov(xh4u$R~C>P zlng$FqcIdYX&Ek{HusV&;jsggN*k`BRb`v|y+hJRko2)|hj@iq_Qv`gD{3!ar4-xzyXbfq zN9!J4NtOV(iUc4MAJcaPDc0c&4QlF}wpGaZhpf~b0<0+_nuoY<9$SciIg}f_wshy@R0Dk!L5p z0R;!yL^Q2FY`S#XYb-h$Vg=PAJ zoXvh1^MS5yby3B@=LWqQ&- ziYT99qo5NL*%M$DLB%MtQz!~>MYxIe<72&6<4U2}Lw~P7%B5HSf+6T#_Ybvfxn?VU zaL^@aT7bBmxo1qYUzo=!_mcwG^=Kf;fj!!KU!jNTM?@k^$eW~MA^=`OrBsdR3@0ei zB4Kk2&>b=k3BJ$DR~@2pofij`SSPKsob;)SQX?sRGYwHd@jM0U$6l%JJqO*P5;8_9 z!o7Z>oeBON%jZ`j@x}HCFxXEZB%3S-`kO=pY0TFV9N-YXaCvI>|Bx0v|{M%j|4N%4{I*cXF+BKs`rLg`oq() z4brtF&4dMok#(O3q>lL%X-+Y^@-K{%UFz=`rLPR%KQKz1_{mNPROI+7k(P(ALooNccSI@}`{z{x;SCb1Mnt+m_VRJ|0A6FDi z6j;!1`CQqmI-Oo=*XF|ERJq!y$QV6ov=npdt+R@}bgV=O-H7|$W5b+2aJw$xGMu+-m$}AhLYq=_Zo}^S9+c#s}9c)tJhUh@ugTk{m ziicQ&OXen~V)U|PikFwqUS7B~vYT*+-x$EIDKFSp1tLhvLl2|V2eh8J{4u4U3lc`s zP#J8mfRfU@M->VVuT$DM{}O^SX+}^c4oB_DUQ6WRA1NH0?LZqf_<3-@=dz}rL8i%4 zU4X<#M~L*JbbeTFB~k~Pw!P|6QQG{||vOHCV!msuwe`MNhPm zj%n~3A4Hu3Eq>G_MN<230_A=lqZ*3#_NsTq5q{^&obI`Hg{QFEi3Y#_Aoz_La@-@t zG7i6R1M#fy@q;L1rMI-5BECmRY-26lR`0vHjoFrLHn;r-fD{j-pLBes-W)kfr}9s%$pD`GM1_RCbP>FKga}luJ}~Y&0`X&uy!P2^cj6 zCvzOeIlyhS6#Ws4UhyJ5er)bbprq)e3j5i5{VxKgi+sT6bwtkuPfcNXZzLGfoEBg{ z#7|CG5ZWQU<2euFgd{@H89uQA%4GyoXhx=lca|{VNijo4brwm(UjY~djww(N-3+=9 zLCv(;1ut08NqNfhUj#}}gu3DX6e##4ReoJbGtu$aS0;cMi2@^nij3Jw2+F z3z@aUCer~R{5wBh0#|VC;K_-;EtEJW2dc+gY7ZEFGDFqcP)dEzOR6KsL8&&lhBppN z(gsI#1#89#h0p4bTmVj8lpLuKS$~!eXiwl^RDc2n<5Ke}S^Q3gaf65&Z3Zm^m0Ki< z1M;(X)hfntNRzHh*|<&6fXv4IdMtXQ5v~1P;^`2O*%>e&M4qy5CDZDtI+@e&>cTn{ z1|LB2t8*wzO{zdNPhiAZh83&*&0FbYI(TMy9a|uG;xhY#byt*Lg$(p zqCHwlESqd>^w-QU`qbO4{f3r|uoLQ12mx@!)RzBUr9@&Rhoi2BTsONff<1(dB!8Vsab@fHt+ZT>PTaRC2?QmP2Y z+XwiYl@l+U8SDNRN@)@or;8&1!BYZ0E=s-N&ZOP{ma?Dp%FZOZyfHB#XOo0SI0lji zq7p?+LW^D!%y$qWMdmZ+l;SFq#=`cKwog#BuQdx4ge%PhYyyPinuHn?u0QRn)LhOk z9AlClKwl+nL0n5~k_6iop_s}BBD_IuwLRKoK@Wl1Kh(9?&ZdHfhth6O*Cz%V9x*tS zNAASHX8E~8DmfhR%FalLNIQn2Y5Rpk5|_M`Khy`)U_^{x=P6!N?hO+oTd`}~nZ{_l z?3eX2{@^8rc7xkt+LzNObCfI&1E(Jgfb;~X=b+<)f&xF0KeFvP$2r|*y2i%Vcn295 zuB5w{+HaK&-#cj4)v{u%KT_61V?Rsv_6H^gC``FoY$+|?0}{#vfgJI4nxSHFuTjNN zoQrC`^R0H*tfUHN7tk~kN}QY;Zy;pV?J({T_u^6e>6A8B(Jp@%6Cz(5{0*Np`wO2e zam#z~gv5ezLJW6cG(%P(2Pjp* zdUnqB4bVjzZ>NYA#(Yow*1iRV!?fdfwc9zhb>q@|!S9Wr%)5Sv$(IkuhVI&cj#$4s z_#lSuwBaK22jIK`+G^8MgT1?QF`dmZwOrl&huJ=|dee?`j|$sy3xFa09%I$E?|!3rJp1HLSS)L!UM%JhE{wZBvWBO|FSx(MM7uz9|S-sNV#KE@Tb~uFPKPcW|8fK>&o*0ZrwE z7F@};EW3MZb?Qxl;w=N6A7Mt+O&2a_+tP~$;TAceNf{TvVVW!PM=nn4N2H2f%az5J zzywHg%dPd)a4O`|U3}>j=Hy4XF4*@TKzv@MxB8q+Do8{Q=$6n3n|0rKTCu0SUVn$` za=vzjbH$tkXy`YLyOcfNM**&C`SW|N>WV|JtrG=fuagmv+E?v4-hR2N4!5=ZOD~cv zVK7vPIx2dB4huipf2cWmrkO1|5fFB!uT`$8MbU`2j&X76>xh-cm_*0w`-eXmZBd>i zR>}MNFlHaF$SJ$4#7G#X(tYG~k6S$OxAl!lpbgty`0Juw4@Hdx3W80Bkkw6{*44MB9jsY+9?7dvQE)a0T$ zVTe1h?N2(=MJ<*znrDHnDb$2;hklBhq_3@>ErQrKSI7r(Yh6|yg+%f$IW_^e6$a>r z>MrZw2s6Iv=I)+}009s?Kuo5z@sd#Y6vy?#CYBISrM+0|7~uF4aa?Cl#Nsj%y7;Hk z`wip!<+7!;7z+zIf|K@~UV3_m$SseXWOd{UjVG}{(Aj5-{nVAG&>eDHr-n0!Dvlh& zqJHX_mf4$0`zPC_LfwJsra2(uXbW$ms?$n;(=m7LCH9>tFjQb|#*}>_LGhM&*9VJi z=HfOz^N|m+8=#5*w$!I_6!~(B(Yng_*tAA}j>3GToUqr2^d4MpH*^`{HpRo^TWAlV zlXwvqKM@$EcN??aetjkv>S@98ZQFyWWJ4twAkZv8v1_`GvhB;f*Od#epd90l+vQ;9 z(Ocj{F4%bhPH}PVu4iZ)x~(9!Sywqr6b0x`cGp{X15^rZmXn#hZXn#cbbqWrYChPp zzdG$HkHGLsG1o;WoUMZG!qOV+trEG=nfR)PTEEH0Fkl-@%Q;URqi&o>I`ekl74vA^ zBB$sr{lp=*&~+P7y?BT|({@Oc_83g5-rG6b(KBzq)EFS5YlTLgb=5ER?0K9c-g*yQ zNE*lA0fa8syGNk<)9 z9jjxTouqHSGjrz7d*+=wU+z6$_OAV9qw1;J^WT)efX@7#=q zHN;{0d9&-T&D&#E?(#W2cG9&`*EN2Y+>JXzxZPB#c;YqY6O+}RLgBk$a~Jn}0;ztC z{x1jeLQp~4oK4m(#0$2;;& zam%)4@8~|=5s5V)!!qpF2y4RXHx?F^6Uu|Bb=Z?yK1F1@cP$nNkLvGPp|p%LplKO3 z#H9%x)YL?;;`9mOz>+4xTU@nIPsuvRGMTUFonIgOsAH!m*HZrLOa=0j+oxCUM+MjG zMmvMqN1(;Q3zg|8+53v|wz~$} zUP&P|wcCK4H6m0e>+NfAtYS9Q`5V1-_KjLw%HTuqD}`|uAddxg+;DQxz^y(1$$q)o z-`ztSwDSu0Y3S{j!_u zS68}v(AO{k|8J#Z*l5TJ_Efh9I?)FU+hpI!HVAqyJ^Na?`?^~oGMCMVG7jS>biUp_ zn-BeN+CxhJdv?9roo%qgw)InEp1Jd37NpYk>iQIierQ8qyX`n@Lrh`nSL*8|wz=-4 znv|_!t6d-oF!4UN=R9EbJW2zHC6G0K;E)IM)&#&E~zf z9MS>fyawGaf(P1#2Y5d!PCb1HK66de&01~3PIN7XSG4B|#cEWGzP#rpU+;PZ!RyW5 zM~aR&?q%O-p@fPUZ>%Z@hgQvqlD5|uJU`X)_Yn#t=<7~h&<&XI*?`XN1ANUht2r(8 z+{SpQG`;##LZmMnayyr5?QDk74$41etD1qF`X8Kp)o#K?ZEo(Fe39_=nbbWA_3;q{ z4x3>#jTuig`Eg^*or{o1Bi=7F{P^uS>V-cuZb2J%Ad9L{Fq(C;d7<&s2bpZAM1{lq zQ%GX;{-lbV$S6I7OXQ7smA+;s`Su+S>K_3wCij$FXt{@5pd47ucqwMFX0DGTgd_kl zj+c%d3yC9L<#r$~q4_MPt4IF@K8yVYKgBoA_FIq_Hd9Zc<5&$oue(2>l#1V?|CO=h z9|+I?Fn0VGKgPebWBhyl@_&Y+{?SeSpQerfTkrs${}=TNF#Rujz<-Aaa4>WKGdzG` z+<~I~wyxewh?#(K8j%?xmOTrk6Ooh{dWeco0c8rJf$8%Dy<6HNsm7t{5mP{Z9bDVT zPcM2{N89Z789Kn^<~rn$c@Fo--R0j164MP^`aO`M4xVyF{z9CZ-DeTPJupk%`Nw?N z>uuiK@F!_QZu6 z6bzu0Rgn?xRRf)|iXU3@f=ydQvZ+Q69kLP4%xF_pPAZ7q%zniBU^yqZij8ZjN*N(N zO#yadYQ>nl3YLQ({sZDSJ~PQY^VA5OBj=gHLMoesa>E3)FoWu{tZ5AB9btUa!d}y(vFy)G1h*5 zzha0P6Y(n(XVj>q2@aUlEEBQ#cl0JP7rushH`o+N;~eDTP%{7W&!H+0@fPFl@J1|ZFR_N!O`J?CD9uPeX(Xj zSRE!vyIr$AW(H^!Q>s1KO+{&nTMD5eWN7Tz{0yQY@T=A&=qdQE*U|KQMFZAZA=S($ ze$I4P9>Bsw^qd?`8WnX4aUaUs0u(^)Gd7r3G{5myS|2<^v^XHuCfdyNvJU8H^~N?* zN}7tGQUpt(G~5*yg=0pna`kO^L`A_KJIHtqpA=~_ANWxd!Hq}$O_=_hi|Palhm-EO zTcXXkzq-b+Snbas?L(Auf%2e+mS{Vsr1>F>c;^t6G>#NcnV$%6>xf7+dNV+`C&V6-|q-vKV5$&>mj&^mF5r0 zh1r9Mw;P7Lq}@WnlhVDiDD&{8EmebnmGUQJ#Z7n@s;CPGHuRKynUk$*L4&A)!xh4v zTCZ>^11mU=%Q7wSBTLT`arXs0b`LLl1?v&g!N~E9j+>I7UPGmrg@&VXF$BX0Fv11m z!HrV!i=c*IIWq>n(?S*9G=h(k3zG5@Br~#}Q7wz=<#e?+v1eWwErTf&>omM2*?Tmb z^VL5F^khzqhp>{hH;UAe$C1Ka4g}Aopl!`En7L-PNVAqOV=X~wUBLjOrm3eYs7Lh@ zT4z-DxcNW87X8FMq?K8urOfilc|-EyQpt7o2-I2F5Zw~dDs`Qb|Hi?{?C)(R3##)-dl%E&I|pFTuN#MLIW?1Z#1#b~sOaRx9Oz|FGN1t+GR zf=@>=O7=K@k)GcDNwg0PYH+G-lPz;2l8KqOBw@xI{+!5Ye038HYaKC19mw=&BOB5s zSq-$c1eeqh!4Tdvdp+X?pM7HCo;M&`Uqw+$eJ7O@KZLrmIe2p<(Z`%u{`#JL{oR?(sgEq23q>&2 zVNUMVDx8l;i^>u31eKrhNC(}@tG-1SaHY^dZ*vh3RWI%(LA}+xyzIY-k{XTtE8kiu ztD<6otNT_}L8?XD-A7@INW?Ei-kTTDwFprb^Ge3bK1#O5`9)+JP-qxTB)fMBK!thd zF&l>MHZ2#t!Ow%T8BM=qS0c@8MmwDP5XKvE#inC#s+aUWAunNIJT@XbqP}* zl(2fG@>2A-kt~Bga_H!9;?0`+naSTJ`Wgp(AJfgpzmu?sR+W<4P0m;CN`5@%&U~;QyWDRuL72M(95ZPX4Pr%W|d08qAEFs_0Qab%1af> zPtA$I%2owIv-YidPe9sA>1KHj5O@g$*z9;62lDyXrt`yuJYVOpUl>QJ;dNrqLP~~J z{Ph$hYbN>(2!R=gP{uZj4*mpe+@aY67peum!G&*|tiOLRyZC~dtJ^h;q?>FIrTymqbA%gp zL&ZtZIr$eLV3JM#Re53W+vaw}a{#c`D;}x&H{08dm+GzB*(;x!ey|{Fa{QN0e&I$r zU1$oS9BYe@7w_BsjckpuUHgzUT%F&8F_I5mi=~9@V@Bhc>Q3}qolSwDG{#`Ddi*R` zS*~|kbw8rkn<>U`>iAXV;*>DZ7YvM|598ghVfeHMgS4UDYj^n*f(}*4$q)eYqjN>V zZw;b-w9%TP3NZYTvlghO7Dt-1ID#pXGh}7J-;pHMm*a*T$X6R!ETbiseo%sppzUx} zck)6jFxcFa#Gg2v2>4Nr0WXphp~JH@;a{ERd2H--q!BzGfyv#{kE7GSlmDC_w!Hun z!}sgYlh7|`Rl2zcAL{V0EIoh3SqN?4^n z)#@*|C+~>so7amx*MwYBj9mW*4_h)g8PzjBwCYphT?(XvvKbvTj~F1DC8=PoZi{2p zGgc5)KL25>;4s?EGb$(AVn^mB!1`F-jB4+oK!8oER+G&<(uqGAxn^dw96F{xchrqa z8%lvSOuT3ERErK?T*kLbSDGWQa=ucq5(1Zg``*nf$15abkDW;ET=#GyQMHY8SHkup ziLN+jmTx?*k*rV!r~(>4&9Ka-FMpqL_YLY&&YjHCN|?se_i(#2r1r8?HV4}uzUCb~ zDs*Zk%yi_8T6SRQ_|V^Pr41hToo{?eJSO^&;l~mK2B+%Fug24!Jc#HqylGCzqAb--krf#XN!;){WpB$*>R;Px zct%+JOWP1uOSlyKGbrq0y{f^ZUUlb?f0mJ&CJ>T`E-=@$s9^UsLOA;UD2EamVAAy1 zq%#t?d6}_hP$)}wkU0+}F+T}=8+#phh#r;1s7r)e?J)r@hcq;Lq|G$(3SnW04!)p~ zvxfwBqjWiND1QXB#=Z6wwa;9JLq`;d5mAZ^@PGVq>__P7To6CYCAV-LUCs+YcQT=- zJkO6D&e1RhZMc9<46!Mn@u(#s;n24pn(U%RU+zb!Rc^EZ{|MN=gIzUQYGr>)*HBxV zt1^x`Hb9vzgPd60%sd;jpO5~d1k8;@yPXV{)TT?Nhv8!)S}&NL-ADgT`fzKlR~n_$ zQ#@>B0a@lnkJTAB7LWGg*K?_%C|FRGd7OhxA0DNM7_mF-Fs`(fXz!8e_W1AAs1oBO zLOyq^N%zV1lcXr=g+0juYUMP1njBa+WXU{`*JLQaP2%KQsY`00owy_`H!ArmLn9~Ti5Cw||(xxe{ zx{Z2}z<>jKh{(Qv0bafqy&fq#){mJ`^XE9Bo`^fg?aY+Tk47{R0i5_|b$&FhLQCON zh0@C83ID9TI6R7h>6csYCPkk@AF3rSiykfo4k96OGBn*FwL4_qGO1&PwYlu*mw{IhGd+8ZIQ2#Aph-B*+wJmp{ zUE^67iPm{|*A+(686PO_kQix(Clee(Q#6Hp_qs*XaW$W|t!Q*rshU^V{*D(w5Wjs{ zzgOm@dS0~uNYMT4^7ylnUSDSlFlXK(Do&x7OsHYvSdZ(8pJM11*xLh<33+lj3*UPB z#&GF|Dn=zW7!4&tWo)kn!B;+SkFh!6?$ATGRn&rq3vwMj=RqFHr*>FKTRE)&gz=U^ z+^vbnAkMyA#A2@{hq(!)h^ti!Nbezq`A{$A!nMZKAi4WgEZ#3!8#eU8OnV0^Q)>uI-NdK{#o)_6<25J#opdV?vK@kRx>a%9*q zRTP&3{`2AL>V28h_gkEqTv!L>&p-FF1pjbJtQ=!ZRt}YnR9x^o~0+ok0fn|_nVIH zb~_fo+CL`d^%u>rxaM=^x^r>4sAjq1^KMYCcN-P~zaHyx89kEV~Th?@hoKkm-4c(j_<@qSj6I7IwpHKAnAZ zyLYK9BuoNF#f#NHg^%1gYJ=!CPgoxxOUiuj+!@!tcJnv2v%@}xv0{PRREbe~2j0zm z%`|LEGom8Xnz6fJzlQrtVk>}tj;L%&Q6WsB*p_K*5doQU=S9kc3E6B?OF*L%fm$}> zvK+FBG*lIQjH|?aBK10o63b|Db?HeaL`|b8S*=vUnyWuY9rM-kv-xpX>E5O!g88#k-k8f9~gYfI!?oB4I~*z2T&&B8E?&~r<|=^1Bx%S;aD zy~^?I!5R*qQ;5SvtzCLaPY#uK-nhnV8zmaE7eLnV!*XRrnOvIHdn4>GK~XDHW#wls^AW`2_wWul9dU`us0A ztA8k;fVm5k#DAAQS$R0P{)wBaFY8DqiS+$k^MT08v6n~~#ps|BYjwj2@q%QGW{q4c z7Ar&V?m7L@!c%pNB7s77m2k*3stP(ryy>M;W_bt6&*6V!PP7dH|TA@8Hb@564Jy)p;WgU{z_G-PHFkU@lA9--4IzQG$8=r z;L{a_jH?bUEKUq^-n4d@GUhyblc~yvG%Dd| z+l1cH6Fn}hYUiEVm>E}Vml%To#BwQ?ZEVU`VzSY!HX54ykRDEvb;v=KEE_HR&1@<0 z*Bl`%>)ik;RR0-pPfWy7rUP9_vv-qN`R7nVeKnH&_2bT|axeDk?ZrnGZS4*rO9CH@dCb zvhBATCA2NPakng*y$`uAiiNR6{O$-8Dmp)cwB|EK{$4sbGA9E4-yUn^YGosO z?yU#BlXusfsZ*{6xrRouW7b|v#%PW%u?6u1r=d6H^#kJX1ca$XJc~w8yQB{{0Iw7D zpeMqnFuC6_1d=VBl2R@Oh5FmdUf+OYtVXu5%eTy3UyH-gr2)f;#2<*jr|*mX;8jSI z(kcRSp_N&C0BK-yMbcf?1b@l*F!o)fi+6^}`ZPK+)6TT|A)?H^KB9m(9Jo(7|9AJu z$FKVxVSs`bI+_WFH69Z`q{Uu2a0kWe(&&JW$^GkRJ24+}{)c;pdKn*-EGkPN{FXq$ z9Ll2*may@Qt%;F1*yNik<1c-Ud`M;AW6MJh}LQ8l4(syiq(BoWlKFir>6Q*!~Xf$U20Vwy{=t zc|6`_ibS%$eG_Gwvi@^M$+TUUKme6OJGqCTH5G5l_u{$)%9-Q&iI*DLfR>zGPQzPl zY#Z?(AMvqOgP*?pS;KRAT@wB@9Cfna(wE}E{#Vq3M$e<3Zz}+H^mggt9WT)Yp$Dlg zr_1_=L{wT<+L;D9IC&4D@MQHJoM_0|3$_!D*2nyPL|DBla0u%CG{xrkA*&r#V-S{? zc%pt0a({J@L#Lu`*W1_UE$4v=%3NlLLw$3r$ZZ(WrdK!I5g>7X3lojuRUYB!QtUY5#W#`l8YA>M(p zoI8YwK=mS(p$_IHhD#+1dbQl}`i+3gL+ek|fTaj|@?hLxFJdu3HpK2&i(|UV8^FuW zX7_w5eH1U_vMd&_X`(4-ZwzhVqGFnIIJoL%;S35W&N@r{=1oS{f|` zX{%ez7YhMorOgon!twIAIU!~5y*3n94hrJ~l!^fj?vt>*1iBIrUHr6mH-sN(Vg}x< z^GkAv3F zs>R8n9Q(OkP4YfPKF}>J(^hw5XH|B_KKKNf)2={;r*g4Ylw9xv|GFCy?4O60k|;D0 zwghte3a8eBpWEsIkU4psp|wHvu)_MfhxG(yN%S7IA9R6_{69JnbsUXPg?e|}3kqI~ zkEj_2tGlc?9UaQ9`f162%4%R&Ce}XkB{ZkEeBqu8MZ70~zT&YN(sly5$Z0-1J2)-vY;s*NHF2g zgL(<$BpJvD=0^p=Z7xkHD}7eL6Yt@X;R%`{SxGL2GxZV$6~VL~&b0f3=`a+Mi+(~8 zG+UgSbJ>COUTwCoda62PNqO~@-<%%fIB&D$ zGQB9H=g%xCv0`D$=z9<4zA`CwE|dREBc>cT!Sd@gK|9Bso6P$`D@_ldyCsfhE41ts zQI2bJC)3!WiD3}2h`{0PzPEVQVzC4Gx!4MA-`x7*`?{RZkUj}?x`&L{{*6WZlZ#xv zd3}9m1*+$qgm#>CZU1=BHSm&~**0}p$FsV>Zfq4?T?oc^!(RpeSxee$ARCg+^_-1l zF6wpqSZkaoUFe>9E>g65i%0h?@gkE_er@AF*cb!BVMfo!Y6&M*RVP(VxH<(2z&ml9 zVcqPtwb!`6m$h!boNg8spE8iJuR6KglWK7GY>5pJ`K*Ne<==I>5{h?UBid}kgM2qH za&p?rM6ufEvZ}C;2+u&pw?!9m{vMCG>1W+Y zYvX%Vw##fEH7AEBSRHzu6+^bZLb;{mT%4VKnZjL2efig9UaZ`)SWYuh4CfsgedxHk zF28%L1C^|}di6`SE96cePD8eis#Ewd!P#j?!qdqEgq(zHqE+~;!eBIjCzs%;Yo-5!@9+1negdk zs4J(|K-t?^IK+C;7$*@nSimYD?2Y>5z_bIKzE2igTmE@k4oo=uC#rXi`jSFHwSA2GQ< zGQw@01N=X+?@}4YsbIVEn@-pjIudm`$z{(w(-=rJj}QYmG3b5+I+K@cRcQ-@k=hOL z0$d1fBv3Ny`Am7#bi8p4&sfSE<(m zddqCB+YEu80WOw$Lgu^k!UOSm`Xt8CRQlz=KD6Yv!Q)D^0bvPqV+2xA+ey$^UH3VB=nO2QHB zfYK}wA0hvOTZ9<0f$8-FeU09uQM*3dF*C_bYUJhAxdYv{o)n0A`w&q8`}9p0^ix}8 z$|ni{USNb|yK{nb!{Sqto12_pTQmMzO(iBDP*XEMUsi_pCx;C4Fdp&^0&FS&#?)^l z&rT2T9~O~s+CdD7_SimO?*FmrWeB2EBqYT8}eHj4mgDa-Q`Bt$s37`OgvHB_DxTvzD0IQ z&*sIeo9nYK9a8f6_91=inmQg=2&DQomd0cE&zE|zUU zXl4$O%B+D&apBaUav?v}kY*6O{!7Tv2s4D(5*XE{|I^%U>76Jpz?#%%#!jU|FYr*w zj^A|sbo$^9u zM-E~PoOa9Uu+#iHloVw0SJPWBWi%BXG5Hx-BLPrvLxL3eFF+sb!{bnzbAE?BLCsfZ za+BQIO+AgFQ`rJw6lXUw|sUh~b^^k2B#L?Fv%50(t<&qxxCk+&OP5a+c zmt4S@8tUW6ohM3Q|%VhV+Vxy@m&4tKy_`5x(Nf6Np ziz2C*9|D~q#~HMV%vpHJ)rEgdr%BTw{srik23qILwqw7UWH6JMV_d(jpuv{>=? z*xvdLv`F*IA_sj95zT^-AblAK)vN1cumND#D<;Av1D?+Dl@W!9OeEEc-jU!h|8?Ak z(c}0c^;+34w>w9Wew;&r#-3lxPx97&31US{6dgpB$O^&$qc7=&Hj44xMsOJ2D9WyA zfK?X@|C!H!sbwMe}QCv|kg&zVQK#iZ{Ub?s| zO5Az_kL4#3n}{IeN4)-iL&cqK<^@aMkF`v&=%7Ixg$|pQKUT=FUwcU$=Stov*zJqf z?x2N0>SvA!kvoz1I3GGfkjdz{U;|_ur#$O>2gFRIw71udm7?muIqbV4effyfvRFkl zKOOo~+jS^LIjZcIvNQZ!3Ih*1bk)-imcJ&1gAx5CnrG+q)*_|{da}!sexS2sA8h6B z{E%w&z3Kf5 zT-tgp`A%svftDx8t%~G=Rbl+QVV-M&p+adzvd`@~c4_)jH0xpW%m6w6?r6voqk-Bv zXD^$x$6y)0TTVag1_D5jlnUgRta2+!eK5*35fABt=b5zB-hski*|Fa6ll`@KHDo|i zeZ^osUauuwbd$uZV!7Fbn;dz!%j6HYNKWo0;QD*N=v0o~Ww)NK^uu4))>WaajbId+ zE$UN5M(Cqx^BPoYH&dC2IDbu)IL~|gMm&%9a0Jl9Cz^09Y*O;c8V?tyf;FWbCsG9FF4UQNO)* z`5DM1j{u(+44u4Hr;;<1%4MRb!oXWY3U{Rgfhx;Ij}J#^U5KU=&LaOCOqLJFsYh*M zC4+4NPSD_rpSUIsJXZdVMo~s*f|V3dU)=-qAYOd3vsvhz<~`KbF2$u_J9?DUQ6Ix$ zp(KtQyWMgEN@n(~)KagDXX}!efBorPi(rK9NTSn(;9h480BcwBJVquyTS_cSDHs!7 zHbo8ZP_uI3IBsSinjcTBOZg+Ofe}XxQ!kiYt*LPnBEbm42epgeC!FN*-LD%Y+9KLj z2_jAv(9T}zcQ(5Jnd^?|`2&+kz|$oyzBu4r;3I@u{zVS4aXYT;)Cd~aKptnnc zROT@h_?fl|!;s}z8e+*lbD@ph>wTxSQJ1OWzZ<^KF-YD0l2v*PwPUit zsCyn0S^iFVn}t(PL70a!cTRPZllUMv-NNINsB={nJgSh44Tb!YV-`>UDF(se5Rdic z!8)N}I(7vO{hFJ`Wi+ak+QI|8@C)DDtQ7w_U5qEZvQezhw%;23+y!IwB^w1Q<|Z!G zeaAIj{_3tR79}JT-h^{pmt?9x&UslAyKRf8a>vzfWyB1P=|mQDZ3{09 zFg1+eLzaVAGlwGM!>B_C78Q_Q(V9krnSQV3HP>n7w#s>Lx?=UC5|+`6at7ot z{+yr~jh_MG>WjWGym(#`R+xL6GRBIS)j=+A^0wu&(?F(28V_9=gvheNZu`6dezihy z;(9ksIv?+G$WcT0h*-)ciO~Y<{k#f}VK1#F*$2L;x4{~QPOcj1s>+Iq#dv_<;I9yI z{{8Fio%v&Zdk>tS<(3hyO}z1O@XS-<==;RIb(#uo+W4kL;;jmhcazOH@*h2wn$yUy zre3nY@#|AJN4IKG2_yJEA_YDGk>pIGFs>EP3wwQy?sTh;>zoC!B^F$R^D&y4uz zpNR)HKObzPC@j)zw>=D)J4QJbm-8{IFt^8Hq`Dg z3?067eh)+N*$1%C4aZ}^HG3@@|L8@*K)c@k=%^h_Jw~px`3C9QW0ro%SQZcoZPgNZ z2bR^`(yuE(l9)@zKuY2RT%Mkaf)dmW!D)UIwzWpw!|53=@IUr#@j5;>YmZ_Yv>G9L zMT6}7?YPHI%Km;c1*zkSJxnhZ4VkA7SCfY$No9c8vKjVGlT*HD+uW09!UcDhFt(%W zD37jyaS!GeTg|6=VARUZii{mo8cJLG@tWT*Bc9@SdaEftQ>G+$j9Re~!SdBw z3isl(6pzl06*7Vt@cs)vV*_Pya_toTTZR{Bcm=1B(z-?))!Ug%!dw&Y>s(ORpKNT$ zYOd7|(XTIn&CLA_Vnt$D8 zKQ0{VzumK+MS|+{`XE``nw`V< zoc8mSBB}-~n>Fuzr$c(;$rwW4iQ`GR)fD$MiA79L9EDnR?I6|XgG^jsVzzcv8PXVU z)ps*It@v1C{=2G{8q)f`m4n}*1(I=(tm#)<8f%#7(sy#dsWIOWc=Ace8ALs)AY5>z zk6-q5=slC>{zbmdvDj2YJM_cTL!-4IBnW)3cK@j_@A`I36kqqX!IJR>j6@)Lh%9}6 z@Ozglg%N4?Rj}76#&TvH3~fQD+PBjzn!m(U1$gsP!;QQ0X%xFMy~KQ<$?2YhZw$Kl zgM=c@(3uzG1cdQAzD{Cev)&tVaqtsiH-x1pLy^^rF+fDZJtH@)`D~gZr298Q)NK#x zmuNCg$qx+Wz?Bak<3pKCL-W70vdXtz>6vH|32BSyOl%h+ z7lqIe9Ys9qN4O^{U}+fre$98bhHl*MC#bV^Zpc31@B#ss@<4hjKibKCdAR}NDo?Ke zg)qRv{Eupye;c!b|5+ONPi5fWyJ7x$-}3(}WdLxow*PN+k^h3A$-?}PxA;FQ1MHlv z|9fO3{-Et~+py3z(4vDW(AcO93mnRYnYF#YoZG`_3Lm(T4G_APF8OiTDwd|UEU^efftAG z?&3iS+ybNJ&{BL`9d4r{H6EzmfXh0$v_|=b8<^bt-o?DueUOW)p3I zfR3OM98)H}fl_Kflkf$^5;T(xu9jp>UZ**4UTE-f!X9n9G%MYDGlqnod%1$L@=W=4 zPf$LPY}WNOUI18gK|eEi@9d6dVewwM$)gF$cDK!U zL!tWEg6*t~^t=>tk0ha5gN!@^zyDG{)w)4i#Ua#rGSpI|cvwXczWU|%05$l<_#IQo z1~1}vjhVesnm>Si45j?x0k&mKF^y4qkgZNXomCr!5@Jz;gh#21;x9sPQ+A=&>;Nn8 ztD=rG=J+4-2Xf@(3PrgRIS(!h6>@UJVm!+RC@L_C^0~!^p1+h zEfR=a4{4*U_G7W$EAMTLxfLGc`j!k+5>d(~^hCcOBK503NbQssa;UKaJP#k{Aac@I92AMPo;MVUWHSh0MlvkT-RKMfuu*?Fk`Z0v-RptFk62sfs)QS%V zl%DW(1GbX{aa+|!ec| zn*x?%0)bW#phDRD!NY0ODl!%D!>~U>l*49E)HyNrn#GUyNR|Y~HgqC!gJ@(c zgjs>ZqPDO|Q_EekM+YDS6>B~M-LNUCNRf-vqayENY?le`A!7A}4Sja-m&BUt5fc600f_J0^`tGMmMkIs5$bM8EWx#F@WEM1x&_Q+2VOHUfSCFjWh z@ElEM7v+9J&VVQzZ&?@5|?+ca~s+a%~Cg zyd-#p z(_~RB*}lRuo+w?to<*PGJRSC++IaIPUvJ4H+PfTE-hk;k3JqE_I6OH{2(azV$H-B| z`&o%-dMHJ8g6aykEx zjjzN&_;_O@cpgSi+(E6?(f$a|y9zR?9NITxb$(vH#SEa0-tJW9Bm(UJrb#nc2);FJ$kZNDV;d9^h&7A}J8Ti@KPSJ z!(dJ3cdyD{=>;}L74bXkmCc!qy~#sn&e0vkUqtte!Y8ET0`4EziU_aH&0+xD=nuOf z9&s~xI;%FPFZSTO+*zkdsCw8gWuU($^};8yMO-Lz?^U{VZ$x<3H7B4bP`W#bnQ3nE zc_GTlzxZXGR1N4xW1=vn<&Ehzj@9s%O-9^pXlrJOricls>I;_n+P_vv&+^NsYa}PA zP%sH%(Za{=zfjvo^NczUBaHx$3r-Z`*jEgRn=oHux0H+q!NM{6LY)oq?YZ`6Qmk-1 zGk4svpT&s{EH*RMF&0haB*VhhWshbSR9%ovaN9Mo%n`(Ra~PZTvs@Lgv+0qwYf5mb zy*0fD^MMjveYgGS{{0}EoZPKBv*TMOH_k2!++t0Afkkr9Mb2ZQYD=m+9FOL0?osOD z6N_=(N7v{f*R=`-uGm4ECUvAI_h=2+p@314qN{YGWl#d3Q0X4U)$`1PAOmFt9y;90 z5Z#CbioiWKw<5SrSqJ%tyId@!ZchjZj0rbVeyfO&{0|%|I3?TuiQeE@OehGXDZwLs zBOerbp3C6-kS|m4i0EuCS$oLBj4ZJ{KG?#f>VgUK`PTs-8<-E6wu=yjsp)*V`n&jo zDuk(DAp>p!3`n5_C0%&AR=;0lB?U(U?I=%huqDnT8*3f}km_C_?xE=XBy@pS!Y^Bi zI?rGw845e#m8#7Aa$shw!VgTrhwC{Yl>=F#61!C+jKBY|iqi$(5kMeDUygcJ%wD>-~Cump7jg08-UuzT@`RUyLFfM&x=3>QNQ zAy9RcIe``>@SYOBhVxM*!78TAZzcL5=YzjY1w%vOPM#EO;S}&1p-@0j3w9)hWD^G# z$k?Tz?@43aqo^svRAT3f6pq+PEQ%x1u2R)eIEZ3{a)=hPj0su_P>RZ0H=2O1T4RE+ z5DsMkuH5T1N($UPP(|2?gefY=EG;|Y77Pp>X2cyT!P=?oH11FtFKc+mupz&LN1=LS zJ%kM#uJ{Dn(gvQq?OyR|%d0cCG5FgsuswY3ZW@?*sYV>dZc|2|oRmEzcwyrUZ=tv# z?22)5rlb(aiOIpDmd7foCq>eBDB7lZI4q5U{fr|OA0!cMIVtcmehnMmsh0hafor&e zn5$B#XV9(gISlm#+)X)`=fk={hTj$*NV2O~nB*v-ODj$%XL4UhWL9YxqYYnt!C&@F*&d<#roFZx-A_#vHzvm16T@Yv(Bd zNh(e#81hyy{=SO>T>H_>gi>eyS(DtrGU`%<0t^NeIlu6(k!SVlgjNu_u9YyAjum_? zye8>s`B^og@h!6u3JOf|JXr|cWvc)qLp2JOHE2RA=(6*jgA$4(_NFsr(sY3{5G3sE z{58;t%1cRAV4;ck%E2IulKW_EcYXl~%8!4=xxg4MmDxQDZf7=6ZC=j_y_DLW@m8m* zJh*mU>zu&h|E3)@s=ztC3oiG?Q^DvxVtv4Q&)rdCzKLcPt2mt()q||?Ma=wKOwV!p z-qN;ni1y=2&U{_Z@rlu4DN>!L`YZ&67OK>UwUYS2zAZ$*G*WSb`pzx^w2|-sDekKS zs#?~*Eks&EkWT5?9dtKJr*sGkn@)v|5-JkX(hY)uf}}JE5)z7tlr#uRND2yk3-p|$ zaPGaH_r2fu?LYR~>)A8UZ|0d^uE0;qe}wo`OG}0662O^ zzLPjJWBO#V_wrPB%X%-#7JDcrJyHwyH7qG2hbrvc__JG=*O%g;{_|<&FASNY6B28j z@XIIPwN?{!1Xzh(yrkE#UXb#}6z~WZGSt4$>nVk4%9@&Y4ZAb)>6@cFb=WRZ+77ml zFKnT3auKsC`=heaNVweYpS-KzuN?3Cp<2Ks4ST*2{ta^d7qpck(T0Oecl}>-* z7D=&O-N<6$S?kx}YtQa@VW(@!jhkHZZ5une%@_=NL`ye}F!xHE7hZlTTbwsk#|}u} zYL1P@A9EG6Cyl<^lu=}9nr7dWQHgD@iX+wz_Uy|OMBd8?t+6nv;eS8Fv*p#_RCsgz zv2^UFRv-ALUpSRN#_&ByR3Eu_C;Zu_<$U?tt;W@R?i+O+_9Njyu-=EXS#ONSy@fey zSU=$}Nfe7VwG@=m(JKlR#_kUBKfRvdPDxMRyUCZ7ihkd2RIwN(D1nJy{>Lf!To(eOx zx#Ak7u~qAZ{x3!eXKy_{H#M0JGn@|3y00uR<$_buB4RsvcZ}nUw{JJbhIS7d?|8b8 zm1D}>UQGn)EKTm_4f-g5Py6JXSoSHES&l2BY|8PnaXKiD6ork%aLnCwjHfl7R=QQg zSyFj$x67NTa&$n@h&+FKawT{x(Of-odYV#{{OO}=EaUT;biHWLJbe z6AWtBoUEeL3cK!b15pg{aPvK}J7hYqty6WQ{U6AlR46pay^S&JK3C#ryS76BTTT#B z;8gjP>uG*Wh%GOhCq}er|2Su&M!(~U?W&p^pP8?E3>8}Guu#oN#3HE2RpUHAlvCeK z)y@wl4yg=N$U95+^bOR8_(N>tEZI{gCS{=~C(hQi)(>-n*V~Ab5((eeV&l@hzP)VS zdV7+rB6s!+gKzPjTj3`#xYQffalI9q^LMk?ScX?m;l z3*HF*L>r4^vkmppne(XP=UVIzV|LW7x|wkn(qqo9;~m-CahcL*hAb@Gy>8mD*u_lb&B<;oUB~Ci&$zv=y{knp9dxrXj&dYyRPv4Hsz-Jzp$y%1ljZpb z9u#43sSx2s4PAk5)i@YV7Lm)G_kAMhKqMT7VJj z@yLGpH?Ik($cfmOxCPRaiayeO64jhtwm$xDLE*fYYRRiJ6=vkxqLELS<>%Ow%!RK_ zmpOSyj;9oaleeTFmi^9n9WIijZD`EvEk}{_4*`rN~iQidgaGvE!M;oD*@I8wO#a=>K@a0 zVrSZ&4I}Sr=82TjJnPt@@Gg=XG|Et)+6YdSr@32Fz@@>Mkgpg;HXQ&lm!v7zicY45Dm?$wMS+de)N(JopYM>8Z+e9K=;7^kPcM|)W}g_co^K!C^7GHU zhF!T+E5tb<_wu@#ldzE}zSoN!sSs5+M*G`ANL@pO(F0Gvg-^BoQWtRt{Om~jZ)H`i zS=;C7hgXwfFy~q&zh*=azLxh?ee1YFt-|HefvTRoA$z0NCtXj@%T4_nCJ#zSaJIs@ z<{8nnVHfo3X?gA?PvKRum-u22x9gsme;dG(-54$yE_C)Br<|6up9&=DOD+=IUgogN z_rg{3J_e_dKvJ=m8HLKstY1N$JWju;l-8RTqtp8}6g|A5sT=R$l2==pTlIDL=GyMJ z)rmKEIWw=wK!)j)Tr_vg|-L9yf*P*6`i zZsYAj@##EQi*A}vfi+PYB+V}TE_O7IVR9@D@Y^BP_)A+Cs(Bk}t)6WhYdrN@*9v>N zg7W+r>3A0*r)FBqJHj4AF>Vn;q3hnpF)pz!Da#VVba5jK2LjKHRt5#k+xGO9W4uxu@7#h3@zy zr|=S=(lJtm>bcZH4GvPP=g((^U%jotBJ55P#~7a+@TJnPm3x`<6kjRpz4Ys#Z1TX2 zPZsf`XJ2g5zpG_HOSRAD#I3S6@36fi68Cs6%KP@Tk=u1^wyI7;DJF2M<)t>C^6Ogb z9@|vY1)jlw`-=T39+(6MWAEb31O_4YLw%|LOGDH@v`yf@^OF0oXq&Jg0nOjmHvJJH z%m579_wZ8(DsWIR;JR;B3*3Vb3}%7rzAkP5{yVEiB? zmS!XY5w_V023fEE5x-Jh(I0bIy;yW{^<-&nO1C+PM6J-~PV z2kr8wIDfZZu_M3D|4-eiu)u!#51Ri!$}P6~#Nho0@%Q%%EXj>h6gSj4Y+9|->x9;kl)~G+ack3 zGdH?-V{2t++TH%dd`j(}dEcA~k)HtnrBQ6M&sULeR^!0-|J?3!dGDrJXXl$dY8}5o zwItecfs=36j1g{3FNYm+7jZw=K;lBmmD_Z7u)CYFqhG~##@BYR#?R|RR07Nr@z3R7 z;d-h;eN3D--Hdyph(X-U{cQ0>tSTwdcs2_*}S#WMMzH50lIhG^N;V)u3ULEgF1M;n?+5Q_;Z-+|DBuVCLjrc!?Fc&9A;dR5%TbQ7zdw-T1`3^Au4u@CoAFV?nnHsl1< zj}+gL6>+*+z+r;RZfz)jJ79%EImKUW+Q(2ZLxFd}`|bh=9k|_}cE1S!LUz3*_HD*; zZ0fr-v4}6HB&=Ng=tSlQV$3Q;@S^X6#fw|+wo9#Z26|A>xb9jFI$x+0@G&~}XwKq` zAav_CH6L``DRG7{vfjV&{Had=X%7BB?7qdP$d;~45p3>}r5Z4kF@^r3-Akwpy{6J>=tFGiG#35Und2+l73l`4=Y}&6 zyP0Hs?^{go3d;xy54uaSzvta>Pole0r(_t%jz{9;V1~6h8!n>G!7pFbQ(cBlp3!^F zkst_!VSJO7=)5SaO)STJp}_reSA9t;J4GgUf*Q|m_*3QEhGEeeGD{?Sk*9?4P{ruG zy;D;|c#L;TQ(glsiGy z6%K-Hani*1VI@VX^uF~tlqe4$to@0VEC-{YV|XNZbd67ylKg|B-KNWXG*1sP99PMR zLcB96T7j%u+|LAsL>8UB)}bJ)5%7el{V|JXj#lSmM-Om%-l!RubIC*;ABCn%nnW#q zK<%x>S1%o3-<4};@{E#Cm(+;&*JYKsaE@o{10j0jp-)IxkB5R9n(XNy*A?vT2g|&- zx|1vtrPwQym3#OfUORVnP<^%Sw0#Veva=)4+k+0$0527H>g9@8NvFXpcerki`{;4m zTuEZXxhLPg>5oS``I!zHqpBilvlH+iXqaqG-hB#ZRX$A|dr9JCzg}K5&I9o1*<(Hp z`8QvmHON035PjT*xR2a%PN~Ks3d>a{c}#nOxWScE%3ow8Y@CR-y)h}yXe0y9uX2MY z`(<6sBhG82GHmj9V%*S-yT=@`#}biIbG_Y>J;e2dxTc9pK4WBD;=F6ds=@IXirX7l z@2xt8F}l*@4~X0>S_l$7W!kb&en{M47rnl{iA~upiZB(+C8aqpkT5?WdLO%cV(5B& z*rw*n>RKBR6Ywk8)pp>Gqh4d9oJg4PUJ}vg@;$t#dy^gZSifi3+YP&`ko5_DEJK0p8rf9apM)m z8IRPsy$4r{Po6D~T@TLY)9_&d5tO zk)D`^^g5JOp#xO+oYQ>*;CutepQwyj{2U^^V9~sCSPN|FJD$O>Bb_;uP59w zeRwJZh#{p`9hT-P!@MJL{^d|A6UiQDhN0dBohQWGoH&z&mk$SQcgG1z&&4H+N|DIB>dx*fVPw@Pr7U7sC2a zlC{zDwwnZ2IMr_-zgsx&CUIhqJ%6?_e&=RIBP!7uR4=PHX+pK~@N~p*LuyH_#dTLp z7nG^8VSW0kbi8#ucu}sUC>)D`^VzR6iwCVccEc07QA{2;PrecnSLMg0G_1m@!Dkzp zAR}kz!{=Z?FO#PA4Ns%aXbqqD=nuR_plIUZpVePE_`z{8RJDU5rZu;rx%|!GLRjRd z`HQ67(^nVYd}wR6>!H6B>&{KI3(;y; zzWhYK@B;Avw&6+w3+};PbMd$>Lwi zNN6fGdIzHjZ0x$Wl@v%6qaSw~Y-VLMQodHWH~WAd$@Yz&*^aqY#mcGIM6xFauxj!4jC~w^{96yb zr)17t_QLa zNU${g1;q=?8p3ngIDYfiXZJ@VS#*)Bkk<#~X zOX+`>P;VnNN&^ykr(hyPm%IWo^x%fA&EhIJf)u za;ARv8~>6E_j_*Xi{!pdqD$5c$lNqa*8Jl!#*8VHTB*54?h@adua>qo)wndP5dGY$ z>0XKWRA}Vw6ICN?zX`&!fu`k9Y!VRm|LRsYLE6ojeusAHPUxu3^;dG&6&e?5!PSJ zDfz)@yPni@)g&A#A#v5ka_H54LHo4$(o9@uODTMf+dM^LUpbXwI;M-Rie z-hDX7NL=NykZHmSN^$(&GZN(%BQu`*6r1#tPSu0gy+$)lI^L-$G$;Zu9OUhiMTtoV zOQGIqmF@iIGmJu)2UL4QCcFtdd7MsSPsGt9do=LRx_jEof-r>lACY1yBBfr3*`W4v zMEPzk77F_g%kPc7ZbB6{Z(|GlNpGc!LZKhFw*X79u$Uv<^@rI9P;w; zabU;$Q^mNX3NmOD413H;$9MyiszP`!`0MGKhWPhLbx?51dl4u8xS9)|`8~6Iaobrn zf&;C2?>xIrIxQ6oNZ;}>;Z>)GT8mcVWK8aU6!C)#OsWyFRYprFq@H<-l_L9Q25CqWih3U)|1QzRyF;y+g6w&>6L$vxK)l~MtxTC)Y0-57 z>!39geSH#lyHGjzd-Lf224MYjW{Wg2kkp9)$~j$Q9&$|r^N_#dN^3+p)20Be0`p{L zzx-&-=iH01P#U~fiIN^PF$=`Y7AnQd+dhex7Bv`Q_sUWyALWuHq&q&^?qL#m!0$H` z11o)*!>zLLfoR0^`ni!b7L{lxjU@uvxKD3v=x^LHF`st~>bN|;B>e?TobzSYC8*qQ zQ{TyHR#~**QZ-#7Nn}iDWJ_H?-aV%j4>%`rNHClEBc8O^vR%|hn^IZsQCnSXBn9~1 z7c}*g`GcZjzBYA(mBZ3r!`nTepd)hkJ(&=61Fu_kuc z;+o_a%h!CB4Dn{+EK8yS*u1%mS6Um``nb%M+)s_~5?--ubTF`;BXS6-m48f{E`;B7 zPSQms{adD5#tT1;jOP2^4vR;)BkgyZ+Wj!mXPedOXcs`DX(+dZmvEk&`FzeqysZmg z6%!X|$F7AiG|BwFL&YMnJYsZwquJ2`8X0p_rm+` z;kdSK%EvloDxp1kGd^dt8nzd_&N@aY_N~L1#VdiXflUt7#(G=uTYCeWv|8M=nffe@5y_PiW!&ThF>mVgAHD83BQM7RiLZGwjkg+3o2G6jx7|!}tsPg1T)qBltGAZ<-ZRc3R^LP!)|b`> z4RO6N#Li36pD*-%7yN0mCZ7GlO4v|C#aZ%N)t%q_Sw8bJuY&(PN7e*?RhvV%@~aWcwlTrpetQ|u6(YH%i!tHEsmlmHkJ#n%Bi8lVUcd5E|{+G|$3QKgp zU3DM13zOEmwlc{yurDlu;OASyPLJzG^HPS0`aXq`sxy0u7RT-B;`<-pWBFc3M};M7!Fmo4LtT z)0{2t#Om(M40ryQ4jYBwJp=m-Rjp5GR|E}13@}c&v@rv|l-?7AR%bY@qFpD7nz)5d z8W_B@4Dq;(e1ct9SQVm|SP+^i|i)&BUit)Nl zCnf(NFMFdRgK1qE9T*|;&Y)tWXvQeKfj$O1uTtPf`f#9KIh;0{tyEtyonR!9KVima znZ4;H=zY9mWnE2X@Zjfk9g01s;dYj~4m}l)ldkMMKK4ObWx=r|93k)7n_nw3*eMlFDccrX#t99POTI%(Ym%Y$p+$yD|_YLu&WH-t-xQG27#z$Yh~rYCXKMsFd;uCm)UhyiV@MjHC< z;_X0(`zsvm)3evkR6;*)~Sd9M_7^~x-ls31wj(4 zZ1a72+?vQ?Y>7zgSEH#k&!}0lC;JW_{zG+ ziU4dn{$Y%o;wk0hB2_J6EB`Rob9ymuK{mHT$2RmbpimSHt}M9f_#Zh4-Ux#$R84jKgAqnB9d( z-q~dgG(E=hcgnp3MbVGVVQB;Of!ZjR;rNO3SOEL8oOHS?~i zW7rb1&x``=%U|m*xp(K(2`hXM6W%L(5aro19;@24+CM(aIL1RV`o5uV{DpDgY@JHe zn%RS%m-Ttfs4sYa$)97p$+7Z6M2S@|WG3=2YkllwYcA}rOZK@Vw(aP#yQBay^|pz^ z*uHs^QrQ`1SAWd>ZfKUmlu!NL85WBdRc}c7NL$#O=@@u=pIJYoPdMd_Vc^w_?@mi{ zNIET0rp&Jq$Rph|3%iUnz>;`5aOxCRF;Uf;dU2IB)q>>3yO{B3;ECM5`ITgW_j|KGjAXcrrexW;fhOkn zE&J^>#klSwWJ+w(J1shG1g>L`dnPHZ5!oeKh5vA5L>ZdK^=B-`E4nkTj+@vpySR@? zKVneOe|!q&accty#p@~!g0^x_I~r#nVDItKxIdsa|?rt*g17;bC9ArQKN*{?(i9 z?FR~;ttVtupDSWgT^~=dv#Mo3FS2KACY8+P#IQqaga?*xHcjkG5}#!95t8vBCw(tT z_~7NT>)D2rkAW~h8XZ)_>1@_g-*7suKgc@M?1lC2v4}&kS6Enl{W|T|X6HlIg=U03 zocII1e7@`$H`xX#hHJ6x8nMRqKBti4XR~DuRyNxjTTF#-t2-f zo}l91u7cu3uwj{ZKZR+)J)G^vv;}E(Ka=A(lH#2bJ3DR6u1G`3d__+k#_;M^Ok4Ql z%7#_yPH$(a=A2MJMPY8JWwEs7)J^dQ|IjkSA+tfLXqMK`Iz940^x5#SRh6?b@&Pe9`F<$~7+O0Im#$&K$l z+}yLu7Xti^upb;O8^me*l5whfWL?EqgdnO=ZQtJdP1`NKvPUnk*DgFmYk#s1q$stD znkpvAjxobYLy^79m*S-1$-SL=j zoXY|i8TI#kAm>kemZBAWdX&>CS*|NeNI1G_$#WJOMt|I5O(-ktXY?f9`(m47LF(2y zG~)Cz)RWiw-Fi!6Ow*Ig5&q{B|v|CdecX&vbkq9nwC#VYE z(w3hm%=DT8iw9zRwZ)aSOW5wfwqy&|7h*Zj9Zf7~S&S>kCK&lH`QEMLP4vymO3w zL2zRuzSv!kLT&k1P2=}IO3?Pv&r&qJuMGG-Y+=#ei{2o8b~pG@LITp>MzbGJM##G;935Oj*ph z=;^11E!RmV-kP`(S_qsfDGyJ`nGcJdo>55Mjr64t57`hex!WxpwY^*XDgwHorF<)5 zzHp-?IA)ajRt$N0L@YBvc*7f2$`<$e3cdS)W}?u^-$E(~L2o^jq~`N<%UsHZ(D z_{g?rEFq3loex?h=|%PKB`IlUENR@AkuJ_2^rn`^PTQ^2e7(RHHx<}gpwTkjSOt!w zKdlx0;VGN#skWCahU!5Z6EgSx2a4{og?(uGXlyk9xFXUmO7NbWg}6SOUP7j}wL=fg zC>czLUs|5!t9R^vLd> zFh?FD3VW;ig}n%E=$8{b@=~wMPPr|uagq;XKL$8wn?3(nIwU%AJ>Vf0iUZNz@XI9GD?8OTmD#qN#oqlQs6rY)K;$YnBl% z<0m64IksP(gOp^~utaq2ew`W#8VR*fh@EAP*tugd>dN-@^V-zpTw6hPS4|Gbr~zTE zhgUIiu26C^U1(F%mBpmz<2u!f;<6L9vwdE}w?}HDtD$UKdaR@ARpwB9~#+7}vKPdnc&=dMGi zFlfvhP^>|YxukIK@}?Xu-9vT8kX?*%dk#*r@EBDdL#)!-!Lku;$Xz{ATuS4(MBfv1 z4BzI%9)zFH{r2jiQATOi$zeBMrDsG-oH2avRFAQa3(u6xsNR+d2M2&t+^cqMr(5p@ z4^+4ZR1>94#+PrdUTMEQ51r=f*WqVS6-ZGPYKtvy#XZ@z;F0FBx0=KE<>}|%2T^K% zqcs|WqjobNWaOaawLU#+)F8-`vKO&5Ok4a>|B2`%B?kLv&)x5z75&<$B9Zn;UJAeM zRO07nSe{S!2&~BvI9!{{r3phV*iLx~`1JD|qDJ;>22|DwDL4G%+{QLkH?_@fOv4Pi*x|$NX+B!M6O*%=N~8%is|3P91TF z|BSb!$GwyimlyZ8xT+;*(nhUR$4@P^y7rfo_;c>)e<_*bOAO2AU@Yj`0NWpZmDKtzxIySo%lnoY`d68i>$eLkhNm?ehi=^z3$V55>bSP6S z2%^1+h+BPGhtg_1r1x-v$T=#1w}giLWC95+U=NmUzq5pf?%PWKSU6mCwR1KA0mf(= z0@9+QhCeN|p+7B;rR-fXE=*vwfRc@cvjG?|13R!qJ^21^r~1RH_4^I>yY(#-{QC+L z@!h2LdjXkH-!p$-Z!@94=Rki?37DSlGyc9C0NBVL7)1it?}@;mKUSm%41aQRasIj7 zfR*o`)l;^_Tye2xf`K5&KaE*+Rg}N)EvQ(!m|B>+nEq*f7RgD7IF27_M93=7o4JC%_U(ODq=2PBb1#M~ojSOmya=hNYwEFS!7G z;r)Wy+K5Ux*)b`*SnvxA{2=_2@H_R_{E;NYv^Xv{F1D7DU?S;A6JmkL3L?J92x9t3 z2oaf*r0JD^31*4m)6)2NNWW%|EFosz=ZXEb0NXF%JLD)b3I$RQ}ug`gDz30Q7|P5DfLp2`QDnPbL>GKWI=pfFRoDZ~t6 zZU!_#aXKeO3Nj`2QZ|Ul;tJ;r~xj{u%y%ALVcGe}Me6`u`1|e^2_4Rr#;r z|3{R6UC4ic|Gz-_2l)S2P!8k&1@aH-f0)UCy#EX3Unl+FA3b#XKBL&97OyFaf@7A}sDKVxoVy+yPW^f6nVATwSc~ojCuPxN-ppP5=`t zKvTFsf#Q@F+@C@Lu^thCw+iTBF314_ar{Vi!rm!T;yC?f1eX9X={l5QKjXn{jsv=% zK~-8-+tSGyV9W{ThXMEBCxZYoP-1IKCfQ4>Og|DZ0j^D4`-_aLfMZ?wniRf(=KlP6 zzl@O<#9Uaezt$)oPL@_g_#h@Q6b4-W{4gQlfa4w0{$IccaA`yAS9$-#g!z-U?=N+T z27^L@1<|kRVDSAl*iSSpzz_z90V}GXi2F1I{0Kud5(+HDeoY6gbPlJ30x1p`5TNbr z34h581%Y8Oz-{waA`-dp@_3jAI5{1rp#krsBeebHL;(xsLkv;q!%~3lH`SqZ0PMbY?&rK%Ft7-P9R`MhpoqgDFc1uR z6a>ES(fKn&fFE+-ne-41wXc>vL<7XYggrzAq;&)Y@F_h40#xJ(2mpNq1Pu6Y9tH*$ z0)Jv)fAnA&7zsZN0!PF5mA$`|8la&M1H;h>z#;8$Iwb69UevyM!7u!<0J|e1grm`j z!oOG5G3SClK|`0Baa;d3ESTpI+Pa}+>g+ZM@CEp5(VF{$iDpl5;D41v~O+BT(?42d;zm2O|NL!@VD%9T7hgXwJi(3yB0B85e*-6mhuF zK&u~l6p=_Q1bMi|NF?+?G(SrQiG&>w#Nj4^0HY}E zP$vXv@O_h=pQQ!(2ty7JTmTLB|5FxNb9R#335r;($Mgsu>e$IT57Z~G?(2z%^06aK{1}O*xa52Un zW(WZ$TfdYL0D-`P0rwCHKs)^80O?SNUqk>64LQ_VArN4k|AB%1Q~bcJ^zb_$NO$!^Y`Gn&2=MkiQV}#9{;Q<1KZW)9xgh*tTtR;$*@JC$=ZHwPPm}8xz~MZQHi3Gw=8Q-&tp^b8gO6_48D9 zRabZKi|$>$yhw1~NLJMb0>T;B4#Ew`%EZjX&CJZq!Oo#k3k7NdkHbpO#7xh`t;EdC z!_2|+m*!zO(o%KFpx&F{PulH}V~IRZM2jgOq0dX)QJxNN!kNjLZGCB^PC%`Q)O}_zT7tFn0DF3Xc*;c{j#ynS^~2MWA<<;| zs^}LKr|C49jDj=fZ%03Vp8$5-?N(5|NTFKQhpC?gt{GhyP$xT`79WAVQ2?7k)New%WElv>7JsMwT znG5+A_X!`BSK*%Z2Nm&W*ofF4ZwuI^I7Q81KH?9TlYesw)Zl6u&i(GcwMvVzJM^5Y zu^H=4)^Iw#W==9Oz4N&#{=NU+IupcJf?f~w#j#Yx-lE63v9LQ<;;x2d;Ykrh6mcf%Wyv~JeP9H zI2)nXpRW=07Zzx92q`um^>QgrS^IKSmwY2y5DwcN)^ztF4(vHS;>3$DQ>`QFEf_af zHsLm3&kyZMGfp_1)c1zb#l>TgT7#xKU1MxcZwEfA4}g_-VGB||>`_Vg#;+}~;XL_O zb5Snm?VoqAH>1ass3}n#oQi5khI6BGn^_ycA7uXeOyICTS8uA@*f57V*#59)aB7vPZ20jTD%_M7Ikj%YRG@gP&k&rTi=!v9EYNWJz%Z>aWzVe`8Of&BNKY;zlnP9 zsnBDe`DuHf{fmS4FzDTSD=bBXq{aUFI?!MV;~Ux+x1Nvf{wG{TUTzrbz!y!uQK(gb zhTLB(dNgt^hYU>1XB2*of(%Ui&nWzQ4(UG_VU30q@o0ntMak&zG#ud4ut@QB?L%0j z#`rQ!?FUt8l`Zy=z4>|Cj)tz<_x+om`ge$Cq9np*Wig0Wy(Gd`b@6{Nar1YHjVjtz zdHLAC^Ow>b8)1NG{~QBo<{MSPIzLy_hHj9BXxqYCW7}yWH2+hUzg`{#|~zkqnGh2 z0?Nf2b6n2_o@UltEwWCkTuOZ@pILNxuJgUUnA#D0MGEFwCSKAKZ^}NCs7DOkF)!R@ zUUxcm-sZDlxm2Q1`ndkU#W&}cv0GtKjS!{q4U3s0{{S5kOyL_L4vR;VhZtE?XqbSO z85hK+Vg%fz01%gRD{*@9&7m6fXWF+Z1#H|4Gj+w++Vb@Az-UnxX6_ zXt(jXAOnNgZ~d7|MfMdz#yCsa4NXIRfyP*CG9fwff)Z8 z!`r9m^EHYdOW*q!JHZMC0t{Q@aig>^s_r3jrM-f(;Y8C}_%vga>LEn(-?R7&dH6gS zdjozcMkdh_1~p2tbkcVe;X5eE5tyDrCN&>C*P-2)h}+@!1~2!c$Cb0co>~)chmTVv z1)%w1&ld@6)qh;6N)mK%WfxR_@~rcxdpBXq1MW|xr;g4+-HZ%{KrrL%q(IN7_13E9 zll$u|<81Hdq6v+~zmkcGY zXb_Wd3CD1^>WJ*E8GAET%FKnNW0p!P`Rxwnf(FCGqvI}|T z&GVuPK84Ud14h!zg^(dxS>aSP&1oq$+WL+z=o9+#*q{m_79?LqZO)sUD87rrph990 z$H@7mixP(3d?hUY%^Mm9dBcxE;&JivN8fq}Zd*_kB3TYvXbAa-w%9ys7}acsF-3pG zLlt2qQl&#k2T)MHyvD1*#A7Wf#yj=?EbP|&5cH%B?C^|d$Gd0+HDPy#l@`R4((N9 z(80qM(KCs3UTAjEdo9Pc(IM#R+6$<;xe?65C7ipejq1z3fNd!^1vW88pSTR;v}u&= zja>=m#a!f`ERUSi!rD+M7LY^@P1k3ZEBbbb`i+hjidOtez>zmC z`J;bRp8}k*(!15-;cmD67}s^+OlQzr;@6o(fL6D^TlARGU? zI1w~r!eBAw2K(w#P-{ORU4DAR>-SqyLb5g}sr8m9(3B}G{f>twVPqVq`9*(vj0#1| z+pwNC(3H)r8A=q~UywQ>BL@x|a2NAU-MsCqy)qD>58wVQPk4}9B$tha^l2dU}tkHqthXRD>v~X)PM}X|lpMUTd99N=5dX^M_6uGZzk-8|_!TAoz zWEQz;cF37U&{!X4$~4nW>uMgrT*24}Hh4Z(XNtgrg*PZFCsI|xOQ?r@xLdUhN09tR zvIF3ZXk+X_mmARcE#e9CtmDshiOL*hS1H1ZmcCleT~m!q)1?hc-_>UIH;7je!uODjW6Xu-8-`zPZJH9 z3b=`%Qyd#!w8Tsw_+!W6tw)0qPg~cIrUPuFiZ0IQWFcmpO9jgqPrea#BezLj@4`B-i8vUsg*RN{l!# z;~QQxbtP?yEa1{O+;?zLKp;)4W|O+`BMzpJFh4`X%a_BG4wONxpC)I4UNRwjOn@vo zBd{JBWip4radPp3*wO3V>xER>xL;8{XyjDo=Sz3+Rov8kCGF2=7B8qx`cI!R3MUQp zsvr6Hg>(=1hj*7$_nWc;pP)H8?>B)ogVgA!&l9x$p!hP?3Jp=gyzVNl%g{u$GtR$!RmC-*Fy`_%=+ zzTWcW35(ehpIOm)8);s;m2QS}ltVWBXMSrysUBvPGJGB*YEpEr?XH(Es#X+8U<>!p zHD8XJhTB>Wh(vJ|hmk;v_NrBrh1xkY<*tQGwYLhOf_9z3pl^ONb3juZy=ynX^MTjTYJ2beh7a=SL8*0qeUO4qQ!=M z41twTu=cn@sK%y=uD;qnyrI=4r3s9h%Z1tbbYdFpSEBj>?T}p&wlC*>82b+an>r3$ z(qY2ou5(R?h|Zy3g>3mz0%C~pD4}{9Q37N+aiDu7kZQnM{l9MWqqqY|Hz8FxSzOA? z&mQ>AS$9G$O@{6i`eploS7H!}%RcIxFxI7hS(L1#Ef`-swi( z`U-u11C9jf@abPR55@dHIz?XO+HGeZ#X^jjZ2_dxo`%rP^zw1gVN#qfi`UXiz@$tid9!i#^eI0bygT2~{hvh{Tf(VR z{&aZv_krX4KqSvBxy3!M{Dl)oRuI2qc1-UfQ{%eoPG7u_Lc>BB0gp7l<+6=TgW65#Hl8nQKx7zKl z84z+sKigUpJh8K8da@0+2~>rdEe#w!4a{jvN%6$Cb3?8k&U?kPWjb~l%7gxBSub+2 z-HE=K99Tu2V~}?L(%JFnYPG$dR{6GkUA7PIh41L`&*m)pT`S@*fA3Da7q8=oNzUbK z3JyE>%ap`plY9T9DIP>52`1ETU-!pIUf{g2g1?i3OTG|Ilxt0NBW>g^6urP}VAd^Y z#w*3;XMABZTl*r-@YRt)p-$-?|GFLDJWtzBI#M8JR>+jvM+Fy2ZoI`N_wS3Uq+f{j zYg}_Ul5e#X*Hv)!u}}Pvc#?0L5<7p7B(ABEnlanCT^CC?c6xMF-H-Gm^p^?eZ9wDX zu-L}8n~j)9S$b!?=*Nd`%e{6R-plrnrO*R7A#n16>RG+A$x*d57a=E}Exj@u-)fx} zf0qZ}qF%@*6l~Khp7SiQP-hT#f#%EaaycszZK$IDF^FRPSkHH^VjH2g-9wP10(yIF zlp0vg1Rg{FF#@!tnB#nVvXFQYZvZ~a%>*WPN8_sc7T)FaWFzb)srw_ww& zEyq8|s>dtnhAv?BH~p1RlLvGo0Jm-3={9}r<8Rw3-t+!6DeWPmxplhufZ<9Q0zpa` z;mLG!3?sG?{BP{uq4(|9DUAsFtL`C2qrL6qw_+@}LNEle4+3o9Id?PA+alr(E(nG6 z^6RwT-hal4XYN&}-4%tjOHO~kj#h%R7roBcH&m*X-|rU-_(i(e)QVXRP>n9>o^ z^|cDBv}lv|S-F(jH$#+RMFVDpN9bWNX+@vU_`<+=*~K~K!q_6jcgdz$HDiKh9J>FI zmJ@rc|1|Aj(pJ9G@9rN9q$o*r$)T@XLI0ii^4%|Ibp9zDobl!R+!2KWSmml%IOPk* zfhLe-9vrCK@y$m z7$}1yG@P>@#E7zFq#0}U?7iZ4wnt5_r~&YBFV3Es0_LI?H>Wt58m8P=2&S;#2183E z;f4T;C1;rzGRi*)viHVuq(hNI@bq!=!QP8ni;k_YXOdISWTjprw*uCp zKoyoR%F2g}Sn3nZME+)pIn;CmvlD}+49P zyQL8LL!eSxumj5sI#qKjqqqb_5?sQvX@#<(H0e}xmbzK_4;)6H&ojv$M)$C#SP*~K z2cqzg5`7qBYa<6odt-g8e_H<>E15a}=X}Y^!OZ=?$t0m%km|Tj5m`X`_ZkOE$7JP^ zfL@@S0;t~?g27rr>u!XqV4^~!xPF6nABW}6PNnd8shLG1$#^zC$wAw*Y-;|n`wD~W z)3`RM&r^}dV2k$FTeBD|1@5v^hJVc{EljR7Ongd{ z8?C-C_JPEo3gET6#Idc@xpQnb?zIhKcJggjm z=vhqJnZ^=|2q1>;kyY(F97z-$wH}X5+bAa|d1~mU8SSqjJr-F$~rO(UHNv*L?EaVIYQHRR{7dw@*c?&N@X{ zhaFP^S#-0eJO@t7HHRR&)6m>~cQ!vs0BBZq1SMQz3}}e+;2md<$WvU`w`blQT{x`r2R^iyxV7F$c;R}>ln=1Ui1R=>(FlkshwADhCRlByZ($bM- zF|@uHVf$B8CP5#BCQ75_EEV;Eq0(^vMA%`m9~TEy zGR`KEUXmp1{$~U0PJ3WTv6d4M!K&!6|+CjmTbxX>IlI!EKT! zO6SV%wdU+cP0^6i{YJ@MvOXzrHy=-ed^aH1cEt?BH>`g)9Zcgy-_u8CT?MDlfRR6U z-HBgjp=R1YD#lxGr#ZOu8*Hq<_LCb$5Lpdx!VnWP7!G9*4z5ag!1FkIFUY-TEq0cs z=q|)Hl?EJZS&mFqwlO=NbBna=sn}Ls@<#;oRokSq_1%<%8 z7Mx#2$sF<1BxD;-dYeB~$O|Ts&54Q~*$dPA5L&9VnAW|!Fos~qwHAr9K5VZ9x<>rg ze~B}?r^{7naXNvRLK2@!0U33N9Lb{=N@UzA<4=!6$eF8Cd}$#e$=fyy3()5h8|0mJ zN9hQc9~qy$AKMCq!SFyWB3~2p(;I8T-5&>9a8q9Tp=-;nf$5R+q@qRjL1lp%W^ejk zZ!u(og_hKPQNGqpFaZmR7bzO`;r5|6T z;?#G@UJ$jYj#_{K`R%i(0GLPv|9zo;K^OT4Nl70^C^hJr*k9W`Vo1d=OYFlYbSUh? z!ocI)La?41EKI}z&<8si-;s0qVSqSmE-)J=;_YIlp}aq!tZbqqv%|c5@eqm|sgN4{ zUf=TpI)fRBF|&3mRXVrhh_+@nO3#F@9fO59iO>e=L6;VHiY((411wnQP6S1(ImDPG z^33>mT=Sa8eAu+f)@~(Nm}|1?x(_CtJRg31Ir*;B@GB@D7Lmm_c?7IA5w^;$qEqX@ zGP8+<9;5Jx(q@Ro16|6!M0nLQv3P!#JR2U|ZX3B=TXgSRSl*!FYDs;=C=-^A&(n2b z@eD&mA&wuTNJn)>B_QVZoSP`2^leMu^f=mX-7iQ?D$S{Si;T zwAx2D9ipe!%ID6JUE)uEIOAHYj|ZWn^^05W*SDr0dBjuN!b8^rgW>@kc{vlp(CjO) zDhC}=qiB&*xqf<+sJ_e5p0cjyEH$_8z89L+A_$zWb3Hg|nE)AXml-b+tY16~^%r5N z3HZO8Me}X#2#zgEuxEB6eRB6fJfKHJcQP`4_W0c>`3F25vO7ld({p&RWsWW{x|gi# zjQeZ3U2V7ume3y}AzMGH-^kBjw&SzQ@y?j9zIfNT#WvVk+iu>P@&;*&R^h3bIaCSK zffMYdW%j{gJ%{sN(mkcJe}&Yw zkS-}?;e18zA;{j|ny7PvXcm6UEzZ;UDrgdyg#S$??g`k4cR(8suIi-KpM0RPl!x78 z$>cEna>VsiaAcNh+2dQKP`cFrkWJENMY|emt2`;4jAkYPX_+BsZ8->^1sqZQuofN2 z+;LzV@*>LJb_fGIyV)i{E&iQrm@d20FGGQl-@Cl6f3}w}$%78dE)+rNnMA?cSbu`m zd)#~YVhL;x!wkdWUXIt#ha;;}^T6ZcP`_JmwQ4jZ$d`nRwW7f?%zoi48g^r3NDI%Y zynnQ_pEilQYPZc02D^cJWGAC)AV8Z4If9a+ne;0o%w1L%-^zkK2na~H06FLHYG z5uo=v48^Trub=1$pL$z+tCqLUBqn!QQ{xpyz*}qLB3NRueHg`%b1Lh$$BE0=;>+*k&kXIq zG}d5r5LAtw_`)dgCDnckA#GlnVN~X;BTl8?sn|)N3|ot&zqem}}#&4X1+bB4=Aw0Q^ z)`I299Ea(kYZ({Ru<5ChPa0^*4>W!&(<}V7EVdq2Srf=f=2X;{cnlUIow1)y{geG~ zMqK`jIz~`=s?-Uq7Kh0ns27NxvNz_c8Y+su69?L!kA!)5=rd{Od%m@XFv3}eFNf~m zWM_*;Jq26^knpZgp#`Ku@DSc_1Ap!~bi7D&*VS`^T0fp#X9h(+$pZ62zP7L0SbRiZ zeuD{AE4Df}e+yvxG4h+~JPX2EP(Cvwws1+(&Xc_O%G^xf3Tl=x`WkiLpzux2mIj<& zH)k(|1mz9BJ+6!Q+igx2p3pWlzOA8=^t!(m#2Sn_-=8;1&Oj$ORq@5~a_OeESCJI9 zd@If;7;gC2C?VwBZ9;(j+p4ET+}{Eu%XCo4U*s+~`R-=?5UEg-r!y$-mguMQJwxOt ziTjhCR^RoL)oU9@9v4OwA-hZ)K}#W%`lU}=2coO!I->^O_f5-fX*zaCZbCDD7Hd=tB&>YiR`bLvx~}tp$Et1S4a%_Y zot)|ssS(+=s3oIv;A}K#rmdM>3gBk?B6)Alh0OEgN6*<Bn8ucmkwx}Lq3FDUT5ME<_;FSx7)IR+Gx{Mli!b$2vnu6DY+oYEr_D@%0j*k(AkxVbj7qW>8)uhQgN5qs`ysh z#VzBRE>sNjR+d0oSfXEBIrn zbI4&CHi}k?^HN9MH3{-dQJKn%il@hCY*pa>oNANs6MEyQ&hNd$#*Bx9ANrsquaa?h z#>tlU0DY&ATk6`)o2^U!)-}^)g~pj#WlM$Y9Nr($4!B7b7?n07U=SXC zOndoFO)K`;BHxp$`end-dTx@9QzW9@cS_bmI~N4xj#(EUT)z4}1#1s#7(O$HzEcGt znqrw#eVi$eC$TsGnM=QNidMIX9sgP9fmkDUOY>HqPT6odfI>sGk1laL>G;~Wchnf=kL0l z9o;T(QVHlr7{m5dw||3lCAgf-cKrfyZ8(T-7v=m^`e>LHq8($KbxnMv>A_*gg9-3v@Wv7il5J^XU;+^zwYuvqM19&-tB)TewY zpSlaT3^uxvTj0<>kXRJna3|e~A${jS{|d{>274NNQ;W!HT9(#B9lSL9cC!Z9s9D7$ z8dx(>7GSuVLLQ+(8ckUj0Nkt1DefE2x8@DI?o z{@jBDp?S-1jtNwznME90W}rp3A+a9`DwVPFI3go$XO*Ht;Jilu$oq;mv}PQ@6dF>y zk0OwpcwQ-q%r-Z9i=G{TJ3j$OY_?YrFaS58?YxW@h_q}pkvTU0&f zCtdZ0@!q%2bL4A!YTe!O)C%68dr)ni92M{$4X?x1;azjh_-bBkd(F4U-^u^}bjLpB z@dy<5{k;&2qhJgVyukUs4_Q9vlq|*Wy&>QYxO?L_2bR@uHdf+LtkIj9A^TS--6TUMhTRa^7Z=XqrN6#?7UTAMKHl!%L(b@yNYTKyym&z$rx~4peyBTost%c0 zwtg(@s50T!Kzct0rbhy;MPIDm5rhIFLFwfS4!;y3gl2~=6+%h2cJ*P8Z6{Y9ez|k+ zZs3FG3?GzwN5N1auS8+Ywbf=!0Pf;vi{NRbb zmYP(0Ch*jv=;c-t`%zHezIE}Ex!ESM7=B_WQ}RHg(g^%ksAYejt6eB&s#&>QtM~FA zIRh(#5nM4%h1tV`)^$j zI~xm2Eu^YE2rd^l12-Ed5eEko12-!XJ1YkR7biOr2PZQFcT)A@SIW2)HD&|{HwQ;! ztG_q6MsD=_hH*va_;Gh?TqrCYtPGrgJF&1cu&{Cxv2e1**{V^;{Zdy3R-^EmW4taa ziwKk1E-|~9h|Kc9AFQ0g&-}M3-K-3W>Ge9#E-$&sSmRQ#mHSVW9wk^)yY*Uz_UJE= z;bK2MXD|Z+VCU0-BS}s-^W*sr_M>$FCH5`PvIC0`JIkUzbqxHIyY#u!Xl-8?0Nh`% zj}ZysIyybyRtsjS!T+zQ(&de zc$Q23##GIrC2&X-n!B{_dK&+9Joxu}iBSexJm0b?S&yR=h2x~Md)*gmv_`&sAq+rF zB6%2n`S?G>o!2J#m@QqD-GtOX3kLM%US2OJk>wCS{;avHH2|l_)-ZknSBa zexo*bN{tT}F>oYDFJ~^wC(6-cMGN5`u&^Ib9iSdr^9>n#CW#AQqqKh><6qd!C6gpr zLM*THKWxdgPUeIcX(vJfAA3#l=Mjb)WI6t}8^9u2R$5bLR>eNkxv^d)3vEO`=L5(f2`EbTq8@@^C&z8n(4ta>sv28eBaf z1k-ucTDz*gnPQpORLJjew#S)L$bp2hLzWqjE&(~=`g9;)tAEvEbOhf(4wUFRFg-^= zI$A2(l15A|w66k$XG%PIHJjdyuFQ|24#cTXc+adGp4(*vohS>UJD!4HA|_3f_e6!= z1>HlzLVv!{oIzmLa25xpyn|qWY6dD6PDN(aJ(A6|8CGEb$oN|Aty8eI-&xnQaA}f{ zjsWm4%aVk7Z6szqVqJi6xNpL|PcOPNOh>|gK*nc^N)_0iRZ+DTE4r@Gx# z)JjK~f#rKRhtipXw;H8aPcE0svUB)Mwp38oA5il_iu5`srg?o}U1GcKI#SVVQy|75 zBpuLfHaHG!^Or%5pM}2K%JoUlNNeS{-2rJ7eGmgAh|m|Fikq-?aI069#-?u=>9OKkjlZ7B4!am`rkb`L6_*i6C5*Zu$u_GhI{g1w zv&tYCM@r4254@XHe9eP|3*@x2EnQ$V)|52@joGlllFTr1a=Yo@6a!W>{8OUd@%iq2 zhqs-UR77ANn^EWdkP=WcNJg9xHKTRaerUDftUmJxpV~*k@VE=6EbvHqA z{kqv;!RP{zFxMn~KBj_JCoSMKnyFcH&JCI-8h0yFcz@gB0tbcGtd-ACnoVI*okI_e zuug-9IhOdpP+|uA_y-&J`}q6ov(A2sPSYR4)Da~otPHHq;%zG89WqbjMFY)t$+vyO zz~&AQhyIjZ=dHWc!eROr*k#k_WP*F6rpgHl2#Wjo^jQt)T>75jH=O8cRnz%%3 zx5l#l9~!Mp6!n%i4H)azl1-Vb=sY7R6#Evbn$#DH6XfBNbva_t z1O3>jUYX@+n$b?5KtyUMS2Ef>I?{b9id)=x> z)FXNg6?ky(kKNI?g(hP>Op^3>>>BQ71_ zE(OxpqzIh+$WP*W9RN_GG%(`K)?-Qf)8X&3BXy!cmu#z54q&(d$Bz0SZ8-9CFuC>_ z$K%)#hZM`}i)FeZuyMBDlcJdQLDZD}j1aaVTT!U7s6p#M1Ow}XFB^NFD!ofbQOpwp zUUyM5Kc0?ZGVUwipdD6=#&79}l9JVqv9OR3Kn%dnPe^-o&>xK6^<9qR=Cp?rtHT_8bnE<3$Wx7K)mcTocUjusgV>Yw zxb&@6?!CTH3 z`muI?^ZOBQZ3}f;?+<6(zb|)!@y4>gf9EZ8Z8g3cx8hQpgcm{VB|ltjV>3@T4*tCn z(JD~+eN-SS!8^%A;E?J9#Ea&{KLte*pkD*c^8kFqw(a(A;d0t34pu|lWDO)7x%4Xz(MTL&fEBHgA*(Gawp1xQ|a|^ndlV)vqA$k{G5b>0G^?)=J8# z-v^HH*JUn~8^d?59}YJg%*a|54^iX^LlPuZ=7vR94u!LKvDXe6Adrqtd6gJwvbNU= z6i6epR{16Ebb;UDKz1b5rSC=7o0gS zT|(Shc;>8XPIt`zmWMc36LeB}8VZNz(UJobvvy$ z2}3q&$KleCx7@m3o)~+J?W+bJ#J)e{COp}}Jv}nC25SwqO;J_bvm9rhJRGXPK!GAe z1W6eFiEnHlS0r%lIxm-fIb#pE z(MBs4Y4RErYQcv6zWevCh%NM3M%^swCY%;0MlQ&uilE8%POQjd9@p&V`zyc&_z3H_ zKboSPd`9j{jy~v`?q9aNRK2(ERqXT4#bpYc4B(8(n~8#C=z#bwSXFt$X1wt~{VkE} zFliG)^XN_d7%puY*iG1N7=pF*6kNDXfa@?q!wg@0 z@6h0R4T=I+s~y`8nIaxr{fUG3qX*!f+W{f9E_Io0oUUsNu1^~`t$<4wzwP3NEtR{r zeB0yM?y%OgDv#fj2DU>@semWdn`+>+v{o3KH{sUqvvJAoAVHJ#bwc37>+f~gW~4P= zMz&nSj%ZD(PAx6E;+>K{1AZIt#MLBz-MO1Z0fx`}yH4SgdEjkzHtW;x@?)jrt+U3( zSg>#PLwfpf6tE_^0M7ZLD1Ho>=c67z{w%bg<7CtCnU;mPzsJ8C?bHu2Dlcy|sx5q0 z{n|7-dwdUjq)VCUT3JPHq38dh>Y>d$u;nmR>{b0X7l*)Ld};9hK*@)Eshde6 z7ZQ!hR(y4P;8GWt`uU-i2KC+Y{&yh^OI9-T5NtGeDe&H22C#l1p;&B8s2fPmtd@EJ zT^f+A4WoN{9`?8Qzu~9y*mjm{pee8wV&<`B;A*FKCOQTMU39rU9%h~!_~=gN`LPdu z54ZE#R=nM|KA(lf8Ze{3R^O^)xMMWR2I^a@&Vje2&OexccQ5)h;;7HIn%6u4OHU-;-847fL87HDcH z3%Yr{9QAmywi|YAaR{d|1R% z-GAb`5pbzW?^b%lwft2^59n`G<7#&#a~`PaG_7jZD2U^EayOF=94IZV=X|q=#WjHv zG_Vf@v~Uf0Or)~yLg?rC7k%Q6lpNZmGj~?{2JbN?JFa9$jQ2Xxt6ylPdAy2q&R0Y` z&p_^;U10uLSU&GVYI=J$tV!O=V)pmi%zmy(0k^d1mDJ;%$TS@$Q$E%dKNX~x#e1Wg zMt;!xUXZPvGpGkrL94ai1v-6(=b$2-{beQIi5{kKS< zz^`bR{ssk;^UhKz9mCXNt(Oh`O}8E}lF2h-jo zQH~v9eSiJw6hZ?EWS@czu+?FXOcS?XOhPU0HoP|bbnFo{%`+qrO_PCDT*9FHHR)hA z+IwT`=3NSYREMsZh@4s7V3J@rYG(4&!0T9oFhTJV(R4$Yld2^2xTgby0#CRXfsV*R zSFoXs-7=tN>}fcaseQ$Wbxa3$S`R^{shg1DN-??%ohKUP>8J8ecoOjbxUY#JJWwu+ z#wFyEiq1|vxEA2sFyYE2hxs#kgQ_6zY}5;T-OBx?FSAQa<(5Ki!Ih3(d>q4;(I<3; z2)qfO=qtwL3KiO*NJ5-aey&;@Fs~HEK&M_$!lp*71RLUiRd3^7v7qPM%tYmBV8wUl zW4jzL(l7qUhj>s%&K9*9t|c@p)0w@rvw@y5C`sT!lw?vT%}dUGza!_>U>w4>(flTL zNkK)ej`G$Kk$u>w4IK^AqOR8VcqD?KBaJ^bSP;l3MCkakkrBRQa39~edR@XyujZaYxqD;l$$U-MY>xc z9}V6aDA=VhJYGEG7|7%eR6CAA#*Bf9AH+)(Xsu290kqIu*Wc$xz_Cf6!=BPo&&-g$ zNf6=_B|Guku^E^&5>^=%6urxG7XdHg|Dx(G1F8tOaACT;L3#rsC9O1UaJvB|B&EAU zy4gr~3P^XSAl+Tk-6hgp(%;}Y=ezg*nVGeowVo9NQ}4{X1Jc7*PA|6&7P<`my|dq1 z(?H(!7Q8H?`gpgt9ZC4Rc&pXuT)>$JUc#?U1WwcBP*`vlWpWBI!5>;-saQHGoLun*juC4?`nNuc`9>seNMPJ7p8*s!c{J27 z;!GWW!gVJr_K>K|!FPX|wfWH)XNeaDwVV%biXh5ps{)yy1!iKt)6S?P9?yN-a)sUA zp;wNx_1TNyX`ngb%QL@TVV-hgv_@se|I0*0OCu42U#oe_B>^47oZiWu>uk$wE>-{! z1}+4c7H5UNW8A|cr0^|h%>UaJH%3N=O?+@L`2Lc2=Occ0ZTyA>}27+K; zxCvs}uRWgn9k-z$I+3p+#sqyFA0A-Q5cFtqA~U}{GtIk?JB=sMWNdvoqZ;X8qqpmU zuiUi=hzs-3=MoWFzN}>C9@G~6+#NV&cqf;X4LS{!J4t?JwXaX!B{@m#C+sUe=@7PO zyS!{{W{AV8z%qP)z7=9eh9|xDdZwKXVTX5*>3l{evkG6DNCRvi~kxl#*>_ef8an{!SLT0pd&aYecmV zcFi`{_Rz4fia=4#==<~W<4uY+OjHa%!B|$ZgE#+I3BNo4{G=fRPW$6`q6<_JV>9DK z+Dx}X6MmmC)aA^p5E1ybFHI%rFF@YoaPJyUzZe@bgT%{B2#h=I*H4x2!wnp{AM=y# zbcaN3hiEC$jVjSBX_HL(8x=QI4O=hr6Y4uIlX>HVKiJ!qE9$6GnTS{5!}fx>gyN}) zyh?lhz7D`O=o+|TjwxX)`B3hkVOe1>pa*au$|wAti1TAdvJ@honeoS4cHvY{mXKno zV^-Wn@2wxN{@SS!Qeybt@>M$Smh>AZyPa2~E~;PT_D4{C>JdcCus&I4mg$3(sSxIa z6koFiI^$-^6|=6igGw3vC}4%Fg-)N}NEXn>YiWo}s=Jck*)NtEED~lWFO^PaGR1MM z^3cmPXw8_EcImO{(q|*%HXQZEdrur_PjpI)@cMpzPpn*YIxb~sokmET_3Fo~(n=C& zkn6m7)Dc2Yx`k9^hZZ(}7E?#XM*8a?*37rse5`)n*X+Tprt;s@hO(vv9Q0#`Mzm`%m~}oasDbG>cOCBC$2g1S8zPcT!~}Q_f-n+SaxT$l$M$4 zYbZo(zYTZ-C}hV^U}R<=N;EsqlEP%((-M;jP2>IgUXrgO!~C)z7M6LL<;f3n5ozGK z9iR5(;KOqt>t=M-K;%dz&MDxe!dBrr9<;-oSLiAK9;w2v)H>QU&PYfLK04tvsrj{r zEODz#2^#s?o6?+ryvMxTxT6r$8Wz#VAccJ{%6o%Z!5}^uSCxgxyHhFcni(=1-e40} zkvJHz(GW%a>hn-4j2k!f8;Jrp(L1Md1*P=SzJ_`hh(*z~dvRPHPl6bsz#3_Z0dW|L ztgm%m2-0v1nXWc^4t9b8W*j?~@*pW|niWc4e^D_l?|0N{+<*tDM=eE%*9{7CO1fT| z5OeolLVHGlidyg0n7A;hQoOxye6U-!=la*)1D!V$IjdUBunOfK&oQU@O!P0I<#H|9 z1Jj7|N^nsYx;e&y+s@yQe;enyapEG}D5avuAQYBI#Sz3^$ zMliwcHzB6O}rSeC;uQp+VJJutDO|;9uB?vl|cJO0#UnediWt zSd2(0ho+jf`c+J*9FXek8~nXQuG1UHQ`L2T2_0$jNGala)}-rY!@n!~+tbddudAW( z&;?<}M;+8ui*#vhME+wLoV_2c?=91!zC?^IfqcfM7x96Tg>6`_`YK$JlzbkEOv#Rv z_EZ%f4Th8<`wlL^sOtM>0;Snl?uH)c1U$Ss$E+i4fMRcd=Pz$3yED97$M)VW(kIF& zaNHohi>gJKS%bc8JMz+_1xIVPi2$ zemM(v!!bU=oLOh)cCBFXRKDEu>#;8*wk=~=B;E4423%Gi7buxum*A<>oLoP;ojZh(#=H+}Y)PUuEZ}w0mizqL;Di|5A z<}r9wyXG+>nfk{6&f&AuU*YwfE6W1woe3iAIOjU@mhKjJTwUUm$ITJKPl;v={!LY=gD;J&9 zwYbyHf-S1It-~`%EBf_P1vRDjZT_g&+N!X%>VTC?kNUn2!+_3VOOdhU=m7LXBpa8O zx883gCunj9asC)&Y$Rfib*)bo8m79AqDQLXE+=h!x`YW*^R2|BK;M1JaA8_i`jFZa z(SSONYyEBp^Yz2u@=+5-{R>B1nNJy;;yO$;2kYFhYBx_a7@co~^RRd`B%YfL_(B$@ z#^xs>HES6Xq;FJ5F0uaIkGkI1&+%H;F22=kcS^z#>&p~%1(S1~z4=l3^h5G;THbN8 zKW<-1gfm-WqQors8>dU?keKJ#kK#QiIi{&8`gF#{;UZDjMkUA!x2B)k zLZc+&I1!#3h|1jHbaQIm9%jC>)U!U0!DNPZUT(K8cx{69aCY%@6RG?6dDNT`(ROdXTFrRf6~4#t;~7o>{&!+px`1xkWR|hl!<8a}=nVZrn_69WUq8za7w( zkxv|*?3;z%*VWyRqCR@Mp7%N4czrf;9{Pr#ARjS)ZtJhi1^SHJuMFXwwVgnQxCQJKmm_pHtXO~VXB1ha(qKyl%QhVmf9h_*x+y9ufI~S><|An(h|HXNx^;G4I z9%c0CSIW`0Er*3NNq#L>>@7+jzR4H)9fU9PW|de*@8BuZdzt)==1Qc8PIZ{E({>u6 z%=DS4FuLLO58;0Vs}0~)u$28?ZU5-QJl_rqd{=`3rVx|LNhx9O3EGpA3YlfbH@J9w zr8D^r^lk#4p7TsUx@*TzQK$3$B1j(WnK|lK+37G@Ao$0+R^g*mv>vrAl1k*-Ef;ST z7Fo5QVfmNdOT*P=x|KD2L)nVY4wq7~a&vfY+%Qcw0sLRTG@NNh=7X(L7c@OZ&-U;} zI2C>>;@113V~uO={AKllV|P33(QRWgIA1LV-*4i=0n7lVXj&A zCHvMwoHNGAhZtx%rBP#JB<_N$Qc;&m%`FOyD@*F+1R?h7y#{@Ns(^9k4EEbGr+S+= zZ-e;|Xe9zv`Om%Jc#CltV`bv?(pn??-kfe$EzR^wb<(K&d1_K=tWO={X{K?V@ljsC zL*Y%y)}beBpWE4?q~bo%aB0wQUtQlttB>!^6PhD{U`E3Ket&(6MdXnBiSuY|*%)O6 zRtyS$AL0GlDT46jg2PgKbZs9Mx)ci$6)NPj_1(VW16nv?1fS>T_3*>BM*!n5moBn( z_N=dg%ZAuPdz6|ib8CXUDeN)dR%u^7t^IPOdAXz+EevXyLtLT4)%$?Ki4mA&@OHuG z%VuIKdaHL;fH04a9#v(k7tXle-U~V3S=c8OS}!QgWt_sR0J*vv$D3s_q0<`%!Dzy! zCD%%@VJAJhPOP4d|2OA=diJo3RN<=@4p*|=JN2_Cje_uRTWy2iGIBp~HSouGnm=I) z&)lW$(r_Q;^>v^qJ$TjGqx0;4sa%(Rn8l3{GQUHv?&CCHRmc-xWgE@&y4J{2B!JBy z+=AfO0-RLUgh9qm1L_A=x7eyd^1Zz@v5{4z;N2kiE7@02ajpVH(mX3?LIk!y-<2&= z18t>TVrfLtbVzzxD@bF|V2axnXxoH2BNh>KBh1fT8xqSR{2oBj4- zD0Cw1PrPZrl)h*9xVu+?y-ht+lo%`?%%PWviltcC8ddmJ|1Yh2`^x>9<+Xt_;V62t zUC30&m7Rct&97t+_*xD)0k>FL*a&|&4(p|YypMe{@EvDiS-P(RlL~TgnXQT8WT-1g z>uaYH5UX7LMqWsfcM|*g_xMZ`#n$2z*=yBOotp}g54E996H3GevtD@t7uv8t3-`*& z%1C)QjI(Bn%Em1(aZ-vVYY9J2~V zEZLN_=J+|q<{f=bTC23vz$vzjop`N-iLUBe?ZC78|R7#JX#rkU&%x2$*2qEU3 zhXF2GB-r9pNW7NK`w@f~^HBO(saHk`)J=P_H8ZGxd<6LAA=bU+xJhcJTZzgo1KpSY z^60Pl*7&)-wC2n+!b?qtl~S&ku9|e=WZ}tPWL<|`qP%WO*I=lVX7n@Vn$uA@I($<4 zUE7aa@B|l~q$T~IuYBW(e2I~`-n`+fX7`;&C*tAZ;Nb+O4CLbj*8H?Qyu2JdaarLn zt3|>+5r}xWIo|$XC^s(;$6EkpuD*;cMS^Xq$EFF576g;xh5dd+MS}l4o#ZEENoyJ) zG!cM=wj;6sfI3TJ-rLgUw|n|dg=x&9MnRh$*V`K>>U^yJx~k@26(-nvaP{;U_E-{e zJ_LKJ%XoY!fYm%LiHWsdR2`ao3Pc^UZ9Z;$3AN3^>;*4$AAadRUO(OMRQXr z8mxGIzGm(w33C#TIIn*5c*|Xp(fwEgBQSSM5)oa{+Lori9-3l*{qpg(-CAqv2!2NI ztzZSsc!l>y3wr@i>y2jyZegVDh@Fmy>HMwJ*O^oMAB*#_deza|2;hAL`&!-G%hPj$ z;h?sp%h%^u<*>EfRnh9%)f;#8=Esp)vG1_xA@=sx^oAY6g}d1Tx0TncwV)Oqsf@O~ zI@|7j;tS_L74KVN$)hnt+H1jLW4HQ8v!mWO!$%oUx9c3qk*$XfS&KW(%8^||`8)k>sN0z%6wy;5O?`=Z2hd*uJ1G;Tq6{}}|Z*$LDSa%P-qrER_I5M_{Gq#Mq zuiD1kLGCRb_XMk%Tj0Xg$AiOqp0@ka_KfLzQ_sgL*xkz&YESe)@2gqQ@@|I;&D}1X z+O{Lby7Y=BRbcwW1DMp^W~rL&dE))W`(xrimu2IuYjLAS0eQ-;YVBT--2al z>n6V}r(If+R$2SSPN*!}U?r!hwfwbHjyX3+)+SE|jBM<%@wR*SImFezg8VzLIWM-1 z)g?@vlCPH9%%_u{-bx9*{4)-%qutbhHAW9eDeo4kYy{H0t@4Okwz}jC7F#a%Ck2vM zwI=LQ*&Y=WPhrD{GK^=Ns|?n6Z$)*!J2z3huG97UNkfgOn;};G5E2=c5&7^%_lU3u z=K9kum$acuw5_$Z9v18@LUkzg`tf|0#;W@KqrSeVzsJ`F*Ozf}teVrtP78kc zf~}e%lXT8mahrFoPOSM|tv)+nnpRV~3v3Kolw6 z;T55Id7p5QK7060$&jXqy7J)IGEu=aV>~Osyjskj^~BYqwoIdm`b1JNP~_XZZiCBT zy0q2CTb z>PTz;;91qo@`=xsjKU_?anG~;SXZgM9dV>CEsY&E>iAKk*+d_`3$l>edHJ)E?xrbBQR$_BCjuysQ zP3nSkN~1-{p+^Sq1KZuKn$o+t*)q4yhqkr1ij~AikBikRebNh-UtTgN;G!`!$>WG5 zP@ZVW3{YSF92q1UL-9$M)k7DVoWl_bQ~65^b1*q%FV^WGu!xGO?W~Ct)kha`s3~aK zU&v{n3#INoL$AooW)D_+0>f)wlT5R!gGVQ7bAx{HGVARh+Nbd#6_>#dA^F^>Uk#!> zoZYVD5UefTDXXIr;H_61n*=mR(TJH{_A^z+3v z)XN-UAHKHE^JHj~RQfV$);Nnq@Tp70m1$I`_sSHAFPDq_!pdL<CnLRUJYL#D&7lTRhH(E`OccTsx#*zy% zOr8FlN}csjZ1cV~W&%lsFvJ7jl}MWT(a|O;*4>R0Y3@Z|zIp6Ym-@Wa>)HsK`N`2* zJ@z1H*|iy|TI7=D!-LpDB4*7=?C^52YIgO>sDu4&ht)v-9zoC8U$uI}&WQWS96eSI z)rT5#3t$R_<@EFN7t}~r9qtQx?gw8i=@)%#7O_jOJ6mz*NlI_t!)mVpn#1L}JUj7r zlF}M!EPwe}04cE1L)8kMM+_I)erR9uu0^(-X;t^rBm|%!pgDU1(aiojCP&;KUZ`UWS;C0lV!Ro)&fo=wF>+P?_?mzf^g<~CwVghEheP65e z2_zh(wBKK1NtEu#9+1NCu^#{O=1TD!dFFDhy(J?S^Of-lwm6Do5!dw~34AS)cQO}@ zOmEb!Y*_|`c+i^Sg_;KMK2j~_XmLXMlPK~M2N8H|QURjVGd8G4>Veb5*rz=#p%<6c zA9!==uU1EV;cg4pUNW7~Y1+!D1)L)qe}C8|K&y=Z5<1L}l53r7xrvevj>GU0WB9Ro zC|wh-IV+{p=RAGB^w37R`qwQw^Qg(pp(+4|&te9zO)VjY9f)!JKtQMRm8zD0phI+kz7t>@zm zy3!Od6mOyu!*2DNo?lke#T)ZJ^mf_d%-lhLR81$>bE+*w^wEYE?3KRhmRN)R?1`+a z<7(ft;&9nUK`b3P;&@Ll9`Whg8I@IFdzyJG1&YNS8-3LJ62>6vgrJ)J|DpcUM#Y`v{n}jE4)mRV1DNkE24fSVN)L!jk_G}Vm!oy%stI?G=-v% zcguNwaP$0C+MY=WPA|4>UitYkJJTDh_noa@}S_v&LQ^&3UNS`)qgXofjia6yoYl|EQ zzjf4f{KbnS&BaWqrt>}dZu8d9HU|ObF9IqyHyQA%j@q*ZeX@V7XKUF7S7eTs_mDG; za?ci0+L}zs^cde5>7zK_aa?Ggi~Gowd(q)EJxI`6_h|m0RjBLoU;*~7-RNd4*7zyx zBYn6_15Z1KO?i&#ZC3FbM3w;YmjCAq=P_Irp3|MtyJef8%)Xuvd@+y}z z>;XHjtaW8gI74vcNVu9elth*GFW7%zDTKMU+%==o=DCcnw70{t)-7P=EZ%%_kFppV zMQ|aj8Z6`Qnqm$CfU6w`7dS3)c4^pFLLIr@7C$997Fo))L(>Juy-?wjiEW0VPyAxb ziWeQ0nbL)n4~C75r;^wZHgEIOH~5}b+)bNOgZ2qNA2>c$CyzfI7ltYw!z=B>fOzPl zMvr)FRVM+|eQXG(wXP%e@h(-hZ>m+_Dfd<#i16k^n(}IzfkU_X;mL>#YlC|QgS&d& zmsJx|?D%AcSde|PIqF3mFk1BVXZhW_GjQ-hD{+Qdg)Q7dTkfV{O6V%rFKE14*w$za z*hknaz^98sXCFvC6x_T{FIwtu@~PWe^JYl}LDZ(ltNw7!t+(ecFFs{xw>) z&J%0$#tacY9EgraIi%o#G30`qLWj@<)NvE-=;#<1oV1|Ou#viGO!T7h^55K@EVJWU zg8}{*X0!HmbP@|aT2L(9ouUijScYB4)f+mxj|(p*=;#zRZrd}rWAbF0axu{dCdzlg z;KrX}jnQT)3%@Jw#6Y3B=7~;pbk++_+R(XMky6FzXu-ol4p1@dw|Sy79i7)gjW!gT z>1;hO$%Ay$QM)`gBP=9a{jjy7h2SO?-*G{tcW26NX~Hb)oAzobNB zP;MF=LerF9NPbLkqoXTYaMFQ7OIibT(87n0((5L|f|c@a9E(T^VoS951Ef?y{KBdl zHJGj8(P9M+8<>3PMbjKN;Lgx9Z_8G^`d{I9jJMoiz8lABQi9K3?R5v3=+d)wN0{*D zvmE!_oib--j!w4}aeUct;P2wBvt{7L;_9E=SaX%l>Se%SZBAH8jLYc465{h{O~>8}zygz!?Ai{W6?jRhT~JS(zFK)`aad}%I~ zsyeSC&Eb`d-vP5Ro40$(~_IWb_wk z;Z_-}L39}Hve~T|1nT9$Ub-}gc1TKNB#I6PGyJnq zw^KcT`;bdSqSaJ@$pfzW49toRfV`7yw2H(S9{ZD6l@qDLSt*&1bg zi!M6e$8^N2Qb=dNzjpP26tX0CAzQ><=Ly4?#PR0S!*VMa6wu}jG#`E^iVvfer5xO~ zOroYw%Gj%=?`AT7zUdI~_y+u`OMM|NBv-5@z&DHDNnYN@beAe*IBvq63WqMbXV;UyDk<7M_zy~7oJyslxCL`$3&V=~OoFCzPNB1ul&Fso% zn)t{6=~oKso{RlNMxbr5h%G^149~j@OC=5{Mf>kz4>qmXV;KelWdl*_LLe ziH`yN9lHWgyUh9WDiRG@Z2TWBksug3fok&fTQBsfaI<9mT?9UQf zqZG0%B0K$St=Tj{tF9uqiE4z5o;^y531Nt0?TLr@?hvYDpwIU>0|j&a;Ut3?MX|Ra zSwNOL^6JEggBcr%2&%&7&uJPW0q)tB@jP-HcuD z&C7LF1%CaLmc0jz&|>WAW`bgSQH^6(?d4cS-RRIyTf4G`+(`=&m;;7G8pUmkWMB zg$(mUc9>YXa>r%&C?1(H7a~LGYi8rsA!hf6R_b^g$xnaH0>TxD;ujEKFb!_h8u>%S z_u%0l;g9j7IqErS+0&}SnR&{I2q+NDx3#%NA}leC99)P&6XBI#{g*{)o^V0DXrJVf zP+N-2rK5EqbTK4{Y524J-?d>NyPrgK>_kfQ@*onJ*Okj8H z{ScZ+eu8>9HyDvl64O8`#ZDnQx=KmAT)dl)kehlJ_^$-@1PX$9iMbo;@$Di4u;d9q zGrVw+Z^lZo_+CN>k26AL)z@bI2QN&+p**552oibP-?)%v?M7d{S%tlLfJ7KVN+iJN zbX{44XxPEw@3=v?Ro(R6BJ|viU1TwJA_ls2S#&YZHLTj`1cvi}-gomcaSK|J#T2N7 z!q?8sV%ro1Tu~E|H{}J_L*7BE5kP0ZUitg?z6;!Zflonpb0EkCMmZYuB+r7zn=P68 zn?M4sN$_XK`q4`DrC=J4Jdna^*8NsE8qXu~@k(m?4GK!~BAW2A-~9?SWLYA9JNNoh z8A%!8^?~mfB(Ai;Ax5Y-92|&K=rkfk;R;XoZ}su)hNG}(1VLx z+pmemkDt}+~4RliA|C0yW$n{CqFz$&q{ zWd|{MpZwL2IZ*awMcT3&e-p5gtQo=Ml`s4@@4t(Q< z3ipaq;3Q`)8~TE|X@~mPm=KYm#-ZAukqVbQkf;T8x~Ss(lkGYk6dH>zA|9+x9Hw3S zC=EwwxoX!PM##SO|IT4Q^GgpT9*|_&R@^n8!>H{o zHfQSx4{H2?Wy2{h6?3+R?uu0@^aL8>0>AkKZ8!8saqsg+qt9Kuz2HHc1I>c$cs4ZZ z8X;Y1nsvQ!yb!Zx3c@kktd=&wR%+Sem$+Z|TqK!qZ!kv?EJ|L&PfBM-I=pb<^Cb!b zq<@1DgN$A|!jOQ1q3Q#cGaZgQb#WgTCN_a;bj_m2t3m&0XOCW9Ug&RQ)+qe5zf!y; zpi=riab8FvLkax#1SvUPRMdsetx=ZQBn8hnSypVb$2TMfIgjE9Bw@(6ch&|{aUmT? z2dE;rB?AH|upEg_nd-*I@;{^i*kTNvuf9k0qQ(DtI6^LvS{V5r30y)sN^$~y;oR|( zn9m3G=172(C>yIM`+zg=xfPp%Kbxr78Kau<6}~xMC9&==sGn54U&kSGc;z6a(gc}) zyg=V~UZ}cpq=0#Jp{CnaJ{gyhe*Gabnu7k7BFr4GexXx~)9~5n+MQhANgzLu%YgD~ zIhcbQqOKk3W*%*}_!#^$Ji318#sz6CwSV$`zJz#+Yz(X~mj?t&1@Qp3GB!R}q$^KrY+putqoT7&?d?wR^m`Y7| zzfkib(^t7MkAV35uYAu10uOP?U=!>mgxm{3F5cmb`|sI*Q1bH^#L1Zq!&f1+ZI=Fu zZ#X`SrytPJE5!#jqgQs6qjuq|-)L+ebcdskB zD@sYC)~*&Q=t66jd;odv-zY5rUcYu?H*2*!iy zst5XH4_&0P`E$C-6@Q|Qk3l?!qTgn)*`a+)V#Gl&lTfxr6~P{E2}4qcnqg-@aJe@l zp!8b%`AcO;Z-kp^e06uff3@he4@_9)EIzjx&w0Kk4CoO*CD>;d>c zdom32lY2F2ZW04PEiU{-Oz=-3rR8@_4+sDoE#g1x?(YEm*oTFFSO7rW8tV%z)1NQ^ zCr`$nU`wX5id@>PX!vVKFqjojS6Turi#G~0?&gb|IR{QtjKR+^WAHYtje8?mdLI~7 zHe)J#o%c`I1_q3EWw-#qW4jG34hYf`*}s@Hp=RhCtgj%2ydICNNI>H8L=1xm8bSVo z-@O=n(1zPApVLU71D4$eh+n1Zru{2&$+8wc$PV+}mfy)>5IDIP)9M=wAm{=Z9?|() zL%g&2*#l5{eZ>j+5fAk-_W!4$x1A=`qpS4)B;FYcSO9g&?AwS#%~;A_wgb0@&nj@v zF+Ds9fjwVi3kiYhHxN7tjKJDb-%78WFJT67&ie7wMmrf1^Bo7k?{3&GjdxaochCosz1m?2OKt$f<^ZsWm6Z%Y^b?Wl}sDSXsniMe!w%U&2LR- zS}Q1SdaMov`5fI=;i%pw9F(taQGV+Qgtv}75%)Q|i5VO4alkpz6Hhu9A{*m>lI(IA zdwBfZM7Q?sco<|5pOByzrvNZ5>dU9#73N;oa^vmDH*aZ(Dy;GSv<^_@Ii?Z zv*bgX>y)LEJ)7Xn9QjOzwR6_6Bu9Y&Eo7_0s8ULhxe4FZ6OZpPZnFZO6FNXq5hB^i zUk^l%x~o>RzV1>|81^DDLnEuIn~PUldsXZd3=(%;6~qq{82#VcbZm+%#+m7t!Nl1x4?Cq z1io~KI;ObCCwGPOco8g~hQEWgqd7}@`*x(#6T*C`nM3c_=Vsx1MzVN;^R@U_+seGoNVA{FF~SV@CCPR z%`gE>_!8g0>?a-w8}X&pt9MCl50V%gH+THir6Y|uFP=yS(w%PBErU&eacWZPAJZ=t z{K(#qshFvrt-E145CLz~^W_s5th!*?7d6o)pZ&e>zPUN6d%R81(S4Y9OzcCwlp{3g-wDELGjt4^oW{hu(HJz7ED$ahUUDA3*bnT{7ef3HJU^c&NiCd>BJ{R^Sn) zLAOGv-<>a>e$?eezJHw{Xmi`ixnfhucKu4WD6 zk=4G93}B?k@n{t`FdhgNF8Bn_p1+-&O~9&r`2jnLJtDo=jip3cGB}1=)V5K-bFWA=sG!bf7GaiOg-mcfNSkAjAQzp>VTB%4UCJ=C^ThmHl-B0Ec4#hIVm5RGyIZ|klaJLyus%j z?1Akms@;a+Xa$el>uBywv97n|nG>GwHarYdG|&1%3k(Oq=r+}6D7c(NdK4i3r2E|^ zoh#eo@1`||flo5S@sbHjA-C?b!v(&gK=|DWY{>+wTodSaP7dl#ZH+`5&@1x*_^KMa znxDe)_Y#^NQs_9RsGU=M@iH4zh3m)(+*rE+-FU4KNhn7-V`$B!LkfA8e*H3_j7hBI z0xn-gkCsf(!jt#{;Z(L>T887l^DE3xFBW} zdE5LvV0}CJ1u{@6iz$$HH%m+lo*L0+pMck04ZqmkDc1I+*gZVO{QlRBUz^ocb+7H` zV4s9mW=(Gj=1z6QMxNrN#7<_O$j0S!n)kOW9#iuLrA6CJbXF&Bq?xvF1>LUqy~5pE z3N{yQWo;g-9o!`4fj8wwcAH;3ebuSigdM%Op#E~Z{qd*PmF0*)&+pB$Ll@^bjwTxT znK-$oPFPd+A0k3%u0RhGfw3IdSE&r84`f-umHr3Xm}g+>8Ss+h()YKhmgo8^o(uqr z+W>GO(BqHKGRy_QZqI&c0Kf%!KnmaX0q}3rP;{idR0D(%u7dBJofhXj|26Dx47&hp zH95S{#qX)y+j=2TGa5=%4X|4zc{_KwSfWyYzp#(>| z4_TJ=+_O@Ue-k|ze}OsjC9PCy?bxeRq;9ktt6M@mM60y(4>WrIWe(}UG^o%f!K4Sk zuy({PAD6RpMqu;;9^&Z4?UBMoU!}oscnb%zN^|Jc^yLqYGzEmIGV)1OJVl&KZkR^~ z7sx8&AJ+okvte(o*fS^<%2I%ezA*)r5?wMpOt<8oMaX2Gx5xc4A?Bi3fTvJeJ7 zo@dPrn=GVMKOtD*v-dyJY9s$Mw&zepX3wUIGg7h;<_T^9%l7iNd}@iHM^3zW2zh!` zdJ`)8@o8myj|=udiJGvbwjw+Dk?dGxYKO2&D zC6Ay*=wn$5f);AUZvKmd!1SkaUwZ!wz!vh8km~r-@F}{;W*nuI|6^WdgUXS@1vVse zS>**wP5z?=r2oU0%%8uM92s2B6|Vo$wA*|&3Wy7K_-8Qu9FV@ZJndCoJ`epcK56tA zEdok=5T*!qs9f{46+T&cUk(Y#B~ zs$spQ<$tSZBv7P}KjVupn#%8&Xc71n9b_Yp5SST?;oC`aed3z|u%!P&Z8|6LeB+-g zD_-{PBz{(HS-+&A4}>$2Ck_9d$EQ~PZnOwJEK@;x<>=8bK+zzwE+7DFzd$Nb4qERQ zAX#lqc0hoBy7KG_{%;sFBp?d9-KA2-`Ug}0|FHc_00#L7;b)bXkpSuZ6Ugm8Q$M>d zx6-VCc<*mvZ$C-I!0QW?^`8hlV05BqV4>C>NIeTb{FyWUkI4UU5V%Gl07!TK+27PZ zkn`y1-|D$xdy9L|Is)dUq!GAbJxADc$DXN!70l%TL`tXmZMaz&DJpPmiy{re-`?oa zmrBy1MESYfBjIyfMDrR4G}05+6bCK8i!sv=~*}NKf8I3+j0Rlx* zfS`AyN5WraYZst-&aLp7!0>c~7OZjuxY54`+)C-^G3jCseys)@4feRZ^LXDmysH{T zEKd~uwDRF$;X-;*AqwPJy*YV(?!1J%BUf>J`jKWcqR7_t9G3K(|Bb_8tp|%|&SJ*h z=IW!@-St>Mrqebt#zm6LP_RRWTU|7Ck=SxVP$WW$CLz@{3Bjv(nY+`bNq&i)VIsUK zKq}3yE_#ROC;|WGJFo=>^hkSvz8jFjnUnq2lMxus2wgD03U1oaahWW!gZ8+9t(c5@ zO*Gg~au>`HKqS|<%zAl5LXaFJ5oOH-Y#0JTvNN8ywnCZ$#8UvSO5-trCd8q48JsO_ zSBGb|hu88BSqjSKxnV5=Le(Wi zoy5e}W_N%3-ghs9>5C*UVAPp7=&b$jO39fxA)-JUS)rvU9-l*LV}Lvvo~!Uz`K_cW ze_{82V*NRIF3z||wBSGFUwsPFGjmN687{e0qCoA1|I577;<@4wVW7_OXQti{28RBj z_RmpAfjs~Js$u$hH$Zt(>43A@a|=~dfVMzWpLvX*>m07vl!6NXD-Z~P$Nb#f+wdl1 z|LH%^?J|G1`2~1fkh=__P5%i7xZHtmD5L|;ebxm#KBKwMU4Cx=xGB(n;Kmhj-FrL0 z0hIrA(F&XisGeLK%FinaaEJQc;XfkbHB17G-ZNlg{X%Y2+`qm6_kUHcm{3RT4{e+5 z&lfPKB+&}o34NO4-~n}NTX=Lv!$Yx5mVSLT;S~e~j9v>dS{Bbds#X|&Vn?|b@T7Zh zh#GTb^^xn46Go4&@zve?Z-T->2$x!Sf8wZdW!;C2S;s_|hC{x{oj6i=(Oi}&w{hFT zRZp!7SQtx~+rb5`__>esVM*5}ANJ0I-&gUtwr2B|aXMNLx6((vOhxe@eUd&L4h_qq z?m^pQTkMG?q8$!9$%rtb7s6=K)mr;LIHUUg>NZhmWgQM=6bQK@#f0fyV_3A-i!>*c zfm&NX>LlSj-lTjW%$X=Tp5sG+UVTMO4`2t^u_%sEhrOaxYbbA*8QmO1%bZ)(_lLk0 z+1eLu(@|-UqMGJy+nJ##930YaOySWUE^fLw4XSY9Zu^ji_&dUGbPh0~V#`XBK2}s? z+#*p7YHkNdoZxc%yTEO**m5qNxCZK4;uv1$+>(UU3{hsud~7QOSkEo#`{%=%lXL0? z#Kd}211H#Bw>c0rEL{<5h7oPE8o^qRNZw`9)=G+q=N9? zxto!Tv$n#1UNE_F99{?~|AFg40miCOcOpfz{QoPUK^Lzs7?tCaj`SadWvMTB>GPIS>&ingkvgERb<)g(f8QhfkCiZCH}*N-J}v2=TN@(j$stiC8bDCxI&Po8liT=awC{}>>-zyyYsox|wuxIQ)7SBtv+Ks3~D&W!adv76zQf?1# zA*6)_`Zg*8$P3O|7v@Xxu^p2>qR+ z2jDYxbG(}uU0LPn?*0liwaqWwLPRjwadzaxm=pd4RakO&6j>p!y= zw__f^Fa}Oozh7*GE2J!*0Om%>I)8D5fjgj#XNwWXsdI)iAtyU#hr5WCt1DT-&m!d7yNE99Nj$=ArXGiv#EB~etWR>02(rVw_d*^?Oxn>xYRSRQ7@u= zy}NX8JLR&sdCYjf^(JFQHePaHn%If0Z;G@_;Qn4wRi#MC#P)h+>aal*bjW=Ffsf=& zvJ_R?lo5OY(e!nTbrX{Rrk%%oCfq8(ZJ zM0>ceUeZ~Z@1~`gE+lmy{Vh8}u4JiWN{SjfxiPh{U7P0W#lLEzdv?QIf2?6QLi#B| z5o0lVyxN_!N4+eKl*L!(eDK&!^i7}$oQTSXeP%*E{1`0Vs>d|zNN1jj5d`~3ditwV z@s9R5hMzn7UcU5qUHqyjqhDQu>`j0h)6W~r+$>OUxd41YMMN0;`=P{m32juopS@yi zCUX+f*S1X&6HT8MXs`GluDjc|S;?Ewl_Fi(IB&}dqx$C+;0%64GneLf|dW$w)YjinK6G?2mmQXSoULHlU9B z+8^-}F*uzK0~cGZkm=sX05ffPSVF4-lPb$(q(^pW`GL9%Y=|8wLa4EoR>elj z4_82g5^SlXKcXvG>ZpX!+4xOIA2==pMlt}A@C7w#;ajK5TCaeu_nE+xJM75>_H_3* z?AaEs8v*lu34ZqShJV#-VfFv;F1-7D0f3BQP5`6`g~OzDvmXB^n(@9S$DZJlZ3|Qr z=T=Jcz{1`S&aIWdA<^=IIKZ!?^grxTV{q8obFlMyfRWLMox>QLcV{q}2e2PF_HDqI z?2&Kkf1-rZfI1qP{_^zy&pk&Nc5$AMrHP0x(lt2eTJdSX((J#Hx9Gu)f?P6A{O9p_SjqJjb}E3|P)a)>`d& zUcJZUt2SR6o?3tOKtG21-VwCTR5IB^lYXTC_(Lpm`Gf>XbTKkkeO#7sqGvltIl^Qe zJOoeNRm*+wh$*AcQ$Uf+Q-GjMmHAzzdPi`{hzePH3l;}q0;uGB<$^Y>Pa=WDnV|PF zdkM|KGOHRJ>r9v#UMybx9;3o;DL){pO|6V%b~110iREw7p-YskhUM(zv;|g?#c_d> zfj`h3%!Ry+cg}6P(pT0adS>V%P#nL=m1+Bg)CU7J<=c|j&#PuPVj4PmA>x-4Y!rBH zZ}iltm1&~{H2_3W>&Sxy)Y4mHw#b$H{^WK<9w&ed7@d#_-P-?rH&P zMz?J?3Am>ao=lP2H5_pH{xxivbJ#5zMl8jzKAWXd245AI>|k{Vzpp9$ES*ZfLDWk^ zYq3}Dv=2m$t}9@!%}C7Lqm4>%$qu(ERsVDkod0j)3K%H2^ud!q&4)ttx4COy@Dvw~ zit??;V(Y{@EJDlggL`d~ttUB9oBZn_{l@wKwEW~iJ&Y84+K_;>qU+wr<`+eseASbzQpQ zqk=F-?*2;!08kKK-Hw!IBA0KT^9VGwO_2Npa@9~}O={eaKdtdJ1H}4sLDRJP# zhmdOX6|v13w#~hxqBFCi{qKS^Gs1mn2rVu=>Cug-DSGMr6wNa3-7qCP7+G9&&!hYz zd2@W&Q5}n=ywrU11Emo;ZOwp!IPyfCm0WyOhof440K?OJ>qyp>n!@eNM@j1Fk9beV z6Ois{4i6)HgQfPIWzg|PjC$ZPSEPrgkAh>NKos21#``|-yr-n~>Bz~2l6+|#+R1GS z_Iug-i9!akV8xb%@Kvk3caxE|EN3_K3Mx>z)=1$Qriq)?UF5D-2;rWNH0$@RrAsZr zk>4xwJ{T2VRT_!bdW`ORZ4;_gQ>g+bZ!OJFGZnFNy{zYi1|6$B%IJ(9h{sy-z0ueY?qpe(4|j$NqhgGMKHPP=Kt91BS*IO~ z)OWr6BO5lZS_XDA!a>+N0QBNkYfWXlU^4IIUF2)F!D)u#!BqV-O$c8MVnM@ zHy3}ukWQUp99>_Pl}1dT8%r*-~Q9BHI*S)`f4VG{P@9_L;eFe!)U9x%C_R8HW3v9R3T875&&3 zpyBDZ$l~9hgQ*DQZG6=yO0ftfMPq%2 zgjo}}t)@<8Fx+IjUN3s(@OM5=q?3$z-|GWNW^fT* zM+wffNfLwk@H{1-T7p@Tjccpd^VO|+R9dl6`GPm<`1^{2IJX#*%EOhCZhYSs)PfSz z*60;S1eU6}iNQY{_^XtrF)KfSGq4?ewey~$o7V9Q|H z>k|BpMCVFlIzdO2G-mh*`D?oV7|L0J-9KPz?DvTxEYP*6=0gSg$}a&W76%_<%W$M+ zcgQpO27)h!e)x)d3XX#(M3KdzPXoVy3oiX+4!sJI%Kie=bp~wug>KHRO_<83;94;C zB^bHN3$DJcHo+#>iN0Tk=F4!jtpb%if&j#zm9G{qR4qA$vY<0ERZ++l1RmaoE}$=^>3GYZ;n*0z=U&V8w<$v*CY zmIjwF@0(aPlBRF2kp|oarK-+>NrU!1x}FiNsE#W%xFLm7-wfU;`V)Qhm{=Ifk1ew{ zBw^KITMg(8M z@WbXx-PX&C2Svx%=OfQ_LfT-)}|?Oq}%bKHI)}0gfGysmrYeu zvG8zw@vNndq*9|oy?>7>{1Tj=_t~9W-cY%tz^-H_^BvsuXs^2$DyLz-%H{?nw_x?Q z#Ot%wRH!9k2BR=!zXp1kr6u#71ZXLpBm7kO1+mBudxD|Cy@g%xz;Wg0-hWNl4A1q! z$ChW$oDK@kU0CfM_Lh^STQ}bxHpjTd{tHzcY5w)jj(NIY1492RNKd2(e%=GMfM69R zLg1fV6A0z|WSED6RpxV&$}mYKI`&y^C_G01Tnw6;5@BKR*hTS|;If_DBj%V`ik|7` z@>7Zk0|cOmvgbpGDkBWS!Se|l>R|)Ij2M}aLEZ#BuH zc0`nYL5#kZ12)QHBP+mIiPLo!tyo5&_E+Qmd28iNR0WyK9S&Gq6PSj=t7Il8M+djH>ZGxgE6%Dqbnd+(Lp@ZGsvCF%HfpMgD6x_k zD>HEQyd@wbHZ1jp4k91qX>ryPFlWb_6i-2F#JT$ZphuImjpdin>%Ys^NZOoQz3XvI zXHio*PbB%$}OH4vJ6KwH*r)*l> zMl5{8wA6_9;QAD{{s}Ud6$9y~fkLbld1fY=L@NFnyMbq7?0x0BGiD*dqLiw$sC?$A z_+&ao_I6#7ZCt+;ii%-nOau!H$JF8Wf`nqu!||(<)ZPr7?W5Lua_EDhpz8-LP0EjL zrJCu;z3ymQ$ZJEVHAcZNQiI}VKPm>|vuH(^|MFF+;b*z|850gB&%oXTh3%foA;2u- zy*Yt==JdBc6CxOzzB2t8dUQCAL0(h|2COt101klCC-8U*E1|UFA`sjb81BUCp5j1x zjnf(@1RuCK)&%lt!3fazss%f_U}Uzi9rP4@TB@j>5~0RCraTq}B5?LP7GXavRB4Aq zgg3g?5|QA_W0cy7L+T_OY(+jGU|k)8&r$K%@%tBi8BU+BO_8C&bd9V)Bfv;~V`<|e zv!a&6(0(8pDqr|q@lN01$t0P%f85;DNuZh2!S@GXw!0WwpxR+tWbU_i&zDS5mA?Dm zbd}hTc{fdI&EgKW-xP)SvM#J~7?P;_+t>M|(5ffwQz(XWS2n+sMW$CDw`B9OI4PWX zUpTcd;9=Y;?u_Iq5*mLrm(7HJ_qL{0o}Z~_pMs!_O)3B>XX{tteTzLk_qgm0e^YL0 z+^INUB+{Y1h6W8L9t_xY1iRXy9*2Xz8!Sr2GB(*)WHE!|%#h^X4*?VA^TutqUld3> z{0ZMVFcp~mZBuYANuv)qJ|utp95MJiyDt`Ldw;7(Xp55EolqSN!SYuj(`|dz-hroA z07txJ-+WUPNu%OV1V(UUdY%TrBgm!lv?WAlH(LftclidL&Y}xKCH|nGQnKBUleSa) zPUx9+?RLhk6OOF6y3ZE7&Rj8h^ZUms4b_idZGExZ3K87(X?U!ie|qPp&JmM^tznx0 z-F!3KpL*$h7v{tjKVM>+zHQY3N2dVHre^u=cdhmW$(^q`6xn%%%7hfl3hctNl>f+K zrZszdhiK9p7eT2}p@}xIkRR5XHZYKrfhJeqg2pHct=Ta;RA_XlA&^aJx;k9Mwj5SB zAO4SM+vt+ROQexph!YTna;&5m@HMSrt0haJa-aWI@_sk<-ou8y#Lh0f*kDE=={b^a zf*cqPYzlP*I{ZT~VGez|Kr@3gudQ52k>to2s;UU|cd@y4t`)E+AQpn`QZ}%$3-8^) z8y-S9(=IE5N*mps6<|pax(1>OFWBoHB1;cVmNT%xtc=0tIP#{-h2(QsvVjMeu}Ty` zQFO6-0Kz)aAab&F|0V{Yf6tQgQ^nWd(%EK#47=oTJG)?Y6V-cgB#$;>d1z^9EpZI^ z8p1lv7Ac9yB4+P!r4G*08&UD}A3|OI2vLHaEM>qI=R9y_rtJkMWm$$v(e33WH;0SJ zzd=S-Xuv5px@ON8qdCa~iD5-!Tilo^7s6>X_KbzoO{op1d(5K(PRXyt^a5sd`ME7G zdiccI2!nheB5NG0D!yXnePe^;QGmH40uF;J0)uaSmj+Gj|4#`rfM@vTw6K7WY19+W z0QXh0f*3G={&)78)Zr-X)w$eb+?Yk&{7J`6Da-x9b8fpg6s`adP?PTo*M5F`w3 zc3!5R{(H)l2hPj+G1&nTbS@ctNcwNvx#S{JmqrzwTlN2z!BtH*AaR)g zTgtUiE;Rs}h=6mN0exkR>XbaL6Owpu{Hp(B1yjWfXzkYC+k>{^6fV>91Xq>XY=X7C z&_PE=2nn@fe#SJhi}l^7Z+CAh&_C>aTHJ8_Na4>+Z_(B;^=L81UewBa(t>6{bt|g8 zNlW*LSNcs(8{D67 zJT|kz%qOb7K5-vAbg8Z1No&^Ho7*zz`2hu}`$Vs&ops#4;!uHiust&ZkscX}OG)pP zHM~dFpFLwqEGhdvct%Cge%!@4bK~M7?XQhL%Ew2(QNG_JmkVs_;Ya!TrWd6fjJN&WaO3vH)Wbq*FFY;IgGZ$s_2%G5WxU*r4i^Q z=O?eLV9K4m8HVLL#fkQXYq7Z63!giz%VLIVC6vOs+i!EK1|v12GC05;VU%HoKbWRE z_;g+Xjpn%6T2}&QIx1O9JVl$AXv<`DWf3c0sY%>i#j$-YYTXC^c}DisOKI>D0|yNI zg>bvsIO)i3$Mfd(L3anczET^<0>saRiY8!4-P5E66DM$FGsdPrUlwETi{o%r;Q%*& z)U|Sd*wcSq@R+lHw#T49kZNlbNz>yYh}%)3?Wr%vI&=E_;;46 z$VdK{w6Bs^&{Wopm+#<(2;Z+@O8-*j^oke#wXFC=mL>0G*SKCTqifqu5j>0wJE5nO zH%VDThx9#Pv9XR_v1|-x{#bsS8;z#_RJ3UzG#nmjb}V^$Jq*N1t|A z6_vi*z7LR}dZ4@)NP{9Bjg>qiCbzASlQT!&W#$unxiP72+TtbgQI_fLJOpk5**-Tgop#S?>p_(-)6i7&n$6d5x?%E%+6M!Q6UK7er1zRU-^&q|34EDGl5n`B`}k*Yr2uGLkFwSD$N ze*D1>7Lnozr|2TVb!K?j?!tu-{!CJ(?N!8OX_P(XkBoLk^7d46NiT2}2KvdNxp6$3 z32^O^SM=q{lpuqFA9&uxaRc8NiVC+MBDQToN57a=CkJckN^m6?afrfYZ?^Aq+YZy_ zpZcZutosK|{3Iisgwmy%?(^l{pFc3G#t*9>JbZcYVP{#zlXhcnZ6{{`ONDH0^Tws~ zo@-kHPw#2!mVTah@_VKKfHiiLMYAr|tA%mb0{OwuV|5WSoN!>yi#>d~w7awZ^vnG= z>0LZwXn*;F_E##ZcdgM&&E*@MQVeu2vq+!N4m0(wg&p(?NT32Gj~ME^!Vm`f$$X?l zi!Lhk#L)Q5B< z^iO|$LJ;b+opwmF2O_oOr6ceIFkDc&5+C}@L_t{OLZ=57OJYGJ3l#rEZCmr8)YEu%+Xau+ z>)ejlDf*$Ad<;afcJv~=*Kx{EpPKe<^tsCKn}RBeZJR&^tRIy2Q3#Lx-2=F@@BR*E zzybo#s^SbI)5PfwUB5w9}mnjIkX1#?E9p9jL8=x8< z_k@^X24_zfUi@P%^7l;-OB!aj&NKsR+VsC%fA?6(GBbCYthn-{Yl<9=zq@T^g5-PzXVk2 z9)+FT)k7+YdU)Wv%))wJqCyWp!-;Z@s-R*R?I;Bw1_P&wuH)InTY50An7 znl0+HU!w8%A;R#d+PG8iXiVIjho3!kD%w(oBHy7K-I+i1Ej6bd`X2476FnI!?`KaZ zkTRMe$EV@5`iX<;-XbzA&c^d*7<;2N-DJGzrNk57hOfjq)PikWzS%pOy;J@6gx~*JfNx&n6wn87hsJz?rLr3~iX|<6)SSRj`O-_Ve zxnA`n8~k=UKSTBtp+M7;(xnJe)DnrIKL!NTd#A^uZP3DGQ)|J?#$@wPEgzcsr}Q>A zqb~su)3hcrtf4c>hzmx&NDLuZB}_z)2^}YfLk)gyf8wy_O0KXv1)8?JenuP~X~m8j z9whmU$osY##d?Tg?%E&(Zs@$4Oaj3`osywH7_j!HO;=2v>mmb_Y@RN!7o&}G)8&82 zH!$cjs%^ImpnWBplbFev`-+41-XKHQh6=7WV8)&VipcSz6`{capDbkhSTc*UKl0Ix zZN;l*#zMj7*7h$5FssD<)}m`qChhJ*8a#XCP*qdg&oC-n-Ntjr3L$TJRiZDf8?1b- z(T;d(n!&?kp_ua``;#0gQj_@hYp^hU_RP&wj#uWx#9+Pmesi4Oi067B6Q-ppxtaS5 zLcvqlY1>*JG9u@tN#BTTu9PQBcW6iM$|>eVWP6F@p#)o-j_PT7E8d@E<*0RE>KffO0N6x2hN=xfk`S%)z!3LMj4M^l=^{1c_?aIpn6O?CG{xNV zYQk;-A`-YVXyuhgZ)9QeJpHh)@UJxqcd)-keoCeM@JNDr4h?(la7^L7)U^q4BF3Jo zZDs6va0GIDiQu6qCa->$!&I?0yUdr%F@4bfwH9dVpS&kwnyH zGlF(W4G?Y7`!)#1ekaE#E`IjU*9oYhe~zt_P`)0h9iYPfw26o&J-GP<>~vE!*hD?O z_Z?l}zp8#CKs9KI@f53kV+U$flkoL`9zn%;`#VKXuO3n%F}uYQ(7vw7`p)Ln^7RYz zZN4Xd-Rk%Dy0v68SGXHu=&vx=-n@Pggotw;7_QH9k9eDZN%#Bul4`4OfQa(L_Dei2 zycu`=oI_q9<+>PoT$q~ba}I1kBbr$$NaaendbEv42rkm2x8!yx3PQOx)4~c$=L)Ku zFI298bx;ee*n82UU>*H4f#cM0_Gm`KX;b-x7;%3S zf-SI*BR_I7_r;URfG5OGUgtYk!iz7sr2#`3!CWAoz632*c{et$z+W-QJLf)&<77zk zFc{587FUBn9}kTVVaP+3V&|v)8A?zU8!5py+x8nW&E#FGKs80f(JheRrXfDQJaY1h zAtkeY`4&nFS|DNfy#|q_h36!#hnj+C*~?cjh`jd90N_O@)q9^;QN1r7`yT@CU}(uQhUt@`h!~Ym6c+-zkrhcRFotwSl#87voitf;-$)# z&saCQ&V3{TA7Hqq61MxdN#Weog25~OxZud2Wk>nSh<{Y_zQHO+FYFAbWiZ-v0v=z$ zW=CRH;0!3AUu(Yf5$-skhY1P!w)u0N{E8Q)QD3b=ekFu=2hfiTSK=?lxI9OK5>7}0 z9Noi*g!6bTS_!D61Z?H4vu7uYg!fu4l1(x8Tp&1kv4ng(uu~0Cj?`nzrACWCKANhJ z%dxlh97(s8K649Mx<5buiR9E<_Z_Ly87_{lLs;bQX9`GX*|Mn8!0l*m!29I>_xh1# z!d_BUw?64)GWEiTBj3r?3(PSp7qR7@mnVHk^hSKqkMMs=yX+K3hqL66-*Dv-LN6$Y zOlBbA!TtbQB(;Gg&e&=$BYtW#O~Qvsp3@iDL5epev%D4AJ#PK54Yx@;tS(^sJRnLT zUO>6|X<(}tirt{v6;zDZA*1$S8)YL)V9-gp>Fw9x`jI81h6hJp z;Uqtce#oU4bf_iRU_$AV+Wp|(oDFL_0#v{1kS1(LL^5p(I5`}$qxnvj9{n^>_9Zfr zfsQ~(QBQ-%OdV{7(T|b6h)kqBC9yY`k1t&U;C$Y7AZZ!Vy!e6+Y+96tZ4(|dy3P&R z=7>r+i_u206|9M$zRwp4WtE(K=2$@z|;zxp|ery>BkO4!ELE<34!jx-*@;TRF&(pE_OZ{N>eSF%17JO@g5x)qw(NclQMh7<6 zxOE2K*zU|UP~2X%|8-9e^T-vBFZ!W2Fsf1UCtUp@hH_p2Sn2Ko@{ubX z^Xd;BooDvA`G%PW|w@y-6%>a#hX5M5!nAVUrA;)vgaO<*b)c{TULCCLr z7V_omilD;B3UZ->=u-P}`v6-(cI$Eh;s;PjbQ?6Nwrm`EpeD`4VdHJy0W`pVQWj^} z8nOeIKbGQ?9*^eoWWy2NJ96BHz*Jj7$v-)*+!Oq7yQ2INV6xWk94u_lr)7~i$I64UK8l`d=O^6!=G_ezz%7q{fR^WXU7serC3uUF9DhN?F3Ae z{U+HVbT4bXIh=G*`q-9#Z(lxVNYVb7SJzYSk?z+0f!{@iHuKvM`Pb^x4r#q3M`c9~ zJFkPe%TG_X1b=6=ag|vk*r^mOeS3A)IhFH=5xr_Jo%-fzB#fijb+NGUV}mok%HapI z$UI|@;+64Fmx$H-z%1j!zI1B^%*O9m|E`|;Q%vt!sk>}GNSq+W;1+356GOE9g#F&$ z&`(>X*K3KloRha93DV4Tn+t1i=Uwt$F|+_!ezo6jL)1;Jw{SwXXGV)Ibd1ze&i3M28>!m{}LIBF1hK&vn|+>Ucznh)9Jnj1*DwcPm|6SYxnGhN%N3<59dXs zwmy656FZ+oG++Vcbvp*L$=}SRH182A*n&Re_#ep>gM3u&iceXx&H-`nci~i zBGSkf=!t-_lMa3|)2p1KI}~q_@$}Np9{`A2}5R=Hv49N4bE8E@C_=T)6yP_ zG0W(QG2Ffb8LW+3=kl6!^<4#bT7DVgG-k^aR+rdXLqe+MJ$cctFSR=8Pf`smQ~R!h zJp;moNHGzT?VQk7_?oG_L54V4dVj5F4VkTNyyyvV z+{pPc*<0LqB}%v;Y5dhNXMdJ8@SQK5mYp2~=E;s;4PQ|4xWJ;7qe#G;5K80R6d7G8Yn6O0k%63fL)oyAu`ZoZRH78 zcmYWcFp2sKYlDTyK-&w}P63-P(7?V9KRx^hXY+q?NkAEHWG>C!jG6cx>yD8BE7HunYn={~Jy|R}TQahe4LG36oNgm$75mFZaLv&ZEog z`Zu~3&U+1HtJ=|y+US6wufW^810uMGg1#u3%b%LJyZi-Jr$}-Jz=4$N z6r%Wc%i>|6d}4)@()Y!qK>4(!*8n(tU=4ITK$`+3U&)Z_*HjS(; zdUA(b4YV42aJyK_R3!Vr!Nm~al&Nr=BiN(rya;OtILJ_&7eQ&oHUpvHzbGkyqWKSM z=^qqJ?D&Z&a0i=q2R{0;x4=G%NsRN52*5k+s48ZUK`t0|#Bf zZW7&2h*`izKB?PDDSYwR3XJ=SH!w$L|0N2-1lBmawtM-3iVaXfboC>E!F#J6Q{rcU z{ozHzm(@F;--oNKc1yjcAYUx;lY4s?% z)TD--K>y&0B1W@@@!z(4;6QMF2nH&^z)ctkH-3ffQHteHMYh4FZULJ#1BYFp&xw~p z=KNHR0jN3fjnax~KD-EpNC1cpjO7E?dXw{tDZtD-U{ZqmU>m0fC7vuE}i#1+URLRYKX*BLh|CUYYi;qR0CZJr7l9tc1XcuP& z0jv-<(pO-&38VlPFlxkyyRpwkLP}2bV(T@wVmN##KthUhURC0Qt%H1yB0KW6i% zn@P4BO@GvUAr|NkK*98xuCP)dJX=Y4Wdg*^379~pWYJ#dOlc9V{?&L*vgU-C7cJz7 z3n6S|uaFM^t$-{sT|piGm5`F_yg}Juk^6Q|Ea|^flO(E{gsX5PghlQyz9uAbEno0< zFBZ%D>uEEmW11|Zd(EeFDLluS*XI#*{$O4Y-bG&UWq3}&WOiO^RMN@fMi!4$})Fw313=M$fo z%_2cmU z%9?M|!a?Q2q1pUR5^U}tLy(TxK|mGWM-#`Tgekwn;k45Uvy*j?HIvh$2Hzc&SAMjg zP27H1ZpnN7qk`S8{i(C9?1s~dH8#7%bf56*il;mEMbxLAMIK*gzzc3>u3tTh<9ga2 zzZEn=X{tRlA9OZN(@#RI&gBz%46hHszt)fJ3a6!iYQgt{%|B&AU!4xVpHihgY@a&#W&+JGNA(05CrCT)Qs?@5 z?NkYV-3)pPfh{#IIe-nwQ#x07IK7Wjro6V6DF>Qb{QTCpjt6_# z(dpTqhr=C`=e!$A-028E&oPzl(>)u0Swz)+em}QkS9OsHHWh;Me5Q1t!;~M5PFA=V zH1HW;F0;RCA*0P(znS@lW-owVJr^BTLT_4iDkNF;!U!3aUy;HGv3ExGc4*x$b*yd7 z5i5+nGd4TcM4IUoMT4W#bF0~@U4lZ>(dp9ae9jnB)oWuo{HlDIaqFEUHX_jgnVt-v zX%gp;ky)Be=C8}|smI;x4=3x`h<4ntml$EL{wdOFaBaLnMrPSkLh+Q{-os$ zF>Ja7=C9ZkIQ(KUC7jowFDYGxb0aR6^E(s=I9Y955LUClaxUHWU72nS!zVM`i#ALR zXKyWHuG4%=%KsL(6zw3#b1` zX%BB4G*5-e_4oIj&1XY{4TqI#X=m$dw&G(|(Ce=U&F1r$rIY4+R&c)WmTsK({b?=l zE^HAwYg=wg8*YMH)2iZs7f6qmovz_J%!9XB?fFO4`k6qA!WLgeo!d6e%c2gK5ymcWvc*sF+cL>@XG5;s z+3wjZi{iSo&`vj0*KV?2KV0*}Db289Pu1IpVb)~$5+hhsI{(M|v`Q*{{>8!$_Ey-G zY{X6U(V?}|vZmL8et@*y>9_sew3C6e)?c5cKleKMChm#wtvcjcjF}&~MO3_eELFag zP`PzTw%Y9FXK;8JGj-hOgYl9SJiNI7Rmdw@w_H?z6z5rmBd!NBK5!6wMSXL{ z*iqM$RZV?ih4#_ADNM(R;5R3J#~I0R_#(7MY{r2#J5kM?CiWhURvJ$ ztx;GvkpMyLXMH^-^~q|>2Q$~bA@=6iqYi)iq@PMabvz3RHKBa=T|_0O2ND&D6nZQ9 zZI8c*9qqiMDytopw7wLEcgf0evG{82YDn9r#qhQFOG)vg-Zkl^C!5B-eT=*LNmSof zJ>-L+l>r7Es-$t#R!A>a#i$3%)?__Fw^h2u%FgALC@r}O)= z%tG9bmHqoAPolQxF!dc{ObHWIFS}n!kFwOAWPW=kJ?_drK5ww<^?Ya?*L`f>fYjr} zb?Sk`uCLw7ewbu@Oe$x{Rj5RdcV&({1st?xo_J1<{-O4f9bMgWh`S0+RQ4BLHeLRR z&t3yTt`@B(%R1S<^;b_1&1BuvDk87?jdSzc+0}iVnkrT3D-3QUZ5TZ=o9N*tcpz0_ zZnCJ)FMeF_^ifw*a`e}p{gj`NC}Y4?Kc{gswa3JdY<5NxC6BD{t>}xc__Di8ijRJL zsK=V>Eo{BZr9o4maD?x%LwS2OdabT_t6b&*w6bBny0TAsCoHuqd3HmMZsqtSY$se42CQk|f=Z@018GjwX-%8K>X8;<05_L9G;; zsn9c*a<#$yL%rk1nktowgKoCNb#cEh{q~+t=049JmXxXa2oJZvnliU_?6{}xaU7cI z%?Nd@_*F*M#F?cz~qI6Osq{=l+NgK4XUJZKV0UH zU-LMd>weY1-khE7YSmh#mzZUIbM((}*=WPCPBiSFimgKA4pCO?h{L6h?&0Sj9KK`; zOWXSnC4E@c8l7b2c)hlJP=P&s>F6}g1cE58#$?!b?~b)**p}Kn$V%;T_WD@VFi|f) zp2Qk(fAylZ`7(DhLo<~-Y&4syVFlU6lilq2S&v=_VS!>Gi7attD}WkDaUF6ERBpkCPFj#P$_T-ghNqfBn`XE9k1Xyj)nx zDE^>6OjszcA|_gQj^`rrXQa#I5Ij}CPmxJmhCpzJFaX{%B`NQd`N#C z%^g@_ducRf_0Ecs+dx;j8kO8f^BlEp^}R$ z>abS>YHM{%JE;Y_Bwd;xM^jmE1aj&N{oE;|8B6l5uWJIh)f(O#<1r&!KJ>%H*9_C- zexsMUgBdEaZvhn3gQGWn7R!|KVZQY*>YAl^a8%r0Lr}XucXi>AT47*JMAW<5leu6^1h%8F zrVm5Kx}h01-Xm1OmV%-9(EV|OnH6sh-YyTx)j0eDU0&__M=Q?0qgnhqyfwxYcVm33 z<1Al(jduUH7O$jz>o;?Y6207)%v}Z4Uo?*pE6dG=S>_)$wRtOz zbB(&{PKI>uBo%5&@z&H)jk4XkpL_qt&K4A}^vUgTikw4k(ZJGd*BiRUAYB_PC0@c; zf6`ofbEj8$aOza9p|ab?XZ(GT!@(1M6Y1jgf`YQN_93+z`n=Tg-KMai@u49`DVw^A zikUI-$Q=*V*x>hOkK)V4*;N@erx(R>Yc6xwR@xmk`WNmyrmgtTJFjqpx6YDD1U0WI z`}``g7L*8*Gx(9dsqzFO<#eK39Ft>W8ogGzP(s}BF}jLB z)l(7jG07}s2ayx>0Uwyh~DiQaA}MbloqXN*R8IgWUxQ*Yb=AG8sco$#m!Ykarb9+Z34juHN5^d{76w5A3ox}Y>0 z&-5YCt94&xz$U8VnG|T;Z72jKy0CK(uXxHq{HIET^|C|jG>#N5*L3xBU<1Df6M?1h zBlFkC9f-==sKr`lA~bKGgeG^h=HXL3_MgVLqzqCkn**K_C8%HFsJ*2-)2rrWrM~WMcTl)w6(BhIG z=p0Kj*1YKs%sw`nyzP%Jtcw^`Ou+eKY@N{9<8PTfvS_K@HnAF$DvrlBYc;%2Ysx%) z`t5CBD~qE`R2r5(a#-7sK(EdHO&YelxZyl7Ye;>Fd>gr}ERCzhBz5xxunf5xEnEBd z3nYw03>mZ)6z&Q%J}>M%A;~dttpj2=qmA4C&kJvylC&9kw4XO@S^MJ~RrF`9u2oCp za*b7Q^!QutebzjsHSHV9gz(tMs&{*^J{`pG_h8YQ#2@xxg;l7W-d^S&(HTCYHT^t9 zj78I1F-M6-Qf#`+h6N$ii+AX-2x7T?kXX1}Bi@wfB`p>X*T`BPseeJG-f{pI$-?-r zI4qLa278)Vcu?9k^03AnsW4ui|sG_VUCxV(WwX8Kv!>&`hy z6$^JMzK-1=o65e96DU*|Q#JbAS2jbr#HRiV1~*CIvWP^+UtxSL6Pu*iX1N?2oaT*b zEQ0WYC+=7{6mE4A{@7l5#*B^r*A!Mb$xQv9KF>pAfgHsoAb3I6h7r6!nV;5US?3%K zT(CKNzd3UsRiJSGo!@-ZSsB|Cw7faQuvc_apuP57ZOTor-iPlDT50%*@At!RgXruY zgh*>$omMrWJzb5E{!{t!IK@(TF|zqf)}^#1pE36yGlZr8YTg8Shd(k)9q-ER5j1UN zGfjs-)sQ+t_(mWL(^WH4OBqs6cH9ReaA%xdUt5xMmWA zMNHScbB!RDH-!H!6rd7|EnuI4$l-XJ0luB(%c>*`zbGslN%Gin9uO4)-Pa1Vz0KUA z{`EmdvDk~dVWm4lB<}!-Mxk+}nZLu|%|~(ckS9{Y6lWQ#vtg(kuFMjVUjiW!%s3`Atjf%`~L1?U=tVugKj z=c$~{1zs@L&#Kug(vJsKSfz$2r zLdC&chBTW4_ko@&EpL-uDAt#;OyQCpwjVG|1SGV91Bc>~5kL{P!l-++yv?qm5LUng z-6R@y$6*eGsb&ulWc__Sz4vu5vq6v&mNJ)?L6A?>kZ;wOA6>?MRHX)p`i1^gifr=l z@TViyBG@i|%OaCLG$7V`KN%=qtqO zsg;JPi3>wPTIKy%uC&{t3Vny<_cY4tgYHulr2V2`Tedu|P00WWq5uiXX2-P>RX{qw zcMj!$i@6_*Et#BwQ1TH~pp9(efFp-5%up7lbr?+q(2szK_XkI4d;&m1;M9Wli=h4M zDuu%GG6TTR!lnX&sTq&ZjGa{k5IzPq}7o2Ku2{NtV*$X@@V zQ1G8FxUu(_<3A`urul4f1(3tPlt2#eQ$X0ERVtsXmsMc<%^aa%l^6I=i~PaS5kCyG z03l;jIXVG1ngF5R3>W~0;6JMRagYBMVCXwQnPLFS9nOT7Y)P!of7^&Y75)%l3IdV9 ztY`o$8EH5OSh4I}5dxa$sPokQhdcOF`iFZ>N{0OjNj5w7!~cKI!S}O65?A>z^$ve8 zad4ty|2OF}vcqvc1m|Z4PA7b3)O!PNxc(ao@*V_Y8LRgAKe2>XsMJ_5!?6G4oPFe9 z)L-H-?~1|+fww>IX;jn)0P6z4`fG5p(5k}}s6dF{oI}ZFzV?iR>i^~(`!;+T{G|;6 z87-X9a}xhvEHZsV<^P8_`}q|G=N|@zgDVOI2SD((@-w}v9{Ui24zO0!0)=tM>N771 z=$;XBJ3$BDzY;SK3!By=7Do>Dz0G#@D=*W_|9@n?bzD@>_dm{(3xcpnqjZD7(nvP~ z(%l`>jnpL;X#ph^2|*gAQ&Ku5q*0LWZV>q1eZAiA_vi6@{QlXwGjq=K#N2y#cJ|Df zy<$?VEt#JQNBUR5HpQO!QLR?wCaLN~{iEyOLD{S&xZ;6D2hX)*AtgLQd*Qg7dMTkj z$~@-sDG*c+%!vsu;xGumzd5hu8~YY8IPal@#JqVnFB5rUE=&Mz_sW3ChDS6q4<7S& zhENnM7Sb)grWIi>nfk-Mm;iT_q1zuUDmDrU{WNI_)B!#f_cm=PrhU3)D_G1ZD{rOY zd`H34{>4R%3ekB)d{Qi3ah6`Bj}-cXr#D}kTT+XdU#hl4%bucCUyV5I>&RPSPO#Je zeD5DlU5+%I(2%nJm=gT(!C37#$`R%vOzZ{7LY}=&IYKg|#oK$>;~i3po(h2Ed7%gL zd=FvGTme<$<~KW<0dXM|75YeAlV?bw=1Ln4+E7$Q9hJH>F&$9fKFcOhU#~rM&U+d( zKHDR(7yWU1b%U22IOTZ?0+E5Up*qw;P?tQ7*sEiFo1u8AfMK zfR^A>VrhCEYCWDNNnw>ANGFL#`V(p9BhnrIBtmfV^|6kJ;(0&HurcTpP_1u8tRK*_ zWHg9v+pM9;+1xVAuYN@X4myfo{YCj-T3(v)prgG;yitBFDfx4^+p8b+`eC;RSX6v! zN>BzPF?+bSxA3Of*GtNrfk+W@>{$P(Ops^JCkV%l`SY8qI-?d4xyZ?<21zYv67XBX z1~i$%>YFuKJf?51-m>$(VP9yk^GHm??EP#;K$tf;cR7gzyRRa={)2b0Hw4XoG zdl>^sA8Ig@Mn}~a5*cTd<(8}_pJ$b=I3scKO(_;2c{QQpbI{8uOC!0YOKke+wbAp~ z$d?hAzq%C-cb)&yP7;ZQUgV{VA1M_Fs2|5>0HLiY z5|pFNL)Q7GkVV9N4F@JveeX-qi7GAV@=1M8ut=Y5;K0O9d~Rb3>O|z4LRxxQt3PL{ zY0B|)(4RtQ9jPK3Wm-21gl+Z18X+ASP4&P(HrcKOBfT`*_~R%uGfmxk{_Z!kvxdl2$I7e8V4r6ruGynI zjMpvs1J*a$RURDFtxN|W3>t?nQmmvT#V4fu-!ONc)!p{9cXx!;r8H`C;8yIZf%`}$ z4vAu%f$JV|yMgG|q_GneB&K$|OI zOW^J7K$-trWZFXPhchf7ab9HQ7@N*An^xA*>FT2}nPOoPvKR0s#X?H5K1gkvGpOUN zZjY7ydk2`>(s`U&6ypKSK<>!fKL9Ik!23L~eM;|4y-JQetD_=F%> z?UkjGZ^fz~1@x8LIOyj47au-;^U}9dse;?QDDtfj=i%dV3$AV?dNWYlOvr(2Kh_)y zo`NMvBU!17v11dtk*M>e7HqFDH_{7>fbbd$(X@x{{q78fq-VNhd$AurCUVwMP=5x# zUh91EvA}N+e|#)Vq5xJ?Y!XcUhObEIVk#xQFbwd^`+({pE{h$0Brn()eCDPO0{%3O zMfSxsz5*Ea$<%Wr(a^4Sx0NbrB&7tuqCY^>^l}HE``=Zd3Y%ly5D1BPODvjEw)TP_ zlm5&##f!&eqxG}8VG$@V4Ge#RX3;2+Vqt3Q2qMMDZ7zqPJowgPhD}npVCm9G$l(+e z52{ch=gg=NzU+3y9+M@01|@Q=PNkRw7VS|~51|!_j`c-BXMc2bx^$*V$;c-fPWS(` zhg248jIf;MviLKz1j=d%;=9@YURvVU#P)UO zn&io2GVc2Ek1bb^3Dg_T9)gnHn&vk|mpJ8vloNDy{-8-L_)8S6sKZ5Jqj@8J_N_S{NI*V5kd z>`GbobVSR3B`%`_gK*|G!!tFCjgZO-6IYKAsbH~ zl1K(e2REX(6{1Mf^pZ(}WN6T6SU3v#7=AW7bb5mf0~$?IjY12zB%`4xdV3p0L@3+? zkzMA>D*piDMfw7 zb9qFZy5hMiB9R3yPe3TP4&{-io&5-t2IzjjL#I`@N~U4(A0o6y$gKvvr(w`kc?1rD zdsyNoTrCk6)3=ZeD#C;Vnyx6N826sF4;tHdp)RGk`koCMO<{#Wn=^5`{Q~s3wW}&L z`tdsq(Bn0ry+b6{h=|pI2GBGWQqZ)cFwitJ5OH`R57dtdR~pFej*?OwdJm6+HYvfa z!Nvky(7N}?Hr_rch8;B@I0)}BX~zyU!U^7Ae38P;Q=pUtZ!ZC8G}Q_w?a?MWDA$%+ z2pX-xC8_wuHsmtasLVD5E515kG#w%>{Ts!(cj2g3$69yc1%`86Q9^J?qPk4GS4xf4 zGVN!em2hArFz@_lw6`zS&0mSp1h3#u0l$fZnMKoH>C~Xcja|8=`L+|^^VxoU;FA8Z z(>v&PbTv}%dXq>OMl)Oe)FK7trS#|IRn{+blDT$<9c-w1udYwWw`FuVzD{|<_%3BspHODx@Sjw}UESmOZ0Qx+ul$DKv;Z<2#QJm1z(sc4 zjb3%^Bw1(HKOlm#RECXyBCDW`q&P8gwb4IM`d@+Ijs=j8ZX(y#ES840-}CHwL>KFS zVE^qYC@9k{PONAM{9;<1DD;22Dna?J#m*-=k#_5~X)9*D-S}~E>^ZSw{6vd92k_x{ zu2qRZdWQEOil5r@dH=`)1Cx>VfJ$5!NO#bAn#OC9C#n6@_Ak2h+l}o^9PAdFFYCo| zEQPC$);jVa_*)%vjrtvTxeKw4Lj~9U@8HdGun&n2tiK46jK8BwBpdq^4%-90STYb5 zSPxu=gbxK!odVZCUBCYWB!?)F^A{mdoS`Ge;0yHT=NhL3!Xzza6$s?x=ncapb7j>C z6l?5pP@~CBq{wnAlNLzO2^p`!4mm3V#i32yuqaQjyn4(~+2{qD#LcnC=!CrA!nvha z==A~!pvg@VP;`GjXlPg5L)th+Rzrkju6zQ4;;B7h2ef;AzOp;Ys~$U4vgHOL`AOk3 zfxLZ8o-cqCD*Hy4HnC`o9i5N@QI{UUEuD0A?g*z_+>@p`BywGhS|o7YfyvEe-`{l4 z*S8T$I|kH<4?9}y(Dt{MlskN(D)o8VdMg6h9o3B}%-#L-e7+V#(eawfXQYwrEMn-{ zPN9I@CeYU&%;l;-TMl9w!T_xID4y)$&?)zqV>BM->763>8(bf0e>Ct$0)@TI;jAPQuoK;UXVK^mjsf_$FYw> zbL&;!QQr(b-2sy27-We$2MH`idCsF)dXd$?U^N#hg$$$s=$tgHcgd5e$phqT6ne5? zCrOnGh?YZn@NzAw(oQx2?1j@?C4>Zn2yrY(Q2*1_*IjXOVyGN!izbb<8o5uw7*Qnh zE5UW!5Y&^*3Om_X47=b>CMZZZ(S4~hQ{Bz_%@Yg~B|MMYOhAayaj*r1yFl|4TC)Hc zzoD0mrEG$WJPS)eYZgTKn-@rUd zet_O=Bau8}=gebe-o1)y^OG6SnS*f|2dNF09 zKmA9*FjBx4vLgs70F*4N?}QX^jD)#H3XpB3g2W7GmD@=omHUS`4#`XM5lQm5510nW z0%>hhIrtAp^~Mf)A`-s_Dg6X&L&&XzFu9^2i9J$5+tnS|r}pOS0GUs+;jW4`n}>MO zmj8f-XZJHEh&^!g} z@wQ-C?ARXg5k``7;Io*hI9{F#3xV-dfHArXy{_QfV)1s8Ea@{CA^ei>_H|cO*ZDUzAnJ1Tw0SPK< zGBU0;_u_{d#aMvZl@=y0UZKgAmaP4LyuhFIUk{?4>XXxVy!{8!tUunq~JsdwNj2orz06)p*IkF_=5SV{Qb?-TH)I5KXOB?DPwG1_z7r)Bu|n+n80v;=@qa)_R#qMrjF z^etp7Z;&*bMp=%)B`pI7*%be6B8(#1(+@-|K^ULlgE{zhMS&RTi|$!5U?9r+A~Fkk zt}n*gE~v|?v&vJYL(#kp64u4yj+0T88L?L&qjzbiofdb8rRULKRyv}ODa(#e#L4;4 z1-!-PxBO#=W~)KVK63c$krK<=i>sdOveI+#6#^Zu9`T`*gQJrQ5ipYU(n2*@&S>CF zc#F0_1xb3-!~xwdD1!7lOnw==hilU!5nzNIpz1HoRy!NcA@?%-Zo<{On%g z`+!lNg@;-^I}FTPg|x4t&sY=~fW{6rZK%P<-Z-C8=WOKkWgwj&G`}&B&0{_{3?Ti< z!pRIeH`gf$X+KF??1mb74vxu4Hl1aW>@*Un;UA`wF>pN5RZ=$nkz^_FKr)TJg~PwB z^xC;QS6b4F!cQZ?wxr$vYm@&6AgZG1S2_}u5Cr9sX8eX6lkPQe++_h4PHJRL$qV!| z^ubU!Qe1m;z#S3H;9t6bdZOy`w?NOw?Y+%En$)pYMcx<->qyZYJf#1{l#|to-lzBk z#Ri?dp#>&x{D$-e+n5P25jkjgpg5SDw=Ugnth990c$y5%G?bthG1<(0_mghF$KlJ}M& zh>8GkWc9VFelu%xcjS7UV-v@zr83Y5m6*UsO0#736G_It=1 z1G{kL5SuuPg>C!{NuGoxmworA;kt<1axNYYNa`oL%~c^AXCLPOuBbT7ce|EPu0}gb zo4D(Lqh#~(;_;ls-;(Ln6)>*u5_s;Ix;>MYs=tS~7G9BF_iQCnIc6w5*Z=;o;TsWt zd~P)LdhM}2KDoDt|(6Zk;Tbd(c z^agBRMu!Gps)1M`*1 zEShG#qEqZ!_PXaQji+!&qoS%#`Q-T~-+vWUl~+7Eie8N>a+r7RWuuQ-_u$eAgWXoX zvO~-X1*|`YJ)JF0n*Pe2D{AP%ohxDMMVot2hjzM4Pe0x%0-i9xw(bn3JX>pN+!ce8 zZ3pkNK9*mNL<~TImiz{^44Bnmoo|!1xa`pFk-$*YU$W#M;6Ad+$;-DeHqnJNeQ9X? zW?YVMT;Fy`)%aDMJw7iTeR2jD`%+w#OjV=Wu!ZdGu~=0a%=u%J(Kj*+{IRA?RJylA zeBS-*;P?6|A^o?OCtMC`5Kl^98%8=0|2TJZ*&vl9YuS1LFL%c(O32R3-G zIaT;Vco6P$3 zGr*Et`gWxG$rJi4kBJBFb1ki@pWiy0eQZ^mOJL}Wwx~(PZ=n^`dh&zRd{v{ z;Q#4=65T7*8l<@8CQ7|1e&LV6x25`Mofw?9IC*DOwdGZ%F8YXyIDWyM{b zD5u%P8E5bN)sfLn$*7X|OJ((t5V^R@XDe{&TrGogkHo}mx2tEgv=SEiu_JruDF(KP zy7`-dSV?Kqj!ANS!eP|$wOvF=Gh%QS=!Xt#7qO2(qnqQcynDiBo9cZD5>woSMaXlK zaBc?XWI9YK=C9LiHOkBGB0`fNaxDkK?pqvIqjI~7zFqB zcM*sT5EmO;7(1={5#ihW)arNOcBDT)R2BQ4H)LccZYI%2B3f=6kj=$^0I;1Uyaw4$ zD+HJ3CI0n4);SCgJ7xxdXhYnnHioZ{bVpd#|Abn~N`YA}Qhv{3M>}2gf?9xmsZIINklKO{V`DRUiNV0Z*#!D0W)SI4B|c<3NgDWxT199oCxDwMzQ&lD z*r(|LI-Q}UXWGo;8NM^l;4b#){}i(*0* z$232O7W?*PDk6jx|9#cpxmUC_a=g@-eVBFr4m^LnLbuG?2TR2BO<1eHjCMmC+ks>L zLPEl`q&nNKD1(?dp;c57UCR{MT!u2y`%}XwN*}%!xFiahm{UkY+YsB@hFV5jtnz)B zOv7KsN(N+lxk48nyc5M@n#M4=84Uh~6622>j>O zJ-t2ECk$$X!FO3UM#Ii{>+&0leMWjbP9dKmUXc>c)Rmt{t%nUoQ>B~%%HB{AY$mW_ z$lFsyQMvH-DJhJU5Ipntl22ABi-w8WeuC5WW7PHF%Pf0^nwZ$q(vrS!E9cEsVAhtm zo^7AP)l4^R^F03q@DJG{$$Azy!y((QWJFAnh1Tca4QB+`QHhTAOkwx_Qx zWz!%-#G;@^7*FU`(PlJ1kkMkzysYkws$MB#r;RIu=R6`TL~~l(hUKXK@vnPw`rA-U z;Xs%@F%fOZQJ5@;!L;=_6J339tf?Rha^+Hs8T#|idus_-D1ZPkdGejiz3(<9&2|vl z*rxlFO|d4jtPi|=_#!G&Eh{5W=`24GF1=q~wf%!^%i=_Q; zi;}8rjo5mK)H2`|V$$-ECdZ}MbIUzWea+lt(k*H;fDbLAYYU|br;dyUO~2LuiKKM+ z^9?pO>8?bGQ>_j{HkhcDJGWcbN3jp(oL)1G;i$AOp2?pfdNKTrX3Ub~0fRLPrScyp z1jCUj&!c;4L&PQAwyZ0(dT*f=ga-3FUkQrG5KWY)5%;S!dnf+*U*65 z-zk0{`Icy(H_xKEj9$<-3cOoTVIPip4r^o9;h`(N_HP5#p(|ayEFrUyt$n(j(1+vU zyzsk(T!Zh|EPD(%0VrkG4o_fj6u6*%OUw{mU*mtrBmI-~U_eE_Pvexnsw3^~rhF~NjPP*gVVzD9}n7`p+K!Zx_IgM&yS+CA0Hy1vc5qm^`q z1!W1Mm8B9?gXbMi5K14+1cYyVN+l5gK?ym}wSoPNl_b;n+>OJa9q@bPF&)E0JP(cV zH!GhIG3B>5Q82dFegBH_6Cv%uuavc;CyH#Xy5S+2SqhpavMtvv(z)`a+=_8V9P&HW zG3A56+h=4s%Z_T3;1R#Zs!189MvOBDF9_+9%_XkiJ|stW1@kVCeI_Ja(da-#l`K1Q z8QLPYMT`|KWn;6-6V;Du+j{789pYk#Sio}*wT@~ZRL9wm$&eEg;{3`8i7NY-A*Q@# zG!)c~O1Z!a(bM3UP7cEvc&_I27qBMt|9OfhPS4lV9h(Zu+YudkI2os2U9c}V2p$Sd zx+nTT3_rs5%;bkx0PSqRFFF=lhJdu1YhoE`Ph(Mx?kFm)dGef@KvH5b4}x*?%MY-U zR!+NnLuk?ETx=>VNjq?l|5=>+k+&fZFTHkP3m+k-Vx5NTzN(r`rNOc^kaLrzbv`9f z@H1$HH6YFXOxhyEw(-kCd)#Qiede|W!nUzS=e`TttWIyN8|f@RVfP~$HoG4^IY&T9 zu~a2LCMnHptlR4^uP^%$76waSs`8JJMmA}Xqw#gv#OGQdP>;WE!=*v?6B9*!$udVG zJaF||%nI?1d4WP0ppV(!O6}-`KIm(*VKMSqj=h1cF+Yx< zm%o!A!6>ReD6|+3NaYsI1rXD4=d$nBuJX$2i?+`HlBN^Gp(D2dLyE?w%FCQqS{iBM zp%~T&lz7oKPun<|v=u8U&ZR7izHYM}NFs2?nqeXg$Dd7sY}hgJSCaRMWG^+Va0&?A z3znyi(G;!uSq+qk>G>Yn@h3-gsc#%iLNUNKJKxE5pX=bKJAO_1X7YR>O%(=x&r}oX z37vGM!PhLeEQP5fcTz3xT<83+SsRJ!8Xl(c>I6Bn;sZ^Y`I&JQe~fjV3DK;#8*HJH z<}Sre3|MF{%9VH*zThM>>nG9TGXn{t-sy7Ic^jmYx5+YP5&N5ROJk^k(zTU6A}j3&xg+%R3v#vmT}+q6y2we3U%>;7+#*FjEVtFIVf zVrPA`a}(*9x3%RNLrrxz-FxwHYtQ#MHjp|nK)W)p=An3Dd5jHJzz}%ocjMxuAvG zdgqMgl7~#^!@b()per1|-#E<+lq)+2vSk;%v5)JAE{7K$`Q(?Hy)iPYx|_k-0`93z zCjk01Nqz_snJ^7E4RSv$oKHYl@V}d5;k?{wPW%u94mb}t*sqBL=i&KJ$@ia9;Gfdu z|2W`jWBiaZRFE@N0P+YTl$Ig@5lq`whdfG?6htRYI~Rbk{9AE!s>uU)MLF=iGnq zgYAhX$5f`=aXoX8=IMsX9qg^}?cUB$SGBg$MbAcYxkc8Gs`9=)g(uS`yv)}-Uw%mB zx)(0qpPeq9{G>L;oswSskhwFJg11>G%r@(MZ@ zm~1#qB%=oXWX(JVDt*j58ke-i@Ci>?eBcY{nq}8l2Wr5O+3nWp)qS=~;f)YUx)9N` z^bzgU*F4f82U6XYifvqH&_|`=?J?9!aspkA>3gWIjsp!}93+UgI1$B_b@^>TyKSzq zgXl+|$F@!`q8z+L=>CzZI@oHU&w7PdQj9u1$T{v#{TFa3ETWe>WN zieFc$Wj_zTt4hq(?Nx20A^iNP*#1TM97j}@F|Pql0Rd+}zatpyS{(}OyGrb*y^!K8 z-?h3WVWfR!Zl*-rxxq&*FmzKTZA>5qIVtuaphvVml{t$;voY15()&;;4(#@#{lSh* z+~+e>U4FuLuF1&zHXj{f)lE{lHOxv^&4 zvG@JjSsQClGe}{~kDiM_saTXMGs2>h9QS`)QYw{OqP?D&O|+S|K~sN3@w)?+;R7iq z#`DQiY%o%q#8gFLUZJjZjIGJKy`=$M#BA|{nYhNUWxK19f4=5Yc~ZG7n3$)qJx zr4KY#MmeyaH&z%ww0tyOA%+>Hq+|Jbt3Xb(5R)|>J?3K8VeGTgw13V|nb1Mm7QR3* z+9v=%c*Ntt zX;+m(H@fI6?plFKr+!OEfFrOh;#S@>N<}MEa5$~w&D$9#6~Y{{;m0zFg0dw94Xq?Y z4mPok9FAE8WJofA7IQCTUj_$(&gDS zq5zh5E$}ua9X@{Xj+1Zn9sP>=^8*C;W`WDjGgefx%i+bTNR`dJg1*|dBM{xmo9a;ZI)~u-N7#)6ST9$wRZqoDLr=)0coQW?4 zy6E3IO(nLPn5F8}S^%XFaJ-qkJ|QF{{Nu`MLwg#nx!@0$eS%Url6KgjgvoCRXqU&} zy&dG;sZfO#7AHwzyv`It28$?Pmehq-Oaq!N4rOUOzZb&d3srAJ&;hLKPVwm}HfQsP zZ+C^>d`KR)54;iBRk*ZYeiHj3HbSI^KWBvQoN<-F#6p7?_amT|LU8)pfaUeE#(Lol zgky)-bJc2U#X7z#*k!c;h*Qtm(rnqHV`hTv<3T;k`T3h0vAnI10?$`VB=?D|oEnCMuTUIZu*G|-hXPvc3LIKKn}&_fhRmzwgwKy9N$D&bgCgx-jZTo_BjC)LYnTgG z)vum%>%-SkWc7i*{$PbA*F{!B568)x+`J$Kn7B5uvbmjioEgrkPpzgz>Z%tCFxkNnHISPm!Q>$*41 zEzw{igM?v1)lH41%&KZ9TLTU|rx520R@E|1JDndqyEnvTCJDZ$Z=TlrwK-#L4f+!7 zd=nb!dgjsN%Z+WQJ5%_}AUx<>`t+msp(ty6jsz6dVpKaScDUrR+OE&#+Oo#@osymQ z{K*}^5s0w@>ZDu;{#(zqUazHT+WJYqc#7*hK=C0!^!bjKGu1~9r|H?LO@rNt@1bmy zm=E5I)<#PNr>^imubR=_6&oE7^ehL@ud$0wNaT&y<1zEM)SGy}AvkHxt!ip7uycs; zsdi7DNpT4I1iux&ILlPd)D>pElr`KwJtMN5-VnX#1_JLo#3^%&Xz#O?45}Y=Z%hHN zt}ke)!VjJsdc%vvwN`UYRl6VN)zt1RZ(RTxcf!gZ{u`(|`)d0ct6i-$TW-$^#qk); z)DDgdm$JDg92i*T-cE-R>WEW#-w6elEBTtK-s_>DY%(TPZElS4 z+Iv#?0|N%C#GFCv&429>TJK)@ybfKJTAy(6L+c$`1WCup@I_bs@OGp+TdbN#dd)29 z;z&ZX>k} zcPaJUUvzk|eh4ZIAR#R7uN0;a%xP7`D3Uh^U`eF~!dra9$$xuuNxwKc(P^TK(o~~r zJ}1HbFfIS)&fg>Y5>9#=@!SAnw_f~&(`4=N6~6*m`TXC+Uiz<5Jc-@IVZ93Jv|6#c zcALp5GoH~D;@gH6_%_wSMgu;Euso}5QsF?RXr8BLYSZt2eUBTFe0vxi&d>=iDOSlb z19%sdu$x6yT+{BA&mBHVM}EUY*^G^1p05qrm@M&|@;^M>rV1TOVaxhX(@L?He1-$(eXW<_m8gKP)``cv%`63b42ckvUS9{Gt?Ln{Ru5J4*i~E>f;nSMZcN% zt(T|1B<9CwKBNBdLu_VL&iAh7(a}jTH-mO>Rseu8?u$9}`ZSYinuw#4DUI!EkGu!) zH5G+fPp2W6z?v~nshVMs-=Y!!#v`;*K0QHR0$oG8Iw3g+wW@_$ z8O_r|HT7Md&G&ELMyOOgRb_pnv%^Xh@*5S55?rdE)E*srTiPDoQPGR63ihlJOO)!U zWy_=a_+M zyBbk1V`p4#QB4-~MA>Li*GCv z+|MK(q1O*XXkLH(YT+od@#~5r?utt5w^;PYp@(Azf~hGG2jjqfGUW<2#a|=z+kikr z-&D2GFV-+~I@{h;ca@Molg&w==B@FfgoIgXTf5$eo4@(|S$60{Ug)rboi2YsB5Ej` zo}t_RMPgK)3z>Xy&6EB{;$yl5AlA$$>bW9K1;Lw#29EiSAulUbh{^6!A~W5}!)pGoaAyB=r@D<*N# zAFbH|54Gc@VlN!CXc^k;SI8I8?g_G<4g}^sXpqXNw;tPh+?wu3+TfI8SYee4QOfyM z_iEMW+&`ORsdI|*ecae5;pyHTw90hFK^Ob2`*jL}N~)pP~T z)Mj%a{*4Gn{x4jQVy_Q#AJIH#P`{LKL_WxI57&LdHE%Cx;MPQRaME;A?H-73`LIz1 zJnflc2KLN$_@jTU(W+i~6up3m8%GuaLjwDkSE+tsbpG`BrDRi5y$c8RxCwpJ7gUb4 z4?mk{hUz*$-S0aQJ&T|jeb`E*06dz?+%v1P#+7YbJ<%Al+l48HgVa!QyQ^X%9 z@^?JK;@9;9Nm-Wnn@)#TH%py(zuMPylo=ae%tGh)J;>ore^1GQ>$t@>FztWEuK{7Q z{K%!}n{T5wIO~ZIndo1>33_{GU+J>X_3=h{8et1&Hsm(s@U}jvtfglv*8?`2B{_v& zC&atmc{d4-%TbT`7S})uzP_0rX&Sx6)E6U%uL%X^?SrSKk(AQ)0~?z209f z=m_NrD3|>prOi;;)!2+iu1YTahd9}w=D`?@sVtlB{$tc%1&lC(4%n4WoDLX0&Ac7|?k;dqs`gUlQ`{Izp-VMuMzIMV>7SB>{J)KXrY{(KCa!#% z?*ljtcn)z6i_Gue=jQA-NG9{EtcoC}-R-+< zQ224u8Mo*9(a$%4^75t9E&i13&6KZq)usp4>JMm8seXE6E__cYc6^%xvs0G3sy zWlq>v@AuwuMVJTeo$CZY;NNGQx`Zm(u~%sIE~!<0mtI^^iywt6iJJ!eaah2Ajo5C^ z;*H}q7ifO#;PK)+p`!^s&V{Kkndh?RlDJ}j zj7YHAGA@Stt^^f)oEIN{dO>=Dx~r5Y5$EN zz2PP zrW)tlI68dh#v>_1!QRDly zOeLk$<@mDP=ZD%S-kT<+@h)#gXQ~=At}h90KA|mA5^ON0!zCf$ThGYlgYy-uvzQh_ z4P$uIEF+@o)5>^@N7SoD)ws|ormtgkD|=7U7~?a`%u*T5oqq^AZKrW6{`S4t=zI3| zV{+ZAzdV!&grj;#?v#LA3HKMBcF%81Um3ApxLqa5HdHeEno`x7Ts+kZTKcoXFq;G4 ztZ3~B>FfL`++eKd*bH2qU@NyTg7NynPj~sYZm>-6pB`xOHe4^o0 z8T|0?H@C@WwbjKk6stB9v1X_vjK$%-(I61mNH|K~X?lB2+M* z!{0>Ed>@0q6(<4uCynEswKoIZglXpb-kD)ZQ!v#eOMO7cihNM9q1MsJxYTa{Pne(C-dJ9jb@g;MCdQ_9m-P-M|6ga;hIF0V!@^>>VfQ2= z_T5Bd!_fT(}+Y!$UWCWOi+L$}c>Rw1)y7*rGDnYWo zBRc#u98Uk?WdX)|!q+2__U1yyfu=|4Dha|kS5{s!=!puiC;Cg{qLvWh15z1RrO_Mn zvn$beW_bc@_0}Gr*y4Q*7g+lAYCclAkmz@Ojh;em>!B6MCNsZIM_*z0lCo_EPQR2$yWdEJC8f6GQ zumH(_+TwArrupU>*Nyey~(9(^`biKD+E%%mTL+~mPp<#7=lM}zr!FYKR z8>s3f0FPKr#g>Qtxg>Ls&Nl7cL|l?#0hXL2QTXSo{Ob;iA0@sRI#YKZChY=r33+IN zxZxRMwNmp6*rqNXRNDIX^2hxC^SXypO;m3<%cJvzou1a?P+2`+-jbwB9&EMxfmL(u z^CdmQc9btCuS1hWATo;DN-murXd}{Tsmkn!KtFond0g7;s=hnej|`!n9HD$B0AP9T zF29)u9n<%*H7s{qKEqOKA&t(6W6|;YZt4^(DReX?%_!wqJcxDZsO~I%6e8=0(0k-B zt%bJ!5PW^6KA9BME1Zb){rtivp=G!Nde@PQnY zZOGWnL#`;AKUsAZ-5*<|rB$xmCwXRD((u>h_jru07|oHx{epFTg0iIQBaNp_f+%de zS!*NaV{UGr6uQm3yBHG~A6vFPL5U{5%HyBKVDfwF(k2|5>%gLNR^%PXo(r_#JwHn| zX6HeZp_zZayfHf@&K9w75ewZ=E8m?gzXv~iOlRTobZOfn9j(i^E>}Nh_Ru2yX3g!l z-$O}VO)ROPY6=N@VK36rj@FFzA~Q_m1ntwdYQhcWusbWxhpYI$Pc`T2R)) zs#j_PQk$f_)W=J6deJI{@mM;M8H#KJ8+#`~D8ebKy~R$KA26XLCRs_@Mw@bN!$0Q! zezLM?;wF+b*eUPaZk8dT=S^iMD2c_4;)?PBt|ByB`GCDHASe2=b0`G@r;P@kt z2@jJO+$INBNy@nu+-LlpP9U#w|PfPKvrW4b>UxKIze2TW!*hc;9Da8 z|7U{)SCql^Y~(sPzks07e;2h$;k^G{9yh{)^ZsY)n^z!B$RE;1@=u>84j61LqY?t5$~ya`OGNY)-?aZ(v9x#LvkM(((y%a|-gqXOIy-{m_zu}#%9nTrEy=Q zKS45LlJX0K9N-}E3UG4@@d(ifAhTNv38dv{L6}hagwtrD5YjYs15ggAF%~Jm5Fe)? zNDk)~=H!FJY52k1m|*??LypSNgH)O*&0Pn=m{w_p_2?Zz)DucxApuUffDjEooSRdC zhlURn%q>jA&jSaOdRA&en2~HqX{h{s|Jtmk3n2y-rkzLUN^{eLKuP(y;hZ1}4P1!l z-;ss$a0+t6{}B!nexE`IJ;o2B{byA1(%AL>fsoRJ2$6tH0!SBeg9$kKK!cH^^dDwa zkm+C1LjP*Mss|B6EN)Bnm9;QmK0$dmLE?GYMWfHzG8 z7mWp&EqmOU6x3#>A@PY~|A9GK;@nrr`YLZPq)j9*`8t6OuXzRY&)h~ zO4}Ngd#&9nnEmD)%wfuR*Vby7_W_;vtJ|v7;$pYgrwV`P2lk4)s*lcAcW1ljs6JMU zEG_EWbo_q^)pIVr|yF}qoyuB;A-&a!R6*fq1oL=f2K2= zat^yD8FyCg7bS8sf_KNun%0Zw7wyp>s9`QDD^({%y>&x;qWj9&` zw$>aNm`(>i(v}W$Ox{l9__lm2-`DM(wAEI9f06kp_+=07)a#mu<8`*6Az$@#~m%PVq;wYZ|RWD-GCyg&&ol%hz-0}8f zcx|{JX9h0C%Nw73`}e`_2DPv5#Jq<9Ej7>Q(jxs>c`-cLUixRLFT!Tkjtkx|;QJ31 zw1@Rlj3>o)1|zR8{nXy_1^ijO=!nkV@hh-hI44iXOL}P@Ohv(mE&Yw-=YppcD-eq{ zI9@?s|M7MUHT7c=Y~ud?#~iv^BxvADU~ z&xCH_%%!g<{puhq9*J-T){TZ-yCNC z!78sjZ!b3aQw@miv6(r~A9LMxk}RrF1#X9RBouE@8>zW)%jQ?@C8>-RaJ?|N_{DAY zX3AIL`x`YZrjir;9KLThYDR@|4-IGH6i<@V+3T*feQ94Glnq8aP~NeC9~+X1pvNq* zpMUw{>eB}ax8YLB!xE|ppa}y6f3DKWb6X8hjE>NE^rzdLyqo=hY`t@EEnoPr8QZpP znb2VD>l^0UD7_=2`JxYEk(KW?l#jST4b-%?{Jp9U`%6!Kc$jiMR^lQ z@|EgO(zx*pK@MBOS?QnO$xM_7$7WP{Ll$UTV|$ZlEpGBufZCI*DWpC*w-n*$-Jl;9 zh>xXiN0sViQsV-OB7{aeC(#Zo@YZQR|FZ8}0U73J)v-^IYu_mlAs$%I0eBIM;O;!H zD2jc*h4yXUha(VENN;dM8a&l;?aL|mR>cROZ}bmIVmaX#NM{$+MCTHGI&Lz=3SE$C z?)5_}wNb)%(8Z>@brd%IWd;%#W_8#(US~838k~9yGQ zI#!d~sYQk+DdHVC3@ph$2Xt_5h45*R! zU_3+3{c=37tKLAdYiSr1p^!WFo-)xp^lbJ47zFH-KwD|zaM!a9IchePlBO!rpA%ep z8zWDo)Rk?t9#zYA4JC|NpVzG(Wh*UJp8Wk<)t+_X*JMs(t$s_O1EB5d!)m{x9@T!y zM4aYV?uAotj_nFgAE+t{%$6Dxnjaq1b}Y8~#&;jQZfvl+B^D+NC!v)s5zuwUEfooyTJ_UF51fYs?~PRp3B48LDx}Cd+h<&%kT%+ zBM<5bl*4DjfPQ*(HG_9WLtF~`XV+d*&MN7y3oWdZu71$C4K~$(XDE_qP%3}dBHE{C zr@t%r_>+!Pux3C0g8n|pFxg_7mO!5DE!SKFXBXMB70ShaV31%J^1%LfG0t(Ee2OQW zfo)T9Ef)@uR_4qGwa{nI-T|HeCOLM3Y=}vnsi|+W1O#z$0#7f?3bg;Kt4o;a<(R1c zdYheeye*UEGF?-@r+(v|TUm0ds4IZVf$i zE*c(GuFUD}L_Lm*XDoRT{{7mimH+Jhh}rw{2$-VgwUA(YxnC4^F`GzG5-BeZnDII9 zh4gaG1~9y^=I{_1YEIQlhn)#JS-mlDt<9~SN57zRndiNiYrB**$5^i`zcN34mM(RS zMG=-DEOs@mi+61B-f-gn4LR7chU@Mkw;LW_U+#mProp1%Lu==B*mWgVCPkR_Wc_Ofsjzl3-Zo zNg?N~`nc}uA6S*5x-es+$;^dCw4G--y2M?I09o+W%vip|Z!p%z(PmYfm%UT9d0&4- zPWUduzU#W||DGc3qSATPb8f}&>dj0e|C0tYEF94^Z89cTwB2PU$8UE1Fh8SEE+RPp@hGx;adcktc?{^$lY|0f`ZHNC2o-t3KZ4-c=qd@{S_X zhY8*tMPk=QNKL~5Gov?E<`;wf!R^kA%?`f8-YZe9;+ETrajh|>gMdh7Q3!enz^H14 z-={%b`z2<(bZ*(W++J}1-C_T@rFHfB5|y(Bq&`IS#$D0XDsR(aLO22c(;|o12Q{d| zr<#0-6CKp+0((_|%F$b$+19K_E^J z%rQdSBHm_oYT8>D=D*l_?%sRXk95w76U65TG>KUg8egpW!dr7Ef=HcmZb+j7DyG`4 zGQ5+x)}igvBf0tg`ncwVi6eif zefQwvQsW=Rsz+hYIK!(%wai&qS^?yO9w|2SiCH%ag?@)UUVP8HX(Wf>%WZ3LJ0WjY zW5`wvezNzBNSsx_`1e%($h%tq@vX2FyV-+*-mcL0@hpX9iWtn2{fIy-%aVoe&4O;< zX64okv1JDgfu^87=G_e$z_~kKMK5KDa4d7C%V`~AX29K#|DrKCvQ1_w)a$eLElh*o z!8fJn{ZY@mWMA;)Z8(GF!2QtevB;d!X94zh&Mf2NYV%nAhUpDz7lh@i0YBDtyxy?B zPa7Dqki*wx7x`^ns@RWIz})&bp*LPc9^%-ZVn)&j$(jT;8p>ymfD=P zAE&W0jDHU7o=~)hFvo~*<&TlCZ@+H{phA#z0F^k^?WtPOpa11RM1Zhm;CL*_B-I@yUO^ymoYEge2Q?TD z!sru%gv`-~c|MVIs5gm)pTPCS;)AFiWj4ZoJ+|dEuq+9?YKzaiw^FG~LTPX(O*atU zU&q>4ghAf+dn`P0Zhz|uvYBb+`3^cd+YOslp35WjD%Fb*Uf&aGruQD`ufth=qh&uPhbtnTGH0~S_HkjbvBQo}Ik%&%dh$8{a92nD4xtvWy z?uEGI;>R%u0J@;~q)CMm(EvH*vSh0G4KhQ+=Ephl8P)YCES>A5+Pw@pVYYWZ;n2Sc z^<4LaX^CWyRE8TNJiy4VbCxWx)s6Ji|&B{*{Zd%eFY_`}po zud_omiQXzT48gb)X#YKEA#XW+;i}FeG0qEQ3nduY0IssmxocF7^Z-hSVs6q&$r})p zHP&aXc`?OTS`va+*pGKVFMic!Mb{$9$LA!T{ogo->P6<@*&@gDDM*~CBVjIyjSt4~Cet+Cwb}mlhJLK?K)trpXMWK95MYG(6)YNy8Xfgj(|rBdbC|`O#{` zUN=8q$XY;p8S9P(5gq!d8>!1;oJX!^vU3m<*!(0bsbi}Kx4e7*qw+?;L2qT}>AXlGqw1+kLe_^OXCYmN392IAcY*^z$ChS}GFzpSvsb4_XNKTTOTG z-A|G9gJ&g-&Cb9B>hcM9W&md?zC^vkI(^NH6y$g@DnpPnjQ-6*KR-s`xG>t;k@P2ELyVns*=3 z9xX$Y`aMgN7+4D$(7V4E6%R(BFTl?D#pwzfLPJcL zRe?lwLK!i`vGp~Qy4N~~BN2&Wd<76O2(dwF)!9ssxr@$7tu$)YXsa+*y-wK;Pzaba z=&z!D(mADel(h-m=WlD++m~`cvI8CIqvUW8be=zeD-R7KoiO}_kyXIJ>s3-x(jd^* zFUSivvEXdTLJI=;GaEYoB5ea=Rs1t+L5{48c=qQWrsGU%R2dwX=(QE_JNRWi5ptAc zT%_^izN&CaLFaneLjAg?u~v2q5Ivt<<|_xj>0Y14hgr@4)=Ui3k0>j77|2pI=nmG9 z%_LGZnsAzzPCjphd8$gMRvbHuEv~9qhKiF`tR%oK1E!5!Cd8j5OUoqH7|R~WdTZ#v z2ANy}79}-no5)DWA#a|8a*oPAkNGN$v~OBRhDirZETqnPltx>#=7>4~2uA7Il=Ph) z;oF1efg??NB?7|a5=E>;+VzHAu|@T-sG)9Qpl3p5VM6WS^@d7b`Lzdaz|%P4iZqiP zQ5r-!3S)Z<`L5iK{C(TFM-B!@1tU(I$CjqguN^uxr|ITUO|Ndus!nLAJaVZh$5B8v7Z9ImYS_wd6H{SdQN!;ftysYi+dYx=;k^ za9H=LEO5k8?2(X3hL9*A)pD&NF*yQ95hhC!o7YI8Jf-_7atwZ+zj(R8Ngy-2MYz6p z?8e!-#bWMdnH;FnRjAfk^1M%@%U$H{SmI&Aatcgax}UU$8N$xID6!^}_k2frWYqpGia@t`StU8Br%vq_?q49lhKu_feDdBo4}A`v8O`(#Jf5O z)kN-p6YjO8O+=vO29#5z7yPlQq1%r|ZAfF8N!T__V_{VRf!P~n-^&BK#T?>V{%RJd zGbNPAhD2mxJ+EN3P?ZgnGwzu90i|@aq`WB&hc>UQV9bYuRI<>0_2N61Xp_F(Td%nthHMvTPC$N}i*_I|DU+s0V}d)btA86A;a* zBP&y=Zy7EE0&ywzg@!;;77sY$HPzzck(r>Sf;`~=`XsUSxY4jqd*OaT_M!;8Rr?T; zGvOJ!{jKFbzyvnm)uR8U=}Vh_1jRs=$TDHmP&tSV0O3gku;OpF)W>YF%q+?7jttI$ zYaHi^b7lvkPr|Y{9Ku%%Qk#v9CdQ7SqS`zdBHX9%`KC6oviHuNKoH;&fnIhW-eVM} zBp3T}HScj7!0&^_$zbJ44?B@^)GF?gaH?*^i@@#V8JN_DCTuo{{(?5xTmx22rGc)x zy5ye%JcxPJZRzSLmV4BePtp<^?2o_J(@1)O*unqwREDx9)Z(wh+U74>E-P~%h-nOm zQ*a_(Z&n+gTBH^&l7@GOnt^?AJ@UmFN=9kb>c6$HPZ%2im<*j~m{`q3G><%z5m!0R zYkuO&QxCLPy+RoKX>4RyW6#=c-zs>V*s%FiLUs7Na5E16w8t_@)J~$GBqGkI zVq0P24j1C;rt#EcJ@R)4JI!O0R1pfL?JWTU56027oieUOwk*wWFo`Du3m;(ni*iH< zc(?AfGsPqzC9N0dUc~vLHDUtFrgbW!(@)k#VN}sDB?kf?7{;`nA4KidxoCqX8eK{k zt@>TSq7^!smhXKV{1&hp%JB<&a_o^>rzlsQETj3z9>DF$I~uJRe<(zqg@O;g!uSft zEGk_U5W*dx0c-HL(0&JfoSdB{j4qP^pq$C1eh+pHZRp2T0%IyopJIgkk7-V0xi;`f zBq9(=6x^T$xG%h0EC07+Tdy9O72`N$)AUad?j3pz^`RrBCR# zG+MIiqZP)5DOz*N7oCI+pK%GGK6ezH4W~?GKmBc`YIP#Q=o9Ui4XN}Jt(AzV^%Z%R z;QW7jj0kH`A$sPBe*IK>^51Rq2C#zTN()^8Bh&?vhno4H7hXXjqFI5CM8;%^^k{aU z3aLMvcbqcY+U}`amq^uN{sMlHd!RuY?`IRFApC|S0#uQo&zjs0 za1K~_)@o-|+!O@w66;h{;f))$o=XXX|7JL3o|sD>y4C33l}=7bVAK5tX^#PC7iiE$ z9k7@M_Mx^ZNri$TSx3h{*p3i6;hf*hM9So)R?E)=JyrDZ^Qx(pD_hLsgIQqmCOg)8 z{Pz!jgCirNTZ@vDcOjGk6hM|aIJ8zJ5am0OmLl%RD!RcM+HkV5vK|Z+J!sbv4(f1s zADK?34LH11hY5;*M`0p;9fdxyim|HSl(?3Te>_N6taJhgnAkR{(e7}a74t9b1o*bY zRys9|E3_P^w4ZruK8XYKaeQYAj`P1>sCb9mF8IljzcTe;7~0`RB!EFS!79CE`=NeC zVZNZMG~5u;BB{ppQM{(rQQO|xkWMCOU${NyM>zsANy(ycaE38q2#p0c)o{H8%{XgLWenk|Q;DKo+S36Ceqk(=Vl1{2 zKp~P!*8FV95d6)7pa3>#f{3G%;|_ny;4cLfbV*=8;|UDlR)0YyHf9N$judV=9bS4V zI8Pi0@)NddAzTHbKTD<#|Lh6UR*)n1ri<-SX&gj*|4Ad!ktG=(iGo#P?+HW+2~`qH zp_Zf0Qc{R}Lu^9s0#KuW$L& z(3u$GC5_FTdjhaW8jdUeov)5}F1r@Erlz*(@M2Us{<&a?Xmou%!_QH4TFCHma$d)C zQ5rc| zZZ7#81|L9W-Rcl_d|%Dq9_xeepCugt{!N`ex%mV(0`Er=vP>PxE6YOD6!Rd-K0MMj z3u>wz2Sx}fb>zLD;u?X7;gVMS{e)sAZudq5hm%9Ok zzUkfKGNud5!xwdVAv^p|)*@%B%!ExA{YSyhkjX^Yiiu5vu!XJ$)>!VQt)sKulML`H z`LknB*F}^pzh+S-;CL!HYC=nc2{2c@V{0^R%EP#2*Hos{zum!nyvl$k(k1QoqB-7@ zWeUh@{}Yne+UXKViE^K{{PAg+iAr=HKtfB>GE(iTY_lc1Qmaoe>Ney=E3m@9??}>9 z1XDu#c2N0wIo|ExYl9tP{btBPz+ojwLSI8&K(~p=VXk++Vqq`Cv~4U}yjK1@bK2;>%o7yVu%OnL`A2E{bfXKBD(FZm4W=4APWb z?6$fkzSuQ6O09V3gOsw8J$hKF5{cyx+nh6HO!w*Ki?koH7*$l;X;NHI0`I=p~;q${RXC`BSS?TZ+ zs9%g%LM($0A5pK*H^h{$6CwmS>jU?ACaEc*x#x`ajcD9y z_%fPr4r0qz*}XPZ0vDIkA**u?hg2g=8CrI9Ue;tw+A`(aFc}-Sws2yye7o>^UaXp1 z#?zEPj*~X?8hh3)Fx9oLi}N;LPnnHh7$N|>9JNOx+L-!hu$>os@xmOmDS#gY{{e^j z13wK?CX-gG55OEx`Q@pWgjO)&vvJ>4BxMe^_d*6 zyf)EYUI*nO$pVj(hqqr3d4Tq70>LG(V_7rZNle!e%#EFkc<~3Wgp}!$H&UU40%u>N zEdiC=wVINk8mXdb2sxD{zZ0(tM5{$# zJ>B4mD0~vF>p(lNiWbz51BkH!PRZ&vMpTcXC~M~=8CX#hBphqxJ3xFkf*aik%~;BY zuWNyoT{YpN&d1?A4%+p5VL;WXM?H)&=U#pQ47kb`RSHYpA0-As^y;S!-f9nc7(``@ zFAl4n5AVF4|T)A`ajeS7Yh^j{{zHu{0G|n$Ksg$P&aJwg#M^ODCYyR)!|1S9>tg^HJ&-h=T*Z+?HBYA$tpH?#ejsLH>%9di7 z4_1<3U|ex=lkQv0^+R?ZHjJf*KD0~y*kJC zH=XBFU&|be512{&4#30n`~Gn%BH(>1CC7~M>M!c80^t05V&!_oZm%Tf_JY-00PqrX zJ)v(GleT6&|A?U#H8-H|No@R%IS!lH!_TFv5EZx>uGh%vLaq9Bzp&79rm*9p|NT(t zdDgE{+OKGCz^ANcPAwr z1YQEea@SQ7rR&fiGA0;R{ShDfaNjZ#^@e&Q#9vsKEEQk8XIJ&;1By369}twF7tV zFVsI~Kz8D3aFDTbD_#*%Xiq-zIg4$B<7H_ZB`RfhiMB6wZUmN^CMz}CYkao0529G5 zEwkvrh#3NB$wDr+8#ydMM;H)P zr8(8Mu!G}<@9+(W^2=ich{F^o#OLhQI|0Uf z)PpFTr3p9}$CG^X0dS?Nsz_{w=!a)ZH+%oz%S>Ce)~mABERK3b?QdLoJQ-Fg&T}!xgMHRS0n+${f#Lt zW+=5SQ8&f61P)Nzb7KAosCHxJ1OxCp4jy2{uq38~_(x1tX;WV$Cj1fkbF#)(EQJ}? zMiwG3Z?6=~j1_QedqiM^Bz3Mx*iI9yKJV>POsq}GtI#xE3^}EDNP7`eU>hGGCf}}u zMfRJl5WI`>^LI7p9f#i)|3bF(fOdR$GleU~GlgM`y)UX`(sNf6(ByheIyqnon*M`0 zhAGfuwR}=U6yi~1fs|rA6$YX2Ix&u&diYNTsh0a%ddN&)A<*nERm0RENlbw9Ut*<{ zF>R4NL=1LO7)y)MQ-1UjRSD8KQ4Q>YNF{mM12u@}fJ{tEWz5DbIx1!jD+7KCUieAY z3y@x5gC3Pt>4XU;;@*yMsboNGAFqbREU}=LC2I=KqzRMmOZtW_s0&ySnK!d~qj2$* z9E#AHBwf}Y3k)7kM4PQo{#pa%qJ|vkAP01F;E=7#%tok&mhf&rvtzgH=%SqQ8hq-x zh)}E@S&YR1&t0R|k2D2q*X8EXPlWimc*%$p^9mvn)eyRS@ycJ7g~$LV&V}%^bJt*z z1EL}vH2tkx7f@~OI8zK8t6TVbuT>y8+?Zm#okaR7-oKN^-PAHJXUJ+eJ8MKqf^S@6 z?&}qVa2S#F_dQ%R8oJs>!C>eNx{dj=GX{>KP9i{y~Lxm$G%ELmDP)Og(R=btiRfh#s zaY2?EQ-r2g#?mq!tX`(M_qsvyFoK}ZvN z2OEV~*=%C*S5&FhW2dmS~SUP|bm`qs$j z#jRVM{)^Si%_iWZhwtkZvGfC#?YXC9kG?Ev$m^Tq!d9#KmmPjPg&oJAcbpCyyZJAx zci{(~T6g<~t-g7}V{okxzetVEPj;7oZ2(k+KH zcrb_Y6n%jXq|$?8ulc9HgEqsI9HjFuf(m$4vHp!aR>A_P>WiH6S_0Kn44crbdzVDu z(X+y{INtB_sS8DdM$g`^#@5nsUf0v0STf@kb>gg50#th+$#k_=U?V)mi!MWf+`IEI zGDF_ei_papSa%15He{5fY{lVv)_?B-b>yv75A{+->9>_3nwHZte|r$8qM=vOD5h|g z@7uD?YqJ6N%fmlTCo5qo!giKnM2L=+^+4$_awv!`5NgAPy-R`Q{OM!CyGC+j)Q91d zAhNfA(!U<~IBg%{2+7KAL8f8i4&8VQ;3mmkv` z=7PmasV3h=F|=V#nvQz6TKRz&Mc#9ML%b>lj$6!RYp*O*@^U|HdBmMpo|J4%)A#^h zyEhP^$Dy6O29jd!AHOKN0gQ)X|HZSV`qd=XI$+wSe2mC-lHiN?Wlu%XMO@KH(ij><{ylJ<|#4|99%M| zI5F5PvMvUW%x%4lR7booC7RiR$OaNiAg2kyLUS*Qa}Je!CHWF*7G$^hP^H=ZO!5}$ z3KeW8W0Gt*7@-l!Rl6G*+2;JTcy)pS{H7^VQ~W(dfDplcX|bx@m(7ehdhNk&qHic9 ztqIUy%%_ZBF@10OlkU+o4h8Z=uVfhZtyOo>@q?W2%s>Wm$oXgctdtzPUGbEJfOY|J zd(mxrI*zyeDu6Meb;c~>b9Nt;;aj=rmVeHugSU!9LY}efa(u%!hC25;V5#zKd);bT zSr*;o{tC7I4P+5mi5U8o=xYY=xPjdDdF+0{SeN9?(J|f}6LR#b)s`SU z(q@nm$$>pB(1*CI%tH(r!FgwUG|ZcM|C0p|WZ)?hq1tTusXW(#`p@rEydDr6?Q)-W z1^MT2IX0yZMViFUCMuR}3*#AkiA5dfISam5V1P=`5kki0DR#&V{vXcwQhx1GD@2RH z%qUXE{99{%QIL|e^SZEbmVGB|_op}7JS9niKc@=J?Q~ZcC0Lnvb)9KI3P zyg`Wfk{AZyVil>CPajR{71A|@!#1cV^D9edu(oBTdVktRIDpe8UBWYg7=&XLBQx3*`&E(uzmP z;`Ow*8udvq+)=MJhHXi**8BzEQe*SYu-q`H{)9%pt0YaDCYEann?(0*ow~!6Gmv99 zx<@ys8o}to7&F5FQ6Q8PL-kqUE82D=lJ6pqQ?y!9S>whq;|{>z(PKg6ceu=bC+)vE zTu{mM=Q@9BlF!LCIh{vByc9di2;2Cx!Q$6wC#5+B#N*XFZ@+kDyBjcIJQZpoKB*gt zg_AACy05jH9=qzBmz0m$P;`HVU5@BgJ=rwibY_kjCgDQ)Z?g^|hWGBKmsw@`noLeX z7!k~C#I1t{Q(Io+Z&w4iAt8600Ud#r`|@q1u~wEgt`CrN*ZLCvjX*#vp}UWHuxc&+ zKsoWIPo)KUthFNU=CDC%WChhM1drouL!Pn7$VlD+?-&5jb5K>+o5)AV=nj;$BvaMs zdA9A4YnMlzaVl>*F*}PvcAD%T)`4^`;3C_OSgT!~m4u;ntaq~swwwENDbmjrtoBzo z7QtJ{`Q4Vv^RKfn{vl*i*MoJ$P1Z(mlwRB)PSt-9JQhnHev_B`zgvh7N28Oqw$*ie zb_h9(3t)AoLvaaAqpGls0@C@3 zp9v{nY2d~FD23w2gCoLIc=6U^uMFL~&{bk-mimd@WkaLZC<6t%eHxzZcsnDI72fPW4M2G9(zpHP^TBpTdK%}>fJEaawmuJy zY4o#vaQA5GBlJ5-Z+jU`18`!dLL-_@0E6tUJuw3CC}ruXV#9gxS?mJ_pf}u~Yq#Bd zUkA6oqB_JgeDdOP5_>;YTob6|i?i-pD0;dUxXy|q&a+E(z5IKE-q(w%zRPl+T--o) zHsZH&&a?T_nK!2&k(L5EF=E&ctw%i&56M(d4Q<{8X4c)GDqN!O>8&dAM#LUh0fOk^ zKZ`;bC%_)*@QRDb?ruKNRc2?1wJ>syexcNG|Ep??TF}^J%O;m11QpkkW6@i`)WfC& z?h4UC#DiPGLgr~>mPIZ7yk{37DT?k%1Yg5@8O=-i@DY5%o+SAiiUkN-txOtjD0L#`*&*Z8&kK(y7V5GF_y8m08 z;JXYHdyJE=fIM`q$jyCSPvW}>Dn_fKolgPrhdqzdSTn|K~vZB8= zFp%VI_hjbwY>!vgWWWs1v)276>h%n|&HYC7Udwm(>?6EX#>+fC;ifZLe{iNK`Db_T zb%WE>2|w0`?t zMZpXr=!LW7m-Ar=5?_M!c8R*a6;J-9i4?o-F65ufi|!>TDa+&p=)Y%V5VU8!s5<6k zoM$xhQj>DW`@mW z```7-K3xAAP8X@aIkbueJ6TEuzfaB{UP=VJN;UpHeyxm2@B-|_J{8UvUI%0lYr{W}H}AEhywxM)XAN@AP?yMc!vp5UJd3xzrT0UKb;>pEwbI!m#g{ z62TI{`^4EtPqqqWRZY-1Vi3i&86B*MCYg|(@Q@Z+j#HOp*pR%z&`cZ2*}jgPTXeH( zoBsSFf>^ziEx?-2{howJb8I`@0}E)o?gZ!BV8@eRjVv{B{CilcA+lgaBv?3zRU>f?35pZZ|w-#HjR$ z&{ANB|EoZoa>Fv2mQXTy{vevjTFZ?R;G1P3U+Y~SYvgwUX@w*E_G@(@6S%~ z$92k+sQaS2gdrqG#tR(A#J)G}O8!m#{TK7I2Y47m)r{FEq!H`m2UE->^L~|!M5#QS z7?R!BK`>dl*X@-4p5Dy%{1D9rz49fb-<2o^#Zfb3No>fRf+jw{Uu-YhwM1EBOfno> zK!Y0u9+yuSC?oK~a6Xeaq&VftkTnVY1UzeQ|8b7NfNkhsLbe>OtL>${7+BRg`LzNX zBlHH*E*3H!AKiTz-FQbkC5Bx>9%QP5(IdE)E&Uyn0Id{|Fk{ZTB_*8vStq4jTMAvg z6e;~35hM8>KvK(~wnE3R=rJxT_fz_xoV*Q}`ExY|1{W*RyV=CMfbHv044z3z4G^|e zWA>rMZg?aVJg9`gSrFGPN?PsM8kIabFF5{c!p~&zml3-NEzk(%dn{H24usVpgpS!s zgdNT$Ncg747m?Sw34fh3!jH#j>s>UJyFox4%}fah>{LXsMHv|*e9qfkqUl{W#8Kn% zTiUOJ>ZX+?B)k(of@U8iWflBr7Jzai?Qo){f#*vKCBOniXhK)OTLvva<6EO{EWr(y z0zwH^pCqJ`yF-VNJZDUdQ8OQRAu*X0rxIQnGE{bQ8Y=}{Qr85+M&m~x`*!H3?7W5s zRUMoZ&W?Z-sZ)$wD858H|JQv9tT$O|oFH(FQpST;-rm-P8kv%4e96!B6rkQpTCvC_ zv()Rn1%1=(7M=F$gm6gHK=Nx1KQxP1#T+yu9n(HC8fLeb88X@;a?l(m*})m+{0u5J z3O7Fuiq(v-->?ZZ2G9Ml+FdjWsfUxuQvT@}B7qo|jdHZ}QjLmTs{>v-!%F;?Y;KlW zC?Kmq3P-&*M3eP#)H~)l8gOZ4k&`l?u#3%6fy7w{ssA#Lwhnm63+uYOI(JTQXPlCH zBsf?CXLIRO!`%oPP-C@e%EblQOV$P>jq2B9^?f$$(cQ`K z>N!9dT1w7gfl0fz>EB9n@%1!UgsKO~3lI?>Xf$d0GE+*bgfbN=ftpmIFLsqQy7)jUc(fQ(nu=#QqSZh- zsGg>1+3o}D6`<<$tkW;#!&>fN~}1#sgtDQb~GoRqegjP3F3HBeQ4OEq23)jZA(jydlDj!fzHNU~nkd`4^N zs(v?8c)%}Zw6utd8Rb4oT2JpO_mTIKd%fZQr<)DHxc+=eWT4f*pP>dmvZ_vyKL(pC zo_H^8nir&4gyad5YUqx*1;lgG>VR37<-`gk;C;QO{p>$osa&+m+uewL2x;02(Ztog zpL;NkWH?oJ6QXN8=%i+}rN5Kg{#te;&eY&JMerD1ND6Fm0<}owO>>sYF(-L<;IN-x zs$m@5HHRVKJJRXbzJg40{KI;yt&<^-ck=X*#O=lE)g5{xg%}x^e{;6(-#814S3fp> zl>2I$1StFY-~f$~46i0yS^_Tt29oCbq zsP}rDUDfUq^*f$Pdpj)0NNTlRL)H@m)RMcI1F#b@@+xp~l@w5>y=Q}Bu%qb`g=Eb% z^$`HB0n=>khc5I)p-378#4r?JLP?S}_Kb6i*#EO<~5)1v|5?SMj?JjZ}MZ zxIbnA!+J8Bzh4)}+|2t*ZgdYBb_4G8mW%lJI=OA^HIqA-(snTPRRW!?u`8d|3EP`1 z9srQQ@4oplEjcGX!u=~XqpBT26PU{}68Ktj@2wYHTpFBoh9$4NOZO0%C3I7C62>~m zdSx3G1EjH+e9sIFLb{wQ1`4h+qpu{#U7@tx-QSUrDyok7ph9YN1hzFd=Ae^8MMug^ z)F}#6Lav@P>~i^&X>MbK!Ds2}U?s}c0Kjn^^0K{cbRCuZImsLgX`_NaH_wSiKjq+L zIgpffDOxiqlpNb9%ea_}B$a%aLBfD>G;wqv4eI6Oq&j7&aZB~-?{#uN0?{-xg6Pe0 z%+jw=W&Zj-0YNv0*hmKkj0NRt) z;ykWQk(99oUm>#|rv+PUGlSo4h;WW9?kz(t{jtf1*KYcE+oX%B?qycj;H8^*uzRBW zZtDVE{&gV&gL|%ayemEr_Dm;rpQLGjZY>_g(7;clxx>{<)hM=1@Jo-Cw4XzB6DJPDI=3(u-Y>6-|r9D9#A?L2j!ayQ2HrsJ%RhJhvnIwL#b1ldD(VyMx;N>l@(XqPbwcTQv*j-a^MGg$ID$FS zoqD{s3CFw}1=>`vlDJA4^juc&)ERVGa3Om$~Isq6kzg0pGJATbUg z{BCN)k*T*eH{Pvn{xbZJe9F(C-_Omwf?Lia*>HG#UV@f{$A4si1dScRb>ojOZz+#C zIl_-fE3-PBc%AZI?mh-S^8hPTkF7?q#zqP;LeSDt`N1o1&MR`F4X($7gxVP|JL`P? zgmwa-z)dKZp)s`2V)uDyo1}2=h#4M0$E21|iqBm4f}u?-zub6&rYbqz5Z4IZtR}hY z_{d9|wDl$>K+CCDghU$g%edZ4SJ2y9tRlvGdcatXG~o*}+zL&ZA^-r@v1$HDALwb) zq-yT;o*NB>@StN_&4R`z&bBG%9sJEkNPJ08H;jwuXF*rdpmvDlqx57W(sVEPC_8NZ z>MU;vD53T0m~USd`v*u}F||C=|*k472A`|Fpj@HQbl7*=^?}&BZyBf6V=Nz$N?G1dxmCImQaCynaE%E4;fn zo>b$8u-&sopP?;|#gWVIEBWnGMTa}qyHsj0gA@c^^JqM>wrV<#W+l6Wz2+irEOHIZ zcJwJ1!;AOOO@bqNpm6Dh<)$~&$tkg~)c;(Iul=l>!YSg?GEjyKH6#A;dM@Oi8PSEg z4nZm#z!1YD4Cvh^{^FLe>Z*Qz*W_T(=S+I=GhWdOm558o;cjB=vyvj7)|qOp9eOJ0 z9xgdW)|w0172y)&r0JR@{WD6C!z%@x6@5B5C9$k9JCv#;aPmGXKSf>@m(d#xC3nS; zAux3`A4e3ibbntywn3H~0+$&N;PkB)h15Zfe869`0pK@P=x5t_d{^5oyZq|9gA*b( z3YJfi>AEbo1J4I958JV~2bgeZVIphYpYpK$4$# z`8pdZLzEgB(mDy)k@QzP`l{TKFWd{--~9YEN)Cmg?~+>eptKHepQM%EL)9$`ll>eK zROspF1b{8LPOKMLC#au^N)l#$vvpphd%dYAS zBK+t&Sa5dy>T4=pGDEChYS7BIEyDy(Om>eqJB#uz-wUI(-_Pc#37|gRE51KY!z?Yf ze$_=AsG(xO~ z47}A--i={1xqQ&@dzAF$AH5nV#1#?572@&E=#a6=M>!(^45xRAjywv%rV6Qd*?f4v zqxni~EK$g`yi-=5qGotEiuHW^+^(YD0eJ3?Su9qCwEmPg={^l>e@9QN^vllKQa=1+ zp8C@jm45wSjJ;!UrD3~;8QZpPb!^*q(lI-Bc5K_WZQEwYHad1D=Q}fVW@^rlse1O` zUG>(ky7%+0`&w(^*b||6`lKlo!QW7eOytKft&S~h8nC*_z9wYNUHnRsm}O>^em}3A z|5z>)U!+ZdG$2ic8pGZh2OR?*e9ZCRv?yiRXh_;Iu~~Qu#1?#&!zOdkJOz@1l=Oro z8V9V|oYA+Jm+ljH5c~NpHk7BZVaM28BZ~)6AZ4mSQTxFU4vH@6ws5Gs?bUG*PHo$$ zK%A4?t3x*rSZR`A#LcVPn$!a8{6Z)sP`|3Py6LMhV(!T86XSp>4y-|d#-+s~(2bEQKt?J z?Mvwsf7^CGB6P0evirpw4QKAe#lK+SJVz)(_4NWKh8F)ou7MR$8yfZV~$$T`f%%e04?bSP4hj}*3Y(n?H4vwZYLE$r0ION zNp5Fm`sBrH)C}{fe>thE2vzf`RR^GF3v~1-4+F7gj&^&%t87>a$iKFM^K0&s z34;yf)RE;+k9_Y;Z#!VEc@#L`&n^-wr;)n{l?hYc@HNjl+Cn2(GYN{9UoiV^BG|}0S++Jd6?L%p{Xh`?K*-5#==?!$C5d2$0lbTklR>b<>}`n`T@jwR0Y zewhAJ9-QUlM#i-*u}4T0!0+7d&~lTB>5at!SA$omHGF6@+Qsk6_?I%ehL3DO0JLc@ z2z%3paaQj6Fq5Zw3?0C^lW;Fw(FIljeRf={Zi#75m!SLL)Q?1K;-`(f%?mvalzO3b z?r&c=M?QrcMYIE!+A0wpH#wazI=!mKwYTLBJ)Bz7t@qbZ*IsOZN{7-5b8w<<-D8WCfZK`M?a18|ef1t-gFFTC zhvDlJjXZ%Sd|A1CIU{{5`_~BTG=-RY{We{SZ||6V9{}+zHMZh?^kniTHFwwC=6`6$ z7=uWCm)qY>vb{eWgzqmOkMFa)6AAFoPKDkXg1?ZIySYnSrL$YJ0RLXVcK_(}?fa)& zuXC<1UTFF{lcgtY|;6)E=$#Vf-zsBD$Iu&Z}2PXYCaUB|O~)x>>4zMVxv_w%A* z`Tad_fM^=8I|K`t9DWU8K4AM~kGrBdIB_v94Jj5I6-SN~#wt3~FX@1-h6CyrvA9rh zcPs#&7csnG6wdt?Dr;@Gm1JxfVkG=2>1t3gj{#)}VUE#4?Uf$_@emF%`#D!~X{-yY zi*>2O4M=V;%9}z8Er=NT*s#LEb4NxFW&RD2Kovto9Tt#vDfPSY zNmN-d1%6-*O=M$Kfk*(LEvZB=!Wd;9J|C`H6eQ(>A}Uo=PKH$Yyn2|So~{z~w-0Lk zl`JuFQ^L{1h|so`Dm(%5jhTbQTmClBa{CB>ARr8li4Yc&Son`E?y>@Q!8FT;ZantI zqA$SEV~W~cWYrbW_`|Z)v=R%Ouj!q=8A6nso?K>eAhScNM9!+zu+QU!=;EY;sQ(GL zgv*yDxdY$B_sWp4`%XrF?%mxp&fVlP z^%JH7jGR4LaK2mD?+h)EEC*Q*%kmciE?R!sO!C=tLmBSOaapKCBa-u$C6FcryXE$Q zo!GnveSWX&52W98z?kTt&GwdU*yN8=rdkb|v>uvym&Nr`MQ!o^#W(u_{;-o^xT#Me z;2|RWn`VgS!K$#xHelP)mbL!IY25sE7m*+^-G;#qq3J_~@^BL2j z{E(@H#kdlqWU-U2sE}9!8yk;cnQZATEm`ewkW02SJ9jFp@x`#cLMnV$MJP`jnRapT zkFiQRo6b^Fo{sgSwNsFb0-)6P9fgF)of&KuGdJ7a^hM)He63=MQpdhK=kDrP1? zjPt>QHB;N?lBTyKI*tK2=d$bosS^zxhtcnsh^(=w9#vn^5RR8~Jf-iF9nH6^v@oJN z;tpyMEKKA+@Ibg0n}!O)Q9@GjPFEorEm0@QGjHs{>j7{3#MCax`xgXGt*3~|bwkWCvhqX5y}ZAumcsfXzZPYPO^ z!#1%wmEFBxObutPQJGHk&|TO&S@VABa?VQ83o2wI4rhJ^&*BvsUNj;<*PK#Nw-QzK zB=J4v{TU>I!hso_m9l{mlT~xUNkRS>i}MlvV2HOh*eu+~G~8n0=$#XQcw}5ED(xn( zf5LfsyCRIB??H^;D?Uitjf+D*iPz#|ArZUjY!mvv+=sDti z+Gt6-$qci~3@|x&v%x$75sNVClI_huUei0QxH1Oexr5&_j%|#xH_(W)og+>e&t&Er z}G;VP;K7f~jXVUk^m(PWo^q9Q}a95PLQP?f~R zFv`}jIM#=SSK$~17_tZ{KbUQixeHN|2u+j;V^{lsH~`AmC82vpowS93fPl@6P1ZK? z`W>1Q(Y+Qd_MnMyPpAv`121!UtZrWiH~-pnOJoI@2@)lGBNf|4I!i&tKNT4AwT4)I zmY@4H5e)4zRx&jJZ`6p}^(JWB`1ql|V{B~^hhiLhk?mhaXyiYEx6%{KxLz&ONsx~B zgT*~dKiL=g3-q)R4?y6VCL^ssZDMjd$wkTCBrZtCXl;r#udoz#NQKIC?8M>{Qu>Ha zeS$g_$u~5L-u;+*Z0OZ-w1X7bQj^axJTzqQcdfl+&_8;181rb3C&OItY@$w*yv{myOg6@saQ~QoCz0j-6tD?3mZ~A;jqo3P)I7m#gX^#3|Y?y45}h4j`H> zCPjbtE->nXXQ%yX$TczSnuu z*qzD3Z_k8W98@8N-3KWT(N9e^g0kI2KL4GMV>(5+^I#A6ix1`Bkm1uE1^^F`Scsr0l!?ATjFt}M8(qx4WXKv1k{oi- zIZ*~6>dHG8fu+2%P>P7OKv9)+T?O;pI+h=!8I0}MCI<9;2>nDqJggQ96$|%)i8}&_ z&dif3${Gp`gnuzI|5co_4G8U>r8=n}83bUk2eytVS%rrC74E$!?Fx45861uB%B$_U zM`DZC9HbA)ZNeSVQ?cj>b902*^Pk64v@9mzcIdQ@*E9;`ff^l{3A6fUF1L;acm)@0 z1tDdX3tBw0X~L4H<`}ZC^fCn0%sow7(iXZJj@JxKeDaG9Zoe1$hVA~CWZg$ZPVB5fG{Jsj*X8K({`Kx;D^P9=e zvV%9vXYOI%&nuIk|2Wp@MIGiiq*4`dJr)*+V*7NqpmK;~5l7V(!=6kDwM+YYs@IX~ zV-Eba?>7VfqDP#}{v^&x{`czLs^Q%__1sT~bn!B8tfe*Jx2 z_Zu+(Tc-n8_4Z+GRS^=EK726NZD9VA*xrSyzQZfng~>mhBN7vkLt4i57rMzl2eT_c zuQA2{FsqK@l_jElsw+P+6g1Od2FA}syt3sZ)V#6JfmVzGxi=a9fQ6x`Y zB}1G{ffd?ZaiuU|qdvr@4tk6MUT9U8%AcGV#|IpO>d`gpDO)ZJMC&p`@59_~>2lzG zkWpCNIELo5UY`_9LEg^ZBQR14m#3+a3L^NoFFh*GXlUFJ;7~(D{;)mm4QVCUK;GtV zI8yym<)~SS#4f3~oCEAgd@mROG2CvgB^4>&r204zX&wg9#AF!85zbJNGCySdf)$d~ z>8%cM`D+>-tVU?RL82U(I9sJG&o1=x;5n_cv?f$okb+{rbv_(%P3%$IDUpb-16zc> z*rtI&)zf}wy0CRzT-34uwedrw+#GFwx9&cCTJ!Jd=f%nZnlNYcn>0>`bG4k`abst% z8PN=4G3x;W-vtpz7V}m;>!QJ+WzFWD;I1CDeS%tiA9qXMHu7O2Ct508a=rdBziW^- zluCU1P8_Y;b$S9>%CE@%i>5QxcyMdO^n#PDyXEns7cr^&UVmvJW;9W%W(f@c;yGrH z*Hznk-Q}3;H=vNpIE?gJ^H<9VM7ZW|7b~Lkd13-gt&0x&KBH6%u3zZ7DRiBEUbrZ* z$wC^!t3l>)U%jOX{5#1N2+##_9-lQuJJc}3a-wUbDm3$6LZ@|TskjRGK+TdHgm0@1 zN2GtV`$gkF_eZIG>l!{(*&yGG)%Jkzsd&M;OMKD7AFpGCEC{GqL0O@=z&1Bb=&BSd z@N)^EOEb{UzLTC`W2vVYtK{HvnUEj3y(ilfVn2Ea84F6Cv$c1K1Z1nZF_xXb!zuV` zLkT3+yL-lrm^${yD;W6H(|A!=SQBqPab)xyI=^E$;ACS?VixnYHk1Uu>yZ`F2IqdZ z0%m#&CLEtfRujNMxudc6AmB=7bZhV?1g-)Y^ZD)6uOx94f|-&B1$*WjM=%XN>TCcr zc!^|5S#)1_&-ZdO$R#bcdH`awmYf(;k8<{#=$hW%KfAS$%a|AE)bK)`B*}|OT6v5q zuXX-X(f!Cq#;$_-`aM&h({3=O#GClph7!hx+yc7mK2XJ+O6Tir=GuMmgY#Q%qbCP& zxE?)sB8PF(L{y}AI>GJ@Qg7eh`aIR`!*1#` zce#)H0gW+@<3N(AQn^i;$T~F4qa!~K&o|k1_-7*(<(;!c!Yho)<{TFQh@)4(!tT%<)nOUIzifOj-M!?j-LK8&7XQmc z&vBXoSiRU#lf8FincbPVOis(4inNm@mQ#Cta~7@)Nl@yBnV>VsrOSrEyTEE*)@wUR zR_X7t=tHar{hxX-649l1cs}I5$m9cx{(C92u9SD$?HHLfc1f;u#G{2<#OY zutyXyvcmNpH3E;6h#6BLJ=|}na`(91Of|t-I60Egia8R!;zVG$fkLtEAJ+LCVJ*OE zvO&Uj!KjS+eZ32>o+Fa)qXwgA>3!Gbj$Zr(U ztXb17!>9nmD&in$5}eD9=qBW(z`Dctxc|$+mS~?f@e7X?{VhGEhzu^ayvMGwq^MC9 zuc=R$P>X)?g5ft1qajyV6T~%=W66qL!t$;Wc6kbX{gbFUL9(jU_a`BPET!Sv|E9qG zUk+wAPPYG1;5ZVIH0nV(SW+JvfjK}p*i!vJ>9Y>!8G-=y=qS!>rRscT*S4Vj~dAD{HwkxjqS}= z^pBMx9?`W3&uOMRVlno+7alH#+D`Hu3UAB~L%)$3E{SZ%^?P(mYj)e{D?Uy&`uos>mj#p%>{O2 z{u9wHgz;jC!M9jAjthM|!9x7-Y&B~lrN$6t3LtCYZ}95OWoV%N={Q#xwMfm15Q{TW zZ0E3HDee?4)WU)`Dp_>{W8&a(?%Jbx3-y$!C)a@>qyd1_k2tb$BxEurhLxoD_9dGp zpe1Ol^m3>5_t+u<0h^{W|FS0d(4|utbfEL4IuhgVkSZhm>lQ)5ig#OZx3;Wh~PS?&!8F+BKLbEa7Zi^xDE_cQ)}|17RXO5q_+^mX~k? zW+3c%lI-0uHNTW^@h1@xWAdlArh0)rY!d7crCtS_@jB|;`;Y&1PbY@W?OIS}5VX)3 zw|L$W#(3vi4-OK?B8|I}~Ctf8B)%!sh zFsMZ{4x^=DOd7!;>h$HLXZNRQ7d~)d8t>h4e#u*ND7p14j(S;zG|J0sNhbt^oQMIH zce14kH_^P9(VXMp=#UPhL$f+C!Af3k8e&6evq4}NvTxNzC6Gu45)^`O!%61F>>JX~ zskQ(H==cy?oWVRbN3%dUcVa)BP0fc&%=8)(P(#)q0&i${EakXo+XLLJP~FP93~y1+ zj89xbv_a>SBE%6XJa(R?$@>hSZ3RiAPqY27>q%AUEUKgMz2R6A#RH>;46n+t&|7lh zkR3@9$voPX!^lP^1IU@>59`Rj#poL47Zw5Pt81cyX3OXrv#A|tazly`5%or=#^&u; zr}$cSfnCI}jMn+(x>lDx!W8{$a9`Lo8*J1V46zp>xfB@QYwB#?KAQ+Rx)KUX4f3z} zjuB{_!n(ZgZ0eI~sU^kZ?-NnCqzyXyP&L4pLw(9yy{DGV;9st!Qe5Dc$-8wpi}j8$FI2LD zgR*O`R&RE7KaQdbTWMyx9(dl{tm*G~AH64+?Wv>n>c_^+N)>iYFG>}Kc(BkbnCtO(DwsgF{#Gl3b)lbvdH5MR%-=IE> zWSTnUe(Mwl+7Y`IiSlaaRJ+QndK|6>7`t)WHDn(AxgTC9kBps|7d!SGLu$y`SJLrD ztsQF%jv(eqzh%83K-|J19o`wFOZ&O{9N-+VdzJVqK9DukK~nG;9-&F~%utU|;VQ(F zmYykGPb$?kbQVV`pJA+}OAAPVheP0gCGJf`c-bpbQ@7~CP51_q!%I^T)m^Vu3h`yK zmh9-&C2phvDoQKi2@-t^WC)nu;1&EydG!s*8^;VggjM?4#D+mYjLVKic2FLf{DA9x zpWHXg-ckma@}Cc^%iqCYAMsz`;;QXu07}-+-#mV^rLIt0)e4{0q5v7p1a{ZH)+WU{ zfsdUX+nELZapOYj)V1JsS-SCboAbAD{`IF8 zJxxU?J((Q;?o6lLuqnOMp*+PHr&C>Nu#RO;jwclvyPdHo8;24C&W}+hiX~QCc?I4} zo-T^bZ#pMBR9!{yc>%|ElQ&w&K;w0j?_ERKl7iy!Qqip!TJ0AU{>ABxh3krlkT2)& zGEQ9WyMn;wkOzCmC>>W9;L@ilL8J5a`~7V0Vfr2eA}p5dUD{y3-bcmKV<)qlrvvV5 zv|-8}0xHrM({0tMf{2aTLNQUk|9;m>^O;b@Xc}>i~uA{T$mUjxk~S-;sc|+ zvxv%Tw${IxCCy2++I{d|@VL6ueYVitluE@CUSG&45c$7HF>4XJA%I=3{FVl;04 zsN3oAFWZm)4&dZRhFc1n1V|Vw;140Ptuq}3DqF#Lga{lJDEu_!x@L7m+W2oML9S3C zl3^p~CUwcIYw!E+D)KJ+=2--oAgWZ8oV{dYQxKXUW*?n&_d-^X2|#124; zuyL8`D~iXRk3<`3gc!1Oi|teE6*ZfgK|Mkd1h~gWIQ@<)RSu19I?7l8Ui#O_^QtOs zbAL`ga)B=3kZ0;mN;) zOOb#E)-p$H2w&!kPYwD5MB~>q{RBx=ZIpZ0@Lxw=e7@wrThYHdm1%j~Ba+B1YF?iq zf0us!^x!%oGMAiw)UhAlKlHs%c+TKScLBEIA-6(x(hoVM$<1-#tHTI>NJDVl0H)8= z^6%HEG1o_VJf(wh-?ggkSG>9waAj;NlwCQ;lA#IP@Ij=~`jIh~Iwl^|Yqo`~%vPwXODf)vUlkJ>kF*~`l z@vuYPK*QbY%u+oA)g)sT@kyx+V5z@d+X*|#X`Hy%`WT^&m)jckL8vaCBNYzvPY88f zOW_W60vM(0p%v$JxwZ(>rI^o^Xnzani?>zi-1h6zmOoN5>0|!<2FhIr^=a-_NMFnW zWNB3(7ANmj%-};9UKqO_NeI3gEE^n$$0V)=o=K((5K*Z~327Dg>azY2;P&tLi3(4^ z@kr^HxLH&_E;NpOGx$~ED)afBF3xaxZ59u+zk;>JVZ*ofy#c$2*cv%#a_95s(ME=g z$xI1HxCck8r2T-%nVfRK>^7OE{*)x$nsC=IT@Igawl2F60J9q_bQ11Weo<$+L~(vYcTEmMk8s znvFifwO7JsA9{EJPNG?p4GlHAUK`8zUb5{UB%I?_k=wcTB>-&9N0(rz;QqcA%36#C zEClpi%I_21nMMmW^>eN1dvS?v_nnAO=4+^#W8MX>V=accL0xb-vyUbTZ?gkoed|VK za);+!0&PSJt;YO+HzJh`%q`lI-#XY_91MJr-~5K=$drHDhS3*Mn-~}M;|-+ceyWK$ z)>0NH#1$p%tB>(zGnl}k*mw~YfUKNph<;s-Q?;|w@mlcp+CMp{K7aL@mhrD{nbuv4 z&yzYiYvy3AoP@QlndZ+QVy?#WT2ib`_&+I0XD}>&lA*Fe^wcyxkpUawOnyI=zsm2Za$Y zMV=X;9iw!h#0sM7`w46>DO3l8(De;O<^^0VTyN%+?P$YFCDUc{-HbTTmXDAd`wOI>YXf7b7`TKJP*M!CM$S4nkR#G9^L zB(*pXXnN&$;LqFcS>8T!Qn0gq#wFgqT?g|I$|{j`-%EAZ>J5Um@4r(-6v}j3{)OJf zw_RxKTZ&pS~doYX>e|MYul6&zF{ z-;uyHcPC;s#g=qQ8EVC`g|)8}dnWshN2t^ZK=MjE1yITxAeYE`{|dd2Q;-{!|Gv-HK#jlxY~&F<+8}yU)qai@AYj%^>?M@^f_xD?95JCY8#^+Tz?v73LHF zvfZU9khJWgz>GfjNj*I9@bt?U8sM{RpZDVY!LA(9j-jv+FU`1L|&#=VN0daSJ_KO*t(~e z35(81+fG1n(gkmFq3`7=c2Y=_2qLs6eIg;(*0V}{EoAL58FqU(4=!n@`Pea8nIiq+TDf8V6nXP z{LD~#-JK0x{04S}QWO5)#D)JdZ~n*V$;A2#=Ktn4elr0yMq zqNXN7gU|qUChf>5(YD@c-yjEWeI=EO{zZAkZ%J-PH%KQ*#y3cQ0pexQ718i8ol~!- zB>#BJSpoNplx$osLgsFJM+n;jA){K`u3-O7yzs4Jz zgNvil4CziaGloW&V%Z!d!Cbv%@o7=4Ifixl)G0ca6+79Wk2l#h%h+-&$@aM6x5MGa zllA}=#;45i8bSoj2;+isx7G_m6=SzQ4XPZ(!_p%xdeC27ZimU7B-Vu`plZ%?0bUy6 zsNA0z;OleaZRgL$cj0VHdbT;@p8w!l-^u z1K=_dRl-2+rR+)~n>WKrv>u~D0piY6D0cuT3n59zHB{@yhpGa z|MTZwJcpU=(l1C^?{v}@)z12>txMvu7Q_l?V!Hx@;Hl*6;0(}lwKVVsBrq56&(G%tQ17O}Ep{?RJ z-vIqP-0Yp){yN%CC!(TGRSy@Y?EM+mWW8V*Q4D{zRf$AV@%17o79!b$6~maTm$6~A z3osc}3sGm2zPl~eEW%0GpPgr#I`aGURYHRrFxqRQwkd^$)!y_!$5`#B^6H70){m~U z`IX;_*mcfGPxP<DuCOMOs6}Dt#<}1Wp|GPWaV6AKagXbSHcA8>$qLpFq6S1x!0L zxay&j5u?O0G+@a=Wp|Z@GZijK53`QsiWi#H!Ni~aLf#ZBY~k0CtiWEVs*!BJ78Kox z8^i&{&#m#~jXrMgm(l3OXR}u8Ur)=KN2elF+;>`n#)oKsES4KX;LZrJaUiuQ1UtajL}Jj9zWu)Ts=N#(121h4&Zm~^qC3uiL7SC zjNDK9iWuj#UhfY&R{jvgF=vR1BU-<=Ax{Pob)yoGqHoA-vm(3hp%CxO|LU56vrdLY zdR{32Sh-zWc!({daLccgWu+=%dOlLy59y6j5P*;%?l;{v@@)azNJgF@=m|wrsje%7 zL0o!X64CeRCOtHNYW{En+WzT_d1_Moo!PyCo!~~9b0o=@665gy5$ZpnSH_K?qPfsq zUb=5a*VD76;=uZVLJ-2ts9hLj8P)L%P!YVNzXO_MVvw)K2aSFjjm~J5TDJsoX%cd7 zXy3erXV9Uhv8VyWy6^%zJZ9Es{5`Qc4fERe;_P}>+(wU|mTlg*YEX7_sPcqTzCz#b z6#)eZ{JnM@Nd@sClUki$)K zWuma^*a%Or$1m$%n7KPWM0Cm)+9-#PJ)l;8X??&;XWsx2;jX#+I6Z8wd?B59z02Yf zfuU|L?ws|6wYt8QNIqko$Q68c#xxZJ*pJ;N#iFB$R zB+Y$!JkHC|M$6A=zQ!BtaR02lUt{v?qANT*Nav``uwvglx))|9wdw*#tOE8|3Ga)Y zG6KZYKFI+6%tmsz%qp5|bT`lsXzO_s;I#l-OVC6sk9aelv)&p9)B50}j4xNA zT!XB`i^7uXa8Zh!1DDS|9?Hrw168OAss@GpgZ!|TBMfbe%QJ1JdaKoSCWcN}wvHMs za@2rKqDp8$w(UFG@h3mjIXOM`Oh_! z!6tx!kJg)xF1dUPWR06}{>8`M%@*&F;6SqpwO5BAi{olTC$0eKV@=EPW($c*V1i{A zcuE0(76@L;tuwqCXfKT74FuWI(IoUo8=N0E>&Cy=Bpi=eP#mW~^`K)srWULHPjRea5DQ1ZaT%4w>m0$@B z`G}R@z^q3HojFK@1 zkuw8me%mQ?Py3O2%tAW>Sj=?X{G!c<*HmcbpJ{j(QfMJXZMPgZUU~}>x}oRSF)9>( z{#b(?nHxwUHlVG+XEUW1r!Jm6k*ELnTBZ>>Q* zAa9@pv5#qPITRSw7t8tQ^J3XeFgT{)=eyo(udJbnLQB%XQrXey>Q&N7BMMILLqZ+F zy>EbcN4DE5@v&FP{ki%a3gG(y0XTK=f_FmUD@Zd;jL2d{a`zh)l7B%>WPN>Z3@)~Y z?)WIheLq~?;4cEmIe`I1{66o#Z;#Kn8<6ha0l5l*my5HF+&k+MFS(3i;c{lrJUU_V z4^$e^qx(o}S2{97YELTrY8122r=PDPJwq(D|Mpglbj~NQh(m#IGM9^_h6k#P8DC2{ z3{60cTcZn_eozU<{HF_n?unQH!fuMC;&EJ2Bfa7wzR*i3??r(&9AXVH7YH@AW4h4?*uh#6_y$ zYOJfcLQ4tinFQf$3yf9V$-of|VW&O4Y9Rk=Pz`y4)3|`enKl}^GZFJU8h6zMPDle% zRQQcdj0|`)tI+K-C^8GS=#n|A4ITfzSgNs!mEntOPMarZE%U2SR=!zuQc7j<%^66O^gG!i zQXh+)5nF|6g5I}V{kR=DN*!L4j215Y*)(iNTmkijwPoA=Br)9`%b9X0$$ui@ky%7; zq+7uft5U9(+nq_A5t1+G^@pB)?s9JNf%T@z;yJaZ|9MY@A4pxoE#gve_p_--DD+Nj8lmj>`@El_=*J0P835y!;^V)`Sn2=ivs5&6JhI@4r2 z`wts)xj4T@3mj`nX_p!ZwSCHyVXQw*adR&%8t9_jRYcHVe5?z;6t`E3-iC=I;+*8z z3YrKYzHM`=oy{LIEGjFn4&?bNpGF1iR;M)#;TY(BrY+NHT);z35gX(f~NZ8~tpPGWKYY+wpthg5O;JmW#7c^;4tUR{jI7 zN2Ff`!J07SHh)xMxAfOpO+o{6C0;Ug|H7hTg)Ylx|DUJ&?p4l~&w01E0}E3@2{S*O zKSs|TuB?|9lUfg2bjtDs?qAs$%8m36$(M~ zdqoIr)rQj3>g{NZH0DP4h7W_JbG1|!G9%WxPU_8g$eS)bVYq1 z+jcNI;f##w1OA!eBWJ$)tM%)4&hMMAUbpA(&^Nb_(^&*8T@w4^wvNV_N1bR;%ojIb zyt8ZwG`XmLL~HmiV9TwU@liky(H+YuNbRU61e5(~{O+4Z49P3?c^(Zdxm5B+LuTwE zNxEJ@n(*#zN7^Q6wkAdf?=YmIpN&>47)BpBOOzjcV!H%+9&z|mH}@oc^lxEQKzB^uM3I( zQ-%7?O$(bvgjJIrt59u;YmC#|PnumsSJ#em=X=tJ25mBP+;` zzc#6}1Mxx1u9!zAq<(x4e98+1!7=WCKeaf?ISztYsvjTu&Bs%cIplw_S#g8d7Ldr1 zQ1tI~lM?Gs*rI&Wkgn`3i9@%O;1CHZoE|_n|IXkWCi(^U;|)Oh5(&EY&7ZcIYY(-u z3fm7e1`@KN?gH+#gI;CWd}Vo(vvS*~7I)w0oXGj7+HkL9vXOH>83H$D2?u&wX*VPc zOjS!nxokYrDMqi&DKfuNS#2851*CEnrESc>S><;6QHCsL@~kqPd@rXZzi)o8xEgms zt*m2`2&Feqiywe1#a9W6S8h;Ic~ppEyl;%^Xn0+O;z9jW4oF2T$Tp54eOejqijs5B98t66t=?L7g|AF_n>HCnAlq}G036Qfp z=bxN>_$dZ<%5Az1VFz3%W67ejqa0W)z%jsCLo2;?qCL<21y>DPV82#3 zD5JRZ z=eaSQt~R5tiDPc>7dTN~qKBjFQSYJ`ZR=r_*cbqhA?>8y-?|@Ngk`IuTBOHpq_}8? z(|(?ep58(N7R?bPQItIychd;vu(k0c(FU^(2&3sBt8y#HFY0x3C1r-P0|8BwLi@r? z+gSv(YG-WUE^Q}}77e9Y)ZoOU(>DXJXfSynEf$~>Gh;Nc3)=gCEFexfJdx+N6OVFJ3NoOKQ3|-rb4LKMa5&d_$iw_~Q zuEZxgXpW-^iJv}&@AkAC=_ID z*AzeZmIGl0zv?U0QnQ+WV|2NJM-d)>+KTVI*Ow^=iK${r`D^6bRH$sQKXN{(p;q1V zfK1dV{IWD`3GA9nEwF}$7}3szMB}O@SEZ44T6DpD4yVUm7RJ%6(qR@l}Rm2-DaB$~n=<^woBcv3BRA-u*Ktr7SC`y_oH` z$>dxtao2G$#yrV96B(>U_E#6S=9mmLI>HNFf_Tn-1_$5W`g6$(-{JBp=8EE9+{G5URd0`!z}uEZjIe(7UH~UqC$IO{)*(-;*Ccq7yg@{*EiQ9R?buj$|xkZ`&NU zz?I?iB3mXU#cxNi&VMS;ZLZd_){PLPzMF6#t}*#fehv}TK~RV=Fhf;m=K-VQO>K4t z<$w1n*e!vKlkFgIeuh&?m;NmZ47GAmnR$m4UYp|+|IoJQyt!>CXTnx&^A5(I`vddg}LT6g+n3Avnq5031{5gwx zlMF$3N1yQqC?;2o@&=>=^P=!#Nin=ii`W{20AhGFtx2&Q)Dr^@t^@goC<#wjvSoZ} z44Y9J57^0bo_&^%qKn;vbTRT5d`Wh8Bs=eo^c+~Z@24rk z&d$8-jsx~Gk9v+HGt3^qI{EtQh9eUW&4JOeA301EZHG79$f&nplT!3u>8SXK3X8ig zxGaPIWb`WA^N^DQSo`ECzs(pj`GjjCXG6EUX@A6Hotw5+9<=n);@^Oek@KQ{P*P6% zz-vQ68r5Qx@;`idfkfDNngtq$h@SiHloWV%Tl(hRg*F`Fq#GcB1*zTP1_r(4E4J-d z&%-!8hO~*UVJtN3Zp*;Mxe|m!{WMp;p!6H{ep}4LuZ$A62d3#!?zB$JbQDH6^BUH? zgxVgar~Iv5p&K^~H%Lh+EX=zxAN=xh0QmatZVhN3lDN< zo1=|vWMO&UchMGrn2t|V{gFs#odwR!8O8=G`fS!g{o21OTM4|Gzce?Cb_D6MQ~w## zi;-@zo?TDGSGaP$9_@Bh5+W@8H&d-Xp&te2dH*8{b$ z>7D#lG(1`!Y?lReJs%e7tvWj4%D1MC!I&whnVA!raWPGVniev^)0FY@vPO7HjJbA! zh7MK!@_Le!)YJu7NFePOaWNqL{8mFkN<0sh!X4#-Oj|_Jbd1Yh^lB05;5YXz{}_Pr z!v&Xpr2&Tca9T3~RFIm%4|_0u6`Y?5S(9Z;P@wby;EU0ZbdnOh&!Xu6456O#6v7m1 zbeeu9Wz|65U1hDmlfN0I^c4KGV1(Jl9~uav;SQnghGQooj@?8WxV&sblsHnXJepSw zG#MS0as&x%TDsuaxfwpW!6wRJV`m%*s!8~TKES__IWA*^N1QsmK2XSLvB{*`$=!@{ zkYF0r6-RSfihaJ6*ys#M(@4T*!Ff35|9Yw=7y*L7yhHy~$E|{BSw=N^R5k3RdwZrl zj9%Z*=w5NiDKURh=$+h=3em_7Us^S34PpmNeZIJvBoo79LUQ9m>qOlDgROV$&g_f2 zK6AykZ6_7mPQ^AVwp~fCI2GHh*tTukw(X=k|GS^jJ$m&01Ooi3K2s1_Y zZ&J`a)hd(Ok|Ea!4wlX-pw{x?25!S@Cc@(HjhndwGSQbEOJ@Pk_TkB^)`vEI)%8tj zrxmcB@_{$$i!s4Pq7U>>pgp~t_7C4_Jh&m1a$L#5-%NAQo za-IYV-LQ0araqH~;0ABMpuEkWYBav9T612vqAO>9$)pef+hv!cb`GeE?OLbilM1B~ zkS7gnU|0mAQEHtAW8zE130qBp_nFPQSCGMdA_pq_`|(s!!uQ&p79aC2>xa;tJ-0eL z>T7Ndw|r;U{6?`@PK2`z7dq+qevFTNX1p=(%v)q2S;!;3Zk^~U?qt|2Otkmg^XlVk z2l{wNiO-CL%YRw%MW9Kl{dXD@$atcF)c#z#`3++-#2(joGx5M zO|o&ZwDT3HWvL_B6obSp@Fc>F96${1|5gqgK(H^87uF^lMyV-dAnr0LWDY3Z_HTca z*ij|)-uIUWT=Tu}tQG_HVn6}L0bx+MP%*Xh*gu4{Rus*C<%F3CVb)9L5cYt@l9nVZ za2aW)UChuQ{LN)#(H<_}+nI)rt`dXodhl~J@=0O|d(8-hmZ>*>eP(fr1Vx*%YBcq1 zqhXXA7rnq~^AG}cOE&!)tKSyRi~N41UyN#LzS%h;UY=? z`83cDFkDQk@+s~8yZ-sYWy&*s9To1}+;UMi6}6MTsZ9f`o1axWp!>Wvl^cp_BwpSO zO<>DLK`<}3*C-&pL>d*Hns^Y+Jo)?C9a?m$u*#9Ps3lztPOy2S&|>Wa^muujgfN50 z1uZp1fhOpK1{I#909fvIf{01p#*<;c&=E|b1))X;P4Hdf-}(|KaGDgn`%^D}|Edqc zYhYym?q$^6*Sz<}+$Uu&)fTM@v<1wGT#w{uSDw$R!7Me0g^Lm0M|an*gOu~u+OTwK#5@WEk@Ul>n#Lqoxv75Ea`#~$d zvcMbs*CIL-I4FWqTN9}%yLw!EB!9cIlzslo3u@@8=E&mE$pzO}pbR(Ut58%ZlMnuz zJFqo4T4Zk~MA`u6-hs#W)LN1YZ|8kobqk3E+7bHgq5pOgO>ges4tsk-Okjq*yLB&2 zt~_)Nys5zpD`Ws^f47bfb{uN9Y0+;seyY0J%G^lX0Ic=8Ty}+6J2HQ_IXYLH{vtM00A~&w{F-z$aFxDXCi9f`*Z&>AD9Es-AlYNI& z1N}`Q1w)~|y66rrjTuPf-?x9ynD9qd!#lq$Sp;Z*ZiP3RK{+Q=Wz_p$Ngby*<>w^o zi<89zqYutsTghR0_3C;5;L(ZWPiKv(gxy|xKN4me{ETSOD^v^v%_=O8GiBhvPz&4l z#6M8?l(aLWUY;tsVoCGDQ%m~ECxLY){d!ywAL@^$)-=cmZ{yyX|7OA3YjASBu zR}&&lzpRgg@mMx=*2q0%ZBNMZt@z0=uIu4a0JNakj zRTJJVJm2N7d#wt0j8Vay1L>LV?gAvD#Zw|6-{ZlCRT!gL?V)9q`Y%w};zd;HiE0to`)EHrAW>>*s&&eZ0>m=UQOMPy{4ori2Ce@5O~3NqR6leqFRJp6V`Z?*w-no8d4ap45c5|0`j?NnGkb`bpMB?ti71iXo1A3{*KgHY zfU~Ypi2+uqHfrEU!Xc17aWja?`@GYvu(yEj%A(}jIjDKie}pX#YbZmGH0$?3>ueMe zWM@-4eUSfsH16bShsa}38|9;wNl6Eu4g5hhPzfWExSqacuVg8NZUmr6y~d7^JPOnP zILN=mq$Kgp-FE&3F>T4e$TaO4Y9#@VGokZ07ZycVC*+Id8s0wcRt;Nsl>lsOc* z!>+eJiGr5okcALOJAd_a8DidY!LA`KlX zPj1;$hmPjVJTHf>HE7H-byuZ~jdNh#=OVLMTYa^uUEQ~V$q0l}}9gwoK-}4BVrlttWc!^po@0fls?HI1tU>39#?P)@lHBH)sMMy%Dih+l$cqIY zIFmEww?e++-XsG?3(}(*%Y+3)NiKU{bK5um=#l!M%$Zh|&7YQ_S;^zO(&Z|^s22*3 zD_Xx7k<6_o#c&M1dU)x&vc7I5wv|VmUdG|{sgu%~>mQ>=?9G)#=K}wHBC&LZBKow9^(A6IFlJ4cUXSZX9XTpcqaaV)g@6k&stT;%z+L~3t6^xY*i^w zG^85PVxyLyM#d!LGBXbmb&FzJ4o0f;(e|iHOf-*oP$!T87lsI^QVH_eUVz--Sa0it zj)ogRa8TerUnrw0ZBxoJ6E4QD06r}pZllc5kp}Y9{y^dCwsb<5n=S12$U!pe$hbfqD3w4#U zLcWi@mr-dBy>A9680u9R{nXz>JJqdHN)NwHr!8ef%Wq8Ms{DEU>i(0VWg?P2%_JaJ zQOPc|ra`A-lw9`DsLmy3Md`>d3Jz};UR~eq%$*E0-5!`Xq3rlD5Zp*p=78m0_q6_) zjL4qBsp4CypuSsJB1L$CTy23G`C-Oas6P&JsV7`^v&`&37RzLwF>whge_s%uzN4jk zABPe6U9Zumh*QD<#lcpV8wA$jX zNkl%|n@YLk-mD70>MKM_ZGllU~FSOXpsR!m|~r&cI4$Shgpl0$N!GEFV@)3$4h z8cGzncruTz8QI#b^!q^C?zS#9QO;P0|GigcT!;MR4qycWoZ8-G$*dx3Yd`6{&9Rom zs-}dM#4pSPx1`)E@bQi=YEFd}M0*+94}TqmqRBV|m9)-Q@*QQTO{RS$Ir9>&G3jX@!-LQwK-HhFaMm= zk-=&L%CS&f?Y-YKmHOVjk%QUWNsi_Pm#m@hjmJn*nm6qX7VY+m5wa-?OvUw4yZJ}7X=K7=f**oi7)qtx#Ru&sHb$}y1#3+i z*N<|dV_eDzw&*w*x=PyRvcGIntf9N@`fw-$ytX;)4{)s6a{=UZXNP`}puWGDbo~up z@=%=?aBGh5e*|2fkoNf#|29T?ZNZb`7>N)@K01fsCSX~kKGSs`q;Ru?fonGI$*q*R;-j)$YnscbzPd{N#G6vuW2|ZCU7{9)Z3w= za9#9o@qFzalP)#$@@(rVx{bs*RWK+RPz6HP->nJq52L;{h}`KTwS7WH zc4X|p;AVyV?*>8e_-H4t)3`R5fDydw{2o$1o!~gk&X5g2d0>h)9>s@GDfXD9a4PEP zsWJ9A8JW?tGW%4mgT5~Bhu4A{^D0P~%G;B)O(z0mBKCVnHs4|Q7Iab>(IK~ueZspm`Xf0!9N39omEi<2??jU^>!e{jH9 z&6-4BJ18%pc)e(hm@+u^TC@kzn{Ui1-s_CV`ibeq9wVN( z!n2B)b5h%Z+Eni}d}!ib-D|E-);E3JnIZQs9{s4BxCE<&Sl;=;78^(iH1!>bs*Jfy z;+dGMinA~n*TUnKbW+!DZP~CI)?#zZ`%%YVYrpe``}CMq^Qx^Zb6)k-EX$&v!Myaq zPFkyC;5KlJn62Yy(eci9Xj*qU;~3CR!*-L0#r4wZq>C8d^qT;ayTz#sp0A+LFpm%O zCiNxAZkbgD2D$6*I=jOkxc=fyL2U50-Iu<`{1!f^F|MtkOD0aErzxfxL!kbeyr99? z{>C6=&mcrZQhQU>y14GCbKx)RsYRx%kQSB(+R;L&wn=O?Fcb~yhEk5clLL{uxasK) z(~|zd($And;s$lWg*_TQQ=_MLe&wdJ$uu5H`R|P9f^|0^YNP20s9OXBW5koys!PdV zxh3U3Ys<<7;z%#=6ghdz8J)ubsN7pTXP$i*%z*7hXxgJx>J=R=pcF^2o8mI4%DKxC8pHF3*@-KD9sZQmY$+T6d56HQ?6#D~n(_z@UA8#Ll-M6c`YE zN!hN#vOpp@G(x0u2X8;lk@btW>S6nz>NJ)@Bv%p9?hzJ#M57-#M*{0=$nG(%QF-ze zrIXS5tLD^UBF3|IGS+btc6M=AxCP#bi+q@M#*ZZ)x$`AvpjElT-vr9d0?UomO$@9b zaLLE8^ZlD}=u}U|>6sELT<1s87gh>%$pcVb`+D%G0AmbtWT_(F5Do3jj<8F z8T|?-EvjpbKyYohgaiyrkQ~-WV+RVN=_V{YMnlB+Aa=>zcFLW&?7=FDA0;RZ#22f4 z+fIKi8fPHdgy}_m>}0!!Qt!@e6?JaBr|IS%=_(FOiO=zD(_(Rpgh7+(4oQcN zR%Eys!NN+DykyxAu6RZTKzWt|&K%2xP;--V`orakT|K-LgIHaBsH`zn{m`lbFatBO z8lAF^a02buHbWBRx)Oy*fDNrGoRSFm9FE||aTTd$f0$9(=02 zNV?#bS)sv3k!@1JkyyVloAa5nY=C$SPXaDoPgd(2b0g845HUh+~N7C$u z+#D{STwoLYB>!$&wes`)_CLVzefa;{*8blyK~}KeK|V|=v0R|&DKhndVo0w4nM+UU zmIsvqO2^>0CUq@WkKBV`9Cd+&09>2b{QS8+Bzo}Sa}H_|L~(n%UaqH~`G-U#Sjb4} z=wy;M<7X=2Spvq_x5-{#rm1|CU*0ExMjXY{2034^50W3>`!CI_@Txb97n4AW6?-b$ zm$UkPj>*QU0r2Mp=gsSF-v0I+j1btcaAQ>Nu2sfD1wxwCt|FwPZ-d@DC;(r@_w8*$o3sC+s+dB+#iMKDQKM` zr*TQ0R!%O22f6uszo%Ou77ODxf9`Y?$2t+?689Fq!9ex5D zv7;Rh#bnU9x2Fj1aV6_*k0?wU3`}7$smPH7q zVqC;|Mn}0BsMS2l2;;JTL23hTLIDcw$(}+Jp>3RJD}3j&Sf|LlBzfe@lM(JrbKkxY zb@r`~2lW#9?nEg}i3EjxzZ@yVE9C>7Zey|aq{OXVtZ4pFFT+C^Mc>Bj)|(xmo4OIt z9eyw-xVKi1AELc$c1ue0dl~`>;pjXV?@QZWnT$#>#qSQR*>-dflURpUXqxovUnqU8}yN$m$mFYHpLLPxbogS6U? zquu?gB?&!^33*hkl#U&HnTCLNpEd|+teQH25zsJ?p9$ExU*qaMt_90PzMPwlG0tc@ zGgr3KX83{Y`n5;hk8nb6=WcvtH^Jh}DmPcy`PZF_8zo$gAfm?qXaE?Jdn`)OsB%43 zvK@E+s|3!S_vy;myZ1Q%B|v{}@fa;UlDFPTcwy$Lcw2N|@-lC-D)#CHyHM2OW8@~9 zt?Cz}iFIWUzN{jlX!ITR6PRpRiOB4^w`g``NVVCdp=*=$;C%fpW>+GBkO_hV{wS_i zsH7Z_@b^N7Nf9!OO$?|JaI@>3{})o=^BkxEWSDr#+ZrhYzOf3t!1;aw{(XW8-4p`_ zSLcCMp*N4EIAVH_g_V0C31E3_RtvAr@2A^2U+*C}k@=kaCy!iij_z5ZT9AqCPWVd| zSeMYo)9SQBz1ki_J@gYjvrPN>^M|*^q?_U(c9HCKvKX<7H$aZ;#%a;JDNBT22b^Zg z9^d=8MC)p?D>L_Hl4b(&h`dE;1FX&r=N8;f?Ow|Wwt>=pJopTp{x7yO6oI$g3`qk* z!Ng&B01vF7=YldX8XWxbebGtr&8(1O9Y+&ERAN#BZxpDemEP&euyGJ(f9x+E3pmdQ zeAEi+@+{cDML<@#e^ilG)zLT1ERu+E!5Y*Xg}wf^0sqxzcgzU zJTi!#a?hO94pGIx_r-dv@G8pHvkWr9XwIwu-8vE5It~9IbmHY}g=jg~ir>rV2Mt!? zI`fj2{Ml*TqPQ}HaIA-h1;X`+whREH#^NBDP&d=Ip^rY4Vvq0G!iBjhWxk|l{G zFQ02 zk~8@~8<&sz+6Zw(5E&H2F~p3%A$nu!{;4oJC|Xy=&S)dR(E#fgxd_i1GK@~{QCDOV zr81mgMaG}45NN13kh7p{QnpTit?ZuEamad<{JTD?wGo)&wGPk&9tVodI$ZV^gR|Z~ zT!i3*9VoEa7v^%b{aZXOUJe=zEGc$TGy$-{H=VKe(C?kOLf<(l@Wz*&ex0kZ`xPC@ z=&2mUH)_3W!jzR6K3;Yev~hi4Y0cNGpVg{Zxg=<%0rOW8(>k^6Cha_x%*wJpcy~HD%{Y z$_#gl_WpXR#F!AFdRpX&9%7V^a%KXGLVx_2`PXbJ$AC_@@ed zsn>1j={b+jT4wulM@bH0Y+HSU7pQmBxmFW&_T1>9Rq9iJCSs!~A;M$_Nc!)@0zvuH z*RyC!7DU&8iLj#$&o({Q*!d~ojuJcf^xPXQXYQ%%7J(U33Lde5U*mO$mw!0k$Sceh zbB?=e{dkm%2ma5^R(r4l!s0X*pR@FiHs!xEa0vy{r3oLm7~Iwpk_pGP&qtNIY?C9B z-H>|U;bMXJXBHhn99dVG-1s|_cDwuo2Ke)CAzs=1Oq1k!@vAt>=EbG6gHV;Lfx;UvYPNiTm zkhXf5S8^6^tDmor_;g1vP4Vt+;z5=l&7m&&;%*rrUPQP?3LqUlWl~w^8c)G}HYly( zTvWr2%uK)0*P)JV2RyAe&Y37W(hir@>^HUS%8oW)bW;M~gDfb44(c;}7wRraL%Y&; zT1QEkO+S&;*E2iy-Y58#&*$v9N^Mnr&O$hDb6>kHm_D6vF6k+I z@Wwq6j~%Gn7mioyRW1_Dh0t1O#ZI+NL>1g@LV1)T-5?qZUI%Pi9Zrnv;LJq(9+JA> zu3nz0y9v^R>0*~6hMo3LBP(Z2>P>vI^~$H59016H?K6uiEBrL;mq&4+8ZkHq-ErFQ zo$eHUk4L4xO4q}Sk23IA8u_hP%X-)Z8c%u_Zd9-8f0>*y7aBP@bz;kMuUr;$Jmb!n zvp$AzCoAS(Pplcw+U%NJ1APW;|8`o#uQi}y@XOcAWbnr|b;ElugbT>mg{tl7f$9?c zvioEMju8m%6Ixk_TD6np7%&4#1RC*N&&ci^a`z~#Re6QhR*#zS=vqYCimzw!?eDp` z>^EFoQt7tCBa74CUEEB|L)G2Znc9pVoA5|@uGr+WB_pr3GF^rF^kP3);(V?oyqtd- zEWH20@ZFYZ0K|qG+yP~$PhrJf_R9t+cdk2t?XQy@EP^4ntHB{ah+iMp8?&!h1*<=Z zRSoDKkr{1r+Qvh&mY-|vbnZRtgHPRNzAPAO<@@UHobS}fe;zG217IN+c1$n}cLv==NW{_hUl~-u zcSTc;OPSe}d5e8N2dlEH)+ z_N$OA4W@e*K(_{YHeqa$hkk3`^BqIPs#6^-&cUJ6J?Zr_al_Zt4V2tm>E<(oqYE(~ ziqP}v;}|@*EXJ)7T1hsbM<&8eXje-49v>S_V^ak?-(XMKOj7$(3z#3t=K2<>X*+=$ zP5Uv3^qe9Q4nP6HG$w3b{j*-6jm6#i&o8u)u}XPk1jkr@mG28zrbQbb?!kfDjseEZ zg2Kd1C{2QTI;uiewEH>=s9c_{!o40PWKc@TS5lmZlBi#;QKOKAh+zB^#zx#|G}aia zs2JJLJ*Kau{vl`;@QF~lv)aam8*4Vgr__YI$C@_yc(CMvaaAYTAL=Z?5?py~1x%xH zT(;=#Y^vT~)enRw)}^r@vV5jwrK26VC__%WcJ`wZ7>?L}iK~jKH{lm{v-qvz@lIO$ zNcprc!-t~q!}K`16^iewVDjnq7E_|S0=JHyq@xO>-7EJla8sN~E-H}mGGL!=kTWR; zG=7Y=hs)PCuWvT3@kdEO#&GlLB43-r*WmEx#G~t=@EaAYr@zbn+hhhUgYzUd#1;GSwW zl4JCj8W_FjJ-liPuIDw^e7k@!%@|51Q`~=l)WCkGw){lH%0xB+lj^^NWerpxmB^&7 z9t^PV!(xty7Mh>(zci7|HuE%P5^nRd_YQI=XU`tW_eK#7@F4zG8wx&V%FTP=9!KUL z0g!~r+i{u8X?-C-`QZ$RZ2XCN!pMbIJ+JkOxr4cZqGM}Cv=4` z`Dv53$za|0utz1wX>BVO$Q{`?i5PrJIx1Fx`%7Q>JfV-hG-$+mbop6 z3g9A)6iu50Dx%x7OE34ui_?h&!u-`1!VjwcEIIy(K$#jWyo+Xi-l&VMnj$(Vnd^6~ zo1VNw>4fWoCMZ~Gg$b-=!0I2*X(n$q_cT2!qv&+VIT3J_!0B5r89gjQ)IXqLMZY|q zdD4<&A-0DY?8UvL*X6-+6f3_8<{u~dKowI!=k==xlIGWJq||zeBSy^Gn+W#8ec=0u zd=p1JnGlVLM+^Grf;jVKs74a-#Od*jP8`{wyDF^b3OduBpw=W>@4fW4l(qH9(y(Z< z)DNFTkXX;u85)HeWvC7Fi-ZZa+ZFG-uBoQd5-PVpgQ_QMiE` zycR$JgBvmveyEqmagd6WU0Tm7v@c;81XYjO}RHX!R?>ogIXa{A7V*@A7 z6%wEUkig#{>JpcHxMSG{iU1JVCfRs*&0M9HELRzJ&5{j&heKyLDKZTeFAtM%0CfTo zx$kCYDK((gj9x09lLf80Kr^zMhKiwwCB%HWX+at3eMwq{&Qp2=M(}4_NNf-{G*X-i zbQ~B>?AmB+5lH|TcB4F&C%6cbaE}RC5LFNu7jeQ)T2rIH`#27J04&ySp^Fvr&nmQa zo=o+N*H$rA=xv%@Ev}`wRN^H~uV0i%3bmhe)eOzT$Fl13?3L zIwk?0a2QHc#!D(O`N_9GP}yd;IuQ%wr_`!q`pwLXw760jPk&Iz4oww}uLmkFSUw3@ zN)bUM5&SR0y#aC(kS0Tr9{j-KY_xe4RPb0vO;~!wNQ9RFSv5OOYT3P&AetY*IqF+2 z4>3Gh@%1@7k@>!F$tZ|Bc94=Jp5LA^SqZFErNsetO+VIk2rh2x?*Wy4#uEPqWpS&8{mTfLw*y+&J+Q{Gx-w9 zzSR>JZsa9qY?Ro7K$Mn>nUDvJB7IgD@?9q_CVmoiaWWntrp_&cDgj;aiz(!yw=!IS zHWrnUYh(nuKd&H0$eqPr)C3sEmvd8Rqb1klC#&U|+rsUM{i%dTVTWWajtUmLUALOR zKKum^F;2ofOE4&jtA}_-I6|@)mh5V2SyfActLaUck&zxByCzcuRg(y$KwxJQcc>eb zn5O*g6*&M{Aqoum$}NVkyg&tSFb4m{<~JBf`1dJ|0kGrH9sz?#mTlq3vn2wr!2x*+ zuwqZ3h8UlhbEc;v#0IM5I~t62HJBntgR|VDjuW6e8s$gfHe=t8qnw2@^Ckfa(0%BK0{usOKJKf+#p80aX1ZwRS!>uWsG#*kpiMyu4-uP? zD=x_^Dq%?4t_^G0{QpQ1=8MgtMmpwGfd&6X)p(0uQs&D^qT(-$s84pv6iPZvLIQCF zcxz)9EC}i7m^CKhj#&QT!W3-}RfJT-;Jkr`8_k70xdIL9k-6^vpp~8Z%AHs71`G^^X1n`#nAvli>F4_?qjJW@iiVm&8b1c(KT< zZHk16ok?6lS5Jj25anZ^$!`~`EtVjaG_L~BP)yj-aGXq8;XwbaO0`FZylH$qjR*00 z4(JZ&ZQcU6+HnK+FHz`QEQ50;)+FO!@ca=@|I;_4+kZfhKY1HGyN^oa-XLknUtokv z!8U-glK=)LxwV-srWsJHhnX#h0nw|JDaNWzn&pX?)F^%-Vk~Bd1k%ifU9%A@+}|TI zpcUTOK;PcOGV^OFeBXym$Y{aH(92GC4-zCf-&3>lPP_=%yo19k{tAva1m|tpz=jTz zDV5cy25TiAP|6Vc79rH5B`O>MMia%L6zA|6zId{MgatGeF*Il`n<7Oc8r&}=uqaDM8BGDlI5u!)|5_FJ-pE=j?ZP0ZfDUNw zoFoOagE9)BhPYr^`VVEWzff}Yz4NFJyCvBC!KW4_;kziHfSG~l!>K5%v^yW|sN^gV z6sO_YX7q7*edL0Fqs)7<*4~NB4|)U?dKd(#r@ZSPCH`eWBZP-PI^scS6vjdjXL9?M z`oQF1mLkiOU#v>$(WhN2q(*6t1Nw~WT!;Ny{!-Hdjf2zgCLAvI@~}$_G0#ikx8yay zL=OB6D#FF-ab;nek|9TAfhet~Dh}lx1@{#&{3;1;+ zciK9Hh38Q#T%m$BH&9>dXVD>_XM_Z>_EW!VnXx&?%?Yv7HqYZ8PB^ii=`fgoU^&H7 zG9y6&x#_pc5wO)T*Wh-PE@c|v5mgj7W|rWa!cU~JVi8hZ;(z3N^fHN`QNOWkNw=Dd z>0`8Vu;TFF(0I{khI{}X)Mjak#|D@LW08Cy$tuCmm`r;5F?&lT%sH{t1gCI=pxhZ! zoR}i^%BWy4lATB+wW7P&iiYo2t4z2_q-QCBmpz#fJu;%PTjaub@_ybjX0X(A^sz=- zRyUq$*eRz$wj>h7PYo+i9iVix`))37s*Z^;sv*~@9b2tM6sF;b@vajSoqQxoBLR=( z09k($2`cwJXn@Hy2HNx;#ZcN>2$T6wb*%tEM1TV~6ql3YtwVC5Zg2PwfwZ!~rX>Mz z43*)Jt*&-^6~t1-!pPBYE5<5Z8rN8AS$w4NRetGq=edy z-9mnG2v-JNfkt)A?Ks@r42q}se?`qJ!8JSN!-hAx#wx+U z;)HHE@sABG?DqjNvUhSg2<)f{^DqUFdnQ+U&yZ;j0I-x#ap}ImEjvGXi43B119yi)OCW30Hk73O^l}^E>Ei%CTPDzD02B1*5XV2P)fn(@uy^djcA{x-^N80_5P=D3I#L25iD;-ZR!+|};P~DMFzK;bhCZOod8{7Skx{{1 zsJ8J+!?FU<<8vlMN@0fH5i!bdYg0GG>@CTyi z)!#OCv4_zT@CCYR)Be@|<}mz+8!x?&tPb2E? zKXO2fqf=h+#-8p>)vwC)89IXvK92!hXHTC$`SMvW-l}jm7s9nl=7pSAIA@t1I&77M zPR-xUywU?HAQyT0;@2=NH}PENR?N!k&Kb<7mo$30L*$F!_uTlRu&j^vY35_H<-3L{ zEQjl338rs;XU114iVp*)QQa@Y*TEH=C+S@7pS`7_?kET(W}~!rs}$2SAa}2rS1kQ^2<(n7SgosT1oL0r zCO%NRIymZoR?Zj`f~KHj57?s7r7M*!EQy>_BW(z@+S=d~n&$vxIi2+`j&d$SFyG@w z_o=UnB3k4U^x~A9Il_%D(66+AR_AzMdpI@Pr?0QbMcSTSNbvXHdJH8u%ZEMJy;uvT ztlX|sZt2{O?h3eKPxWka zO717=6qm{Fd-b_OtXWd1WEtRYjJ;lwR}x%es6{O5AG2C{969^me_sQ|PJzZ;22HR% zc~2o<#&#L>7$;i=I&oD5oc*6Vr?e>;gTH@#SF4AWb8+x?;?cHH;j zeyob;!LesE9@{AV14U&cUEev@Cnem=_6lAgo4fBJ`g!N|o{Q|fd{Cb~U}~7P9j>#uljL!Y5AonT;71?G zkz)M{AcDAX6q_MQiFpNJ0@E!*ddS*dh*)!vZePBmgx~P91>L7K=u?j6Q&?E1`qj^N zTc$<`Y@!4}V5iB-=uqZ@ZK@{)An=bw>Xj)BV|#Du_2YwnD{)a)J_k-LUA0Qr7~Q4C zo>M$u9gJmsYi`4Nr70vhlQs<8l&&0d8|mu~R?V9tn~DY0HGDE3lPyk5_@Q{Icmkz!EKekc&7%cnKtf59~J`2e+j zUs1l=0&|{keE!W>kIzqAvu?7XrQ_t{1_V+?Mj-!to%46G?yvMB-y_3VoL$!pSIhD3 z{=g>sY~cHJjQfV1!4)b5;~uPziO_;UV9Tghi0?5jgUMZ>lF)4(hyNMSmSYZGACtvm zZ!DE!I&K;gIsC$p4?5pyK}jQ5$pF#~%=p+<1#B2+l8age2%5=Ji-lkK{0S%A%xs6C`YJR^poL4K-3tTK(X{8GR@LKCtj?m?V$*G!6rxCWV;vD5(u zmSCpg@UfsTQw0^dNIXf4_+2F6*HlOyfcEe;hT-mYVW?Cc5TJ#F&kD#SiUVVz^T?^J z=hiCNgiZmR;=G=ujz|ffFwvNxxizP4%g&O|_k;0-*x~XZKh}H%WQ=Vk;&|4JE0l zr$KBWQP7}jfOalI>i1SWXH&|~X0KKAE3 z?C|LjjD%juk@vWb{L;l{L4-c{zM-1QM9NkK?1<)M3OP$s5A!slcxAk+{*i~V3b4m; z*0rKFBVq(l+2uqkw>F}YB{14lnvO#1GC}Rh!ZETHHiNQ;1!XSdaa(!24jH0)CrF_W zO7ok{>4nHD7r$*_0abQpspYdnNhop6HiYGHGdqNY@oCb6bS)V>@Q3-SNp0=f6#9x* zBAz7Gh5Cy8gm1}KBP5}gxx`BvNwxEMMO+`S)sB=l5DFXDXv@@w3Gwe@d-czq*vM{z zVo4c+p=`5h2d8&L$hb}>GuDJOhNuw#f>g`9H+*@_;8o{ifdXC9!2SVHcz`yH!{5?- zHX>$b-k1&FHcdq8KMA(wYm!7iK;t#8$xI!F+Nb@3D-aoem4`F6`8wNZ#^l9BeSA$H9~CsHtKRwl&#<8<+jjV;OZ3&$`y zjmpGCqv?`XEt(^K?e0OiC4}Sd+3y9VaSN?L8BX^DI#} z%7$=a0^ZB& z@YO1;0$6%Ic6CXvtq=T;9geAl{s}s~JmF4cbd6_(Dr=2ZN}h%HrH;0$ zEA0qR?`S1#nAJ>2{ne>eCY>d8oS5*GJ0avmcnN`LMbmtMXd zDxwT3oKHtZa*oi-T-)DsxIBO<9WYt#IodiXbs)Dx{MS;IcA&kFH_Q_cPH0KVHy#@b zdRySDm?EB7@h2z=QIHl4A4iv+lPe@`Ra%^#tvuRmGJIvtvqnX$OhgHn%OWYw{uhfj zMtW%j7WJN4glqx@%FL7Tqb(ikMpBS6nw=Am2V`%B(&@kIYpSO|K4`v13V!$dNcALZ z!oZOw;gX|b8%n6VE+oh1n0HTUE}8Z~UC%Mm0kz(dd~|e&&7>S#o-||AG^)zDhjA&q z)QIylU7j_Y@{BY5mO|Z)ub_IkulKMyFl9*nq>z|n`l?PUR&fy{mzLSYn0Bv_{}+;X%KWvP($5|C)VQy$*2fg$QxZ4P7?`Vua5R#M$krO^n3BhM(cbyas*vXtxRKM(9YM^POxcX}sp6-!;)nfhwvns1+%@)asR(JL1Rb=G1 z5fP+J;%#0kYf!3O4*FwdEB{`?LNSewrqLhk5E^bn0`xq@2GvdQZ?yI_8n7;*EFany zde#bk{tws@9d--R-Xy$$^h#osfYewH8E+UxnPRf2%!zVEFkhH9dk*zSM(s%9T$8YC8fPyUI%2UhJaogO)^yn}Uq1f2 z5EMiMjb#Y8gYWhO$f#2$C=k!ziyHN|=Ev`ERuhi=Oi3-W=}+R<3N39HdB3NQf*49> z(cp>Kmqa+nvs@C_=m^T8(yLaA1x?`f+8F;pdP8 zo%?+)q*D-ILqIWFvrmr|TSok$LsKo(?&&|Y)G(MxTBuR> z!cSndycc*uzxYUeKHUH3jtw`KPR++S0!8-}a2%T52FfcbRSs?N9J_rx*kQzCq`- zT`_$07rlKae}xXIa=6MFzK8sRjQvaumkor_m$CytbhD*pO)7stKJAKgA{$3}rn*8bw6%qu0kP>ym;+A>pLNRCO?J z-JEfLStPg4OOg>17F`@Lpk_j1-Ns76YpkrSrYcadYHrlFjLN&?*`gDws`Ib{pRiE6!NVFa|G{h*k1gf<#XP##1i=e9);!0_uSrix4FN z!;m|ascIH?od54|Dfc(nxfZ~b!pQ~73ChiqqV`R42Ic<0*m|evOuDdZH@0otw$rg~+cut{ zW81cEcWm2EI#$QY&ij4;{>MJpCv{kB)T&ym#+vuM=f(OzM;>6dG$T7OYJkJ>Pc8pl zW6Le@KOnm>5HBkNQhro^6Ktb34?V~%$@=5XGcO8t!cxO8y;tuMIc=~*+6X?r8%Tq` z-SMdY@7;Mpfyzli!QD^)XVkB(+)0`G;JLfPqkP+J{U~9*+r0V2FX#!~ub1cT!O<=U z0`%TK-w#zc9x%#V!3st~fS`f@7Y1Pa@D%jR@8vpea+I*lywsXv+7OssJdQIsKH&?~ z8FE4aK5Z6Sl8CA^unjIk;Pd5TyY2CB*W~E#^%9X@I$7sjXsQGnZ2*aN9o zUN0y)M_@gnKrtdL(xQd;t(i{B9){fZizLDhV@!$s=PL-Rk@6u7s~N`BmM$i!x8$^& zst%~dKz%Y&Tm(ud5GjjQj81$qDi&ut$ldd+s8T*DE4wroT?7GY+7%24F~C(D&=+2w zV8ujk(XK=&lv#wmNl6Q0n@2Z@LJW%v^u(4*MJ5tcn%Vy@Y^@&N8a8AFMk|bWa+$`* ze#!_-OT-#1Z5(;G9u`-hC&;d@I>`ie*fn)VLZb{)P9gfsT`oa5dPmS=wOKloWC=m+ z|3(xx{hx?Jz+Bw9k?<^d9>|p6fuhxa8HL0)io{U%pV9B~*e4lRz9)^-YY^|B5&LdI zXEvR~(^@|fg~9O1guz`4@B`86lPiC-)1gk17Y8C)h;D7P0KWpsp@;UISK*1aY$uQ*{C~rzRMTj<=m#%QeEev|Duqoao zu`3~Ms=*x|(i{ZnVAA>oofw-zvx5n=4nSx6gmTSXfX_WwDCqT%%gaR`i?%wY2@#exrCeCz7O&J- zd%<_%UsK2U1PBxJypCw_uK5R@7_1iynI`VM9Z?{*#XD|$Yj5(J1$_X{1UFzPKrba^n~#h8QN{0% zi^i8y_-7V#i<_E$bPKcL%w=1lR};&6F@#Bh_?waESAJg=?X7aN&nl11JZJPGBt0q8 zw4{baJ623fz~H#1HS{zS1KLcZV1Rl4x$TCn;6SQIS$(BP!0VwwngV71Rk$tt?^%y! zq6rO!tG1K5OIG=p0A z@RRbrv0BhnZ|sRhbu9T9MP)9HAVi6iRc#t7z-!78k1mTU7mw?8)1XTY79RcSnv1J9 z1JnMhrSJCpR82X|wWB`_MzIpEr)co-nDC3EUkZsUPL^}FJFv^LE_cTZ5}JKcben9| zg(@}G`MSaGI2b$eAw5nutD;>9>}XsU$te*m&LSZUhaejzKO<}cRHrba0_L8_m>B_&XIHic}pWh;0Hy(5IEpXAm*2J`x2nd&{w|fRKp05L#}ZM&*IFnnVGjkmCs%M(ex1DtE~SVR<1PL&)_BRPA^d zoFrI#R(Pe@D0I7(q>QeR-Bk&BvydKm+# z`&hPu+pTV6iuSKf2q)L&R%$eP#EGn23kX``$MD( z+{DakySqA1%~fj&(n^p)s9CO5h0qK^NILY3j0;*<0*54GCMcSN%}cO;*{DZqa5B+m zN#bE*!`P~Pam&wEsHSPkrJ{gf0N$YPJDG&_V{s1f{ik39tQ+jnN?Q?QCffAXmmP4k z)Mx*0kF<8zmn%Msj)cJ2kCl>ITBPLGOd1QeYrE^z_}gM74K<{34oHr9Ku)Uk&$KeQ$g!YDKXE+JC} zhZ5YqDgk2JwGO#Hq-lXM+^8mj%|<4;(k!3fj9o6@41426G%TrZvrlZ0*$ zXQp7}vMq1I25_spx8!NkJ@|mq>$`euWi~=t>N;TQTgq-IfyGdJ>l%|_a_SIznEj(U zafQ@6H9c!FMk&##JO)oxDv!CXlxfi&+GSBTJ36TxR>^G1&+su5;F&DbyE*b7VY(i6 zu!_mAnsq#TuBXf6?%9bwqQy4rSx0v^euk6m3(a_TvOPT2L_z27%AsKLI z8YorX-tMJ#T71vY){<(Cl=`1WPEVT?<=`h`W+`nrtB1nK^2C`a%m}ByOv8>xI<${} zn+**v1Dp`u?BW)u{Qoo?wtH z&F_ZgggiNPj=W_R0z z00L|Z%l@P`)h4jA@!fAnOzd+{oq`02V8vnv|9hb3=(+UJ%(ix%-3c03kRW{%PMLm) zXcwC<*I7}V9nX+_Ie6=jA0O%g;+HjE?(V87v zA<�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â!Nn)1^|nf)W8~?nuGb}w63jq5MnXZ;wcIhq z#N$1vjjB6Cg*3`i7&t>?^Af=V z^BW}Wd81qqkA?I&eUri#xt(bZ7iG}VC?h+ee~;bsX#sYONU6Z~m5c`mCei&_gN*n- z$_HFOg-xyGV|CZfk!z=6a+-I~oqEq~jg~`KPR)s8VgJprX&AugRgaxBeYu(|(!%wE zK)IE~Ps(jki@*_V8x1OonP4(;>XKXV^lcu-c($AH0{^Zw$;Rl>kYU~I;zg}y{!dEQ zcX#LL4b>FpSO_|x2Rw@h?X4(<#d&t!xQu&yacM}>F@g}sP2B0e{z5bWlmfZ_P%C!^ zTE!J-B`fcYNB-zb_I4}Iy2-T&Z0*|}$U5K_)RVs%0VJPtEoII~6 z`njUbD#Pj%-dY(>l_yIk>8e)`7`Ck&t4F&FmTw*GBd-q7(jmFsaG4<9nl?S+N6_Ky z?ex+iwkCJM@p?BERA4TwZYO5%D2A*2a-_Ao%iY0oBEUu%2@K(LtUDTqwMSd-13o9u zmxM6YZ2-3$xN0P#$&y%(FWaS93cqJlhz(xWcq6hb4-hVk?fC@i%8=>y-B%8BtC_dM z=B7I%pMo3DY}T3b$5s@t0eo9F3aF?G#DJnXOy8SpHNwiSC8KNOUoj(`Nm*dAPtdwi8+Ax-nQ50t7p66-q1-Z&K!eh(EiPa zJxLRC)}xZ11W=Csx4dbk`?h|DDEn-(u0xB+!|^vyhR~{h>81GlVIn~`Z;BOpNkWaj z6AL}o8myaZ&dC^e;U7vDtW#NEWDIdo2R|c)ONd=Vw!~nY9I+R@xWivuTU1lAZeH2n^l`m4sx zt(*5MXug__MN6ii$q$)M`ss^?w~DWrXL2YO_SgP$GR|$(uFGqgfGE5I92#%eqjfbE zkZ;;L_OO5@ki-G;WoFPI@Hu-NNy^r-{@P7vRRLemGvzed@uOh zy*=*W4^WdTA3Xn6^NdR<{#nFvil)zzry=)m5|Q_>vSfx%{Fbf333b1v&nk@qtiJii z{Hnz&?Z}?tWWxJ(hZcz}4@#|^-QF*(k55ZIh?xRDBL^+8#HJAKCX$DRxBv;DV}uvH zq}V$F0NZwn(x*{2M=H82IExLuMtRkn)K<=sFN|9^a!Wz^EV129JyAZS-EaarVlRvM zudl*~q%c?C@cV2tTnQSMxhCx5{$3{(lup7DitawZAzkW-`OJ3D+U*!xjG6kFmR4Ii zG{XS3SWwN_b7)Tc-Sz7|fS341HmXkMywnFL(;3|^Df{x-L^sMPDb?_}>{quns41)6 zzfJ0>yS1#(Q{*SPY}E;JX4uoGPPM2yiQ-?RM&hUgmoQL}JRjh}d(s=cWiCj7gMq%z zK)&K?in|c34jQT2RV(9s!BKny*Jl;#=Q~KKiR_fHLqQq zMx2zh!h*JSfk4B1_!m}(YliH)qFfaSmE}*0?%ZtX9n*h*6&DyFeTH4W?W0M~F{5ot zY>(Jqc72v>e)7P*3dwKAJaX)OLS87lfADrUR_befch)#MNT_AQUY3Q~-!_6AGTb-xoz4Z#g52*UV3B*2a0${Mxng3{4qr>9?82d4 z+iIIC^Vo=S+oAs9TcM{erH+Ti#a-T&`z_?%^9;k*t;4p1tTPl%dhZoCHLrtUXdeSV+ zrL>|Nj7>?S@jQ4Zjx;z2**b;BFtcHiEB!g;T>)Rg@^|P7OL*In!pO{xP=AAup=_~Y zf1M!5RHY}x`dT_)Fswj1%Q%hg+<#)VhE@Wr|VTd{Cb2##37FQ4_9 ztbw{NyD!X+hK}IlDh1~V~xV#=Qc)egLo@gy_0~@H% zju20nu=*7$y8zloiLI~Rd8}Kl^i<*|NW!objAY*V)j+X2-#!798AN3~^NUB2L%+O{e@QZQ@q(o-v<$u_TR3W1w zZxI>biA5<{N@|KMgialXTfctsmVssxFvEMNC8l>81G}r zni)+)yjUFeY@qGx$VR$x?2E`!$WtM{0$a~7u5tpay0v!nM{g{uez&ZJ8|LyVX{4Yp zv;{C-ecmA*C70l936%C94dVrneVwenzi>?pQJq zB`LE{s<|aXyae`I8h+V7Tltr#-I&5?jX+Eo)9Fyl{hfdCdz4?pgc}JYTmG#CG|&)b z|A&WbMsi0L6>Z8qnt16|Dt#rc2yYLfU4C0EL=OraL_`KR0)`s^XeJ{XUnUF~Cr}1e zF4*oCQ(~e;>0a!3ZdU2_gb@=)$Fe-}gX}R^MZqQQhNu{_)fP#m)gY$|LvG--Y-?b` z-P(^~QXZ;ZG}(;*QLpHg162U(Klr0$_)ts{-J6yj>ta}JHjf%Vw9$W8FUkdnJS&nX zU#+hvdmrEfUqpj|vQ=I}%lKei{zJJp|CVrB@lr%+FcpAjPJsu@9&0qCZ{3qYFav*s z5n{fK#(nkmi(O}>^th+>$a-3exY6NVhZlpncU0Is-`U6+q#$GYYJDBmFQASpIIacP z82fo%dLyzjnvXAeHj=SI*cDt8NmpLt&w+0xCf9XK@E-dKI5-%*y(I|roHG(X%@bc- zL-p7{VUK^sSw@iC;WR?tM)FEEy!YED|6&MHN4P)Ar0B;$ZzP*5u>vI&8eE4k2f!pk zgK%iSJyQH7@i@93oQwv@rNv`%U6~@`Lk-F9 zzj(ZM^t%tm+s-jlI0;ZzzS?K}MNx;^!I`P2!PH1IpK8dB0mpH>8UUX&`G)sJ$F2_%WMqi~ilcyL7PH5!- zmgT}uRz`f;S3VHd9HXo{sKMd6%m?uM7*RbsxYI6|7-rgDR)LffdfZ{G5OhdLVwJ5aEnKUlAp_Z-Wxp z6j4BN4(1UYB7_VsGc*qD0gRVE^&f~f<;1>fcvTWgT5!xE2x|bgwQMWAd_*)OE{i=G z12uU9dLZEzSsDg$2^G}os4zD3jgiEmx2*XrMoVz9LRt|h4;;M3M9f++mh}^d4i8)o z4xC_PxzEWqGfGzkix!c1N;u`>3e3x!HI3vU#jvMv`w*WGFgxk=8K3aFecP9lT zURDHEk*e|y9De9p(ococGbVn}PIqK#zJ!<6SRwPsUt^RAwJlqm!MiF&h51A!C>l$p zpt~qjoRlJCV}#py8sUtR@U&KYcvubig~g(Ths+Jpm4UC;oF`p-3tWh0Y%06mT5?h0U04bXIe zfnKEwl>%vyoJuz_SVMzJtm+b3N4|;yg*zS~kKfBvCzH13D#E0QjU)_WgK(z-RM0n5 z>OTNB*pZ}RaOj5ccAJ%!&UwRC26|d5GTXa*>CVZKvW|62lr<5EEU_z4F9Vrb;|S6G z7`FyM*ak1;DJ@8RNvz<5b+R)+R!9_~IuLp+r$ywDv|x={qD^d6gST1g3T!BGV{9^H zbik3gTR<=>Oh4G|3n;jD}%s&5rdD}i?E^F zYvM#9mm%E0fodj-pf9*h$sQ~&FiK$ML5OXYBT_tNVkx4WWhLT_p{4%uID~Sn%gIcBDCrm(!!S;ME}EO!_&zm6I4r-eQNs8_>JJ=9rRZSV_yyJ90KNCyX{*yj}seKKb*j=-u6RS2RT7O z=*B}52BxsU(EM4QfkRrnz1Q+nhp9xKedOE_RU#!}5glNDE=tBlC?B;*a9 zSnV1eA(=!LyMp@WR9*MT&{3QtMJqrgLs%b>`}AZ|y_cpdF!QY8UN|U7aFl`)Y%kd4 zQgR27M)a|t)=|`?c^`{e_`NvpF|3zGBP*I-{Eks=ME+%e{P5dL#pmeX@YOLuJ-| z!e2NGILWo07ICa#O2DgBf{ezM>7|LP^0k;k7a|@3aUIDzDPO0S*F_NGh}jzPCFFbk zN=%+Gr=uB`irKwD?nWbyZGrK&Y0q6%;uG?|P#p(YKYEu48rTKEagq}?O5Jm6b!l$i zWsSJ58+KR(UWZ)PwW%jm8U#?uOODGgD1uNC1ewwLGU6iR)uo0JcEbI;&@_pu&(IIX z3sgS1xHJ;ocHF9VVrYqJUZ(1_3~rm9ekXxz7PG>LDFQ+Tq zBmzY0&40e^4^(6(HG;5+2lEZ45tr!<2GVAVokpz%wE0#aadIu#9W6jH>+x#O&x?LH z^{$Qyi(>*4zjXZC1)Xnriu_Z0XcAJl7(UIn_!MPvBeu08LJs`2^qE{c*q4gZHf#f~ zdE!(Gvlc$pIi6$JJ&$qdoN|~=Q>x8OTo1jYnG&1yHn|Ipe&E~pz1$rg%G4;Ga56*y zRFWo)8*c56tQkvQEda2kqvM^$28Ot&MSrA-F{GvdLmlf#5~Ug4&00Ki53XLHnOJxh z?+RolbUTk!$srcoj%u(IZvidV4?>k(1d+26=8z`8i17#Pj{SdumxLy?2utKJyRuhU=CCbrI9r^qoJ_LzFW_`u! zDlMWf>FE*ek#0vQ(*uVJ*lkb+`{|qv=b|4If{=>` z3P?l1l63kz`Z7_S*B$MrfUeUAz6hQpbBapo5QlTp#th`Cu^pN$?+v@C*ZIO{F-qh0LQY4}igW*kpZF1DVQ zUH*2*X?0Ea$9kOIm%d-D5yWLfs;?|)1#re-A=!rQMZ@$NA>r-a+By0M9hz!zAp=)w zwJMPAB3Vh!2cCmHLJx<|_mp8+iiN2O9f)=B zD!c6iNd|b_*7=k2Zzr)BV} z-@9}aK0IS%1mq3*o;1#FRtR)Z2By936$%SDSpK*v0=}68&pi2yZ7v^ne4kKOSiBc_ zDuYKd=y!N(kz+>I155O-9}~43KQ2x}93O|P)d8M<#-1^|Gm2lqgQ>+wq}6|L^xEdH z5w>2}H)aQ-#67=tj$1lIj#`dCb0G0tuchaKHgn?duOq)6cqa0Ky6%?iZeE&4C)^%+ zccx@_60KvPUTt}K`2R`yoxy_WevB(}`bCqj3e+N_hn@Di+mk}J93eK{Teg*HKku%St?*X!YhIO~}m zRxZRdyH2Omj|nK9FVTt5D65t&k9V|~H#F4S_Z4Nmp_?hZ5QMHsfhZ@Hc*8E=X@a)~ z!<*X;+#Yxj01b9+-CeqC{!ee?2Z(xcwZ6*wwmiVFfX}K;_&{n$fq8HKC80S=;Ad6K zQ_AizLWor}q}24qrf^kn#haD+byvAbQ_Ci$aGQbU>YWfUR3_CFqfVgHy)yW~m*QEz zT^$vzvp} zwgm`M}vrR)@e$O3|G*4MY3D_*oWyq_TGwxS55a9Hl!m=AXh zgigunZ*ufkz52Ue+b7oWtCDt(+-fvw_;0XaiF{UVHf>;4p2?f(bipZW62GvAy<qI;OKjuru?$}=ZEDc8jy5&%Hy=6S;J@?;M-dunci&^D&aKlD4%4m_>Kuh0+&kTKM4`L*Ftn)nf^jm%qvMlrdv z#6Ej(&07Qg1tV~furYjd<-bV&xPU%faMLKKj7$281p7!l7-kGmVCIL2G>V?N8xL(G zv^o)ZCpoc96I$hQzlUYD!WWq@9w+s^prB^lFs+=vl}(Sn(?iel8($m%qvgLi+ej9$ zpM-V7@jLVMN0y~Lm;C&FuK38j$y}VBknXY7{9KtuH45A=_7|u)O(zv$$9V1?aNjX0 zFDHMUCT;g_jhk-wS}B}M96ipQ=~!F{nw=0I_(>64)r@J-2o%I_WJhD`3)n|c7^{N* zoJi*qnT=SH#c!hHiy1%T=BISYoVObKlpID7y<~8OBv_qFjNrcu-ibft_u(aQN0xcx zOkIA(wRCbLEU438>*M76<^3%z(4e)~$H#CKH$F-Fi5h3M48afU(U+ahBK=I81*I%& z{TD(+C%$0Ii2J#Dw`M>>BWg-R*O)Vl$HhM-DE+Q6IE_%)szj6@N zpYwaiKQ?)cHrhWx3$ zQoRa0Tn|Q8doMtI;x$D5_u5qDL7Zm?7Vs)@K9N$BLf8}1!`C09 zaC@?l^X>C?pOTlJrkYUPFlz;c;IjaYy)V$sn!Bm!@X71CZ_My_d55#`^(+Oz??niB zDw#<6$6G4@+>Jq<0|P&4Mhja8_mfrJAJ8Hrd~g#Co01uE;`1wIc^L786oXh1kAN z=Y|QSAcChy(=PUY#ghG|dTq;zc3=DT4z zn(H8}=0eZ27(n{3K^zFNlcxN{6|r$HMmFQ0cr^M(RBW8`wgMLFr~WoIP&u+8i0$t= z%9)?h4LFoq{k1ZxzzlgwhCWPKpx-B-+};n>0klrIDO{XpyO>~dUy(G6P*qlhi~*$; zmY>%>_Byb9Y50R2k*tI%^>|0Eq7=Ejs{HZBd>7||DMhw$pC#O8#h}Z#otx&Nbvym* zm+TOWu(Jk^3Pk=SyzQ&Wt5rMFndaHCN`rSPWljvC+<(1X!G$WA;Yxhjz^?C@r*}=g z03bffBCMsMb%z=aft8W4?S}201;v>?(J^OL^Prk+PH;4f#yybQ{6#M?^IPL(R?P&C zi5hfvN)^}M<9a*>G}c9?>4ChSDBe+C9=!ZqqZBsPx0^=-OHn~FL-U(f61eW}fPL(| zt$-jAT3GCsNA3?b4bVu?U%R~ta3@evO+cGSOo>0f-VBqMCE=*$n!zYtBB~EC3)xRuHIRx=QK7EHjcvFXH=Cqebk2vTH~nHm|i+I@vmN={9Y*Fa;Mg?U(Oni zs9ayPw*-UkF*iDEjagfUc;yA{vdg*yyN8@-(J=L)de>;mT{8DF->hq@Bt2wGy?_+v zMlQ>oGs8g;fs&?}@jag_CHA>r4k$h0og}D5)7s}jG{EA~>142ou~9Nn)>`YfDQuE3 zaknCMxO{}+snRJ^=BfgNL*;GfcVnX7{o*U)tzfAt%qYUYh4F}1f8q_)dZ{zez9=?> z%}9e&*uW4m?DHqgF2X#lf2BxN)d1+q(K%{2JN?EG(j6Pudt6rPrIKjk1JAcmBr+n8GEp(+HI_%Vp519}zf`MD+3~VBD5+p6CKIPO+t4?LuNS?? zO;-n`=fuqFM8b7lEDg}hSN;8Ft#8|ve!2yfS0e@19n8}YxyP#`>v8itrU820dWDdD zY=4)Q6z^f_=gL*as1S!r&!ruz|Fwkt`?UbIXp+jCYM38WJohP5RN(7}V|>8n+w=Kc zGogU$bdlhom=_Zb#nU=}ZkPL~u`8D~$*apNT%hRR7YO{t{B6DHA)(ke)7Q@;solTn zf`1PKF@O-ef6!T9H^faSo@s!lhm|q=q~z8mR#q;``@0=(RW89PhC7CI4qwfoB_BU! z58d1rh0%Dyt(-#ewNYn53zuIa*okvo#G;zncN@y~Y+;r%rW%fhYJPmwa+?jZ`Yn}= zTXoE}3S<=|(W1@rL6}rX1f8myy6$yC_O*Uryy*Zz0lQ!EuTMrGl1e{KrWX;`c__4j zKkt0kY&|WoXb?yVe}VhkMCG0Tx53yST{F5~R{||D@;1UapUVkINDO?o4ij-YI9o?G zY9?Q@=ZT^)VOOTVJq+*FE1LLc_KtCYzQAFM{N)D22YY8MSRcNpx}RY|Lccwfm{S{Tc&{$l5Pm?CKqWVYDvnn~n{)Ys zo)yoElYOs_E~1lY(>(6PSpKIEhf^k5S5Ts5%?fhg1S15JX%>L+Mws(!`2`M(OLoJz z4ww`=@}3K{fI$9F(GHj-CieUjGL_I}j6#TwEAC?4!tXw!r_dXPPK4)& zXvEk7Gx!ml=qkVmkjQWJ7H_}1cuAf~b6?l-Q2M+kN>0&~*+yRyNV%}qJIM#qpXgZ_ z6+Sohigr3-L;|h}`)Hw>0Mj5p4a=wQyGeqzaEap;UXjpAQhVf5y16PLx`~17>p9P{}KZ2(acFE?*VHetokfHBKT{_5foBsk8ucKR4x}ds-0pcg^ zrq$h$cYou_|=;To$~ zoF%R|*Q2J3AbG0(u|odG&=XdrKI^oJ?s6R~Xhx*cGE!~UcA;p}s1f26e%3;;rNF2g z)upJ>3ep6A&bBb|zzj2@{%V#chU9XH>*kPn{rEvIV$rq@0T~@@ z`IO#_r5oVocDG4JJe4m3R)A!2>n?4fLI|-&ApP2A`=k=@&L-bz{^oe@)%}o3EX2Rr zE(cb8PB62f@A9#I8$FFIcpS1oIvi|{K@Xsr^GlyA-ALSxfWnQX;Ahgn2SwPd3R>vt zTW?Ka^b_Wj6=lRJ{qa@G*~b-2$V~x6&?!%d*%5=F|(_%YTzU1yo=R zmgfRA?I0)zB`}kWPqyC8)d-H66e>y5Kg*;rev}TZOChbQxxK8-=5RYahZG`f%^x6Z zBvj8h7I1WR9R?QrIXq2k4BcHECKVsBg$VFa^Y|b^#fl{zmmUcu?1Ix^+$2?= zI1v-ZH;O3)JB}9eFY=b&IV4~uofeZ@%6$}}yeghGQsOAOw2cL_qn=@HQJE=K zN7e0STR8iJ7$6b1;+oAtw>NfB{^Tp2FCG*^c!3vw7f1UN*=N`tFXMI`aROxJ7UW)k2t14Z|!-h0Sy}ONUuio4{blH4^BzlC#&`n3x*FMc8QOjo)9t>R36L zf8*fjCKm?z>FIvo_1??krqxG*)e6aV|Lku0aP>O@gga&EGhFI&>t&V(H>dNuVq|el zL;KrhEUl$ds^l|*N#92$fvJ# zjRk7Qg%B*#wO|aTu*v0meQ6tcHLe3!NOP6mN@Axzr`i<8fmTR`cr7+c&0iQi~xZ2|vw z3Aspm@Ray4kprp1XfF1nhq;poCDfW(sS0@B2FWo6W6<-5%?p&PXES-@RQXnqHfJn3U?bz3o*ap_!7yj zTSM6&z8+wKxFwsi!bLOo#5wfFo_I>pZ5V{A$+6?`BT{f`{}S{nB;UeypWNY1*>Q-B zuuKokTj`@6qw9j>D>gICXS!q6agYy|U^UgdzesbXlmV<<9@#$^x^S=L!~jLYV@m7> zRL>p%G3R*p^P74S6(oKq`NP=zKm8ct5Lfc zv5Vf4eCW1xD$@5YeAMCRIyH>%YN&#EUY-Udg%Et;uF+00c61mHn~{Z!JEO>#OFb!r zAq{oh69V%78oNmh4Y_mlVDf{(N3aA)_8pel3FQz{Tw0qgpt|2>rb1PPoy)c7as@5| znYty?I&2iBK_hNNZlv>hQN;y}VXUd}nEXn41u}})q<+PvZoAKjPM&Qc9T9kqBmJN% zF&FAOKEO@O8FCI#t2c@=VE_sl!VlT`|z4vZLoGg_y7oMcj8lYzc`S5Iir;s+TnuOB3BGbnTmOg zow4soVYalxa+835iJo{ll|Q`$VJN_$ug>nyq=k>HfO?`x4t(_f&AcZw2~u()xy-CP z<^f!*415&6PZu*<%w{@k#8P{sW8v9pfYv;7Q^;Az<9RLY!8i<51H~gxOVRuT2E@mN zI(cwo`5UcpphOJd4KNB>SSG^3N)z*+m&}eZm)B@H*Lx~mlU^_J+lNbsBIU%q%2y{$ zA2irfJDyupta0rW(z^xlb$1D}jio$t+yngP{l(^^Xvx-M6aAvjBRlgcjDb(Z%sl;G z$2Yh6oz?r+U4^8EB*WjCycFqHPc~qmu{~CDdG0T1#S8z|6`1Lv0}r}=B_|NkJhKzR z+@7-MP(jnF%W{FdJAAs)g`c>g3p5`uo&Ox;{qdbGQUV>TY z8!ohS{le!?UJG5Pq0*7WqL6qUM{0^qUQ=-nG9dz_+&wzjouUkEXD9bX2^#_b3OwoD z@-xgzUZo`B$(<=KBpr({PD7QcPym`LHs^ToSv4=gBu&}tqB_?j-{FXaKMDb*+j{u z;H~q`*jOwBMG^;EcmrA2-(0Th@HZMbrdX2UyX6ac$5Udx0BQ9+>ER2rY?%PkRKkTK zWZRIvq<{UZgH$QQtW@GzuQqzi!ct5=9Q=r+^+L9b(?a`vuH7$BCP?zInvu>C`m=O1 zzf-flgkSyulY7nqZ!B`Y@dF@Mf)8@=A8uxD@qc{=UXh~SY(ce2?85e?QCv~DzJmQj zj%~P8I1HQ)>eBGHXEjcU7)Gq&Iw36VizT$|gBT3KA9An zN=SGDaWu)WaG91iU0QffMmu)Da7Z`)vaw*1hP$|={A*(CtqoHOelUjZuyQMl1?JmD zJAGhGE~b!c?YMcv2!XJ*CVL5i{C+x3c%9zqyP%UHZmF<))0b#; zD8HzJJitMtI#bV_;F=Rh%*mHuD_0r=%b$Dh-C-#WwPW5+1Uxztg=f+QSvDv6`uc_; zcKEIsbi2|^MRGJ`au}1?2>U1Dl!a|1U(c{4mw5|5GAUJS;$A6V^pwfPa$tOTbisv1mLg z$F3FiLqx`-4-hDjR+w2iWl(M?ZY5kW<=#oLo|+f0u-nku$w!ml=xbX`cnB=Kyk1N# zM`>@*DHPtyuMg4x2Ce1wdj!6Y&Is>XiZ4{|%}gK0P8;spx__HF_3N9l{gWEb`hM3} zAoTHk&tQOfQ|S3RDW3f=yKe#Te82iQ)BlIjvwd&}`u%n5_RsbGityab_94yHEJn*I z+TH0l_e0MjEMuKd>mM`nu%=aAZ>xmVrxpOG^uATOG zgO_axgtvLlhIKWYPNjHZ;QKtKVTh$FMHQ?Sg-g}1%&plw1-=5D_5vQZ;lH9N-WK=@ z4yW?`vu?zSqai=(YO_x+bO?A&1J_5Nk&0j0PT>Y-Xzf!y^`#3{Ob4TqRow*(C{u&X zVi-shXpoi2j*7rY3MWzk;-uy+)~0v&<=-ax7jp4r!iPjKLWIm@AIJqD50u0Fg? zp(g6MKTJHRK><6BshvABfktb>Zm12O1j6hvd9}PVolG06&Y}U&KIj+dv@f`@U4u-l zoFmuAk=y!ew;lPLvxxfSh029?eov8nN1EJmuu`TNp7>(O2vb~93kL;)+C;Ghj^3t? zHaoTcr7I@Gku5wR+A@seXS&<;YMaq<(hRr4_TR(;Ps)te+@(;*$HGfOgBdE{sd9D? z{0xq4Xy9IivGmume)e|?%s)JD1Lbh)S@X+#Q>SKVS^Thqg|nJ}4(~H^PCHy0I$m$l zX);bJ9J?bba&%NXR@rV%&(@x8Az(ukx8|PIc4{;i8)rQ~6`=pVf4)C>&42i8Upp#P z0czGVZzpmp4LB3DRrBbow=?t7vouLHuzSVjJKpYPT9iC0oru4mZGqTCt`OsdsEsyK znJF_|RkxZb{LcsKkFTHwWV4G3w`sjCtFxm^I-QW71PuLpl3g>4{o}*`ah(I5 zuln!9veJ_Po>C}I#NPzBsB&~4A3wAhmIHqgUQmPtR@~Q5iIWjyIcSdf z5-thHP?=IHT3N@q!HqV@(iNDOCgzQ*CnV=>V>@_w2v15+J|N|X4VnsR1ew}?`tzI*VJ67r&gmYtw5joz0)o zZN_!h%MgQKmF3-fS&6b5IMN?2n$~s^%%6nvdPzu$nOo7?rSwqKg|WN2iglKlI=p5* z%#1FBJcA}D?!Z5ix8-)2-FDFX6zw75r+tZCJtFKJd`FPNApG}VsHz< zsdW?qf+7ij&}JLvMs@P%ZUlkPR&_!-PlL#7lNbBiz(k)b3?^VoD}XN4O^Io8>8r=# z&u=sz)l;7N(cmvJV0L0FFd-Zh43>wT97N=frtPP%&Jd0_(HzRqN0-9C+g4o{qH$MU zuhxk7u*-^UWfJEg!_Jw67{pj&2x9thP*R`72M^Wx7YR{%ej+7`zbbhYl_jwq^9&YA=|cBf%vd2004 zWrz_NFOPbOOnbs8!}f}Dq(zUwlG*ofT0V#Ks5(vd(x&}`JZEhXl}sJYKL)ftqfZsv z0NZ3stqeK(y7D>nE#rD@;J+S3naEY@{)PgYjn@st&a z97IisbS2TCloz*ji0q=Qv|In2*!63?(xN9?;8Il&)15+THpnBb5FJe2mi1D1w^bMC ztO=~kSD(p2bT^x9z;LjZpcV$-AfhlV0pbGgW#uAZNi`U4lbU~WUPvvbJ@AOil5Bj4 zvZFrY`pgqhbK{U+|MiXkLkplE`%&_DCrgof+SraKSXJavw&Hv7$KYrGtd|3PgPaPl!eQ)Vi_lk;>JMZ7UD~yio@Av*uTTRY93ik$b#KX5`S+<1uLoj)!h@xi z*90C$-Sy$~dgnUaMNgZYo$W#mXH9WN!jsC$(jTzXsVWaAD}okcz`6$;0JGx`kAv?~ zm)L@~Az>8Uvum>DEKgwM5viqoTPNb(%D^*addTri8EllugZOGB zclLq)9t3d!z>u9F-2s#EU*r^RL+2+6nI}@WjM6`=2BI(RrH2=<2Sq@S ztZlIvd?hB8=MLGG%13p;yYZDjO>NE`B~ND~FYe$n`ih~oLpK|PlQ}r&TFUQJ&gOls zsmi8B*1BCgahp&7>@jMFnY>BNvrsE!OkBG-GjA1+$WH_CL&bHB#5)0m+Se{i-r+tJUf+MK6RH*QtN~&!Rp*(@&~#Q z{?g`Ogkt#N<-$6006u}c&)Lf=-Y;%k`UKMOmE&W(jUCKcGb6$w5`81Nflh4c5rifE_tvep;bK}KVU@&Z3rs7t`A5FqxguB3ElVo{YW3T?9%hF4mhj7}0m)j^k zf^cELZuTo>SsVl@zN3p4PyJo&?Fjs`nbU-1Aavf-IM_}H0Q*Kna07{-o{>rA`Y`-n zeIeGp%v*euR1$}$ZdPO~kK5fV&F4W$j-zW$!ru%TUB zE^+@ork?*X`QXO%-F?}uX!;dSg};Y+pu#i9F}%AMRg!G%v1o>`Grm2P{*qPQcU}@o z7~WYvhP1;z69*ji{Gt6ND!H%z?@RUU7&T^4Sbf|AkPP^$nP2NoC|M=Gk=H7aCnQ3l z1qZW*g8=t4>J&K1?L-{U?&o^9Mpu9oW`?n+_w5=naf{B2?Ts4p@^<{jP~ z0N?}w;reJCK6rHwYv3l0Q*CQDw>MhcH?$njtO z1_2E0GrJK9*o1GyX{>$~4BfNP0YR)4ejw5>#PtRn{Lk(I6oujtkZCe^Sl$UO+k6J|u zDysAHR*Blu(qkU6=x0n6MP(W?_z0pd5Xy%{O0!_Ug73wcOO*zQh_;4JMEar9_9m^1 zog{vS56Q(APxyxGed2n5SQ8&)#>iRp=0fcZI!^qtD4*ytQ^z>70Uz&r^U9O)X2(bX z&v3jb_=Jd?WZVv`xO@g94xexFdIpvm|gu6@l(}%!A@MSj%x<)OQM@s}^k3CAsHuVO%0P zgKB_shG2{{tnMcK;t-eSJ4zE)Nif^B?4%_@9GUUOTS?n|lW*BdN;_mbjKRCX-o(w8w$zbSyxS*mF z1@_FI;b)O10BzUR7a5ScS*1i74Jk5GjDZ%>k}ka@MpmH~2u>4eDdfQD!&kDk@f_@C zj0PN}QdzaaYwMDrcZ_RLkcY!g-X}-9;#RbeYrRwXz0TeR!~mcTlg;j8|A>F2_8xj3 zYNuY+^-P%2;mImMYzi6r%bn=$o&cBftKa_i2V$YuwQvwEy9EUCE#!U1AE8k113icP z_dDxvoTHP|CjTY9fc_aGoTGp%PDG9jz>zFkFr@3xIG#`Hld&!~72;K>1opT4;3(6s zk!$C9@K3nx+%B=>vhf-?$`|9gn!gIdNzU6y`T<#VMS#_}ts!PwW$b)xLP1_YLHD_G zBdO*H`${1re+pWUqFRuq4$JCL563BVgJVarrJHhv-#kZqaW>G1vcfP<4+FM^Kr4~pGUB=;$#@aZHuGb!g2T6$&Ez(1 zAubn#7BRgUc3y#mYURQ4V0eKclI(%wei)J)(`|A>WRT)NFv}A%7GI$7FWg+-JUk-c zG&scP&3R86>;oV*D&b=1bvVkRYJ&^=^{|r_0FDx|x2Ir(bR{W^P}LoLr?E==!PyPP ztT+q)))Urje`&;D;lFp{hSfAyJQ~nwy4KcU6vLGfJ!gHAwXo>U$~Jf9LdEK+|IsWF zx3#ZQLq;er5P`=wszv6XwK<3fI3)ASQQ1BoC z=@lgyS%gUVSMJn8*jsUQlo1lyDM>|tpdr&;p zc2Q7EXy6fNMeu3d$i%JWM0WB#OO5lyGHyl^D#2x0WNkzfI7GP>n!0Cm*N>j0W+&6y5*BSpWw=JPRlVHO47&R9M}h&FkuKIFtfLGO($0nH&5_+$e|1*rOw z+F(hE?uZU`|aw<=E`?7rJd0XiEtE z2thqh+-0m$3ux>%VUA@iECFG-Iz9>0ijAx;`SS)+C`~BAzP(7hXD46fQUMP!v&%P!I%aibqi~zi_OqG6bRJqU212x&?U#7lQvfW0pRv8at{U zTh>C`p?p%ye>ye-;MIC6ZsEs)x|{iRm2-PK_X+o>we3Lcc3nX)9CbpiK=7n<$!#}- zamYkzL8iE5pZk%cYy1gTB)Qz!k$Vea!cbuL;TSm>fRX%F%P3`_nkU5mEc6Q5qjgw{ zOCA0XYAM&%h=iI+x!vX&P!1mZOtmQL%I?Eu?8tOrE?N3}#NC}H|Sr&iFZ12f_e zfi@*GFn56ySoJ>2;|{}m(KTZHN3~@1Yr<&#P%Rk<5133qA^yV92!)H%`NVsl;5)q` zP^NvMxvv+uFnhKJQ;9HIij96RH>o=wy{QozqT(|2kKm>v z`ciYhtVh(IqXS!HqcY9k@~9T?#2yEGB8J~X*VxOa)&HlSg-Yj4l@xIIWa7HdNyE7n5N$q^Ju`}p+3j*wb z;S}%8ht9HVHOuP)w-IYu=#EYx@ZgFzCh0_EY*4w!wh}k_%E>q zwcr=?#&Scd!d2MJIMh{k{{Gw#@LsBbd1Bh|hHMj6q9aip7JL^A=a@6tY7=fMsU@{> z;7ss7E1}tK6QOZ=UmuxbNHl0zX~#6nTaPQOlC$tt;V8kYGykhONlE%B!Yq6>d{dO9 zJ)RqvHWVkyFrNI2%H#mEsU}{XaPhIaY+9sN6Go%K-DHg7K)$2MFtc}@1KACL|E!ti zGBY?RGWbC~qWz)4{vK_LGdNltm*K8fXHGiXB9#`Sc7|5aw7+p$dJ1e;xyLDlrEf%r z%<78Mby`ASS*5LsRA$ScP=7h$r6w{#RyZYUAEx2>Mh5-aPf*gtP|&9;V_pJPY88X- zV9Ma19ki0=h#}oMMOA|t;pI_4kce2J<`3h-be>O|0V0CCFHE+|)H)K|a!=wb!YnrF zAdSE~x-n%w#^kFQd+a>+oT4Ujz{AZS8uZm5KE>(TbxsV72P>kfBp}k*y$e+w5w4d z24tHX!w`?f7qpek1fR(xmq+3Aqa}jTV)ix0ZboO64~IP(osbgCI)T zF`80Kk}H;@dUQqyfYSmVhPtZ~#0N%Q$l7&*&gb?VuJUWWGwEpT+37b%`Z70Aylt$JcpHtSKN-0Y%0~zcp6*eYSpY^w-#jsC6O5?JZWD zg4Yl-KW{Pott?@%9s#P^Dhp%P580B`wxp#w-4oq3FV^tPF3bR&uT+bBuEMllwQZ8r zrF{8_wnA}O-kb!?G4ANcong*Z9DJAJ6H1we=P;nZxodEB6~r%+wz*mamV`(q0$a>Z zwI6!DzN`G>-o%L%s6yghCiIvcBnIeCvGr-8_=)*sVEBp^ez~_wtUyh-8_R3He!-KI z*DGyIFalHqVMe`WKikMIY=ZYi5fonvuJO_9FW%}n#(63!GwLvn zwpHO2Sgj2k^%>b5#ruPzKGr6X8^QhiduC84*qTyL+Hnq$fwW30sC4iBeK)Y=Xpm|f zVwOasvVNz>euFSo4ot+U#C86(%edwEz{t4#oVNY=*FXc%gJ-zRV0%|3E)&r)@d5&P z`f#X32Ah0rbX2x7` zp(5@CxdG7nLF2IX=|*qYB=7X7FjL!GdtIB}Zx9;;ZU z-Cq^_EZ*bk6IdccO6lajiqd8&3gg@E9Tu}{~%Wve68r15XahDj0cg7 zut)=3cRlI;^OP$RGr5*qOG6_rqEedTo%DFS&~~K9j^&17 zDGps+HHu)b%YXXxxbvt!RCMKZd8YV~zEoEj(7hZC#(Nx-cp(J}H=gvWt^Hc-1&D2!(p@zUoDvVxVIj-{Z`+?Krz$Nl`Tq30z!b@${67Pa?9+KWP$V(TGlI8@f@{mE_p{W;wag-5E(Y|DXm zA|P%eNp#_o`23x*oBTB?5cUFWh>UzCP@jk#4mnKshY$pU;4et^_10n6=SFR1RGZz^ zMx9>7=X%$~LQ51Y+1KqJhT4GfXEb{H6YYsk_oSd|?mb+t<_`%hU#{Pb#mBRF`J^jsxfglM`V=kzS=x8j8PB|E3zp?a+bk=%?6K;pqXg6W<;R8KeChQSwZ*DAy@CsvxZ2#^=SVQM>osqTo&Nt zU)vs5@_>mF{Q~XRnZ%1RZ`D)cxcsX_Fi%&x?C-%&x~{IACd1RTJ2b%+LU862Z;96z zyjrNRC5x{*nNg2ycls&Fw9w4^E8Ive=Qb;6R&7g~d6scE1;IE&S71)pj$- z@+)sy>pXV;oH(R@J$VlSf-oHY+9BM5_C7xwn@Kb-m5@UQ*1R>>Kls;FX|7p8T$^aY zjvvfCUnhaYPQyhJt6nrpI@U2$AW3;{HQ428Y8Z7XY^7rWh!+L`-gVDkd9<&^_v(d5t>55<*YKutEz4yACe&;U&Gyy>6LzFg)?Us*GJ0f4OV~L$+olN8Y za213yo7?7u%Z)BMkB}{=mv}S)zxJ!Yo|n~FJXIgs^Izr0_Dx%mTI+)o;DTD6AnC=1 zPxh^a;nf`WjJ^iop4t|sriH3>&5OTGq^otRh_QNhZswF0hHXc`)#!EndwC5VSN&S# z3dmJlP@lkWDt}R(oz@7{O!Os*@j?M@>jTa#l<8Xajal2np`)?(PnaySuvucXxLP?(VL^!;tUa zd(WPls&&|htGjBgzTfLfWa#rM(nOm)q8I9y`XG2L>0G|(Pnmq*cAM6zCD-MD2nl?F z-{{zBg<40msajW~)>$OgwxCcj@sZO#Q)z!b1FCePOG8S>9RxC3nbcghlxSv!anE>Y zYexk7=|qRckfyubfQbE$pALuKeMm&M6B_J9)#pLmeeVp`$bmNSmuvj6q27yXgHg5p}io)-vjEw_$FBb&7`f2LktREH_~a-`5TeX0^(P9wlk`o1OtW zQ5}hi{)^K!Tk*I(%o8<(F!}Xp#R-^G&CFdonOdx!*IkS@fT2-x@8?B+iQ@(dp1m3} zXsHwFll^eiHNzqLB*^x#m;5vL_A~J$>)W6239Y7^5@{Q;=%L!->f8g#=0~?O0lB^M`5&T<+bs`l-6GX^_Q4vcy z9J@^w#z64)EUy}7WfE&rW;9W?0!|h1`U+Nadq0`@qkD2|9px;i_T$2II7rvg!j#Lm zDu-kdm;!A#)HoUv2V!I%rKEbK!d9!fz!P$&32E_@n(-g{Sr`jWaJm2TzV>6DJwT`D ztG^f9@kx;w9-kCxBHP@iy22S<34cGlrS2kv&4(rMSb;3A7dx0nvqX1SbaEVc@L|}g znF{_GXeE!UO}PjQsq}qP+j!E@A>kyrX$`0ah)(tj(8(B3Qhi3oTU6aj4z>Qe?Y{D4 zhkC=`eZcm=+3KG(*W7<`=;-m9*3^1Y(DLv^&*c7D&}7rdeN)_9M}w}jX5MKW_&9wb zleyTD$GDPN*<9kp1JOz;Vr(ntiQ6$L%-oAfUu@{Y(?9E2fNx8FNN}LPbXTXobYVaP zh-B0caT3%gvsAD0YZJm&ubsT`Nk3*adFUFE^LNj*JJ`}vWo}_o!k-VzjNX(A#2p%> zErH%mP8!{vZScF+JMzML8074C5coL76`E-)lV-(mBnGS(nuZev-e~>y@hKt5>fLD6 zV$UD$NThk`)GNg^LQ(CWvYl@SgVE6e_&R#P6j~?TpE|8h6<%JBZUd)nw4_g_-0a;FIJRJr;BU<2&-J< z&DCqBq(VNKh}g~H`B>T5*bKS5xXxx8#=}|`Kh@i7G%#o-^SE{8)BgGefYZu}7of?I z70HR3E>g>ygatAe-e_=KU*3saiMlr5ZwGV#o}6uAiA_^cz7<@YoB@w>x_<+8uWp_| z0pRIQS626zryKI;1>yFEo)|ZeZqjwd0Dr+SjEeOtt(*gJLmJ_ zqp3`1G4vTS&`%XL*x1hxgdc%ghWNc}5uCirg}LG>PvyLga^Vw2wU)kUw#0?_?5d`s z8Y`a+IM5F)_68GykPWFxYmQvx#@5Nh)&D_JKTnDLFBFycf1{|1<)v*W$0AW(IV53S z^I;{+(iFDGJgAiWllZ2aEPpctg@g$ic}%)@mC>iUe%7$W(w|M!o;ndobu$;pZ!w;r zP6l&^&@v8iY1K%K$UqA6W>EwwX~@ha0+)O0Yb5B}M6+UFgYj9@pKA_N(-kLW;E$UG z`IwS=_<^9mZ_Y(OD`iX%c1hT{>%$k1=M_-pt8u6Y@b}0&O{9}Bj9n<16W{V;k&A38 z52U>+w)P6+_-k~jYYL8dbE+~Por64nvMMp=WI#AaqBPaW^X)+~0w|d2Q!Sepz_2L7 zl^)h`x{l^#7?esjxIY(N#aSg=SuNOIB9oCOZ8A(r_`o?KM`W{PMB8c2S$pPTm5$Vo z#j%zgH1IeYdW&s zsE0xan`vDBE|Kxk_Nq($=6LUyi=mwRTWulYG_$g(A3=aS%je^2ZVRj5`$*6J_bma< zxLpa__1-T*$lK0&cU6y=ww(A+uzk~tQoC3{rW-}zc-XT z#XyvZ`1I#L9mwgWXa`=|V*HsiN@>kcGg$xQiyude1DuYNcQrwr3(1o8%QmXe96Yy;O8BWYHYrN$9LQGj5tB>kDXN zbTpe@D3C>;I%_6w{au`Mzz6fNcGld$_Pv65NTMXH)FErk6D>=b-0NZ$F35HNG;O0P zpvv-lDv3LRP+Y3j1c$}|dAMYOU}gA=GvCS}rwi|jy9r(ox`O1zXGdijmd?qB*Nq8# zXl*L;NGF?i6t37s%H!SnfRS2Km4hpynL0u52P~lxmf^|4SC0EvgxG9&B+|H-Azh=| zd+_L7vP39xM3OQ;e3!Wbt@V)Ec|L%5I}sEN<&?ou1`~V_^K@sGVdXhU6Uq;l`d}Pa z-X5A~Z(ZC|+49t5gCqjVR|yX-TetF4%|@q^5YyS=lxtvum1>{-gN)DRv%{VZag+s4 zfj{eZc1pD9yej*Sd~h^WEHszwmZ=?Ra{T_WzLlcizSz}$Lk836O;NrAe zdzWQRpfP*~#j$_(uC!+{y_$Z;Spu@Q0`MM})}MQ93q|q}<>61)x!?aC6;{urKF2TCe_8!!DD7Zv>>y|ZPtVZCoXm+vyju* zfp=7Yvj2ROohfVe?g#V$zHEo}q08j~S!vbUll?D|A}S{YMGGVXILqqv+oIo^H~k+=rlQ;k6-tn|UGw<(@q)>(@cI&X9X9sRokf_c%^){<+oeEbp}k z@k+a7=HepN3&O@#bo0sMw}}|D7@&kD&iiOMWQ8_Xm8WT};Y|SSIE3@Nu&KRK+^`i_ z;jr@2snFk5eJs0DlIZHy?2DFYhY8XC2Lky$WrE#)s>VGG!h`}RClb-DyT6;$Ya{YJ zN(En8{rkvE!)~3tFeEWjMEo?qJe(btV(l%D%1^Vbfn>*OAcsd=LVSOZcR+@4&NCOuAdVSKL%yysM&{`MW zXIXFZ2JVyO3B*1KQTI7g|9a#6IXp4visw<{_MvDeBpP z7bY~J-}mi*1l?YTKF|h>q1kwGM z3$li6^`>_Hb+Yy98}0>pPyjQ&v(Hb$B$@2!!Q4dvm%oh!F$Mpl9EWoBdnb`qMzr^? zlT~3v_L>;KODkj3tCknVL(#l>x4Mb&vmt-et?+YI_(DxkPA&JJr#!v6B#~Rpy`LHr z^-Ml4XVLg+y!o`7fZnWCa(qdRWr9?oq(vd#HY(d}#1P`A=&zLDTF#*zwP3~+>!LV_jOT4j%-Ler! zE9=0sZ-1DkW0MScnq#NTApc440MJQ$MhVHdftCp6>Q9Rc$Wm4O{c;x9*6MLTa!$4y zU7}b;fWu|SZcGakqlgt!U(v5LQ**cHe!llBci4DQ_aXJSCNCz(#B$epZOiyCg$Iz# z7@jRQmAC1hp=O(5gi4vv4D`z8APO2wj3;hRmhzbynstH7-?FB6CCzRNnweG5mcMhj zah_ZqMoo`p0J$F!kt8(QF>+2ZdLcb-wlB(ios-6KA54(GMa2+)lyx+3U>eXx+K|j>Kn#1^)nirCE|h6)AqhneEc4@h)LhK zcg4;Wme2CauSCPpZsj+Ps+V*k?Q7LC&JnO>PQgVZhvT*2*l z?LM%lMy!iJz6uyMfjY&(i*)oS&XgeQS^S>IovTzOv&_Bun;GyQ?0a-vuiWtfu19P~ zF9`leFLjNW%#JVpmFI{AuCMu)I#7#0JwOQB8+Q1Dp8r$!bzmYMcS(_y;$3sexokdY z04&jpq|nLfm-X~>)poyPG7BexMKAbA*Fc<=GR>i2>3Pf4@v`e@kAvC9_fxK$`{@{> zPzUhMnKvRmsBy+qi zG>XDzgGAwSM>k?H^aqy{H##*GV(rvP1NbaE;*7l};QXEY4uEN&*LcOG9Q>PgD-xwV zN~Mxy3)BiUfYuVGQ|{ytZn0>N*x^q_ek7#QV<;mr_eX;0v$qP?T#ThG1w#*L5QE~g zICkp!XZu#fp4fDeXKse6#HD_Hxg)ex*C4yL3y-D)Oa8542x(*8wCyxU&mRLt=4#!_q}zLex`@AV>vV^d+HlrFu50=1INsaCr*L5gP$%6$=T!9 zO4XmCRRZc~Xyxal`x#mRME_G-$<}&#)M}aEO<@jB)}IiitiFBkm9)6y=o?JI$Gt}M z;#b!=?E;~;uXK~-wYC)!6SfsZfy9$>%{b4f6pawH6%^(e$@0`_*IVZ6N!|~Qd^f%3 z`%P(QBV{9x;ugU221PEMS!;+?3*;uEY7fiW06^4OgJ~);fYrNq0$ZlM z4}#6at{H*3g|k}oUiI&$fzdHc9nJJOzrNx<0gYOY`Igz5F?JkUzwp4#jbT;=Ndd6| zvgn&5O!P0aqJSg%RDCN#<9?u|`yhEyXd0(qPwD%+JZwH4OHti85f=SKfIan#93({J zOtEtrafu@ZT2Ljs0l;0E==bC*?r(i0S}PoKlATJdr4sO^Xuz=SttLu; zJ?g*}C=!D6(;NY_S)>%(?)}j~6`KE}T)Yi4j#dQ~Qwn>*e^>9#VXdyYF_2?D!uKon z;-aNaL5uHrHjEXkQa>1a-;ZY)+4yBWb>?A9$rer>pNRhoD@!SlWd2%jv`FrQs-%6# z{Gw3)M4UqhwSFtfc>P86-~jSf^*|@)T^OJuG>C6U&Ih)PBAlp4U0x36KP9;D|5k!~ z|I4eGPZ$fXi-Vo&+`{@Bei%{t50X4J(Th)d&~0B%Ok;d1!MI)f4PAksuMc=CxBq-c zo|~;?qzkh+QtC;H|9m>Q{@S;0r-TuxAQD&I&%ZGXm9w+C1rH8^o_19KyFeH1si9l>@`>=R6{f^IOesURm%UN2p8f*%eD zymDWyx$hX`k4Ox}Qelw@!Hk?iL)gXmEug#g{lc~iNchY?onZe@CpcfkFF;ohg|Egh z;3kM?8#bn<9QcHSrER{s<%(iF(fiFY!MXNGhd7;_4%8o!8R(xFam^irKZ`5FZf((- z!9oRKK^7gzz^~qsvr%Hy@^taaRCO9l@F`|3hRe%eLc z36AhT$e>j|+p7D|w(1`gESD{Z6zeM$4DCsO(wP|P;}?#Rr@&2znW#X~<;+<*aMxv| z1pEgDqn(XN$yw6=Ur_K)YSpkmT!G9ftX5 zTnJ*B%bp-lNbm%xlknT_S@&g#5O3?*qWr!a+LsvaBvAvS^`8|CzX>t_m2{2*;EY|N z*!fBd!*Ly8B*B`SOs|Iwt&GyqE4D&j+|UzPrThCvCiOV_lyo6BpecmN zxF81DQygSXT8>AgWr~@MKzp8K-?|i&T$z=#i~4mJ9+NHoClb3A3I#xb`x6kyTu~<} zHxrE$cnTs3q5aE6R*IOj?{c?qD3pRb*B38FE?HOjD}FCznu3bD5wCbAi44V^Z5j6? z(x5K1b1c_v#}qKSP(IsJ@ZX?yVK!aRelHfH^t-~SS&;31 zU80TC^JlSfa+FJ@wlBIeqg%Lx%64MI!js}+S19s10{@W-n_~h>MP9RbjT(;VcPU&A zQ26U_2vY`}_P~1trWwnD-Te<2Y|%m|%Sro>3l3hh!IYHBwQ!g$?v?sR_mGBKq?6o= zb2fvsqbQ=ZNRsl-*_)u@B#un+@R?SjD$6PC7K9D0GJli%u4t&Ju1`OMbkmTllO2-` zGx$4=X7pPk*?{u;^MM6knUCr^z(EN&*H;EqLQbeP%C{%Jp7!o3C&ejhuKFiSf$BR~SZtTs|4aD&?n%;;;}5 zMur8{x7)O4d3DWsdRmbmMu?mPxO;Jf5Aq^Br6pGnmyA*$w-yw5wpJ7!k2;Pr>T(GhfE7^Lt z9;`tqiUc^kGei?+2x2DMGnIaew^Wo9EquW+21WPqC|W8-An5l@T7E^!R*a~pkgy@v z5b{6{DzqPZUpRRN0n`cX@?up9YKr5C+y|)5^^q^%mW&13;%ybcil8NFN9W@0c1lzE zg3ip$!ckETK=r~1c5a`A(~VCboABr;K)>Ec8(L9iYeIytTrER(`EJbP)uxY0d zpk44hyHWc63LL9?!IBsEO{OsIhcdg?U$|B)hOixS*7WLB0WhPF_*Du`KEYr;KR7E; zQekDKAvl%;w&d}_6~TWW-x>= zAVCGq8Jqc7KVnyjZFzEVen~yx2Bqo%ETo3=(j#6T*rB4BO|`o(V&dzg=#IBjh%b}8 z?#Y7eh5u@1TSsh6A=phmhZgPx4?(Mm$Ulv~$DS2RHxDzPjk!e_5V$}4#I!6=F8577 zt?Nz)ebaFF_f%c^0gCz^E%J1}yh8;AJcQ0ZQLO=tWDu3UY^&ieY>s25c^Hgiu}Kmg zb|@t_km4vv42>S6r@l>nQ<{qPBmSzy1kpGGb3&zAC9fVutr+*b?75Hr$zbM&*DoOn}@m$690bwUr9Li-g>IeP2 z@KwWsmKdXuOS|sf!J?GGa9a^a^$l#yf13OrcE3d|>~0;$m!Fm{|3D=Ri~Wo#%q=Ao z^5`?DN{ujDj|M@C%RlxI`-;)V01GXKMvJ*qV$e?7Eu(r5#Fh$z*x^ey!9-^qS_3|b zEyq;nDvPXkSFDio$9aQET8aWZt8e@Hpey;Q0QP@y@NP8qO(W|ID$>U{imq7J;AC{n znX;f)B`~DgU@~b+nQQ)9MgtZ-{_Ve5hhq2QWl^7U@J`kh@&Sl2$tB4NVzJcjF9->? z>K#fhG~=CQ_gdS#V)8{{F?4sf&g=w7;p-#Wwc;u5>DDw$jNxr2PBOfU1v z!WdVv+PzH}Z0kDz{sB0zZsb^huxk_z>GF!WlAI z6799#!Bm$&YbLU{DN5tz78dN!q~XLu#CxRySXB0J8ocQTZQI}BFsvq#n}WQc=!>tN zNRh?_aG>60gCKC7F_r_!L9P~rZPP`Is<>_gMt8UUa(9vENUq(+TPq<&8#uDoVvBjS z2*XU7YYEk3EU9(kpd=nGQxn2m_zA}~PJFZJk)=Ai0DFXM@{qwgKc~f?h9k}G8}RUt zVdL{7JDQ>J5BmiC@{>J!LDZ&c-4jnm<wZz@JZD1qI z;?OKElMc+A_Y6LN9;ZewX1s0`(fGeCZX8IZPL^NipY^RtWBH4u(Ad93xM4SFwXusD zu=B1xK9prKK!yP2!rQ;aO*ow1`QFvHT$T}|LZox_%p6o_N@nMMS~iX6WjBl7)O(kG zY$@Li9?_AF+oVqx^Y$r-!nO7XAa9o1r%q0=0&&u(i!A5pFP;>r@+8w5+L>u9cjxX7 zk7(YR;A>80<7>;^Hyp;5+bhFI!{O85DDbqU;?sqH!3_h3{mF&SN9c1PVM+r!F|0qeF}>?FT;?ApTnpAvV_jCP>1I|YCc^<3m ziduu~IIR-2Zebq6G&+adAd^4cD$$6r^Ft0hD&%O&V=>Eg7UATN2M&odi4hOz`^HF& zRofSf+J{7)vK!}i-L{S8j+Qug?~9fE7_S!O@c{o{e{R&1kUaw5`6DHe(?!R(r5noa zz1jhaSBo5Oek&cKL!ala;QPtfrUUkKn)jsfZ#KH+TCY+?0?(Hljqd6nj2gjx$PTum6%@yh-@5XMI!^D*s!S6-HP$7%I&5ih8#`jOMm-;!*7F*>*3TXf z_~z0}ex*J%ZD!B@eWd7OO{(I?W9vAm)TRKIxP127&k5~Nx3*1|-WimSiw+pW8T{`? z6cEbOA`G0)2I-a(5X-`8=Nk<-k>bz}n8J7VtzFEs57Rx|OoW>Ck6R9N zAo^G(-e=GbgdYlL_NRx~26XJyElqzZZSq?ZX85v>^VV-8Mx-NKMt$P7j?ba4ZO#ec z&pya%TcYBOH+ zvgxrtJsg279TqTlQiGcuOB58GiiXy(PFOES{b?}k@n|&mt({=d{;sIJ+v~Ue!5`0p zXKIsZaqA(n!zg|ctrb$+X9t4fYAr1eTn}*7OE2x3!RyzCAFVRCk&dq->rcf>DAqv#=-p z7DoTnK6Yfls1jl+yafLd0x=_uEJ1B1Jejpn>oG_Te5#5!hYw)bi=+Ci;87G{^9v zqvKe<)R4ieG0C+%Rp@k>Gf&M}+tI>1C4#0|oAC!T{^^(j@O&b*eLuM$|KLp(4`Ibh zCksM)S0AfO^aJHbAk2)oe|^E{w6BfZ2_QNR&_+LC;u-v_t+;lfgQ!qgf}N7mSottm zMKQLJqN)uLva@vC@c8r3FIlsvz!0&s><4;OWY%c2l+`W<6(zK>qJLX*epB?6bKdwJ zh3Cy9jLEkcU9#*1PH&SA0n&IoI6L~RF z8tMXvlgB{4ewHvQ_97R4&Dh8kgdkrQMTnAy>*qV^!@a@_xlsB9*4fZJh$s(!FNcZA z=g}#+V|GD4mZU`QzmR|KrtxSjoYNB{LMD#CQfm~*OA7yJH!(wTj66C|XH!;8Z0(E7 zJ48EG1VfJCZL9y zKH0JkoDcJi@GKA1sxm|!(tc_mqa~3cpW27iXxPH7rE^t4Xzxi8`QkSQ%qYHz*oFc$ zJ3k77DPQP++Q*Ev#HaSbvAEn-&GzgxsDj^Ivbgjen9OA7$e8$2;)Y?Ln#Z>u^SRTB z$5m_Tah{IUACcibKDLkCzA-P^Y8mjk(+PYIb=qyVsYc@88IfA^NHA5wW`Sljr0vwo z#I_*vFM`O$DU@J(y^5`Ux32u)$3*aJ;)wynCfU#H+%!M8I8VR$(Pl^2dv$IHZq!p! zS=#$0C|a1Pe9vX^!dN;at5G!TSAW9K$mvS6C|ry1cBXX24RGePzO%=ZfY^YDtcb3G~u&8$-B3 zRfC94NuHS-qpc4)sh|tsYot)-aOnCoV%hlx6}*4$WTqx>55YVDp9hwQAGg0MW<-fD zb36;D+6DWK(bL7OeGUjU(10qS76sDdbw}nMtqh^!*IgZ?4r?BG^@d~93Wh{&W1y{- z4kq$j?v{kkH;YUrtT3vgp1dcp|Ex7!a(YS!hA@|k;4&sQ=cz;uEFkZDOiYmQAT>LB zxzXVJYP6W%zkNw`{WYu0LP4s@iCMK%8l@w^kIgaTj&)>HLlHvPSCLG8fdZ_xT|;5H zturK3@Kj&iCJtJb(ETA?Im+uHI-GS2M7CT+MB==Fb~KV2w%}^eCUxXwuN}VF!E236 zvn8xuoSL~8ybagToomWd~yo`IF$5nWq6zwlwB{{o2a0!ki z8eboAL!?R{Tz1OOwM<$P1Aqm2N9}uk3E}b@$t*Dc6YH6WDW>EbsnbJ6kq>gdc+00R zvKp1(vF>Ojww{oC?KK0eFoe6wqsL|xI+HVe`jIWO((K_18Lny* z{vdH#rm-}4LX>p-`Scsty*b{Rnf>4sBd{{i9tWz#CX1^TOJ^Z_Z@SYYw5^8Gfn~!< zTOHmdS~n$Vh^Wpp6r-gVZ7Xc$+HWFI#y>?z$!*heS8HgefhK>`def?3aYeFp&DgT; z85;8mE>1t`C+6akUE*9~oBX(cw2OGsvga1ztY~AYjNLvMReTS#?AxOE{Gz^zlcKYj zG3m(NDn7dYfzxRpHch0EVNCmZb}Q*p(nt(#i7;^-56VP)R71~+**nR$m`%G~bpG%G z$6m=%Cm7Wu1;E>+9LQ%SV75#kWpdHEx;uY%H9vOVVMbg%Do;QZT)Ah8$6er>`vomtbCY1hu>`UBpl2vHTXI-LMUZP*OJg^S6YPhE zVZzXvcyChF$wA$2Wu_vFlS6VOzlxWRV`%OEg2`j(4+Im6RXT=QT$FmK6SWBSv|Bu$ z8hf3V^IDpEAdukRc{Q^J1hafAB|Qm+^&lavq<-F!inXa%tgT15i!Uj3nfvQ9<}G7n z=AVvQ;|;>WDkQD1oPzC!1F!Pn4ey!P{U=?glev%w#?m^|$j>*9nl^vZ!#OkD`O8u1 z_P&k#DX^CRIeVZgcR5?H-3#w<7S4{->3BRzljhyDB(-vmCamSuEE#66J!iv}o~1OB zqRT-Sd};c9)d8B`d;@yXy+*7sr_dG$(|BUg1oP{j4dOr>56j_bS3yUm?Wp%Jkjp-==}GM`7=57OB>Gd!r7V~ zzC=8QXEjX{~qTcy3O#D19$zKE&p-<^~`XT zUQf%E{Fyf4``FoC*}WH}IzoBJ?1QD9FoDTY64C==6v*(?gZ`Ot1It%)!mk&ucF@kJ z8|SF1HJ69}90=xM`FnQEhj23)^6DI^dw@=K8LKs<%jqFmNQ(tRQ!tnVD(_))?6UfW zvr+7dN>DYOZ`=A|4W4rwyUdVwfe~xPN4nZ8FTc8))tZ;bsiTuHCK0CZTF{mHI)3!N z97@#>gQY;r^%wm?F5YCrH1iw|BM!CUn*8@D{K@6@NtXpJ)IE}j5Q8^n4ZB>?Jzy!M zfN20sm>YTRK-G?@J|VJeyri7{2mN`D7oi3A+D5=+L&7w@08d>s=K3PKx~T+-DU&oU5M|VWkr~XVb z)0VyJk$0_Q(Xtrs611lH*q>)ndg|bNQp{#Xy_=;pydQE~9<-z;;Y>6TUS|rA*n^kx zaJzE=G#ghE4xFz0&?Z*vSpZ2KI5@w{{zjE;d*KAC<~0k|U6jD|GyNS~+jza#ZuHOl zOzq;mU}gKE`7>G3JH|2-7qOoOxz+NnDw{t^CWby}?JGppKHvqzIWlr>2F zAbv60Z1MomxqVIEi#dxM?22k_VLYFifuFhi@J|FIq+@36(7!Y=DB;fY$L68s27Kf= zgc&o_4~Vw$0QjfwQl=9ClSGn!(ts1ffX!x_@-=2Fj;v2Xh+btWHX`AK;rVM3t5D(e z=0DqoxtzkE>5Yj3zSi0>hNtDbIobA(Vt5D{$mhMtt#KQ1P&$3%=sM0&s2+zzi#0!0 z-PO$t;y&3PqnS$kY|VufyjH57bxIKZzjlOye?!7Q(a#!0Iu#TprUEJ{W4MGqGU=^3 z85eNO;sQi^5mK@D5wR6B*t8(V{?!JNu_rD+Ox@#4DeJynN}he_V3pjR!@n~Z{%}ZNYbAzbUBb={T)8|8Ebfo3MTX!(b;!_OW(FO zxQ;1m>D<`2=8r^N7ShtCFl=?#7VW9dv05L&ytf(8%v~i49nIgK$u@eqH?FJQO<@gg zG@dXlExt`eH8&h?g<<4?1FW$bqltM%7x3GkvP((G%wsa#$uVMy`F4L;H&xe)M+a&s z6sr~ZlAP4P;D9%rZUq%~CuNtRLPW^H(4id9kLMMfgObGl7lF5(GBuAy*NoW&2TJaV zM7J8c<#kgOiYIO|h>$GBG-A(hOl~`aH&Tp!>00X}TCw+ysBJc2MCx#U3CZhd6j^N` zI~}Bk)CjKZxAPhN`V2n23rrJeK4_*eLIL_hC;=pta7pW37#KNfL|Ig>yuAe-sKWm4xq7uh5TnLic>A7liS3X*zx^qpH3zc&^;O6brwU4heqOP7 z!g&_v2mI8;I;(pC^5ZO0@V0sMx^LvNx?BQ>#f8+EW3MDmOG&*&Nr`B`2ooy{Fn-z>^GmXRSOiX_&EHdB3(><#Eq>CT8*5YQ zg&s)o{u5oo`y6!59>Q@k$8i;!&^xZDnSgHyBBwAzy$EC{PHJWUngeDx@x_+9uRhEQ zpuKZ{WGpr;%Ex8K^C^r57&Hdppu}|>nb4GAN;#-Rn?e2VtmXh zC`X0GE|>8>wD$z~rLP|LuO2+4mL6h{*bR_vFHmUSand)7(4ayblkZS3;WJ!knbGov zpPI{R5lyJ+xcGb@+GlU@1P;85FTeoqYBy+LP#BN}2QoC9!bdwZ^-l!4^rmJpp{Reu z4jcHfzkJDwD|89`)7u>0%0B84^9R?_iqcO|xSJ1~Mu{gTyzU6k2}Cb}E(_vEKufai zbaJ{!(@d*jPtvrd2=4tBRZOVWq?;a^12*cq%RkK}NK8a~C>ag@1yki95t4YX?PyqG zPQzolNhY%zmUn3+C3*%7KV|j{I65$S)o5}LuG9d7Tr_7P_{-V9vfsQQTUSCP=*=2- zGQT#u52AjECp0?BX_#eGc00<1tL=;__iJgr`}fa-cXmrZ8wffe$}oxW&{c`d!#MaL zV14p@Wzy*g$wqH?zmHPkNqiwB6!=9+FK;Snmd*A}c`u|Smx&3tZs*y9#^4Pgo4X=m zCx->?2m5}H{g zuy`EC;WlN)k#By>vt@i<1dybep=Nu3e(B*w2qe1>cLj;);hubpWZNVT4F}`PXJV4r z3{G*Tg8u)_4(r1lpZ1o4aBLe=Aw}So66UEite+f0f^@q;n)^o%m7XH{iccNoVv`UB zxY^sFj!-kzH5qRYgjz$Ox*~j+!HWppZ9dQeN+^+&zR-pY{%~X^`W1|S&&OMlfIVEI zG3Pa$Y^4|GZl$vkx8-$o;@6Q#g$QXTm7&V$!M?&`u#YYHE`;$0O=|3BoT8UYzykB- zUrEsVCy32&2c{i9FbY)_BA1ebFppMt)R4;`9m&Vjy|31)-Kd zLxM@Ee<6WA?FLH^?f~r96hG)3k6)vp@SxTd^48KwOkN@WMMGba9467kr9t*YIDGq* z!f32TEzPrC55!enYs;yIhsx%s0WaS$_`SJ&;sc}(HpcHaBsJb<4+92nk0@~R+Be}u z`lvYTey>p)lHFtG3(=}@|EVB8P|9^Ie?>~2kht&8@e;DICq{Sq7C`8bQ z*(pp%>7mF&lDm4b{#Mg81EXN2V~_gs0(OQXOLNJjl?$vWDv$h5{cH)=#Y4+E&&GeV zv%XjLaA5zJ5={B}JO+1<^HdkWt_v+AR*c(|RDGrde#tF8_$IL^@)+rkspmnY__`Q; z^l1*FykPgSaAXptp)5UG*>Hj|D&$Pba-SuEsUn3CZ=>E&O0>hLRkVm%43UA%k#;Vcf{e)xgAQ$Z@Tq+ z`7tCVhl8b}pD1!l3RR1-SB~%e%|8mk$O!i*gH|YG`yFTZ*WVRII8aWfhEWv764Wa8 zbN%*5YoQ2tT+p0hc)}6u9nv~_ABesT<^%>HLI0EV@8@m-oj&Y%2B!E=lrO$nU=S>3 z3qOkX9sE0CG_J<*BG>2l+s;K@kHjx~j(gE1ZyU(8#J<#*_(lg;VWW~jfn+b&YDEtg zX%>6i*8i?UBksH897^_|K!NOi8Ta{!GwWEj9IA>=t{O)Qd&puUyzEi#Gg5txC?&H4 z)S>pV{%3i3n2|geXG!|zK}DVHAJCGlY&OO#FSzNOkVi$`&?o($&te~WuK@2sJ+Q_; zCX0`M9HCsB`ZItYR5Ph@Gc)3bJdtrVmqsPgN`;szN1l5D!7om6P{@oDxfD6yCy`H6 z&`!4t*I!v$@C*s5Hjq5j)DJipv`g4rEXtRzQ^WBxu*HTLgaM9 zZUmN|FDYj$yvt8rK`kiS$gslPpVZ5{Y4Ou4<#)n2J-nF{GTWY;@A}~jpB+J6yu);4 z2epf}3bV*IohMZR!YlaY5`i>vVwm|S&hqw&vxv|884cGf4%(IBo&$%wr0whqig!E(-&8|2kpFXf7~{X`VSeJ+fC$kV+5kGY~Z)A3j>f4qg- z5McB-!Z))exVzbom-2g#&p)O%NY7DWkZ8%*F9nFR`xZxng!5-BSS_dV8<$5cdIW_t z(*_cl^-;W%@j%hye;Gt8I>ZWH#>&V>g9iGsmN<6lsvtf*Vm~SMe$f)tzHSZV_d~<_ zWzRbn#zJ!tWyYm^^mF1R{YR(dl>fVLn8L(QW*bqE5HWcxK2}tyjg&xeR#?J_gOc5L z(rI9j@{fR+5-}u5G`S|kc5y3iGAE!jHK0B5=*ty9ZjzR5ubei4?3n2Z5 z7_*B{P{YL!cEiY{`w+OH$|+>u$lh5wco{vx!;fibL&#rnJLL$(0o|sdTh2BYmYIit zrDdZl%O4T*rjx3=ZHegbw^pMApMnG20LlxZXVR(Aajgb{W~OV&>^txE3M9ndnuk5v zO;^ENZHZT0kH^Q<1V&#dc4 z=LDtTiWtA2krMzJTKgfQRM+?BY2!vRE{~k~DPa+GDBBhs)oOcrDMGF}3_p*1ZM(Cd zTh^9WkeG`n>I^pSOCqi{&7b2lwqya?kFhC__7b7;{-TLku#Butq%hLRx z0Ea421F4ReT;4=W5f0bW-;wZZK)}^jt$%~T(&{%hb@fQo`2fV^I1qI;rp^cD&K5{FypXLQ}14Vw$6f8$I)wV(#^-)p;iw z0|nYTWq+#`bi9P>uG$4RS}BpamnhdBH20dnum=70_VSsZETp-egN%b(cI8)Q7Hl;^ z0$!GjHGvSBrUyLMGHN5y#cal|;sr>&4QeiPJ}GF8vpz z>wr7pO7+-YUs!T&jo$eU#?r|`Ao=lpFX>OGC#HZ^LhWC!`pZXs+!mkSBxTgcSwSc2 zz3t0fiuCe(gn}+?Yp?Mh9~3E>EpfOaQ?r*LbBMr_1K)zhE4e+xFzyX0F(bifA(}F z3jxAH<5&(n){xnP128l2Hsh<+(#SwvcYMfn zu0~X?tZ>n3c7|X-M~W-6&Iz$in!2p^>3<l1QVa>WW23d{hdG^)XkCPisVK<2DE8 z=6zV(X!gIn5H(+4fyH=rWQbbh9r#EZ=bha!cV~|m3<{QkZvdO6ZIOU37Xd_)5-P^a3yZUIq}1)qQD zwk2708IFsjuWj%}*lRKp38PKbYT5#_C#OS`{|{B~7@b+5ZQG_|+p5^Mjf!pCHow@m z?TT&Nso1vdiT{6KCo+t6HV0d^& zT%946wH7(HlH37VvrO_49ewtjj%u zO0U+;hKkC22Z%QI(k)nt_Uq2Y^q1L7C0l9It*1<%^(Mm=^Hf@+X^F$z%OyJwY6}i+ zI}`kv->WX})OVTB62{ky7%Eyh}T4j=GS&Gi3HD)(wAA>$CT!@X; z;4;?Er}6WgwL+998@z3V@lI6K91{fms+*6<|Rqeq6>I&1l`*rD+(o{d)1B0YJLzT6u1Q za1TVID)U7Y7ynfm7l|l}@3H@zvov+xh=TKS;~+usaQ||D34i;P$PxK?r~9-Q%>KH4 zJbfunpM1a?zyOJC9*$Su9K*c zVPy%o_)Ne28OEAu>W2^@Y*KsGFO5=v$? ztY33pE-{HXy_?y1@3)kwU07{5Cl$DX)O2+U%9^-Lo#w4FN+{@!w80w1R>mUajX0Gsvr1&z~5QTgPYxA&}TfZy=2u@V8x&Ni%nNvP)BmO|AztE(@#?ZE$<9G_)jFw(&% zqo+z#qZ=TAgbpYBq21TouV#;N_FZl z>sYG)#wLbaCsc%t{1Xq?8XRE)m#34+PTN~gHP%XKj^S_mZ4~w=(>)1O40a&$p={pV zlf;-jKBbW8Wja9xmlKN%4SNPBy#z9l&$!3NxdBljfF~SR=c)n2G~2ycn71?Coldrg z_Ne@QS|c;X-Z5N}4&Yrd5mC^o4Guq7w{n=VPLZZGREatl)LNAx3Jp?x&(|PWyrd- zFvlRe+6rb^+b|UUAy3O)WXr-EQILyHtfjr}!40Rhq!R_40FWjR4}~g+=!GAZ7Qt;A zjtpt9q;ZTkyMlme5fejGBW_Xsz+~R(R7sDS(;|X3ktcxjy8~~64*v`07@ZEa+E+55 zw{`JSsF|iV`2ju7?PAd~2~{7g-nvtffAlf5!ZC1~dl877PC*0XiNmUg+UB(+?pSzg)2= zL~K6~A8L4}dw4z{oGKrrF5Y|OgeMkG7oO}I0RCf*WWnvYo2GAC;>6-sH>95h9wHcU zS^@De>6`JB+zQxAJ^z)&@(qC6MG7P$Q@s|Qrti4~ z1JqTOC0&U|ofRXRh_dBQ%_liE6;eehRXlB^25%Hx*#HMMa|MZQ7Zh0Lsq9MVLaBw! z%VwZz;dBF#s|UO2?Tn{C)$x+!tDJlP_*7c9iaw5l=Xa5(;7}1tWD+~VGlUZ2esqw& zk@7NR^N202a+LnpDlGPBWiwo|P{{DDfD#L)mv|SJ1V7<7b#40uc)Tv0CI-FzX==?- z7I778aLWAQU>07bPFtrGwBny{16j~l)YROZ6^`BWDy{{Q+_0{MLn6&Zt>&|3%_h&U@{i zPV-GRN!AW;VVc4Yv}v9uBLK$HR9Gs>I?MHzr(!CnoUV+_D`iL0c;s8LaWG(CWG?ja zsKPqH!n6$+m7GDpgBgCueUn`PkW=P%K!FmU4t|<3zyIoNsf|K|*0swMEfuO7YON@YI1}!@;eXJWEYh44cT0ZXoX9+pD_nig zml~WD^P3;Rgsc#wm3mR4y7$g<0A&$`Mv%RHmX{DA=3Qh#0^Y08BX}<) zIuFRTjq$PSk6`U;8zZ440CEVr)k6?i%k|`*YB*Um6&~MKn$;!v1B&Uv@q(Cws05dM z9L?LysDXU9TZjX^G<^m{r&QWWb$W*ppR5SK*HR!{C;L_P+^Qn3fkcYL(aGqo`RF_e zt{N;0Xn_h-IYI-{Y6(Xy?iw6F~#c0Ie52hm#S$!w2K};79a1EsTT$vdj(eyczp2R6t zdrfZkC6KS3gw!$`QEKh(2~EGa+_n*^5#l}SN&jYckmDit`js$~+MBz5SZgk#XojH;34Tn-&i$l3#J@}#2G)0)im~`{O=pL>{$;fN>j~-{G?ElBuc| zVIPVBd=f4jM*ZIiIts}hTM~lt#J^KR*U}t=1BsXIeQ`=ZUOgEXE!uzdCR>ToS~_~} zelqa1$wE4J4y46$5}_Vo=EIs^Aq_{=bAq48`PDg^#AMt4?y818HzvvL@3iltqBI^1b&rd#rm7M7S$~W#>%u( z0vKZi9VdeGQ?}0gFOk<|blR0IsV4aXL0J3rMVcw_28gPzeN0v1>(Z*e)J^j+w;}mr z8QH?{7!uZz&Ki*TxV0(1DgE1>3R24ijbIDa!z^`>u!p}G&cUUFJX;cEwYO@w-GsRS z3}E(=t~V?N8zrRdt|2uXh8u$_y2j)UU4rgIVqyt5&+FUaS!30u@98Lm1FN2Y5v1AZ zNoZ^_@4-&mPY=?q+JG-I8-NElmIc4PHq{ zMeMm%>RT}mv|k&T_u#@rzW-iVs-#kZ`|FfXV*KpY)T&mQai5*$k;D(H%hZ;As{?_z zm2sVcdy1Jn&yg@b*f!p|1Don>c{EQioAg`qZ9wd`z*=s#*YEI$0{ylAY*1)+R7h4>9>d$K4!lYhNRQx9x~Ot%2?60SsIE-|wtV^&+6 zAf3++$>*vm&!%=nt&z_lwQ;oUl4PH!dY=E>y1db1>E26CxA_Mg+Yn zd6v^`^%B!y0^tDXw&3Uz0$%iOP}6@b61I#6BGOiOzj=| zY^am0q+{m;>r=@u0U(1{{2h_n97Ms*2_0w1?G4Va;!S;WepV;EYponN-FgDn$yd&R zk5_7Mj<1h?h-ga9vo$)zihaKs=^SYsC_|ZivXqT6l?JUWN^3x+O3oviM!(9hIdHO<|E8o}OPv1{7 z-{B4$nd`|nT%(?(*KSx(HI9A3N^cC(PQG47PCs1Vc9YxQHrMS6WxWc+-o-thpSA#> zABFGdtGqdz$FHS&?JfMFriKeq5xQJuOP0?va%I5)GM8Rwa}H$)0`R;Ws7`}F@{gCx z^RYLJa+~WtvX!Od2STRa`S$l%3L{TfpnI?c$5owh&11*5+<{fl30>LWp{kfRwF>b# zJ7h;5A&}8n;7hcztQT;|qIY30QAmF^$~pHD5y2qstSJ5IMP%H!s0Y%0PAUY5H1d!{ z5z9mOo5m~+)}>paEBcjyQN>Gmul~sAa<|D8la%IB@-qid1gMg@@^C?sMp?mu=PY^2 zmpLM{gjS%%DCQ#n(+r%W&cy?;)YI~0va)BqEwDT1a^MQ{@9pnWeE9eH! z82yvRhMAI$hnZIB)nIFoM6>|&#fy_kqhV*ob=CD+Iu)M8oeK#@t}&4(=%q#Ic!G53 zyV&4(n$%!4J4Ln3S>TQhP5m5Opj4qAW8o}EGj-$^s>Y%nJcmr^?wEVw#;!zxM*9(5WmQ6hX?mxH<@m9+5T!GE3Ia#FA6#FhZf$6TXN*QMkJ zUXlWroTqdhZly2&?b)!)-8;|qeq2n>q@tPaBrI>|r`rT~UbJYaSTd+((Gt8BoF94* zCGY#!n|6hLd{Cu!I)BN_P9QRS92QoB74`1$&v=G*Eg5|Xc566TkhQ+IKAGX~pg%da4`c7WM^z?h?lWK2M)$xWCW#9Cq)Kuvrx=OT`)lR%9ymI z8<&aMY`7p#VfcdZ|IE1z66UhcO9CPl;=LpX3Ur*e%C0U3J)FS9P~v-$sBju_S(qUK zJG{@iK-J*or~1~S;@3W!kM=1PE6n)==%e5VrhI#g|; zEQDUfV^x-0L0!mU^|K~A!ms!zCcfsH@uEb=CI-t1Iya+OU|X2fjo(OB)=oGgBHd}n zA^t|tv1F&JRW|H(Tv-VepN#&f@Tx5IEHkNP1+8TZNKP@rbL8PZicR1YRx)NU(plKc zS*qi4+|PkaeqsQhBZq&IJ=2S*$>n?U5rB?r2Z36LWw%^*0`)`ZvjS|V7`ny#GG zCSqj2ZYB<~Eovc6AMP27$XI=-aqBp7eSm(6xIDl*6Jh`yJ167D&74zea4~T(1SCN1 zIU!-Rfk<6R3lIV9@p@w=f25GA)MIziy4%}6n{CUf$TfT#$^29r)ovXk%h}FA8+0_z zTmkz{pk0<-N8t;k>_Z3|W>{j>DH3%&;i80A$I09}szFnVY5t@6dz{0p>6p+Bp*HFY zY1(>!>}UWk5{i`)h!Jp(`s^tW6#M8{?NpfaB(^3h>bcKJ4W}#QJZUs1==eNw>E3Qz zxLDJ0H0_y(ozo3&rjx&Q+sqx9(la55`^t;-2=^f};G9+6!ABDPB+UF)g*XGjXLh~Z z!NrryW@Eo~gRaA)ef;(<4e=Vlof3u!5yx7Df*JvGj?pT9K*YCnj5e82K2VQ&pDC^f zQbFXJYbwk;d|?pbWrVDmV#Y=Y}<7}u>KudVO6RRAkOR7GQZ2TWnhy?M?6mn8ux&U536 z4>o8s-R*doGHUX@szLM2Gwj@i%2|V9@?^lMYbw%_(pk8AS3t1{Ym~OgIyJI>+e8*r zQvlIKb!6Ro)U;F(FgTB0c`bE4OfCl#fiqVbU@)b8Kp8Se->5JxojoYR{Hioh1A`^L zMt)v*T-S3_Q3q#iK3bvTIfNQCg8Wkc@I8xYg<3K67?p$4G(p8J{@(~Xk{(#ng#1r; zg%OM>7B-#$6fa{^U0QH0RoK&^coJ}%fs zM%@{IJ_0q6QV73%;T=?b5AO{ipAD#lzxiY?9bVO@pq{j9%+f`4ZIr%rFl~T5bPCI} z0$a)wr#NevY90B$011YyUDbcmt_~sysyh^Gbq39bc-aW;s3&{PZ{_Az@xuesO|0#N zv7u|Pi`i1`O@HP=Og69ROeQL|B5OCP&zA^%u4xRf(_QXo*qXg! zOsFy%$)1V>=8u^heG zLzt!surJR&dc%Tc(z|8STXY=#i^d>e zIxpPd8kl-vOTAC);VX6#A#!VYw9PMAaCR~5R62*kY+?iP_*dv~Ek!Y%EuaJBmoZ{B zxpg;Kp?+#@v9xveMXz0kyUf4DOk>-yvIeIl?ZZ4#M3_46GeMQSj|B_^+R=qc+CT2k z+I}0Wv11nrMl0}C&EW#hI?Pte!o}fH+1hEZlNbxo(ATJW8Yh)n4syE&1QtWAi>6s1 z@7s`Yw!=0Nb1de4Az)`V)U|d5(^!Msls-)OZMREkgCo$Jlux?rO%5Ms)5gK@fvc|X zxqOR^4FLNaOI?eX@h4Fk@7B*QFqqIF{_7!d?AlWIMcE<*mm{PRBk6X{2YOaHInk3QTPj?}r` zr(db-%08XtOGJ_Eb4+&>L5+xhh=wv4`=Im_HMQfAT?{b4e25(Sr=VP>-oD*D!Tw1uF+F3V#8xV%39n|3sA(JLf{+}WAvR9ICJWM>^J>R}ZnCL%toK*AE$Cu}URdkLk>8e4ToSIT8{`>+$)!Enm zfzT~0OiTZY*MjM9HUVl>@veJsqe+OOx7s^Gbzfm-vm}?F>v$qS)Dm`k``{=0vT-`Z z)j}7pTSEANJIA+-^==fQBlg57@WA!a{SLAFi?al&IMoe4&E3m-Jo05x?#z}f{WqlT z%z#IC(5;-vi$;cH2O{ogvo*(#ak4F+LDs`5Z6EqhUaA)*+pn?!!K!r?^Z`+J{&*47 z=FUcI8O~9QA~qS{P9Tjw!j?HB5dJhyPDR@wi=XZ~;x6vVFE+P$1Wz}gj>-MvF>!=q zJT{^SM)nPBIQ2@%uT|KUV~K*pq1T@6?K_Wz6QBoAfnP45YaasS;o}NUr-%n{^I1M2 z7j`AT_=TUO{;s3e=ju*B@gp}J>!I+m>ImXl(iXa@uxlYs?S3-leb^in#>p}>xe7`g z7X|eIbn!2`y&aY_AbrvDu{vFcMGv?`sFnyms_BKxVd7BH8f1)F8lJrZDHBeCJ zHIqvko-P(C64^Qa-o?Fi;$(InIM8U%jYFjeICnpF3VLatw|fy{hL9R__7lEn(F%=<;G;ylcOjZVkZ)8lTwoUgVex9Y2Be$TruB{3?v zX1+viktJ~+})j(Es-?+L~g*pcypseka(|d>JcEYVsfTV6^@OO83%~?U4|h zh5~7fplAM%5T?^;DP5wMQ7n)C2EQi--t4X_^^~AyDmhNe|9KW$F`DxAR2C-cG5$aw zqU{tVzcgCjY6skIv3HoR*K*btQ`Nu-VkYa9hyj8B8w^!SUgW=U2*<+oKXAy*%EXX5 zy99!oD%J3-1dWO1KW+1h|35Bd`41NYv;187|7Yc{VMo$}6+btFk6b8{wyVV=C73Bdml%WL8|q5eL5{!*g+h9 z?bZXle9nD8S3jS2`1sm$V|zZ9y1ra2OH8L)&zf*taHHR)W?oLd>&ih4N(Vgumb zBErIb-YFcvz$JkpMnDdc&8d;BJEM&(4w%OVQCk{)JV!74a<(*Wr6m1uHK;zQARlvw`QK zC4+C%46?#ZVmX6S*Fe!XF{6M($QKd+|j2Pp)4l_2E2JFrbO-- zzG-s3=09h1xfk`j-aECk4e{g_jadv66aS&a#8jf^q|v<}N^CtH4!%EvMIsaE2UP}_ZH;X zm!RXcxj{Mb-GsE_qJ<;ei9r%7*0?~y{Pw8X7k{g!;Y!a%?-O4+TwDQ(lG;s}pa)I1 znQlOgr;l+G-o@ORBiXc^T%oOmFD1$2FNy0n6qU;J;1fq9RVj`Ma>5nJrFj|)T@ui+ z;u-*$?Jl$)bt;DZYx~`aZ@y$!lBo9fs4k8eKBu_J^tlXJ|=-4*h+u1H;f-F>a^m z3Ly~#bg`1@=@L7yhtAQ;Gy%kKZE+%sKVcb7Vh8K!Eq|arGEZ>u(cq|54b|7E>AS_? zI)`6LB7O^^>N~&`b<|1%AK9Y5q?trEqK$?F(CjZ~7f)L2ig;PZaOP7i7rpOWc#mQ4PV!bpifMC(yi9Hv`*>%z8Lt3aa_Eea z^)o|q@OJ3SvqQx-;4W2hq-Edr?E-Kfl54Ob$`R`E2cT>j@l7I08^5;FfH)U=)ad%* zQGsD9XsM<^3leZ#C{L>V$f;P!rpPP{z%Yt)U)V$oe_#RLizu~v! zTwp`sWjo0g&pje|oNa_8U1=v51AfPKBa0bUXsTd4-M63wD#t93(g1NUxYOiA;Vb~&c3#fvXYiy;|@1A zAf-eh%~e?6g3OiW@dRX2Q3BABUs=ZPB*w$#xyEkw>Y2NmZvwL7nw}B+GX~^j<&ap} zFv^mB4pfFqkY>96WhYAJ3?k9BQMliZn;38l8Kw(OVmB7RXhJkt0iFu&|3FEWppYqh zt_#7{HpV92?3ZG}B>ejV9s!4LEno4AQ2f^nT@XqASglk$PVy?uXfeQDM4Em9p4^(Q z)PYIKsdkm~f{&_OHeNloyeURd&acjvwTtppRvI~WH3e+d@80!>hJY7zedC?u>o{_| z)x5*g>#+`UYX^cyw%h+3N6CMMgX$=d!A{rR%3QuFzSB`Z74G_H9;PLT?EJ)=B}->q z)fMRE^kH7lcaYugX%4tIGE+KpXA7J`{jAD=DX6-KE>|5O`C`Sm?@TV6bDqi1mSm-x zTO5J=V|;ybWIvd{`6`C&X(|rN?aCNC{P%8{;h5e0IxgBiA)$B_G~wW%7-;!NhLWo# z3V4p1jp>he;|e^Y2puNkRteoAcau2xUpLm4I>|z@bhy#Jg*yFmHnAu+0QNaxef9O!>1*{h;HpNfbqV|qBWugbPRB6`vHcy;@za(0>mDb${v?< zC6DdA`g1-^$~7UO9pnh~B%Cb5(H}geLn<jxNtz0{!Ov^qa)B&)n4-UO9hBTS~Ai>|<;AJU8JA!%M2abAJ1&G;|R8dP{zl;1cHx8pAkCjP5Kox`$9m=AB{q{!05UJ~gKlOv{|3jBZyFL#WK({klJB5F>$CjRooWE4O(aEe{_u zTpyuM)MzKIy|3!zkb8@-4h-x4HnnJc!SnQy*t?P8dkE%h@Z+Fm@Rhv_g?{(%KuR^q zxLyE2dZky5z-)e#5A?aFXH!fu%^qmquEH%-aJnx-^@7t5%%q0IN?Otd2+n)&uq&oJ zKQ@~x)1;`BQM>{RpI5UbR9d|I4G6Ha>%$|%VrakvYE1zYgCBPr{1I#e$`yL~G#MR~+1;+Oc=lv2Iu z-87=zKGEPP3Y4)C7H>`%=0(=5!O;Mc<12{xj?RxjxfNUFz?PRK*m}Rth4#&}h^DX} z{-NfSA*;nY8r>LpwVJ+2VFT%Hxy}?BkZ&G)jB5P}^A&id8cs+w5QT2p>5`7MiPj`F zJBfu0Uo1DYr6MflX9z3cE3Q~h1@|%hM8O*k?FiV6bbgbk<5$gS!>`8esV+bl$(m_+ zIpLWLFA%A8(;%B4ggHKVMSr>MYXm-@j3S()#J>$ralOT&eM5df z8%clWXOll@nP|SHbDo}Lexmk+ei4fXwUD1Wb5`ra&aE(Q#nfHl0@eJ) z+lN{}YLa@zT51?jfJ-QX>;y`9;@%UfvWHC2gHYv}L^p)kr#Z7ofO1E3Hu-m;Mw8o% zt-yKy2K`U*o{Ly5C&K_2x#Pfq1H{sMSdzSNlh*U6857^AsiRT0EWn$ zDaFglXUKynm#N^9P@VjL_}3&0y|x~ukQs}2WM!yBesw8yTbetH*@L(*Z!hhRbRwAK zca^i{rn>4}k^lm^&hgtHDZ3vEW;RLrp=6!~d`_>;GY4b~fhJGYHU5FqZ#7aO%Plh$P^D??Ki66EWX1>JZq5x6DHj z%t+O_>)J{N`9mUR3cfL{E3of)`&ycvk}``SFej+F4?W_TGfd45~^S%eaQ zJVC~azj%C{rd~bP>@zfB4y)7{s2sz76q{|l0@!2-COPb{t}yC+(KIUA0}nd7zg%DD zzE4Z99=9Rp?)zk;`$NRQ-qY8$%|Sp9SXVadp6lK)u4#;#Qex@>SvP$zEG0 zXa8F7%as#PG!LM#-MPr4b`3^rCEARryksM?v|7e8UqWrJ3*-d~hvB*E%~mjUHGq#| zk?B0;N+{n#N`IL$l(|`B4`6YTO9G!{oxntfO^N{3mj1&Ro}_D`96po*%#ccotP>dE z`YR$fJ2jHWOqH9Ffw_AMax!U{d-;OBzBc_|(q%5UhmVw`59`!M(IwzAS~|!;jaN!D z*9SfHP8w6V5^m$Ei(R0V>_71L4v)s-JN`7D;2CC5f+14wau zBT298x=3a2B?iz5;L@K4G$h8{^*R+g5Gu5I;)bWvHT zz^r#j8khw@`fRi7doy#!Kf9d?qYsU;B-TSJ^CpzajS6kU=Zj3M%qc`Gh6v?7)O%2} zyihpEw6N7=jPDIwY&F8Xo!7&=(k#1h(Qz`J-L!vJp#U+q>QvLDAJ9b@f6Ve|g7~N7 zW|#NE>kB*j)@iv{uddGnk8&Z`h&+ZYa~bB*H7f%x-3oXh_`_t_2f zB^y`BAVVPs-V>nnu#P}TIkg@+mxd>lMIe)trU|l^J zTtO0hUHe$3DZZ)_p-ECyrpW{vLjC}5R@2%|62T&Tfu(7WTK@-fog)Sz<|7e>iZssA z(eZyEm-w>^HIb%V)IL?tgZXK6sn~w(5lPS_bAo{AZitJ05;xId-bk@`DDM@)p;j0NV>~#LI9)2!&ETqsv4|66Ko%SlBLf);Ag@ zu^=P$-)9M|Y9N^XN)0J(azr*79PSIkYY$BkEUFy2HYyWzGXLY$dDef{NR=nYSR@G< z-Ka5x*fD&5|0P^9Kq8D%=Vbl38R&%COjI;X9tm(!PB0jqA94p%a(GYVXpON_ks4Cf zir+4{p3a7^m1adiI^S?%AYG6+)^E3y{zDR0$beOr%c|(*!+&t+tm}U^9Th%m*(M-$ z>nBAbWKR-~d_Y}G4o(E$2r!Vt0vluWA|q;sfN08;l!OpdV3u1=Ei&Lweh z6j*4I7KK1{MDwj|w@m`bK(eZRO95JmRWiFv?~G+NGecM;B&OZ*(K5SN)D1TX^a9GD zZptrVc-}Dl6RC5gCR-~Fe3C~^+TN~pGy5yUmoFXH$0NbMu{oqXa3f|I-?qbMgd#fsPO%@}=GF`Px|07g(Qecb8Dh^-^?O-v zmw+IKCDC6GaEwV)CLB0v37A2*N3}YBC>P)`C-mg{;m|k}_<1#atPjN>jn0+{&CU2b z#$$hIT{AEPJySaYE`Szd3ulN879uBDR%tWNl-9s82e=*L>_AAB?)rqHI*|-VM*jp5 z3a?ivQ%-CH9!ultBK$zUS^iKFqCjlXtsm1o-`>t&rD`UsF>N>W{l)SHtB)XcoZGSOqjRea+wmbIp@=#9+|4)BbyJKZan-5t+mZ25+yC zeP)9$#n#03IC_B=V`xS~a9ZQa;8;AvI*3$RVJwi<(6rx`kCon!Xu?1lbuSu#lkzIb zl`FZm71B1^LIzWec_Rb54!XCIGhm)@xeE4reiJPH}+=L z%_rvii>ho&Lgb@>=SlyCuyc+21F}(ELGq?_j`=9Y8WPiY2YrStH{k)S#oH}>VhFnu zmixcBA`QDF7H>dvm-WBee7P9_v(z?o8%OrTQq`rt{CKG`GER5bv~$ti!Ah%2R2)1x z=Od~Nv81J9I>(0b7E+8cjdi#fgzZ7m)sz|9g6s&x8cO68oA=YNaCRERPzM-Rk|0r> zlW>j&z+j!fBxrqF9)#uz<#&}x7JW56Oku{6h(Qv?dT8LCYPw^0!yX)fXRO70x!u-? z$WYC6OxzLHMttMZa~E7v)0p?HBS+oDWErKnkMcsh5G7y0pbz}!sdU(}A9aF_1$V!t z<~VZE?#u0v>fHnLtkOVQ%Ka}dsaS=IQonIDl)9NtGLf~$LPgGyUamaWi%Ez=tOnfh z->YM=7Y4>)9J;a-VaiazwC;i-xhIo7b-TUzt}%;8Ah?!-sNWSXT3H&fDB(6ikZ8)n za@Wg8F(sW!?-0GESsoJ>oH^^BDNFD%yx*lxMDx z=_IrARULu)bn2bjyr3g+JJgHjti@u3=s0!NkIXPA_dq2+JIx6YYIG2-2-ns7+No%c z>q=#nqZJpK!f6l`qA0hFqEqzq6AV%zhPab73Kx>abcH zgPqLifgP=z>tA}4H^Pa#a820KH^0&1K%Ckp^6tXUtxk?flw)gft|WyAoS$9%s4dtQHC!Tu`k-dYQu zWM;S8ZDTQ1r_YH0=xQi~-~XbwMc0b_BC$wZM~&!Yw(~|0kK+ltKA6P(LG*4`o(v(n ztra4K1+;wS9PL8y{kwzU6qP*unIs;wstfi-_B9(!U^$um_sCcfGhNu3e)#&k%Wb|-tqsU^}rt)=3 z$!Yp=4~pm zv)ynS3U#wv-V`9B9)?{ixJL<7ivIyQ;3i+nW6pOOW2rgJPR0~90YJ;7zR!wH8 zeC<->eRKxV1YjVWVR8I_E!^8L^6v__Lja)uN*$A&0I$bDNZ(O+Y-5#rR1|jYGZ47e zQ`~|#k-4q4=`+MX2_onH(Hi3ZTi6@`LJJ(es3Y8$7_&QdjG5EugcF-DtC~ZHN__VT zsXNJC==}z3oQZ<}YRyJx`VRuZyb7B`{CI<}b+!_lEYs+Nldb;3Xm#etfi?X#KLK!& zzcNK~;YwwHh~ye`Gqz4`LRcl#AWZlhpW2L`Q_WIq^xKi8{fB)8K*TDz;kT^Ap3fs8 zJeBXT#bIW360)6mFf=>W3`F?NVI(ms@oblYUGxfqe&5ZgkZ4(q!r^i|gKwG^=k~Vk zQKkfG=*Q_|%>t{s_D7TNcKP?v>`O{c#sgYOrVkG8FXvsb7en=|a_b&)$!s*herf=F z_l7LoPP=SZ_|kk12^O$hdy5w^FUGatzzr^+9XAPmf+azdX}37z6AAS8u0BiJu3PzX6czOgF!yx#IC4l27_51A|M2VK|2VBl zt@+liZ&P8rB#YH_ig9PA%zl-#1WQwAqRVYa7}UHd=`NP|csSq2{~A>Tw0nQ%LNK4k z9f>58%;ob-X{N9s_J;O_Iwkn(^?;Dtsxp1t2!Gc8E$}uiT{&iL+M=_HBjFutHC}2? z!RW{VP^dB2wDVM&PTO{X`;@KPu(e?GRhs^RdMsA#cU>$K)5J)TJyVoP(_X%nyA)n@ z5ofo2c!ZUBD0bx;s^<0(-%b}GynbuF$@x)hfWvw8Ui=I})MT<8BlOKs+rNAb6iTg( z-r}*E-eP29&Dm(2Mu7*ILP1oaR?C6HO7DvRagyh@8Hzqxjd)CRmt@f-hNFUoIS4(t zN={$(^T6$J@^aFo7P&n_fG>~2AJurG<82bQj=HFovSoQ#*)lAeVa#oYZbOM=1QP@* zmgJZGXy`xoq&qUcrQZ(!{`_8{XRRwd{+C;w@$3@xzf|K-7KPVQI7P3C0E_(7sP#o( zZ=rixRR_BBs<|xAxiW^=q+3QYwb1{Etb6RvYYq6dA194%+qTihMq?+9ZC+8M#%yfc zw(X>`Z993cuC?}k?>(MRFyGB_j(Ps)@uT6H(eh=ObU|j}7HI0%+Mmd;`H91MP7l47 zEfvCM;6J^3hH4V8GwJ&r$=P^mB_&936b{r`Us8{v=PlUkM)0u*>O%YA@3(zr2WMAP z(b`If3Xj>_n^zmlRX?g%<=PVfe7N{(Xh_c&eJ8p=Z>}cyrRY)x%-sOb zpnVD#!HCguR~-t|24eZn9uG7Wa{z%iCbbWA9|PrZ+G%U+&bgVJPh06^{m)k*7ht@} z^GAEna|o%R<`&O>w;*47H2P+uZDsAK5vla8R8EEC@o`MZitY1!n+X6IkN}7+e?AiP zXdcBq3aKN^;U|4>W1RN?oU8zqQ!a_`2WD|8cRNL?*~m5^%RH9+lR7tE`PwF$D>Yy` zN?XkHY(f@fFP>MEuFRFkDH?tp%eZVfx9>&XLVWBj)6LXc1;zcp1K-Q&Qbx{ zYl2xpG%qGjUK6RY3PuXLn{Q=?^O<`mPietqqKp+425%-HOH9&2ik*Qp=PhorJoBL~ zhOB=W9&Enkmv|cHo>XOB3j_Bt(n;n*uRH|LXPknI16eYHT2|~B7et1>j-D5@kGQoy zoLpASE*9pZkax{R#I6N)S|3p#^7_z@H*IfgzdQE1rqAR)o**7~A@9PW0zBd3r6bKR z`LfDQJe3W=@l?ba<0jt0Qo}~7Eh&S|`^VgmUN}Q+=GkZgH=1W>VV)=HV0Ct37KLkW-t$Ae zMaWdUh?4c}Y>10g{NZ0+Gm8`n7P`jK{AAj@2TG%>y)7=( zgp&D54`Vi`ZVzJWLRhaXCNu1~oMb1wQs!iji-p9l0ThDid=_WR*SZ`|)HZ!968P$T z^Vf}l#4t`q%;j;ZNvn8Ki7Ai4_INBTyPu!m_xPvMi|V4g@Q0^=Z>~bLsl1T$ApImh z7rJ8*#eH=V6tmDg>69Z;K@It{_&PH7`=nVSWOYH*5H)D1XLS#6d5)LI7I^(Om1j3$ z0_{{uH)DanToO{V7eQ?$)NmdBl6@RGV$9?Yxa~e_Hp|)=M8r97x8>WMtl@`$QjJ!< zsvf2ti`YTLJghM1FE%S)%^Z4yf99vWg4ad!-lRkdA)E+4%(*?eL2YB$mE!-D&K0Wk zlANiNK8*yeOaMJQ4uN>&+j=3eM|iplQ{2(BccKWYkM5;MiN$kuO}n;`J_JD_><+yJ z4BxV=O#Uv_CK5d8YV2hwBAaOw_-3rsznYe3IRA^xmb^|zrBdPWR1d4Bis;fRXGu&< z2A@vQ)J2VKZ~-SxO?xmW$Jf&Bc!hBrWiQpt^AX)kb<{T_eC`yjvlAm0#t3TD$%Zf5rS zQ1i9EoRv3S=y`L&to3A-&cR@N^^| zb2^Vc!TjKoi6Q?w;l@4JN5YHUR4G-I=h3x&+&Unlp3z(%qkJ-Etu+eirFd}MJ^b9$ zj1hcj^vBk+fFuwS#kv~8UE|?|Hm%Vk3!UUQSHh6(;T|*Y{;F^xf4Dah!iuC6g2z?j z@1vqYV+DozXAz>IK__fse%mqZx3++xdE2L4k6fU?Z>@P#y7GMs7r_%qC$f zsffFTd`x?X;^&A*C2yUMN+5o}mpE@P{=3ThJc035wNr^NixAihB=o`&!07oQgR%LJ zWCuD#-D)|Z!82-W|KZhZgjLe05+I1)`rLnxb`)-H{&r6^y9`o0oa=H4!k|F63Qz!Y})Ar$hdsL3l?25gx_5Hw}j2bEZHL(b{qK%dl(+>r*j0RYP@M} z6s`b*Lt=T+UK!5QL$&X=oTK^Aw({^L^PthKN$2H=KCTE{u9$jqUG37h??f>!!*Vj#d~_0KLsW(+PzJz1ABfL{voK)G{vCQeUQ!Xqjz zmHx4}n)nY#{*==0zN%iE+w~ zgeKoS$E7SvwMzQ@izkJ{w~Q^#f#~+0Bov2ZCh{>SB_68yu=5Zlvq0D>k*4xjpABPr znJ5TC`56{~L^rdRRe8R48Ur`MNTP4l2y1NjdCw*xJ?<&fQ&%>41VtEZQpiPZx=x?n zWyB;h?MLt*9IJgS-b~gQ@GeD{?%#~F=L`eI#)#l?ql|^=U)LDI^Xm7&#C+|^v0jEK z$Wo0@c*t_bD+iwumeBW$Mkh0?2f{5vKj@K%Py^OJ2c>$;W?Iu@|+ewQD5g0h{p)w%yY5m$JfwFO#UH;31uPiF=D2_y^v;C%t+?+Jd5x z(*a0J5b5lXR&s0>vmapD-n2IA*N1To+wfRP4xrMbP{l=x>K=9fyy&VYwu`gji}*Hr zsRvOtGj77@bKLEgdFLm7rj14kHGP~=)6{C~&<{6JV-S*!*NxlF)6dMS6!AyNfY~{9 zP63u7jF{a4u{yqjb>a?@S)|R=&fB@L{Tcuf9Y+=naW6b*gzzPO%=!DUcPxV&oL?T4 z5@Ktp0Ax?OG;V@~LSXoY*#r8En4aoK!hqsCT_<7znOrx78y&Mc&V z-EG%n$4n@nkji|39sQSHQw|Ma3e`DL1}PTt5m>@z%}3_0BN>^%g>>LgD9?xw$aOE1 zD*b=q?dp)GdxU5SRM4L)gk7- zA>fFgI(_0(@3jir!pw9`5AQjBCM@3ZCQHIySMpcsIL5`AXe{JZ+k(Js+cgmYndx!t z-nWe;uxm*0p@)8~gd4$ZOG$VL+B&j1R##F zixp^8b6`k9wJz+#C@v`}I@QFcF;E^75 z<^Wy{IPV}BG_yK_t+@bY~h9(iH25hrRX4@oEiF5n0pi!STs;b3q$| z{Cs$e!446`M=NEd%iDc?^AJhf z`gu)kuvE_&+HUwKjkrD|sM2r6kPLRM9-!S-x}vGwc`T(bU!BW8=_YF zuG|KPTgeDdydMud`Cob4BNu=%3#7N_a#)lI79>g;p>2>9?kEPYOOn{TYAA3uyb06P z?e@5Cy#d4wrqW`dxGIMj5kPtS4x0xkZ?gmC?acq=ZImEbzk$F?)z`r|Vf*HF$iMP7 zm|{L2l6sPa1uMZMP~H{?%G+UCB-!!TTxvZ&Qm>uzz+Sf7zrAdcZM6v7_P@RC*?D}f z<`2q+$bH5}uF+GYKKLh&-Z$nSz+86Dzq#xqpRoN2pt~&#bhrP_W%nlg7m<0<{F}>0 zv5|wF@d@!O5C`V6BT=QKK>o>PD~8dzNLZC*x*bcYJJrz942c7C+1>!ZP`K?mQsRAt za$qjIhGg2O_`cUf;}KapuXPVYptqOR9sIAm?aStD*{m0KT#byWH^{l}+M$sQQA)XF zjXQ2Kdm})WJ3ltdWlTV8{DO~?=rC+5C_gGS(MH}YCBPBjFM*NJem(Qm*v0~lI;W(j zqZ;*>KNZa9HoWT>UscDK zcK_A?YT5RGYuU$OmcUvz#NS#r0s+bq?_)h?4^u2#I9kS547s zUCb0Y0_Ywk>rxzw*s1o&(Un|RLl#nX7;?gskOvBY5;n+GN{w>i)EuLKk?%y_j-Ox7 zuF5=I=E9jHT)3h)4%lUn8-==KL z(gFe?fVpgnnHXR$+inY(%VyOmCaZ1$;k1{g|20X$K3hW{K`55aKb~P{khui~<4|i* zsAvSB!Tmr2kF;=*`Mr@Z2@6&Ra)wU)d*-{G>VNJwV@J=hoK)p6UuV0{F+6Gk4Wloa zNq%tJ14lI3c{wz}5}}}e6t1$#b#)d=C7Y|(_2m$u(|l2#1;lLbBGVsOL!oRlKzIA@ zue*))*WEVeZ~xET)&siRfd7HFu?r#CcUx&X_2}S+oCxWZ>!i~Rs)ZpB{9ER{ z+~D@@?-*fQ6ky(|;@YiJ0}i)@^~%G)G2l9X`6KOw%zkL(?LZO1c@&O8k_IU`YnC9- z5@@`q%7TpB8@LFKB6O3ylL?>ei<6fUYE@> z&4z7TO1wYf!g{2`;P~6ib_a{g{iOozW#4dPVi4!8B%7yf&-zNPwASc;RVekd6)uY3 z^V|N}jb4#=v}8hYoQdM0cDF)ra@VbWr!0>10zI!jQ0hm6*7t_({fEu39<^93UIa-S zy{L53mJv|c`M_&GK=33vOF|!BmuaF(y#E!KjljjiIr^Bb(u9{rYJp-OWHMl@fcSsa zZLshl$T)fx1VJW(UH1Q@Zd*r-i#l4o9RVj?)bYjez+869Msj}z8ZejLQwPjtSBmBB zX((U{V__RP6WW$AQ=HM5$pZN2lCjOSu!00t>VUcIujmnDg59x!VIg(&$N%NB-Gw;* z=CTd`=CU&&hgj8^usks;8J)PBn>BkobqIfR=lAI+ zAr|$JhYiF>!}04_2``iNVlw%Tt`X)Lv}%G8eVi{JKDT>#?kPzaKUfn4KCx7_hHMx5 zDuKrf@Ur_;q#aBO#GZbJ6ohNSCGlT$dyw7!;vaPTIT2r_3&f@!G~Se8;H}TSAH+=t z-Ay&DjUto`|3gl`I>zK*bGzlQx!oBI0W`OTv#_yiaF~hwK7aC{vPdzC z8&E?K#%&mkl1ox3mZEvIM+5>O>2HlTlce%&_i#~lt3K|I?7LhYs#Ss*(74;uVZjb` zvh0@;e^O*`(r+M?G5pG@NIZAlDsw&g8XA~*(86@1LdWVHcB`iF!>tK|DTKMH3;#Pi z@alKm!x%c)z0H?vxB?-K0BlVm&n}r~Tu^;)*S3J^PR-5z;kR?%j5#zQ{^WvLua4eK zkob*YmlHoy>6iRtQ6`fJb!XfCFB$LFG{qHAHp8yyY~K7&YTC4| zDz9|_p*O|XE?rO}b3Nt}KdaB1hu>%LZSH-$oDBNe#b~e_kJ{^_(s;@RE_p`AwNqN~ z)8@X^?xZGvH8BvYyt~o`+&l`Va0y`V(9+QjaYg$S?r4G^JK^x)YcoC=YP2>ljV0@D z3)8wR`-8o}v}y+v&N&=6Kz_`cLP@db`D=mb>~~v3f|Ag zE>4Rd1vacp6XUhoe2ZJkVu+FL6 zlzHn{Z(Z?GkPwImNRA}lkn5{wD&F{L}Sr_@@)ffj(!PJOQ)@ zm+K$ZsU0H0R&Q3G8gHVgXY#Fm2^EdU(r(QcCvI+RnT)jthGI()^Q(8HZq`iD+p1rE z$XDE?LOL!~tO(33>-M?Q5G@@|QRg%m(#WRBy>&P*(1;%aN5B0xKr80Zg$M||Nyk~>iN5=`#EwrOxV^D)tL=|plk zwPRYntGZbO&J)Zl)rtTHi+WPYosKdF&q>Y=K05oY=gH1lt^;j%8bd)tVH7Pm3Wr#| z$GpqB7)6TG(b%{#54sD|6T~a<-6&1sc4a5b}}y zSRZuux>8DSKD(*jI8Ah6P}b&gSu<-q+V*_ms2aZD{7j?mDD0|O{GNg5nYhka@2ER$ zA()WcrEDpvD0VrI(p2jv5!Npv@ZzLK;0pq!Y{%GYjPmHOjb-XWl6+g398f4GW>453 zHNMUasBY@N;vI7h!NC;`Ac;vs@BtY7v`bPV`rXKa%BK*6#q9nG+tbOyq5z)ty6pu0 zJjgf-)06q&nJFG&*cGA#MAVTys!7PZmdvAFqTl?ghWhd2cAW(dLz+Ahbsla*GrRn* zGDFhbnvWII_PDoF`dkIW9NmuM=Wq=%WfENhZevwwm(2c$=SI)9T&rO+TF#Rr)|0Gw zv_}#_XqhaXjvHV?BmTCFU1IW_>RxCIvEsZo9YewA?CY7u?mm6x$HQI#2Dlg3^!)*` z>+n9ZOi?7aO&%ljDKyrbpKvtCL`VFaMr8{Jgy+xJ)izEZu@g6%yBX6c-Rz=n7+UjiMp-FGWIW9J7uL4)zj0MWAc zTZ(pv?4Y&>wJA%rA@7^c$yeXI+&_ptjeYT(wo!ZDG9E{J)Rz)&e-4y3H!jEU9D6ih zB41c6H?yNibPwQ|q0}oL?-5tHB*44?-R!wN)OIRJ8OlVng7mX;+Y8c^qb})t;Vz|E zP|VW3kBt8DC$+j*CAx!jBOI@ZV~b5hKN#)j)or!1s_a!#q#d}%-0 zPh++jKY_0*>%-YfeX&>i$KcBoekYF?ve%BWw`RDxWEtcGJ0d`ZH^qp~?13QQet+>! z(7ZwDC_R=3YJb!NCIMB=R_~s4-=|)7@s45VYS)Oh$(Hisp&Wms;4Zg%55H(5DSEeMyo>X?Uj;MX|!80KkUh|tAUg*A$=b=297!wScEiHN9H3w z{R_lQG#x*VYxSf$D;ye$9Kk4|hbBOc69Z{~ZwqGRu}w|IDj%Y+o+#Y|YJBaH>X-%) zE9r+@nQlraHP_XIk3HIRv}`G{%knCv%;smn&1T>O6nv)OWKgH^orYUfNg$NOxV{xbPu5cgcHg zIAo7P>ScxNpP$&>7chniy7(_Go3ht_AJM&>iG=IIwH6?YWr}W_G*Veuj=J~JpXzg8 zx_s5bbr=7xj_rB;bZhVqsYWEaoJC#pn6kCKz`NTPFYZzMa?nnjfpUjVIML z^7_QK5l{Wfy3(~S?clneE>mDIP)@wZKsTVPw&YMnw{E3zp+T4B`;n7D_xvrYJKGQF zr4oX9fp%-FuX8L&nMsLFu4svAhfcS#@eYA0@;cS-ADQQ?04%?KE}wz->QiH@g&!^F zw#(GX6wXRBt{7wrW4@F>0UuBu+Tr!_&OH0hEf^QyDBcg1Ei_+i1gb@KbCrNWoV{Tm z?aHYYz0(Fw!Ag%9=~^CbXF7sS|Ca*s*U^sACT>qe(2HIhJUrHRaF>3NvB+%?p<*B8 zoy7)cr>V#t0M1qVX_Vod({feKx`?g2P~vrveKBg(Br(-<6(@_9h$vf^D+T%#(5`zNdk{DYa?XfpM z>s}wF07C>9m!LBqxvX}n>8s=#RO+&Ma^Oyt!~So0fLPUW*zcEy`92S37hY7akBxZ; zCcHh@_qfS9)CK}|vVgZBTC? zG|}f*XbC;WoLpvn_IEhvkP-L;t5_`grdD?;xcQ~srXL&w)Um|(x;~Mb3$Yyj&C+rF zpYi}VC-?tuP&kqeb0KQbIsSk30S>l*>H{3?f9nIZ0P>dDjzjf+B-PMYFc`4fM$m)8 z6sQB@BUN0fze^LJl+CQihG(N7p<+`8FFI7k{`B#^GA5=e_ zUT)5}fm4#5s_A>0=epWwle^_79ow=xp6w~kiBIxf`L6f#?RO@mu2<_T;C~lgwzL98 z*;mnk#v=XBjE_67H_!fkueZl{q7Uzv{Y@E`CYr+a<-CP-vWxV@$v3J7SXp|=rJ-d> zBRbcmjTH*Pmoa@p-zjYX_xp_y(m}bHRw(6{8AE%xE5oZT(b?#G9{U|jvOeg| zCFnNFQR4^v*V@9yRSX2t*+cB5-j&4{BQ8|HzUB5rOvnWNfX!0QV?*=Af!0vS1UyfU zpt}5@N}L6a(_UUl-PA8;O9*eqUWzV#Gm&^cd}5eBmEa0Bc=Cc*Zic{t2TNtG*&9!o zUobziYlJUV8D*wZII@{)tB)@RaBX7tl7e&p@+FY)+FIjK5hBjc5XYdbg{s9xpGbq#iLv8`x)Yjgl_*smC$Z}J0EbT=DAQLCqf!GuxTYukfdPGB$3ze%}wA@_1*R{!Nt^eD0b($xQo0TI#m0}~I z?J;?#<7Jp7%ZC2X$7vs5@|4!h8R+`^@#>e{gK~*qj_(a^i^!tLt*8>xG`IRlpEBJ- z5=4^HN|3mb>rOavC;egaMVlY5cS~~mn>@d@(Y=PK3aZ8kV0KFsf8JE^-&V3`bf~s= zDDM|J+9;NOzrMeFTv-M(>~mRw>oxu9ZlJ?%vACA_IVJa4t7{o=d$c2ZwOOFOB_EgD zTUZk81{q=lwiE$@YkjPH*ySuIN$TflGyn>{|@lZ9z*;}VsJ3rrApuq8a z?mEG(2Ol3*n398>9%76tbyRdT9at1cU?r7ok$&O8)F0%y3(qfJEBB6|` zzN^IO4`i`R#beu3b=ra5Q}wAiVi49|3~z-D8rnv=heD5;By0oM{R)eN@*=(D649wk zdFDk_WlQ7rGhple!g~V8;@ts%R6S{<5|0h_P5fg&h`pF4{?%u z5ARufQA@~g)AZS9?-hM21k zN2}6d@jV5#b5l4|nf*F-GK8h%vv}g=DQva_S9mluySevp)IiF)*YfP-nwGr}V{k|N zWbSk%KY&C15Bwti%g$V2x>>9h8J9&2`z0RHO9W59#lxt(yOal2r)sp*<)?!xy$yOO&G zL>F8WQ=VvTWmmeau^&a*h*s`mW9&VTIsFr4XFhM(9BkkHb4n4y#MoFB{Y|GNk*J{A zZ{e$Xuy}0`b15y}o|8~gE~oG82VE_=W5vSK7PI-}#w;tw4P89dy}8Fpnvp#C&)(>F zu>h`?LVxny@P;;rkzO;yuOUVPy#FB~S!-Aq8C7cLO9=YuY& zfO=Ow9up&qJo=(H*6#eKdJN!C{K)(;YgkYIPKI9pF{B#>b3(t|sJwCLRIYw|ZdZow zN>cp&(oHk!4?Dn^$B1CU|0)3A^TZKit`bm)n;Gl*Y*Rt{L`Wd(n`*C*#tyAodhfUyWFD|xep0mSebu{%eyy?0Sz^MAB!lVix_#3dT zQ;+4J-kQiM*pBb!aBnoyLAhRHdhE@6`XToVWhN0p74)N~qh~T}42h}njaeQXexdZ9 zb^lm(tYV>n#TxOICrb^-{#IViXL8zW5NSzXy#LySQA~YF*%xc+YbB#_zxLvdSua4e zVv{~nh~e6J5`k)0pR?!{H)REnrx6eX*kkD8%-r`;Cfm2+KJ?_+{Adg}#JZBKcy#cHe9+nSL~A9jhDDk!S2c*D`1#V!I|;sx)2_Wi$z6Ntfik-T6E#W0-MP`q(OuXP zy0)CQ?f9(d6H-v*^GV`hjwx}@-y?%G3@%Nam9uqod$oVUm-lO(pmW7u0@uhi2$ZP3ec7f;r7WA}n1y-i#FcJNdpB0jM zt?eOJ%P%3Utf!R`gGpvTYU@Lk1Tp1@8>(>B>8_fHdL|YgXx?$Gs!Gr(_7!L0_Zw)r_ zW6#nPpxL>`rTa&13u|q~lR$_5SIq^}lpsXv+rB!-bI9Dohw(M&X#5WJR?_+cQ+|hj zuWip^{e8bGFZvxOvbCmFL*#&vX6241h5lf+3b#Z>H^QZcMp&7V2|4|&{(=*jF+3r2 z@(J1)MSAR(@&jX%*(Tt4M_J(OTQ*%D$G4r+174%b)yt}aVZVN50DwB;HjER(IF_x} z_cbjd>DQFw6R3C&$I2bQql6TB!1f}UHb?0-;YG%cAkbD6v&B##zmkmw>j8fZb1`v? z64BUtvFzmM1|UYTsmA1`?lJe{!{Z)ZR&QSHP^`d{BC^K#NHg8W|{~X{i z8tz2FacaQuUN(n@jrTYv64pTm)sUYSv&|=v$K!jFyhbmcaPWeD z5&iAFGSP=Mo?1sYvg>Aom9r7^Yl35M$K*u@Ge3bc^nL(udJsn8rN`1B7=AOIzQ1uo z;9?7Qz8F-}TN-d}uh)NilMt2kMoMtcLl|Z3Q3y*n>+c-)>MlN>42`y^!ek=|4cyxx zH3urH7kP#_#rRxN<)j@oNK+MshRIva({U8+@&AGSySK?rtKaTcHOu~nhzm*0%pw_P zGEMsE9cXJ@OJW!->xN2oEJeCFoJz{3P3WX4O+IWN4v3-vD?~9c{Ap{`7~>p6_lZ9u zzQwEvf!qnwc>U?fO@9z4yN~H?5GJypWJ_=bEj_TQ$Y)&f*4wQTyxT*in!!B#t*xT~ z*QM96TbWYGSw8myb3sYl(f`CQeI)VIfg$wbx2H1$dw+O+6Q9o1Xh8>B?rlS8^eM(S zJ!dLY3qVVH!fi%uR8cwd3Zu*2YNm+(=QkW@DTc0h)v;vtF@jX!+J>-F4$$)L7LIEJ zbpn7))44Y-Y&%&f%TUAQCzDQ>sU^3nO`D$+qMm_a&7EN%4jkK1fOUW(SZ_r&)h#k& zb0XDJ@R1T+C%*k$pq8|iwRIx9`l|VaAl=%$2#8{7rcKnf>qKTx!n-(gIq%92>#=fXOHtA1d*f5^1wnb;2&zjGh?H)} z)r}tQMVM&W^7BJLMtI`6Gjz_yb;!QzVFs$y#nbUH;&W5}mnLQM@f$p{!s?fi(US>$ zfXvCfgisPtLTU|b5)nr!vp{;RWv3=y`>)9Re&6tEuz#q{Zt;ubs@@4Y<#&@|5Fp#g zEIO`Hpd}!^BU};K{;STrxdPRBXd}oo7>m&G)MY4-j^&6BhwPqPP^1{-%_>KrZ)78nX-rjxxZq#{tHd2XArJ zGla_aR{$yP;-VGdbz_c}x}_ib@p=sk z)>#mF@-0?wH#{@SUx`LxNCrH4=Y5*v;gcH;xZNfAe#OXp;w#Y^87lC0GihF=6%r-e zI)dW?uq9cKs=sf`Asn0B#FgXKlFDGvBlax4XUvx`1z$|^a|-ZPJ>FI1-@7$WQytak zt->+Tt2C8ajH$L2f>o|9%Vs(xU%dTcgzZI=4LuBEE$MfMs3T++qZuKv%SjzUt3kUP zrD9N#oWjYb)hmhRCCyRl{3?RPNv7=YiJS5r@INaiYr@Dmz-Srok z$Kb`*ZwAl2gK5JxI-cG62bgE({uh|H<*k=dr^;lYQi7AA8cP`@I#MVlego_q_Q}9t zw^REi0c*QR86hH5MsD6MIyzooBdQgG=3Wd`RlUXIR%RNII@Qws$}sEZjG}ZEh^MFR zkOrlzG98M{qVDe zR}d#{Xi52)^A?W-B#`frgXB0t_(2h;{bc<^+-;vb79xBD!ZEjVoL6M28|1xD?N>?; zljD>~0NSE;=H+?Jpo{L%Gc~c>?t`yi+Gp~On+efq16sS$j!+|ebpTj1uGOgihe(09 zC~?@^ZBh|mL;`fF<*5vR5iyf?{8n@v4OadcGN3>kE;WzC$lm2Z^1lqdn=WU@wb}9m zijhhja<_J82xK`Fn!#be3q*k5oM{r+h<^*HK4rYOf0t51e+{e(VZKU$)E2sVV2-)= ziCnRkv&l06;tOBx3wioqh~75_J`8Gp7V_+P3pRiYo2IRT#>P@~u6mvZjhC5>M))s8 zA7T~(BbSV`_XDIgbG77Srcbw!Q%lRgc>eBi75tVNIj);-!(ZE^MGoEBs$B#bW8gk? zu%FrkPj9h6%lv5kvOiYKw^s0OFSYSyjTdp z3;Eh3iSvD#0;Jv;Du=flRYbkg$576IyZ2%TIIN-L&CbS)R!q`2BO&O4{Hgpy)0tl? zokadGM9=&9^T9=?PA4|#6PufN$ZkrFqt$V!VzPa{FsZ#~pYNC+CuPs5Ew7!Cb6i-D zY#hnSm6i|tMI#*=JQ=i^sipnraS0%whB(U99jX)R9U^wD8_CwAWTXcxpef^P0|!t4 z6#;A#?l0~U4jFQe9vrS#9%|Xd=2_SJq$}@iD&2{JoI-rOGUcutP|C^(g|dJIzUsv* zlyC&lhnxkpk?ISQ1bLS|1fgD9*5-efH4bbpuu3D!V3@t6qkraXxWaAZ09%%h6NNpp zlnhgBWYRiGH8`i!*vB&Bss|*=_uM5^4M%Z=@+U1Q@T8^Ldr{GpxK=V*-CyMTDK!k~ zg+ts|?3tDV1=TPd*$<>^zqq09&{n=VHX`I~Vmu-kAU8MdqWXPYb#LxxG|fO<5T6BC zjd|qgqaiEyYVWLK`iZoL0&=Hy`u3>t*RR!Pc2jBG?j*JZ@^?@vRQoXuF5ZL1fDk>X z40YpJZe2+{F+?~*suJ4%_-b)ELp9tlAVeRC*dYEH2LhG;*P%ZitCiV0z8)**cJJQ%>`s=J`35>3R!^e?D9BbLPiu7k-4*(UTNRz0 zCq}sr&>h0*#>xah;$}}%Ns(c>OvakV^)9x58~1EE>v`+ z!M#R8i?l$Hk+jny#}HB7IzyLW&Z|n*qiIR^!xA|K?`Vl_OVvq!Kf3TvTn7ox`KUSlaqfsCru8iKR$Rg>};()6S`tfT5jkCI;N426IFevAf> z+1!oF%o>zCtNxp&iba>PGC20T<$b2~p-tL;RXRT4uS4IR+Y_^;J@N}Z)rzGv2vr;p zejq%K0hau3K&B{_gxRqa8wO!taRl&x98*# zg+qiF=o{a8B&_CIRd&Q;%ebvh%S_~q^S=%~Ch2#KY~ZfOI%T`l!F;8$4xlTpkP5gKm|eE|#q^O4#uofH+-7hPqfHBIJr zRfxMn7-cuGD~6OL#e8jI6M&}Wl?MTK^6^(2P%=LOhE4(AFB1jV#?^V!*|LSKK8GEY z9aUjo_hY3=VkQ$E{A)Sl6E&Hnek9BTNBq6YDAIpaDu27rF5#Q4d=Fwl(=`18MGM=r zkBvOs(@&;>*&2Wq+hVX~*_kzrJBrE>RKZvQR)?%nh`SG_j&f2PBnAjgqc}fpc^Dtq z`r6v;rqlEzJU~};u7I-H{C6(71Is~Ndon8f=M@V1u5i1{_)wrsEyRILcy3v!g>SB2 zg8et};(r+W$p2yJ4NM@J??@PB0|><2;eF!&W9Vgo485_7(ezRnMQrre;Il} z4@Q??>z30OA213=LO>ekJ~Q)r3L!Qt(3?Kv$kESmP3;v%&FVao27?b~H;mZaUrMNZJIP}^l zDSntBa9G0tMbdHm4vNT(zC#$di9AZ4DV_bDYScXiD433~-pKKT(s!h^9E90&sd~aU zZ?<#0kN69qxw*bCG6y-m)@(mGknrBMP1G3PRvNt?Xw(M^G`G-o0M2+GLn^k$`3N>H z52Dn4GMdrV*S~MKe!)5rCFm@O+PSb7@B6_&<`&r-xji2_w_V;!b$_#d`!Vs*2#w`G za8DJ2u<+ifQ;27+cX6uIcqPjHnC27c-Rt~FOUreN6qS5*ijS#}dvnbb$DA24!yGao z=LJbrGvE~TV}5Ge8X%Z+3oeEG_-=gaMMZS3tpPJ(JG`bCcQHGfgP%&mg=u=Kk9%F= z&fi{eg)SQ!V)yNm+_rnmgM@Hu8OAI4ygnMYPpX9_-D1970o>PU3ft?&4fTl?#Kx9q zR&(9lcR2Q&x`bV1JGtbf!keP@Va{cw@IJ11K*lCx(T(5F5C&7-Z(yzUf7Dk zrSWip*8&>ZSNR zJ{bdX-apeLs{z|C-y;r0ydVmV4T&6#VU)#i+L7}0#J~@>eTJK35%9|H>gBo&>Ak!O zc~|F1?%Jz9zRyh4H51CK^RsZRpXW%hoNr9D8TBo8Q~+*bb3617(^?qG!U(*s#ICUo z9+V3%qrcd0SDwmiw4<1>IeQ1c2;uL8$Vw<3X^)&*Rv?DpoIUZeCJgOTwpb4|hiJbw z9%^-Zi(l$5O?-j|4y$*cZBq};93Yc~2(&VRWMZ{=Tw!~O%{@mv<8-p6W3zea?Ocw! zDjdcJ4+0DYQM}C1pCGuLpZ54EC#Yh6`m^ zQoJW=@XKlen^2#WRmo57nUxt)$3pU^M*CC9E{waJH}x@2GBv@V0W{`Qb)OZkfW7|l zcD^1|hO0L}8#raSEMJ|e-90dGz7gdMs)o$8kviVh<7}NSvuK@`u5{8Djj1DVoztc0 zeE__|hwD9#t^%6Pq37tYA@9Z{i+flGLW{y#jVfRMsH98Z@yN!E0$PUiDV}q2me-}| z@2=Xuw1CFNf;N<<=lIwTCIFlp)Vl>6Y3-HaezPT2s@^tCQ=K&rsrHzwK*F4%gjwAp zo92EhLDZ>5p$}b8XCwaY{+ZdZgWE>g8o*n}%zzzH2n8T90WLuRdX+PHXg@ zNkBpRF^*Pw`M708$|{cm^>D1N@PwgB)Kk-2SPo0mi;I^3}vp?2wDc-SeheW^fO;xLY+m}V^Wcp`vQhWlETzmSc08-2a zX9c(u4Slic*EK=)qC8Mta253-jD?dJdhwlML5J6~zl!>e`!mOsfyY(b zG+uhxUlmij-STBSce0)JUp&H6-T;$@LnrpJKDm=w(rBt~OFtHu7}XU5h)UG%c~&R? z*zNzpSZli1@hxeEttzQ^UFk@$pxVBDJiMN_M$dVPI5+W5nf*S9@x3`5LxA#Z$UgGh zAQFla#62#ppg*KrcENt!&1r7Iy+j&wp7A+2=$Ux@kQCJb)cYHyQ1O0SjS;}?)LZ|` z)&Fuz40*|7nN1w~P;T0}4sX>L&zo_9V#>vZ!7pXhsdwZ8N3BcE0i>)$&b~k}Lw%9{ zJgkJbmPVI_BT&JJU8ea{=aM#hi1Nl1?dCfm*)Lz6Y#rWZ_xnlk%8xcr??{Y_jZQ)B znv5-DLA|O=u(9-315Vs@tp)%&J*EstuzJzZ)o3Qiu=V0M&o}q$m}B$#hgTA5d6&BV zpo90BnJyds6oaeG_=#mtFX^T(WELOccSlU0rlJx?dhSeekMRUs#6v;?dcl|CW5?p> zr@)AzXemZAuJEAs-m++w2(Xsib~qDqkL|G5UKb9w z4|7)K6^W4Al3n$Uv0aaU3i@Kd2w)VtZn&1O+SOOjRGP)=#*MPz1!wINM!J9SCEGzE z-ENAv+>+7X5(Q^`aNYtG^B!(3b9taU*CRi7w_C6}*WYqTy}2(kJFjrI2$N+ALe9tg z+9$AmbelR+A&r{MAA&A<^goU4m_X;W%v}p1U>#k(BiTkYBbC?>s--M6Kl|ux>JmL*J%%a=(XBe;rb1Qvva=3`Dz_Ji=?=z~LZ`0K> z7g>+IJfxg=k>0PjKS6t+`MCdEBK)m9{sr>5Sy?&$r-s21uM|*}Y<~a_3&z2gj93HC z&A`F=HwXFu^f1_X*cjP3S%__2tgUtbZ!Li%dHVny9gKrJzJ`_xKrm)Y-gI4AbwuTWa~mk13frHyd-a;5ieFU-w38vA3%P z@Z+DKH0{_!Az58(@2-!5pJ^+G)s`l`2>9ZaYj+%Y&s(4Qepf~<_`aWy>wRPE`k5^N zU-xGhmLqeH+fRRNfL`-d7|7p~AA!VKZBu{5{`vU91CUez&lNvS*608M3T?~#J1bpj z+qUhh&cD0w=!g3j?`On_vuCVWGa+GsR@BJPZ~<+4j9D6kXp{_-4jH8qh%rwE9EQ0& zha$f}8-NTpF1AUfj3Vre#P0GSot1SgT>?(Th(tjVZKuen5BRHOr3~zDy5L$lpQ#SS zr-Y2AJZHm4C1x>|rH{%d4RgqgMogZM=B)A|MLl~!x*+$_lvkD zLJIsbg&c}G$bPfpw1aFz%_4h-#{~E45c|w62yk}U)tVKG%Dq_JG$VMWiTPw{w)D%I zdd3R*`@qni8T!Z^)y_z2$(!3Sm||@94r6R~Mf%c=)zK>>y{e_LLy?rayO{Rlxl*Z8 z`MPq^)|`HqIjWZclJeQ8o1*2(+!YQ)KD*5R^`OB{yTaFbL%SzqO9w9v$K(CRNUxic z5U}2%oFUzQ>QHiDrN`?~4ROQA!*lj`oTlmP;c?i;;BLs)Q_uIww#W~a_VzF9*W(Q! z1p58c;MV_ZT<}%a`yt+t=u5K*N06fz;h)x&Xl4Z##U+|D%1qpX^r@N{wBM12c*ujz zo43fg4C-8CR`y*{4SX0qpR(J(Z-b$F0)PPSfR)fAllzV`6nDqSiV$J}-)U9{Ih9V- ztS~Ml0|E?5#p*e_u3-XEjd0Dk4Uz+QFXHu}`c5W+XG(Oxwe`#X!s4s2=htpBV0KVo zm@^wJP+m#=tyvgT0=hyH)7b5asR?ScXb%|zs_>fFkFbB;%73^biL*FN8iG$)9#H%+ zYISrc5Q7H+SI^F7>^hw_&nV?^UAD}&W|2pYa+mJzJ)1|_13JUEkLQT!GMN&sr*5ri z=QaKI_@q}7EGZxH#7&gB!fb4fIWJ~)|xAESl63%ojM}XFrU&qa@aXCp@k_Z1VU`~W64r!jn;i(PC1qg9V`8>6UrPH zZ1zu1j+Ck$rpto!4X$Z01_DgWc6+it~Q$ zKf{v`#MUvdEh3k|E6~uH05H^a!!S5aA2I$ou=I!ODXfjiZIWNUviWykc<_6v0};+=KFpBW5}Fd$uswZCdzCWX)t;^&9%r$sdE5&+J0 zQWPSfq$W(crcxx49R@Zpwws1Zc`79jDPvt4`~F7!jIeFFMd)0N%p34=E=;V5N`1PI z7uA=luIjTi)u9vZ2mnY;*`;pe&9Sc}>2kmzkb^)rT$MX=ddw>(ZHYq@jT4Z`d{Hy< zELgd|+Bws#X%{wY6dO#>^>q&!8ioc*?01&bRuegj>_mkoNM!-Zm zb9ONEy!&^jf045SRezP{Fgdb!S(`qZsxBzJdo8m)PcBK7VbTX#krM}1(9Wu55gzt< z(NVJs&@@96*MWv zTMM1w=Rmq$17H%l1kG8BJGa{p6KOLSwZ=N-eS5SxoC(nU!Qhe@xC70yT^CUp0u8FT z?;MS?A=Gy14y3@7TUMJxAb>-N0vOaBEA}V%^t`Sq@dbNN6ocY@W&ZRaR7}daT;Q^b z8~K#<>^0BhlnpUd`ZIw!_V&WM>Frsiu}U<*yphG;0+5Uy{+^4UTqoxP*21RGTNU?J zzfPACYaaXUU}XutKCt>MtU8jsab?Qj!vt>*sDNeIXIKUxIR=vWG;n`ou?-az3{A|mXtG2ymLSVQayBS5W&UeenUWp?)ih{A82 zXov$*XH=a0Tg2RtGy&7WZS-`0rss!&mKET38HO5Cmx4<;wq-*dqFX#bG zGkCo1F*wb8(DGj68_7+TOZO#1br6vYr?$nU9$39fGzJjoJ;qS%i#*k^OF?ch7hMZI zwe}Z~;$t3RzqDG5ocpzQ_cJDtkq!i$l$MhEhqKTSY55%kR_7aPOWx6kMeC|^LM4$y z0H>~-Y@diN93oWDmc`NYQg!oZpq8X#%4WeSVwL#qHI?~j#Y3OJRB+Awi0nzxt1r9Vdj;yU@R-a-Mdd2DIOJ|uD%w5lSTT6@Yn{)wGndwo z5fNe=XE4GK;jK@^N3-8lxZ(mtfM>P&0BWigjK-yh<{o(-qg-*Ru);$|`R<~@bDh5R~jQaRHSjcW5lI!QI|hTdWGXe8Hk7v@@G%_0GwlS zv)!u_V5lRI#cOU50yP6C9S)>AA&Asy*LG;SAcD|}qmcSdq1568SH#B{Xs8%F0)O{= z6*{mkrg{~SOvv~r4{eb4t-f}6_byaxVWPz1C;m=E^#)B8FxQ$aguPTE%VQxwUJ5oU^>))FdWxWElCs-VaRTi*NO5fen|^logzj_0E8akI?vus zOGln*mg)j_XyjCP-Smq zH$()-qhT~Mm1WZnV*O2)%Ky06LTHQ%JNCNbL`tm& z6wBs0pqia0oZ3j+c|3tDh3q~0?i7hZXIaW=9+gI_l~_)>MExmoK|Lnh{6>R}%ILr= zJ&znaDsE+tGA*}+LsyQvPj*#;P@#hoQxq#JOMrqLv=uLu)If+C0dTJ`y>JO{#@9Yc zJ@UrXZvBBtgnAi!j}>8bpgJ9`ap`iP*&+{)+GcRbo!#nAm9dgoqS5uaUFppv`+j?T znJ-;I^Wj;F%Z#agcKDJ~jC9ZMLN$8I@?ZtQuO?bg*rI)wP^`#Uz6LP|u=x9##PjYJ z4Q(mtDjjV&t!<_z0G6&SjGbQ>alN@!84zleJSrNagxF>XZ0>ENIjh9W=j1fRV(NNL z8nVm)SUs97QmJ$Fzb(qhEI*}Xy6ltzva;`~Sk-@THmOlA>_fnkkMl@Bi&2C9Z>ak09V&0XpS{Aj@EuZ9F1K_+hE)Ik?LfKNc1J1zY z+uut&4uP_^y%zoZjvf8WB_-`;8#2uzv0(7fpXrtbFNCYruaJ7kzE z^Dqxl;9b-;Q*QU2u&mw90q96Hkcq;4WH+i2pA+O?aNArY z&bQ)?$|o?s@C4A|7xWMFHUrR8@X8^uO~?*d@PGM}M%hZXE@xOJVm{u1`5v7YRFvHY zJg2~V=?c~Lbq5vSnU)zS5<@7w`ugs=4SJteV;$5Co`(gcYUl0RPCpCAc=clP`$ws_ zQru&f0W7M@Dfz+D|8MUA=wf^IfmjUI2jp%%GPCVj#wQwRTZv)m&Nq;J{r&TN79BzO zC!IdhN=D-!d-^UWE=Njf>jP*w{5%r3bubHFsLMQ51HJ7=*ovLxn0p8GM0%snX~=vC zC4)7i6|_4=1x3b7i}Xe+kmFrZeL4vM{Fpf>qNCX(ReF*kkt!?SAd3uEe&Oh4tl9d5 zL>Ogkk4V)&`+>P_+wvg2v$#Ct_8Vo1Gvy@MUJOtaveBJ~&C(~5a&E3aHhpmUohbd_ zstdRt_F|rDR?&W{N`zgyp3Y16dDoD48*g|%#yk^Jp3Scryzqu@&l_BbM{x!)K7;z+ zYTdC9?iet75OmNL|I13Wd4t}@sq79Z>$ANCO0;jWWgAL@2|?3{x^a~|5zV-Gq?wd9 zlXK$L-fzVBmeh{UHnVTP@>LwS?7Li;)qTu(bN;jsFEJR>FZ?^)@;E0zknE zmiqt|beW%qUua^&TTEin;(k^A3Em&BU(ytefch0Pt_i}r3F>DUb@l@@+jf_SHx z`e30JKo)!ou-@w3Gkb-1YQgxSOKQBWz27(2>3&`T@K(-0d?Em5(uK&e7 zY;5do|A%|hooGQDLD)IdeNRBS(Al~Ff7HX0zRv-S4$8v8^q;3Fz#QoV%fM7WXeVx~ z<6gj^kg#F!6;uoC&eI&^2xC|XL0CbWL%0E;yTx8UyuRNUBBDa_ZRK&GdG_=cwau?U;E7^;ppnp6?>gGzWMV` z*zQxz=Ue_HC=~B+F1PsP4z6h3Db7H&ZvXGmMa6r~zT4k_PoIu@w5<|+og%QysE zz`-noUFqb%TrMz~8o8l2?z!E-RR5y~+3zNqhSg^mMZK-f)jwg0wHN@%WXLeiro||z z>Zb!0oIZ6u8N)id;-H~k(Hn^bS!qesvMiFkbH$#cYrV?sIN^R7r@Wcc^)?LDn$LM{=mOJ1eQk#qH_ipibqByx6h&#cH)E)DtHl<^>MHjH zRbWztn}!6fB}AlHN*V^p$YxZHS=`K%eL}Je4p9d44r)j(=6AA9%L{$YGuUTO-AfpBLWbd{ctKkA9=E3b6l|NL)m0N~%yqQO6mkH4gHFMZ`kDO{7r zIfAqO$8rNdPO-NNwP8WlHUJaG+5)``g5PDS@GJP%=yYK9puh*&PbrmxAnv(W59(7>AHzO#X3d4&jVR{&t&yY(vVGp}6LIi9Po_?`b%mg zzk|4nDlW_5t2Rg{TVjS8K7l{C~d+fko@GEVT!pKJ>??-U|YmB6O&F19Age?py0d=;datGSTalLM?Ti7-la{m#EN|p zdpqSMd*BIXSdxCb*@_$MWV>4sWT3=6MHw_m;f-WR*Vt`^IyurVlpmn9!vmOl3Y89$ zi#8n!f1_asGhXZ z*EG%`OTX!B?qu0y52*?BAyYZ3w=vYslAWY^N)b(T^ZaBenWV~}IR23Dr{wuyME)UH z3`@tm=^0HmQfc}+uZ;YHS|S!R zleHrRC|XQ!WG$nEChDV78MQVf3*Hl-bu{YvmaBomg@cyKow*uOGZ?_xGwXtviY9jZ z>ksTUNPirp07X@ufowP@eDy6puJ&1?Fg}oFvGF;PRRTnyqL|05sl>i-s%u}vmXang z2ZcXRqXeFt>JBZ}J-1(qS9hVo|=3-wD|X23e{+jRAA{P=K(;LhXum?G||Og3`A97 zO5I`(KgTCIon3qyGTgeJ588zYtR;_J7>M}JNC1#AO9tV`|JbRk=E}xvEi5J|viI=I zoVX^m0l(u&?j5PxkSlfcx6hF?gbb-OcWs?@2gx6X zNA+TDvWo92WK_WMREZ7>GM}8`lPyU`KN0eP9Y`@43D;wV0S;DfIMF&gXt5VscM_ow z7Z%MkUY+MN282j>b-VAYoRoQ;r-Ea9vlDg6M?mB9=AGHk7DL{pYV)=r*`coAN#bCS zGLJI4f-@IrNc*ekkvM0kqqY_Wa=MfTswI>8hcEjzDhu%2h0pL&-&v`>Hs0KtV>z%^ ze<6W@>!?)mgyod}Fw~dOR`P(dr}Yvon;{Dqdr zvgxyklc-s?E}Hp!0NNPEyXG^_{-_vDp1@B@}fy6Refb zrxsERe~#ggT-Ln*d5t16n zn24>g-Tn4yC^C=gP4idsPCsO1v!+L=l#|hEsV4$RZr}j_LzB^OT<=&UHeuXQ)M?nRP#U;bqV#g!&aGl_+* zibVL6C+{5Bk-dC@odL@Ie2rz?sh8QHT!d>l>{LAO!d)1eGpR>wEPHK?Uy)WJaa6?Iz%-MrN~l z2_P+NP%N1At<4(xL~tEN(EA{8#qe{e%f-hejSdI-oO0V72qZZd2Ek1ypA;CQf1jMl z*rJMaG)D%9m+`%NT5q?hW%zy(2CPQCcI7k?`hUuE-0!youulBL{zdBMMft-twiDJ7 zO?I2VklxL$D7Ctws`4&)#7=M~=tIo#G>D|M;^?f?wVE{=mJTu)@D2-mRK!`H9ht{j zUKI!swbQkjVDEuH0iojOchl1T8p}oa=uvuk$}-SgP7h?H2{~Jzy89c!2=E(D7dVjh zdB=`n6n2nMy7GI{6)T*#L3R7_P;^A>))Vw3ZMo^vZzmOTijMf6MCm-xcRozLwGa21 zkl5XV8rjcu3LpoVAAo$ZS9=&fj%ImqT*0gbkQ~aj0yk-PHC0^4fKuGx=`;wiTG2P1+8!d;Cb%({!1p4j z!O>#%4p?myb@CYC>G=ziRwN;MvS0;+lgZ_l5`xb*GQr>)xQxv+ z6z>TEFc;ng20bN(y7S==u3@{puTT^AVNUqX>7Wh)(I+$pXliD)W6v}dBau*17>8~T z(+S_c+~X1-XbKEJQH4WmeRzB=$35msR!hr5=|kw4F|n$XBuyNPSgGJS?j-LQGUW|P zW$FVwzQQaB>)cWkF%XEy4))gRZwlXI9C_b50KRDI)1<7&s1f@5_Wb<}# zC{*jxOInyV%yNvtYP8gAb}@)&*f$58eRDTVYqE(Kr|w_tO>_lt_8aY_mgQU7jRg}m z7?*uVTB7-$H#CS0`jC=cbz$`K%i0oM*Kwl@aCl%M^Q+f)5}RHlP59DNbyti(ohgGM z?#xdJ{!-6H3xGTSk$gb#AAGA*2Z%JV5Iz-AyAIDUUe(n*>|;+I#rrQTvLmLg@@QBB zJe*S1JICu<&yPOId1v6FUZ;6!kDAxbr7F_=u2{t+7b_6W@eTUqJ~Q!FtoI7Yb_F-? zzcn7(Jr&2A#FKl^j}vE-124O1N%Jyqv+Q>Be@#GW@8D8^5@On$RL42(0d5ziRg|#w zd=?~OXJMAqk}KX*w@U_KYyf=EMq4HNal0Pa)psG3nR#c9Q$N$)P&FS%sX*l2d+(*G ztZ7QB(W(rx5EXQ4_{2ta80;N4I%$H{jE6@z1^U zPYP_)Y^sb7bBwYCl9)?9Z^IVOH5iZ~K~}Vc;WC?93#&$?}8Q z=n-9k+nSgr#u4ZA{R1uYy7r(U3aWJ}Y%nkpNka%Jlz++l;8{kGLH_Ax>0=-EVp#iu zo{0Vgxq1y}nEib@& zZ7lcbET_@Xxk)#cS4d+}lfER07>`B62PVs#kr5pwy*1Wgv*3f>VzK&^{Zkodi(T^( z&S0m9sWWEAf-2hFAv3LEj3TAoX*kam-(D2F<(T>}z1r+sjKI`_ zF6_KyX$B$V}VmWsxi~~yk1Yz*?5Lm7?!jyeQqBg>b zTVrE53_S!F_W43DL)0m~;0Ei7*A7514Wh%Kt6Yg8Tu-|AEQrc{*S+=>$5UP=I+sLwExeX~V{V z>qgL{wunGH44(;eRIp1R*7Ps`C^YKSk|Ztb){p)B865X!>L#g`PhmgavEl##;(q$` z#asOAQ2P+$-D2BhaW!q>xAM5m^6&3oY8Oy~5|ek6)Gl9t>xULM_b01^{*JZ_LIi8n zA>ZXMjkdoY)(Z|8!~^c`q5TEFzc%l$>#t4B?=slb;hVi3_OoTA2>-fx0hw(=e%=_N zV4BYtzk4T$thVnW3WnDE3;g~*EudNNs8jA-voz%Q%Z|5e0Cp2~y~;W=xq#$t`icm6U3bi-SJna1+pRCYNd z3*#yh@z(fCT?TSCBMO&7q+9)1lj;-=J14eU#e!4OjtlTpy#8j7OL@l`V*41Xj z>eLa(x$#Nx5dL6fm+9ITk;6gbV1i=2fSqF#1sb;Qa1~4k92@C9N8nzLvZ-9d^aRZ+ zy5-_rqVP@|uT%yp9a-Z=9fdEl7FKcwo6Ik@SQ=MjR+~)*94AlC9FfbNJBnG;9c(Z1 zc_{KUJp)qP=pFvKdouk_B8lMNyLrC#Ur0$!8vsRbtG4!z+n%f&{-z= zx)ci4bD_sF`qTo7A;`(a^vsKrkjl6Q{%KDBu=5c{U;(4bn*mBmi;m?KaUETJo`$D% zQ07#DkR?c-r@Wqzj}cJP4QPdsvE~uif{Y{xktoo9+Xb^n>abfnEl$FVyxasngHoR0 zWdfW)sGStJl5;7G7Nz`6lpZ2EhU=Dw%&LOFn?{ODp34>I_(tYRAI)hSP7aXv`{+2} z3k!}x!o)(sdH88RnVlrb*yaq9WjbAt5JP@+om+%y3T$F)TOpM6hKWG89l$PXT4uahZ^zZ@n#J!aXMc%ToQDj1(9t=4eCaWGqTV=oTuavIT)cG;$y zW2o=MnD=n1zZf=DJg`Ku1k=2h^fK0OIMPXjLu8}W9#i!NsY6FE2oG3q%no#+85I^@ zSK1-2lzYnc1s|UWeYSlw#HDU@3Dn_>hWeL%3%vLcgt~}1p8J?=yeS4LWdqm-T|QAI z;@awRM1Bs4Inpy!wG$gy&dU<>sE#FaMZC53_TS(rlaEY?@2QdXD*abRA?n3-IQ7)+h6C0&!-h z+EB3WR%=`d&6mcB`|WnxXJOq@dsnAzKS&S5uCCman!hzH9wtrE@^ReV2mSDDZ?3j~ zurJ$*HV6OThnMV|2R7y)%imn=<&2x4z<2*3AE7pgR{{ILCg7QYJ6z`e*;$RU1hhL} z1K!V|v)-994w4bi7yya!kQArR_0%`p@7syD6$avsJ?Xh9uFIXCiDRo1l)MH1q@uZ{Mm3O-k(_9Z#?umEBe3Kr zP-pRdEXURn)0L)7`3EkhHQ#JPLR-BCCDWi}outKgU@?=7uLGo@Wm$-wBh?h036iuI zd=pbxZP&$bj~do87i1Q40{pzK1d0;5(qZ{syAVn;oYZ+l}5jS+Lj@F>n`lwEUFNMM_7l7bBqw zpYfOx>lN^-Uj%T5C@iS)6b-geZA(ilRN|I+_EoVS>dO&x>Y35#!)1*>3<-vnxpB@^ z(MxtlZwAEe`~L9nQTIKbS?_VI==%FqZng82A&Zju6U249#RiP<_mBkH%p- zr4XNC;$~ntsPi3p?1=J0{He)FyQ@GqI{h5)ssRPxg+E%9| ze{tWnc?QFtJsny|yPYySC`4|b4Ekw`Jn?EEx+_%+u*bn#y4@s{IoG#ZI(8&H+5@Q96wn5gz-HFj%u9%O!oAkW zsAL=aZdNcyt7mY4#}U-$w;~5S&@IO>&?bdz_pnl5QI{8FT2OvZ&p{EIeRLE#8*`2M zMp9IuT0K=uwuUvNM6rE>E9lI0Ih2dH&Jc={xB%Fb0mMNOfPxtL6Kwpj#TrNBdy_TMr#^ezmV zgT;&Bx3EG*l(`I2wBIs`xeVsZeWeR)!g#HNPPm0lR`@CXKKyY8LFD~y^}}5q(9ON! zj{)r07T*i)=SW10=fl6->`ut9?`1#zYrSEI(Mllw*jDZ9WJtkX_;_xYFgeaBd@nGVMn>sFa}l9OfA zRD4jx?@#l<%4Dp)FQO&hC&ePnAb3FjP=`@ndT>kj1BKZ)+_I2g> z+5NJ*&uRs=-$%@tiEpa+t!=81-5D+s@pqb=6Mt-KQZwOP5xzp3=b-?zW{!aTlZ16) z)Sa`Ft>Uj-`kFLVooId94aD{pA#ywYm~92Pr2qnS-d3G76^&I2vGiK81z=$xavpfx zzK@u$#{I9~mN-^#Rz>Mu0ry!u@gqK$aNhY8g1tT_i6Z`++KQkuXB=~;OKZACO>-S| zAMT4|Qkvw%U;QyH91)xa8TSB+T9ja7hmnk>IHe+<^#4c|5&XN3e& zwrJfY!&s`hJ%Ut$W+>X)>Ke73aLseO!8N4!dB?E3j^$A5$f69Ao=K zK~ONGqma8BYmq#mH<{i&@wX>tf|Iz&2>(e72xdh+%#TI6>ng9Ab)|PCo2Sy=4@Q11 zHxXn|j1jGqr3)lO&t?JS#zwQiTcZU}%C;(0ZzHvo&QA3mh%S7*`+&!oT&Yoge*qd7 z9V338^ivzSEgMXf`ugAS-Nw%9tibcCk}w4%)gkpW)?BX&SaBH%cE7GFv_G{x0J~>l zYEOG?x2RTyBmp>Cd36$M(Nxe=Om$=6`V)cALMNHMY>&*Ne!B9_N%^rZ*QEN|tS0kX z6X7_TCe!q)8CbryOKz3n4Q*dL3Ck&1Okaj~>iJE#%`(@EYf+E7m!z65NL{uMMlQ&> z-4Z*alJ3Kh5Ii~)vqth#W{8bZ_gzh9L`RL-w9v;c@%?mreR5HhsLXpwUiKTdX@9eJT@IlJ{7O1LQwTN=-O%LUmttXeFBC zMvO_W!c`bM=W|q^T11mJq*x%XZ473@|JrJLw;!@&T4W|{=e^PjWvfZEirNg8jZ zanV6nwZ$PbBH?xpu9erBEbRh2 z_d7Wc?gW5iSfjzSlVw(N0sxMKQj2M-uR0 z-HYDD7!{h!fd?t}QQMc<-V=y>(eRuFbW>Tx>Qs#kw^`h7xIN9frBY z#lrcv);>w^S)RL}&eydMem7y$_SanqUTky-NT%>mJAFI0zORp4diL5QEs~gCmB-QU z+dwUZHgrk!X|%XQZ$!W+b=uNsIxV@1^l#Ho8hw6`1oQ0V^r}QEV35ifaO%A$<@X7RC?|6YY5fe4LoGeV`(yN$&%(tr4HN=M9Cu?7RS)&y zHBwa@t)9?hSd&r2dq0-T9ul-G3QKs5{s1IWQbR<7ayXxIkSjdQsE#Y7H9r7tQ!~IC9n7d;Q|#=J{lGz{kjDey@V8D(l;*+5HPZ z|LXlrFt@$UWU@^)m?AltlZHKw{LNV#_TPJX<@?VsG0&{>(0<~F?X7L_xTzGPDM z$IIwB=Ie6($R#8EVui?|vbleuo|@~hHiGamC{4(nOzQ9S`}^Z+DUZvKr%+_hE2wdW3zxEr&D23# zAl0s%US**Pt7eQjf-U>1jVoV^w(?cQ*ElDItb@Mez@YlOKT3yr!O^DRkSz80h{4N% z6%wQyJ%@-)&=_mu+x>ZJFu(*PNa6*pxLUL8NTby-(3%vo)G*Y`7WXVyeO%ySAY)Lb zV&I46&<*m#$>6AiPo51?OpeZ}nz6J6*(;i%!&K*R$J(z% z#Hf}?;DNM;AF>a$awZig7dowqAuyVMru_r~%kh_^E4L0BlrmDg%O3$N{KI1#X)2s; z-=pWk>q)GqFa2GbBR+-l+D>PZZh-_IRO4}wQ^u=IWQu+mbT|7xy)vP5T*XZT7+0%7oh}$V9(&>lD6Rw8h z+kOx^0xw>$Roa6Zo%40M;3!z^_c^chYwHlseiE(IuEwLDDHj2#Zw)hSpfdI5(9h&x zg34UwCBT!j7VH1Oi&bsRdq_CJgpgGc>BPbAu>TS`Z8a%Ueu~$kU$n|TG zo+pP2c;(_&JU0U*JlMT#XC!Y_2g5?+AupcS7se$C-gV{KVeA9kWXz?!Z*pGalPlb; z6?b6G2AH@~DiLV&(7=3>TCmgQvNDAEiSgJ-XRxr8bt?E~2cZgO&RV-u{DCn3x*JR< zoULtYWrl3_gw4!krRaC;r5rksE`mdLv_?KD$xR!VxlRKdW(FPcIbeB|zc55tZCheP z3_C8^Fx#1wN6nVCLAM6Q{7h*Yf4Xxk3TB2XR$RD>`8G$bj|$L3%B}b86rpvS9Jzy& z{3%a|wCYT5SL025eiX0k_Cbe9>hFIZXei#KMo93qjD$`+|IrR~l8@<#(P*)2K+qezdzgmtbRyD#ZnK+EY2Fyvs9}x4W5ib=4uxjS{CW zh`QZ$NYCsSmtWWv$mj|EwC}11{#zjpI_Cf&J*r%dm>c0yxAg{biWKQZU9WL%_5L2u zIL*t95iSvqYizpV&XdApXDP-n5-gvm;L>OEQO8)Aqsv;xLjq09yv`u1jaSeAE*5m-$=!$Q&s8Bo zlED!wbV6P!T|f?znyGdoAU$kJM&lM1@(Pi(&OkFRX}2j%QbSG=zcxyjUyD;jNtJIx zFdVSuq5*X$vRpy|=eeD9DKk;Vi?dNe1EU2<>Meje4GMKTXBZYa%5P4(MtBm8*UZo* z#04dw^jTh1{3`gsobhp^ULprIy7a-NfZ<$I2E`I(ajuF9%^H}LDwTfdyUV;R6vhtO zj$tbvu+P6a8E3%1PQJP78eiq^07Cb)CCVYDx?hDWb=?1Rgq2Ok5NTQ*iwmBTefA5m zFk*wfdpkp}xG;sp)<`Y$qr;%qMYV;&Y2KHW*4U$eg2D9->)L9)X4-I{Y;=YKL$#~E zRN>JL6b1O%RS!v>3&jU2>fW_M>gy> ztn0L4a6x@ggFJK#udNZ8a>W?ExY^^W(JOHU(CHj~w+O{gZ04Xtn`|pBz`&Aqe2SRI z&ae!LgqrWsQkILcID1jcl>-<~#)X>{>)C)`0N+8*s4kj=(tZrJGmajk~s(k5%(nq-qed=cqaVt zDqhlnc(k_BfN+RgRq}$}(ue@9O}$Qq1ltEpN><)=92+?@$P8De32;ALGyl6T9%<_i zDK9nzo9^WaEZk+Brb62f@$Ed6DRCYrQdjhu8_n7SzG)fm)u#pC4UR@Zj@ z!}4|6{6jhcww-irJL%Y5v2CZ*9ox2T+qRwE@AvJQ*|lfp zCp@*Po~m`P>pl<8&=-9bi(_iZP(?+706Hk&Uwoig1&S5DUPRdGdOt!i zD<3z!d|N4ji}B&T1!0t{R;-$GM%iAS%ba;TPn;z)``hgOc}dG&EhW8-(sAH+t+i(m z69RU@CPu=BRI0!ayvWz;vR%NF$K#~{`(N!H^f(W^vn>aPnX;GxpQm7Ke7}O6Do*?m zn*YJH$3{k{T z97glYaZ37y_Ij-!RS^)(6!RMUmlqbji%dYe+I1jvc6Hg`p){jT<>u2cCgTXUsY($?!rc6)BI;{=4zJ~`zPJKkIQFnyg=JjfQ78Z!+_ZQX1D}v{1&)Ds z?=54qi7)C3Ed9ELx_;@d4T{elbNtf7W#Qh? zL^G6z8~=lTG68f!cuPHW$ur+%yTR7=Z@_o1M~6D{lUUolA?VgTsP8D7^f898cy6bD0(BsZM~D>On}b%4dBdjXT2E?whBs zW`)3yV;6;0UZve0x+`=f+yO;YT8y3gHa=&EzWwSldYnh$0i=XhC-mf;T=hl-EZ5YX z3DajYvdcw6Pxo%WU5i8eE7?J5ny#W&l;Q`C^r#J|r{L&|)dW?IMOQD6lt2oLL}%nJ z334uK+c%)lA?JA?VTT`I?FMTUJwl3=lSIxLDUgMLhN}u~!`5~$!E1B#0NDft)<>HU z1TnEym!A+e1kW$?36Br2l5`~`usb>XM|s9y^EP_=sTrAUiL9$_NA@SJrkgzG=W6%# z_H1E0A!VjCG%Eg9G<%ONbe(ppW0oA3EF`)N~@zpRsQOHlbPA<()TiD)o$$&GZ0~pWR|Gt*F|9 zHU)SxI(@~-vV}!LLeGF|b5))OE>r(P)f4u!Ze{+mP$31Mr@Se6a>i#L3_9;&? z&nLm4tV-SIbnBI1Ch|K7dh#~)=WyvdTKI@UR(5>2lmez$Lnh>+>Io4VC?lfR5{A=)jiQvMF;F$Qiw>$DZrk0&mElPnS z*R##t+@{`-b5Jl0;)aF8e7B$^&iuC{mTb(v$ka9VvO}YLc(Amrg8K;ym*%&Df2Rup zNz#FsjJ3!Zy?8}T$e#CDYvR<^kmHmde2Y;XtOu7?@>v;sFjv*)=1-_t@JFBk#>$Mh({Xf;9 z|Kx>OI9Qnf=QefdEDw$ul92u?6|&eX<3aB5KY#Ay+9Fb>B5Fh`WYO67iY zyib>YyueScb&jMvH@zl`mzLEZ+s1dbr2!jsa{N83~z+S(l2l!+a_ ziDzj@DgwYXMKG{+12ARIHC-VAz%$9`zm-#h08OTXcy9F6K_ho2+Gp0nyFT;feQX!M z_w(zuoj!byfX~O+&l4`lU;wD+^ZD?7z1rGY^3w6`{t|fqR4A(Y(u-)xOLH}kRdb4I zc2eWM%bllYtU=cyG$#qKSeEm$PJKRJ5)gQgY4QbLU%UQy=IHhxb98m)wB5fTUWnvd zjN~epG<44OXewvZM1vEQKgCoT+)(i_U`q;&F7)=r75z7Jg!JFcQPG4fS6-*e|Hd3C z|4-&f8N;XKznG)VoBuFJZU2ioLixuWk^B$lh?~DFqIj->^a!7sB$_N7^ak$iQI_CAnTFh9m&!{r{){8U$g%;Y`^p!YRvyZPXLeGv z@JQ#W(&x`DF-6vgKG}H$VTB-fEtWqiU#bsV_9-#4`z6k>+5Ux7M;IPV((2`* zX%66f-|82AA0j09d{c10oO&1mW(Wkj&Y3G5@`}DAqtBvaK~Imbp0u9=zmuB z@(2QO!e=}{%cWt4l0XMSz4DwlwYi70i^Re06|NufT!-7-hV#%b8)T2Q z@BJWWhK9$6?|=R-3S)xLCXTZ!xOhZ5XN)$;wRsKoNb83w@^C#5Pa8OUQlB1bm&RtU zo-lMZOg|{vf>lY3NinBiOH{xrRL-#J*MtS|Szt)xm_E-hJJ~wL@-&07S#2ZcD#80z z&?uZ(j4;e9=0-9l=H!#RFZ{-h7wf)gf-WB2)m-&Pyj^o7u$K^OQ0nO88s>jaoR+)) zck{{Ll%1!!bcghR&zqCP6_6qqz|>*(*T4J*R4LY41Mq`0eYe_orQBPU-w)6v+5F!v+U94j zw4wMurT>dw_$o|cs7k?Qz51oNuABMkDEj}>3#k81FKpk8%%i@6HRoHIg*7&*NQ&5X zBSYdMF66(0!}3Z)c!J|B``OE7H@Nmxd&JSLpb&H8124E`igD{OJA^sr^H5zvQkYAt zOi=0twPzC?0fUa7W+CHXod|8l*+k|Qd|rxQ z<7~(t&MzT;O(qfw_IGlCPR2MZx8q0(&r$!M+=b(D=$Zd!7l8l2yYL@&LC_uA{kK6) zFvJL1HbSkA$<)SaH;PaaIEF*ML7J*m;2oCb&zZOJc(7O%XTkdT^5pv=$%eE4QWyN2 zfKzLUs5JB-vc5a~{Qon%P+~J_Z=gj`Z(B_Oq~Rj??$5PdKD|@uE^pI*7)F}q9UWJR z@<3&PySQLGOz;?lKcReSxH8R7lfk3bWf5)S5R{thzcJ@rL#6Nx>2-nYb-yg_pA7sE zVbQi04dqg?7ZGK6R}$Rr#Ww))E&btrb07P~^)dcm?gHfCzpbHZBk_<wFNSBF1JyKh$0}n;!1T zuKSCR9Qy5f!^&d5`UTn=K+#jIe7TzKEnkm56Ur=HlY{7Tbx8_-qsEBW{x@4pl7cU$ z_+!N#y_0OlvxU{H@Feh+82V1iI+1Du_eBt>HC zvfNk%t!gzVMC=+*iDs4m<)o~f+0jD^zqA%G)E^;_+uAYR%j}W~WQZ58vVFHdm}K-A z)NQ?UYNLb^U?k2#8_h@ELmBt%hA$v>YY(;}SLm0Yrpc|BCFV2tD|IgrKMe~K*SyGs z&O|8@B{%t9 z1rt~|d4eUzy`R@Oj57)az0Hr6~y)6b>zizqB=S%>_7rAkB z;OKCH!qm%;B7YXBsCa`dWhJr1|E%T!R;e{EAIZhe=PxJ%bn#))bhr|HH=ROd1u;mZ z3k-^caxh(9S(>j49>hnh^d`WzWb`fK{ZSi#b1gM&C~Ci!9?)h+E6RMz+?1qoZ}(dn zV;h^K7S|f5Ak^k8-!eI^?h(Zyi4`F(h$jpt-UwzG6fWPv-nKaGygN#(=o^91v_Q2!iVSC=a z4~R{RStgxW*zZER+px~z;)a!x7CaiTDs=4Z!l)$P9N|pFlGWb^PDp<_B!Zj_1SKf5 zCsFg#`YI{P{+YDTYl$KKUjW1E2{4Tfu$w>)=*yVw2b8##1P*jp2LuAp{p-Uo; zBRn&w?|*xb{zDq0ns!T+jVcRPB!~+ywx(n!yzqx)jG6HN!Y@d5Be50ak+UMmWHaZ1 zvm}5yPlT;{x(|j;JEsdR*9$H=Wu4~otplc3e+#~cNy`D90*pxD#IWtV_|0Ml*=D|j zICjXQVh((Nn3$wDLsBPUeZ!K(WyX8ar{@DzLCv~{gb~ZIi!t)l z>NigoA-8=mU{2t%qZJo$?a5pIfHMp8L){py|KKhA&%t^)8uA*J(N*L$RuY7 zOmyjV)0rDmhY-%}@vf57bU;u6vo}RH8A+nf zFSn$nfe`Fr>!26INqJLf5yHqjgKcJzC$iKgM!sZL$o?AmsqUrUxkQfG%_Rdea)_PC z?H8n_6(htUS3j%gHTtD0HGh=APBza>2pN|4CpZ3W2s*;&JF%j7Wjk2bNCsY$kr*9J zy|upQulxTSV*UIDQ;k%SBN^g?l;>PZg7gkkHoT2EZa1$rI5AHpN+tuV0TW4SEYq|> zIhfJCu%96pm@cc8V=kW5Ol!=tn8!4m8dW?lLVxCs1i#USCVGhQxI3~wlbKnA;0Q6Y=J<9H9VaB(--dl zqc03ufVm;N_AMQ>PglXhQ0~xiJ-hrzU--Y{3)_i-U?R~5>X5W~%k+_xh4KN&l1oA9O%S-}amYSoz_9FdSey#-8OG?Z;hij~$EAg_33JHEC8V{y#x(`?nR>nv!nTA66U=kv^8Bl|+d;2q?4FD z&Bt)Om0>40wj`pdC~J^VuNYGKFO5Cm1lA zDFBYQ9`v9ox1x48jDbR=U97yYljS?sc`+(wVu|dQN0ro-wNl|Sk>=3&`WTwh2(5+! zN;h(vku!l|2@KgemAWkNiFFK1^moH?Q8mo~{|I4wE+_~`#v7QF;L2?=6MC%Xj4O)T zkXq4ihGjBk-Lw!XCE_jJszI%^JIK3cQox&MC7%-$XFUBS{!&HyAA{6s=Mq?YoI*+| zov0Sls{)7#0dI&APGmd$yPNFs2py*>ecBIU$VXr*ZF3bIkl@M%cRUt*l7 zJ_%OFTJXZ2M{nSG29*7Lq+P^GQoPB674k_p%t#ov>6mYg^f)doOT04zh;JBtQ0=z5 z`-KC(`d#fPdD84Q8xu$~cujXhtwaAjs>5t(n8+>L++gFYR=)C@3*VTHM8Kx%*JauJ zd?`G>gNMM-IXi@tL{-b@etn*0YN5+wM`H?F`z3{~S5C`%YV?m-YHMtM%%n^X!pNZo{RDPi#cll}vVtD^)?mT_FOc zTU1jnj(|$%=CqRex$3iz&4#m1>G1$xCkFxV`m;_AISZ>;{aMsr>G^^!wf0#)+d6zL zxa*~=b3OC5?4bGvj!Jh4FR9btPMy#Z(C>w}3s6_w-*ZrpMms6Rt{^&dg5jd0Z+D zyFD(_`!q9WxJJC88An{-{w=G`J;~-MV*hS+c=`x(==G3Ukvv(lO*|B^^h>%vsqK?J zEpK%nN3dqoB`jxV3Ij?6HZv^XAs!M%gDoTF(J$gx=C>~EY3-`z&Km87@jZA)g?^sj zF>;D~yR;HHo>XE&6Ir;pFMku{{N`ZcR<;(1NEbzTfA@=!1Rx8l(0AFI)6?~%fHduCp86`C_*EIN70Fi6SotZm7;?uiv*9GE;kF>Qh^#bMz=4$NjGh;3g<4d$!^L z6MSnAqr*vNt6Za#!2Ge}pyS$T>r|=6Y1-zsdXv^N1@E7f5UoL3VM>-YE0Kf7ai(87 z_2QU|TfJ6yC_=Y(x^udnnoMr`B3nFlm#!82S#CmNh+jAOvo)BGmGBv6waVc@^dQcc`X4Y)YRO#;VZBD02ZZ`dJ3ZY?+ zKmDjDyann)#_~?7dtYBf8c)PRXuHa|rP5RJZr`})8BCX_@R?I%^o>&HR@Y^|x#+uz zkZ7WPIbU6y4j2!CaUSzv*kciXOI?Alx;RQE7hW=ZQ^too_Wl;n%5N<&e~VU6-3Agu zUPaUvWBc^XW`Q|)kDPhxa%s?PZm%-5-GK?8k_|Yst>~&(^|-QoiMP}K!Y!zhzZ#(0 zf4+Y$m-H~*Y>brKEmHDz(|#kqUbv;8ETLQ&>TO9^n*98CCe3E4CR16abR$Q6B0`~# zmoih34Uh_qRDn_oP}v1_i)zRa+Fd6zHIVQv5teRB zRl4Ta_1+DZELRo@$3at^8pU&J=H0Z%Z(W|+0*5o1n!-ZykjK4xDFg7Wg3gu8gTYn; z7tLiyHFDYW&v`|gDQ_Xm5vKl(P*|(fnws@;-w&yemO`u#69mc!3ZAx$?j%f?ez=+|7gf=EJtB9Vryn>NwPpbm$w~+ z|9kAq=*|)Q317Zkq`vvl#QPgMnrw3HXB%8y`=ht2&1j3|-cS=Fo>~uK1b^2n9Un>l zy~pPyc6bRFWJitnk%d2>Li0F9Ck!B^{##RSLS$3Cti^lXq^W5tSGB33xxys4`GBg> zk|L7#-!D<(KxwTkw$wS@1PN;!Dt*nUi(S$VQ!Q~N>>oDgSUJe7a&v!Nzik2AV5-W# z-NcP>rSHh5O?uSLVbrVgqEOS?R2ZzEBE*&8Ve{;&vg5YAn0M=1vtu5gb_Ve3KIK-^ zZVR%XI=9Z48hK9iKSYPB!F@&pHCGBJvcWkHd^D2dTMJ99)2p7I=bq4Y zVRtUl&nt7iWfx(leDUUh&;t#d`2I(|e^*qh_A5(W=t6sQQ&_eiPI8fypfj}cv9~i3bZ9D>DGw{+ z?#x~(8Cp&EC6Emcb@FBIakcaeQy~X!5{*G~trY>xFQ(Q?J9EfejzD%r32c&hk(0-q zy<%4KthE#!JF%{M#wT$$>JoMV}@g5tyM!Wd7XNx2F7_iQ8m zgUl0|rAw4x49fmM>DE}u z^OrQnk6CZSE^rbE$iE0v<#vjxsvPmLI$<(wW{)Obf-%;#Js(D6HiV8AQ_#FsUS3gS zH7nGIyqMG+N-%XaDHT36^xck!5cJ*fS7NRM)?4%B#IK^f>VBGiy>@b$*U50+;O6S~ zZp+LSei|pz83X-uuvHiwbRnBvxA{{8hO1DE8%1)dcC#)kk_)aY)W((Ub*{{p{4MN= z<~Km?mFFgZQRxu^E=LUI9q!8x^!-aiy=!f*J5JH4VV4c= z)DUV}W3t7{1~PTW1@a+V(~o)tVjJ@#ubS9B>4x1WJ-~_2?U$wEzx9}A6M3hm6-S9J z>#Gh%Wz|J?t*37L=0&d30iL;fXVLtH)LP7${nYJ%>CIs~f#T%SQ)i54vE46~LVVso zjduH0pMnh?Q_J-F9RGrj+{$;g-kYrHxa8KF-<5slc^Zsalm)7s7ClpGx)i-%rd>LB z_+-o4nSgt3`e5$yNnG$#+zhVoce@unYoFDz_oRajQcDi4VY7TMx100zH?5DDQ-#_& z-2As597PpJu(5?CfZ9n5)I?Ti3&peeXf5sTgT5!dt~siwo8&YM-`Jmm29DL7>I+lv z136B`2z^&ca{tIj39`b}M{AANaIZp?0SBq(N}y|lOMXbmD#jr+u+c+A{pf@J>=HUR zllnQLk?gT5xJ)Z6ci5AdhBdfvPmpDy=_G%uv>Z1SPnke~$@L>bZZ7k5;GkPt7qfCN z>TPL!k2dPgF@WvF6(bXeCz?(hEVYR4iy5^!!6;$#FyNxas36%=&gq?Yd9j$9YYUv(BR*IsmCJKc^DZnH z(=%--yYXvcgZx81O#6yPWQ* zaicxNkbGPG;Fy9a`&-tRV7bw8jk88HLUrRmGWb;vG$;AY2Y( zbO@V0yNiGLR&J>rH;wkS3#;7DVrNFaTs0xOAcCy3EKQoB^877%{1cyvU&rfg!7Va$ z*D%!3MVzI$ai-svD0ZMMZ=vi`{8m0xR$qVPL_+@-LH**sy66gVWM}< z(a!XnVr<4+e8kIlBW0)TnK@za`(B;;yCj@#8|BoGd#>Y6CZDjSjK?r6fBgDpXcrsB z;Ulo7Hz5CkOXhYNmL_i++P#Ui)8r{f&=mm9j(M^7CWGh|%K(+7a0_u559~P%PLW!6 znjX5tJ9&f8(t577fYti;B+Wne$vhN50+;FYn>b5Ng*NOW%D6l(50}?ph^%|)PxQ#|lmpX>tK3d5o|HD3 z5uCPsGip5xX`I(<@i+`w6gg>G60;qAxn9fOtak7xhYjzVAkHU&^|aqFg*hh>7dpf_ z-5t7}@q5&%eQ;-2u5lJgmoeXPQb5M0X)jOT5Ej264SmGU#UNO_h)1T<-p~t$*?z@h zck#dr3>P~Pf8&4Er18K8f5=&^dwOZuoACF~*y@vKH$S_e+SmlWDToLFU=3$ zmr6_Xwe<`WuLK~mRp5MA9n%GOc>+F_*~_M0)vH06>_$Mp4n(wX85W0Q@EzOu(M5(2 zi#z9~Z^t10%?TwYh4@8#95_xxwmN+pbgqFqa>l9iNr7MN_np4a@xCH1AGhVGmBqyq zwR2n<4uv%U(D*hnm?S8)t<()iItCv8$71|(&fN7SBD)O~uZek{CptZAdLLm5&mWPZ z;VdzYgMe1B{ln3(DXNCi8?wn%+2RzTy&LSl{3=FIM3jTkG_iARWXWL<CO%H?{%-`NZNZh!Fw3Gf>& z9R)R8Vu2hNo~ABHAu@qGUOj#~%98nuJrQ*&j^q{_c0M{fDbJB{REgAf$F8M_Qm9W`5H0ChrQq-n>yrLm(FXB8_U6Pq$t}79 z2`|fb7IMpI7$N+gH01!ozW&M)1RvzL>6Qv)Gg{ioQ3W^GTb93oNp03S^R`I zCmeeC_NJteS@#iZjURD!*lx0vA-Mm}JUo4i;O0Xp)J@+kwo7wHGTUHpqnx&>Ycl}Q zh;T7LZk=lw1GpA=)IJeI)rJj*WiW9d0nZO=oreYWA!AHV>vOwPM#52zi!h7cD5P`8(xCPHj24H)vx>a)y@==Xtv;;KHjaQO6DNhyIi0*pFp5G zx2P8?XUsdp);CA(A3vuHb*EkM8wv&J?JR%FcF1NH(7>RcYTmqHaD%t2j;twNQga#< z{oA`z6ct<3%AJ*nR(Y_r&rA0Mqi7(7)5W8qn8C1B1b4uXhSBmKUXo~>y$xcOG{s5J zw=eo)N?C><|2o3K*Xl#%ICk0cd)){g%z$EapYzL(uiWdrb|_kA<=Y=ijgDqOv$0&m z*KIYqJ&8vPkL^3b?ncqry3cI9G5?x|``ebjuj5Pk_W^?DHUS@=bO=O({T*wcX+Z&A zwyjGU>EN%Y+bxraqhs($B^Cc&qdVOw^E3Db1B>aC`=PGf&qkbM1;knmHeh#%dHMx` z@kT|uU|;*?uxQpxwqZlpe-{n7Pdky?EG?<1D*DQT`s~vCJkY;6>B=km@`z_&9%xPe zYQwR*x5;Ft)}4p_OqYOlCo7@z!#(v?zENs2a1uX9bbVC*JIUIy1sS4;cGffer+iSc zc@YDqlz!~ihR&VM{V?UU`reZH)|vMpIv!dKvOFmX&1_&vDL`2=PW%QCkT|7q`~IPu zWJFxp)s@Dp3^fdqkq}e-6M6+*wx7wT%ePgUe1e0!z^O6j&?Hy9JjG5z(!}3uv|+|4 zJcD54-o5WfIj$y2sCaGyfpSQnp~!pm2&9c7&AjS9}DBN->sV?lHasu-eS~jCimuf zYP?Qln&u2ZxXqD5?$3VY^{6=8z6>`djv0J&CR5d$L03_$onJ}SF=srxlASlVyTPJo z#0D2Z-r5>8m93v<$zN#cpZA@==k&1$_vDzk3?CC+VE2e0t6vQOrpL}8r^^X+3YTg6v31HeChZ6skIqv6azFD(j(4i@_cm-w(*Z!GOC~py*SWGDM8gT(so{X}B9n^s z;!}ORrYCMD((3sG{~OY};scla+PLEkuTtmcK006CY8`w>NL=k17Cjx~(9yE8ee0@f zRW84u^)h78#YC8=!I^qzB~~LKa#d30WKV4-I@q9KYQ7*up+qUT1<#~k9Pg)HyjHeA9@`&rlsB| zwYA*pLAI5lOVDDP&o}%4Ym9E}WjZRq(QJT(QM~46xBI~`RMO?h`8S0ayG_^SNG;={ zr_>D?nm?MtXK7(LZ54M_hkC$p$BXwQIXwm6n52lxB*p}}NT4cV=(8WKVYGo;Y|cs> zalPtwGC%4C)u~Fz<}%v$dEp-adRv||CDpCHa16L)4P7WQ9C=b3U0SOP5HTGp99>)e zxq3}IlzLlnzlO^e6T;-##atMRwO2jKSV<2&pt#~~g{m881#GEeJrOS{>xPDI_Eq|F zR8`OF6?8w)%{v5Lq1dNVtsBs|n9t+SLN7QU~0b7}mp z#Gldsoh=dY#@^^pG$sf|g7WXr=(PeEs|)($yaB&t$h??Caz~+h-uNMFTgR9{X1Q7F zB)fgX9(3s*bpfS%xDFply(Q%+ep`g9?BWy~xT69zsJAnGbef}zZ-Oh3v0}~a$=e`%o79op+_L~5Mvq=9 zoxxszrQHZd@r@}D-;y20zUjCx;T_=!kpZdBpBy1g+@zfbxvG8+^5ifM}N7E_HK?z zj4+8ddL3kO$R8cLuFx))mTq$?;{4xK%HBvgq#0KB=KG;ii)|>>H z6%g`jE*cjwAUb0Sokdn2)|1ztS8Q@L3Ku6@7wHabL+e%7vgttf4x z!S*qzWWIc8!F3fca^yF(kp_DXEUqQpEf8&Is1Y;UUwpg=;`RnP;AUh%I5K`_+9_yy{VP;_+t{L5$owc0s#Pc!$E| z)ZTf)G@e!Al%!;u+YS(7dZ-)1McA?9a}*b|KLyT`sG+g!SpP4Wz$o{5ZPFnOmUij})jL*Z%2Ef5;?d;kMv2=9u>1^||2?7KZ|^Df4J|JN-v`~nD`4m5LdT-4} z7H@T(Mjoc|KM;O;KHG*musN>(CX{%huW=EY|MxIyEclXdHiLSHcp4x1X)nkL{g%G$ zJ(MLrdGHqty)wb_8pl9hFfUv!VcX1lPJ2QxGy@uQ?l4@SQCBZ&6Bcb;yRxPVt|wMy z$=SKBwy|jXwShrpsipkMbgv6q8@2;uk%W!O1#e12uaF~#xm0@B_nV8Laqm*gtKm*p z$&Jl7!BzVSyh(mWR10161Hh!>V_2)LjtikCl+N{EbWr6+T!{F@8@7IU0 z=Wi)qIJ#hZCH#D7E&R^Zd%@HQCv6!tEFddqP@=|m7nr5IUYNgsD}=8cbckbb9{;6& zEoi}aIb7Iz!PqHQKKxkm4YtKmr@~*y1IbPJx3+iaIHQ`-s+m7OnYz#s{~C!d0|$4a^_&p z`{1d40E7~l8zCw_L67%)QE%qKP(X=}_eu+UkbQi`re{x(Ll8|I6MN-0v^`w19q;Lhgu%(M_)R4zffv=zjtD6N#TB$+OHRa+c|3Kmi4n%O zXX9x2TZX?rJ2{C)i%&gCD2Ni^93OE@2K1u@2$zWPupGFv~p{EzMaL?P|KeZ zzFjxCFgXs#Gofqr+}`3}G~KSp7@zL^V;|&%#*^fC0XlVjImVoId-4>Q0(dCvfS31# zz%u(Z&qt=4p2ve(&w`=)6CPrHRqNFeH)lqNOyT92Zd zpUD-fI@2h}b(9G)F5Y^sKutsps|w{kgrwCZmJJ5+nG=7t_1cLamvSt!em-Qt+)J2l z`Nx+SeDz%(yE0;Ux-+R7_t__%2cH_Vp5Bu-`8(#y zAc~ePV@~nedPS5oT$VYe8eHT^=ft~qaucG_*BT%B#B{8J+jXv-o!yZJtgF~jxr21i zKAhpGiJZ4-n{wVI|7#CCkyU{f*E@n1Rz*tj8?x-}^=0iX^}A3lJsdm02_Poy4Z#ZX z=aR1B(%AkPG4p*(DB84O5=@;6SkpewTkmHet4%Ac%_YPrJ72e`S$kXF9IENC`-|^_ z)?_kXd-<6(Y|SU-e(V|v*pxptzOhKJEa?7jindS8UBurxyPU@|5hY~2T>ZIaoUc>R z(6Vy&WD|8=tVYdIx0TusRa~b+(44&Y!L?um7f=RWUjI3mX?n$z{&!32{Xrp_i2JX8 z&(E;@V-W?V((pQ&%P~?nQDNVl9B2kIZSL{=x@|dD-H~5qWlba_0MBh515Z;Z6R1YM z@Wn-Abep`^TUasQFSd32g`qZEy-)r|d2foMwa&YP#n@`1Hj8Cb%*hKo;+A51J56!k zq4BS%wMHk*v1hcalS_RY{>w4E4*H!yYv^ z^>u$&%I%>h@h9$9f-`;-l_k{FR``d2AsZir(CXl95wl2m2lXp@(zH4{S_;ENp#(w*49=4yD^ur(6sFs;Oh1xhg9%DkWe!O*@bS^0 za)Ms72y~(szwDQfiy|6)?g^Mwf(jZ=;(J2l|5k`grrA`A9}j1xNpP<(AWhCL0{m;tm%4-<`VD!ajiVl z^)=pI8D#|XughrU3N_7e2QNp$c=xmOt1!4D0#7n-=vJhSbeT`H3@bD8k@r;!?`$vE zcTdC<-;pmnWP{4k<4tFDIip15IWNBimV))zSn3QWHu2m-{vlI$TDQH;4Z}b5aJ|0Z| zwMn9A3hcRo?~OXp?TSR@tQ|WzCP;Y<2jrd=vm;caN=0m|$*G^X5I8_dJiKSVV}v7a zA_6Q8gm>Cd|1BvhNiCVUUB{4C3Jxr1)*s_&Khyd}4XP$~ZG+Z-Gwd|>XcGJ|FpR(l ziuW#yQ4JZe@03WBrU*Dgc31HAGz|Lw=TQx}-_R6REMA1=z75`5x%p@khk{BT5WQsu zth5m+%?MU0C7vWZo8f>QjcpYktwsnq=R3Zfo)*+~UQU9jdp z=JG`f!40}N$4zv8ou5*m&f&COA4FqAi3cH>9JQ2}IdX5!hliMY?PMHZL>m9{TcDd+ za++GVogkDB70ih-#9lIi==Y2fbph~24`TNdi+{y`v;XeFP5S}BKCD3YT`K;9MI1TR zkLaq##zN`VZ}LQ8y(c_IkPd0CkKt;DrOBM}CZ0>vZ?0RKdk)Uj2wcTjgyQ)ATdp1| z`}>@*ep+|9JUq70Ci)sIi_F_Zl)K9=>^E8&%n#zI{N zM~UPkHJ~3`AwCm}S*L@;;|g<(QFn6(8!yctP_+z<*fgI+f0q=4j%lP{OlSck=r&8m z^y6Xm*%RWnIlDYh0IM~z=%gtpiLOVBey?VQ4^p`pg&_bYbz;5|RKMr5n{zU?goQY- zN+Xp=L-E$;>(6g}i%<7oZ-^*Bo#s%-Ru(b)bRoW?dt0oPfYqzDta*chzg165e#XJ4@iuQoM0 z|EI|QKT#e%xbRrA)Yrj*dIko3)d7Lm!Q9)L1jOnhv?3V`vfF}dKMla@=9u7I1?8Y! zPNc%kr=*5^l|~#3d!g?W$;sajOd(~6u<9up>D;t>2w0K)bHpy6Z#l~ztFef4hvka^ zq`yCQ<`U*(N`0;yb|5-Owf9RWYOrCEaqcfbHLx4*EGWHJR^UKE7+093iY)|}66V|L z=L3R!@xN7i>w(W2e9C)hm{@mNGx=d*NHkmiI39rH0D$QyJnZQcfXf0rS zthUR>3LgAs>Jx-drW+_Fj2{#%$qF$BfMQCXjkKtWKtQX_bL&2%AoD?hCL$Q*7$E-k zlMRCQtla4+jB@pd`@ZwnS&NRcMBe$#el_kWbytztyG*3+XE_P8f5i<#xiQJyP5l#^ z!C%do6HnS=qSNu5pY)5A{VqZ_&{Qby8$?8e{^2OCnagQ{q{G2~oD*zzVv{gY0BOmU zpBdM2&r)J2;oKs@PU8`DjAGQu{?XB0Gfcp9tXuCbur3V_uWQ7V#M^#3jeT5lHgi;vY2Mr)6QO!z7&2iJ+Zx- z-M3t@HKh1ui;=o&2=oUKRX?oj8uU;xcv)0KD+`age#qax7jU!KoH&0o^Z>zh6Tu-z z;}vvBQ!dsr(XrK(U^MbZA<=dwMlKs#%7`sB<3Tlc`)`yQh%w=p!~BJrL86a-NK#g1 z3d%BfxZ3Uh1BW#p58}RclS`PrO2RmBrA!`rGc$D~IT$2MAp5aGLcY^VAu6u0@T)U{ zj8xr5LJB|MdQ(8`(>BC{qX85J6+uN?UfC6_eCV)+|A(n}3aqRRw{&CMwv&o&+p5@h z#a^*(+qP}HVpMF~oqu=t>2p8t=l6_vK(;7J4FgBP$UJO8>N_(d>0SBBMb`{FBIFB; zlLvA}XZ&OWx0ULCAtU1xB6X*z(cL5=@-h0ZV~i2hI~qygVXgdv=)_ow08SO+#^?5M zT2NtF4%nG)k!6mpj1o#O0NNCU;1HohaqkEzp@kyIq6ZMzrwopa>2Zf5C8IbJT>}H7 zOJ4JUUrp|{oqXS*h>Y2p;#id@ZF>MJr~{OX0YYt0RGm+Xh7GbEs;58~;*6LNS3#}U zPfAA>$br73#St%R^#|SJ9vj8AO3|5xFD1+28Dco4zPlOeb%vMOg zm)@$Rsl7^1CLUxu4ZDelwwe`WDCjZsklf&n(0Ri;%~%@|2mwcsTYv$MYE{!R1#G~T z5xPvn##{}qkV`#5YjeVIQ#`+*c+)ky6&Bd9M1vxG?ikj4;z2i8l20__pHz}UC5hGh z4;QeCM4SYJaS=AEt7r&XB5Fq&ur9G88Q2isj!W&YJB}MhnFb7!MaQi|)q@8A9vU;! zltxZht4anBtd@6yCdO!7m7ztQpVh|@u-ti9A#SJT82w!6aj&-RcPfMudEdmT!%5?* zkk5@1VWbhH0VHWO>Ud01FZ-oeIG+HG)DLjOvz3{jG5`m^qAD3pUw;{@wd~|}>=@x8 z+jLvLy@4n|q4V17t&;|6<7L8S76e74M2Iz&o-@-y-Lr0QFyP(Sh|f|R0rLl^s)GoE z(^SHy9ZFi!pvT1Qm!xjCP%yn|sk!@2k8m&i&CW(&~inD6sZZ~g`t)Ga7pa%O+UeO zX>8oJxy#Fv!HC?sf_gS@M}PF2#)kid+4dh8l^AB>c8IEdEPS5QWn}9VV<}-$3xUo4 zd?I}xF5@W~8eqt6bX)1lrUg+JJA|UX~h9aaivjd?kNoXGfj3-P88<9 z*7p3vCb|0J0>eV<=?-DEej082_Tb3In9@e`I6RR3h||fAuo6HK zGRPnx`0x$lj+~{QWR?}*V?t(w+6pk^FudtY6o^K|l(WoD`VMrgL?;1?*_f=>+9-GQ z{ID~ibkg&fQl0n^cywaBk9neu&iZ%=d1R7wDY+3BA^b|O0HjJmm^@Aldt@|@X;`a+ z40Q#g)`k-Q`bD&${7|dkj&h#`7W?pVbWW6dB6mWp>lE?tAWV)yd zbkUh89>cjoeu_uDz06#hW_v|=O(QiQ#ij|p>k|dbt{hO(QIO3)vuo*fhZ6qYwP_@E zsgis%w$80xJ~%p;yIiM@gWBftIke>=HS3g%b*^Uo_18y+PJDn%=#s6IeE%p6!)q0r zi2CJyzsHB`u|`$PwB2Jn>5lNYobAYwYvEPYTelnVowXd;45U-9Th{*hw(c~6FZ^I( zYo=MtE+KS8RKPhK276BAfsQyr=hFYEWU%Y|JwQH16AdQg4_JN z@%5hJ79*8YC62Z~c{_eOgX zykdzE-V|4vPS{(5g{tcWMz*$7vp~WIPCUDt*uN1gqcDM;tgx3 zk2%BFO0PCr6ComV2?@mnn^`Kf#1P|7PC1lzx3#{r0x%rN0ma4jN+i7tSy&Dw((2GpmuAmc@vlkB8r&6@> z{C}-BTpTR_Uk3?Cs!$_vT`F=R7;5ToZ7?bv4%YvMN{ARVG_{C0+2|QrxQJL8Ip{gq znNs6pem;`=iFPG!ia>#IuqW2jQ2w`ljn{hHqdzZ@hp>a#$5_`G3)D`nNd!4a$>WM7 z349R=5THvKuCZHob~1A%=SqlHQgD(~uh(F}h}_({Iv`v4zW%pcnBn{8{=BjE{y=@` z2;+*uEiXMYF>=?K_BV-NT*e*Dv}6a+&C|X4d8k?Zwm8X9DS!M=^iARH6mYozFz9x= z;p53ye0=&&Sen|KY-aXXHe-#VjOp!RlFlUP8^krw+pk&`Yw=e#eFaxfg<2iITcVx;XRr@?6q?u=yc!tw!EPt7-`pVC!6yXKsM z&dNkAWCkwu5j^n7V&rMO0ceAg$1pig6rAjq6@!Xwz%#AF@40b_4uE=DI3xu&DYQAZ zmch%WEmr_eCXYm3GG?m4AO+~zu~7OoNEbz@TnJk!neJz$D4Mr|Mm2Qu$<6+b+a$&)?S*;UPPWbaJhyS?= zyH5o$ebT<_aUvcyInY3pl@^$$C^E2Y#lyRBl5fiqU+Rg_q99EIR0s&z!Rl-jjkjK& z0dl=$|BO=Rr2x!OgemC3>?%6H;5U=n^j^A1EMP&>`86H;*9Sp}`F8gwyfO|yaF#Ndw)(OA%K_yi`%3VgD@&Hzbkp-4_|3d0-2 zqC56h@B?4JucsCnUsDw~1o+on?7^kxAk!@H7`s)>IbG}8Yq@m`QHnHS9=c_LKGscD zrTG@;RLFSt2{+bN5fpE>Y4)7yp&u+`%JoESRj?%|vCjV@s7|0{QwkMZAm8DAazHzC zm(rrWUYOlEBEnS_yE~l;}`jr)S+EjSJ+fOJA+5=WfXhEn_uud z+aFgj2Xcr6aN1QZq3Q#~hnkumx(Jc<;FEtnWQbAu<~7&AmS zTTeGRfy5)UNwgEhrPoE#H%E76`Iidx+!p zYjKATKIv>7O#*gCSmT<-+CnmPuuJ#dp>fpXSLQxxY{wLEDNm~?zE$rk9dwPdw?p~u zzU=Xk_Ut~Da;uJvt*7owI#T;q}tjvYsTlPvDjKo#{F}?Zn z5+gN`W?9rKt6(WU7Qk{NvtSHY8TNy2Fw(Ltmq_A;y|ta;=IHAY#ypR|vFPNc?q79p zn`J^(nktW4~AaEL(quHA=BQXuojnQ+!ynPi=CChVskDwHmzQ z?^stWVt-+=bAJdMr!`kndw7of>rp3AGe}`nhA~j<2m2;tI&HVp6Q53>SN!#rO;as4 z$nIw6rZX%>CkfW7W|n6a{Vhj0tJYI#C(nk3V-@${3th3`x9`rW(j<7sPL=uYAOp}= zd!GVc$2mZk#nLKW3*u~&YwG80q9zV_~2V;gANod8+SaNRn!n4Wp(<{ znC_)t^N-cM%M7e(*D?OyG!u(TRRFwWoAI)IN(YGu>oP}7f#9O0$5Ws3)J>qpPmnw* zGO?q-cl<6;#lPJ5j5WO;yz1@S_Yi8gk)t!Bb-+9oJlN=&`V3%MmQZHp3=&Oe6|Zvb z)==B`TqxIbX*%n0j?SR%-9be%Z;4@+G%3??i#%gVJj|C6d8Rqtgxj+q4*-~B4Ln$# z(24N=zSuI2a)`n9>s1m>swtHC)aO`s*h5o}lyz?;EHx!XT>s}57hhFt09xN-DQgHD zto@zI}(4@z3fru ztDTph7m6dqm@#z2C_%T$P|)WBty?}Ts4N}{Nsy>5 znIZ63NsHnG%fc#G==i~ByFeFJ6_<-=EJQ`Adw~5Cmu~FEV95u(1{!dwoi!3aHV}Oa z;`{3OigU}k%G4$P(IVj5Wk87NRqt#*Z&En!eJ?P6gb4d_=eJ92-wRF~Wv|3Czd`|; zBju|d?90VR%J_GEj%=vJ8>E%`Ey9p8#%_N%>((R%mi7268sz z74I)6$-1PuND=eoVFD1bq>FfQTh5OayZq(>l@AUEMf)RtuI=ELXs@M9DrZSM z@z3b?^|3z=?jVC%`Jv9_ zX>8{vjwi+CisdqK%QiC(3QNBfeH$IlKTz*^V?Pdf&9rcmHJ2~9ajzt(=yn(mcm-P`D}Q2cRnMtcM#Fb_p4pGdhIc_^`Pjjlpt zW8lwkHWTq2nk?gfw!As0Ck{xU$q_Zr(<*&%mXk#)Wni&MV^ZfEwKW~cJexYHAcD*S zFYM2RQ(j0!L7N*xkb^y~rG~v#oS$==+i+_-RYm!`zK)9~_u(V2v{DY0o%A3O*Cb54 zR*icZY2*Sj;;##2&Ib;G3as^4tf z6OJI+PRFU>2tChc>!_-mqNR-#l4Tshjg;XX^mf?v4XE=Yep*shx@sL-&=ZAoeBP8! zSa2k;p#oN6U1FduQ=Dq6he+|1^sR$sL~T!7FxdctNzNYX$BMP&GP95D4X?E3OUOc& zlK9;S(dyYBr%UleFO8I11-d#&lIl4_Y2HOb?CSXW!gJ2}V-=)mdP3@_wT08{xFjbQ zl+?=-j*skihhYrWQCau59x9s5mI-g3&@wgLhV_2j&Bym3Bx7#_TV3lG2Y-&cuh_J@ z>J$ON!XfLaIwJigMpz^SV<`#QxG|y0foCK#=R7QoGZehgCI3LO#Ag*53oi?_97=`U zfVf?xra6AA+_u|ipTH4Dhisi@)GaiG zpQ$Vlr6kBUBprIbe6`u6qS~nTKo#gj1$qD|pvnofLq1T@r6J;c$*5Hd4j=_f)M=e$ zD8Raoj}r|V!`tWz=;3Aj&^-GXMSWuQaCqbDN`BAOmpv%6smLGkHoUzz`?zCF9-OX6 z6+fg-S;>$NG!Ut;k0tJu+J+rFFwajtNgn$Zgqce=Ls8H<9k@tK;uKu9zLuVg_*tF8Os-AvTGQjd7{E zk)jYm(9CzAJKAp2C!_KHs4THW+b!0n1xOl89l*_;=KCCoq;4HVjVzzVCqxFoC~aUr zVTJ`{k=&kcROz_mfEA?Hbd_rZ*|M!aTEmKWoR%b0T`&lImT?j^e{)-Qz1kiDgsO|( zBy=33K`X>*Zd;VGhf7{Rcb~P&Tceoo3gyOT4B^C=HgM_;zW@Vd_DKo_IQ&s%pW$`2 zfPoO|&q3s_5ue7SK<>4JOCWyb|b7rIi=m3b@V zsAXQ95w=WGiH`%;ZgYT=YTdoDJk5xy`_sKdddt4Xf9yY*lT=|WYUxwTQnYgtbzH#V z2OrfPEf&C8$T&1;-3Udy2_Z!;38AWjB~Kv9D`BzN;9(iTkW+g1r+4z3)=pVC^3iV1{F6I;PZ0LJz7G}DaZF(!H zVV#w6DgNp(v|2hNYT-5_bx@pf{s{8(JNEs4TfUw|u6=$4`8>=^{cY5}NJqgV6W^K} z`z;BxxrXl?#hu>dkj1?u+c5{}#D-^uzY}DF)gX2!{?`$=9i{FnaT7KZriphO?V)!_H5jX~Vu+-~3C3&wo3 z_7G-TTd5Y+TjDur`~vJ0@+4F1s|gH4WfQAc%%iJDlHCTHe!8FNr^QX@D|L7zxgC2?JDPP-Qx53(xCgQv$x76(fpl7(hDRYAu8^DS~Glort;3pm3=7f zE8T>%k$PjB#hgpw9%p@ES?ABl_t z>uHv#+G)arm~aPkRE(Ztj)96gJ%bV(pR!}Ha?x*9i{!Cqt* zA1Y4V?D{@JxyOqHU8cl?0G~mf-T$aA@ErfQ`IVK0l|8k;@PDtG zpfPi>{U@`)@bmxwl$hNk(4X2@&i`bUR9`7DsMO36P&h!V7{plMZYifc(vQDH|L&by zPg$xer2^6AIm!#Nk^*Q3`sEcxKu56?;O+JDb%XBf)V}Gl0gdk}?K%j-xTFfuW2I)b}JhoG;0r;t3Q!EHoCOP)veD@_R9R&{ho_lkHL^{vrz(S4Q{E z$%1?!X(W+6aS(2rEn`l_vL;X~gOdvm8v0h92#`O|SP-!Muuo!2P;w2Y^&(SEHRos& z3_%bIHm|MO=4Qc_?|%)H$Iohw_eWuEh7#-&)c>OH4ZDVB1^gN)JAcvg6Im>pF0r3S zWctldOofs3olME^B5|`0L~;nkk2g9R3B|WVHaXNSdx;F?mqK^}6iQ%Oaw40h1p*uL z&)SGfAS0s~jh7GP*Q?8jSo1?RW6ZF)glaqr#NT*iv7QnV5xAMleQParX=E#K60*ZY zQF&!Tsh>nslkOl{1mQ`ma@aqv8c6ti4Ob`@l7#*)br|8WxmHtEKGQJfNxE~|Sq*}x z*Pv6T(0^>Y>(juf$tOJLpsFET$v($&djKt0=^0a0Lnp?THs%8(czySD3br2VBvCLs$?OUm^#os zi)Lz+n+rw9)Z0e^ndxR1djs4O^z1guABf>@p+GI-i<`tke9!R2m)60TNE%iC>8Zl$v<;_~ zM{{XUoivyxo1eUObeNNRVkBZE#{lIAMczWV4eqx-76TZ!gK%%e*I7cS zYWlU1Hs)a~lK(bDdgp=trdi_uU4k0)`@{q72cm5Vo%-SVtJe z;s-DEM-S$Yh&SGv5^7G;pds! z;|-Bi4LlXLLsT(%%|yWA+`wg7CGH|b21F=7eNi{Fg{e%$%dT8z)bqO~>F_Jr2Suok z^WJEieiEIM*@5}LCE+2D*Rc3@9bR#ov0Ua5Fp*Qx zi+k*|gMdgwvTj5@ZW<(C7zWz{fLD;FO`>>M;hD~HkuM&X_S|pVjB4l53%gIfC1(8` zk+st}i43NKimL{V`J*?S-=*Dk?j)3BM#`!44z*K72&fyw-{9PZlpv;+MxEjU0YcIa z$s-HIJ{)iZ-gJP<8n0SKL$>N@gvmfeL)Fbg&ilH}!#p9#=7mj^{W(}l$Wjchno`8c zY4T#Qcv$7Xz(lsFpb($p$k?C+#gJtB_jL+V>poJ}tP(?!~*xQ?fFcUUq zd>|W)WHWg6y{z?duoXhug&A{m&KV*>3@^>L#>N-nCQ<+t+~(c`R%%wd!HeHMIE4fz z;5ef#row76UJrTH313vs#mJePQYahLLnRQU#6tw$!C<2M(HfLrYzQ zK{y1_jz7-+)tn#*+4E?saQpRiRfAA&{D8(Hetfo>)~ZQUpW3G-S($*hG84i8wGh5~ zcBwg6A5{ROoV@u^wjzn{U&Ur9S~{`c192V1RiwjKQix$$_Q8)xFZ^MQ%_AlV7+CM{ zNJX&KWndfyu<>Bty5T}GR~u@|t3n(#OoU=&lXE0x_8~dM15#CK%Rj?BtSAhX!j)PB zmN;~L+}e#~e-eiflp%}JReFy8keJqSBwjRpC+-7weSbsc+ULL{OFZRg;MJ_vBqHrP zaXm#u)NP^aoj!W5-g)jOr_E>IL8zSxR`kFg-uk6&G@)_}QJ2IVbFYjmW<>R-6tL2l z{op73J5M+I=D+Ohv_U_C<`e z*P-e^e)HaE4Cls+8lvF-ou|hUQlEXWz23J2gyYG{OcK|ej7czS6iqScU?J0TOganW zx~?SKE@SDGVPAJM??A2)>abjMH8Kqjpb`aWIeG`?mxeo~t`hz2Axanx@0#>sjvj^Q zZO*EL+Nl;9AwCgy+@PX7!62TSycJ<@ugB*p>I|6$vLK3g0%RGF`G#_Cz@De0hdP4> z%J*BWwGad~q`KA{<-`3mhso~qD0dKnbmwO-PO=c61?R(C&U}HIRL_#U_{UOnewKnO`^6eX{#&ZNQ~SWzo1fmr7uZu! z8A3A=ACo+DgF6nf2;C!!yHSYO+L8q+_TpV$qEZtibc1(EC8l~PGjSQnQ7i6JTsC(f zYY(!XOWWgIgtD+JdbFhUu4P-fxw;F$_Sbnpf=cc$PH`{nE+ScwfMrs4J+@5}Pv7m` znkxL4*-bTBMM3U;8`9H@h6Q-Q`3AS3!L8bOCsJ1c5|~(plTx9wo$E7NdYE?x8d(=v z(T*wI&@+z`bCT=E=I|jUX6iwd@#w)N@#q1V%gHn6vkp4Q?oclP_IR>BY}Xa# zh@Ap~6&}G~he|U>h)z3U=oi@p{vW1(KBcQ5S`ZDL-6!TldQzG(=!TbJ(}aVXDTXUI zu&lKmhuPZBz-5lU8<-}bo*uPLU(C@YDSdM570#6@*6y+Cv;kI_8Zh~r)Cx3G zO3Pgx@t;!4DCk3=C1n#P$V2JEy>GQt-ud76Lw$1 zjo;8j2V`i@l4dE zfPvKy;lz~DhLZuu3$Sz%VD=`lUI#(4TInhDeCsH~jALpGXznuu)~UFNiC*DM>SqWe zvl$vgg}Y6ALB85Ba1v_1EoF=j5AfSymy55;cp^XT9x^bkF~|96f%}=50yN96#`>65aH) z+RyxjWUYyz_))2{wkl*BUw%yK`Qs$Li{fh+J23RVTjh5H1itFhU%qj>Duu}*_qlhY zx4cPaR6sI&#iA)CfSCkl$Om}W%Fj=8Od_CfuSQ4fQICx^yNQ(3+cUkJ4q-6^WjW7c(sZD4)(gZ4H zor7H_Xi;~hq5^drR&;N;!E7IAYRyLw{E#iMBXc62e5xBG8OEkGuJSwkZHM5);b?!8 zM7YD2P}y|Zqkt5pmj_B$$OnketIMrhB%#l1_)MDtj3Pc$8y?ba&OB1FU+ROi9y?Ji zi@Fs}h{B70Nsn?7{cHA)xc25}eAR*pR--)`0aT-XuV*dl4dsafXAh6>UckD}xESll zx<@J}s~N@cCZ@0VM~D@{@=(IngFq;cAHBC@l0nE!KbnShhZg%9~d@wmx$Jh2(yc_X*hj51x;;=uSA8tSYeWbnix05V0K;%x4R_<>>)Oj0j zb|II;XYHavvbmu)LqIP2{USXgxF1K8$B!0(_=fzg;v?`sG>yf<`F}hNESxM{|Bsxx z{@YOjVdh8`hymjQ;bcrDUIs%2W=RE9fS`kLGW|Cmn(9>gvmE+kRyb(6<^M4&)G_O$ zNcAx?HnN}+agf3u7`&j3LI-RCJ(2h3l88l+*ORIDF7dfu8!;~0@JBw@ki2dr@hvP=EI37TmY@gV0$;`44LA%gzbeGxZTTe)JphJ^uN@zf|Yke~n(dMU|k))_Dv zJ0vk}Pf>(LSbfG7on7TZTiGd6q=~t$C7sLJY(X+qA^>MLMHYdDZN);Ep}hUc%6jjB zk&JA}Dy<$PxqbC#eFUHOh8F=(sR&Add`w zLCLmPX24(0uFE2dcndFSG_g1=(dw)!DG{fN@HW3G+#r8yqqPmpf4KtmZDlDns3Q%l z7DDLMhKl%DO8=~B7)9+bar75ylp+-2!{U+@P`IRg$db+P=6zrjseJQxREPu2H4$-+ zxGs^*M9Bg@CeebB49h0VJSUJ$`5JA;c#XYQX94E2v0Pxar^|NoX=Oumk24~stGZmy zGom$rXUDm0No){CFfv0n=?ciu5r2o zW))m=Vcs!#rj3@%Llh6J@FEUEA9LoGGE0r;=b9{xDlsJ{Q?Mr~Q?tiq(tc_lRab{P zQvohlInE~MJhl?sUmJ^*`#jVEtDslgggy9hjIBf$rXL^ZJ}G`dihf#43+XHBki_No@#dO!t(W)n0l>2K4i53Mqhf>aDSr9Q4q2S*8Mzo&2!s5k zun2O}w#ph1&URBk%tdj-h7KRixIkIdo0qSk|J*R+8NmX<$3V$K`2SG0^i*kU1CoxJ_n_c^lnwqv*?=F+4*0=r z0_psdM1nPI)fX+Or&h{BrbizhDk1@f=x1!LG9o2?OJ#H$<^8VzDEmBrhwXn;_Ro1A zseQIXv?!L_=U{)JAdxFZ`r0A26PXexRU~f(5-e4N0W>VJ>`%hY@|!TC{aU7fwXg^p z#{W<@7qql3O+KKk&s)eRV(ED7q6MO0j6Yp{PDhTp`wAIhFEtusS8J#^;cJS79r!a>P}5Bt%B7HU!w#sEuYinfY*8{VyR zDQVXD&G-=8WB{9D8jSwJL>t6>d&(GT>ZG&3ZhLhVB6>PomAoJ=aczj@Y~k}ao| zV{_#s@B6)1j(Z%0guo>-0J7UX=P7{6X;H=q26FCfmnoR2qA|Gk8}5Z4ij7Ksv`s*h zytwU6r`pwmM{4;INT9@JVqoucp^+X+?tB`2*0xmR=E!v<@x9yidK6V>%ret5#V#fH zFbGJ6e{C4Uz)lMH;t|JNJS6vzUm_YarTmJTWu>ZbA2^47yz(RgwVSvs z5bBPshfX-BE+5qch)Jg_x2^7kltlo&z)<+)ehVD4(p{NfBRlnURcuu^c`i+?euXS}eOxSFe6CIg z2$}qiA10}(d3SgmtQ-S&#Q9ZIAIsf_y22?BMp24Hr5qDRz$RvZ0PP;gI+zMjRnaN} zdy`^JX}Fkmg+Vv-TC`A*gF-h;b(Z8=#i)$H%DPC%;$|yk8O`rdU8_p=L0q^m>wZ)MZFAI!j_JtIa(t!jC2s_&-CK}9z76Mj#UU1(b;=CYB*Nu- z;E%ApNN%3V2*mx z#@5dllZV01NUuP5L7woBoQo_P=fIO{iUv+yRWFX+i-O4=7nboAkIBuEK{Tg?6P!s6 zfeLoVAamW!7EHksA9eZB=XNzZ(HZgY(Efc{#@WJ)>f#EQH)W)iRmLd5mCHI?R1pgA zYG!72&wj%FHtnlypg}Zij|~GMdypwDG7=U=*wm&g`d~XjI|a2n$|?^Ro>ZBdf+K7x zJty_U!f=bUm~!+*i#8!fQ)#lJ;1t?6zCt5O>;lwB!HYOfjq~u^GO0AFer!C43vNM* z8u2ViDGb$9ij4z061xKsk6vy#hMqy^3pQcKD3TMmd6f_{j8=(v@I+^sHc74r585Zd znFiG6#I+)DbN1x!Qj(k^Y}-hF6=hAk%fhkg^dj3?LpYlo^mHRtr0{WjtQ)5?$N%h= zShsHTB5qS%RYKE76eRD&mGA~et|m1_*^R17TwE7lkXMvIYLo_OP+^OAmVSX#JHDNw z_Q~kIsrDcHM-<9^P08tQY9+S#Pw_%tNCe_hFHyV}TXssQN#j^<2q^vG!jG7g4l^(; zDt&hzx1Skfd{e*9hHyk)K2A*beQ3c>R#pOrS9-&U2TW4QsNuC5?~hq2zCt0{{4abw zctD$|@1V``Y?nS@$#W(e=(d<`2YL#@*M}~fEX!M1IziM9XH8I$R7Jsxu1Tk_HS(n{pp1WWvnuzqllv{cw}#M zaIS*8hd-ocUi7s=+R&Q3hkci3s|${1DJjQ*~qz+oAYh};L-;AEIqjH}GieSIN# zQL}?62+$57jhD7H2n>%4j_}H4f{X__L3LJgg2)!s=BFnYm5#J2jSG(;H zZP0P~l&_;#37t1F?!LqG#YvFBU#{q-XmmkL zXxBAh6r_{6eZNZsV*EN8bA#gB8s(Kwry;P`D;`19h8V8or_J{+n^73=SMb-KjadC2 z)p=9{kCTC2hHcMLh)X)+v2c#VR;;_o@6Uruz|gA9OHcccKXPmj=-Hg(iuB}!RUg5A zm3sQQrE8ZH+<=>dBJ+1h9LI_*H#L-z~#P3IO`*~&3 z76Mqx1U!7EK%BM^7nlHM=W`qgZHSPuHy}IYa$ojmJBdnx)RcSAvn2A)FGCv{I&%eC zsx~MaHRola^j)-G}-nqiv5*=*=(g1|Lu)P3d z{u#y!SS6`>q0K}PH`O*x3vU6K=j3@DxqYgop5d)q9o1f#u`5Z;S*Dn*5LdH2;FO3v z4v=V;>LN?)0)CNZ1xntrgdWiZPxG}D6yp9hRS8}7E<}`Lb^J=Gh?6j$Q4k9 zfUCVA$ga-yVKWd18MR8Z>*>eF)Te7!;qZd2?5tC2w$EKe3Rbu_zv+48_uTGjf2mo#wnv=#43-!I)cu=~txT&`dpT z(q832U!@7+neoj3z)F$ivecUZ7nvI$oc@;csF)->Y&x1zW#zihi)@g6G|)Ob`}% z`_Tzg+j(-2IIH8#Yc|yf`v(i6?^2G!torU}@v_i#?0VrZyb2e;*ETeHW!dlm;J+z- zm?%#ohAc11+8f28e;{!id`AOn%LFSwCe|*PHk0?3x;`cCs!jldUV}Ba(lvPNUpd3H z?fE~?bf&Lzy88g44{19)foFAhrpK1EkM;+VEKAuV+V;|_PAl*4+JltQ>z3{b;!7fT zk-#0MZE~{&iN;vf7&+lW^MjkqJWnFVxQ^ZQG2}rdXo}#41p2L#STR0ujFKeR`z@`q z*@8F}Zy;?}7cD@l=&@d%_2MXLR`I<&Mvo-*&--~E7AN)5?%*%*E%0`#l zmNe}aN)h5eLEV~$EI$4EUn)j_3Mcz4md8W)#Q`n9ZGZt{oGT9cLe2Xpje$ey&Vii7 z*!J7tT;OE`T(u6r9$neJMY?}gmc!6PY^r4BeiPiKihE@W~O4Yh$3U2=2Pt?B}SqB$KPYuK0Od&b3B+X zG}9qg++XX_5TchHaR@FrI8MFq_rdQxYX9ttH4tuhjGRYb$fDrb{dQlx4GMgi)}ea> zwbQPpNoa8Tv*Vg1T$F`dj1(_SpkZA`?j`s1#48PuNUu$m1xQHY%G(v^(&ZPj`e2(Q zlh;SVN*1EhLfM5L-e0nCb;NZMxrwX@u`_HWz&OOz2y-b{A?e5<)*wAt37iuoF?BG+61~}U|>p3&{n_pN>Gq7i> zzv}>yw5)U;VZb7J>LK>{JixGi&(_Z#79S9-kN4%LzW-s?$@O(`KBvOz5QB=7Q&|bv zK=6f1r{9gy1Cq=AAh!2&vdo$_e!s{}duQeB3A^VbuskUA!J*sh63B%Z7@Kssi~^{% zZu}ua*qVtsO8To$k)$4T)I=)QTD&b#@ceU2p>yYirQfB?i{^T=zW%V~abl6QNRSAV zB)Ys;{)FhMk=Y5UnC`{R&RRgfaQv#iTVX_P=|a56^l68js&RkDa+wVUXc)|qG z-z(K{n+hP0J)dqp9SLV7HXZRJ>!qZKVk38J)RTGk1?#@v1XkZP*LcB3sPGD#tRHuHxut z4yYb{V9eL~DC<@ejZ|>CNyD{g+?WAKi;QWoLyqO!HTaXs4asQDLIjf|u@+aP8J#tH zJ94aU9{S;GMpvI0kah2(viCo6xliR=GWXIf=E+LYgFKn7$vEPJzCOZT#=FoMY?w*Xg#NT6$)UzO0LT-ur)0PUpYSBi_tHRnqbGZ*nXx zY2pP}T4gysr8h2OYy;uPdh_q1fjfLlyT_biX%XU4HyEHrSo;L?Y1)l&;0|0bhY4N? zvRTwLd(ww|Z%xiaDhF(<&O!j&{w<4vSNrNZV`ol#H=z8JL$1w-lkBW0h~DY_0IIOs zlKamA8yZzuB@nO$Y*^*K)4;pzXtez)yt>6;#}`3Nxr2|)c2ni6O5+ngst&#|mvd3J zQmXB3(!h+#pADG3Uv&Cdoi?IYpqTCkVHus!T7kiqLC>FO?W1mcH)7CMyWiiyG_LUN zsY>l&cnEBaT>r0hm^0O|0IWXMspCKC@IT2Agp)PZ(Dp|)v_EJ=?s=}ABdkkNhzG-f zePKd~+aQ8))VQF|ltZclb*F!Qr&cafO{ge7E8SopU98Kb&@`#f(VstS&9(va-Ws;2 zFFPWv?QGq0bAP;SxNSk_W|eN42>DtmP=oJ^O1aJaUGjQcyEQm@Rca3YnVBj;k=W9M zdZTc5blCg~cr<@GCD`Wgdk)q2wbuJuM`TGfTxh~53;FktqdJcG>)sUP@Xg=&S#n5% z##7v0NBQFI?)~ccrBXj5_4`7VmPde znB>Ej^ZAWN@@YZ7u2n*{)4oCZy*I+8Xd173gK5GPfKjIqobO(BL^>p(y+XkbU(>OPg%L<>K(1tyeX z=+>->T06Tt3Un}fKUMcay; zF6&|nK(K|6RFZfcis)t5g_M)iNqChX9b`~Cwem(QW?k-%xw@*%4$QuWnKK$XwSQSm z$WO2s9p1>nE?0Mv#yUa~7mt`NSJhGZUGf*hS>a_0nbMP>z_Iwy>>q)!DIb1fn=nbx z`)Ug$lpwn`@kf;qi^i#zn$;+mhFD6vSg8OGfb%6Qq?Brbbv5D~w)}6`YL0QMwQ}xb zk)Xl;g+1o+zZC0(aWebTeJ~1&S-=EPuDDTLUB>{%ondx}MTIyunQ-KJa!@g=&bJYAftt+KNG?Ux0512*_EW6_z8&viQ;$5?B@ z0QJu8mfp)NS&QN@JH)C^TRmLR_yiR}rtWXl?o^_nIX`ha?KdXC&L;=X$MPCIy9Z^* z39H$s@Ig_mP?NpyN8_t;!!i%(6-LO`aE@j5puHegW)E9)*OSkc=Yr7xV(T4)GzqqL z?Y3>(wrykDp0;g1t!dk~r)}HTv~Alwz4v?K{UT0$KQps3GO8*vs@9!rU3al`>9yE* zVT53bTYTwD!>hagg@Ieo7sRI@B*^!A@th;TjP1)l@erJOG9`uh9f`ybegfp`K@>Gp zGuRwdI^*}Ustg-RF)vyV(Y)l9H?v2(|KKb1>lV)xCj-p;NO$qBMG72ivgsHFrSm+y zValYi5C{dUl@upfE05RN30wg~KLE9fPkRonv~-7)dTM>zq7t|!y1vHR*{JuV&Ok5;Y!}khy1;4Ld~#1PlmJVHIVI0dA5|IAQjtwZ+JRo{X1t zj^Hc3XoiAEKr_nI@&g?>>}RwZ6*~YV%$iIaW;^X#JwLKVmVs-UKMW`2NYs2Zt2A5d zg>}*jV9Iqw-YCcOEylsa;5681H8D5%$%rBms}1H^kQP>kenH}3+v+SR@-(K2NF21Z z4G_1pE67rHsC$feNkB+KO6$cui;L>k&U{758m;Eu-&nAWg*FJzAL8{9H!uN+%=PK& zC6Nqx&)97N5#Y0Kjp&V^)N3?w^?v5e23o7fz_xogA^Lh0KE^|p<4x3Us$E<{_1Jgo zput8w(D*|VK6Tgk0)`jCU+Q?gb{4Bn>H^_rbjl6|+Np&rp=Hp_>Cw{9Bn8<+v3SUx z`9!ySB;f-RF`D|cb|zsbLx%t*+-f|S?TMVI;y{MI)tfu+0T^G1l((@knLgQvp2$zt zB;)1S=xgKLpr2BaOrPofkIEuql1lujQ)?p6!!v3(xa6P7%JUtd&;3xVEWRuliYOwM%iNA8rB-Gqy#Kzt`qz3 zz)i-Vh*ww}5BHJR@S% zISQ$yMC5JeRl$HU1g--#+ZlvwDJ$${RejsD^NUcTHdaXM@W1j`MK<<7;{t^u;J(Sq z3rAhiR(Jv|HX89}aU2RN>Ru_R#Y>OrG9OMbz^1q&;%GEu*4B=clwrf#{W8=qFn)eA z4EVXJeFgPwY9ZQT$2vH_ASx9 zC_8ZdR zy0-}nFf1`Sfm`@F@pbi$b&Z8=k2E5&tgtxiGeNFA%wv!j^gp{tG(l|t@7o?-!LyuUJB+8|1jbdRaIDa*qe zXLF0z*&O`>hnq(SvUwUw+(15ati&kegVCxEXKKZL1_CDSrFbMY$Er>eW6;O5m3j`H z363ZTM9`(23-;Pqi*>sxc@c?5nSYZ>wobEWHuVkWuX9%$qBfxv9Np5zw`nVfG<(1-IaW&RWIM>f$Yvo?3(=K&R*izQ zQG7UJT2@k0LflaFZ-Y#!8|hcnbceWiZag+F_J-Apy}H7CS)zbr=r}AXWX~Vq0S+NH zS6(y4ar)NQ9i@EE0m`Z~`CL|?Um%OVs(29m;;hvahc9FnQvg?5Y3GA~j9zG`8+B|s zL?VE;Ak}k^AIFdS$KC>_g@iYH%xsoO%FHVbSj@q^s(l=Uc#m(KVVw%O=#uu-;#J@O z{96jR1X+mVHZzXnmo86B<;!85U@olVTbAO)ScSa;#dY-poCSYI-u-|W-r z#vwROfPsGK^G>M@NL@s(`p3iH-BK0&g#$othN)6=F)6xgRo)pgV0!>aLEatuCW&$p zov&)g5?nFe(F0tO)}uXlC>Mc`9uf1kwv8Rqv`a6{!wPK$^O#0N7kRHK2c1};|DUg? z%c&^QAmO&L8e1!yI@=40MQ!LcI()Uo&9X#LXeozLkT{Kka2U6j3i4hAk^uy93;@87 zJGTRyH%Ql4P30&aPAfARHA5?-tGxF~_hmzMD?{}daDNklSMyvs>L?yV>!cfR9Mb3u zb@1ZsRTn{#Ivhb^03yG{v2jQGMw_8KcaTb(H%7}08BNjfP*O04F5eB8p^LPCUpU6s zS8d@Wo=BVVp9TJN<$o5ixC2!6aiYstTim^c(EO)2flWSuMA8d>Id83zu?1%7* zXVQc$0ZS1Z(y`lxfRhnKXMu2zsRLG542CI{%m`Tx-FCp<{G?RR-aLBh*32I5?mT8x z4_B^^%ieMRzfcGbs;A0u*FQ$IXx`pR7i_u)$f<9&J6+Cqpbclr_NbeUBFi((`((+Y zcepM%DqGou8GaS}_Y;j_kz|LKF)+SY%T50%pX(bd_VRHvLY|s!%9T#%YN`Bcuc>Ft zP8mQW?-~Ke6ozwGAhi}P8Z`((;&lx|xCYI512cUFsvC`aCEmz|5t-^64`vOWjJIjS zO{hk|ZI3y2;Gr|&vZ@ZPfdlAx)d(k|!BDvnP+tPl6JRE?Mi~x~C5oPT%8j-3H^JJ& z_WJ2ZBW&>r_#Q+xqOF^vRNobVA9|)lMoaTCK_v zi5$527x!60Sjwu^9d6vC!@tMCfR1N+PME(OgV9MO&7{TTM~x+-wJ9M*oRz`4f{5OMRM*)NeART+qjNZLmQzpoS zQ%wSm1>u$cpI{9Be-b!A6#Z|>0fJ=WGH8!v0?8@A9!K{j-0NBex*qpQA3sHE2EX19 z{HO=2zhB&5{a&pA8BSjR>Pa?qv8&S9rk0D0G~P+MTzlA1mj%CFJ^gxo{EVBw9zUP; zOOva^KV$FC0q-s6jDo8@ITs`5@9(e21~u0J+l+91RvH>hNp^`NPJeXdY6=6OE8THVf<&^a}$9)ywT% zI>Zx3kxET0FYpzGoXRlROB3RsF$h)SXg$wa6yVg*07DLu8?5?talwW=KE6F+ZDsuF zbiRGQ-=?LFLJ+6qZgFNW@{})Ixrh-Wfc#DCSvx)#ZGtQ zlmMCs9mkHB1U@FFG}SnpU!Ql+w-GU+XEn!t~ zXzUAQg6q6FnuPS)p&d#>RAhX@C3HY?nky8tn2|0LkD+v6riEED%km^}-4hA?6qwQq z_aYy&2xFhNBXg~sI{s;qBFbBlE5I^u$zPk0D$?G@nWr{#LxRMGOQ~kYEyv}z)reI@ zz_O7vrH7$RO}5&XpJ9D^tyMIew;rxc%}Jq3-$;OxUvx&IPVR{@{&?+05zF_vccbl}a;Sq==3?3W4mHyEj2@ z^t7MD$+ZJj>%dAYmwe7a3_vQioN-Q+uMH1kbN)`n&aV(w>?wXGHmH3e1FA2{lAlMw zVh9t%B#{!ce`!ajGsebr*OYi48P`Nles+(GS$3nu9pJFHe<6p;&`x;d&oP(8{GNVR z64lKUHnWPTBj0w(0ola9Yx1#`?7SJAS#5te|IsR-dvbdA{$;At130B!4<$y3

4U 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 z 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�+kWQkbNY^f&a9|CuF(WxP|n#eo9 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 C(#-h) delta 430239 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

mhx(}3^ALl)F1rEjM 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

KTpNv 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�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 fT-$9<5&T=yK!MG*i-AwqO=$qz;H%k zu<>~#yLiIeB*cEgOur@_q!4(_6F9zQS|Ea{lZ4AuC1D>t+}!atLv(pGZ@L;ef{|a6 zSx3`A*L90wDOxVNt5tRqgPnsk9Ebu*hBOJj+&CQW5djZzB0wGVz>wm|ENBaIzuX3L z%%AZGsp9}(7%`-pU<2^?H$>rcN~_gX7Q5RPFd)bIFUi_Uy;$p`z=>OO|SFuSLJ^#Gv`jv zm@@!Re5B%1MO>as4tRP`CzjLCXAHcDS!o-KoeOsl&)j5-Kc$=Pp5azB^6>zrr2DlC zKGV7j2C`l=D2~$MoM&BlP57i%>od-CM@G31m)btD5uI03nfVBm#V*$+{*sqacKF!5 z%01h2^QPy&IF`0$#7H-`v(E)hG_UQCocaM7RkNsbH7GHi4Qip~);5Xj_RM1ls~)Oz z3KM-yn0hW&^1y|+KW3tD9dXGZmD8Hb(TUuMcx19*--v=tpN2=nSV|NyTmD8bWhr>@ z6;T#Vm3U;O`U+Rz2P)r{;~!14D;hsU*D9=^aZm7^tapzzcY$x+Oy0yC$}d$wu0R9g zYr}PS^!GUzd1lnh9w$t*W||~RNMj3kx*dH4*mV0zESaAyRHhz^nV-d7pH%;n-mUKR znRk0#XnNb>!AN*4{+e;dI0Vh6IvQ?dJH#%`9qV^6xmE3%H+anOf?yWU1U*$zf0jl1 zT&n15FLvC_&bpa%0DZUy=}wNZv@>{bcE|VRj~FNbJeGR` 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%0AjAm7P} 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 z zo**%~XJ-b5$*p=lS@Cs`)3X>Wq%`4f5a%Uj+sT3oIxynnb_)Y5tpFpZc-G6F803PrZ-Ej9Gfi6Y z`mC0)fSHq$IMz16hi0XkOpCQJ`3SSY?$Vy0q6CJPu&}{2FDhhAI4qJr6Sv-o+-3+m zI=Pj_c=VUviFKyEG7_mYD4O5|p}lU1)fZ_Y7rL+=RR5`1s7P58_3GBwC;Se|kyR$u zz>ZNWn=~|mlPfVf#_W3&7k+QO7=g6s4;)TZzCeDqu6JL@OSZztrLR16pULOC3!{GN zQU9hCq=TJ_ZtG5`38;uqury(P)9niLVl7P0z|!P`-}9o{USO?A>v+Aj6IAV{;x_Z* z?eW-}-Dl&oEoy|+9m&P1>brBFGa}aV@|zjIFDuQh`n!?9k3p~dt}GLxbw8(0y}vyy zPIJG$j!Iby@RJgbLEGXp{n^_XblSDoqve<3h|tSH_|diH4f&4$E8&r6s3eH0VXTBM zEJ*ZpFJ3MK3_9NP{dnW$qMZlg{oJ1VP9cZP?FfK&GZBP(&YE`Ia=0H9GLE*b02iv2$i0Oq`U|I@^#v1iiRihM^pt==}`p(S3&Gk^8(7`&p^F3>ck zWa&hN@U=Cf@Yb0yhra5%Bhl%ed=n?qwBeO}(lRQd5*4EVs!X?_xMV0rpFi)VBY4`H z)8gb?yadbfBwPv<^K*T=5E)$?>>pF-E+rQ!3;xU0lU`(YWJPkzQ{ic=>(n3adiglC z7jJnEo19>7@W1Q1`~p$^SY5fP`QRh%AZ_`Kt1ISN_Y`WjLCYmeDi$Mi{E-=%g{aim zEm0wAnUd2KE%>C@)P%45T(aNEXk?36DyOe=)tph-SL>6o#Ka=?A}hN1M|j(UxorV3 ziY>-N9cO(y&}H5onCT}x8Ason%?G-%YP+%b<8jEvrC6MRSW}>6tvU+_<(G!B{*$j2 zYGgJ$CaxDuS62YOICru)cGCLI^ZK*0IOEZ)_d?$h zwjsZdJn=v9>*^*-H*dBj5OQXal>$8@_xrHfMUnIa=mCtZ7tr(>39j z8my=YDBkU5;u{Bv@IQBPD=FRo*4bH~w`njN^6Opj-hO0)SMlPA^PQS}!{$zhovd)e zcL7jbPGh0{&gbQ21PtyvbP>++|Hsxl#s>~Ge7m)^wXwBr+t${$?WXQ_YumQ5wau;V zZtZT}p5FI+-sd?V&ZpovN#;Xll1%3MUmhPk67gcoQzyso=e5E|-bs-adKkYAAsP_8 z9mk1zn4o&)qRN@mDE>wKK_!DS&H{&QKGJqEtyt*akZX~17Rt-<0z$$D)7(&!F z@mg1*?Hzd)why~{;%)RZ{Qte;1tCMcQPM=5en=YG)oigp&W_H^#3H#NTt-TiPH!%3 z)>CH;w-$j&l3W@AQ`I!<_afS-D1&1kQOo4c#4qo##UVb9`d5(oa%6TTL>3)c4j;am1-gp8gz z#VieGKZYUXK))FNip&hCx zo1Eh>W%+|t>cb)Y<6-*;_u6~namDrU^{*GUC4(=f)E~k0ndYfpEa_tW&sf?+%vb0h z<+t=b`U2AVJrP^)rxhAGc>878BpI)(Fl zYkN6aHtNR~mDG)7at)LM4R)~WTCW4nnltGhi)S#QcCq$C}^X*J2u-L0B4e)atm1L+yMb-(u(0z7z` z)2`($$LiK@qs!g;UO%+t{ovvU@4oc8?rPhahs`NrUV+T@&dPRg4;KZ6yUWv4y{X^I z-Il>9lt3c2n^$r3>c43kk`5!vzf6?3)@L~t@-BYU3kMYWvsMXX`vm;-h>hSFp_$>d ztru7b@{1Iu10^$p0!>!-9jc>0pNT)#N5z)DJqV^f5q%zhj9jOGK)cw<&f9d(FzIw` zwr)N4(qXHMoIBB8iD0rFsgxV>3kxBY6tgBsL<0g7b&Y(JBW==-@V|%?^GUc%CTOOT zCAJ6fK;oHK8vj+VoAt-pt)G|xr_$U!^JV@+Ep_J9F~u$4@2ojBBI#iErlgx z3m$F*ncA;ESPGSS9p&$dFt6YF)_L#CSDb+dQ19 zA_r6i1+f&I-C=#|qzvbZgq9IpNO%Zl+8S%si3lYj{TwI%N5q$lMcg;`ozapyI)Dzz={yxU!HwK5D9Slho8qX2+ zh<92q49@Zdi{&jM!fwF>>vUj6XKQ;dDIFkNrkQFMt@az?$H4IEnN?rBsA!AR?EV|} zI`h&wvk463IREjVKI4^Lb2Cxw>S;TxM}vPC-&g#6+}nFqjNTn#awy+iaoyQf-X6G{ zYL9wjYvf_4Z8knQ`smB#H)}_Sch?t4;2Mx8;^Ws}=yBZ3>~MJ5Nf+8lN4As(2?cs3 z91S}nmFp+sLHnw~ZHZxB$+0BB?0&*)`iV2sH1ML8)l$h%_L`sCyHI@2>~PjTXK zH^=rYj2OUFBtKQR&rJv2W;Z_2zrJ#o9ZJKJI}tRNzW7|OZ0k1g{~)qMTcZn>&~t0y zkq-P+e7Aj4T3=Fs;xi%1Q(g>M{ zGLkAAJaf{8T4T#Aw%l1XzfmZe)Ea1WD9}bGCYEJWY|iz48Bn-7+U(Z%R)uzc57`^I zT$?&vMWi1crK5FqQ3g*6mQp|w{P@LDUrJ!@sAEq;&qZ<51~@ALZhDEv3X zg+|HH4AZ2bj!XjlekyHhArFAqO?j$$X5?;t_XIPz327NznJ|Dqu6ai{5sv^9?LN*l zvP*)hrr<$ya2*s9bzK62@k0(Xk$t2}tr#N(=jR2AUV9O00{=oyb5towlJZj48mpV1 zitoI;gV#u){_EC&%b^b^7E*W+e`GRB-1Ziyw`Yle9Y>ex(~+<-Ll5Aa+U!yi+|=#* zcpYO#zx(LL#3l%K?o|PcjiwP8s=ug5cw;O9XA}b(lu4xbWLnjeEBNmQnd<6MSl}M} zhar7)r_(B|wxK|qa2W2kE))L=%jBIuDvpvU3%!JQ)ejRX7ueLUFf0g(C{Qhx%()X+ z%vQPk8uJ?|G;Pc7G#*F`M zBY1h|*tN<6<53(hL-z;|N!VPz^}=z*#B5+rkVn#lXL?qyFxl{4-|e_*eE_yvsAC9= zWx`p*kA&*qUL5@FU6sn>ixuGH2wLUVYU)2vMcJ~rfwM;k*Yrw`!$r>*4y}~j&6g*& z$38m_n-bm3ZB~Fu+kj)^WX1LIHFkQ&?$)8{Y(bl_XH4hxg+_)Gi@byj*Eub;deh7& z_JN*APSDt8HIWsMuR1z$b7nELqrl~%>e?&`rn)#HIR`6kKe_6^bKJ=*M zYagiVPwI_;6E`PL`(sd6ZjV6+iFrVs7Lv6>yA`lhorE1eN6%&;Ur*DlCts3dDz&5) zd$9-a`b1pG_^x(UQGY0WNf@h@aqnnIPErnq*BiHj_Z^Y5T5R|aaoR$H;e>Qk-;1IS zEPC-z?%E1xdA*kf}`45kJz?b2~%OmxRm{P27n2x{FB zHk$y8fq40c`AK#w9Oc1(c&^c}SDWmOu5OKEdveqBW=EzPPnRp3Zl+~)0)3+)w`hMx zU#6h>IByI>LNk6==pH)DrPOAHJHl=tn2H)J#FPaFOQDXTn#GlzHaX#rqV(n@9Dl=; zLJ+D$hc8<-z8vkGVVQVrm>IO%UhO_#JkbKk@5YhdWRI4iGEe#+Cl;ON{GQaZ+JE}J z1!dkg@x1u7oEhUBL$5d_+0 zup;29`eCazZjzGdRAnm>UCa~w%T$6cK1R0&`&Y25b%AOyi5|9yjF}P+Jlp3VM#?c@ z?}N4^7=^92L1a`Vkl)g-=D6m(1~ zm1WTJp=e3_)2n$YqPcl#4Uwag`^?3<+Em&pHAQ=sR7O=kiDWAxx!8V_(yR`8KxV)xOG^$)>OJ`RC^5MoOuB3 z8+)5p%j7z@^kZh=@OIfb6h6XUGyO`hh#xP}nPpoE@4q114UB@Q$`=>O4D0bpD}LhJ z3UU_pn%2kbA;^@+UdhO)RWgsy$kIvCC}l3dYDc#L`9;NbGBnmMa3(1<(iru1Ix?eE zP)9j`4QTMXR|&eXQe!p_7(9WOjsA2;x2>ay76-l)9#?aqso*h?u~p7>ErsZ>fAgD1 zao4_j>*kzl=j(CI=}jPo=q*|+!q#OavE(OHHCC*soF%0jA+MzeO-b>O_^@<0Wo5d( zdM$e6Y)P4lrQx+y`yT;H8J@)=$$InKb$7#h;^e`SE%vu;N0w~Al8S(6aFa!!p7x%4 zhPPDk0PA^y65jR48~%(&34f z4d7$CSIp%VCgTI^S!<+AjYBa{sZkSIo-q`a>lvUYIy5J%>~pQ@j`6EI9&PZD`OmdH z4Ld2eDq5*LgOys$8ceQN;z)s~%6vV}D{6*K0o84mb%Vkbatgqanrz+~fsnuw-hMl8 z!t-C`J0;~==5Wu>p9wSAjE1n1@$>f0{PB|XoC1#Fdbfsh7jM;;q~ZuCE{6j4Ed))P zDpS-s6dML_fRqI{!LmNS4ogn6K$?cq#3nS56JrDi9SiK-FkPe6RIvdin~`d9!zSG- zx9!=)d5Tg!-3r(cH73BkzgcF}pAm;11mS0pEhP{A0owR8X;Cwm+tWQ#$m*xW$ysC* z*$Z4kyXR7|1NU^R_6Rw1=bt!}FZM4|{Y%^TOQ(J*UFYs#kSN8d=BUKK;oa$Fu=^D^ zvl|1qb5TbhtrM`_9+TnD)Mb4m;$7Fhi@kVFC5l3FLk6BQYyEkeuE*(hyxVJKK-Y?% z61%?b&CoSr@n!yCCo!_1NC1-%Y{prkzl@+hKxihgs&PFI;N*j4)f6(R-DE==7tw+O zhe(zPPOI0W&eMe@l-~Kl?QdK=o72ynaj>!Qnq#>3C^0{Xa`Wq3ep2e#nlMqrD4_z& z3RIm>8U%oC36(-J;mwYT>LqjBQ1LVmH-I<;p6 zsm102u0*3WOfHpL4ZBIqsm(%#mEnhq>Z(D&i|h4>sS}p%Nsxf-#0QsxgqIH@cC|?F zRDiSI>W`+eq9zGvo-6B7YoT7U1a9L!S1TNBO${Jj`s*>Fc0B=&VHGhoS?zR##Dy4GjSOR4-tr$C) z^YS?+?s%Fg`}|`JmwR$tfNHgRi778@2hxRW)ZUjf;OJDMS|PJW-TDyDtNw9X*UM+ zjo1Bp#GMYPb$E_yBbq_`ED@%*Ib+&N=0QNPZAo8VFftrW21BsoWP0l#O^;Qe2l}r| z1$bB+Y9ANQmL(*w{g%7^D^j1gPL4+`B!MRrQj0<&LD#+P*H$2*`TfIV5Fb4$$}e{* zKt}U1$#N=0wCR-I4ks~r(#=RsyVGCsS{miy-A zZNW!n-S@@~wY%$_4_=BhZDfBxQ{=WXvT#~K??{G@TyDKaiyC|Qkd5NtWmo&I5@7px zWgTm2x!*u{Vn^6zx?ND`rsm-t=W&C(o}|O8ZF&yN ze%sGYQbS{8v15I}59!}K;_Hiy%*#K!GGyE4^;W0?`1bZbQ5|RpqUtLAEaY+#$}#6yK|dWKkGUzk)H`>+GKUQS#U5u>&s9YByH{kQxk zG5AIYoTf{k-QSqw{bV@Sd_M1`Cr|oL&PIcjY|3eD2|a;rKjnC$;D%T3)}(p7{6N~D zZ^=u&!}66yNCi}TM%INKjdi4b=z-x93md_^{d<{THIqwVnLS;_Zu`?-EYOSf7-`dr zzO+Pp&Rd3}rI(UL7KV+S1Ar$G2WUN1hL+_`D+$q4mV+cD5i3e0r(o_x{qa{fqi2Y= z)5qznxvmw2j7wVA!Csz_g<{cDVHS;_23b>p3M6_voyBk!< zdYMm;k7osVnvH3Zdi*U6wzF%AVpbysv+(eE!xu}5`cGZsCOhI`W`>7z@ljA_Jom$stDr_w@lX_?5Hq3GnA_`iTSr|S z$)@J6)cb-U6mU`00Ab8p+BSI-ad6Uf&lzJ1N)Id85#{NTjN%T3e|2CSdflmq-W?MV zW~1TsH+JJWt}K4$jj2!ytLZbydm&U(%1F_vXgP%zGNw0Qwj)@4pQ%77hvnCaJyTgC z43VCzckpvIcotHvkjU1LMlpMpO9g^2#W-EhC1U#iG{}$G|oF3yjXPZ-Q zVe#`9E#7j41A*k$aaN1(bG3NrPrp4yU2|1pQ*YLB#a*So)eagcSr>ry9S%p*)riFg z&V+Gk@a-qT9dS?~3Xzw_NwG!P+H0`ask3OeRwudN9=6_9iKLq;?7O~f6zp~Oe^0FD zdG*K&N-bCO!kE(NW}8vb*2(HAY>k{w1!;dWQ;LLO0dk?h$XH0J0|wDYzd0BVwXHgi z5xUZw$HXuITxHRzyNON_aN;8P0%Lg1!E&#+E^@qQzvk(PP*SNH%a(rq)wu+Jc{zDb z8J4^8jofXxqxWb;F8nO;q8$bQ&RdZq_6MEO+H*95O(lsL_n^sHF9h+k*t7|%n(&7o z-OGFj0w7Vi%aDZ@DQan-S5o?$m_-u*-{_NUL2vU7bjoRp+4V%`FaupobUn0`;|O0T z-zbqzj;TT~6{Fr8|Dz8!C*)zDoiX$A+T^w0qVhWs=ajZUp`~)L zbeBf1aojr*HJ74*ieo#N6+%L$`Btm&hfMG0E#LJ%IBtyXQh-_G;gohRw(hO)FnXDv zD8`>{ctf}QEF&iT`vh;g;>TUC`*uf<(=*Xv7GH}2y5jV1x#rAnb%fr2{BDAaXQd>T zC*c2lK6|@LXvY@|ln2}^R1P{g!?JlE#h$R`p3Bn7%hSsrD3m{_Ss*nE8sfis&EhzI zMfIGHI5mCp{Ie?w`HU7oMkG$*4CFvGM8W!HAo4`#0A}~yS{zRe`4>t80Dawp%0K$& z?z}=(CzDQF**=h)`Dmdo*^^CV&>9!y60ju@zr7OEaTkB2GG!5WeN<}lk_-cTU6j!$ zA87?QItlr+erTNo&AMYDZ=7+hEu*bHPI>rN-=uhCYgQfuaY@lkSeDDmqpC7U*}DpL z>ksFsKx#u`S8b;)%>Bt~t6FTD(N_94$j0tcVF{g9Vgx0g__oGH2*{QU8tl7O0P&Uy z!hIVB^YnmpxrP5AofY~7r5jI)Y`NAJNp@>_u}=#MDK7I2x?z~@lrTyxR|?kt%LE_Y zW(PgTDx4jrlUDpth6%ZU3yb91-)WbIGlflT%dmmvOP{L+(mCXr=dKx})sq}XLTq}O z<&v`s$!@mpr^wpNm7Cu6R!#*^AnaGcRi)dco3fb&C%=~qF8#Pa(dFK^)`b;~xj`8?0cqb`u2p+k zaTMgR8W2$Fm&TSXd_4Y6^G>!W^7=V5W+?U*!N^eLddDEewe(a}zpk4jpxUM|y8m*P z;>bq@#YqK@Mj&0f4^MTTF@lR?+V7%{)IH|LfAnvoQp5y~q#`ZpNnJyel~j=CNmB!Q z##%yE0wkFkrLvc)v(kgx-(=>$3nj0aD^0{wtR>{j0LekEL?og8WD&m1MoL+5HRMH;TJc#Fu`#v+a)l*fiq z5~Qg2Hd@|H2~uOH0!+ag6a=ryCI-gsc*6rANA^U}lUcuHf1;QATq08s&%>l>0}MUY zNMYKY7{@r7#nDg(TOAf6vGK$iX`<`rzE@2yK1Luy(tax<@Y}`qK(U)X^MeSgUeDI4 zoZWb}ojrV4-uJs?QyU92{6yPB7^McIPNoYbg%jeK*=n#yl$})F;+k_y6K7g`LVA|> zMA*&c_Zd!q|0%4`>y3qvE5m;ilpj0uWY_KK$Izucgztwv1U%QcOWQ8@v48(9KgBxW zII=Fb-fKK+043~tcXDmU9t<7g4BNgtF$y|5RuazpV!5`r-B^W0 zes0t+ee)eUndmHT_L3euL{69R+r8S(}0Fz{{9@X`@d=H^c0OY0I+WKdx;4 zJ+w}Y2RDOz|9{N?M7=3MtGZAWXUO6{7Xt~|x;hUSv?RSJiPx>ApOQ?V!ra0UDrhEF zrpI-b@mW{a->Ru^qWV_KX~2v`lb-k$JH@UgLCacocEN`89L9Gq^fzxf%; z+Phm-0l#@PHpnfEI}XSmKNjqq&1^HXlq>zL8)R#e+{Z{NZgijLv9HZK4&vrN**gxH z&qTncX^&nJDBZ~$xnj;UAD7adT<#AQx5;}x5*m8r|0T;iM=3NI80zl;FupEraO07Y zaCWQdIMgK&*no#lN8i7pOvw`~Z7I*V67h zS@yxw<2K(BHnJ`*fyL`WB3u>39~MdqtECulDXLVZ1oJeb*DO2gzU^~{Y6{#XNi<=} z04=rMcE8L&{TeWwxbrbCjMWKfe9OF)K&Q|j;smq7-Wln>+2-6i&)E_qe5JG3GNSjK z&cW@l2C1<q#{C#`srVlO!9#2m{ z0vZkunoxN@r%B-tKJL1Y6R|Qn;| z;&PY>pR`S*T|cK?B-o}uFb{WKj;Yq+uRQXdYT&bn9rAe7t_tQioLsZkC9Z03GH3Av z%~Izu!3OvOY0L~H?yeaimd)FMoUgvUq6$14>eVf0{ntNc{0wsgab8o(IjA>2Z?K&8 zo1Ow4kbfL)x2t%{>;wa_E+i}U{17nqEM}vDjR7jq&u^RI zvH2ZiPj9WWvKxqw(49tE1CyMyZnvKj;u|yZ(ZIK<`1+N`fM6oKoli((Si#c-`n=!` zr>r46;a5-c3b5{M2)^#nE8#E4$+7mh8>crS+oi^JEyAh9fF?i8 z<6&e`%P)AVR%ttSnV8Sug{3@nlg5P@(QWysW0p>uZp?H`* zs-cu7lJ~GO4O>>J2{~yyOgC0e89OBMI%ZG8`&qhXv)Rvvg%ogLW;w@gNDmGS4NLT59JM@vTqUaF#DV;xrvYeClu3-1ImOT}yrddFQK5wCPB|6| zEo@s;*43h|`gTv2#{q{5rz~B&ch!atgok|61cIh122d6}H9AsG82*wm277_g0G|8Z zWhUW5AYxH+9-iJ*b5>zVxL(Sw&)z16-plvIa&6o-5T(%WQCUgyE@oxR{(-{jzc7SJ zumblXN|b-GGUE@Pzm$C=GtNnw)CxE~s36G%Kc*h*jA+;D z3=Xy{tT@~W-27lHLk@`T& zDx1N44wEFtJG1)bHn?i=s2>1wzJ9xVct+E8qS~;=}8zrUsZP_m^SP2QN*&pwUNg^iPmk z4(SoS+CrD>LxiCLS}S6l=vmi*?pUBN-eDj~wQ*r<8Vp(FOhYYTTH3Zby!$Hwv`U9Q zalv57by&Ju%5w@oKe;z}mYIAPb>IA_|5fSI!)>zw>>cC@uW>LX+53a)sb7LX)ijxQ z$d6b_IC*0ZvmEEWy9?3D?>|wmRbz&>(B5$hmy{Mvj0wcEN={x-sIVxhx9$Mc)IoI? zXtt@EK2MDXCL1?WF->8R^I^Jdt3|NqvMfHe@A>Th$IjGYOJiQi-pE5!iia3Fg?m(Y z38rITU#UId2^!VoOma@BJ!rW{RJDJp$e9UZ#>mNpy@UkC>EUYUGt#1hT@mHy8ATGB zGxSZ=325hjy`ys1uDzz|j!*#7&b;^qqo3*f|0BSbSd2k%=I!WO9c24+OU zMwpd(4@=Sm$gBur!H8x+#$UTyLP=yJS-{`z$Ei<+iX}({2>?L2VlJUIN@@T`7!!&r|$XmF67AcCxTS+LV0JKO{f z@Jt?DJLIbvJO0Eda8YtECivNz={Gap{A3+?@c7sB-O>Qpc`gCsv_hzuFeG1Nf18Cn z4ObWOFS9>_5&+jedPe_!B+3}&Kp-`CXdX_+{VSzLu>cN&0*q=7>`v{cP%pG^9#P=; zxG-o`xdQ6DoLRFMA#_lfYohDKzdIW%T)Xv*Fr@O(1O1kc&MaKWRDn`Q<`yTt*Jo(I zzuhWA;y3njR|p9JD`;s5bEc-DgK<)<*;}MhFYk$B1po-x&8wQ{2GSdn+%G=ZP>bMe zBzu>w>y4^h$Fy0n!7zT(-h#SOToETn2DS_2KsgRYRdw=JpWk`~>8JepZnjHTu%bTV zBX(c&HUVorn|f<)BO6`#W=s{7IO3VMF-y zT1hId=YiheC_jl7$jFl790HL8t*qDsk7B31hTnSM;XD@`nDEj<6dC-RFf7oBzqnZx~&wnswN5KT&rX5v)RYCN*fE4YLcyqxSeADjQ7t0o`g#z8_E1!`G z{QT38`qI=sR*LwLPI1MG@|wH0_PMb1q0!vj69)L-pP1BWkd@6yd<{+*@BYMq|EJ9Q z?6F;YU3y37-RxlqyRWnPjqancl2uk}>230UXL#I}5F-vcb+~Y)pe*%}HsPRCmTv}m$6M8NMZafpp{ z=-ZDF?q#Pd_qCHSL566}digmjTD784FZn(#-e~#s3;rudkaS?NTt+Rf~(OAFu zVrC}h|G>$tUjXt~fiHTK?Z5Cb3o++^PW0tOwmpia=DFtc52C!qcPA|DWB7l31Z}HW z?Y1XXo;_TuMyA}kJ9~2ex^5tDj(NH_rz-PCuYUaa;F_6VV8rG95y`aG%mRGSp*8P`+AHay~D*b3i`X zui(D;Qq|b9^g_uT0j?)Lf23}yY69Qp={~F*mwT$-%LUTvK22aunEwy1uQ2m2Ek8aUtNja_)P zu}a|AcY)^!MXysNnLbTwtS9_;_-pY3h$p^u$S#uu)E#&+*i)ipm}_x+Q>D*QRw_kt zk{PMP;LG$k*BOgr&?`TI$}?i5Ndo>SBZLUu2FtIMZ# z^max1$n;{|Vy+4u_S=b4V}Wf3S@SCNRH?H;9m+?)ERIwwZ3-*G4X==zfkvV~?}ELa zxXY@~e;F6hoxecmdnhz4rvK2&|7p-1%xwR+-LWw-|F3%oR4i5fJ9H&F)BkJu`5)w( zjp<8J_+?p4h0TUWKx5-#Dm?uUtOm z?;^|Q5442@6+;n*T#d3VC?g*9gC0>vS5jMWO2rw%86vmE6$(|}fWjbf@_@RJJuXuo zCL*vP+q~L1RgiMLf9_h&ztUFMbNlCV`5UqyhJ;o-47*5yk6QDhvbi&2_7}8~>%UI; z8BIcHJ^?N^)$iAX9tLz>{(7%;|Ci5b&dsG3R4WQNb3&xo0c`Pos<1+1zLpd)+qAEqt=cE^rbb^7~Azso$Qk zKFJS!AsT(yD%0tWmLFx!r_{4o5>y}k2}6H@>|Dh>Y8X3RiNC2?yuesv>qaN^i_JF{ z!7=|Z6d(9oVFJ^m0%DO+zv3&(XIdkqqdUJ)FfXj>9Nia8!NlDwj_Rx^N^~1n+_gx| z{LHy4!z!qr7(xje=iVp%LBo*JeDfwKy^t*lRk+WPIVNuqzu*Q-Y;C1cQbKxhFJDN& z8w5>kr%K`;Gb7gi`;=VRJE~FAaPp-08=e}HW_pypq8$zAWZQY%Mf**R6fl5@K5XLdA%>v#Nj9areJUpeAFvp&bFQT5=d zyJk=HotohrDYBc!7U=1_OoclO(#2ai}mju&IcBCgEs z2-Omt`47i>_W~~{tb=kCiPV!Oqv6`K2y9q+zo9NqjPBvq!lT)9ThO++TW@EoCzS-fNUwj)8%5`+{dD8;_g9olR5CkbC#{cxh8*nP%` zn9dQVN%ix{^VDY#xTAi((C}RkztLFqB(O=gf_;$O+I+^H=RaJL>(>U-VWv2f+ON0I z8U4(m#i3YmR|Qlu{q^*g=zMno1RKWX3#u#oT8w^(i-BluA^5QY2su<{JxHCBBYN&n z#eS?_J-)D>K0h(AH}-^3Q_|H5)3oK4^7DPa%)6Sm;Wy4_5hK6+%4^?Ub;O>BYu<~1 zK%^#!>{26J__t~JGU#`3Kj@zP5t6p$dQU#SD+0%NzbB@+#CTn4LUKr;B=mQLS7`Do z@9oG}PVLpG1I+>^1&AH9RJf@cJTMTLQIdD!c(Dz_MkEvqV$K2j&>7r4Oo%_2{Pe?@ zB`3^cAM$IoJBatj?8!Ocbik8!D`vZoXs;Gl_I?o3aXilJfYTIlRn9%$Lkc-KEiuhX zj?x9EF>H0Rv(I)6NJ3e|x&o<%8WGP|K%vq7*X0=84?+_1zRU0)$^t_%jj+*6aN(2xf15 z;5x{{!Ge52J`Z~4U>K;jLmQ}om7nYhIld>*iPj}!FY(|haCdI>yEbZPpvx1S71OR) zu%WiD76lWixwi-~CznFTpgI7J`=%PeIv@vDR`Tsc3iG%JoNUMGC*}6;#F&UHMR)Ks zw7#T7UWBE93n5Oh!wfJIV`vRxye^c{bQX>iU!#R(Xal;Ro3D{K%!=}d(eUxaUvzy^ zXEMM4UW7|f)?x+-VSqf2f;?$K^|YdU0g-)D^92KRi1$}Tc1@dd`1<_S98GAE3OV6> zjh^Y-a7N(ZF6n+;!wT(|o)TSlBfPoYJz<-N>&O%ZNw0YI3!4pzRRWQO6n71C9uvxAA=u}OAJvKcAY<*tGJ^6 z%15h1^ZyN6haPmNfw2{2AWK3d^{Kt1lK0x58tMTDoUVf}`@mejW4=q>7k3jR=SMvG zEJeDV{v5N`v5|F|zcz|SbZcf`R8Rg2tF{FwvT0-~_UbLkszQQ5duC{THWFlA;rRa6 ztyf_-j#=rsa>gQa3gaB;`w1 zI3Aox5|m@cszJvLX8noEm}ne7F8lMaR#x^W+9Hbyag8(Tmx5-yck@4pYQMy#7GYih zKMXBtE(fwOiGfcCXOsP?ACgvLh7dA!-H^Fea{X`SM5AT!DwsTcQ~SmoIbK}{h7IB# zA-^xUums+QS}G@xwQDLqf%sKkWJGL^i}rF6T1hnFA$)jgszrz6Yv=I>13JO#;izSJ zp8JJG`~8I;)P+S7>&bjx@_5+!G)5)R&duiGKJ2Z1-^5)icV>JfSK8BOvEw1>_M7qI z2LGggDDI0`04`WQOPQ~z?%Vx5H|J{lPfI41nun#`a7e2Wlzj_B?|4wQAFm70ce61P zyp7S&kjueD^k{xAnExAf>wq%%3ypD=tnwG1YYAUR;C^JlrlCg?uEzS#@LM2vbuod0 z&b}gk09}a(IzJ{%foytdZ?;@yKP&qmV}DX@=Gt#a!85K17H-*4*xZd13j#inoLMpR zcO9-y3>8&RNT85nK0UZRETwEfL9EL*$y$*si;y+b_V(qtY5N~5neSolz0?~fl}oj> zGx{s?(@_k&=w%?jmZ-h%)AzgFAOM%#x6TF~ahLr0=JOD%q3)og7mn}jsp(td=JV;< z@2oY{uI5^wlf5U6g+gPQ-`wDI^@ay~1)(XqB^j}|LW>R3atyMF02No@4VJZpx=?eH zq0jy8fTU~BcfVJ+eDTmWclb%FT--N`176H)ytl83b!u&BcsEy{^mP8~hhd(K9R#gO zd)ul>^36~;bFy`dgD;9(GBc4 zAzF>72pSWONqy$hjyhYwUTwF4_6t`@_)%|qf9@aUj@43q?-s4aPC#f3N{F-|Gdqf? z?7Inzr{=pU&01o2*!%F?{A zc&oa&Wje=%HMlmQ&ndB%Ru3Q)dVK{X4_ldBQ!}RX{7vcxKq`U1Jax>*J47+UqxbwG zDbX;igwVOOu_&D2B!ri8ApCzrykLFBXPjWhb`-t0g+~qGw{^b3iSQ!$n?31<6zn(* z6N*p?@4zop2j46d!xZ-|jr&F_ale@_{s^s!OFxAsNN-z_CsfOs#-hG7q8T>BHO zvH-seE@BCwzfB+0iHy(*AOA=rg8n#u`XpxC#SEe7|4q3OJR9MNoVeSW2->aM zO2T&G8d5TFHyN^h{3CRhuFQf!%#s0Lkch65b@%tQeaO{341JZPCG&;>&7hVi|y6}>Pf z=RrGllDao2{2`*>7(~9C1jS2HVMi=$VnW-r;i|9#6q>54>5&Vu$|pN-eivdn%2Wp0vZIT|JE0u=9QP;W?C`PbnRC0==8bdJ~1W{k`0OB)mL zmquv-Rv7Gnl0hUB-QT_q4}x%alFQ`>9-i2o%{)9njqxUW1;;H zU&`pKUx8wHMiNK;%RfVF^RGeQmY`vU-5lSdj}b**!-T=(#q{j_(2feV3yvPtGVkd_}2f_AOa$hd*3EEsQ*S2vYNZjJF&jBv}Ff{zbRw` zeBS=sI@(_Xg6obHibsjh=jp?&Qx>b3w|Cj49nm#R`!Jcb5Cn!9O3F9a_D|I7PJuy=Mh9?&ob4zU#7xNO>X6*$b& zqg~j-A)~II96&7#tGXVq#uYNypFfpliM6>7mrHE1n<(ExOk_*vS5k+n0fKWG4EDLT`cK4!H@f|z8bW~n^cB6b}^bqCoc+<)^qi%A_G z=aKu!m~muQMiqHRepQ}eeI)I|J(9aWRs2^1#q^N$TaqImA*|#$Zskc{wY{9Wo}Qa} zQG2;^Z0qj3RNtMN1@R=VikVqZZ>GHYP>15MGpCo(VOU|Eiks@;nhc;qjm&GVpd69} zF-qJw=TX*L?GdmGG#5Q_GY10S34i?&zJGR;2v&9=^X@?k37o;sLj|??Lku4S6BJGI zP2v3&D))!!`?Nw{@pMcK()k}Q-k*AcyBj3?RKTx0V*vy-CygK-S3m{msg<3KlFdhUU_lKPr0XV z#+d-bw;0j+x%5Ipbwax*zx~Q-O^J`q=a_qivvATL*MAHC0=IQ{N*Bnakddm4C))C) zq6(=8)(_FTIKQjiI|f)5xeIS5hZ{2(>^d7xUWU&ymm=`Q@1g;D9gzbF6ABD@wQ~BY zX8qU!dq=JC{I%0@DjnskIvpHVW6$5^#gI)79l!CG?aY(lbmyWSG~Xj$9I@GPN)X@` z5vJi7kXVGT(kjO0N|I=+RH#V;`IJf-6?T*O+BbWT(T?g47tF+^L8`Ww!l;MjxI$RF zbPbTp-eX|>{JMajze13xUY?A8>sMH93_v9z*&%^%7Up->8x`d}?N7ILEMkbrcN>vx zohl;?Cvu{>ggkVzAA&U4pMa;3 z4%=xMw2c02+xhsi^tlz5=k+_y?;GAXeUN;=>VW=Jvr%TU%ztHuRm`2tql{kiYhp~! z1!UPDh)6}N$|Afx#Dp3V$(5`pY)j=FO)h_vB)ROlu*IAT<29@Sg_`2}MA%`(MsH0P z*_EIpFflMIusFa5)N0lU5Oh*+b6XFHtfIw3$?a!^(or2vi&^`{OqsQE z8|ble&|?{^O@F~uk5v`^wjmikLOoQ60reFn55+5}mgLWhnL)}1r^i2f!R3EFFW>jf z$E#k|#LQw^c6MrF=H9pNxO4B`JAb#AnS1BVQ_kOW?v{Mvsl1-b7`M~uW}B#t$)9=i zo;Pl~`Hek*yPLpLI2mwPhU)QL^@K+Z4~8D8U=oISsDFt)-+7VuLf-`$8%c@Pun+$o4s3uyX}XnTxKleG-mGNZ}pPPDppk7UGa#0eZ>n^Z&!URac`w=YT z%!IxJ6w94OLl;op*4qmR?9Fv(2tQO3H@GNd_+dXquv|j$4zLz~K(&Q~s1Ckz;m{_* zSYaHnPdZB$ji^~PK{&)&*r_R;4%`v0)0dD6_J3qu(O%RB8tNM~ZtkZ6rUDl^pCY}1 znfBBhzk6i=yTh-WxNOaJ>)T670RMsKCN`aT+=8jIsGeC5xE~L=Posld!e)?9E^0<) zp?~p`>!bMl$^D`I;VfFQW~X9h)+mPQ99x?l4m*2lFy7^FI%PV!nf*qPI0>P zWY^j8)05wOb$YMNxx6VZCB(fexVyRAJ-2z+xz@q4(S*P|WYLEaW3`lh$YeV>^(9RGEd4IEFIH5XBZEF+Qkq9MjN-zmIvuhCh0zN17 zYKWb1h%zumW^WH))E1c5fKQ%w0Ee9&jg7#1l=13Ha#jZk35wAi;Wbfs^V?@s@n!KZYN3#4uSUCb`w75^(iz3~O!t0)L# zJ`i>r*f4LgPWCpfMR*Bdxf_3~x_=`|6K+~7;>F?)agVr9WJNigesmBRC-nAGAoliX zoB@PS-N4?Vf=v>^KRUSCCx(IqG}r*agD%8jO$qe_k3zNIQr2K=V9O8xN&58RQ(qt9 zv~wP=^1G|v%kRUEmtV)`sq))v*6j7-dmnhIwZ+}D6)ql#zAH9Ln z>RdE}9mY;TJi1y9ZqQ?+$rM9ik(d zdb)lOJooXF$EFvgiIEiTbRE{^uueyC#275v_r9Fl=kvHDL9-MoGj)IkHg8i|7|PmoM3W(Z%~N zeHnj1HQC{p*M9WT+JF21_BX)htw14XYZP*=8rh+L)A}t~u!AXMFvZN|H7WsW8DRk` zp%g+Xr9>qN1BqDC)|?*efk-A@24D;iCX&9MUqK`$ToUajT$K23_UyywYgEFR5C5w~ zC3(F@CAbTB6{!Rxa01w!>@BE~B-P=c1P%nr7&NYNCwc?Dg@51kzZv)*eUHBnnByoJ zNCp#)$M~oE{}kLB+>7?&y@4PI?kcU zqzH+m5|Kze5eVh#=%A&#roOtmu0D{n=(N7EhBX>>Y{24k6))z&4o}EKJSoxRaftz6 zMHwBpqs*iX$$zAhnM_$SP|;mjsrmyLDgHnph>3`48Eix-7zm0mgt|#UwFKjdP$(Gm z2NIa}$NBxf#s0Iull7BH7p&2nGWU^}(cy_TW%*R&sIjiR6x? zE~zF{wMkW|b0k+M-$?FH9)z)O^0Ddy4{#PHtMML8Fn?zKesG-GKsUKWm7EI0ifnMA zbB}YM^BX7Yl!raHxah%7=mqWo{nhIM|D*V?qZ7IvnM|jLJK*K|nv0{9hx#-hm+R9U z-R986i0u?dThcbJP@Gz z$sy#v*?;+GxVtqw@-JH0sg9Pf<5oQEb;^OYV`!P*9rSracMEtH*>_m#_gI-Ps7=|I zC3|T-c%16HX+Xu#0u`5|2K@W2C|ua398I7TB+3BiZ&efOGsW-PlwrM)Hh ztY4h}?$dKNo$&A_`Q5~vA2*bIUbYG`3{hROF>s2$3BJ{ z(LVL!auMfH8=8n1o#c{EcFz}2lg_MIBAzEL@oaXR8~pW^k;t?(5J6u#ObNp8PK z8XQFcw~)Ga0Qi5x0}8Kv%oT>#7-@!SnbG1ZK-K zWC`-4-{aSjrxY~q)ubx5?SU(L|1azSupUwVvk#22dtpXl$Z6B<4xY7{voCWX8>6bPed@Jtj3BYh?c;~v!%Xkl41 zO2nPr_uAnk4nMX@Am-?{!ncSi9NJiJOpP!>yMGLXWU}xtB*E8J_}7zu zyUA{}6Kd0Pg>N?o?B(=~G`PCal+JGt*(1UtW6&?43Y^s0B2jy|MaZ`31f9<2Z2{}% z)hDZBEq1x`_uH_(NXHagy_%%gWCxWKLeVQNB4`Gw;1V9$ElaXX7G<5@?+f^XzL1aA zClh6fR3e>V^?w$t*=n*Htp=-3&mp+S(N+LFO?r{9R5vsnqJKL?&kD5>Gsm~OX@N68{S+78 zT%1O7;GQQFEtu29pc^!iWT-8PNdgj*hDL!#g*xW*tLEP|?&^xbXonkG<9|~T9K}hK z+tYH{uw!mm+n({14I8^^E&1?`{6Fuzys0jHOUudUy@5H}j@;6G^3sc5Yl+Iy{QjL= zFM7QtB7etlcqgTx1)zx*fF`mb86Q>)uQ*`TIb9N#;cdrh}lA0!X!9yUE_{fquDM&s3FmF@=PGVAru>s_~! zyLH9}eS@*a)NCEj)d)4xaE~!fGS(ay7vfUR(|-i?@7Td@6gE0Hy1Jwto^7)6F~{TF zI^hq_2V4(IPk0`YjZ>W`NFAR0x!as;q~VxRq@YT)7U|GM zVt?EqZ}PTZ>M2q*6+JXuph;ynkTUMnJ{|OfpaQDeBAJ111h73eLCt|0*(7+{B&tsA zqOVQzNP#vFElk~o{WLfZQ(w?p*IjsLpbw@Q^q-@(sZ={@ZR2UsYJaIdq}r`qn+xPm zt1}1%?k;@32}s&jstK(*SDUp|duaH|#(z6ou^kF)gtq=WEtZ1wBB5a+o&%*U35Hq% z1n8m~T3{Dk_s#XY^Sg1~?(4t4e#+O+Z1@oy);;qz8S|(7$7}I)YzOar+S>dl55I=T zvPZzCG+~`6$qqZL?t}wy?QeQL=>xn_uj0KR%$z(~giV_w6a_eSfE$ z#_&K(zYEeWgO%bk*;77CM#qW>b>o>^%vP}_qN6zKqbRDX^lb$x_jff5>S?UwQv0>Z zYs;=pJyiBkYP)rF+GG>VQk}Ii&8DL1U`9*^%c54%LV4Hrh0rVgN9dE-GGo7%|LCcb zlGig~q=-hZt9_IA*B7DQm&_%YuSA7LYl!6k6RXb_IKkVPnq zZ|;|q-1mp5n1rGj%WI~JtrwS6JSwVqkeB{YOz=o?CE*HtROF2EDt3oN6$>#aO7f28 z0rcCsowzeIy&>FhXNBux4XvcExVWb;MPN&+&yEeq&_}M(!V7yb`nGd&=zsCc&Ur-E zo2(q~K6C4wdp}9cyfFXXw#i|Nk_#?B@b%&a6U!DpbY+LfV0Lqr51#tLis5t4J3s%? z?@rH7FSp~YX`=Zo;S%9`;dcGKPJ>?yky}D9M?;}VG~)NUwvopH8mem2 zoa~4%6Q@T^EIU3{Ru+#%GJh7ks3nr>3^wdUqMb9x;!P-{H@9(N*5GRLMVi2wHaiRl zL2-J^k*LHR(Mi!|(VL=cqX(n$ONgfpDea$7Cwz%{*?AN*< zzqm|0XoYQyQ?yHhzd!$?xCT-*I!cjP!%*|>h%-XSgAa@zf0gVs+kc(WTDjrw9r%3e ze)KI0dgajWyJ^YH-Fxel`Cg}Na7Mk;*5_-r#Sa0j+8`BH$-XvyS>fDx}(3bw^<{8dphIur~TOw%J@>nh3>1a0!!#;fYwxW zF9uc*DbWK96ptl2todwx+9J~KCu#ZQqc>i(yvF4bjn3aKIDh9Ne7&}^Wa~R-=t}j{ zv+j|Mk|4Ml_rlRj``50w18hZrtp|0ewR2tPxvq9G0Ly6D(j#=K8T^C5Fc=Cyd0MdW`$^7;i+CN|jUQIUY}RN}65$t-pYtpJCH@_LoxhuWx~ZI|z)_zNCK1 zl8#3VxX(+~bVRO}Rry4Do_xOiTabh{Zki}YY{FaZMDlC?yp} z@^tXYS#|BTvQ*<4M4$EoyblpPB1>`dGWq-j- zLe~ekg`SCQiA$hh4{o$@Wndp~2ueje2gq+a=7F$KF{Qv2{l#2@JKpWa`uxAPe6;3; zK}iJneQ?VyAJ8xRS>IbP=D&MxSN`CO>yF6I!!O_ex4+#_S6v9YB7Y@&C9@1AQ4J2N zRinivBKau%R{X1QPyEO5p_u;c)PJJ#dAWHtm)b5*b=Is(EvvaVb#u-7)Y_VDK|3*0 z?9J5{zf3xv(G(#ln5pt8oLk{}&K_J-6;{ldFj|u^7@LS5>v35?!HU_;nbw-ROrTmO znr4}vFzqqvOy0VRaM8%=in2SRd!qZn+F_$|ZFs=fCBA zbR31o?Z{U+guI1A8`H*W@L)CujR?Gsjag$Qty0z+I#@2{j)YkI^GrK{E$Rm1@E{CG zDaowHO(jGNjbeaBD%4aDUKV4nD&i&PS#rt*EuHM2<1R`{%in(N#~&Yid-?7gZurYz zZn$ALdHF64FIy*%%$`~Xo_~P{A9rke#Nn+NZ`p!Te*CSkzP9Gp*Iom8+gK>Dw}Q?q zW3uYHGAZf4mU%>4=k6w3rOj?5A{<#Nt(KmUo|X1VdC9nzbdf!TF|tONhxNG1NQy0U zCEbl|qiZZX)-{!#Do%4vlc$xPj?ZQnxXy5&A)irp8GEto4(WFHLw{sF`zP00_ZG69 z?RIs!pOT*{dqsN5{h_qi{ST?fov}zhDMK<+#=Tr#UiPT8U3yXXqWF>YIsV-J1Nl+< z!Oa)>-Odd#yyyxi=}>k_45OG5Q)A3Q+FBcXBgQO=EsGH@HYrA8u{+CRv1C~!T!yTA zdO~WJX{l*7C7BQq4S(~E2|r=lVcJIru*r0%&ScVqWYn>WmmbXr0y#Ml@X8TI_S{A! zx6)l0r&haIMiF%^3vxqrxx_Mr6psvcx=b)(u;Ot;+f5jP8O0^R5fa&f_k*`{K3Meo zY5F+`*C>l7W6Vru&B>;)w@Gm}+4N1;u%g&(R{dfR_B=0RYJWy1&>C5-tdrHUOs%ZO zlTZYLP{>{=9DJ?Zq|PqGW!v!|fe+nyrRtWZ5VdMpEuqH|dK^(Xz7|CMA61)9neD=^ z=S6mn*rcQB&6Rbu+SE9#R_kVpUHBQThAU__oUhezFe%A-e%+Yh?y6Pt|r)kAsjlT zvzgI(dSzBJiRB-zbp2Qxu&}(J5eL zramXQo<6S0%ru!z`e>8bjn7goPSTX)+xRDVhTn$ILQZT_ZK{APg~h^J;SGTmp21Im zC4Gc?Ktvxn)KQA~_fk8I{%dQ_<@%RYi?|c+0$=Sc z;(s-0v*iX5>Wc)I1#$4sNH7?Q_#)8^II53tuBgU4~bE=neI(PT0fjijRyXLYp_jfl}`gck&bW>5%D zgsWjf;4v}=b%Kea-{%vXyk0;*q3Dk_rGKlMGMTg;1t$f`lHmT}L7F36J4uI;j?*c+ zCA$5(gF3xVu1RmxaIfj-o{moL0I*ztIARb1l$JtiriHE~0igON{{OW^(ck5cKH6a9 znvKmGp@eZMMl`_arXidUwmq&HYVeYU`Ag-X*XEKAXgVBE#V2a^)u$mZCsy=*b$_*H z_WLz5G5`e$HkU~wp^0Qek%VlL;l~&Hb2lk9%?G(~7En_=xkbG##D@eTH1bn<;-fn< zLXp{ck+3+tI6AxidHg*0y6}4V)#$6$&(%KH?l6K!en*4>IuzP@p*_k)qFlJPrW%K9 ztD~I2DY#n1xVpAo03?TN#c;TmG=JeHM-yPw*(5ZDo0KMRRa13StSQ=*9@*61RM%A7 z)TFkzw>37lMWe}zie%e#U2Qk6*sQeQ)yC1xP9MfPYd9=ftvV!ONebY*9J zbHJzQxNqS-Hb*TOke_dax_{`pYZ9usL8+$jiE0uoZG6xow82rIsN7srl2bHo!R_?|#Hz|sc?Z!83O0?A2q2402=%X$5-Pop@T`i2? zKaBAX&uzmtWs!%~==A-Iz}X{t6VIg~QEp;@ywk^1_@aJAz(W9^1L*uFI$1lI3^{@0ohZUH88_ zm#nYdGWU0%oqtjZg2>}I@2Mr@Z#qfK2U#)m)SH@XMU$H=Ynig+x07#2m~`Y1Gf%Le zAs?EgCR5flM|5tx(=14Oy^eEBPFJf_H^F3buC>SL+7&^v|1aCH4xlENQaSn#QDd`5 z3%izbH|RPncxbg=JdpoOT%zFaUkfJ*($V}#(rOoE!+$xao_dZ!7VOsepH%$qd6?i6 zqZSWuw*DpG{ouNM_bXO2FIysbTpnRuo z#45wxzJG$pKDZ8#{R`Z!#}dgunMVXS7Sap?{bB=cF-_%n+TXCh$L+WOgF9&dH)n7= zY0_k+13S90S2YD%cWA#IF#;T6wj0p+ZL!u}c7aXxR>RWnDMq?`O@MFI>SB`@`Cs%xbBw47mlUWNI zHGfmhgs5h4#At$9Of@;6usGVN&@4rHe|36S2aWO29QL0J_V=f2(M7FzcpyoutC;eV z_YKO@`uwpEkEtF%Y52+ce`9OM1LGh0P5y1XKY#wv^sHB}KjAm=Mz3@7Nf)=yyN}u+ zG_NlQaIeFH>YWu@tY4~Uc#AzF2mwpPAAhQgMgxAvr0t}21lwq>X6f$GlL-l!M6WyJ zbOyY&6*SR`RAuVw0u{+}l;+YTok=7D<)Lo8P;K@SoUlY=32z-r#DfS~yu@ORBmm;y z_zQmGAHgJ$2~RSuHN9clZ#rnwnd%aW3RKROlk#rds!H*A4B?>ZL}yO;MmQ)if`42; zZgGDglSY0@TNSyEP9V%q8r}my_mwg_Xg)Y4Q=^r4-lY ze}WlalcOy-eB_wY2%bW&)lw+u42r^?rzKZDgta^w8Vn_M`H&Xx&2K(}pZq>L@>+iU z;4O!MrB4xJ{sCADp?B5t99yA_Qh(P`R9rcKF4(H8u~v$et~P&L@OWLjRTWj&c>lz} z#GtF6H|k5gA&0cSzaIJhArz4RJFg^N^(9^jC1j0TNW$ny(ELfj0zZ+%oUE+cH)L^V zz`*}?)c+G!_~{DJkR|gdx%sF(ul=+pw`%L?tw(3E_FLE$K;2i-^$5IJm4A!`oBXn$ zyhN}C>wP{f`B)3D0l=OT>~#)7mT3D*R|;b0&T^ARlIpx-C@{XXnN&P*a64<=$U0QIF$`ox6KOZ?DO&Ddf# zV`IP{#2{)^A3|9*UgyY8%zw_xF3zsb?#t@4-U`A51s^@!Da>*%cCL0Fbg~X7cFN_$ z&mIs_osqL|8nvvr_<)9zrOOVcz(%UE?_BUrOomreWucq8l8LA|encCVwIWYp&1IY_AXa+tYC$cET zrAR6hj|Z}mXhN<<@mK;O8Dy79CMIKTygZ(uJK82?nJkq`*;p)!aDs~@kWcZENxrqd zH+=hj2Yougr8udSTzBs$^SjyWd9k*|068#e)Li1x8bvEJ`G5(uqVW z9f+p0G`ja7jqcTG(Y=6)l*>+SNRmz#B*_Ut75Ips4vh_=(6Z1?A?A$`4yAmdklz=G z_`Ke1It@@4eLk3wyI(} z;iJoIh{q0JNTYPt2O{XnN|NBq6T&v!ig>UScr$$u!%mf>OL06#{6zj6zQD6Q9J?tu zdf~uAIo&f$lY@%QzEX@(TPDwSXvP$<1C0|Ni4hNt6L$V`Oz8g-F`{Q1xaMa1Ehe8b zN0G=t=zkC&HDSR~hPkZoz0TijEzeK5H?V8U+ALHfu*N&21 z&-M55ax$;)Uiy}usX#;1frk7jiK_AG>N8KI*JoZdzhHUStXrL4k-1m7JAQxW@woo7 z*wXlUnG4ESn^%h~W2@uFDcpQ+sd)*vgkK^oaeo@dDHFoS#>Qu^wd<-KP0H}_@OWFg zDKpw}3}-auWW^u$#eHdCF6u~UjF)gv$6m@YW0Yg#7b@2(D=KeO)+t*QW7g=Ghf@3KXfADU`@W-O$!V$4L-$Y| zy-*GAa4?n?M6<=2$i&lPc{z@oqvbd&q{>muk|-~}RYprCE3WJpGaKVWl#zit$l$@0 zj1OnHx}jus^F{j`T;(uEntmeOy)Uf0`hU_%>*n-nL5&x1YSzS-QMX={--I7N;o{cm z_pQwTb#f8iTQ0q8R_>ltC$F5VEr-`f{bw~yyymbp_N-y*#jOB@Wq|u>fcr37s5XKD zUPldZs<;3FJ}|&PEZN(2)ZQiui;tSnbgjz^Iwi^FBLrm8$FLy2znUF6OJ1)kgW3z3iITyuVb^ot$$agSi%%&p@Dl?0AqZk&l>7>J~ zW8y&b*U?lMF(33@$kJ#E7VwkgvuyS%iG(B8k^HGibRLIY{X z*3{ts1U)K;Xs#{p$4a~ufHCMw(TiMvl%NgAOD~9UlSYam%sb7Thxg{cd6<)V$@TEV zV8qM(!}+hl^LALA%xWCcY^;x`)7=n~ar)!}vsTG+>m z>|5k0U0wt7(49J^ZR0^Q=;a))lBHBzN>(p!o=7GJ_ERuxibOBCvF?H2 zu6(fKxY?(#A2D_Mf#*NGx)|%HGu!XG@2N4PEAM#olvCb%tcz{cmI>Yo(#<>9uAWnU zVoiwm2a+pJy=nLLm49^VbGonRl;7RAaO4?5mp3|g>@~lAmg0r(I==?+(u@;o<0|DY zh2*$4ZX(AVYaJ6i+0tP>Irfm{q1e;}u#`Py*wNU|{>p8O3YFLTxwbQS5NLhU~%`VMbixE2JwNLfOI>C>aa~zjouq>%U&LdzC@5Q+>_5vHs1=&fk7QJw_iN z_nWCjLl}b}%87Vm{*Jo(NjGi0{;m~Rw_ zvF*++u@5XC2w&Qq7OXQG6n#Q=#FTh=zA`U-N%)eo^KwfnH$}Fm-?4sTK42AQ7^99b z#|w&641c+TQot>99$N&(Y}U9XVaAm?QjulLj44AVt#j+`wpbPFChNA8w=j$eXy@;$ z6lxK5$rh8%^Rd2##)y=3WtvStLtaDGH2o4;$wN;?S}H*-%T?QPBfe@7pVKVzzK*`0 zBd_|qS&0-_^EPtC;vEqz$<408&N|<9R_;qDQ7|iI( zRUCGN=!^x&ZAlfS3`s3;-v9o&Ogc^D=bc*Wxwbq~OhV7#!CB7K&uS&w+vNIla?z0& z`Dk0M@WSKQ&A;}IXaBh9nfms&%C&D_KDp5&@irmV@_c@WoOodIlKa=rpEIMGIL|w0 z-+zO*|NGjNkNx$&>(0D?e#9XQZnK!*@LBlHC+~S;)zy!l)Byg*J9MW2=+^*P3~#C+ zSCK-3VO<~uMq4*N@MIwHtmJSB-FUVt*zM1{lyLYA!ho&MkZ?%p#xtK{7*-b!+JeyD zi0pu?Z#M=4ewyGfAqR{}E^s!kRvlPpKYt?-2q6cUY(X5{M$SQDJX5tGjIkVHS(o+q z+wfn9>}AtTw@&KcYTVChRz3H%7KbSAtZwFq(N#Ka&G#sy#8Fk*iNkfc=E$4)je#{<{G)dluQ(7X}$R1uU&a0Drkg ze6Cu4r}syNu-Ju9(_f&!3ExWA;s;3=-bBpn^bZ*}>$VtPG`wfn=QVhZyu0|GHZdd; z@f43Jx;+v8==Zd7=HmMwz>zz}WV4w~5w7^w9LrI!Xp7e6imzyE#7fE^W>aNlJkK>E z*1(yKCPm)o!5*4sY|&oMwxe=SC4Z@;iN?c@PBbpQp-p=QgckAPf8A@2{{P<5#(8}@ zgFf!l$sz1D_={=l#S~;=V6UvcaA=ES4T;5U#_2_s%a>k}^b>D<=-U>5`qrcqC#{(| z_xe*#r7MN`Zz!ryz50SvM&uR_jzDO3Ir~}Pk5i8sy?SEbzmB|}ZRVxr%6~`v2a+~i@cndc;)K=V$qLMwZKIpkc< z%k_D@y)slCP~(2(2uhF2p?^*+(brTKH^!9&OdWtLsab#2Jt^6WqJb{k(cliLuNK@R zt3qa*SDsjR%*YzQB>8JcTs+z1wV9Oa5oP$>M5Memf9J4cb&Sah@TeX=4=-pK&oYwe zlo)n=172|I6&^vbni<`=hWs6E^#5u&39OIH!AGgYk?qJ|_yL6qKYwftaelhB(pUIF zja=mG(I4=C5&AdzPXC?nhtQ9T$wF8?_E|#L`0m#0>8lRu+bUd~i@0jER~-g~bY(H* zT8_(8VCh$)K$bbkuX>z zi_vOC9B3kx9~l9i`XQ4i1<8KfJ=Bl!l~j z#c#w~Pzi8!BoH@{FDhvp?vHY`n7*(6xa9Fmj|qD1)?hK_dH4Tm?@PejD$Ye`&XH{G zl4V(oV_8RwWy_K!FOuUpc67YOO+sRmg~TMrR&3c(uq8*5lYb_+g|twXgfyW*O9;2X z1qzhSaaf!LNN!78+J1cDy;A6M?`zseOX=6J^ij$d`~5TLNS5t{(tBU|?)z?iJTw29 zeg669pXJQ|>$xwlyK$Ia9Tz+#%g(nReS7NTykKyP?h1UJwx#XJz)F-q1`rXV% z_7Bog*kOu&BVIVD42KGzAu^>%&cD7OkpC`hTEFW6>&MCi^DvRVVQh zaz>l0Nq@ndnv1 zs$daWih@gJ=IsEKk^~acY|22j($dw&)riXn9!fqtQy%Kw%oA?PTLm5}GS1>GE7ca; zfPaNP!#suR@Jak*L1J9wo`SQGg@Q|!3uM@6_695N-I2s@k$=u!f}q@$Zuvw8n$a#G zFjwaGx&mOQoLp_ObO$@z>K2(yi-N76UuUtX6d88vTZXqatdy{FwO((oYag7xowCzH z17)Yvw*xyZ)T`vI6nN`!cn#Uj4FKhD1Aoe|#djV@j+xhwnQTP1`gJ~3XbC^%z;dU& z*5b6(#++xR@_+dr%q`gu2^QNgrVrL;FA%T8jksH8i=x z8iFQbWzh?w5@JE=@LFr+>oWotpXgqn>#>I|bc=7uBaEC=GPY6XJN}dsLSh)o3<7 zMg=YR|K^$L^O$|^?EaT;zx`!mm>(V{3(VR3p7_J3F@Ex?ndwzGpE+~$%`d$KeHz94 zBr#Tn)Myb}JP8P#V&3N$6}hxZOR-hbrN{8E)d%!pGFnPR#rnOlv47IN*MtJF$66p+ z&d!xHulbmMEobRh@*J3XI&-Oc`X@Q7hAV*|C4e8b;qUM&{XNFV0>_M}0utd9l~U~$ zzf1|7MWeIgEOYVI3TwCk4tVMUf!aE&uc?);^|WDIman&Fv44BN%L z#4uW>k4eD3_!;ITYDX*aD~PUadUw!eAP}jyiAu1G>hsTu!ha2dPN%?}3qPM)5B8_m zvwxwx67&vfVCFP0*BZh`9;^UN!B1-n;RP%~zq$RQ-`_LzZeQRtF9mze`Jd1&)%3s7 z?NyM_{0H<~F;g{0c-se5t5{zqj>R^{)K8Z#yo@n@34S62&wfb-nkxgEyANotf_X<2 zc{LZA8KX&>Cx5{bSw*oS&&{bAxr-_C2p@jP+|Wd?`cVxC{JKPOVo{W)_)BEjDXug~wFS)EjF|%bDfI7E=%2Y}{nJ z!StZ%hs+DcUziMPN|XhTtqDCwCg38)OCnTCRs(v zB#0s>GD(bcxTJ{D2aJqsP-d!HFxOr`bt)j2u>WYIEcU7FJc&kEIagy0h z1(STd$q31ed;kn2HS)zFt??}*W1Pa9o?v))2$mDOC#77`vrwD?u~4)GSMfzQ13qoQ z2Dgp~4RlElO3z3o(q|#mgF5i~thCXNbGeSec&_|~2Gp5H-enF<>1$Oszk=p|A} zX5E{!5+&l@BeG)no5hS4NR!O}sJzf4BVpu*38xY!oTr(+OtGohSS%`GTQyOfJp^H3 z_F-hOLVo+GQI}EDMzyT=_Sl`|JMz4{FgapKSwHsGYu|k1+ArAX3crC2x#tuA`%7<( zet%Ec84?d08~*rTCCjp7%)tge{vYiB%Hi&(V5Hpw>w4&)gwge>gu|nqbe8@Rw2sl5=0PZDioxd%!jk$Og=a9@AP=KlzBYvGKa6sRpxSW zp`alY3OWsi`a+KWT#pkKhFk`z6N^GldG4jYx}{ZBJ|9DtHAuD;GYSI{WRNGE*nfFP znQKGn1il-UfscADxHrgf!RlatkPVXaIqTv=g!GtGjLG-P8J(PyR|7z#S@YzU`jhyd z(O!YHv){JKG(zquzI#qw?Ph3KP}w1DGEGaamxw|Pg)=W7D{UeQa$Y`GvRH5}wSsG^ zqVA-jLR388gRhr+kr7?_*YoZA2OK{_Z=yF$ z-J!gt{4VdERS)5N%b#RUDNd+Pcwbcf$XmD@-*0DX3{_;gTH-8)2H*0yCce}9-Pci4$CAHBDNmpPj~o;+)Fp)}B(r*=-^pYuA8$Eb5R zv%fBG4ja2Ddp^f2>$qm!uYJw1cABToOrS=pH$CvXjMnIL^gyG!s%DX`phzMs)pI;5 zF%$Wn`*>vHR~uaqDcVJMXiuA1^8C-leKL3V9*-P5 z4G`ws*9;1lA3+M03GtGjK@OENr8A@V(Cr62qKyT3O_G>C_xT&;4ZCogb0ag(LXSKZ zH&!5K!EoLQ)jsYKH6Eu#B9fvTY(6=y$x8+})05SKa;2%Xzqn)?P2qq)Ko+%+@9Nwt z-t^v40L&-X6XMnW943n}|L=01ky@yu^!}OxD-*~UU8m&Mu9iVntTOFi+ZNj!EY?I8 zt0teqFY#eMA@0e zD~^_S_EnJ5~16a zSheeFIeF#98|TWhvY4CggU6FMZG~yjsPT$A*7fd|J5U1*{GD9-TD2_!2N!Or zzZ7%i6q^5ymf3c~$y+haa;KGlV(K+1oZAT8a`!dZkuY>3ouyR~bdg+~#iHZ_t&id7 zx3NV}^c$yHpJDN)ZhTVLGiiu&YhS(6VYuz`gpux5B^5#!W3gtWYDR0irGL|cXVM{k$2s@GOa!6~qw4Rj92Bc|L? z{1M{Q>>GdhBgBrRmPU8cOOLL@>N45OfjSP}1GCD?Teu9dAV<(HJEZC0^qxRnv5WEW z&^W0v*IKd3GbrWJ`e&&4rP(ACWAb20*B=;I-m+CZX!XXVcv?v?dDuYLohpxxFv<5^ zu9L$m8-A#X$h5val;8bU&4$@p7FAVdOZ3PWs3)HLQ-F9c;NFY7)5`l}bL+0}<*!wN z?{~-B5B5zD4bV=pYtq?P`Q;$b)4ygmEtPcN+0{MywqWgAmoJl#FmUffKm(_UN8x~$ z^Rd3aDX_*2tdAr%E{a4-Uk8i!ndoost97u}f3^O_^;Vzum*o|KHXk*rLvzZobgL(K z8YR4lq0AXCHS8Ut>=p)fRdF0I%Yd_&<%5=qC40+bF;>+ftG^|uPo_w{3%uXCb^G)y zn5}3lZ8}^$R#(%^V5DXKi**M6lo!eHtHWAOoz!&VvED=|ki)_Irr?AE`=TWMy z1cE~;h_w#m9`PcV@J%4k(*mwU zS4+ThK;YoD>Pc6G9NZ@-UQF#}q`_rCTd2U%Iyc|HszxC{M{Zvk{ zST?B4dM&V6Qj*dN{d{E{T@myB*X3>5m`M)Jbb^9tOI>Z5!ziqJ@spnw@WQ@j^}ejO ztpNl{Ci%2k3_ZUV-~RhC@H&)$RK5+@rT%GPB>BEa5uKo~!+!4cgGuIlKn~1# zTs|F<{O&kq@=qpVy8{4jl|?xa@2jAWmlEkb$tuL#9QH|W&j}wTh$R%%L}Vi5PWAQb zQPQVf*u-{xu8D8;>Q9EH0e<2-+OEByb%x8a-Z&k`Uo$!RF&81bX{(g&jNV*1rVK`Y zf$~L;Lh&SD6AWK($JYAM0)$s61H0YIZ{zX}8%wDH802bvvxxvcxtb64Ksl9XLf}Bz zfA4>B7a*KCNp(ehtyMA@BQ(v183;N9q}*=_t21Fx2pUAtYz$&BwJ5ops(j}|D7}o# z!lmq#&?~J=syiABkDO*r13P-Gd0u+7x$gIg_Gj*;yC=#@8mk$1WI#Gg70TJ1Qan|K zK&&(2+s^p__rvS(xwTWM;_dX0yL+$+{i-vqs5S$gy40-q{sxy!{vfN6JC z7j0Yy)dw7}_f!rM6$hgYB8%suPlbN480z;V9~!R3$AAxrSGZoRHQ$gAY;Rics!PTb zg10Z}R}L^N1qGpGr6gD>>XNz$B_U0S{h^w&*)|Ly*tT>1>S$xI@`}T4hQN`r(qXx+ zmHOz;8-}h5qt0+usVKpNHZ1Test>liyCeF|Igo#Ybg?zO05*BSQWb>)W1wA-7D1wa zj=>^VMQTB{#US$6t?^47h7{>8tdJ^%RbxZ$fUPG&o`gO{%Hnl~!L4C>dA9KLCURLs z0Jst$FkYbx%c^-cQ$A8nuOKIM5+C=gG={F+#apd0=%*g;l0}#rO!QbB$sc?Zbdl`A z@w)}h4!W}XXFi$cz8}A-t`0Wn!VF>C*iakgJNmIeLuqF)lY-!Wiw?|T1c&>YbRlk`?Tj} zCNC14jNu8Trbf{LDnFK#kV{RUu^Not`J$+-<60{^|6}z*@rsDn1BFOfi9B(Oq%zP1 z$XB&rg~m0!ubH1PJA@}QAy23;aXe!C_a+`U^b@t}N^3sYePGg?&co*)P0(LL!;n@J z_oGD|iB60m$^iPjppTr+g^yO9!eQUlVw->U@J&ev*IRYcWCK2 z_5CP)@=FUza-m3LVJhzFKs@C5nMLX6)pN2#p#N5&@#$pP-WE4gfToSlRSc`qIyA)<(fIk!+EAn7B$}d|l+jN*k>@?> zLpo7FGucl{HyTbRN;5ev!i8kPRvm87kNcJO7vx`SS%q%EJ!j4tR)d<}07hCdMZ0i? zVu0{qhLTdF0Hrz$0*eNJ9)YOL75h&>WY_!blRVf2{ev+0kaP+{qo?&70LO);4{{9p zpYeBo`9WmC)%ZDqVA?bEfc~Ej<*KO|?&~ zHF3I;)4~QxELy<^|5Viar0tDOdTusKIKVCDhCSuz(T3lGzTzs8&lrl1pcwAu6m;4# z-&!BQMV!GMw&*luYa-&0=BN5BTIx6Mkx2__k9Iu^cA2 z!X{Dd_+%Af*k_h1XLQBRJqz1FQ$#6bL<)P8xG4cx32^yQ-!D;=QVDAtY>>MWholAh zB(@Vg;Y^AIKz`tOVt&OtL@e4_-UXoT1^~ZDCW~$4!JU)hK22e3GtjL9?$#^R@fL-b zz=kT&PMhE+lkcwOE7}gV$v?TVvj!Kx4bIR}ergfC!+ke5h&B~Jma7rZlS3()3|pb4 zUK0RLyGun_FvZRJl)2Ga*F%Lrr<7!)x~K-Uew%lJ?fei~f449XF62jnHS?rWX4vHn zY!C;ZLdoCYOz-#cSzQ^$_sqQvlpn$`-84tMM$ux)l+NmkHu))04$iCcP5nW^Q&K@U z4YgG*q#q$1okN?mFMZEBD|Virlzk<|rd9zky=o!h`*|XD!fenH6P}ck|M{};ENL?} zGY=b)8O$f`>37ft_EyMdmQRnPOQK+(@b_#(S8D1!ezimL71g;5@3%vNf|5*@I%Z64 zYg5=fKW?7KhYMo-Y3~T{hMv1KfJ#NKasB&RQR);R z+iO9Q!k)~}6bnmFPY)TuEv|Dy9W`s!D1V_ic08M)6Evq0ep&BhW)&0n5RvIjoRg6` zz}P3HiUQSfDCnMPyU)U%%Kc$<*AlL9{*B%ReGJan2=ZugJ2(30nmbI;Wxjz|9^}`b z9NHWs=9dQQ>oGKok;k^lLjH*0u2KR^?qNmv=<^kY3*u|ca$XL<==iArendA6Qaj{? z`%>CmPVIR`{k{H=ia1t&Y_JhCX-qtdgDuW)Cwj{1<>x%LxoxHQwILCU>71B zcJiUHv_A1tN?2d!Svz?S(TJFrh7&4%dg_>|Y1DcYt-FafGS-iySUwi*cOoDnJ}hhz zB*Rhxe;3BV=PzV5QK5_MVbJu{HFJion_QVtd>iCP;hOZ!}W) zvGzzw_sGPwY4yDsZ?sGIX&fPM4qvnadeBeLo*~M(*_5JbU0SZPfrGBJEF&jhT3G zC3QzBLKw6p88DCMkef&drNyCIT}~xJzPg7y4rc&Do_|Qyr+~xz?sa zBbVWfhb*m5U%Z7la%><1UPSUM%VsDcyw;qhGgF0Adl92BepkagO&jHlX=drbEO_Kj zGiI|nc_|l_*Z>A2h`Hdy%Maa1!TqOjbQXP-vM+i7vcMsX5Jyg|uyEFWZTdm5&L%!v zk)f8IAbgO-#8b`%Iw$|Djazt06h%=8b{fCAp}@l2R%7Z{3^*HdNfllNpx2*58BzDF zFF6Egl-QCIQn-*}{BFbz6H~^rEEfpOvleUk;U*?FM5ZmCM_sDI=Cd1ww?{Us5q?QJUNi^VivZGRZX2%SU~BDtEBmqZwGwPTte`#1SFtNKN6?U*jdWBjyyNJ} z6n0dyH89Z&6%MsY7>o%IyD7D2f|pI)Pnr`0{~HSx9I((Asd%3WuBTGHjv6YI?6Idq zgb|~*#a%RJLJ%6FW=U8$JB(AMtQA}^hK?#G?Vq)tj*1o`L+)Tri2zX*ly(zscKr6! z!GffJ;v_2E7*rFg>5sTL=m0D6(KQvnv1&}hxxQdIF%k2Wk* z9Rdqs1kkGx>2z+WF!YQ(@NElnp_{pl9m0t6Uvui3>=_>iOU@qTxYJGirD&ck;`hw2 zn9ayD(bxWI*v}R`AOhCFsg2NmThNo22NZw&|DfU1x2rmdx{+qyyr6U_A6rj(h zlclV17Yo(~;Lp69A)Xv5&k7)(emF=x;!c%JzGa2Q-SG2ljbLnm=L1T_d{hQ2b}+KBb`Ca%CewUkSH;)Sln3ox+|p4emd; z3p=_QLrmSMgsoVwyTzQ`7-qR&(RS;E09&q!sRSj-XyfGH%5(6K3EbQ$|8#yHJJ#8v zuGJvO?|5m5oNs|LC+-b~NE}UJzRCVDh!4ly$o)w*^Dlk=;&c?j3EY ze8616cH{&75bybfekRKQ5DyCw0!GHJQ0h_re^51w%|iKMLag`ehFFqB$`-W8cUspi zxt9IOrQjSPEPmX)@cjDeeJ$y5u*-4wm1Wms>u>Qdv} zSesf$Te?2!n#W?_zLVWzwSuvrGwG`IgnGjn*bcjQ+N(3lP<&0h(@C%~4fOtS__2DJ zc-eH8!t8z>$OJh?_Hn5Y>RO`wgE;&dAKZyEO;0hGzor_}2@+n~$gqhZhr?ZK1yiE; zCn0apO_+&?d*2P6QL2yx>wpbprdg&rUM8^`TG9e|i)BDoW}a8Z*QLO}4$d(gqQH(# zD8rfN%cL|i40Y=>2D!TqgcbWq--GON_CE!4Voz)D;YAb+=@W*oHtv&2yEJUmfKg~Z)=*ZacR4?U zXda+xDcjSskxqE{mce_%z(l9A3a0ufsLX1|!2};C$ISzA1fQk{_>(|0LK!E4v5e*W zAI5cM4UHAvZh^9bg+P$fguWdQ#m_BpF!^Ww3bTWFR_W1(_+9GPg0b^TTf;0X)Ysno zH9=DFP6~#u3VY6ix`-t<-!7Pf8}!#ThQBbdNIfQ z@ERMx4@S)|{|WWeEtn7~8}=~QnDpkJ^}PcWC%Omq0itdXlYmS}I}R6+xD+qV{>>q8 zgQnLZ`o4zw0H?hW+FW9{Ua-|5+G!f;`GV=9AL$8ecPI#&-eEQn|h<_msk#CSdaY2d5JpW98oovW9u7q6Fd zJ<)uKXY2{2%N50!8pEc`q);V}VB;j9bV7HePGE=d5;*)NA4pNq7)H)Sp+tuq$8JEC zMXxJQQ$5$ZEeoFqGhbA*-RpFjqONGU{|i%Ek0F1ep09eYJ&6|CSzh$lY)OvIU0rsh zozspd;#S>j$0nfF0JiWUv*-r?_TN|mj1S)IafA<`$6X`g?BywuAuCSt-19a08#o-H z596>Ybavf-i;QdBd-O-YG_jP>&Igv&E7#d>ZLFq6=s`>?_{zUIowv|u#;_vD_=vwc zm@+$fauBFrnBej(p#pmB`;tsBCE+z)J0)>g=oHb;th_Nh zHUhyC88<;AshJ(COZ=>e`UR)*OiFtAPFHT? zE4r=LBq<|xZBm_{heYUE==c4jOi5NHnk5r?N!g#WVDR4WWJ0(%OA$gxdSgMAaJlXwNehcY$FbJAz23XPBGSp>SnDL})A7$PW*e*$3NL@i-~|6&p`nb`l|0a*Umn&ZE8(l0>bUeTr;A}rXoQpg0)YOVfs=g&iJ>nJ8RCe!i|ekgWX%*t@ZwHk zV;v?dS|Q>m_-D&8_+(KMYr$c&%&FXl*jy@ilr*K&T|335!$*6#{qP5ubI|eGy?g4^ z@npRhx;A0|N7a`|byh*DMu;E?Zr93EcZx55AXEq!KI zKY6XReb7DlADPM?!onPT&&3GO;PzVOgcOGOl@sS*7+2S=&3VZG48H zcoVtX#Y$eN4qA|B-N9o2;fo>=srLfAt8OXtHkLN}_3b9|!0B1Efa`4!?zgWuRxu(K zbf{l@f3I?Jf3KAcKCh2Gm-}Q4@Uusv0jVW&s~)ysN|0VSn~-dlC!G3Th>g&?hbM*qcD+(+Z>d1QcmA6neUx5)}cZt3Ur^F6&xdb|Qg8lR(Z1YoMm_(zCwyZFO({92pTHZgBia08C%bK54jPPoJO-)ELbx zbdoZ6n2`HYP)IMzI}J`jr%incNMMSgZ!as#OUq1i7+w&^Kch?>&yk63^>e9=RWOf~ z&oJ4y3*JUQNRMiHPuubhd@*)&+7QRBm;pz{Mf&IqnKlwY~N( zPpa#UsNDtmVom;VAcilwKM1lZ5Qnm%7hd8mf>>{B{aSzEq4k?xSM9qg77HVj%mK*6 zhPdTz6%a68lYPEI3y5cYPNxZ^>8OUb38gH$k<7^{#LUDLUYdyaJ3ag0kC}bf)d@7g=J_rsf6&}#2*rn1z-_idnd3W&Ky zr;==we`ce?aAKjPXVgk7li~VBrO(!2X=|fvsDuQ1f8>h^&}CoDQt7jRDDU=e4e>F# z;{!9`tS$EUgdygljanBL2C6PC&Qcx*{s*_ z{>{0cYVtx%8|jeB&0o{janbQetL&?@u{O|N-!!OapPCUiWP#Cq(Y%(|lg4*#lB zMWO6?;wMYE!gYn5G7rd+#KAx5Wcu2ob2 zFIhgnxrXIYTj^LBk_EP71xq!o?k`}U_YKXzY-I%FYIJM>RW+H*{sF>Sp+9|VsAlp< zmswJ&{aJDHJZY_=!FmvrXS+tJy(vky-uJGt0CO}I-7V@vsPOJ~t7&LW&nbDaIDLPq zi!{Hr6txvK-A>|*s-!Z95Bj)q3VAN%fp|pEajSr`fB8Wn&XOvU0V-x=W70s8hjh^d z4H1Tw1bTkmz7iax(LQ}@fwclk|C&nWuPF&@WEffKxJag50s+ii0}|E9W*7*${4&s3 zBHGkIk-deLs2k+gnj&Jc;-golL)FF%1^nY8#rhF5;o1Wj&w}L|XUJK{3PZYl)nF}r z@%&cdAj}76VP=TZI_J_c##F$|szb;w8y_(#rQAn(@aG?VG{|HR>x!{|2c9r+gCe|P zF=i?TA(7rncDo_f1s*PILFp`vG;mYpm?Fs`LKJDTR24yO=t=+jP|y$WUrqkp4CrBH zV^^xsuNFO|$XF?_Uqm-1<_S)?%l`^1NDFDxe$j?jSrt@;Cu#PeQfmf0ij!lLOW=!A zwi!0d9%qE5@_t*t)!g&JM{Vy1FDgHR>pwJT9-2!I6R{bXH?&oFGlES7jotS0QHL=K zd`CmgQxFR-6J#eV$4OpSnJ}mBbY>EifE#o~7reVe`j*dRgAZx^0YVAODoQI=hyei| zh|LfIGf>JMWKmdy30nv(6BZz*tiibuww>9>%~qn1EtUmrU{+X_!3Osw5?DrL4&mt13dyrZuE@ z;b1zQs~e%SA{B-zx&tVktB6qq5AImI@0en=*wvN_L%2~wjfa5yXEL%5!PYf$fnHQC z-5xxSdovoT;f7_FR2VhHH4!wk(Si|9C}&FJ6vaS@Vg`YcjW|0=RVd7<8yE@d5~B|J zZy+rWWYpa#`%3$UKV-ix4jF0A3z-8s^PGOD<{z1`Qf&@f1sTG*)N4?jkcKPM(N}B; z@>6648DDr?4IfA=T=}q$iq<4Wb`vya<1IIE(aJeQP6F8ON>)KVJWRV+1$f8Ln7t}Y zV_&|jI~m-uUnq7xygBk82PD4!fDNBGXup{pu=>%!^zn6dHVdK4)p!{VT(rfI3 zF3$#z@Bq1F{_WcTs@|U$9K*xR9m`#F77lW1$K>@PkroI*cqdsQlKKZG{Vy=)dOOz0 z1*2CAL1t0VACj#i`QY_ynl3CSRE=)s~r0g zq}4}!ngCDrNY^XcEqjf$+Nle=`++|`?_ua9bbRmrngp|o{oz)s&ha@vIF9A58J^de zU$H;DXXYFR`c#^)ZT>^}({PwG+-P;MNq20ThgiHON zy-397;4(!BdrP0pj>Cm^OfR|2t?{dEzWqSnN}i49{pmI)sKeZ1|6+R|H1XV zUP28Mn4`Rn$pLv$U+P8agYTFA1JP`e9|yAx7ub%i>zuU?=ZI^X zDU_P!Mt!s1!;4qn4rw17(_dWoJ{NsS)mvexkX)RXsR$SU5jSEeMz(`)OdCL6>+#|$Laf~=0*Wq=ouV3x<1L*qtw5Rm1sP$~) z@3;Cx105op6>J_`taK>>Nt zS+XvJ&t`<$5h<0?X{b6gJgZ9RN|+228jqeY={SJNE}vI-kL9X6osAPXyF3x~!s_Ro z_7w8?vL1~{xne5Gf8^Awd&G!cY$r_NVtlnk(jimE&{X}J|1RW0s*F!ST*-eLIa=pT z7ix~^O9OlC;;wckS|b7a)51>z`6lvy~odLxT=*F`Fb?$6oX;DCg*Fk ziTY(moLV<4V}c)-GYb5Cc8>d5eAl8ZwUchHxrW{QVn&&?phk3BHlX*?C#iIr?rX-O z=F2GipC*an-Pa14Hj0T+nwj&FuB+vUP@Ja1S-^lwUQTS1I z!=M?%Zd#<=Qd<;_%SC6x5SeA^P|d=;D?_?eC-C;D_Vh$ADQ{Whg$i(Jv`;3LL_f*v z#8n_I3>h#F#2Aos(Z9$R_PV??n>Zt#hTaZ2&|sq9NHau^vY@l~m}{ktpTcKIn<5EF z*Xe}+K%0<)i(r!k(1FtP%8in|Ia4a8Bgl(PiGEb9RaTmNgyxCXB!v4r&yw3yPT5KyXcmYE8YW-PScKLP@LbFo zhKl`AS<7EQgub?rb1r!C8YFt_Nn$Ib=d&!_P1~RTKGqo;i|>8duYRTcVbZ>Tk!XEB z_)y*T@R4c#FbKTne0WfVuW~?WCkl>%u6D?Y-_xx@1&&zJ2Aq4i$A|uT!_8s-n`h#Y z^DS>xc)wUVnn=ob>M#Z?(~Wve0ij^{DtvRj)d1_-te)`$>J@prO%&&~#&8?es@G=) zlwcI$9;zW$ORWD4&0N&)F@E5}C_qcoZXLTC>^sm9?s*U_h3WJzy`!XqSWz764MEX@`&ffPsJ+nuzH@tBaoZpyBpa}qq4`B zz1dgX9F>t~^oOS3g{Hg2BX8rberX|r&Bjg)eCG(_SeLG2ipeHH!Xbrz6fuGv$Gw#N z^?379Mcw;>n4T6)q8t#QPx%tAFJmoXjJh%)QV($FvxPYbN?F8l@zm#&;jPu@Q{ds& z=d<8R)ssYmdi};+F4vIoPmC24;(C1XDO@S}S9};XLcq;p7G!x6EQA?rxwSaTG*^Wy zx9E#FHZ?gpih_y*Z)tFD6bpRJ3*gylwsGwq!fQNi0q_Kg2h=TPo=sxPEx^)SXkay? z9-ygWu-@qK%8$Tlsye@*X)57i5u2dMBWljJ$hoEF^;98V1i?*N?kV-{4IC zCm@NCg;a($tI@cf;jE|)KVDuww(b_IJxN2ec}R=-&a$r-FBTlTh9Ia*sg3YbYxXnN z5Pw(c9qfT=tpw;e}QKuq5qNJukxwv5U^uO7?^8w>DH|Ao6?2(ON7 zOmIm(lLmT)ej?{zg?=LAUn2FGQSHHOM!;#=U$3Of*`FqR2HPX>{mf@>&XL$st;Bvc z>w?Ob?;p)Z`^Bww$ZGNGAZ+|++u@b0jSW(z?mz2Ix*Gq;(QI}*>JHD|HnQaffEOLN zoB!`@xcs(frl1>m;~U?DGe{1CGgw)~kiLv@B@dXDsf|`|2)jjNTwY^+xSE<3cwjol zg*1Lm4~PlkcSpf0FeQ9H#UIChPKeLtU@=_!)nJ5fJz`KB7{zpXNnA6yPz#?2e%1Il z@nBo_J#b03$zU1O7IrZiT*Fx3fp&x>olY>*fmM=TNhojOa*+%wf|?-^Swuf6Ei+h~ zg%YQRGO{FbxXR)I5KZ*x%T_@}0-9GrOgbk)_Cx+YkOZ))IoK_i9)7KNnutlaZ$^&a z9Q-h;>;?~){;0o+BFGFLK5wC?PRtxyOLWc03a~yidp}Jp>JaEyivX5Uzy#u)`NBiU z;x4|$gZ3g+^KIZy>b8c!;UuKTD=ei6y-v^X{XT3HBChc3D5HHX1N)wjmaeY9w`r|b zf2Tn>?Bdt%lCHNy$C^?)0=@Mgv z>MS)wBGe8}kIE*cKrK`X4rrooxR=8D@F~(glv7lfjgw_ZiK{wC>T#??&E6<{TkprS z)mpZ*O0Ijq2!;bfr}fyHwmTgYAwM4WemF&jx}afylhpSEiC5RLkr$}*LVGk%W=TAs zmhI!B4W59Baz<&^EMG*?(JD)?XLT)QGv~yK(hA4Xz%|C-WgC$X1RmMUWx(8Uor{Ik zah;0>O-<#$5oBibDYLHGCYtRKR~J%+MXw>kNmKo4QyA8Dcuy|6V|BO9J<{B9XRxw5 z*S5oN`vRDx9#wBSFSD5HA7rOC#?lDs-l;Hfdiyte#yHBoyp=DT5^UYy{-`cQu=@Fv zBc=*H1-vLP_kf#t0EqFeiVQ__U~GvF#XP&);KeS*;+-8AD)^B#@spF@F{;li?A7wu zwaHJS*p;SO;Q9^P8o?6o712^!ppIBULL^g_3|b9Ey@b-tV#Y?>R@?4}!M-&|qT~{r zr54*Tn+|S{xlD#s#-)f~o)J54C!wmuwf&P$ z1`9@AFqxvycE&YjAb-%<@=Jp0tf%J;REx|=ksS;{lrBMvCnEZ8I2GLarhamP%?s)% zt&{sB-nV`G3W(<6G&Q%M0=Bwnj#HYq{vH>jo9hU$0J<;zNVH`0)syn%in;#(Jm{knysZCpiif zQutT&nDy94^_(?er#qbGAZnzX=7~TVImZ9-=L!M4Fp&Vh{8 zVx|^f&mW$85{RG-J=bCEwx32c#TS4&A9{uqAg>7ezuYEYNr>PV(r#cz&@Kv5isBdk zTC-SG1h`ldT=eIJoG-n(y4b3Imv~1Eia|R8HWqeo$s}F)^XoC<;>2Ad&PSsAI#Di8 zysk$pv{Ec?SWlA>;jgA}(av}FQyo3YarwV_nAB$A8>pm7NfLDWU*-n=E5;8Q5GdPa zD!R~(EJLXYBzUr9L#v!mWJ1TB%_T$MoCV!0081Cwf2W3p!;}x~MQm*mcEm*pxJkYG z#7EuMVDTn;&+D~rF)K0njJeBg9*2uWU3VLyqp`T^3|)=fR#!jIuhY1&y)$z< zoU*-+lIrRNE#`W96ERb5SGul9>60eCmr;VJ}n< zSEj?X2(hoj)CWP$P}Ab)(94aL<=mUAbCUu0*t+9@bzhV_8@VNPYE=lqf2yj#e~oz} zi)4V6H@mVEpz2VlcoYC?$!UzW@~fwHrvk3+*G)WJOv{J*Jz4uNe@*6pgnNWzgg_l( zPNzlM92etWz*GzOPyHe|8T1uaB-QMy=jfUeJB0;K?+8ruwu^t+sJDmQn-nc<1`F>s z{(+7v?R=>HB_L6_!a}4@&u146QI~fUV+~V@-h1rUv#07wV=$BFN$D_dRv(A^j-)@( zpnOQWrY>4nP{1(mrCfhSoTkFW+p8*lj#v}-f# zJol>R?ysv~*BeLZQB&SBSFVJvIrcdYutqdYgCY(UD3WfcLIaMd{YbDlP^m~_cd7xnVpxNYNJPH@$593_=5$qKzMg z4x>^>tKzmWZok$<5hgR--V4S$uf5E@BhPFq4REwuF?rlNn9ozh!;#`#>S_TPS^I}#rpHnN z>h7#}p%)xfxm>Uu58%$pWP6KA<{xNL-=#b)qb~^PZ`#k&w~{w$54;djHzPK9F)B$W zcKadG1Q|m^CBwRbGaXMdX>hzua|`(pRcC=_9vs*N18|!XdYq|Qgl)3X8!ifSxsWmA z?}gw+#ybi5kL04)(jf@wI#T1s3iy~GVFhXrdw3?ehb<|X;XvKbfAJ&do4OqZQK)-S zx)H22;jC?O@KpO93QaO(l>%|_FAeYHt;1?+Z&Q>@cEta%2l&g!(r}`vwN!@1_8iCI z0wKAx&$`g6y0Tka&Cw^{;5ToC#zNYY9twHsn(sh2tfd#t-?6*jN3Pc9K7LIOep_#K za_G;GH1R$koB){Jkg(sfgBoB0k2d;6(}N4F^`J2wTvm7UIkK{Si-lxS4m77glhK*+hzIe zB8Ze7pT0lQq9L&&`5;|<2nfGU%kvdP`4=Mb^~ywD9BT{s9>&WjkO9W>^j6Vt9dgky z*Q(Q6OuCNoV?EgItJbrynE84M7`>RiQxPrDOa#&aQ{>Q8z5j^@1XPj#CmJARG-q;* zxiF{+{Qdh%`0Kt7)q%C(N)*n1@MPE)N#NmaX6$sF^Kw0O(?W*}cmhh6@=6Uvo_j}N zKllz~Xw^5*SA$dnliyevh^Z1q3YWIFZOOB=mnf;U=wR~m zM0;Qa6ZTyOIPhRx>!*2Ub6I0zui3;B9+p%4{pI-(l6ZtqFZ-hoH=mg}B+^#jN6K$&%6UK$gcG3;`SPki@K7V>epipLz9P@UG{mGPw;ST8B1>pKLXXNI| z;iTk^h0HKzrUGK<%tr$z=$K4<|_gT%_ zzwA_aj2$639R}g7C7WXq9d4Bw%Mm~V+_&l~a7Bi?pN=^7JYUVt#UTq1bC!73I~=vv z38a_g^;9b+eyt~{us{s)YO5n@#o2S)R8`~F2#sud+`5>czYdl4v)j4&+-f~YbH)6A zMNbrWqpoaC55Ie|@nDt!cR@Lz7^d02=dui-6TrZ5)?Bu@#O(7L6# z{SkjClF21Zhuj)`#=J)35ZEHmOPYf|9lpkV|3)hmJ9BLsSStAr=LaGuOCt4e1 z7^`RvHOQf4eeXUlGClRTP2@QYxVjaPdwRCf(5W9O3Nz8z=C6oUFW>T0bp-K*Orc=m zgtLcxjGKomJ2YDCKfCbmX0@Bb&)Xg7ZeCZc=WkvXda0gnZ*in3N%9?OLB9*F!L|KV z!091pa*6+{5H`pO^B#i_pNPCyKV;0ye}P!$@@!$aVMUIXn`Vg;o2JADoTC)M9w#9+ zO#Gz4l5p~RzSV(PL+-%OnE1uQ+YfvrfLxhLrIb>@6BT#pL>Z>$9dqLdmiF1TqV5Rl zLxX2RMY(*a>%hFzX1}kPl$ryRBdez3tzBgg#}Gmo$D38u zTnHQj&}>SH2#_)N>CeLGyeH)jE1yU|{RH|!Tk4fxl(@^^z{Ko6t`LvjKa~*q$D3&~ zla3u+3_EMg8vk{pnFliOo#%15>*`14p@c6U&aJ58UDT+9JK$UZh6IS=$uby1qhn{Z z0h+>s`fI@q{wUxnR`K~tkeV@`3f(*|jN5-NO^Pe|^fCs>`Zwaa3GdNnkrXZSQ7C=j zs1xCjal7HM7>tMcwSR zs;+A9w`#w?=Xq#*KU{%-=f4iRV;)wzXJGpCxShD-nY)qN6xfUrnQQs;)mr|u%;!Rb zfZ9j60U2l*JM3tGtFZFiNnCi78WR+#72i+a=7|D_=E1oSJA|Y6gWOL65Bw44lE-SV zyU|zTf6Gn&0QHsP^+1tJ?-pWgldKxJkU)uN5rF2i^fPwCFUYDvt~+2q7b5j71Ry|C zwh4s;m5pT~sbU5ZFT;i_U136`9@J)nE@YH2gGfzG6uE?;aX>`gm(7eC*zt20pZq`6$q6v>7sdp$E8y2sxSw z_r2Q?JJ;<$@i4C@W&`GS+p3qk$=S|D(>vNrdmlC~^?O|6_M|_WOqGoaUC=qu%X)~C zDujXwfFeSO5Njlh1B?;zB{%fFsY_qQ{o?yJN|oPS?p%1=QlfpCmQLrAm#GQfb3#`h z{8W+GNc_&_i&UZ8FGBTYSKiBnFrF}$2J`~=gaugQSjrp$tUxRA$7Ga5f6#y?#90VN zj~MBMW(D04m7}TT#&*WGlI>!g!BIE)cO*0PP6JGy7#x793AmLOV=uruNRc8adfGS$ zn}P#Be-^e#^2hI3x1NtDFA|QSN_U3w;#}A~LFxVHY(thKr1lo4g`YT}=S74;sj(GC zjtHT=tWXVSLLlQnk6-#;c*@cV25h%aQ;OXX|J;%;_s{d0PF6?chGHZGuI9I=hu}wp z)|Z&Q+ROT&_8O`8ZStz)S8H`kTa58MPXCnwYbY>uEs^uolz1VPZr}pT2%)M^tNzyDD;JJ{a=#Od*ud**lFZ-MShl0_icE%d2k1~ zG$|pOm{@(|`W5UOHX!GVHERU$8tn1+KoS z!g&k&2Y7n=|FoJUyhnR)i&1EIbxpIaRb@`jL;(7JIMPhDvL&dtDbcArN`@4*-T+rW z_h_|gkRZ=9&u;3bGMe=&hRh94A37ubO>LQlu8spYr+v;gL7%;02gH8vu4X~Nw8z2| znHla^Fzp_#27$!99o+lfwy>`Dr1jZoa{-%PnZ)XBd2sQIt`T6VJXkji@`DCCkN2+O z3GlP$`UI#r8bmSg5q(`89Fa*EWeTKJz586;gnzrKdHGm=+&sm}i4w>&r1g%_CYpty z>M3DSY)z4$zHGnRf7ZQ6FujsnqD3N;dd4$D-dwvrOcOX8%>08q$HydYytboI2R&DQ z-IYi&5dKt2m-U)qC-owhwiVNoKCURs4h#g=^A{Xm8w8uL)r`ykaVh_@-SB@Fz$)=A zjkx;2XDAt^P=6}EAAH(~e8ldsU2wK(kNdP6C_jKoh6a&Vy~+)w?)oq`N2=}V+IO#3 zLG>m29sUZ5l;Og&xEnEdRkOJpHD$`MU>hU%0CfV0qb8SiWWgPV0hK{Ug_t%H)Q0R7*<>x|-;JWrJi+0Vul(D2 z98&frDO~wrJ;B5i%kMWa%7`~j$KzBWW1uN-=oV2YNhsexEG|3AkWdFIEP;>^cHI>9 z1cb$^bo3aR%XH|b%HuO_Y)-`{I2D%nUj}d9GKvrByqP=x{uNTw7dEulp*2+;&H>l6H1PfVAR`th;4CCg+?=4vy zmaO>esy=V5;=@GfS?QDnYFYJAWo@LL5max>L0#1&&!IqxRgd5$U*1yu4at@+jl4c|+J+A9SRx|W;`Km!LdFEB)R29R%kyK*~ zqpI*AllxIY?@y18liEM>UR&~O`q4>|v#>O;RES~%iKm8v{Vtq5L0Pn14}G?z&|pYr zSG4*_)sSm*$~L1X#fv%JQRWi)eS)K+73?%4)>{m=m0AO6!8-AGwj*5Dph$hVGUnk; zc3(Z%bw+QC?HIOIPpPi9Qv0(wR=xALxpH)s#2J#$?=ry_=wT!9@8aj#AydYzIaXB1 z3xd+`TTh0Dnx0|E(@Q^y(~#;eHiiAXj%AsWYaC@so%@%k{$u=t-Mf#Q z2BxL^qin?f4IbPOi+A179jkTgl5fVXI1-tL5%U<-7=f zI3jx!z|DoJyl#CvniLpr3R>%z=UK-S!nR=dIJ&gp%YhT_cNKCu!=rZ5{9v+Jo11RE zT~@RJ-o)JVr;QUK@graU+w8Sp$=YSwKtv+gxsqJgn*T~Sf-YHW>FqRr4!I|2W54UEd%a^9Ze>K#Cl0!@)Ud zN$lb5%-!PDzp9_(T)vkbP~Y~^pK*FT(;mD4YCknueECVy5;J9H`$8Z5sKC$!@AoP0>G@tYCN`Mdr zKF%l9DD&|nmiPaio3}I?tEjPXOOwy#Z1+a#>FniSs-)O^O%19qNe-odg^}x9I01^3 zg=5R7yMOpeiNKQhS_(# z^@WLz54zHdi^8ISVfXUyM_ym<1YwQiN=QCg#b}_x8@Hm~zzvqUOi+EofRR1N{09fd zV`cx}I4~dPeDXzXRFg0AmhXi^DAbnmv`Q#R|Y1`Ud{R~@by=QIQ z5GpCzC{FC!sJI`^?!5`j{hTv;O0%Om4?PlwHb#+PPK1@ zCIXX8ohE^;#^PXO`G3)LHr7-dd1!)ExNI22RQm}SR0s|>w*Nrrz_U&`Z;Yiz7T?Qp zt44-sY*0$npLny;$cn+pZv=ruxO>YC?pol~ziN8fcvw@oN#meOWW;1=MH4I>5$x-^ z0MV?JtdxumGINxSNY&ahYiSQfl-7NL4^I=~)t9dy)!mn$uQ>y)kL&kY zUKhMaOzhaO6hW?5K-5}kJ3V}+>?Xr*oc!QZvSzpQVz8b3a>q)rw^Z1__e6rHTyIZB zr-$D@bc57{b(b28_N114w8G+8QS!BK7l+qYx4bO)V9pIgxaO9`LLOLrq4Oo;!~v(= zh?l_r|naKnUync6%{_Ju{;1NMs7N zCxB7`kn~upTh!|I_D@F%^XBdS<++U?$5mqTgpVJp2hCXU@@SQaVvuSf+Z!1GBFV?E zF2NL*)luw}f=xOX*%k6gEW`U!MA)we&xn6D#<7JeWO1c<{CC z9VK1Rn<=dyB$L=6d^b0(u)TuJ~eZJJrE2R?v zK6Q^aXL#IHCrvlKJsoGcz2&r(z{sL0|A?iJkg1Q{z%O-|=BoO-T0}>8`7{ys3C*a3 zvlN?AoRMWSo8>3-&#Ksb)+ql# zsy;u|oTXb>{B;`4>fI~P3StxFggEqwWkFUS&S;sr3|cu|)<5e%BUp#O2pzrI?=I=e zcyTy+p4a`m^+!<@D7h~p((sM46R}c!sc(G4zYC`G1F|#vBcSs))5VZs@7BOp|7QR& zEO*#(hcaR|$uDppx-spRtHIIRhr(Z#DU>Q>dM?aW` zXK4O0EN;tJ3?mczU&;%>NH(IQY_DCvKast`yn%ht2l^*|W6#zeuLyj8W4a~3<-7HA z$9tuG6?o-)<+D7%{sj_2AUW_Y{Q+O--1L%aNXY*_s*|X!Azf2vT z9n&ckK%@3o-0}UH`vV$ofAxxRJ@DWzEB)4`zJ9!jo9#Jd)0~N1MA)p z@VA%dM`Bl~_+y?R@i71I!So%FrkfV9AKX*sqO6Ug? z#~$o5C>NN{*Av?#f0RdYhPEE~5%L+(9i!N*rIXIkfc%L+G0?mVD2@CsZouIe>le~1 zMdqyai}z{GZQ#+_gB@scF;t>VRG)d{&F>)Qedh8A={pqM^nZZ>=!|uk(`}6qd}et zUd+bt)UD8+iEWsj@WhdpTVknsTia_rj(P!`gBo{6W%TOEtG_815WP2}77Gs|Y=SX5 zeh~oYf_)2C3%!-Jix^Z)1~nwwO~Ot53nW>^R0?R-TCli+Me+|6e|7K0I13*V?{n64Z!s*dJ{SdljuRy9Zx9#K&cBHHV}Ahcd5=@^SUs8J6`7B?)D8ZRPY6} z?HQUco9~-1F>*|q*Z;dR+I+2uTZj_v@AHoScB0S1jN)&n84!w*F2@p^@Q;BH4&4)B z3?*;)$1qo+hHJVro=wp6L!kL4rL8HU_jzHQiE)*D4fw#1T?Avrsvn5IkG-|54aJp! z#a$q#P@xA^Q$P{`31RfI(EEyQqeh7F$7je+@T%~`H)SvRXIf>!Ja58mb>GZ) za8Ch02U8m?NhU--;UUVarJt!Z%rLp`jC?)sXpBRd%Gbo%ULVx z^>p+WlVK^T$tmJ}`9{C;N^3~BE#SrqjEZ+ry#<0!s zjbgXlm0K!nd?+t#nfaC1ivx|lCJmaIU{=sZVk?_DojhL1#juI`x~-`qC-U1iBNy44 z{ARb46by*9U8_wG`NeXYi<2O?_RPRRu@;L;j|tS9Ng_5#D=am!QN-`IA!5ADZZa8pyTw6G0)Y-&~K7%pHA%Ey>}sGi@{+a`iGm7o`)& zn9|O}G3R~LIdYncOm2xat#~hfO;L`%r!mhzUfjtCvshR}mubY}p|Ktp6S5Y|gUF&i zsyyCf%5{uI&-g>86BsXy+w}$F_+ri)`(n)LJ1_FJs+wEvHyb*!8%#%mDLz~(H42Py z*p~;<2^^0nNNfe5FMp0<5Upf6hFx#MuU{s8@y*2ZM$%gJ-)QJNS>nr`Io5eJV2x>)hyGi-A75nexBfs2z0%{QQDaB7B#96E5PFRV$5H$bC{ z1*TRd&4TMB@<$CgDKocxdVh0PaM5AnoF=d5 z{$wmljSyIsJ|JCpkx>j*b{S{JI~o0HP}n1bn}#Apg?=jg%z}Yl>X;c`BJiEaAO?)>w(en6w532xbx z=+&}NJq<6AsvU(` z%9qo#qpFPZsx2yRFHs&%Hr-qkEXsneLI`1x)8>K-o-LZiwGHz_51+f`{P zRTxJQQ3ep`#s2TWQx6U~OvL5U^SUzi0_(a`PP0;=r$7E>(VRZiSj=#auNmM-oKz`5 z+QTR7l76k1fG!Qs*h3m*EU6Ibj1uM)R#HSbk$2okfjcAM#)neaND-AZJSXrJ2lrRI z$+=El)t?K7hHL&Dwzg!H6_sqE9ro{zc=bDEev~B;b(Tm<8i+~;u}@$K)qMpMRFMp8 zE|zni3cDgKKGI9JPw2;b@nghPVq_~+`C27NR9LbUay5Aa@ya%6Z0iT@3%2N-8|;Li z;9^C3O(7-!vKze7H^q*6@e)-xe0NCr3y#PJ*+J_R^D}%b4}6MD&)!B}|G~HPG6_@l z$SgWvmKWLa36oj3l>70>CV3@RS`az55vM} zh4_hVHtgDkMDe=hkK)Ae=O~@1o^rP#50wcR87Q)o|AdeT8nud)t<~lb$mjaqf^Yjz zI^ySzYiasX#mFIb%zA7t5jjengj7S~xvNQm_&Fq1YX;7aqn5P6pN9(>n0OV67>g2h z>`!?sj&@N;M*^j_=_AVw$M7Ra<|TnM+II=8!!=om+JKb1(9pkI7;l zC{FPs3nbN;%!Y&>iSOkLFvlvNvyn<;s^vnj6DKEI6cjrs+tBbTOW~a7T4ekBS4!{c zbI`bZXLYVyZ>jmcesJ9g@W9#8KJ2qTLGCd=(Xv%%d%KZ>h!)LK*}o78K{4(;v)qqz z)BZ&E!2-(90%D*EJ^&!m?n zzR9G0q)5&$d_P6xEHlV?w_k50+fgb7lWnCYoj%!}BIr9iju`vi=+A}&WisuuiA~{`$C-V&jb&KXMD{AKP zs|mBN1Lp$*f3Qs!`;5y;xpsmocV71U+K|-{En{mD<66#=9tZ9ff|KftD#xkp;?RQG zj4WkX4&iYiY@1Wg_UH2F zuNmG0Ub5uWbQ&8(R^eoJQa}M$VOFv8w^1x!r7Eqw`||kB9s&gmxfIS<(%Wyhq_>Q$ zbJ{4#bUx5BN2^))>7o|?#;B&_yz#>me-T%~o4NWWlI8={I%Jh4)C$UEiU?JA_UI}K z8lqRz#tfpoU(hUqtwtq*8ol_nT^2-*Id#PqUmML%L9>1p+_pLqv$;9Ag>knToUt>n zUHsQhZfyb1ysHIijiyZ2-CVi}v|&tmk!Y0Bq8vG=uDF+R{I-VGI(#Yujtwbl5-|>w zDozXPe6N2`H1}rMNvb^>0O%VsSxtZC{ER2WJZs)ZP38xFtm+6P?muKDuI@w7HRfT7 zNkxaU?PV;*AqbDjV?ZFMONJ6@@P1*iONwLDyLj~cabICxH23Q@0ES>|0BRJ2grT+i z!c|PZ;?a}9q!!x!`6@cF-|M2|wjJKIuHz5o^TkXq%@j6PibhZX)|mx*j+fEe^t4;2 z$2!(Dl^y@=i;I0hK<7Xg#l6v04RIyRY*EC#f3N zk#`U#F*un60-bB6GH#*WBSim09zN1>i&K?t5Z{6R;P3@B_>gt5@AnrSF{ zu%)GCnjBgV#P|#2(!C76G4P;eeZt%nSQ6_DIs z>QF z7*o}9BT>@k$=yXWlhh3Bz#i&?hW1y#JWDMUnK++i7%knSzDV1uz z!#0f06}h3w!5`WRvY4EpFWVJ*f6JiFRX>JBLT;W|IE^U ziARlhOw}Vtqj2#EgX&HaQpE~gi}EUfln@8lLI#HLaNMeU?w*PC{D}@1%JNHzi((f_ zsIPk{_NL?svwC&HbQ3$dGvO?$Oi`^jCl^T4@bzxK6w~cyPj*b@?hAwAuwG=NUMoJ_ zb|%(WbmWa3Gv0Zb;}@r4^~H>-U=t+R#REvS$wVpRa1>7Fb-b-RJ(TV( z>zz{0E=s|7ZtiAf-`8Gj!!KwqbFS=4m;u|fhI;`e7v4?RU_)$|r{$N1oUeZgx^Mb7 z_fcm)B8*A{-jRC`Q^gZLxo#pe+r@xS1pd`rkKBvQfGeH9Fs4Er4ia!^Ykv-uRM}7FJ+}K1lUp<9d{v;c+49~hYEdQ)jJsT&@z_^Gsq1}#O{$k6pOUxjVLBh0 zJQ@1rxYU^?G~v2c`vTufJ+BAN!TSmS4g9;nk1^ztgf@c1H>R{(whn36a_4%NTNlfH z=f_u8(`^NFBh`YK*6EM>tos6u`8ZVvQKd4spWYD~H}tfDPuN77gowak3aTP=SS2?> z)$7!j92-lY94%eV92zDac##Hla4qE9T_^__wni9`vR6$@+En;{7_S0vC2t__7-3Pq zexdQI$R&7ueFWMYjS5W*Ma^8Z6vVQ0iF(bg_R_xuH5`mLhmY?cs8eKJa0N?YswuHX z9hx^kYD)AWeTz>h$BBR&^W7+LS^~!0B&W%T7+g;@bD2g17)nr~g7ZrO(HD`poY|6f ztk8v%Gz2N(c+quXn&cU^zbjwppXI1*( zjyB!e*|rH^Jz^W8-L{SvKcW@>%irGz_2XeTjOVQH?Zw>nn`1!0+=Igf|D4eDXY#Xr z`g6j0k=~H&?3?c*+}d#KdONS9!fV*`4}j=v?FU6-ncz{GH3~iPfodV?OVgOYXM)+xl4z(>rTd{oR0gZ*lNS}2Fu^3r-iWr zhaUciiH(h@hPM@d*FLg#2)mHlYhsIgs{%~>~8J} zFS3#l=Y(CdM$GkeM?kr>VXZ-$(Jw4>zLM19fQeIM4Fb3KIH9y{CU9N+J#)R%=|sKF zULw&olMhH&utf8s6Lu8M$OlLumW5E2=62dEKLraK?Xw99##&UjX65+OgtB{9_x0d+ zhH=j_dU>`&u95w;-I2&7v!DcPID2G7KI-d3OTH^FL0apBT*6B`CahD zI}CQ@GAKpZO{Ky@;cUdT!< zX=8hLz%FCYPD+giu11_KWNIOCP@%0ZY~rqD1#1PRC~U~~ulzm{6o=IVYXrV6qaR5A zZU-DYcuQ!5{!464aUvgaXIiOzm8YgY+tj*14!BY0l$#`SUnD^O_TtAgfyWSGvY^+l ztGj>5WvlLzJaglm%PfcBONe=NY*(&@Uj#F#2b`zlqX*5=NLMYani4f!)Hze1!U{3s zX9v*lg7f=ZyTx-7$CS|LjB-EcLwLSHMFQ{VklzYFetsn7+TK4t!MwM>W#u+pCvy4z zv&MxIn|5u9$dyo<`1p6Bz06`eRWYMIY?+-?^gEiIfsw%gD{2DWa(K)#e8B}|iL^Km z<~|DEgUtk0VT}iw+MG01w=mH52g2dSp{SXv#%OfRCtUmYA{ceJO%HO$UovlaDS6;> z2x_*^s*-~|?Com>^09a>9OS!r==;7amHlSfP@c>}$shk@j=bHm5Nr+A8Cg1=QP@he zpkpKwGB6PI$_eUEfBQ3;k3VRN@aEc<8LP_)sVFjJhpO73MgU>3+GUl3P`$bvtYMes)f+8 zH3KW8yyM(3k%jJrzjX04peRb0g+3^$T@vv`r1e|HdvGRvw|b36KmOFsZvk!pDt z7F@#KHB+7D7ft#GegQh7OXDr$bk&Zr~w5jG!+cF z-3*0oI_BnCvY80G>bgS5n5!3ubD9d<-SXd+xgGS(#H#3FS5oyb#EbuN}9h90uDotkaK&$s|)f zc<#VW3wi1V6YNfv)Yjqgv_W~X)|JEZR3h?LRB|bs-8k&*e15hoOD7Y!hPwxmO&NT& zqeD#l3tYT@AvvHwCd3@aLxz=rUR>AfvxhSrV%v{P(UCttOM3roqH+$MrIq7?UrL`u z8;4OT%>+O&E;H)GC}jbZ8wk-Z!L};Ao&TwqwM@E9!Ebd}UP?t~2eW5GjcR)MW(b6s zN>zU@)yehsbq8Ob>H!TQ4Obe92UNB7SSBf#hc|*w(K;VC50te+)rldphoTd2h^T^N7)5255s4vf3t~I4+Ta6ry zsfRe&7+m7C!Rp~bVO``yCZyHl^VV2XB2`eVHHSO4Jazi)X6Es87UjW>%Y?^;tgIY$ z($kDO%;UgFS5XHtCP5HE=aUNHAL3#6euMX!*3D||$!(LA5#y-&y3#TUDG6P#ArAfB zvpihktoiABG5Va|T$t^^d)=w|qvdmMve{KDQ*Io=!$u+h-b>#*-~-2>y|2x-TGa6sRl-ZW8F#~r_ zZtyN+or(j#JUD2Yf)*K0t0sA|I#KE5>k`=@ttmSXj8^ZA9ZB|BcxA04&!m&bnuXTt z(gW5df~Z_S4pbFYMvlMVV74odz=`ze|LYUc{Jp!&?^BY*UrEV*c0fM&W{}mzo*;J* zfO_r{tu7!%8S_4VEtW~$oT;h)ar;Qe z3G21`ZY~jga00;BKHaXDOk*9^pJ>6FegV1eGZ(8ak>f!5F@xuWgFLSz)lTj#+FP$9 z6rDaO!txq*UGrY+_S-TL|B_n%rCqy$)&Rpd!fe?!StGBsp9mlvgUZ!{YqmLsUweE% z1w2J%VKo00r(emo{)=XwyT*rd@NQNvfjsxuY6n;$KgSnjuy$s-eCO4kQ?Ek${a zE)b?T=>1a>45C5Kx(ViNp>GZq=mCC! z%e=p@5~px~n_0+#U8U>oiM-RsS zc?+k;VD26rYT438(L)sjvD{!&+~5LYleqkKIlxdX%*GnmIPn|NdksvwN6qFwKlkfAV_Zka{1#NxAh{!q}#X40(uifcqjJV+Fxnt=$A zsMEx%4|K*R^+rCMW`&EYN%i6KL14Ys!K--3Pu~g1$w^HOEeiw0t&v8E)`I+(c8d`E$kH zX6AXlV+#ji9l&Nk=xlJvxdN+c;>NItQasW~yN45v)XaUJNLmvrg}Jn1dsUqdIMlj) zLJp*{KWa<^nNJl9rK9snjRa_2oDxw}n!WOm3+%T(nz*St-6mZdH~7BEfWf&R$u6Agk^FxZo^ zoZMvalwzb#cGH-1O||e@;4;j0Jt{k8;svyG&HlviLNvnZ{yk3`{RY78jdy5TD3iB_ zd4glq=)+0=wdAbJon1Mn+y#6R=hP8}V}wt(nWTb<>O~T1paDIYFsw6%_FBZMJ8G$Vc7Hj|WkfP|qi`xF-Gwch6(oJ4zC6lndU%Zb<3vz}B!~?K@=mp1x-(DckOFxw3B%NxH0_RB znxrDjr}O6~vdF9mDMADGi1K-G8XGi?Nh0AKhm%pl9>dB+#y*dn?}uH2sST1yYqwET z5|C^8563`5*9!FlH^_Q>fpS>em0MFJ!Hazoh#=)#UW76fpv_FsH(M;{yw}>ofFn0) zF!r-d>*{>#X*7|Y-UKNW-vrPa9oa0%zTChrH|!hLOzmilT#E&^s~{?> zc*EO4+lsO@_EA(5Ku}Iy4rF{vdF`D_1=1SebVrV-rZ1&&XTVJG*Ezy{Fg(dVx!pR} z0f_`OZlrFds6t4BLdRk1A7M~JfHoi6i}WitlW#vBHhKjQL+gCw-kp@OLJPMP8~W?( z_mS%pxM5`J+zLR_;+(I!rL9MJ9eK3ZfPzJDRd$|fT^h> z4or3PK8*({37Q?uQU)HmZnkl+BA~#WSMpC2-hYCqfQf>T;JYU${iKSLek7G<%$WsF z%bfye&`ps_BG|EZzQJo>Vp`$?ETQiw7roU3H4qM&q0^91mAMpWEkS;3c6BK9xZRI2 zK-mU&`X(RPA3j-}-7=T!xyN>$`tA75&eBJ^BJzfetbv9DlaEL>Z`vvhE`G=JP*O^a z2Qz}QqP?y*1mPi|3iSmbcILf6P*R$T^*`oYudILtG5Mk*?_SblQF z+hkoUr*OtH`d%&&HK-WYR+5T1a*ZG&$qGbCsEqXG<-b!NAKD5t8E9Wa*2v<~&osqA z)P1Le)Vd;`p`n1na5GN~v}cWed%z8ssEmoVwkslzZQUom<^6YWD3Ph{)V5|1P;~U# ze*{zDFSO^@8969DApO8Nb0$HHrZy9IFH+F{gJe~kGSlVz?GyWrB5VB5RQe;to6L=% z%s1qrp$L|g3lClJ*+k6`$j{?ZrMP&$i8FX-3N&TMRQG7Y>v%8#aBCzr_-}mk-2>Pv zdfpQ8Jb}d_K!iZRAdW!v;=H3xRzEmQ%t6tSgK<`(0x%}QP^>tqfZVe$noRh8z0T?% z=(pz;02@sed)afSc+|iq;|wX=dG&h#fGI0240;99)a-H$<7<8^W_rn&$`k)r4UC{4jjxc!bi40|q55oE@X1NQdDULrWfA z_vDS(CQgA=A@DpfK!9o*>43N|%RN&~y%mp)_WaSmui>g_lk_U>+g&S# zXv;qDDS_=J35uisCr zA(OTiq<3tj9jhyO3hoC`3

99P*qtHkVdf+_)EN7cFA9u(KN-9nMaJSdw}K(|Ds| zO`+E!efH-aJ+7nQY=n9rN0<@+qQv8bfZy}arSjcv0N3scC$5`upOuE1#dVxxO*^-V zhcm0W0SZDmV@qOjmUk^RTgpx!f{Ml}Ayu@6Js_+TJ%g_G_jg8y zK0IMzV8lBW)pzG;_Ui|7Nw8%(0r;aNc#G|CY{f#D(VQxQsF8KNia-DpoJG_hAxf0A zUNIlq$!`NXZ*#jU{h5R7RIRs>TWTGD1&jGDJm+qT&o=@*C~^tduyHl;9N6FbuIf#K z%fDm0g|W6xkiQKnczi7qc@yOR^@)*T;_)I6sh980SW(ikEZ7ZcMMaFs;J4ws zc>Ds91LdYPd5A<(iBI*bdJoPI7@5w<2>?I8=^D+_1t7zW8tnEUC%jV{8t**AR~!*3 z0^ORL$bXYM^&BwVe>YtCi~@eYlD*3MK&+rJgk11|?jrKm`=tHs@FnRMzS6r&eZhIc zf#`-ki2}2nCW3_mfvfjs^z?1pzhpk^g7XJ_rDK;rfxycHh+fK{VtUkjU+*7pR_%O{ z9pUz&3GQwI=E|L<_)$HJBKmO37ze>nK$Y#dqq8}PB7}mfZ;LKj!z@H4#e2tdyyWn6 z0kkxpZwJwYhpl86EW^%sK5{>KX*xmKx|6@^1&I0ebutS0&)d(HR!~+9>*>#GGLnO% z&3q_8Bn%FnX1s{FbIh3-O5!=svG3QhcT*T;Wli*=H34HKuo1Z1fgtBTFbaD^AT>oD z9v&o;p@BRXFrxvl*PvB%^IT5Onl!KXP7vpL(pj?0Mi%{*`m(IvQhr5|LcsJ;-cugs zaO<c0-a##9BxPbku6qEhh(D>mi&$aZFy{~O;N;H|7-}!8zZ|$45KA>Ks zsAKqVTW+G&dsHpV*|GM0XiAAL~SRS7Sdh`4=tw!f1b!@i3qs zCY-ze7g8+$3hIKfQ+vLYnKq%xZeRN&$rkIm)`y4kwcpsXGf}S$_j*N-yCj0{_T4v! z+p4~DKfXhUg0H~U*1S&Q;1nwm+V+e+Yea(EJb&5q|}q9|e$=n~s)N+bAN z2q5X{XgzjH)Oxdl2hijGa2^80T6Vv!n!nYacd|Eg3%M+?-8{tzWlkU%YJ1!#+-1vA zmZ*4Y=@NwBRkg7L=AHt>GHvvr*fSEj@v@R<-6BPN#Urn6|Ei=&lqf?xNAgXOaRr7R zdx=@k5e>i-CKz<;x}sxhznIAkSgMR|Hq4LJ$uYH>!TGx-N8)IL$6;O7&Xe$TlSd(r zL|I3*PH9Ur7LQ z?crkb-0vM#d=zGg<{k!5=t90^om4=acIdj+r+h3r{rPhWnniYL?WcD1z?;p>TLeeR zuXok3d`!I*xz3*xrS>0zPnl1$93SiPu(`q%@4OfQaYXt-5;A)CgpS&P=h_vl9U$RA z?t!8Bz)lHKIM@B6uNG#5z%HniJzq%`T&Vf&!3Hz_)a+OS^_dxbzvR1YGP-aCaMvZ& zGD~+5^ImhaA-{byw~~33J|p}0?Mv=QrNgVbRF(^N1#gI9>)&Dm?ECHv3Uyzz{c_0A4Fypt`hN+JjL#p{M-Dwd6DQ}5k z5d-ro{}ID_B6{F;S@QTj5E!u0@|Fy?>H}jxjua(uL+^s$1Y;ceNSuZCo}fHOfA#(4 zJeSmBNy05dl0(!FDVgrZRm}eh9leCgX(zUZ=z;GWnFP(&oylG>*s-NjlnZp!GS(Wb zb~1?OyFbm+ozZyT`}eDV_@7e9R2*w6H-G1HVXk$WW7?57Oy}`@8f0`H78_)C93EHj zgs~it90u1=6zk7%!uo+a{E296x5C<)`LxE>meq#Uj@3FoIeV6WBKmO-M8#i6)E zad(&ER@~jSxU;ysyGwC*EA9^zcXxM}!~6dJa?Xb{o0;A0B$>=4A9j=6*Cn42BAu_A z-(S3ewvRZsOy$btaa761`CN@z z1Ax@+f@Q_mHS+4_Q3zd_>9uLs-b23WHhKxvu$yV^o>S6BFJM2K?Y2v{Ry~~&gf}8v zemLiQOG3l<%A?Pcbw*2*`ADrs8WXw1WLkc6_rX$wTX4bClLG)O($g zVxbp4N!G2SNnqvnjrXvlJ2M;J=a%xW_UNDSKN5$iv6Ji6rhb1e|%3;>|=xr-ias9?@U#3b#75(PYNytTYa`bQ0X6gm>AB)!gfrw-Lj;|2 zdfv2?dc1&NtPPFrUG)@u=B}EQ*YjY6 z^YTbX!k%yUW}W`CCBFym@SBF55aZ0-8-#%g(Wdns=5KX(*|{x2mkC3kg%iy3-7t5x zu1!ZdL&9&!+Eg_^aIh)w?DATo<^jb)N#LyyeUjWU>me+%Py4`I${sq)syi~FHF-br z)hA~@g>*+@;~>wCAkAun7dxc&p6yph=lNy-7W5gkf`IG*akR*pEOL{G>~x=)gzL06I9;$C zOFDe3j)D*Wz-YuQ)}WU1boPsHcz=X%zF-k#SBmFX7+wI^yHLDz%|XIhI9x&z3(JK#?RVd)yZ@VRuO;JpPSPr5iafSC%|YBl6RZ{D@+_ZjUa13`3^({QY#Xsh zz4#h0|IOC-ilevX_@9?A&eRuw4&f@WEiV|X=~vBR4LIU|XxCP;jh8y2jwwRA6kcK0 zWZ1=2PGA6Fb<{HR6p!w4=yk84E4kL-#E@vom*wZI9DZWnhU98TOB2_1Q!zws~YwjI}n-8m_{Iac}cbs)8>_ME4Qo7D>zLh>w(p%EJ96>-311X4!8e;9$1M!10<9V#zXqq#UGq7n9KFb%H!)LiW@8V8BbGdBL z<$+1LbowifGbb^!$$w(r_8Vk++Pu2$cJW>E<2@TGcw4r8WE-SW#`!6>>Bra%#0BxY z3SjSzvB%Q>&%HiNRz-Z;Ar%H_9VnBtvS(hTS){!^&sQkYtduK=Y1sK{(~*+*%cNGC znje!3gWVka4g7OTOWK_E#!wO$ow0-^e1No(+dl4DVIN9^%dGSl1jpSkrGUwSo~QtQ!vOn|Sle!6QC5}T(Ou4MLtInx>x3~9 zM$Yv4wkpHfOXyrIj*dfwVHunK@JZrLQ*`rT3A+H%fu!O|Lgh^k)e`%tyT?XcQ}>Nc zOoi%)5cxEPv@@N}9KDvC@OqAy=!vVM?h9p-e8ojp!&b$*EzbaR$Je>@>X)y7%l*T<% z`o2L`_+XvY(BY^pz>xSegEmHvTT^md$s|5?H*fh5)c#l#{jWv1jeelnngC0RG%jrb zIXMx2YCjzC(7Q+ zAfk6%R%Mhh#Tw=T<^u71%8A4|eE&32$rDW7coRL8u@X!b<8SB}bW|?SysfnSP%!mRj=MD z$p|+NuOlowvXI!Lfk9Ui_^KiamP6;xLBs|S?Se!4!uY~WLFNX=H|Ooz^!vVde0#p( zcAvu)CJ+P*{k+1dsFJuh?9^?z0yYmlnDy2eJ5Z7-KUrdx0yq4{wD1IlSB`mU@sf$ty!TY&6}PkthF`e zO8;5j@-R1_)TC-wGvhmH@zSG-JZ)m!`(J zhJq-Tm0t_8VLe`ZaF(ME^lyNz9@P}wkKjmfnHxFj+ip3;zeD|OXCeap*f~G3LqSrf zTygFxQhXRCXph2`5{|Tfl>MZwj=DAIw3L5T`zH2Wq%Bvr15{t@Gk6A=+Lx4Q>od3p z7()_6lq03Fm8w)J5_yu~QmBhHE2aLpl%X?G46-vv(Nc1LjfrJIhj#|x)<@dik#Z)n zZk$Kw=Ca1;7{kibHb}-_lO_L*5aJ^+cl+`BaX}eC3ZwW6RU+RjSR?o9pszq|ArE|; zSuUI)lD*kElb9#~8v<8PmtSEXN~M>Q)n5mvz7RZfMg9yT>}9v-?{OZ z$&LkSiaUnME)T`ml?Y6IpKjlhkrwM_|95MT3g2MIh_={Fci;uX<_oo#o?kN~8jJ=6 z&@Jzb;Si7nqfaMiihsKV?mhSqYfg9b*>Ur|{qGLJrZdOo>bH(+ux}^6GdPwAxRsz`Vga!N|dgeNn8j3TjxMzvv?g;tOI3 zLJ|@Fh28{52FnB+whSsr8~KA-UZ1vv0GvW7P`slcx=vr>vaZVX1+i8X7!;+hB|a4t zkK@axg%yv_$)-)nrrl&P(_}E`^hr8F%svV_t;V`PAf`2c-UblU5IKxNoy7Ie!Q~?%xbaZM6(dPTrzk7tiL~` z8Mu;)QiiNq5qWqm>YRHJ2>7r5Hgwtw30_kZK7R;VlP1#SIE@ybWjdwzGe56shsr;G zI}bf^e1Hl0`AIc9=U=E^L#!fp4LWHjvs-M;z%*%jUIkZM)!DU7sZ*2qg&3A?Kj9*< z1t-Ndpa^oPAFNnn^G6CbDbo=E)Xpqb&cgq=d{u4_S8jhT({V4;p`W7<8O>)eb#K(I zRI-}0Y*d^m#b#5~8m{ieN~mx6Ig%hD36KRAa8Aa?#zik9sIvS4ZzM1_?PE8%*EJoC zP1E^HtImzZ@SVE@lTMu!!Mkmi$GsvrRJCtjHbzKTdQ=rlS6 zrtz_I+WCRyE=hDKhZzH-`p!wgaG^#04rC`2;VKDTiJ@#-ty94bLRo~LN;gG4zr@=5<4F+jgS;A)Tt@t!Eof@PfAF$V(RN3hi57X zHLqst;cUT#mcjcQ6&g8B|DkJ@?$rj5g-OHKVl{DEiw%>08GPgiCM{*Nlf=0);nQjOl2M#8vkIoq{Gcy!T5~n|{{;K2t9#?R@MyvNTx6IS!kixi1!b zP=>^Cm&>$Wa5pxt8D3h(7LlSm{>e(KPIZsadn{iF!f+}~?^a#fps81r(dK=QC*g6x zf*m)OBrBI@4DIC}I0|7&q^v~A`aze4g~4}%yIz;$dB~2wMoGZK>|MP&4SY8VprUMZ zRK(3jmR>(W0UzHC{?$MA$2FU z=Joyj?;BG!F}pFMqV>zCy_+^#eAbIYoZFTx>Lu(IUFg{YdWhR{FaO=ajK>(I%+ib= zF?ELPWazIeQbS7VTQGjALRWutT17fbFyFMJ@+=(0)cjFVbKX>FZ}!vw>KBHFt1V8x zNWo-raAxMhW+2dL(qm7{`W~o*aqjUO_}L?-!`TwC^m|6b^?ebp|$M+OuJQ$MCYHa@n zyg)Ov{|C#VlY$}(g_F`*2Zi%Lzz+1396Xp{2v#Ppluw^&%>Sb^{jBsKooNbF+9%m1 ze!@0@5jpU}9gc8D1Tq*h9Q|jRqRRFZVbVSLUtPsQLs|&v^{&DCB1O8d*Y0KreYQ?? zgwivzBp!|dW#*_hW(@`QsaYidrYc!@(qPs~!>F`X^j36sC+3*tW>bpsMd6aN>1cvN z*WYsN9U>M54)gMO@=A3c^s*=x(lQnSK)2kcIlc0&ID4FIyGC3r#M8;U>P&hqA+(n( zMA7pX2OYHChmsdxiQ`J7|eDe2?TDU__t|Ivp2A2v{y|ADal zZ#Gb7u1^~%1{%vJNr>@3-cT76TQetfB32fr|BzUy0B=}rt)a$;@lG{(VF@)ujPFiC zg5Mz}tebik+rAqa8sT;Xpcyj4WI&Q4EJkNVv07y{xXct=Ob^&*m|9$;VwX^XuD98} z-Pc~ztCv<5HoJ;7(w~>k>Sriw|2^cis?q8$cU`>b0vivXAeJ;P*JMXiP^RPlxCB^U zATkX$Kuq#0V*zs1jL(8cbhtyHprOF(pyvAToa-#a2NkiY*5u!0n~%qBXL!F48scJL zdAhm1J$jn*vV(BaU8@;Uk44!^`RbLd zU<2#unCzBt9+gDE_u$+nYXO1GZKms|ge+V(kn|3++3H7&g1*w0l-L@Ah|Al8C49nS zMXY=F>$&`E)>R8&XKTSo%BHN7i?(GL6HlUWB;W}f?r^`Z^dtW9OevJhBo%eT?~FOh z?erLC()2aEewGmmnIIl}PTU;JfGl;oD<(lJs5N3#h`eWqDxe_` zoDaN^@^Xzt{1L!>fzS}urLb~;S^CkAH7St00Kep)0kfN$D6d=0bOdpX-u=^M8uthY z%@F+1RY*n7j-ewjAF14>+23B==@(b7i_#Y77w?ifW9679^i23JiQ~r6--Yo)d?b2C z%q;dHWF1!(gD*JAR+zIYn_XC>7;;+xICiJCaAAhM;nBQVTocI_5`aT6q7SggY8Vs1 z#?cJRH!Larq~^uScvLw>K75hH|FH&Bl|#Bg$q*+nHE?S(Vn&3Ub`Nhz0{`!U zfO?y5M!PMLpSmzY08M}bDqaZZ-wPZng_cAhLVU=j4?+R2B#i}z4lOO_au81-;2DV3 zKPkN+&7p5%OE#$>Os*-avMjnVC4Mw{G)Y{!wta^Nx$}#0!(&=7Il*Pzl~DCK#B0_r z-Z9Y-l8;rmx^N9HghX6%-S9Sh1bELtSdrPrkd&at}5yGU$e33C2qK0Yi~)>aQ?M|EPpn4Cf$a!Jrr z5zEHjYEDa44UBq6dqF67i+|QB)NKpBpOOE^Fl9FdxOn>zqqPb35VyU&=@E! z#Jx?WGgZvW=lU@iR07iLLEo@*?Y^apdpmvY^k4r3%0OuVK|W}}g?KKP{1j71&cMr$ zH_B(!!VhjfIY3$O)&Ay$-v40G*d`U z1c3ZOwp3_5LOGGrJH0ktF#S--@#%1l`jiUjh=p9y@9?iV$~>WUm4`m=9NuobLmm1^)}ZMbbu7(ygSunfYkNIf9cUh4Cp zJA%NhS%ca75ysMza+o3@AGTje0MVu!HTlUR^5EC?4?apc--Yw3R^ik51SdX}yVr*bWk=i9vNwF!9m_o*y!meL6jSqqOl*de}6EZl7a#x)4_Q4*q=gqp7wa! zKivOUbf}du^KEV^Ws-pVh38FL}aTnrEE1Hp#-RrBO z3?7$5F3AilGZ(>yV;>zVMleKuQ|SN7y+B;6pPp=UPjU7~?GbO8DW^SBQ2C}D4ZY8b z`iNk~Z*0AhxnHloZQj>h5&z~h^a{*m0(?|nA<<)Ed4iwTCQP>yq0mOB3e5u(5lq9e9F?t$4^3mo*Vj7)F!zovFQCXuhrIw;bDS0FLfK-557=hNQ%HZLkO66aH z`o)!EQTb2Y(-1i!AkiBz6hI&)GC2RK%5eFC_>Y{Y`P}AE9l;|6mF{l+xu&Qv6|au$ zi!3Cj?87&_{3CcO@xa^QbdfJilz@TqKbec|;6G#SsffhX`y5U#;##VW?6jb3w`HmD zf`+cKb}p%oh&##m$n1*@cGJ9a$x42%MN!@Oi%^x)qBsVqsK>^QjPtx4? z^x!A$spu?UzQf@1XN0qt)-?MiIcXP(qIE=cXg%o8`F$N(#U(Fy^%P@anIo;;A*&Z! zYHyl52@9_4u*r%r!6oc&cvdac%7P9pQIv6~zum8P0wD zSPWxiLJNzZ%}wcG#^+ZxDxHopahf(2dxwrYSZJ~ zCX64xG0Z+l_R3L|{;IdT9-=QH=di8}n{Mb zf)kNt*y+YTCrfDBFem`rxW7jpVE5IZV=(EDP_kC8wYXNB>`$pZ7tFt!3-dRSq$d(K z+VgS&tP@S3YEc{fr{6^PBZ=h7x(m-z$tAKDD*09sn;MoZa$n`<#I*F!|Mhzv(nup_ zCTEpMW|~|2u<{86j5eBCm199NN9Pz$&^|?WW|i!}{>dbC{>=-}0keDhq`!Z!gFYMG z^+%}zA8rJ^5nSFAvI(8{%#d5>y^;@&w%&=Q*tVJ*T#TKYn8u6*f?u60f01HUhqV6E z(Pak-?+f58HP)<{*AoiVOgCk)j@_EC6?X~>-TrbvdW|<^VC-cYI2b^ZN>!xBXY70J zys7KRZmLzU2mstw=)v+x^$g}bd3-$ztishR1tHbUlX3M5sHBCI;t8 znWJZ2D{Sz83hHgt{y9@1IM$5$u_*3d%BV4#jeakh{sRbPq)v5LnMcVy6?d!bhktZj z_)gw2j>k|?XeBc>YOEWKr4{?!SUFP}58qH}Or3i^zvUw=%0e;Y(U1y%!SW@jj$@D zusRSHJT$$2gRS8Fg;|(Q9h2yAZ%~`m^?=ZOun3HVHBR$wi-guvAK_YVX1+L`xAr=c zmjsm1L=DnL$h(c+Lnfl;bjd!NPZdr{1r{3sGKLYpIO0|mPU_t^@c+H z9UqPT4?T1o2G@@d8G;n~QKls)!Q#5|vJ-Cly|XhJP-El8Z14VFGx6ow*%^(T;AS3L z-qca^9@_QAo@Vz3Fg&b$$RjG7NW(H@C=Q6np>=mx(yDiBO_cu0)Jfc-yWM*ZcYs@M z=#4OLTDd4r%68xo;(dLKNrAgX@?m*_nOUrq@(=@ZUn6HR` zou=(xP~e5X(@4|gv)X*7;X z6};T5=_zINZOZiIvz-mDrEc5v*aOh_ZQ0OHQqR8$BfiziPgBJ>w@1-3HGzGIhf*2+ zIwTw`(Yjv8Oq%gW>1gLZR-}NUE>oAy>+f&Y4$SG%RuWPmMRA83b6fhnW{m0H{MIDZ zlAtiM*aGFzWXy(7!LDRwg%40+AH`y-&gbncn;x2v5@0BFTuLu48eGu6wXjMDVLDeG z>R#Pm+r7cFbuM(3a5+33?C+whmh7r9e560WjxFQpwckBQ-PDb8(0ZC$)YM#tmD@h6 zNNHHe>Q28-%jmUb9zV}_g+*CMS&$hC^_*IlloaEwA5gfp>_I_~5CI&2!e%o6I?;5u zoF%|p3lN)GK;dY?aBRthR2cp;W*fjUEM6rhOeA00TYmKI!t}90u}mA@+@jAr!RW0; zT6zVs)!p{l(W!`xAwU9`T7a2mZL9V{gZv zAAHA+@~`J8;@Bx0FJI+bXMllTed&y8CA{=Gl^SQq2KxJVJMb(`O|_MkEcQU6gD_T2%2433pb#K6 zL|87+B<3Pm#UQ+=hrQ|;8FILM*jFKtFAPiT>d;A~ zvy`ek1}YsWk;vdjEaN+wmy)_0ViEVBL!+Mpvo}~ESjwVl-P_Yfvo9!*kG~{#$omFCtHPKzH zFSQwn&=`9lK|Z@bR=~9h-=)?~*TdEAn@T=B{n1a!!dN^-5!d;iR@nPaYx$)-srXep z3vd=|F#1PA5I?NiLyeJ=2<30GhY<)u2yZx!fc)vqC4Dm+JUGhhJb*){!X{DUz87TX zSr=B{Ug+@)64?7*6jC)Ki{o+Gr0x0TWa!p#V8za{peji| zu&Lk_Ped;B@`NGNZ?P42Wk#RJ*^M5>mQjg*GOvQZ8SEvVDdSi+h;d@){D~m>d}(}o zLcqgk&COibpzdODf{(_Wjs`6|r)EHh{f$&wZQW&q5E*`gCP^_j-7EsrS z8z*7F^HUP=;AFDM`)f^tAtC)mB|$kOmoAHii`;p?j?8|8Mn-2^cB8s*q`bq83eQ3i z26n>#2QQtq@26Td!FrB3&cBms#FB|OU>cnS23PEe4OI);)3PicRpv+nMM-<(?bPhMDEmI zfcJhmFpaXrj3Q9e<2V`pOv5eq%Ihw^dB<#0J*%W-x{VobWTJ=zU;Kz|8gN!i)~0co zBrL-m)2^%(G4h@5-wuW4b_afPELDB#?n)||(zIlHJf_Tx#`{`ox8y+lF)iq4_)zR7Q_ETdBY2qMxbqCj z&8eG{0QSn~f?y^8iFLJdERcFZK3|Ak+j%;H*3V14V09V(XP}s%+61#-#QAs%!lC!R zPx-=KT2><$D`v7iqigk*I*acL)Lz~_>t;zUg|!g1&dTg@dEVY_`&&jiIZ5_)y9mhU zR8m&w$Jo#8{1`O9Z9B_(!Ryc`v<}JwgFj;1Q2Fr|AIF^rHv2kG4McRvU}neW{D!er zsp~n=NL^4$K&Tq8&{*QK9Z2xZ-UtvOotK1Ay-yhFX(_sO8&K!IFEWoJ^mmf=r zT(q)mJn$tU08TJD-|^*T#4CA)RW2+GtA*uS{<1lXP~cHf^SWVPd8X;7GxdvCu}haO zcY6J-59Hz7aYbf)KDDK0;!!QSd!Y{I42hA7iHVO-*;iZ$^aGwF3rlwlS4xepGFG;d zV&-$R!srIShPZ||i+C2B$ZSP?u5g~i;4FQOwbPC-0A6a2D$d-ih8 zLWcbWZZC)~lntMpT_bO=iWsCsF-b|Pw&?lMn^wC!75r5Bvl}E3VGiK+UiuWAV=ua! zG=M8Dd^7hoZ}iD>Er0Zh^e*Zzz15c{FT|SUMhSYm>dcEWq$7jucbwJrb34s74^HMB zkN}Ac5bLohgv$|#v=zEI*hj*blb+oF_O{hvJ#j(lmltzX6O$FuNK}n!Z|HdzQXztK z@^>I9n!uvM0LLnI(DXBX?@rdIMHa3x!evQP2(|J0mg#I@g&4ua+9U{#lV8t+)qF*N z3RlEu`w8;MF+1|%wi=bE!Cu-g)OebItq24%t>d$d*jrI&>MfeMShU6^M#qa+wH#NB z`L$xiMP$Y$E%H`T$V_NQRL(#_CbY0uGcAsJ{O6B|2)JO&_SJ!SP&e~iiL~#$;o4U1 zSxr{KS;`A4V^im$D6g}mxva-U)KbBf|`a4O-y+LET!*~0p2Wo)* z?8$_dVsY-M(chkvrXta7bV+;2~!$s^0u!)XGk8|h;H?XDme-0$k@bdonzgwI_@Iow3PDc8W|UH@q+i`eTQpM0Ct)@DuxT{k<1! z*(A1lRsngQikCV^MM<~_8%^XjghD`6DY_U>o-4^P?$meGVk+GO?ugB6kO)XadtViR1*zp%p) zCFV6e3r`=IXB%EopQ(1sc_HFJ^IiBoS=(R6<9f=q_H&BIkXPC$AL|VBKhPlg=fuP zn&gGibxF78(}ue~FifD|n2|hnfBYK=mKBp8HuYw)5E}K2IFt8`7`|4i-j!ZMy(REF zM1KZHJ9Q1&l$+;LrwL))_qY0mZC0}I`9NQ`)a+El3DEC$<^WK-7TN{EJMUEr_zKTl zch%DmBI+a7)D(KvL`^!;>x^q&3sp6RA1cU7Up2nq^82(jbW8*J2jj)!R%NuBgH{L1 zR*l0NXIsf^Ntk>GcVp>|9=jc`q$h6;$@pq$C*}V7^cbZ2o(JRN%CU#u2k%4mtO?>O+xeITaF>*AHGYM+j5@MZl{9%~W8QAr zA&7Gm=G^E?wx9wo3(3j?b%JIqZ|ipgj06ed9>#t>{qfRfA5D{%orF1&_~dMI&-Q1Y zCY{3-k*E`^{>IwBQdMoCw^}dJ3##DMf&Y3CvW`|FUn637*nfZD{3i47X&sx}zP)l5 z>5PI`)Jc_Rru>aXFCf~|=fp4P>=l&!)h|u7ku2y~qb?92N2JvlM=ib#i90xI%|9UE z=O+?sYP>!%}7OwNOxMia! zEK<@-IvXB~+l@6pc|acZqZ_I7(E~0|NwA1P(;WCct=;uO& zhX0M|^-AeQ3;%GuPu$gV#Y2#5)P*{KP3Hxxvza#AiB@n3DuK+a%XFWMQuUM(f>u?N z&fcjUOR-x;u}nL>JW5n|F;0kuEc%Lh4+&YUu*QZiX5(BfQQD$-)W6g**Xe8m?SS7=EppXG z{1nvw$8D^35LCVPbX%XZ{zCf(0_m-J&1kh(^Vtt&5o&KVn(8}=4~Zc4sHx~f8|CyV z|5IigGnZjm&!CH@jBNkvGKjW);OgQFcmvGQ_ZZ{!wAU$#$xxt`nQ8M^cv;we__Bro zf{2Zh84`~_1V83nS^IanPEnVICXKg5)l6tFpNyAmCFP9_TDXKJs-*OfPn}c{$#~;_ z^9nT>jg4n!h^S{)E=x&^f0@P41z*TaQ=4vlmGZb|`9ilCsPa;BAcrNbuOR6--dKn2~_P$nGcX&8EdT5w0y^PfWtXANfB8)BG zJ8Nhh^4Sx%Rj!lSEA005d?6QfH>)muv?71QlRRK*#TpsCAP+Jhl*PT1bYNA&usIRU zYK_m;Px)L}gO|EXKwslkU*ERvUx4y~X%h|Ua6PsTOZS=Q;+r}2KX0dckOEDV>`NTW z7Y!f%@A3msuF`*~wGdUV{<0~n@L@)j%?(eKm&^2LvZUNESJh%SwRP`eDwfi$?D?d< z_ui}CYn`W*PY6gCPK0HkK9KXrJ$mI6GyTKVhi_nH>tsg$K|G=?Yb!}0$q%IB$+DAC zjs;Ou!@;98sEiHxXvW*PuIwIXo}xBKEw7%(Ij<$1*&dsE`pw8IA(yD77@O5^&%tbJ zTp2kyhtsMlWkmkvUsKd^=m+|o@_tVqzP*I$ONo- zXa$ad;@y%atldxauA-syBj6~-`#v2H2iQn<0`4POO7sbVp4HTmv~Ob>mH>;2uQhObnviMnTJ(GG-6Dn%_B+)Qn@Sq}*RUli1O7g}LaAa|>nNe(HxDnh( zOPe%%r=5w#Hh)lq#KQo`^Vp1|`Es_hWV-Fz&yn8K^Z95q(7N%S46x-k-MfgCcCP_1 zcLFW=aaiJ~ZvVm~eK&eu)DA;^W=zyjcSj9R`wL*NGU&O7Q)|bx&p?FLkfU~1&Jd|u z`sr5^H_}u{_3pr9BL4!%lRj%$ASjC?hQ>#-$6F5;onHI?yl$$)ot5*7P{mPXEP8vZ zjZg61Uc>wx?|HBvyLK7r3~6_wan&KBv4aRq`bQb&r?jZF4F+T2=BD`;Q@N(HphnYB z*N3>{_2pT1-xsHbEZrtp`KlpmH0)ftnFNa}%x~5=A02p`ei$S1i8UK>zPI1|s(aQuHXfN-l)N%-@t@aA#!ch*WaPyqMXhL$ z&J1Bw;M90UL#2W&5jRWGaYxA+d$JCq1XJDV`aap-Y(3phIX<+SJ*2UZceA_RMXxU- zV^Z+#K!ps?M;&vYmcFA$)|0KGzDWGRu(MK*_p(Zn3zmj@qB)&Z=2;S4r7eSO!+1xj zGA~uBlx5YzrlgRKCyEEV%7p=3>23cll1?0Gi+MYWsf>RZ;E<=C6- zYw>isj{wIz>r$(zAZk z`+$e)Vz*Q8QgW11H-d}2hi2S97+))MYc_i+M?ES`^;r8@``6U|tIBAGJ7Hl*j@hUa zxkgw|>glLdJ;eyD1Lg!yK{lo1NVf1w>g82JUCC4;qgYBQtUuF4LWa5ah(L8h?bR+G zFo~k+pgW4&pa0EwHPe zSARoOuBB4!qH^2ERWzh-#yaYjb*%;<*ZZPBgwoDCe&4(1+}1vVqv1B$1fC@`u41!U zze>XtiQ#8u4(J$whW(J7l#4I4f_bVZS9Ur(qvy^@#s#TgMaU%y@uZ5DXPxjfeE!S?k_ z>=6ux$>N!hM`D*K;%gl=-BIdgY2TB82V>u)fV95&SC?AVF*Fyyar*wv*te8tZhx0C ztvyCg&N^Q>f%UO&i-MZl89OFGB-ZP-?tOQunW8%<_Ql%=c}zb7qy&|s~;?1 zTHI-`&6rkallpn{Ymh;5lg9PZPfPXq-%4rVG0Bjth|Ys5LH_p=^C4pnXcl=Rc#5EHelx#0V4bl!-1hS^Wg*4W}`LF+r1IAFg0% z)&tNH4~hrUjSAy<@&&KEN>0{o$n?VotO;WCrZ_8m=Q$*F-bZrvj4$~(>J&!rF+5ct zrY+uGQTM5#y~Em|fhoT<5{q4}dQYVpp|u+d^{L%mm#PIjMOuRcxu1e4ZcLuA4#eMR zmz1#wV3^?N;E}nf5WC*P8^Z5jJ2yIg?|k8W32TrUVbl?ackx(;2_@-TzoMdsN+?R; z67R3iI*rQ++GHq$jE9Hnl@cfkJ#hfT7QyjddVDNNjwk|XqA6PjE@y+j5}u^ zm$;HWZ67w=bl|)ySkd(0v?>vAQ{ucT+IC8T&yj$zVv8?N#Qvhfoh>naws7bc&$QGf zKV;K^CzL{Fh|n}^ci1B8Rr)KM#X?I_Z^k}sx0v9d1!WHyWEC1Bk54e&ZwVXuWRvd1 z+GtV@P5fvsuAKcWRAjU3=HI1@Q&pJ~Y;{t!wd`Th()54LO3vR|a2&SS)UEa!$G?O} zi%_(F3|@)ew`b_qM@ttDm;Y<7WAem0;T$~D0omh@n%Lz4(bC3E58TmXnIH&m&>`=@ zl`)0Zg*|?Vb?3!z-k>N-`Dyz|%E^%{<;0TRiO+tcA6R(JxV>08Wj1z4?a;5kGvS+^ z#W?UrR64I;IOADmJrEDoKWV-=WmYye6`#5W(>-BxN8dlS;!PS^Wp%3$)y_ZB;V~Fq zj}Xq=4^skq2_mp1HyHS4PLI#&B_kWWvhVvAH_Y-GDbAXnCk^-W7AJ;L)nlYn`3~k{ z$nE;IpN>o^eX9{wRIx69Q3(P4)KdzGj>7DZ`AaZ)o?q)@T8a6^(YITbM9)X$T2nwO z!c__5HKXQ*=yFtYWbZfLhik>43em0zT44*q<4NE^-7)Nb)Hnu5&K+61q4q~1oc8FY z>ag|H3AxUns9b(w55eZxif;3l@EcAGFU?^bMP?f(D+aD?UH%QZzljN7_sbk|zDGqHbj31`sR#X~a{)AvMc3>C5O_NKc z++0H?RtSyW2EIXgK&;ca9cd<#Z%r5%j4*=opm$ETZ=zGI6u)ntaQz(`T^=m*%u`Oe z##rnvY6%i}2rxVz}+%36_N4%jg%17Awiw)j8qM8@P z`dIT~tn|L0u^n5}M#9ZRGU}nQC$nd*sLo#Oo{@Zq*3x3PjXJp0i+ ze0JRlOLD!!Fugh1LS4P*7@^IdWbrS#WG!oVBEZ_&m>4QMS}`4`tE$bon>$`GTVerZ z{gvvDw^7sMclB_Mj=thJZG{$BI8sjYN0y=$9L=bigjP>p0^y|f1N{7;JPRC_#^B{= zISW|^Ao{T2`?gcN!gAliTk~OfuQWFofnFA;-o9PiQ@D9{LBh*+k40CDTix9zt9OoO zKsPNHdz;OSR}6as74_Szg??S|gcOj_XZ^S!T*ZKL4jxU^B(z=p1R5MB<)>KH<7PAU-aLTT zZ#u%*kHHSw5MRF}&_NtTbpuXyh#5N$vu9h*o{avC3r=G8(DHq4DwdAgBWys7E=S?X zu&Q@IUx!)qx*6gEKYI+m7l!NMDzx)Px8J0j#D-ZfkkZ;DGwSL4azSjn^fhHF2HvJt zsX30{+wN%JQ{U^uEYanEvGvwLaYSGG_uzv&!QI{6-QC^Y-3NjP*TDn9-2w!62oT&| zf_u>5FWK+z{`QY|s`{y}bI;7J>RZ*-bNe};bG4b>lXX$p&+%lmdeZzOQ4iT+rtE?C zKpzt%tygEMrx2Xi5}}RCMe|nSb6Jk?et0-y&ZJ*(2o<5E{TB* zcgcOBKTQu^U5a}&D^5=}v>%*T_yvorQBWh`d?Gs(PALRn0|vsz#;$6mlDjW_N3!ie z`v_I#D|p0&kk}=a->Vg~y1unKu(D$v<1rhGXc-s!h=0xCqRL%gJ@)jEN>jG-t#1PY7r$Qv;8ytqV>giQz9!=~5%On5U(BBt+RY^?IA zH?TuMMSX~XYehjtori|(@II&CDAiyFoqusOSn2dWPAR$basYGJX=a0I$H9v{)rNBg z^IWygwz@O*?lmcC-@O^6fAZgYdPl6-uAsrfQb6tW?QA&yNR=>ZuklcDdB?G`1L@Ea zWXvLFUEm@xBR=Jp;HBqM5WOS-Y#z4I1e#pV=;u_So_TxST-etD#4A&G@s0(-CtWw-c$MWi=&`fE^pOjUZsj^%_lqxg!`!!8|})p zN4P{Rh`jS|dhusMx3d*%XVa$^_BLXUy}nhmm4QsL)|Tq(jlE)uUyM&t0v(Yonn3P8 z<)9C&6U|iQChi3)s(63b>rs9Dcqw%Zo(3uql}$ljULR8Z&t$eb2j(){d>fTu8#`3c zjh}(bJ@bU~p!Qk!zx&lPIj%zm z2}Gt{e73vJG?Y3jg`CiChokuQ)`94a^dRoS8G+#7#gReWUFYBnlKFv(Jv26Xm0)Zd zpgT03&~0Xli?8i=1ahj+3(NcEQ-2p*XRLGC^@@-?VyaU%8xND%`!&$p)xbq0>EcJ% zgExJLANC6tbcNPA?iVbF*iYI|D_F1;j)q<6xOEs87UD4XJ*@IbD3g#H7Z)2)4Yw!e zc*L7CD@#?ZWxaw1pvx;)mej*N+U@uBO<^Fda0*bTe6m}(8tJs&MrBV#06)03JTG-w z8B~!ol2wDIGEI5bb7|7}su@d6>}FV*r`-{5>k|gHFIkH9iJpoPLHjD>f296V{PZZ| z;bOaUwdE7_9^~`4$HT|B8|U@mbqBOX@^-mNV$XlKO~$OY%!`1KuDY)=0W+Ed4qDOPB0!L}R3dwYcSt!-csXXi@=P07o_}jVVtNXl< zhlsbGQCw>@=rC2$_tB)I>@bKYop5!#)__zE0{{&HA|DYCvF@c7h1<3XaqE=}!84y< zy?`Q|c0d|r8kPm1K}S=Ddt#afUfYpu1GY)Gv3f-{-F98S)vOyW(JB|5LgN7l0kTK@ zcb+NWv$?M*kdo$Lq;TZbkV1S`G^ohoZcs(EjT&?8*CgOJX?_9}rRqCwnCTU~o%Ckk z4rVV%?^^I03@8I+EUW#Qiqff}qw#9ql_9-FmwrUIgFpgE1Jrum0DB>vr1=AJB9J>C zomz0FBHMm~BvNlFoBZgWy0IR%ZV7@A(aH`(`niylA+It;H$A$+;S_Qx3AucR8U}Cb zMqhkkJ=Uf)1ZDxG(6+E=P=XMwpC^uIpcz1yKK|d^OFI*kjyWr+up7|#9Fl%NUR5q6 z1)v~&Tp2)BAiODHV-9!E&Xr$DR|kGwIc&i0=R2o16cy>8kr_U&+;I{aom!?kgHhIN zgt9l8>&ASMlEba(o3+~)ZK2Dhn;QRaiM{yyOg2QHir~hbhub3#7E7lbTY3Lc4@_sE&mW}z3N& z^hQCzm$?ZH6}R@w(6NAmYvQu!&A61;kgyQiZQ5W$I;LT15k#$rxQAWRJW= z{5KMfABvVj!@-7uFyD=Lz8gc-=uAIj-v+~Une2Qo&6jlhUA}xy zjM*ciKh=0ibnn@5?qy{z^m9of^@Od^-x(ZBT3jTX2nB6BPd?8KnJi`70Mq~(OCp&U z9nlEiR%0*zw!FkS{GGMWWzIHLbr+a_L{bC!)sPKHFLq>|^a$MmP=WEK-&XPS9UIUf zj>MD9j>?Dm$&hr|mwNC=N>e)3$S^ToO{F^_Edwk<;~(y2DeSV#w?3`AsRpKZ!`-kr??{VLSZvH`rWA>!J#VIn)$gC&95=PL&gKAEpeK^ z5W7mWKt@}34M9zh%!EPGVu;^>jF@3rzYty9HXPgEGJ;r-Op)RCr~mSSXQf4dqVx?t ziXhWVQZ80-c`YUus*owK9U6)(4b@JFuR0bAkOpSQ@AnOLpA!-u4;}?*I7m8d4U650 zT}ts;F)|4aBPYUIP2D}sutbzj8z0#{;Vju>AF@r?nbW!Q6uWkq+!^C7U3JGKB09@d zpQ4{dtrX}&j!dov0eLLS-`jv*{LJT#W|w9mq){;2UMXE_Xt;E52P zR6^ebfO$S34de(eKvd9;x}Gl)*Dn-ZeCYBJoDj-R=JlyHLB>w$VSo!ja))cj9yi0l z*X#T2MXdl$Cw=wdl*rICjqf||CCSdK1aN+GXCzQtq<=UT){Dk+4CM%Q3q{^($x!gg6?@x0O|qBbm*0m#5~E*5yZ)09 z8E8TB+<&r-4v`2v{3pI28U6n!ZM-*(ybHFTpdQYZiG}2UCIS8b&k{0Iw{zQ65sHqn*1P08xl?ueGr|-!_7%z_z?`;|D#~7Rqst$^qa2aSAwnoOL173029w zi3w4G4kX{k-1#REUx9xmdH+c-4Wuyon=$)Ajo)GO2tY)I9 zbz9I!08dEno0M?~9l$Dt&UFfMh_)z!DFurjl&(RPD0VKloASi=Jd*M_FBs7fNCE1r zz{}0%E3Jpud>Iew%2Aq;@?5C*?dSW$)o z{3*Af6>-Qmme;Ka-FKvX^ z_vP~qF1W}L$O%dirZrUHFr)g~t1le65J=SGhQ{pgeoP&umUk9DPahjsl6RE<|!oL@ z?EMvHJ(%PI3{uFM=R`pXdzEduIrxcQ)`H5`%VbTbam=)ro-0+r|#pa=8>L9b5 zL6-C4p#*7dC2<}`76V)(-trf}?eO?MN#zG8l5sPWh3|#GTHHqKo2|Z2mA(>{zKYES_t=4w?RuuZi%fmra$5cB zB+n)=(YRvWlFek@v|^j_>vLA7#28 zOOLX(2n3lEM`qaML%^p$5IUttWI}jOcvoAc4xe&{6&n_2 z{N74!#mDz+qG(?o3G%=76BRVJc*PCt&eVYP&bD}o$kN(fUKMf1En0(1YvPN~k*vaV z5s4NQa7-wVr|0ZI5408tR-FdkRoV}~seQsmjm+Ewl&U-JkP#k4oL9F@R}&+q5jYx) zOdR#+@Z+s4%=u@-wG4_3XZ$6B@QC<0BFSSV*5i7WN=#bte3^d9I}>sC@+IgG zNjSFw|u<%?bFec2qG^!@l@4D%KI#Sl|TJ89Y zwz5*+ayPBa)#>Zm+}_@|*7oDv^(I4g3(5OyLX!a2syn*50d51@?}c@rL1`?KJ2Tzk`-IA4|6UIQio6k}hF?MVTgtNF5?^E9Kk!x)!4M4*#hc40 zN6Fyg+gn6T?Pv}u3!Mc@sYyqP{(hf_Vey;iX#x6VX}u^H|?GQDaxC079tY&Q2`5r6pbMs`wxeJgYCaL1Z>U?FG216*SE1a{s(En{{MIuV3S`!Vel71AT~JI z97z4~Bb@&sRB&+pqZk;0gH->UQ1LG*=YwFu`wvaw@n2{PFup1*3b+OW5)OhByfgWa zPBH$EP9gR1h`=%@1x+1FsUEIbQaShyHT@o{m-xTv6o_x#*0l=7`nzs|KCl;YMGk*7 zGrh59I!?9Zifr|Zh>&0Ruwt^EYgT?r9%;vi{;h2vb0+_4I5{9|WR`7wRydoAEKl|g z^_@M=8D~vqW9gQZlWY7fXKqj50~54X=g@YMk=iUWpNuEH5 z$8-s)xM?Arwo{%+4Nw}?Vsx^h?4_LZg5)ePTB`YCT(l5$v`}_~{Y&r-Q03|nR*LMf z=VDh$JEs`L?2s_1G^$r2+3dbRtd05jQq03yvX7^^y83G3Y}@1haYU0DxbePw8jsrylLXhWD&La=MV7x({r-T zPP9~O4FQ}Brt*A279h<2<0@&5xQX{TNIF$gQzD+M3A#OnLSu(5zi_on-9&*1BRVt3 z{ycL-aaGwa-rU`@jwykL##WK(o}j7n6?^VHVr=z+fue)7B^wO&Q(1?+DH_IT(KpjE zcnNhC*@dJ>e8|V$t8##B?mZ&i{?!p~9MDo(PG6~bfzulQ2J{$MidB34SWU+%h=2XK zPPa(aE1Wxl3jEVGP(-)6nwp{)00=TcNNm%{9Y^qm?}G{Mlp*EV-PscuO1y(pcPzmh z4v3iRw_6SMiRx5(sTsok(8cng_Ni+I-8GzhQ4` zGIYqQ!}96V3K3^f6{NoX+VT`bN?Vo`PqMV$W)` zjJc_Op0r_Dc~ff|wZGTO-l#BKf*iOl`}`*CBfk$R3KEmuzjdY@FEl&^g6P9&G%76~^b4GsXHB`VXb2+EuBNwU6YE4Uk*&0GwtX7X{7FVy z!`>lr`s)~MiKf2TmVY=K@0++Wu{8bsoQJ<7nTd9Kb``r`h!TH+lEJ?6u@PdXAabwG zHD^1H?lq$;lk1+|k^c5*)6Zs73YAm`G3ETBS`ZA3U&ard#-C07RKDuIUj?+}2;ep< z=vSjVG)kD$#%i8$c{3mqO6pqyyeVaPu9PZ>+p_uEy~%>(5Hi=_ArkiN;0QFZK}avpni==-A??LZ>v&wt}nJ%-4)w`qBOg!Yr^2UFGMR~ zk-yNKX!NZo(=ux7wFr8r{Xr&fdTu}232L9D;#3bjg+O`ec}J_SXCPJ{PTqkB-#7q0 zK$E~~Q~%tCCaG@XT`25rr5dbNe!${VKpR~=x(FqIK&cO-tx`kR8>u2kS1{)Hk!aNR zz<3f>$Pq^(0G|F%I79&=@h#T!B|?<0l*>qHDAc8&D(zcPM}I;%Ie`>pca#)Mt2<6~ zXZn?B2>K@TpWaoJYP+HVIvCtUQY2kC(5RWD{&|{JI3T9T)^eWWyM!Ypu0j}OAJu?+ z7P3Eqwv36Is?Myb9J}_nVImCJF1(qz4N@j8)C}i5DMII^XNSE3VO?EMM7=DK6 zO!ZWbD}<@`J>(Dawnu|Qu0lVqm&}VhyM$!r6ie!kt|fGnKUn?@b!kf-WV%7l22yJ0oW;W|KFS9gs2g zFKo#97$Sz0zz_I0Lct0(y{uv?`x_8S7SHw(4ThY9ig)`sf%rJYJ`OUSO0TR5%;MCO z@I^`|FENKNCzzg{)9@YYPUF)$sVEWorA&}Sg-nqAzvY`*Kw;8yQJ;rxV?!oqaUg__ zZfhCd?I9}#N1k7yh5)NZEY^}I&9dbqmd;}us{=5B^OV(uenFPys{EF{bgiK>n0 zM!(Rt&eJkvglu;Yp=Yp{b}C1_3kX0PH;o)>0(u}FfWGyjM@lIILi}Jx;8e9UennX}_M)lN z?g>+Z;r4Ud`ML1(=A3I7TWHg%v{sc3O?1YNyy%tVYfu7cmX=Lh^)=%bcBi>L*=H#| zg^;)%eob6G2K~-z*gRIkrmBs!XDE9u&St5$FK2eBYvoz};-R1=T(jat@0rtl#mL#m z0eYpnFN?LRIosQ{X>(XN+V6tX&uMLGcibN~ZR{+Zy|8c8TBv9~>8CPE9{IMQFDNBN z+_*lF_co_XW1>7Ll*q#7b^xh417j?NWa^2n20@~@Gm$MQZC5^)iNAW@G1 zv=ONvO2RHJ3;Nsj=>j)cW4rX#=6CJtXnGnP&fh-I=`!8h<5JH$K-+P%ATC{)63Yjg zb&l!II1=-%H{PBUxg_SV>Ii64Tb>f-w456(@pTPt+{L^HI=<&mCQst07AnS=Y|F3b zwOso*wO8e3we?t?Od2UH*(!MJf^t3}xbKpnwd%U`(^%=TvGF*3`){rNOTlkkNqU7# zfWVPL?BS;9g?jlQ>_uHJ-*>6EW|0~wSy-jMY=g&7W}DH3o9?8!8&KgQG< z!322IY72m*`7^TL*o#j(7l94;m^DlfjeI_S(;V->PaX;z0-LA_F8miX9$Ma2w_PUM z5F*x~E?TC1jrQ6+w~b%h2DuK7wi#-Rz9n9RotP;pOQ(2LU%8pqh3wLu5Aa+dr)6r% zM9?_B=uQ}S#gBS<9Ua69`u_aHkJIX(-&X&gf&OgD^U(WsQEM>r{(kG_`tA?-VtrA4 zYFQF&*K><5N*T#dE9gth&I9=oKc^72T|K=lP?pnzimZfiz!W2 z3K_<2l3F&o&u2Mo9igr>WN;QQ*~jn7;hW4|4RJbmgmmWxeaT(`f&?8#YBW7cnN%Ji zda60f_sr}uGqTKD@7n~NDj#h4<*qn$UeNcV#0z)1Ue4Z3)U=%#8ZB$ZmkUNRca3Yg z@yW)HO)nOv!7jT%|3cG65T79<&P;d!xKQBof`+niVIv*x_*n@2gYNHVHM+Yd$oKYIX;L8+fJQikfd zxf{Dv7W<_LK-?X^e^ydZ#E$6A0%DtDs(C)2zhe28i8_0p!$85?5J)8ppfOljGIB7C z=!RM`X21Ycf>Fz9xa#5uHZkjNcNpu_~eXt(sl7C?0Jg1 z1DWbqUun>50%nxUrq_V1R7|sE>%zwIG*bTCCX_AjYEKb_dd(pV;^iZ@)GwpZzjYU{h<9A&UnB`E7d2*sOqunuUdzL^jS0aMS1wNx@7>dWI5&Q$dc%ljPPLgY8M5rW%r?h&XY4z%Qzaw$ zT$DzFN{-jr?$@^s-EffsVXbmK|L*#h^77iG<53p0paCuL<_=dNLYpji z1x%9#*$$w~f^V?FRvQ)_(tVWnh-^Z%R8I3JuTdN!HwF%;eNqNu$DXFXmF{pTfK`^X zry{q2?$ZFCoPcDX82;>Fkb2cBk3W3gdw&VdOX`&Q+sy;0OQ>DXZ2IJ+b@G{-gm1Oy z?Wr!ll?0dg`-y8Szo(b^fmOBtHbiwW9|nHb=wwry)2T|2|10vAaIJoJ?3QF1k2p^<(ctVGLPY+|CbDnZFFAVns7+j<6Ap<(0<2ueMPP zzry#X0kAbdkjHge7K<-V_4Q}n_Y^8dr=69WlfGxq2`;T{a4e-Z%TDy&<)+{5-#?{n z$nRI@x1vPCImSMoB@D?(iNsw(i2Ne2;X$q0D=m0YNmxO9fwiN|G+9e11g*AtNl|GLfhp7wWGH=_;Pvkt~PSJY#1M^d!ockk23MVlX#W0tG`j%O_cw+k5ZUU17LIAgPUxWGVs!-C5G$qxXQu_5ve@^jIPtHFR+_Vi z6A^{tnzjpT6Y6M9jE6nh{@Hn)Tn@{i2ugYtT*A#cR(D76=`O_kcC!*CPc^Tp9u2Je z!TjutWoJi3S~`+_q@g9jatsciY8h_kEnZ$W2q#&BQ-j^ePB4=DG2fFvZ=X<1ZbUUp z6|qpg_whQi`M%F-&3h!aVL7%H6?IEF-^cM8{FH2K@cc{GXyd11fPrUm{$tePTu-pO z=dE0Iz?)xn&-RUxY|q`x3JIZuJ^y`J(`@SXL#inz<2xx9zjB=tm5r=5Brj|vZ#gj= zXtk>nV>XjBNtvL^(chy;Z*CeX`?7BVcgca&A()_J*`#t@(O-{6`27x!Brr)xP2<5m z!7!t0Iq`6_h>zfi_d!6_j7qaYY15x$56_pv7afh(911TeqG%`%uL$yLOJB*^JA;s} zLEV!~lIon4e>(+gvMeiFPkwo?peQE_REOui`4I7G`SpESFIU+vck;K(Zq()9j+~Bl z9ik0=t>Kqpwrv*yPtFOJ{iSUl1Z0J&KQ;zsmn#CEFDFcq-|V+z5R-zwfbi45d2LFM zs$8vq`IGokLP82>$}Ik>8!b!~X6JEuBE74JF=JZ4oN zImFc2!~AgVQDdCSxs_zPe3`RdsBVRBM4pDaqI1AhciV)6uh?`n80Dtqw?n6!vJ5w{ zS0-j{#b3ykE-}_QxNxcc)#IC20*bcjcwuXPfBnr+q=H$z~F`=bYrGrit~>`)JWg`9FM?DrM1xPqtEESxZQUodgiW~I;Sgq}QR zbTp-_IkA&rj&hZ@jS`O-LJht1<x+#OziJoV24 z@#eh!Ml^eK{2OsgGDRG8w+D)Rcw2hX*dp(YXped2yjqMX?UMg=H)cl4Ld zcj^dBK7cZ5_nr`jl@4 z^7!Zh0>9u_<+p3cJ2S@`&@0?KPKN(ms|^<$8wb~2i5@d8l#kbDXvr7Xl}&%NPt|2W z(Iso^#M3d0ctBI} zPB&4V&sU+Mzx2x{m=TJxel=I9G1~4W>^lf&Gb%LiIX`$l+_frvLR=XKBcLjtb=T(4 zr{gwji@Z{H=^nLdbZYSaz0Ozume-X0iq)J=P<4#Z( zB=I_$RFL-(_BHU>|0TMi?y&x&qsmXLc6xKuxD1&=#Z|P}`=%qO(6?*-##r@pTrUmW z{Hftka%%?ZvEPLZ$0upM{CAOi(eXl?n!&h98Ua_0a{TghBjR=Q!s~O#+Jk3?Sh6b= z6GndaX^&lSbbd^%v_crQZf`2c}yYcjP8~JXc(ZTE6Gu_R~}%f8`R4 zC!vqJFg^+aBN{ocXb$)(uSLt}e+OhfmGlI}3QfK;8oj@OFtFaIFkiz7hoMVMP#TL^ zqL=he3{^{W1T>fl(0&L*fPx^SQy+l`I0VOBqX zwLS^$%YS|XwLXx5sQqp`zAjfX)nT^adlf_D{6;JL>Dd29qj{q{Eql9TJ&Fs)B5Qvz|$(bY7a-re)-yFe;w z*KgqOf@&04&DXb?Y*(eQ&HST_nfK(su6vkTa-9|eM7e%s!?`$Bafo_L+51Ny$E%Ma zt*Yj=(NjE=b*9$E+P*O ze$4w!c&ygE1fv`^Kp?kg7Lw+sdM0}C4VElrz0y4$0gy2lAd_LJ`BSfwzB-Gl66tU7 z@xtf+vu|fQD^V=vVA;da4YoG02|^LS(=!p+I6p_m5|Jp|mio#%dw3ZYYotq!#r1sU`1R;MBgl zX1~U|u)26U(?Lyd5Vx*fa9E;QOi2r|1SY3pp8tAse85Wm(@$vLYks6O{9ysU#aUk6 z3bnPa=9?RpKqtXsj{U$(x2S{M#)9$(f*)3gD;jW7MzuR(Ws?`3f67dRUAMbVwNr9FC|5j9V4 zEza&PgO-|^f)CziX5gkMTRNZ)gZ*wMTmrpvN$dza9Lvyz3X{8~$QpKG^gWVKzE7x{>;}#B zaD}q7o0ZTemRn6&7)SjX6kfv|Q+K4!R79Tq3)xP=daGbBt1WpE{j?}l1B5x2eQY-R z7lLN~S3D287QNZhbb%lAZ+@DQ;-5@e@czhpU!j!HYP5*yrjI5ij+pz6$S&kbb(&GC z9zlf+($^uS+kFRZ;5SW>YWq1L{_(H3ds44~UOKJW^)iz98=LF|YI>U_;Z$0wYjZnB zRVOlT`kn7nPDk74 zO-?JbnG)WRBKF<+CCT61o!q?RU*@KA873ZU$-z^T0YV+1m%iH%^nmCqR|!7GT<&`x z81J3{=8b^wiP6vazDRxDn{_EW`%89qhBEIUnsLL5^Oj+sVY&C69=R0+KN)zDeZ>+`Yr0m8fmSt5@)iNP48aJu;&-;owur zD)TJ-8?5DMBSGKAPa-_%T!xKfxd#MgutuOoRdN>7{{1f)o_Y4cBH!io+13iZK&CNN zL&f*A(_Vb!N&=|EvGJ!1EYC&^X*C3?U!e< z>R><6s^**ypHXIN-ABcbL~ED--tgsS_l$F2NkqFrxueX--qibBoi~Y`^O+8CY+by% za_@0#t}6O@4iso+e*%;1^*$CMdHZq~6twg;(VCem_}QHk!7^7UR;y03sIC|kaDP-) z#^WsbdNOlrEYxf^P@z-7C>(I?lt0fCQN9jxpk7fAu@27SN2bWrPNx7DiW~m4*+p;b zPB*?tvZfn&aU4+!un%rN=MWM0yB_(va&J9xk&|!osWXU%z_9Z&k|b#J@cAXtIpqG( zXOmc;W}(vHI6$@jxVcT3#Y}WUw5Y;$6&m5!bzZ+zvew|qM zxbgT~;xP0aOd+LZ$rpssG=v6;w_u! zjh8Mv=n}cIQ9$@4Q3B=tYziMxH>qxIh?IW2>ew~S@v&*?Ek;Q3~#~%IRO*L5;JRq|Lnq&{! zz<+F-|trYpc{#jtYX3pgVp*plT>#Rr1o>PPpf~*rhEQOjux?1z%(yRhxi> zyFpgm!_4@V77J@Nf7ycadYs+k{)N1F(@8|UZ&?wQ@{0X14>zGJQJ`n7)87P_$@^a_ z@%jO`+7c4)Zx?+l6Uu9mM^D4L<1rGyIBJ59H_oygtu6~$E))cP#-GT2Fmmc!HS6K? ziAICn>(c9*IVys{CNUoyf6hfqx{R5QPR$ec^oEb|L;LFCk`mn+)D3A+L010l6gdnG zk^M#+JMoj(p`*E-80j>tT-R-Fp~yTU90JdS$UziEzJhfFZ~ahOIi>vm{ij5=N|;QW zRZ;X=CZ}UJvGO@K7pQO~9d5R-N-89T?>l5Km_Zds4`IDm%moxCz%N2^iP$W#I^frs zkLL@PIWWyphP~Ivy9=mvNO$9z?E4Mldsxe|lN8mr;*M4&^ zWtjmwH_EGtOJ9%C*F}S04>9{}Jj@%tUyb-D2qA+np}t%yN90BPDK2 z+BNxNA99&(A~ZT{K7pcB(E(((cT->37uZ2mEj#ngLWQC3Bip_XBY#7PNapqCkw+F? z+8kPZu9hEv-df1`$7vDW-xi&4ueC03kqBt<`4&_#u$p?HJk4E;x6T~cB5e`yUtM{f zKGy|!RtoT8I?I2;`!Zt%V)XffN7ZBhyKcv;w-NHsXfRYf8!@Tu1P78X{JyJJsfw+iRS3oytN$c~`aWj>H-G*P zmp=L)D*EypBp8?}2*S93ed@AM5K-MM_<`4sP&xkXEa~t2lX~#)E(?%gU8fkn$>Ztv zVj=yD!Sb7qZT^;zUCgV>{O2vv*4HrWH;0Ir_XQgM?(mG#_4yH@jSPWY4uj-G zF3SFO^AY{U+|LQmA`eI0=H7L)3(8-4l3(}ULMGX^#F-DaW|SIFr{5~dKe-6WG7LIm)04Z$6!z89Z~7bEts!>K$Kn@*(m{df0-ZCp>HAA(?qhc>-f?Z zw#381VxR~)Yo@=5z(<3)zz76fcOcK0cX z+&;2qE?Ki9N==9|G-0s@DyO(FnM&$8V)XU04HMt;ei5nXNJu$$&mYWStuZ%SvA$te zFv(aDvNU6hF4+`&<9u-!NnMp6V)?sP?9E*{`d;!ejn^vw$22OoiEG zBGqRDzukN=&3TJ)1iXFP7KjsPmB@!^r&$qzw`mq%uYyG;dl&R9ThS8m1Mo*$13sIw zqE@BWtBbCgwL%B(9)Zv{bVQ*5pGy8ZhcHuNe(Gr0Q$w=rfb`TP-9 zWC{dQwFIVNL$Ic`d&7HcHv`U5m~mI+bZATkrOh06idPv_Gef+>tD0Cd0Jx3hkW;vE z%Kb0eyjGa1a#xaF4J!kGuJ$z5U190N+p|~oc>=i*en-K$I)ECYMewn>CzPHsWx~5D zc2uuqc}aQ8Qbt!6Pfi{m{Zy{67-6oV%{dmZ`vZCTs2owL#Q#VX7Ogh)|xvuPZ1z37@fLo*p$YC+;yQLwBBhNW0Bag?*I zJM(VTut}v(4T-yTRdF*iC%a*CM2*9=Jxl`63zeo}ExZ@0!i@52Mok%dbs20;(Uy|u z%a}J>vT|M$CriT^hN?8si+DPQ`x|lmMYh*Pb}6@6ItWD)&;gHT{F%NFf$V|-bJv*6 zGGdRFkWn-dSB5ZOtUU#2hd&JT2ethPpd60C{A?mS{Mt7iCnC%=NG+_|ECgz!4lIb9 zk!df*rkO)78cYY;LQBIhh>4Pk9q&wJyT3lR4+&4rSWXbQa3n5d9n#l z_5%sxf)Ewqp(pZn*$FXQ!pkg@Elue?kH*wxr#+-bJ{cbfyJ=vuVisIDeBM>eMRc1G zJE4u?NR(%0QB3z3TA6^jjoX8iqN>r8G65Pv)su}Xz4@J!*{fWGLr1RTMZ&+OuufK?%ZO?N#Ct2<|XDi2e9M~(F+dv#io#^+h|o~w|{HO>}s|SrW(*?$hBW${hClS zz@m*3*E~h(*UikApv7WJnigQ#kymb2jn7MgTv%rZNj=3xz?Gme$*06k%pAT{a)hPH zG=b7q2OMbQ3 z6f&f2y=U-xIB|4QaLBh%)m~y`VyAB<kOR{p1=gdBDY6W^z^9mYK!8F{gu@g!^}dC6q-2cx{xFv?51k z1uHC=SuRlDripS5mr1;o7 ze#Q4lLs#qWTUcmf41PWd#kj8fvWpKY{CK0BVhu|zZ-x0yGa>^KW9HP76;-4A%NuvY z*nkXGo`UQmi$7*#i}$0U8p%&Q2aD9B8#(clvNwhKS7|$~I!$7!Vhs`d8d5pS{A=#U zb&_HX3@4$1ab&cH_KG(}wO0hWP3M{=!%?~vsiYqParUDlver88ec>eXalV;*p-qMGAW}-jzc&5J1LCY{Ko#jiL3o*=RZC}U z*fFf10S>koSnbq!pZoU_ZtjZBSN9WXUT!YjL@Hd1yLK;Gz7CqpX2L_@f0kMw5N`>W zWY5j~oMJ73alPP5O9mK*010w}*gip=4ZkMYKsLtUYHBvIiBjR+r^bjf@}tAUrR*FP zvl5_=?Cwx9I%D_Ck+EUt#6m|%(sEJ|<|5J*VudO4W@kni70Jc2iom2V8H!Wd3F3q| zqDEs4AExvR8sQ<)SW~=xGFSn{4ECOPuwDpngIN6b?u3x%%KVvdg^;Gy9ROV?;6Y+X(pL~;%+=G`n;Q%DuN(|7o-o!oi)2-Hye}$) zyBzRps%9X=%v%9=zteMj4IebUF$U*!SIB%R zf%bg)-1^=PdUn|82_k%&fxB#Trx3H?_J8M^9Ye)P+MnS}4kboj)$thlQO7?0N-@1;)z+ihvC>fr3yx z+&o}#CNTWNrrvP!&nnN!^`B|=vVd&RtHMi$;DoG?VPY_5Hc$#wZ7hLqkAdCTZu3hF z!atN;Q;dnBzI`%lNW98qZSPF~w~j1jaJuBKPDB21A099&Mc$T>9uE`FyJiT&fC;4$ z5+y<3fsmez5P{yz)pZYVvfR`wOk(r|HmWgnP>h_9g2KaHTKoEnp**&)E<^SOA!cxD z%y=-79`A)-c?jCkp2=@_1P||p(W}8-T2Kf_gvP>MdQa~KA^%hCR|~ILlhBT#DLLZc zjQ_8&>j0Idq)sXHU_Q;ANdylM)C{kvZP-e(38IkOey;WAph)NPmk{F^FHf+-sio}Irnql=zTd$ZN+9k>^1j!^^A%s-=a73G8aO*%V*Pk!M-WYEdV> z)~?W!pt3n~wC83(z$)@eM%jJt?7s1L4qy9L-&wpY)=;B4KYne_Pt#o0KOtGRE%*Ce z?OL5r_tnO)DVwMEDbw0!u!ShiU6joGMzCZ4HF1v?t&(x=^);Np6;r8ed}WP$(=0TV z9)0~Oy(a2 zC!f2BbPpALFM4Gp(1&K|m;I5?%ZD4-?!JGvu<{5$A9Li{;;#U${5@+51Cm^xpRlf` z1d276pa|(+RjC+9Wtkx5voVVo#8@Ja1YW%Ki)BbQ92_@i-;#{#TDIT!d4HAJoiz2x z#joP^9S$e!g+CTP9PM_Sd@Y%;yVWNrI-DswI&$>N>8l3`3H7mF;om#vzVO+*T3s)9 z*>YU%@<55cH+kDzXf|K_t@?(~(|5yhOu{h)Mb!spV}88y`@N}im2cfCmP%TL}oOCZICRFqp^sa3WK37M$ow~XyeICc23tPz>n>-*6K0%Pc) zB|>n_WwIpP7{{F#F^g)G``VN4l-*U$cX*AOTJ+RVb6)c-P(vYj7d%tc-U>8HndWls z|LmjO8e3N`dGyIuip^A^)GH$RTO2=Fx74=+Tmm9O!ei%!WZ!>PFV(Y~oZr_)Yi~LC z@IV9m^8-9-hu~h7KCOkk`#t9O-x6TkciQ+pA^8iBnpf1e+VhaSnC8Or5A??>uKL7w z2ILB@HgBjkyhx6d1h;qWqUO1ocv#vQ)Yh_YMQf~Ti*Vc)9Z$}A^tkp#-Gdp1Ht+G{ zEk?yWhLdEWqQMPF{gZIYH|&Ug7e%PpV967Rjs)ZS`p>M%d`q6MsWk=q@-8^>y>QbC zNF{XYmimp^#lD%zMM%cJzb$-oN`0fgzANhmS&S`F;D8*-kvubv+wX>HJ8LxF^ z9mwv;IJQrYLdFoAJDtqlr9rR8apYBU=VgZ3Ll&R6>Um8Nl9tk+H5?BqW{xRJK0h1F zz2Q-2@y$?SI@N4U-O)pn)u%SrQS!3(rQx}U1hJ)fMhi9PJ?g~|1;^A+dGTLdG(fV!SRMWkO)DdoIe8QJ6#*>EH(M~beM*~fd^V~Qdx`vO{E4$pD zT-K-DnJjiS-KJujZNZRSiu2hJ`GRVZ-KQAS6HS8E#sMmBeakgDE3s$%Oez)%=o@ypTzh+^4A$i$k5wwZ@wW z$;f*J_be-;C<-XVp5AtOYM8e7Tjib?`z-^TejQOmWVZ3*#!BfG+PIVQJvoDw>jNd6>3grmKmc;*ppPaZK-&?pohTh)*M_!zHDZ-FF)k!A?Hgy(#%XP7MSCm zszS#eYBa5dgt+B91$2A}VWONIeJR9aC@F`YEtAak2S=K>-=497pD$#}Lmc+cI#=dC zBz#5AS?G}ZeezM^LN}wMLyQHH4G%JkzBJ#lEqER&Da_>kIy+ftbUpBJ_L=wN#q{D2 z2<6xJOfW?`bp*RxQMedR@fv-YHP`f0x*K`hCVV?A_NwHa!c}B3>@w%4Rks7M@Z(eD zuTwdg)twS?i5#ZGRQFD$6miK>z_!?`K4^+)A%*Srq!jfT~cSh;7BR#U`yr$OW!Ou-=uq;4F&DDhcd~Zau4@c%YW{ zmGXs%eFt6-oVlQCozfG1^H$GyIcw$&fk-;=*oTf0oNPyJgOlwSRL711BsS z&coBtGCKSq{sT0WhdL@a(3&y#Y`Ds@9h@l2>~dtABM-XVxNWmZzasCZm}~D4u664| zcyt&34$tu{D>p?o!7?S)Oz@8xf9L-3EI2^Mz&AGV?<m)M6qLj3`J@wGx=VRie{Bb#wrR-+%i7G zHJy8?BwIV`8O?Ozp`2T&L%wJEvrYt|s3zXYn`O}$Z#VMW_B;lx(Z+{!pfj(Qk*!qM?js&k_1~HlGU?sUyHH(Md|OK2z);tz@7u-lq2#qy!uLg`=R@!RN*)yCz=kQ5;t2-_l_C*r0>Pu)08PS}nYBFY?rkc5vi{1E=-XrBnJ9UG`74j_ph9K{Sco-2>P1q%A2( z<4H(G`HSf&eufz%r^Qcw5@1Np7z?p_%jhFzK@s_0tPU}9J5-RcfBe|t6D5tN)^EU} z;)nqQcgJoKAEw7I&sB2i*L-`4=91CT?|dTY6DZv6_~wPwqguChR9jNPkrR(PpF6}* zn2qZ%Cn=_@-RACWJ;b~JG$)&#ZPHi|S?Jq!Y2BS!X(CwC&7G&a_vN4zM-t~ScKA*QI{ez39CwXbX%o|r*1}%*+Um+{ z&(7vHz$!AGtuKzIU5!A^=6~A%^%5NCc{s!`39A zPsuPvnt7Y(H>D{Wwch}56~#yuQV1-5(n3(!Xae(YX67B=$TxIcPU_E89iLi+Y~#AeP~*3c z2L(-LR|{hf&JUM=b9G7jU|c>Qkapd1dP@;|7K1ta@kh^kZmz4;kqW*o>gC(5+M;o~ zi8(rn3xU`}%cd3u$4;vHbw`XJ^O*iNQ$GKz2hJ+J96Vgx=-HQ8oI`tn;5Y0sb*5?1 zJ%`Ps`hz5Vf@{i5I##YMsx> z4rtu&_s=aFxn6kMz{miPeN$8YR=c~&eUb~d?}x4{H=^sqmG?>?33va z52T6tf^zFD9SS066N?X^IH$I~RoolRXs&(EE(fJ=_w9+hyY2&58-Le0!s!Mp^w;nQ z@kR$9;sn3u%-At5Z}sRt${pYti1YrI);;9*`Fr6=Lq(=%U?q*g%E-df;&|Gxp11JN z1-y=88j8|xxheWnuQ+bljI5n`lq#^G$%0_X_(NSl zGxN!`K}MtJ2^;e7V~RYLKG)1EKX_R=5AhV%UJBTDRwsP>e$kqec}=tO%?Yk1g-=w` znV)>t=lvh;KZm~%W;H-ZdoneLQ^01Xj5)O5Mfs@zg|0ZIQjiUV5gaOXfua9x~NiQRp+tM#;&^Dkpx_0MTf}nnDyP?Rj-*+U|qsyjbK0P6D3VVF0i(qJvxzBwYVPZulB>!HBs??T6 zGUkk9Ozvg4k1(@{iN2lfn`}Zh&#NZ}PM*ouPabDlueBOm(^W0#3VlRvc1{)6r)?My zZT5_&O6`53_2i{l&Hj3K6W^S&9_=IR3ui`Z;Xh^`snl@thL^?Z$lf;hj`a()Zpu_1 zK20%$YkzNe-sFzVq~}0mCwqrg52cXQ^F|F9>l&`P4wh8^GY6jXn`5qU6JmPvDwAzr zNPYH6aCGp&ID!MOckiNS4qkg>=Y$!Ou3sL!{1xbn=C7g4_{!SK@~$CF>rh?Ffb6hw z+t%HM%JJ9t>X+gD8mFx?o%=*+!ype*sutGlGA}7;5A^Od_Z>XzPx*)Rv|4rA_(=Y@kHgdT zvZHg7TP^jkQZsmwlP-xOGKsW}5$CUIBu zajsCv=H#hQm2$;M*xW$kSRw5Jva-aVg|wmsreiAas*&!hS_tc$fUM#3{xt!=f+VqH)u7;J$<`lP`nUX^=?M6$L4A0;m<(CGI$8W~5 zpfWI@74;e_5~L4`DV;HKtPFB2#rnd_mb2yD4Yrz_2F|~tQq?ahZOC(+$+GV*DXfT` zC0GohJ`%Ro+s00g$P60ZAAA`l(IU0E-&c6g4WqbuOtdq;_(nOq{d-iGi1@e`&9~UlW#6H$AnHqj_y;D-~6eWc8_nQx1=z$qN*t&w0ki-k8`;-VS;nw z6UA(E<6yn-sgn%G2QNxE{nD^lPxvWru-`6Mf#wamZJ13JrY4Ew_3v*tL=9!Oo8cvKcI*}jSe^*-XwPBtGpKb>GzV#b* zdu7SE8N#n7{58X9#M(Goe zR$+9fXYPp<-5s!bynKBkFEFaI<)(%3`~-uO&j z-;!+a-W*-;Q+iF&*}#vGAEKGg_S5Qa_(Uda&PCy##n2MD{;2Aw&SSJ)UlDt9?INph zBMBG0?p{==4Ikx``Jpg9dn=L987CW|ck+R6d>Y05d@ zaqhVLtKfdMt4~hr+t4SijS#9t6}_G&SxwP>|6&pMgo3M)+IuR{cQmT_866Y#@H8T# z>X2Kj)t+m1&1qB%Uls0I2MM8I7^wQ6&_JSYpG|HtE@2%%O=x>M5 zZ~Fw$jl7gG%Q5>|pPO4;{Qmi*TSqA6Ow(Y$nRD1nB}W^j%^ous4=QC(AD(9!@|_E( zo&~2{sZbwH_tKVIj<#50(Cw$EV&q$*%gH^8dm*ytcqXF96CLrQ#55o?QTkeosMOry zdyImF4>BJb=roxvO(WHhV7}P3#~jE<8k}~4XDP@qmU~pwKXRuD>2P#bZF}HRTU(Nm z`#w0dBWthpn%B!W-%w|p(t6+D^0{axxw@Wr{M(t?O`pxJgW)3=hw|qchD-9RT6AN@ z=Z<00dihlcc0Ii3e z=WFn;e5otvOYYo-=V#8B_n4bLoTGA|rFSwR%Un|O)Teug_OV8{wmZI6Tncf#gx1X0 zqL`69Opvmy*#9Ksr|#%9Dk#=1u3vdZR!`T0{k!s3`NZ%=;g(k>Am4V86wRa&h3T&5LVS2TWV&$2z|TM$Tr` zu0^Iai1fyIpMH3DtZqiBsZ9IJ6$6f?Vyld*n}?_g{zCNl6E8Pz?oVNwdDyP+bfI6> zs~|gr`{m4lHdE-W)YjzltszR+L>1c2w*tk`x}U|}6SFpq=9ou%IVaKdby-KXbHmU- zTse&W0up35Kk}|RzibU3ad5Ra>2&F9k=`;=&d{^iO73wwKFenK#5mvb$m8L}k6-fS zMqK(oyAX60rH%?c3fHnwxY|`BL+(!*Y=5iA@xj2Lsfo_)u_xo)&InbtD^78HO&?Px zi3FY#L*xh_2vvF^6c~5w6ncd3o0!8vr<%Fv?Ng7o+?fx(HryTvi{mHbrFWQQtqx#?L$0Zp)VCQ z?^cw5+|~6W=scGrnYP&Z^TJ5>)BWe|?#zDjW?W|G&SiAAkpGzbF0nD%qLm94wS5~t z#k5?CZf4vTx>xSuoC|U-GKHz2Jx*Yb@e^93g$Z%KH1NtB5z3 zy{Pjuukm$8X|}nK$ui#_xh64fzuGtPVfcggg5Oqm-uDRBkTH?;|@j&w&>|CU){ffp}g~ zUh#`KWyyrc_9jE+THa&vz9tN(B1(&1d??*^zlCM~cu6L~bE2k!r?y1p!`Cf`>Flc` z*M=kGJ_EDYrUMMnboK+ql`zf%)L6lLh>HL%A6t+wC)i1`=9BU4w zp3n1m*g9^NNu?cecXeoOzT&N0X2M(Y@Wp-bs6gYCz)O^bzU1MSWKX{&^~aReH}+2y zBnIQGkNpVOU8oIySn4|d#rDWDY9!&qQj2@sjiK?hw=*8qt8ZZ#+Kc;#sXd&z+T)^} zU638Ne(dl*F9GFh3B3eUY9$4kG?~i4hkeTYXSCK`E6nTrLZ4joo%@O%-U6p&o8EVs z8T_iU`o$D7HBZN%=3L!$mXJss+zJq^Uln?`(i+L(GQA-yM=_|SL?~854LDdM&}i|twnC~ z)jL^ljvcK0p5`lld8RgvyVuAue3PExi&&(RiB(h?S;HNvOqz?AuAwXsFc}tesCOB2 zD@&+}s1#1Is>cSNv#;%QdC^_sSa4n@-4Jhg<|{=FnugA%ZBoDY8k#J+>q^qcuKI&P zI-$>xT0Q&N#W)eu>gzYWdi(aQ$HtAsdsX1rVS$;o$KLSpy&l$P`Y!FSB@7+-hPCu7 ztoqII1CB=5-!)u0zx45vipr0V9c=1X+bBwAE2%$x2&{C8lHQ~Lk&HZ9{wiahQv4i3 zy4m0cbF@uwkZRau$i$o5VK3+xXSAiRsw?h!f5{2ibA|oUy~_)Rb=Hj^oWG@BILv+Y zW5H2AwE;y?vVPt?2`N1|7E35k_?j z4b)~eK}_b}2S=X$#5`i~_;NV%kVm@d1V>y+&?2()c!#&-tLgwg4$Bxiy1BzTMf7(> zKZShyNa&BgvZU{l%N}BBw~-K6cT%{fi^YmA?1o6wg|jO+J5tuIWlRHSpMf44vJgk8b0GaMo7`waGazY=o26q?X< zvM$STRBCEc9X)FwdLD5u`{q{fMo{X@FupCy>nDX1pMdvO5%|p$Q`6cGC06i7&cUJs z5bd4k=alRpE+blAHfq$Lu^(RFSkke1eZ{=3fo^$8yN>_yU2eNbMz7~iN5T?cR}WxM zijU5u{YsJDyuR0~fz|Zay{(Z9);mt)IS%z5?)fVs!}L?$v6IibV~xNOR%Hu)M}B%k zi;D^+9j9AF#C{OgvihCB4^O}E@34+9F&vxB?`TWTwax86#M`(o7dUqyUL^31o~y&` z8HEhB@z)9s#>~ehI~)jJsW*hho884~TaWtpgdXCVIOhGC{#;nYYNl(S0ON*SyCc~A zVq>%{-RO58DYcP}&6sF5YfRN!_nrPWf{O2$YwvGIEbCbi5{#C=(x0|vwm*n`vOIU^ z{JlW#6D}vk=fup--9j#R;q5A;@X4h^?aQvZNZ~o*I#~GPP^)nlrds43Fd$q?~WGN@Qy->fN?A@!K zfz4kW_;oZ-`yt_@4hL7I=_iZ&ABI=OUEUqk7QOE^O>cer;mfvn2lbA!GWXdZI=ygE zxHLoLT79yc%BR%QM486Lht zVWhpgO}5t|u~OBWFvk1PUQtAw@s5R8aY_!{PC+Ew5p^}X@*UN>*G=cx7eWoOafAiG z@|+`iXge#Il;x9)Ow9F5FYJFVYH0p?C0jEd-!Iv@roQQW|KetC;mcnwbsuYgjLR*A zj%^=JNNKe~QF^`E<0soQ<-JT<#+%8ww%V;(%&nydWgExk&x z-gh)>r~U}NoR`Y909WnmkdiN33vk=In~nS{e) z$6t>ydKU(!*f7}i5;B&`?OnbN6y@Zord9V&hSNPm={+^}dbaT{eQ03v;z=Hf@1F|= z1uGjoCwtT@BhB3|E@IIeH}7{@Sy;ys!o$~l*ZY4-e_c#@*1FtnP2uqH`r6i43$ubk zGvAfv*Bom0Zi-tk_jm_95>SkedGdi?bx-)Y4N;-ucw5Am(UKno9X4f&riu_(TUw3{ zmcxr&qLgPn4x%Tt1Am0auC!fSDIV((NGhNu-Wyspd)7?zv~~`>EPlAvAMO3){x8wd zT)$0=woSyM&%Jdq<*Q;Yi3@Q84Ts0%8o$hL+?uY;JO3(q!uZywAIv!htyCS06NbOBj2}7YS1hvVcj`>38&klyb-|b2bx*cB8x47qJrlD} z#p~rXOR~S=bo<_vR-PpO(J{@%A-UoS+}cRussc_joT2?RlL#FlM~=FTT5r-QP2L(7 z%N|nKOW_PJ;0=&Nm)3A8k<7SC{8HbiSBgwyTAeOr=l@^Bz(-6g`x1|sX zKP!&vbR1#7PK7fSCRk!#y`xaffArQMYo*FvzQ(S9s9&`^QVrIv&FSX}YupkuI+-eB zfq&k|`%PKCwg0ZeEkt}xbeO8kpz^byZ;lo2U;QT1?x);}R&sQ!rKn5b#RoRD@)PQK z6ZeQmgvk0Go@X)m$P`vSc-nyS5uu>$wj)nK+t|8eaAe)kg`b2bX6CjCjuSU}Op_B0 z-iy(m;Arg=KEdJT#c@Jd!9BRwus7oEcF7P=C$|0G(FLO(;V!nvGw$te{mltF%b!kv z(wu1&n0QUQu`TR*Q)DqTQ}EfBIvEc&Op@{Q%9q`vC->5hs1Sa%^l+UZw@Lc)=n=!_ z#={D(MnZheSX9obvxJ`}Qr`ndu1_7Q{wajJ{&Tx|-1VsDkvVc>s_lmnN!R!n8^v`} zeFzIrEskocZs!y3o66=rZM-=}xOIMO=%MUWk8@Yqd>>qhI4CFHz&_mF5aC_LT^4fk zf!ai6`%}CYc1Xoba_}inV9Ak)`rz9oTv{hGtd&QTY4gTM6xQ6;2{~cm=`ux>9XPU9 z%}lFxvPoG+_Y`INA2T<*&;FPRTx9s^Gl@yJ2-+-Mc;7614sNQ65R+&he|o5G^gWAj z|K#-vpB(MCx5`r3PAnm=$d1q@{IIXOPQ}=a^ca#&KlYyXz+txz&&iSCV~d(S``;*t zdQ*(2e@Opq*+YBx)ZQM#np0Bz!^{?3-GltZg((g{x6Y(~yL6uDL9t`@sj=YrzU9aG zK`BQ|=F=CsUs$Hy8FbU7*kJiUAJ=9kT8`90rX4MhH#N0Q985l0~vb44&+nWo0-F6ugv-98pe}nwH!{vH8@&x*o zblR{7nMZEkxNzWAI^_>vswFZR`W&V=avtV;JL(4~d9pTjr#G;XADVdl_x`gU?(&y17gC%DGL3V8R_RDJK4G7Ih$>`Cs> zk?h%XShbiDCs5|})m%1^!n<{{@A71n)}XOr?kYWN>nQ%gnb1?9PK5mz$3Zoi`^~b{)LOaaf0M`c6^f&C+v88a@oDve&xOnpNzob8h1RWoBN1`~Gq;6q z?6Y#Zgke4X!;bvcW9ML;nE_?Nr?6GJI*sO#sHa`*KL*M2JT51!__q8MBji}@eMWAk z(@#w{S?+77U&U^AbJA7$#&a_IM!LMlJ%0NAB~fmtzvGxSLuv%K!k9!IF=w$n4obOi zD6U9SAC3PJ6y?%;v?e?1cCfsH0$-*KYi5IR(U5YrMvs@hrE}_>Vu0fjx%xSl?^II~ zrxY&JuzF>(KDP1LyE4Fiw5gNuc+w#5*PhOAi3<4_)LvsXAMbT~`(1}eDYs1Jo!WsI z1zd7ed$RHkeyRsi#*(M1QxXc)o$FP{ul8;Wc}GQQw@l?|-c6f4rhq;adzCZhy}U}D zc3PC%*|}5oeA!zx@)a!iuhmC&J&Qf};+E!;9O7Wi6pTl+FUFotR|igC0Vnjx`wrix ze~qTo@|ij^Iy+f2tT2&ezR1m`6!ZKp`txx$su=6DpM?uw;rwLedRLa}d2g&7z7k=% zQ1GRZ>{z|U(yce~r%tJ^c|I%?j6AwmmyIuq+2It+36}H&>QQXJlCv)y*?`Nd#5{rx z^O3(fAF@=>@1Qm$yv(oT%-9B}BUruNP)?bKd_l7} zob_9s$i*?*VMVKrQ>F^}3kP&Pin5O0W*+e3nD4uKKRboRtL5j*%XR0^WT|(f35sY| zv)wwJ%SN5LY`sEuAtM(B|jb<6e8i!6{!38@WsT^}sc%8?$R={s$6EKY_ zb88GWRvr50V8$f(d{A}U{^o{(oC2YCC8v72E&pf+e+#9XwAd`;JU#DOHK&KO)3Geh z#!uURon1WK#hYQiM8`Vt#uPRe{Fd9`$C@S{!DTA)Y^5t_` z6#Hc3ocOaYS;`2A^@wgad!oKb9}_3gBQ3Lqn1*h{OqbuS7Z(_KKC`(u0BJDd7YR6Q&W^~&p|f3x{_+uA2}Biv@GvlXcczW=n?&#rLRHx)spk6ofJE5C!xq# znmx3W-uw1=3YH`}+qGxV0ok|To! z>8y^i(kpTL3&T2m#gs*Fx;ExSdRmH4Mkr0>Qmj+Zxx&~VwX}zYTs~)4Q)iGwPpRJ2K?)k5VMH%#v-_UwRsc`OTYa16^e808et!CzFCr8Jbr&lH~ zT%mq0Bt2@0;}@fBKPqopaP|h>$sZR}Bz*UyxM-FG?>!GTUJ{!W*q?Bf&GYB?x@!`I zJ%g@68L62imbARvpK|ux5TjHOa2sY9)E6~nig0FsfQ-4sFV7{|nl6zYoVQ0(eu01l?IpY50mo#=WO#-_q zw3Nx57Mm*5*QiT@x2gu$4Um(36;UUx2)_BEp)J3x?@zMc@krY{Kjm7wkP|jk^`tKB zMA%uQhfj}u<KL6mI7x0~tEeDw9k!k++jpj0=VS=hg!P z_wPjpG<@eGL*l0dTAIYHPTFJS;1)taDfK~iG;-%E1N~p;>CuVBrPQK3w3G_2&Nhkr ztZ8q8)Ag9&R~x!s(YDj0ko*`dj2{EXC#H9S-*FEmP%|VN^U%Fc z8sAPARPsBI@*nTkOU*4xnNw0 zmz#dN|Eqw*7Vl{KNq$ev9ja80H!H1A=1+GVmTGy+DrzL* z%oxHew(a1Z)6>#akSh;!zhZMr{xicd{4{r-N!9+m51gk~Cb)x6bDZ9_2GJ&G;41GlRXQ3ajZK56|? z9U?jG^;VCjPOD3@_qAJ2zHn=xF1l%5aX5*+G!4OV2H1$&^G&f z6<`pFC8g9NiT69flDXbaa~rHO*9B^hM8Y&JoE$8M(Kt#r3KRypBkq-R)3khKJ6~C5 zXc6GDkKzn?^$%iab@9UyI~Rud;XALv(B_AuciwOT{_b36;RmnOAhr+w{-ML{FohqE z-RT$j`{y}!hkg8T9PzRepvV1rj{8#|?oWOA-_Hqf{O^hous?s{MCG8(kAVNK5CQ*P zAp-Hc0OC(a5r{wZ$UpQuZ~p-0kiR>KK>m4-`rQG<&Ltl39QCI@^iF*j_z^pz0UrDr zF#_|aLd>5AF@FkRh#C&i0j2W$@1G9h{yfM1ZV>sWV`lt+2@D1mE6>1|C^tu|%7w!0 zu!1N!njTl29b9bP`H@IiV%i+IT!sA2N8&?eFft@|r_r6S;I0_*H}`hF0)8NW^X@k> ziXR2r>B(Hf}FIF29nn@tCPe+Q3$v*-6$JU(byf% zfbsu3IxHUjM^yg9kU*?~>e^Kpi^mX`+%61>#1S>kE)38S7w#?$iNq6Co{QNr*JQj!?1Ve&X-atEz$07)DXkjD@O?=JK z-xb1P2qcVz{U{6;(g=}`s22Y&3p$7+>h!-cI2;cAvmK1^U$2oUz<&}#EDS2aNHmOS zMRr$+A=M;EH0U)6-Hzq@uPl-ONHmhD4i8~Js1T2UU~n`XhJ`c&19A>sVt@`#qCb!r#6QzX_(y1f z<=?T9fA<ux#(SU)6+7zy++RKzf(69WSnnEl@h{hvVs5RHd) z24FZCr0)n|@`$e5-{S#v_#GPsz<=sP0BI+&jUe8_{ky^mzim5kt1v{5Xm^EJV5N3r z2rLE|uH6_6gGCa(u)oV9a6mpG69eebP{~0M@Ho=x$6&#$;dWOD6dI}J$6&G0RZ678 zL&Xz=#Y6Qb5{`ip_2CZx|6v!5$Z1Hg0U?}3V`Fe|l2s4dAW^1RJc7j7V)4kotOwz@ zYlTAtk=s3D7#5HHZS?+|Pk`Z|a||%RLr7U13`Pt^{+<#T@T^FL6-Pkhp(_mrIs;wJ zFkl;rZ)MwEAqIi}SCIbrh&V8FQ1;_6XsBj~;edJ|${UgY|FRzkCZ4nrKniUb_%Kjm z#bM#3qr;MVcR1`WoA-PD;jrM>6i6CDlguX$iy?a4ySab`GfIMi?m#i1mq_Svz@a4> z9S*1!lEO%02)Mgp+)j+L3&UfuP(244z(S`OSbkuSi1mT-|I2GOKu8Q`A=pm9x*Nk|;LwHszfNz2z z;Q|tefI7{94h@5>Z8#DrB*?M@7>dOIK>@A2iw^J~4nU}-27V1tE0A8JfRWf$7?cHc zP`?JaCNN^|a2L1GAaw!lG@wHeAd(KI1iTd#S{RLl8XY1XiNFEl3Dp6B4%kIVeL(g6 z6CM8NPyuE3mtNjc%OJeN5%Ze6MglOXzXE(15(^0YA0#w71Q-h9gzq?17!rZQfKEd+ z94L%~T19~2Njr#zL5&mWAOh-F5IYUW5Fn!ivkujSfDlX4FrXumYCH@^QWh8;XpjaZ z6$BoC+9mu+E`T4_*-6FiVl^HH{2WLJ0UdOSfus}`>b!vZNVFc24yup{03;a+0w@)z z#Uf(Rcn4s3;?KzZ-D$**XHJR{6Iu{DFewoK4*>^`=Rd6Z!xS!l9}fK|q1n z2BH`cD3Dko#elC3sSph(aW)WW;QT|&qJgsq6A15hVV|)Gk&7ubM>Cu^1RsNdcFfl!G`J2CBXR z9g?Ke!2bYFG^Al12+ko^5%}{U`3I##gM=s)1A2k9EC%WY0|^9+8lA}{~%}}oliV)TOlI`bRdBJuQ0I^B+EHtkLFx>wri~nDp{+&_) zfkCYzz<`86J58!u!FCIhgj>J~gUAQSKLHTxRs)PATMIA}(~ANegnGO{Cj%`2?I1`m zKvx73c>Xwu{|5?#;2%;L2?O0B!BEgl9w>_>;T96OD$tb!EXltC=|BD-G58_TQb7Aa z^*q=_fI%}_00Rad+Cey$L_UykAe+1Cfc^z#p}HCgVj@xu_*}aSgR-RR7KAD!(hq`n zsP6~{Ow2p(*q{GYFj3-2*bla6pz{gb1yXJS0f7o8n3I1ZoqyFlX!$=6>5u;h^5Q$& zl)ID)*olEA697b#KnEDfMhtNi2kJ=yjKn2J0{(+E29&KxlBfo>3lf}AI^dc?)i=n1 zL;XZh79@{J%I4Hm;n1LnEmblflV9` zTtj+D+=C#&FfeEs4ax!+6TE^ zC2`3?SsXNL1~BxF%^~vtU-p9pJBjWG7&LDK_E%8Q=op9=utbm!0*u5B!=iTWf9}jb zaMFQ_gBAwdC&hrhgVKSigR&nBrVh$2EE+iZyUU_rC=mZZDg@xp5rMy#BEZo9gANVV zgeb7#2%RQS7VIxV8wQ!Qov8!k|A+mcFdiBpfS!<8J7Q?}w+l_|C=rADga9MiW&#*` zSCWg!e-ICWY#*eDz-@wVjsZH5-h|TONc=xQN0Pus0rA-F`G9so%nSA(AQb}ng$g0i zjUYlGp#xhcBp3qfl7q>FLDe@A`!k*Y`F{W;F|%N4<`fq&%)7+w-?0gPmd!6qO0foup10SI+QL7YRf z$qFzMqXXm|{f}SwUuQsM0?`YA?%!RMfBiocNUlNcI}sxhLXcI3CZR#l1t(czIFL1i z3N<)@0?`Wu;H!b94HYgBZbPFLK!+w-c6g8thK>$kB&^26L3j+|G{DdZi2sKIK@!yH z0E{HlO*}XQP0axe1NC@;gSu-!`-+>DgR`w0y_6L3%#yaNE8z+_a0J-&`z)WDi=8V! zkcdCuPVt*a0r>}t7_JE1G_1S=7JKRxI7XtZfL6dNg2QHt7#aTmpTvyVn2v+DE%9&@ c@x+t+6)U$ZJLjDki7qr6OD`;}q^V5*e@+wHNArgV); +ExitVal = (INTN)ShellAppMainsbsa( (int)Argc, gMD->NArgV); ``` -6. Comment the map[] variable in StdLib/LibC/Main/Arm/flt_rounds.c to avoid -werror=unused-variable +6. Comment the map[] variable in edk2-libc/StdLib/LibC/Main/Arm/flt_rounds.c to avoid -werror=unused-variable ``` +#if 0 static const int map[] = { @@ -104,11 +104,8 @@ The following figure shows the source code directory for SBSA ACS     │
    ├── platform
    │   ├── pal_baremetal
-    │   ├── pal_linux
    │   ├── pal_uefi
-    │   └── secure_sw
-    │       └── arm-tf
-    │
+ |     ├── test_pool
    │   ├── exerciser
    │   ├── gic
@@ -116,8 +113,11 @@ The following figure shows the source code directory for SBSA ACS     │   ├── pcie
    │   ├── pe
    │   ├── peripherals
-    │   ├── power_wakeup
-    │   ├── secure
+    │   ├── power_wakeup
+    │   ├── mpam
+    │   ├── ras
+    │   ├── pmu
+    │   ├── smmu
    │   ├── timer_wd
    │   └── nist_sts
    │       ├── test_n001.c     ────────>  NIST entry point to STS
@@ -170,8 +170,8 @@ Final analysis report is generated when statistical testing is complete. The rep For more details on NIST STS, see: -**Note**: For SBSA level 6 compliance, passing the NIST statistical test suite is not mandatory. +**Note**: For SBSA level 7 compliance, passing the NIST statistical test suite is required for S_L7ENT_1 rule. -------------- -*Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.* +*Copyright (c) 2020, 2023, Arm Limited and Contributors. All rights reserved.* diff --git a/docs/testcase-checklist.md b/docs/testcase-checklist.md index ba863a0c..370b0b57 100644 --- a/docs/testcase-checklist.md +++ b/docs/testcase-checklist.md @@ -1,219 +1,197 @@ # SBSA ACS Testcase checklist -## Test Number mapped to SBSA specification section +## Test Number mapped to SBSA specification checklist - - Also, indicates the test coverage. + - Also, indicates the test coverage . + - SBSA L3 rules which are common in BSA and SBSA checklist covered by BSA-ACS. + - For details on test algorithm,unimplemented rule coverage refer Test Scenario document. + +| Test Number | Component | Level | Rule ID | Test Description | Verified by ACS | Test Environment | +|----------------|--------------|-------|-------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|--------------------| +| 1 | PE | L3 | S_L3PE_01 | Check PE Granule Support | yes | UEFI App | +| 2 | PE | L3 | S_L3PE_02 | Check for 16-bit ASID support | yes | UEFI App | +| 3 | PE | L3 | S_L3PE_03 | Check AARCH64 implementation | yes | UEFI App | +| 4 | PE | L3 | S_L3PE_04 | Check FEAT_LPA Requirements | yes | UEFI App | +| 5 | PE | L4 | S_L4PE_01 | Check for RAS extension | yes | UEFI App | +| 6 | PE | L4 | S_L4PE_02 | Check DC CVAP support | yes | UEFI App | +| 7 | PE | L4 | S_L4PE_03 | Check for 16-Bit VMID | yes | UEFI App | +| 8 | PE | L4 | S_L4PE_04 | Check for Virtual host extensions | yes | UEFI App | +| 9 | PE | L5 | S_L5PE_01 | Support Page table map size change | yes | UEFI App | +| 10 | PE | L5 | S_L5PE_02 | Check for pointer signing | yes | UEFI App | +| 11 | PE | L5 | S_L5PE_04 | Check Activity monitors extension | yes | UEFI App | +| 12 | PE | L5 | S_L5PE_05 | Check for SHA3 and SHA512 support | yes | UEFI App | +| 13 | PE | L5 | S_L5PE_06 | Stage 2 control of mem and cache | yes | UEFI App | +| 14 | PE | L5 | S_L5PE_07 | Check for nested virtualization | yes | UEFI App | +| 15 | PE | L5 | S_MPAM_PE | Check MPAM PE Requirements | yes | UEFI App | +| 16 | PE | L5 | S_MPAM_PE | Check MPAM LLC Requirements | yes | UEFI App | +| 17 | PE | L6 | B_PE_17 | Check SPE if implemented | no | UEFI App | +| 18 | PE | L6 | S_L6PE_02 | Check Branch Target Support | yes | UEFI App | +| 19 | PE | L6 | S_L6PE_03 | Check Protect Against Timing Fault | yes | UEFI App | +| 20 | PE | L6 | S_L6PE_04 | Check PMU Version Support | yes | UEFI App | +| 21 | PE | L6 | S_L6PE_05 | Check AccessFlag DirtyState Update | yes | UEFI App | +| 22 | PE | L6 | S_L6PE_06 | Check Enhanced Virtualization Tra | yes | UEFI App | +| 23 | PE | L6 | B_SEC_01 | Check Speculation Restriction | yes | UEFI App | +| 24 | PE | L6 | B_SEC_02 | Check Speculative Str Bypass Safe | yes | UEFI App | +| 25 | PE | L6 | B_SEC_03 | Check PEs Impl CSDB,SSBB,PSSBB | yes | UEFI App | +| 26 | PE | L6 | B_SEC_04 | Check PEs Implement SB Barrier | yes | UEFI App | +| 27 | PE | L6 | B_SEC_05 | Check PE Impl CFP,DVP,CPP RCTX | yes | UEFI App | +| 28 | PE | L7 | S_L7PE_01 | Check Fine Grain Trap Support | yes | UEFI App | +| 29 | PE | L7 | S_L7PE_02 | Check for ECV support | yes | UEFI App | +| 30 | PE | L7 | S_L7PE_03 | Check for AMU Support | yes | UEFI App | +| 31 | PE | L7 | S_L7PE_04 | Checks ASIMD Int8 matrix multiplc | yes | UEFI App | +| 32 | PE | L7 | S_L7PE_05 | Check for BFLOAT16 extension | yes | UEFI App | +| 33 | PE | L7 | S_L7PE_06 | Check for EnhancedPAC2 and FPAC | yes | UEFI App | +| 34 | PE | L7 | S_L7PE_07 | Check for SVE Int8 matrix multiplc | yes | UEFI App | +| 35 | PE | L7 | S_L7PE_08 | Check for data gathering hint | yes | UEFI App | +| 36 | PE | L7 | S_L7PE_09 | Check WFE Fine tune delay feature | yes | UEFI App | +| 37 | PE | L7 | S_L7PE_10 | Check for enhanced PAN feature | yes | UEFI App | +| 101 | GICv3 | L3 | S_L3GI_01 | Check GIC version | yes | UEFI App | +| 102 | GICv3 | L5 | S_L5PP_01 | Check Reserved PPI Assignments | yes | UEFI App | +| 301 | Watchdog | L6 | S_L6WD_01 | Check NS Watchdog Revision | yes | UEFI App | +| 401 | PCIe | L6 | PCI_IN_01 | Check ECAM Presence | yes | Linux App | +| 403 | PCIe | L6 | PCI_IN_02 | Check ECAM Memory accessibility | yes | UEFI App | +| 405 | PCIe | L6 | PCI_MM_01, PCI_MM_02, PCI_MM_03, RE_BAR_2 | PCIe Unaligned access, Norm mem | yes | Linux App | +| 409 | GICv3 | L6 | S_L3GI_02 | Check all MSI(X) vectors are LPIs | yes | Linux App | +| 420 | PCIe | L6 | RE_REG_1, RE_REC_1, RE_REC_2 | heck Type 0/1 common config rules | yes | UEFI App | +| 421 | PCIe | L6 | RE_REG_1, RE_REC_1, RE_REC_2 | Check Type 0 config header rules | yes | UEFI App | +| 422 | PCIe | L6 | RE_REC_1, RE_REC_2 | heck Type 1 config header rules | yes | UEFI App | +| 423 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check PCIe capability rules | yes | UEFI App | +| 424 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check Device capabilites reg rules | yes | UEFI App | +| 425 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check Device Control register rule | yes | UEFI App | +| 426 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check Device cap 2 register rules | yes | UEFI App | +| 427 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check Device control 2 reg rules | yes | UEFI App | +| 428 | PCIe | L6 | RE_REG_2, RE_REC_1, RE_REC_2 | Check Power management cap rules | yes | UEFI App | +| 429 | PCIe | L6 | RE_REG_2, RE_REC_1, RE_REC_2 | Check Power management/status rule | yes | UEFI App | +| 430 | PCIe | L6 | RE_REC_1, RE_REC_2 | Check Cmd Reg memory space enable | yes | UEFI App | +| 431 | PCIe | L6 | RE_REC_1, RE_REC_2 | Check Type0/1 BIST Register rule | yes | UEFI App | +| 432 | PCIe | L6 | RE_REC_1, RE_REC_2 | Check HDR CapPtr Register rule | yes | UEFI App | +| 433 | PCIe | L6 | RE_REC_1, RE_REC_2 | Check Max payload size supported | yes | UEFI App | +| 434 | PCIe | L6 | RE_BAR_3 | Check BAR memory space & Type rule | yes | UEFI App | +| 435 | PCIe | L6 | RE_RST_1, PCI_SM_02 | Check Function level reset rule | yes | UEFI App | +| 436 | PCIe | L6 | PCI_IN_17 | Check ARI forwarding support rule | yes | UEFI App | +| 437 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check OBFF supported rule | yes | UEFI App | +| 438 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check CTRS and CTDS rule | yes | UEFI App | +| 439 | PCIe | L6 | RE_REG_3, RE_REC_1, RE_REC_2 | Check i-EP atomicop rule | yes | UEFI App | +| 441 | PCIe | L6 | RE_INT_1, IE_INT_1 | Check MSI and MSI-X support rule | yes | UEFI App | +| 442 | PCIe | L6 | RE_PWR_1 | Check Power Management rules | yes | UEFI App | +| 443 | PCIe | L6 | PCI_IN_17 | Check ARI forwarding enable rule | yes | UEFI App | +| 444 | PCIe | L6 | PCI_IN_04 | Check device under RP in same ECAM | yes | UEFI App | +| 445 | PCIe | L6 | PCI_IN_03 | Check all RP in HB is in same ECAM | yes | UEFI App | +| 446 | PCIe | L6 | PCI_IN_18 | Check RP Byte Enable Rules | yes | UEFI App | +| 447 | PCIe | L6 | PCI_IN_12 | Check Config Txn for RP in HB | yes | UEFI App | +| 448 | PCIe | L6 | PCI_IN_13 | Check RootPort NP Memory Access | yes | UEFI App | +| 449 | PCIe | L6 | PCI_IN_13 | Check RootPort P Memory Access | yes | UEFI App | +| 450 | PCIe | L6 | PCI_LI_01, PCI_LI_03 | Check L-Intr SPI Level-Sensitive | yes | UEFI App | +| 451 | PCIe | L6 | IE_RST_2 | Check Sec Bus Reset For iEP_RP | yes | UEFI App | +| 452 | PCIe | L6 | RE_SMU_2 | Check ATS Support Rule | yes | UEFI App | +| 456 | PCIe | L6 | IE_ACS_2 | Check iEP-RootPort P2P Support | yes | UEFI App | +| 457 | PCIe | L6 | IE_ACS_1 | Check RCiEP, iEP_EP P2P Supp | yes | UEFI App | +| 458 | PCIe | L6 | RE_BAR_1 | Read and write to RCiEP BAR reg | yes | UEFI App | +| 459 | PCIe | L6 | RE_PCI_2 | Check RCEC Class code and Ext Cap | yes | UEFI App | +| 460 | PCIe | L6 | RE_PCI_1 | Check RCiEP Hdr type & link Cap | yes | UEFI App | +| 461 | PCIe | L7 | S_PCIe_02 | Check RootPort P & NP Memory Access | no | UEFI App | +| 462 | PCIe | L4 | S_L4PCI_2 | Check EA Capability | yes | UEFI App | +| 701 | SMMU | L3 | Section 1.2.1 | SMMU Version Check | yes | UEFI App | +| 702 | SMMU | L4 | S_L4SM_01, S_L4SM_02 | SMMU Compatibility Check | yes | UEFI App | +| 702 | SMMU | L5 | S_L5SM_01, S_L5SM_02 | SMMU Compatibility Check | yes | UEFI App | +| 703 | SMMU | L5 | B_SMMU_09 | SMMU revision and S-EL2 support | yes | UEFI App | +| 704 | SMMU | L5 | B_SMMU_20 | SMMU Revision,S-EL2 support Hyp | yes | UEFI App | +| 705 | SMMU | L6 | S_L6SM_01 | Check SMMU Coherent Access Support | yes | UEFI App | +| 706 | SMMU | L6 | S_L6SM_02 | Check SMMU HTTU Support | yes | UEFI App | +| 707 | SMMU | L6 | S_L6SM_03 | Check SMMU MSI Support | yes | UEFI App | +| 708 | SMMU | L6 | B_SMMU_23 | Check SMMU 16 Bit VMID Support | yes | UEFI App | +| 709 | SMMU | L6 | B_SMMU_03 | Check Large Virtual Addr Support | yes | UEFI App | +| 710 | SMMU | L6 | B_SMMU_04, B_SMMU_05 | Check TLB Range Invalidation | yes | UEFI App | +| 711 | SMMU | L6 | B_SMMU_13 | Check SMMU 16 Bit ASID Support | yes | UEFI App | +| 712 | SMMU | L6 | B_SMMU_14 | Check SMMU Endianess Support | yes | UEFI App | +| 713 | SMMU | L7 | S_L7SM_01 | Check if all DMA reqs behind SMMU | yes | UEFI App | +| 714 | SMMU | L7 | S_L7SM_03, S_L7SM_04 | Check SMMUv3 PMU Extension | yes | UEFI App | +| 715 | SMMU | L7 | S_L7SM_11, S_L7SM_22 | Check system for MPAM support | yes | UEFI App | +| 716 | SMMU | L7 | S_L7SM_02 | Check for SMMU/CATU in ETR Path | yes | Linux App | +| 804 | PCIe | L4 | PCI_MSI_2,ITS_DEV_6 | Generate MSI(X) interrupts | yes | UEFI App | +| 805 | PCIe | L4 | PCI_PAS_1, RE_SMU_4 | Generate PASID PCIe transactions | yes | UEFI App | +| 806 | PCIe | L4 | PCI_LI_02 | Generate PCIe legacy interrupts | yes | UEFI App | +| 807 | PCIe | L4 | PCI_IC_01, PCI_IC_03, PCI_IC_06, PCI_IC_07, PCI_IC_08 | Check PCI Express I/O Coherency | yes | UEFI App | +| 809 | PCIe | L4 | PCI_IN_11 | Check RP Sec Bus transactions are TYPE0 | yes | UEFI App | +| 810 | PCIe | L4 | PCI_IN_10 | Check RP Sub Bus transactions are TYPE1 | yes | UEFI App | +| 812 | PCIe | L4 | PCI_PP_04 | Check P2P ACS Functionality | yes | UEFI App | +| 813 | PCIe | L4 | PCI_PP_04 | Check ACS Redirected Req Valid | yes | UEFI App | +| 814 | PCIe | L4 | PCI_IC_04, RE_ORD_4 | Check PCIe Software Coherency | yes | UEFI App | +| 815 | PCIe | L4 | PCI_IC_05, RE_ORD_1, RE_ORD_2 | Arrival order & Gathering Check | yes | UEFI App | +| 816 | PCIe | L4 | PCI_IN_17 | ARI forwarding Rule | yes | UEFI App | +| 817 | PCIe | L7 | S_PCIe_03 | PE 2/4/8B writes tp PCIe as 2/4/8B | yes | UEFI App | +| 818 | PCIe | L7 | PCI_ER_01, PCI_ER_02, PCI_ER_03 | RP's must support AER feature | yes | UEFI App | +| 819 | PCIe | L7 | PCI_ER_05, PCI_ER_06 | RP's must support DPC | yes | UEFI App | +| 820 | PCIe | L7 | S_PCIe_04 | Check 2/4/8 Bytes targeted writes | yes | UEFI App | +| 1301 | MEMORY | L3 | S_L3MM_01, S_L3MM_02 | Check peripherals addr 64Kb apart | yes | UEFI App | +| 1001 | MPAM | L7 | S_L7MP_01, S_L7MP_02 | Check for MPAM extension | yes | UEFI App | +| 1002 | MPAM | L7 | S_L7MP_03, S_L7MP_04 | Check for MPAM LLC CSU | yes | UEFI App | +| 1003 | MPAM | L7 | S_L7MP_05, S_L7MP_06 | Check for MPAM MBWUs Monitor func | yes | UEFI App | +| 1004 | MPAM | L7 | S_L7MP_07 | Check for MBWU counter size | yes | UEFI App | +| 1005 | MPAM | L7 | S_L7MP_08 | Check for MPAM MSC address overlap | yes | UEFI App | +| 1006 | MPAM | L7 | S_L7MP_03 | Check PMG storage by CPOR nodes | yes | UEFI App | +| 1101 | PMU | L7 | PMU_PE_02 | Check PMU Overflow signal | yes | UEFI App | +| 1102 | PMU | L7 | PMU_PE_03 | Check number of PMU counters | yes | UEFI App | +| 1103 | PMU | L7 | PMU_EV_11 | Check for multi-threaded PMU ext | yes | UEFI App | +| 1104 | PMU | L7 | PMU_BM_1, PMU_SYS_1, PMU_SYS_2 | Check memory bandwidth monitors | yes | UEFI App | +| 1105 | PMU | L7 | PMU_MEM_1, PMU_SYS_1, PMU_SYS_2 | Check memory latency monitors | yes | UEFI App | +| 1106 | PMU | L7 | PMU_SPE | Check for PMU SPE Requirements | yes | UEFI App | +| 1107 | PMU | L7 | PMU_BM_2, PMU_SYS_1, PMU_SYS_2 | Check PCIe bandwidth monitors | yes | UEFI App | +| 1108 | PMU | L7 | PMU_SYS_5 | Check System PMU for NUMA systems | yes | | +| 1109 | PMU | L7 | PMU_SYS_6 | Check multiple types of traffic measurement | yes | | +| 1201 | RAS | L7 | RAS_01 | Check Error Counter | yes | UEFI App | +| 1202 | RAS | L7 | RAS_02 | Check CFI, DUI, UI Controls | yes | UEFI App | +| 1203 | RAS | L7 | RAS_03 | Check FHI in Error Record Group | yes | UEFI App | +| 1204 | RAS | L7 | RAS_04 | Check ERI in Error Record Group | yes | UEFI App | +| 1205 | RAS | L7 | RAS_06 | Check ERI/FHI Connected to GIC | yes | UEFI App | +| 1206 | RAS | L7 | RAS_07 | RAS ERRADDR.AI bit status check | yes | UEFI App | +| 1207 | RAS | L7 | RAS_08 | Check Error Group Status | yes | UEFI App | +| 1208 | RAS | L7 | RAS_11, RAS_12 | Software Fault Error Check | yes | UEFI App | +| 1209 | RAS | L7 | S_L7RAS_1 | Data abort on Containable err | yes | UEFI App | +| 1210 | RAS | L7 | SYS_RAS_1 | Check for patrol scrubbing support | yes | UEFI App | +| 1211 | RAS | L7 | SYS_RAS_2,SYS_RAS_3 | Check Poison Storage & Forwarding | yes | UEFI App | +| 1212 | RAS | L7 | SYS_RAS_2 | Check Pseudo Fault Injection | yes | UEFI App | +| 901 | Entropy | L7 | S_L7ENT_1 | To support key and nonce generation, a system must have a hardware entropy source. This source must be a true random number generator that is visible to PE software and meets the requirements that are specified in the NIST SP 800-90 series of specifications | yes | UEFI App | +| | PE | L6 | B_PE_16 | Check for MTE support | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_01 | PMU PE IPC events | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_02 | PMU PE cache effectiveness events | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_03 | PMU PE TLB effectiveness events | yes | Linux App | +| | PMU | L7 | PMU_EV_04 | PMU PE demand accesses events | no | | +| PMU app | PMU | L7 | PMU_EV_05 | PMU PE cycle counting events | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_06 | PMU PE top-down accounting events | yes | Linux App | +| | PMU | L7 | PMU_EV_07 | PMU PE workload events | no | | +| PMU app | PMU | L7 | PMU_EV_08 | PMU PE branch predictor effectiveness events | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_09 | PMU PE BR_RETRIED event | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_09 | PMU PE BR_RETRIED event | yes | Linux App | +| PMU app | PMU | L7 | PMU_EV_09 | PMU PE Latency event | yes | Linux App | +| BSA acs | GIC | L3 | S_L3PP_01 | The Interrupt IDs must be the same as the recommended values mentioned in Arm BSA | yes | | +| | SMMU | L3 | S_L3SM_01 | If PEs that are used by the base system support TLB range instructions, then all OS visible requesters that contain a TLB must support range invalidates | no | | +| | SMMU | L4 | S_L4SM_03 | The integration of the System MMUs is compliant with the rules in SMMUv3 integration appendix in Arm BSA | no | | +| | PCIe | L4 | S_L4PCI_1 | All peripherals that are intended for assignment to a virtual machine or a user space device driver must be based on PCI Express | no | Manual | +| | PE | L5 | S_L5PE_03 | PEs that are based on Armv8.4 must implement the requirements of the CS-BSA combination C | no | | +| | GIC | L5 | S_L5GI_01 | Only a GIC v3, or higher, interrupt controller will be visible to operating system software. Other forms of interrupt controller, for example interrupt combining or forwarding engines, are not permissible, if they require a platform specific kernel driver | no | | +| | TIMER | L5 | S_L5TI_01 | A system that is compatible with level 5 will implement a generic counter which counts in nanosecond units. This means that, to the operating system, the reported frequency will be 1GHz | | | +| | RAS | L6 | S_RAS_01 | PEs and other system components that implement the Armv8 RAS extension Use Private Peripheral Interrupts for ERI or FHI if the only interface available for a RAS node is System register based | no | | +| | PCI | L6 | B_REP_1 | BSA Section F describes the rules required for an RCiEP device | no | | +| | PCI | L6 | B_IEP_1 | BSA Section G describes the rules to implement for an i-EP device | no | | +| | PE RAS | L7 | S_L7RAS_2 | PE speculative access not result in abort | no | | +| | PE TME | L7 | S_L7TME_1 | PEs must implement the MPAM extension. See FEAT_MPAM | no | | +| | PE TME | L7 | S_L7TME_2 | PEs must implement a minimum of 16 physical partition IDs | no | | +| | PE TME | L7 | S_L7TME_3 | The implementation must provide MPAM Cache Storage Usage monitors for the last-level cache | no | | +| | PE TME | L7 | S_L7TME_4 | Last-level cache must provide a minimum of 16 Cache Storage Usage monitors | no | | +| | PE TME | L7 | S_L7TME_5 | The implementation must provide MPAM Memory Bandwidth Usage monitors (MBWUs) for the interfaces that provide general purpose memory | no | | +| | PCIe | L7 | S_PCIe_01 | The system must support the translation of PE writes with all byte enable patterns to PCIe write requests. The translation must be done in compliance with PCIe byte enable rules | no | | +| | PMU | L7 | PMU_BM_3 | base server system must implement bandwidth monitors for External accelerator interface | no | | +| | PMU | L7 | PMU_BM_4 | base server system must implement bandwidth monitors for Chip-to-chip interface | no | | +| PMU app | PMU | L7 | PMU_SYS_7 | Each significant cache in the base server system must be capable of measuring cache effectiveness | yes | | +| | PMU | L7 | PMU_SEC_1 | When deployed in production systems, performance monitors must not expose Secure data to untrusted software | no | | +| | RAS | L7 | RAS_05 | If any error record in an error record group is capable of generating a critical error interrupt, the group implements a single critical error interrupt for all the records contained in the group | no | | +| Covered by PCIe tests | RAS | L7 | RAS_10 | Where the PCIe standard [1], Arm architecture[2], or other standard defines a rule or sets a convention for a software fault at a device, that rule or convention must be followed | yes | | -| Test Number | Component | Level | Test assertion | Section | Checked by ACS Now | Test Environment | -|----------------|----------------------------------|-------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|--------------------|----------------------------| -| 1 | PE | L0 | Number must be < 8 | 4.1.1 | yes | UEFI App | -| 2 | PE | L0+ | PE(s) must implement SIMD extensions | 4.1.1 | yes | UEFI App | -| 3 | PE | L0+ | PE(s) shall implement 16 bit ASID support | 4.1.1 | yes | UEFI App | -| 4 | PE | L0+ | PE(s) shall support 4KB and 64KB at stage 1 and 2 | 4.1.1 | yes | UEFI App | -| 5 | PE | L0+ | cache architecture type VIPT or PIPT | 4.1.1 | yes | UEFI App | -| 6 | PE | L0+ | All PE(s) are coherent in the same same inner sharable domain | 4.1.1 | yes | UEFI App | -| 7 | PE | L0+ | PE(s) where export restrictions allow should implement cryptography extensions | 4.1.1 | yes | UEFI App | -| 8 | PE | L0+ | PE(s) shall implement LE support | 4.1.1 | yes | UEFI App | -| 10 | PE | L0+ | PE(s) shall implement AArch64 at all levels | 4.1.1 | yes | UEFI App | -| 11 | PE | L1- | The PMU overflow signal for each PE must be wired as a unique SPI or PPI with no intervening logic | 4.1.1 | yes | UEFI App | -| 11 | PE | L2+ | The PMU overflow signal from each PE must be wired to a unique PPI interrupt with no intervening logic. PPI must be 23 | 4.3.1 | yes | UEFI App | -| 12 | PE | L0 | Each PE will implement a minimal of four programable PMU counters | 4.1.1 | yes | UEFI App | -| 12 | PE | L1+ | Each PE must implement a minimum of six programmable PMU counters | 4.2.1 | yes | UEFI App | -| 13 | PE | L0+ | Each PE will implement a minimal of four synchronous watchpoints | 4.1.1 | yes | UEFI App | -| 14 | PE | L0 | Each PE implements a minimum of four breakpoints, two of which must be able to match virtual address, contextID or VMID | 4.1.1 | yes | UEFI App | -| 14 | PE | L1+ | Each PE must implement a minimum of six breakpoints, two of which must be able to match virtual address, contextID or VMID | 4.2.1 | yes | UEFI App | -| 15 | PE | L0+ | All PE(s) are architecturally symetric (allowed exceptions in Appendix C) | 4.1.1 | yes | UEFI App | -| 17 | PE | L3+ | Each PE implements CRC32 instructions | 4.4.1 | yes | UEFI App | -| 18 | PE | L6+ | If PEs implement the Scalable Vector Extension (SVE) and the Statistical Profiling Extension (SPE), the PEs will implement Armv8.5-SPE | 4.5.1 | yes | UEFI App | -| 19 | PE | L4+ | All PEs must implement the RAS extension introduced in ARMv8.2 | 4.3.1 | yes | UEFI App | -| 20 | PE | L4+ | All PEs must implement support for 16-bit VMD | 4.3.1 | yes | UEFI App | -| 21 | PE | L4+ | All PEs must implement virtual host extensions | 4.3.1 | yes | UEFI App | -| 22 | PE | L4+ | If PEs implement ARMv8.3 pointer signing, the PEs must provide the standard algorithm defined by the ARM architecture | 4.4.1 | yes | UEFI App | -| 23 | PE | L5+ | All PEs must implement enhanced nested virtualization | 4.4.1 | yes | UEFI App | -| 24 | PE | L5+ | All PEs must support changing of page table mapping size using level1 and level2 solution proposed in the ARMv8.4 extension. Level2 is recommended | 4.4.1 | yes | UEFI App | -| 25 | PE | L5+ | All PEs must provide support for stage-2 control of memory types and cacheability, as introduced by ARMv8.4 extensions | 4.4.1 | yes | UEFI App | -| 26 | PE | L5+ | All PEs must implement the Activity Monitors Extension | 4.4.1 | yes | UEFI App | -| 27 | PE | L5+ | Where export control allows, all PEs must implement cryptography support for SHA3 and SHA512 | 4.4.1 | yes | UEFI App | -| 28 | PE | L6+ | Hardware updates to Access flag and Dirty state in translation tables, must be supported | 4.5.1 | yes | UEFI App | -| 29 | PE | L6+ | PEs must implement restrictions on speculation introduced in the Arm v8.5 extensions | 4.5.1 | yes | UEFI App | -| 30 | PE | L6+ | PEs must implement Speculative Store Bypass Safe | 4.5.1 | yes | UEFI App | -| 31 | PE | L6+ | PEs must implement the SB speculation barrier | 4.5.1 | yes | UEFI App | -| 32 | PE | L6+ | PEs must implement the CFP RCTX, DVP RCTX, CPP RCTX instructions | 4.5.1 | yes | UEFI App | -| 33 | PE | L6+ | PEs must provide support for Branch Target Identification | 4.5.1 | yes | UEFI App | -| 34 | PE | L6+ | PEs must protect against timing faults being used to guess page table mappings | 4.5.1 | yes | UEFI App | -| 35 | PE | L6+ | PEs will provide support for enhanced virtualization traps | 4.5.1 | yes | UEFI App | -| 36 | PE | L6+ | All PEs will implement Armv8.5-PMU | 4.5.1 | yes | UEFI App | -| 101 | GICv3 | L2+ | Interrupt controller shall conform to GICv3 specification | 4.3.2 | yes | UEFI App | -| 102 | GICv3 | L2+ | If the base server system includes PCI Express then the GICv3 interrupt controller shall implement ITS and LPI | 4.3.2 | yes | UEFI App | -| 103 | GIC | L3+ | The GICv3 interrupt controller shall support two Security states | 4.4.4 | yes | UEFI App | -| 104 | GICv2/3 | L2+ | GIC maintenance interrupt shall be wired as PPI 25 | 4.3.2.4 | yes | UEFI App | -| 201 | System counter and generic timer | L0+ | Must run between 10Mhz and 400Mhz | 4.1.5 | yes | UEFI App | -| 202 | System counter and generic timer | L1- | The local PE timer when expiring must generate a PPI when EL1 physical timer expires | 4.1.5 | yes | UEFI App | -| 202 | System counter and generic timer | L2+ | The local PE timer when expiring must generate a PPI when EL1 physical timer expires, and PPI must be 30 | 4.3.2.1 | yes | UEFI App | -| 203 | System counter and generic timer | L1- | The local PE timer when expiring must generate a PPI when the virtual timer expires | 4.1.5 | yes | UEFI App | -| 203 | System counter and generic timer | L2+ | The local PE timer when expiring must generate a PPI when the virtual timer expires, and PPI must be 27 | 4.3.2.1 | yes | UEFI App | -| 204 | System counter and generic timer | L1- | The local PE timer when expiring must generate a PPI when EL2 physical timer expires | 4.1.5 | yes | UEFI App | -| 204 | System counter and generic timer | L2+ | The local PE timer when expiring must generate a PPI when EL2 physical timer expires, and PPI must be 26 | 4.3.2.1 | yes | UEFI App | -| 205 | System counter and generic timer | L1- | For systems where PE are 8.1 or greater local PE timer when expiring must generate a PPI when EL2 virtual timer expires | 4.1.5 | yes | UEFI App | -| 205 | System counter and generic timer | L2+ | For systems where PE are 8.1 or greater local PE timer when expiring must generate a PPI when EL2 virtual timer expires, and PPI must be 28 | 4.3.2.1 | yes | UEFI App | -| 206 | System counter and generic timer | L1+ | In systems that implement EL3, the memory mapped timer (the CNTBaseN frame and associated CNTCTLBase frame) must be mapped into the Non-secure address space | 4.2.3. | yes | UEFI App | -| 206 | System counter and generic timer | L3+ | If the system includes a system wakeup timer, this memory-mapped timer must be mapped on to Non-secure address space | 4.4.6 | yes | UEFI App | -| 207 | System counter and generic timer | L1+ | Unless all local PE timers are Always ON, a system timer based on architecture memory mapped generic itmer view shall generate an SPI | 4.2.3 | yes | UEFI App | -| 208 | System counter and generic timer | L0 | A system specific system timer shall generate an SPI | 4.1.7 | yes | UEFI App | -| 301 | Watchdog | L1+ | system implements a Generic Watchdog as specified in APPENDIX A: Generic Watchdog. | | yes | UEFI App | -| 301 | Watchdog | L3+ | The watchdog required by level 2 must have both its register frames mapped on to Non-secure address space; this is referred to as the Non-secure watchdog | 4.4.7 | yes | UEFI App | -| 302 | Watchdog | L1- | Watchdog Signal 0 is routed as an SPI to the GIC and usable as a EL2 interrupt | 4.2.4 | yes | UEFI App | -| 302 | Watchdog | L2+ | Watchdog Signal 0 is routed as an SPIor LPI to the GIC and usable as a EL2 interrupt | 4.3.8 | yes | UEFI App | -| 303 | Watchdog | L5+ | A system compatible with level 5 will implement a generic counter which counts in nanosecond units. ARM strongly recommends that such systems use revision 1 of the generic watchdog | 4.4.4 | yes | UEFI App | -| 401 | PCIe | L1+ | Systems must map memory space to PCI Express configuration space, using the PCI Express Enhanced Configuration Access Mechanism (ECAM). Tests should be robust to ARI being implemented | 8.1 | yes | Linux driver | -| 402 | PCIe | L1+ | The base address of each ECAM region is discoverable from system firmware data | 8.1 | yes | Linux driver | -| 403 | PCIe | L1+ | PEs are able to access the ECAM region | 8.1 | yes | UEFI App | -| 801 | PCIe | L3+ | PEs are able to access the ECAM region | 8.1 | yes | Linux driver | -| 405 | PCIe | L1+ | All systems must support mapping PCI Express memory space as either device memory or non-cacheable memory | 8.2 | yes | Linux driver | -| 802 | PCIe | L3+ | All systems must support mapping PCI Express memory space as either device memory or non-cacheable memory | 8.2 | yes | UEFI App | -| 405 | PCIe | L1+ | When PCI Express memory space is mapped as normal memory, the system must support unaligned accesses to that region. | 8.2 | yes | Linux driver | -| 802 | PCIe | L3+ | When PCI Express memory space is mapped as normal memory, the system must support unaligned accesses to that region. | 8.2 | yes | UEFI App | -| 803 | PCIe | L3+ | PCIe I/O Coherency Scenarios with System MMU are covered | 8.3 | yes | UEFI App | -| 406 | PCIe | L0+ | In a system with a SMMU for PCI express there are no transformations to addresses being sent by PCI express devices before they are presented as an input address to the SMMU. | 8.3 | yes | Linux driver | -| 406 | PCIe | L3+ | the addresses sent by PCI express devices must be presented to the memory system or SMMU unmodified | 4.4.8 | yes | Linux driver | -| 407 | PCIe | L1+ | Support for Message Signaled Interrupts (MSI/MSI-X) is required for PCI Express devices. MSI and MSI-X are edge-triggered interrupts that are delivered as a memory write transaction | 8.4 | yes | Linux driver | -| 408 | PCIe | L1+ | each unique MSI(-X) shall trigger an interrupt with a unique ID and the MSI(-X) shall target GIC registers requiring no hardware specific software to service the interrupt | 8.4 | Yes | Linux driver | -| 804 | PCIe | L3+ | each unique MSI(-X) shall trigger an interrupt with a unique ID and the MSI(-X) shall target GIC registers requiring no hardware specific software to service the interrupt | 8.4 | Yes | UEFI App | -| | PCIe | L3+ | Add GICv2/v3 support details | 8.4.1/2 | No | Linux driver | -| 409 | GICv3 | L2+ | All MSIs and MSI-x are mapped to LPI | 4.3.2 | yes | Linux driver | -| 410 | PCIe | L3+ | If the system supports PCIe PASID, then at least 16 bits of PASID must be supported | 8.11 | yes | Linux driver | -| 805 | PCIe | L3+ | If the system supports PCIe PASID, then at least 16 bits of PASID must be supported | 8.11 | yes | UEFI App | -| 411 | PCIe | L0+ | The PCI Express root complex is in the same Inner Shareable domain as the PEs | 8.7 | yes | Linux driver | -| 412 | PCIe | L1+ | Each of the 4 legacy interrupt lines must be allocated a unique SPI ID and is programmed as level sensitive | 8.5 | yes | Linux driver | -| 806 | PCIe | L3+ | Each of the 4 legacy interrupt lines must be allocated a unique SPI ID and is programmed as level sensitive | 8.5 | yes | UEFI App | -| 413 | MemoryMap | L3+ | All Non-secure on-chip masters in a base server system that are expected to be under the control of the OS or hypervisor must be capable of addressing all of the NS address space. If the master goes through a SMMU then it must be capable of addressing all of the NS address space when the SMMU is off. | 4.4.3 | yes | Linux driver | -| 413 | MemoryMap / PCIe | L3+ | Non-secure off-chip devices that cannot directly address all of the Non-secure address space must be placed behind a stage 1 System MMU compatible with the ARM SMMUv2 or SMMUv3 specification. that has an output address size large enough to address all of the Non-secure address space. | 4.4.3 | yes | Linux driver | -| 414 | Peripheral Subsystems | L3+ | Memory Attributes of DMA traffic are one of (1) Inner WB, Outer WB, Inner Shareable (2) Inner/Outer Non-Cacheable (3) Device TypeIO Coherent DMA is as per (1) Inner/Outer WB, Inner Shareable | 4.4.8 | yes | Linux driver | -| 415 | PCIe | L0+ | PCI Express transactions not marked as No_snoop accessing memory that the PE translation tables attribute as cacheable and shared are I/O Coherent with the PEs. | 8.7 | yes | Linux driver | -| 807 | PCIe | L3+ | PCI Express transactions not marked as No_snoop accessing memory that the PE translation tables attribute as cacheable and shared are I/O Coherent with the PEs. | 8.7 | yes | UEFI App | -| 416 | PCIe | L4+ | For Non-prefetchable (NP) memory, type-1 headers only support 32bit address, systems complaint with SBSA level 4 or above must support 32bit programming of NP BARs on such endpoints | D.2 | yes | Linux driver | -| 417 | PCIe | L3+ | In a system where the PCIe hierarchy allows peer to peer transactions, the root ports in an ARM based SoC must implement PCIe access control service (ACS) features | D.13 | yes | Linux driver | -| 418 | PCIe | L3+ | All PCIe switches should support the minimal features, refer D.13 section for features list | D.13 | yes | Linux driver | -| 419 | PCIe | L3+ | All multi-function devices, SR-IOV and non-SR-IOV, that are capable of peer to peer traffic between different functions should support the minimal features, refer D.13 section for features list | D.13 | no | Linux driver | -| 420, 431, 432 | PCIe | L3+ | All PCIe devices, must implement the common registers of Type 0/1 header, as per requirements in E.3 and E.4 section | E.3/4 | yes | UEFI App -| 421, 434 | PCIe | L3+ | All PCIe devices, must implement the registers of Type 0/1 header, as per requirements in E.3/E.4/D.1 section | E.3 | yes | UEFI App -| 422 | PCIe | L3+ | All PCIe devices, must implement the registers of Type 1 header, as per requirements in E.4 section | E.3 | yes | UEFI App -| 423 | PCIe | L3+ | i-EP Root Port, must implement the registers of PCIe capability(10h), as per requirements in E.15 section | E.15 | yes | UEFI App -| 424, 433, 435 | PCIe | L3+ | All PCIe devices, must implement the Device capability register of PCIe capability(10h), as per requirements in E.14/15 section | E.14/15 | yes | UEFI App -| 425 | PCIe | L3+ | All PCIe devices, must implement the Device Control register of PCIe capability(10h), as per requirements in E.14/15 section | E.14/15 | yes | UEFI App -| 426, 436, 437 | PCIe | L3+ | All PCIe devices, must implement the Device capabilities 2 register of PCIe capability(10h), as per requirements in E.14/15 section | E.14/15 | yes | UEFI App -| 427 | PCIe | L3+ | All PCIe devices, must implement the Device control 2 register of PCIe capability(10h), as per requirements in E.14/15 section | E.14/15 | yes | UEFI App -| 428 | PCIe | L3+ | All PCIe devices, must implement the power management capability register of power management capability(01h), as per requirements in E.14/15 section | E.14/15 | yes | UEFI App -| 429 | PCIe | L3+ | All PCIe devices, must implement the power management control/status register of power management capability(01h), as per requirements in E.14/15 section | E.14/15 | yes | UEFI App -| 430 | PCIe | L3+ | Memory space access should raise Unsupported Request, when device Memory Space enable bit is clear | E.3/4 | yes | UEFI App -| 808 | PCIe | L3+ | If the Bus Master Enable (BME) bit in Command register is cleared, the i-EP Endpoint must not generate any memory read or write requests. | E.15.1 | yes | UEFI App -| 438, 439 | PCIe | L3+ | iEP root port must follow Completion timeout ranges supported, Completion timeout disable supported and AtomicOp routing supported bit as per Section E.15.11 | E.15.11 | yes | UEFI App -| 440 | PCIe | L3+ | root port must not support ATS and PRS extened capability | | yes | UEFI App -| 441 | PCIe | L3+ | RCiEP and iEP end point must support MSI or MSI-X interrupts | E.7 | yes | UEFI App -| 442 | PCIe | L3+ | RCiEP, iEP root port and iEP end point must support have Power Management Capability | E.11 | yes | UEFI App -| 443 | PCIe | L3+ | Root Port must implement ARI forwarding enable as per in E.15.12 section | E.15.12 | yes | UEFI App -| 444 | PCIe | L3+ | Root Port Configuration Space must be under same ECAM as the Configuration Space of Endpoints and switches in hierachy that originates from that port | D.1 | yes | UEFI App -| 445 | PCIe | L3+ | All Root Port Configuration Space under same Host Bridge must be in same ECAM | D.1 | yes | UEFI App -| 446 | PCIe | L3+ | The Root Port must comply with the byte enable rules and must support 1 byte, 2 byte and 4 byte Configuration read and write requests | D.1 | yes | UEFI App -| 447 | PCIe | L3+ | Must recognize and consume Configuration transactions intended for the Root Port Configurationspace and read/write the appropriate Root Port Configuration register | D.1 | yes | UEFI App -| 448 | PCIe | L3+ | Must recognize transactions received on the primary side of the RP PCI-PCI bridge, targeting non-prefetchable memory spaces of devices and switches that are on the secondary side of the bridge : Where the address falls within the non-prefetchable memory window in the type 1 header registers, the transactions must be forwarded to the secondary side | D.1 | yes | UEFI App -| 449 | PCIe | L3+ | Must recognize transactions received on the primary side of the RP PCI-PCI bridge, targeting prefetchable memory spaces of devices and switches that are on the secondary side of the bridge : Where the address falls within the prefetchable memory window in the type 1 header registers, the transactions must be forwarded to the secondary side | D.1 | yes | UEFI App -| 450 | PCIe | L3+ | Each legacy interrupt SPI must be programmed as level-sensitive in the appropriate GIC_ICFGR | D.6 | yes | UEFI App -| 451 | PCIe | L3+ | For i-EP, the Root Port must provide the ability to do a hot reset of the Endpoint using the Secondary Bus Reset bit in bridge Control Register | E.10 | yes | UEFI App -| 452 | PCIe | L3+ | PCIe ATS capability must be supported if the RCiEP or i-EP has a software visible cache for address translations | E.9 | yes | UEFI App -| 453 | PCIe | L3+ | If the PCIe hierarchy allows peer-to-peer transactions, Root Port must support ACS capability. | D.11 | yes | UEFI App -| 454 | PCIe | L3+ | If the PCIe hierarchy allows peer-to-peer transactions, The root port must support ACS violation error detection, Logging and reporting must be through the usage of AER mechanism | D.11 | yes | UEFI App -| 455 | PCIe | L3+ | If the Root port supports peer-to-peer traffic with other root ports then - If the root port supports Address Translation services and peer-to-peer traffic with other root ports, then it must support ACS direct translated P2P | D.11 | yes | UEFI App -| 456 | PCIe | L3+ | If the i-EP endpoint is capable of sending transactions to a peer endpoint (RCiEP or i-EP endpoint or discrete), then the i-EP root port must have ACS capability | E.12 | yes | UEFI App -| 457 | PCIe | L3+ | ACS capability must be present in the RCiEP or i-EP endpoint functions if the RCiEP or i-EP Endpoint isa multi-function device and supports peer to peer traffic between its functions. | E.12 | yes | UEFI App -| 809 | PCIe | L3+ | Configuration transactions indented for secondary bus of root port must be of Type0 | D.1 | yes | Baremetal -| 810 | PCIe | L3+ | Configuration transactions indented for subordinate bus range of root port must be of Type1 | D.1 | yes | Baremetal -| 811 | PCIe | L3+ | Check Address Translation Service Functional Check | E.9 | yes | UEFI App -| 812 | PCIe | L3+ | Check Peer-to-Peer ACS Source Validation & Transaction Blocking Functionality | D.11 | yes | UEFI App -| 813 | PCIe | L3+ | Check Peer-to-Peer ACS Redirected Request Validation Functionality | D.11 | yes | UEFI App -| 814 | PCIe | L3+ | PCI Express transactions marked as No_snoop accessing memory must have coherency managed by software . | D.8 | yes | UEFI App | -| 815 | PCIe | L3+ | Transactions that are targeted at devices must be treated as device type access. They must be ordered, must not merge and must not allocate in caches . | D.8.1 | yes | UEFI App | -| 816 | PCIe | L3+ | Root Port must implement ARI forwarding enable. | E.15 | yes | UEFI App | -| 504 | Watchdog | L1+ | Watchdog Signal 0 should be able to wakeup at least one PE from various low power states. Based off power states supported - this should be covered for 1 of N condition with some PEs in low power and from the lowest power stated where the Watchdog is ON. | 4.2.6 | yes | UEFI App | -| 504 | System counter and generic timer | L1+ | Unless all local PE timers are Always ON, a system timer based on architecture memory mapped generic timer view shall generate an SPI that wake the platform from states with semantics B,C,D,E,F,H,I | 4.2.3 | yes | UEFI App | -| 505 | System counter and generic timer | L0 | A system specific system timer shall generate an SPI that wake the platform from states with semantics B,C,D,E,F,H,I | 4.1.7 | no | UEFI App | -| 505 | Wakeup semantics | L0+ | Whilst in state F a PE must not wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | yes | UEFI App | -| 601 | Peripheral Subsystems | L0+ | If the system has a USB2.0 host controller peripheral it must conform to EHCI v1.1 or later - Peripheral subsystems which do not conform to the above are permitted, provided that they are not required to boot and install an OS | 4.1.8 | yes | UEFI App | -| 601 | Peripheral Subsystems | L0+ | If the system has a USB3.0 host controller peripheral it must conform to XHCI v1.0 or later - Peripheral subsystems which do not conform to the above are permitted, provided that they are not required to boot and install an OS | 4.1.8 | yes | UEFI App | -| 602 | Peripheral Subsystems | L0+ | If the system has a SATA host controller peripheral it must conform to AHCI v1.3 or later - Peripheral subsystems which do not conform to the above are permitted, provided that they are not required to boot and install an OS | 4.1.8 | yes | UEFI App | -| 603 | Peripheral Subsystems | L1+ | For the purpose of system development and bring up, the base server system shall include a Generic UART. The Generic UART is specified in Appendix B. The UARTINTR interrupt output is connected to the GIC as an SPI. | 4.2.7 | yes | UEFI App | -| 603 | Peripheral Subsystems | L3+ | Check that that Generic UART is mapped to Non-Secure address space | 4.4.8 | yes | UEFI App | -| 604 | Peripheral Subsystems | L2+ | UARTINTR of the generic UART shall be connected as SPI or LPI | 4.3.9 | yes | UEFI App | -| 605 | MemoryMap | L0+ | Accesses to part of the memory map that is unpopulated should not deadlock and cause a precise data abort, SEI or SPU interrupt delivered to the GIC | 4.1.3 | yes | UEFI App | -| 605 | MemoryMap | L2+ | Where a memory access is to an unpopulated part of the addressable memory space, accesses must be terminated in a manner that is presented to the PE as either a precise Data Abort or that causes a system error interrupt or an SPI or LPI interrupt to be delivered to the GIC. | 4.3.3 | yes | UEFI App | -| 701 | IO Virtualisation | L0+ | SMMU if present must spport a 64KB granule, For L1- this would be an SMMUv1 for L2 SMMUv2, and | 4.1.4 | yes | UEFI App | -| 702 | SMMU | L3+ | All the System MMUs in the system must the compliant with the same architecture version | 4.4.5 | yes | UEFI App | -| 703 | SMMU | L3+ | If SMMUv3 is in use, The integration of the System MMUs is compliant with the specification in APPENDIX H: SMMUv3 Integration | 4.4.5Appendix H | yes | UEFI App | -| 703 | IO Virtualisation | L2+ | Stage 2 System MMU functionality must be provided by a System MMU compatible with the ARM SMMUv2 spec | 4.3.5 | yes | UEFI App | -| 703 | SMMU | L3+ | Stage 2 System MMU functionality must be provided by a System MMU compatible with the ARM SMMUv2 or SMMUv3 specification | 4.4.5 | yes | UEFI App | -| 703 | PCIe | L1+ | Hardware support for I/O Virtualization is optional, but if required shall use a System MMU compliant with the ARM System MMU specification | 8.6 | yes | UEFI App | -| 703 | IO Virtualisation | L0+ | Policing is required at stage 2 | 4.1.4 | yes | UEFI App | -| 703 | SMMU | L4+ | Stage 1 and 2 SMMU functionality must be provided by a SMMU compatible with ARM SMMUv3 or higher | 4.3.2 | yes | UEFI App | -| 703 | SMMU | L5+ | SMMU implementations must be complaint with the ARM SMMUv3.2 architecture revision or higher | 4.3.2 | yes | UEFI App | -| 704 | SMMU | L3+ | The SMMUv3 spec requires that PCIe root complex must not use the stall model due to potential deadlock. | Appendix H | yes | UEFI App | -| 705 | SMMU | L3+ | If SMMUv2 is in use, Each context bank must present a unique physical interrupt to the GIC | 4.4.5 | yes | UEFI App | -| 706 | PCIe | L1+ | Each function, or virtual function, that requires hardware I/O virtualization is associated with a SMMU context. The programming of this association is IMPLEMENTATION DEFINED and is expected to be described by system firmware data. | 8.6 | yes | UEFI App | -| 707 | SMMU | L1+ | SMMU Version Check | 8.5.2 | yes | UEFI App | -| 708 | SMMU | L6+ | SMMU must implement support for 16 bit VMID. | 8.5.2 | yes | UEFI App | -| 709 | SMMU | L6+ | SMMU must implement support for 16 bit ASID. | 8.5.2 | yes | UEFI App | -| 710 | SMMU | L6+ | SMMU must support the translation granule sizes supported by the PEs. | 8.5.2 | yes | UEFI App | -| 711 | SMMU | L6+ | if PEs implement ARMv8.2-LVA, the SMMU must support extended virtual addresses | 8.5.2 | yes | UEFI App | -| 712 | SMMU | L3+ | if PEs implement Armv8.2-LPA, it follows that the SMMU must support a 52 bit output size | 8.5.2 | yes | UEFI App | -| 713 | SMMU | L6+ | The SMMU must implement coherent access to in memory structures, queues, and page tables | 8.5.2 | yes | UEFI App | -| 714 | SMMU | L6+ | The SMMU must support hardware translation table update (HTTU) of the Access flag and the Dirty state of the page for AArch64 translation tables. | 8.5.2 | yes | UEFI App | -| 715 | SMMU | L6+ | SMMU will support little endian for translation table walks, and at a minimum must match the endianness support of the PE's. | 8.5.2 | yes | UEFI App | -| 716 | SMMU | L6+ | The DVM capabilities of all DVM receivers (SMMUs and PEs) need to be the same or a superset of the DVM capabilities of all DVM initiators (PEs). Check For TLB Range Invalidation. | 8.5.2 | yes | UEFI App | -| 501, 502 | System counter and generic timer | L0+ | Any local timers that are marked by PE as always ON must be able to wake up the system. This applies to expiry of all non-secure views of the local timer (CNTV/P/HP/HV) | 4.1.7 | yes | UEFI App | -| 501,502,503,504| Wakeup semantics | L0+ | Whilst in state B a PE must be able to wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | yes | UEFI App | -| | PCIe | L1+ | only registers defined in the PCI Express specification and the ARM GIC specification are used to deliver legacy interrupts | 8.5 | yes | ARM Enterprise ACS package | -| | PCIe | L1+ | All end points claiming PCIe support must follow PCIe rules. | 8.9 | yes | ARM Enterprise ACS package | -| | Watchdog | L1+ | Watchdog Signal 1 is available. This may be confirmed in the data base. This may not be possible to exersice as its handling is platform specific | 4.2.4 | no | Secure FW | -| | Watchdog | L3 FW | The Watchdog Signal 1 is routed as a SPI to GIC and usable as an EL3 interrupt, directly targetting a single PE | 4.5.3 | no | Secure FW | -| | System counter and generic timer | L0+ | Must implement at least 56 bits | 4.1.5 | no | Secure FW | -| | System counter and generic timer | L0+ | The counter shall be sized and programmed to ensure that rollover never occurs in pract | 4.1.5 | no | Secure FW | -| | System counter and generic timer | L1+ | In systems that implement EL3, CNTControlBase should be mapped to Secure address space only | 4.2.3 | no | Secure FW | -| | System counter and generic timer | L1+ | Generic Timer required registers are implemented as specified in section 4.2.3.1 "Summary of required registers of the CNTControlBase frame" | 4.2.3.1 | no | Secure FW | -| | System counter and generic timer | L1- | The local PE timer when expiring must generate a PPI when EL3 physical timer expires | 4.1.5 | no | Secure FW | -| | System counter and generic timer | L2+ | The local PE timer when expiring must generate a PPI when EL3 physical timer expires, and PPI must be 29 | 4.3.2.1 | no | Secure FW | -| | System counter and generic timer | L0+ | Any local timers that are marked by PE as always ON must be able to wake up the system. This applies to expiry of all secure views of the local timer (CNTPS) | 4.1.7 | no | Secure FW | -| | Watchdog | L3 FW | Secure Watchdog is implemented. Secure watchdog is not-aliased in non-secure address space. Signal 0 if secure watchdog is routed as an SPI and usable as an interrupt to EL3, directly targetting a single PE | 4.5.3 | no | Secure FW | -| | Peripheral Subsystems | L3 FW | Secure Generic UART is present. It is not aliased in Non-secure address space. The UARTINTR output of the secure generic UART is connected to the GIC as an SPI | 4.5.4 | no | Secure FW | -| | System counter and generic timer | L3 FW | A secure system wakeup timer is present and the interrupt is presented to GIC as a SPI | 4.5.2 | no | Secure FW | -| | Wakeup semantics | L0+ | Whilst in state C a PE must be able to wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | no | | -| | Wakeup semantics | L0+ | Whilst in state D a PE must be able to wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | no | | -| | Wakeup semantics | L0+ | Whilst in state E a PE must be able to wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | no | | -| | Wakeup semantics | L0+ | Whilst in state G a PE must be able to wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | no | | -| | Wakeup semantics | L0+ | Whilst in state H a PE must be able to wake upon receipt of an SGI, PPI or SPI that directly targets the PE | 4.3.4/7 | no | | -| | Power State Semantics | L2+ | System MMUs and, in the future, GICv3, make use of tables in memory in the power states where GIC is ‘On’, system memory shall be available and will respond to requests without requiring intervention from software. | 4.1.7 | no | | -| | Wakeup semantics | L1+ | Power States A-I as described in "Requirements on power state semantics" shall be covered | 4.2.5 | no | | -| | PCIe | L0+ | PCI Express transactions marked as No_snoop accessing memory that the PE translation tables attribute as cacheable and shared behave correctly when appropriate SW coherence is deployed | 8.7 | no | | -| | PCIe | L3+ | Systems compatible with level 3 or above of the SBSA must not deadlock if PCI express devices attempt peer-to-peer transactions – even if the system does not support peer-to-peer traffic | 8.10 | no | | -| | Debug | L2+ | COMMIRQ interrupt for Debug Communications Channel will be wired as PPI 22 | 4.3.2.1 | no | | -| | Debug | L2+ | Cross trigger interface interrupt shall be wired as PPI 24 | 4.3.2.3 | no | | -| | System counter and generic timer | L2+ | Where a system wake up timer is present it shall generate an SPI or LPI that wake the platform from states with semantics B,C,D,E,F,H,I | 4.3.6 | no | | -| | Watchdog | L3 FW | Routing of Signal 1 of Secure Watchdog to Platform | 4.5.3 | no | | -| | Peripheral Subsystems | L3 FW | Some memory is mapped in secure address space. The memory shall not be aliased in Non-secure address space | 4.5.1 | no | | -| | SMMU | L4+ | All addresses output from a device to an SMMU must lie in a continuous space with no holes. All address in said space will be treated equally by the SMMU. There should be no areas within the address space that receive exceptional treatment, such as bypassing the SMMU | 4.3.2 | no | | -| | PE | L5+ | PEs based on ARMv8.4 must implement the requirements of the CS-BSA combination C [6] | 4.4.1 | no | | -| | PE | L5+ | All PEs must implement the Memory Partitioning and Monitoring Extension with a minimal configuration | 4.4.1 | no | | -| | PE | L2+ | PMBIRQ will be wired as PPI 21 | 4.3.2.2 | no | | -| | PE | L3+ | Where PEs implement the scalar vector extension, the vector length maximum must be at least 256 bits | 4.1.1 | no | | -| | System counter | L5+ | A system compatible with level 5 will implement counter scaling as described in the ARMv8.4 architecture | 4.4.4 | no | | -| | PE | L4+ | if the system contains persistent memory that is exposed to the OS, all PEs must support the clean to point of persistence instruction (DC CVAP). The instruction must be able to perform a clean to the point of persistence for all memory that is exposed as persistent memory to the OS | 4.3.1 | no | | -| | PCIe | L5+ | Any system that implements PCIe Precision Time Measurement (PTM) [8] must use the ARM architecture defined System Counter [2] as PTM master time source at the PTM root(s) | D.15 | no | | -| | IO Virtualisation | L3+ | ARMv8.4 introduces TLB Invalidation instructions which apply to a range of input addresses rather than just to a single address. If PEs used by the server base system support TLB range instructions, then all OS visible masters that contain a TLB must support range invalidates | 4.1.6 | no | | -| | System counter and generic timer | L3+ | Previous versions of the SBSA imposed an upper limit of 400Mhz. This is instead replaced by an upper limit on the roll over period | 4.1.7 | no | | -| | IO Virtualisation | L5+ | MPAM architecture requires that all masters that can access an MPAM controlled resource, must support passing MPAM ID information. Therefore, an SMMUv3.2 implementation must support the MPAM extension if the requests it serves access MPAM controlled resources | 4.4.3 | no | | -| | PCIe | L3+ | If the Root port supports peer to peer traffic with other root ports, then it must support minimal features. Refer D.13 section for features list | D.13 | no | | ## License Arm SBSA ACS is distributed under Apache v2.0 License. -------------- -*Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.* +*Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved.* diff --git a/test_pool/exerciser/operating_system/test_e017.c b/test_pool/exerciser/operating_system/test_e017.c index 02fe26c0..6de02d0c 100644 --- a/test_pool/exerciser/operating_system/test_e017.c +++ b/test_pool/exerciser/operating_system/test_e017.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/exerciser/operating_system/test_e018.c b/test_pool/exerciser/operating_system/test_e018.c index f8514267..94527283 100644 --- a/test_pool/exerciser/operating_system/test_e018.c +++ b/test_pool/exerciser/operating_system/test_e018.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/exerciser/operating_system/test_e019.c b/test_pool/exerciser/operating_system/test_e019.c index 1d9ea2df..38735282 100644 --- a/test_pool/exerciser/operating_system/test_e019.c +++ b/test_pool/exerciser/operating_system/test_e019.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/exerciser/operating_system/test_e020.c b/test_pool/exerciser/operating_system/test_e020.c index 6baf5e3e..127a4938 100644 --- a/test_pool/exerciser/operating_system/test_e020.c +++ b/test_pool/exerciser/operating_system/test_e020.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); From b9d08f67c0628f5aa9b17143b2a0163a7a310c00 Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Mon, 16 Jan 2023 14:58:34 +0530 Subject: [PATCH 7/8] SBSA Updated Copyright Year Signed-off-by: Rajat Goyal --- linux_app/pmu_app/build_pmu.sh | 2 +- linux_app/pmu_app/pmuval/sbsa_acs_pmu.py | 2 +- linux_app/pmu_app/pyperf/pyperf/README.md | 2 +- linux_app/pmu_app/pyperf/pyperf/datamap.py | 2 +- linux_app/pmu_app/pyperf/pyperf/elf.py | 2 +- linux_app/pmu_app/pyperf/pyperf/hexdump.py | 2 +- linux_app/pmu_app/pyperf/pyperf/imagemap.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_abi.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_attr.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_aux_arm_spe.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_buildid.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_data.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_enum.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_espec.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_parse.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_util.py | 2 +- linux_app/pmu_app/pyperf/pyperf/perf_zstd.py | 2 +- linux_app/pmu_app/pyperf/setup.py | 2 +- linux_app/pmu_app/pyperf/src/NOTES.txt | 2 +- linux_app/pmu_app/pyperf/src/pyperf_events.c | 2 +- linux_app/pmu_app/pysweep/setup.py | 2 +- linux_app/pmu_app/pysweep/src/arch.h | 2 +- linux_app/pmu_app/pysweep/src/branch_prediction.c | 2 +- linux_app/pmu_app/pysweep/src/branch_prediction.h | 2 +- linux_app/pmu_app/pysweep/src/denormals.c | 2 +- linux_app/pmu_app/pysweep/src/denormals.h | 2 +- linux_app/pmu_app/pysweep/src/genelf.c | 2 +- linux_app/pmu_app/pysweep/src/genelf.h | 2 +- linux_app/pmu_app/pysweep/src/loadcode.c | 2 +- linux_app/pmu_app/pysweep/src/loaddata.c | 2 +- linux_app/pmu_app/pysweep/src/loadgen.c | 2 +- linux_app/pmu_app/pysweep/src/loadgen.h | 2 +- linux_app/pmu_app/pysweep/src/loadgenp.h | 2 +- linux_app/pmu_app/pysweep/src/loadinst.c | 2 +- linux_app/pmu_app/pysweep/src/loadinst.h | 2 +- linux_app/pmu_app/pysweep/src/prepcode.c | 2 +- linux_app/pmu_app/pysweep/src/prepcode.h | 2 +- linux_app/pmu_app/pysweep/src/pysweep.c | 2 +- linux_app/pmu_app/pysweep/src/sleep.c | 2 +- linux_app/pmu_app/pysweep/src/sleep.h | 2 +- linux_app/pmu_app/pysweep/tests/code_template.c | 2 +- linux_app/sbsa-acs-app/sbsa_app_smmu.c | 2 +- platform/pal_uefi/include/pal_mpam.h | 2 +- platform/pal_uefi/include/pal_pmu.h | 2 +- platform/pal_uefi/include/pal_ras.h | 2 +- platform/pal_uefi/src/pal_hmat.c | 2 +- platform/pal_uefi/src/pal_mpam.c | 2 +- platform/pal_uefi/src/pal_pmu.c | 2 +- platform/pal_uefi/src/pal_ras.c | 2 +- test_pool/gic/operating_system/test_g001.c | 2 +- test_pool/gic/operating_system/test_g002.c | 2 +- test_pool/memory_map/operating_system/test_m001.c | 2 +- test_pool/mpam/operating_system/test_mpam001.c | 2 +- test_pool/mpam/operating_system/test_mpam002.c | 2 +- test_pool/mpam/operating_system/test_mpam003.c | 2 +- test_pool/mpam/operating_system/test_mpam004.c | 2 +- test_pool/mpam/operating_system/test_mpam005.c | 2 +- test_pool/mpam/operating_system/test_mpam006.c | 2 +- test_pool/pcie/operating_system/test_p009.c | 2 +- test_pool/pcie/operating_system/test_p061.c | 2 +- test_pool/pcie/operating_system/test_p062.c | 2 +- test_pool/pe/operating_system/test_c004.c | 2 +- test_pool/pe/operating_system/test_c006.c | 2 +- test_pool/pe/operating_system/test_c015.c | 2 +- test_pool/pe/operating_system/test_c016.c | 2 +- test_pool/pe/operating_system/test_c028.c | 2 +- test_pool/pe/operating_system/test_c029.c | 2 +- test_pool/pe/operating_system/test_c030.c | 2 +- test_pool/pe/operating_system/test_c031.c | 2 +- test_pool/pe/operating_system/test_c032.c | 2 +- test_pool/pe/operating_system/test_c033.c | 2 +- test_pool/pe/operating_system/test_c034.c | 2 +- test_pool/pe/operating_system/test_c035.c | 2 +- test_pool/pe/operating_system/test_c036.c | 2 +- test_pool/pe/operating_system/test_c037.c | 2 +- test_pool/pmu/operating_system/test_pmu003.c | 2 +- test_pool/pmu/operating_system/test_pmu004.c | 2 +- test_pool/pmu/operating_system/test_pmu005.c | 2 +- test_pool/pmu/operating_system/test_pmu006.c | 2 +- test_pool/pmu/operating_system/test_pmu007.c | 2 +- test_pool/pmu/operating_system/test_pmu008.c | 2 +- test_pool/ras/operating_system/test_ras001.c | 2 +- test_pool/ras/operating_system/test_ras002.c | 2 +- test_pool/ras/operating_system/test_ras003.c | 2 +- test_pool/ras/operating_system/test_ras004.c | 2 +- test_pool/ras/operating_system/test_ras005.c | 2 +- test_pool/ras/operating_system/test_ras006.c | 2 +- test_pool/ras/operating_system/test_ras007.c | 2 +- test_pool/ras/operating_system/test_ras008.c | 2 +- test_pool/ras/operating_system/test_ras009.c | 2 +- test_pool/ras/operating_system/test_ras010.c | 2 +- test_pool/ras/operating_system/test_ras011.c | 2 +- test_pool/ras/operating_system/test_ras012.c | 2 +- test_pool/smmu/operating_system/test_i003.c | 2 +- test_pool/smmu/operating_system/test_i004.c | 2 +- test_pool/smmu/operating_system/test_i007.c | 2 +- test_pool/smmu/operating_system/test_i013.c | 2 +- test_pool/smmu/operating_system/test_i014.c | 2 +- test_pool/smmu/operating_system/test_i016.c | 2 +- test_pool/test_pool.mk | 2 +- val/include/sbsa_avs_mmu.h | 2 +- val/include/sbsa_avs_mpam.h | 2 +- val/include/sbsa_avs_mpam_reg.h | 2 +- val/include/sbsa_avs_pmu_reg.h | 2 +- val/include/sbsa_avs_ras.h | 2 +- val/src/AArch64/MpamSupport.s | 2 +- val/src/AArch64/RasSupport.S | 2 +- val/src/avs_mmu.c | 2 +- val/src/avs_mpam.c | 2 +- val/src/avs_ras.c | 2 +- 112 files changed, 112 insertions(+), 112 deletions(-) diff --git a/linux_app/pmu_app/build_pmu.sh b/linux_app/pmu_app/build_pmu.sh index f5860297..9c16cdbc 100755 --- a/linux_app/pmu_app/build_pmu.sh +++ b/linux_app/pmu_app/build_pmu.sh @@ -1,7 +1,7 @@ # #!/usr/bin/env bash # @file - # Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + # Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py b/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py index aef8668e..c474ccca 100644 --- a/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py +++ b/linux_app/pmu_app/pmuval/sbsa_acs_pmu.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/README.md b/linux_app/pmu_app/pyperf/pyperf/README.md index 0cb1a11a..e97e86d7 100644 --- a/linux_app/pmu_app/pyperf/pyperf/README.md +++ b/linux_app/pmu_app/pyperf/pyperf/README.md @@ -26,4 +26,4 @@ These modules replicate some of the functionality of the userspace perf tools: -------------- -*Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.* +*Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.* diff --git a/linux_app/pmu_app/pyperf/pyperf/datamap.py b/linux_app/pmu_app/pyperf/pyperf/datamap.py index 21d1b231..8947c5ed 100644 --- a/linux_app/pmu_app/pyperf/pyperf/datamap.py +++ b/linux_app/pmu_app/pyperf/pyperf/datamap.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/elf.py b/linux_app/pmu_app/pyperf/pyperf/elf.py index a86223cd..842f26c8 100644 --- a/linux_app/pmu_app/pyperf/pyperf/elf.py +++ b/linux_app/pmu_app/pyperf/pyperf/elf.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/hexdump.py b/linux_app/pmu_app/pyperf/pyperf/hexdump.py index cc0cee22..a689ff4d 100644 --- a/linux_app/pmu_app/pyperf/pyperf/hexdump.py +++ b/linux_app/pmu_app/pyperf/pyperf/hexdump.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/imagemap.py b/linux_app/pmu_app/pyperf/pyperf/imagemap.py index 8e5181f2..f0a90b3a 100644 --- a/linux_app/pmu_app/pyperf/pyperf/imagemap.py +++ b/linux_app/pmu_app/pyperf/pyperf/imagemap.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_abi.py b/linux_app/pmu_app/pyperf/pyperf/perf_abi.py index c782ab33..ae0b280e 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_abi.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_abi.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_attr.py b/linux_app/pmu_app/pyperf/pyperf/perf_attr.py index a3d1b483..0b1c7e15 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_attr.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_attr.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_aux_arm_spe.py b/linux_app/pmu_app/pyperf/pyperf/perf_aux_arm_spe.py index 89bef3c5..f1836389 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_aux_arm_spe.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_aux_arm_spe.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py b/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py index febdabd2..6116bf07 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_aux_cs_etm.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py b/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py index 66726b2a..62a2afe7 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_buildid.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_data.py b/linux_app/pmu_app/pyperf/pyperf/perf_data.py index 2162fd3d..076b1789 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_data.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_data.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_enum.py b/linux_app/pmu_app/pyperf/pyperf/perf_enum.py index 70589344..bdb55be4 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_enum.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_enum.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_espec.py b/linux_app/pmu_app/pyperf/pyperf/perf_espec.py index 1491c9b5..a2e145b6 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_espec.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_espec.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_parse.py b/linux_app/pmu_app/pyperf/pyperf/perf_parse.py index 8e6ce771..5d5df9e4 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_parse.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_parse.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py b/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py index 4843a9ae..b13847be 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_sysfs.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_util.py b/linux_app/pmu_app/pyperf/pyperf/perf_util.py index d7908c11..16c9e8d2 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_util.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_util.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py b/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py index 579f66e1..58fb396e 100644 --- a/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py +++ b/linux_app/pmu_app/pyperf/pyperf/perf_zstd.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/setup.py b/linux_app/pmu_app/pyperf/setup.py index ff6ef31a..c94b2dbb 100644 --- a/linux_app/pmu_app/pyperf/setup.py +++ b/linux_app/pmu_app/pyperf/setup.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pyperf/src/NOTES.txt b/linux_app/pmu_app/pyperf/src/NOTES.txt index e751b8c3..2f83dd20 100644 --- a/linux_app/pmu_app/pyperf/src/NOTES.txt +++ b/linux_app/pmu_app/pyperf/src/NOTES.txt @@ -36,5 +36,5 @@ Internally: -------------- -*Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.* +*Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.* diff --git a/linux_app/pmu_app/pyperf/src/pyperf_events.c b/linux_app/pmu_app/pyperf/src/pyperf_events.c index 3fca4569..dda188b5 100644 --- a/linux_app/pmu_app/pyperf/src/pyperf_events.c +++ b/linux_app/pmu_app/pyperf/src/pyperf_events.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/setup.py b/linux_app/pmu_app/pysweep/setup.py index 4c09bf6b..75e61525 100644 --- a/linux_app/pmu_app/pysweep/setup.py +++ b/linux_app/pmu_app/pysweep/setup.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/arch.h b/linux_app/pmu_app/pysweep/src/arch.h index 225fc98b..cd44281c 100644 --- a/linux_app/pmu_app/pysweep/src/arch.h +++ b/linux_app/pmu_app/pysweep/src/arch.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/branch_prediction.c b/linux_app/pmu_app/pysweep/src/branch_prediction.c index 9c6695b0..c04f1c40 100644 --- a/linux_app/pmu_app/pysweep/src/branch_prediction.c +++ b/linux_app/pmu_app/pysweep/src/branch_prediction.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/branch_prediction.h b/linux_app/pmu_app/pysweep/src/branch_prediction.h index ff4132ed..1196e13d 100644 --- a/linux_app/pmu_app/pysweep/src/branch_prediction.h +++ b/linux_app/pmu_app/pysweep/src/branch_prediction.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/denormals.c b/linux_app/pmu_app/pysweep/src/denormals.c index fba07c9b..f41337f2 100644 --- a/linux_app/pmu_app/pysweep/src/denormals.c +++ b/linux_app/pmu_app/pysweep/src/denormals.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/denormals.h b/linux_app/pmu_app/pysweep/src/denormals.h index bf63cfdb..4f1eb485 100644 --- a/linux_app/pmu_app/pysweep/src/denormals.h +++ b/linux_app/pmu_app/pysweep/src/denormals.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/genelf.c b/linux_app/pmu_app/pysweep/src/genelf.c index b5b2ae85..fb1ec047 100644 --- a/linux_app/pmu_app/pysweep/src/genelf.c +++ b/linux_app/pmu_app/pysweep/src/genelf.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/genelf.h b/linux_app/pmu_app/pysweep/src/genelf.h index 9c4ad4ab..0f7edee8 100644 --- a/linux_app/pmu_app/pysweep/src/genelf.h +++ b/linux_app/pmu_app/pysweep/src/genelf.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loadcode.c b/linux_app/pmu_app/pysweep/src/loadcode.c index b2844374..32638cbf 100644 --- a/linux_app/pmu_app/pysweep/src/loadcode.c +++ b/linux_app/pmu_app/pysweep/src/loadcode.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loaddata.c b/linux_app/pmu_app/pysweep/src/loaddata.c index ba204274..aefb22ce 100644 --- a/linux_app/pmu_app/pysweep/src/loaddata.c +++ b/linux_app/pmu_app/pysweep/src/loaddata.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loadgen.c b/linux_app/pmu_app/pysweep/src/loadgen.c index 5b7ef31f..9f8e4c82 100644 --- a/linux_app/pmu_app/pysweep/src/loadgen.c +++ b/linux_app/pmu_app/pysweep/src/loadgen.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loadgen.h b/linux_app/pmu_app/pysweep/src/loadgen.h index 1a357607..31ccb08b 100644 --- a/linux_app/pmu_app/pysweep/src/loadgen.h +++ b/linux_app/pmu_app/pysweep/src/loadgen.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loadgenp.h b/linux_app/pmu_app/pysweep/src/loadgenp.h index 2bedc45b..d13efb9c 100644 --- a/linux_app/pmu_app/pysweep/src/loadgenp.h +++ b/linux_app/pmu_app/pysweep/src/loadgenp.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loadinst.c b/linux_app/pmu_app/pysweep/src/loadinst.c index 58e2c2f7..0039a3d2 100644 --- a/linux_app/pmu_app/pysweep/src/loadinst.c +++ b/linux_app/pmu_app/pysweep/src/loadinst.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/loadinst.h b/linux_app/pmu_app/pysweep/src/loadinst.h index e367731d..2256c7fb 100644 --- a/linux_app/pmu_app/pysweep/src/loadinst.h +++ b/linux_app/pmu_app/pysweep/src/loadinst.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/prepcode.c b/linux_app/pmu_app/pysweep/src/prepcode.c index 880d0744..5c1c01e6 100644 --- a/linux_app/pmu_app/pysweep/src/prepcode.c +++ b/linux_app/pmu_app/pysweep/src/prepcode.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/prepcode.h b/linux_app/pmu_app/pysweep/src/prepcode.h index 83aecd5f..2291d06f 100644 --- a/linux_app/pmu_app/pysweep/src/prepcode.h +++ b/linux_app/pmu_app/pysweep/src/prepcode.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/pysweep.c b/linux_app/pmu_app/pysweep/src/pysweep.c index cc857ff7..cfc32254 100644 --- a/linux_app/pmu_app/pysweep/src/pysweep.c +++ b/linux_app/pmu_app/pysweep/src/pysweep.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/sleep.c b/linux_app/pmu_app/pysweep/src/sleep.c index 53e09b71..3f356a95 100644 --- a/linux_app/pmu_app/pysweep/src/sleep.c +++ b/linux_app/pmu_app/pysweep/src/sleep.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/src/sleep.h b/linux_app/pmu_app/pysweep/src/sleep.h index 9ab03b7a..9c0bd892 100644 --- a/linux_app/pmu_app/pysweep/src/sleep.h +++ b/linux_app/pmu_app/pysweep/src/sleep.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/pmu_app/pysweep/tests/code_template.c b/linux_app/pmu_app/pysweep/tests/code_template.c index 2a8200ac..22e24bab 100644 --- a/linux_app/pmu_app/pysweep/tests/code_template.c +++ b/linux_app/pmu_app/pysweep/tests/code_template.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/linux_app/sbsa-acs-app/sbsa_app_smmu.c b/linux_app/sbsa-acs-app/sbsa_app_smmu.c index 4c97382b..f73ff85b 100644 --- a/linux_app/sbsa-acs-app/sbsa_app_smmu.c +++ b/linux_app/sbsa-acs-app/sbsa_app_smmu.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/include/pal_mpam.h b/platform/pal_uefi/include/pal_mpam.h index a63b23d0..ff0baf8c 100644 --- a/platform/pal_uefi/include/pal_mpam.h +++ b/platform/pal_uefi/include/pal_mpam.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/include/pal_pmu.h b/platform/pal_uefi/include/pal_pmu.h index 35ff2b59..57eadd6e 100644 --- a/platform/pal_uefi/include/pal_pmu.h +++ b/platform/pal_uefi/include/pal_pmu.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022-2023, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/include/pal_ras.h b/platform/pal_uefi/include/pal_ras.h index 9205743a..e38a4710 100644 --- a/platform/pal_uefi/include/pal_ras.h +++ b/platform/pal_uefi/include/pal_ras.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/src/pal_hmat.c b/platform/pal_uefi/src/pal_hmat.c index 96a3aff6..3052d1c3 100644 --- a/platform/pal_uefi/src/pal_hmat.c +++ b/platform/pal_uefi/src/pal_hmat.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/src/pal_mpam.c b/platform/pal_uefi/src/pal_mpam.c index edc11419..e7d39f04 100644 --- a/platform/pal_uefi/src/pal_mpam.c +++ b/platform/pal_uefi/src/pal_mpam.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/src/pal_pmu.c b/platform/pal_uefi/src/pal_pmu.c index a6e57406..5232cd35 100644 --- a/platform/pal_uefi/src/pal_pmu.c +++ b/platform/pal_uefi/src/pal_pmu.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022-2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/platform/pal_uefi/src/pal_ras.c b/platform/pal_uefi/src/pal_ras.c index 10717f19..0a0128bb 100644 --- a/platform/pal_uefi/src/pal_ras.c +++ b/platform/pal_uefi/src/pal_ras.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/gic/operating_system/test_g001.c b/test_pool/gic/operating_system/test_g001.c index f346f19a..e441fef1 100644 --- a/test_pool/gic/operating_system/test_g001.c +++ b/test_pool/gic/operating_system/test_g001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/gic/operating_system/test_g002.c b/test_pool/gic/operating_system/test_g002.c index a749ffc0..10ea0872 100644 --- a/test_pool/gic/operating_system/test_g002.c +++ b/test_pool/gic/operating_system/test_g002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/memory_map/operating_system/test_m001.c b/test_pool/memory_map/operating_system/test_m001.c index 670fa181..3fb6e5e2 100644 --- a/test_pool/memory_map/operating_system/test_m001.c +++ b/test_pool/memory_map/operating_system/test_m001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/mpam/operating_system/test_mpam001.c b/test_pool/mpam/operating_system/test_mpam001.c index c9e76846..af50068c 100644 --- a/test_pool/mpam/operating_system/test_mpam001.c +++ b/test_pool/mpam/operating_system/test_mpam001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/mpam/operating_system/test_mpam002.c b/test_pool/mpam/operating_system/test_mpam002.c index ad3ffc50..159959e7 100644 --- a/test_pool/mpam/operating_system/test_mpam002.c +++ b/test_pool/mpam/operating_system/test_mpam002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/mpam/operating_system/test_mpam003.c b/test_pool/mpam/operating_system/test_mpam003.c index 94a8cc7e..b53085e7 100644 --- a/test_pool/mpam/operating_system/test_mpam003.c +++ b/test_pool/mpam/operating_system/test_mpam003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/mpam/operating_system/test_mpam004.c b/test_pool/mpam/operating_system/test_mpam004.c index 7db82c2b..45f9b1ba 100644 --- a/test_pool/mpam/operating_system/test_mpam004.c +++ b/test_pool/mpam/operating_system/test_mpam004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/mpam/operating_system/test_mpam005.c b/test_pool/mpam/operating_system/test_mpam005.c index 33b32070..b9231ee5 100644 --- a/test_pool/mpam/operating_system/test_mpam005.c +++ b/test_pool/mpam/operating_system/test_mpam005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/mpam/operating_system/test_mpam006.c b/test_pool/mpam/operating_system/test_mpam006.c index 484712a8..4e972c7a 100644 --- a/test_pool/mpam/operating_system/test_mpam006.c +++ b/test_pool/mpam/operating_system/test_mpam006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pcie/operating_system/test_p009.c b/test_pool/pcie/operating_system/test_p009.c index 96ca8bbd..d8082820 100644 --- a/test_pool/pcie/operating_system/test_p009.c +++ b/test_pool/pcie/operating_system/test_p009.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pcie/operating_system/test_p061.c b/test_pool/pcie/operating_system/test_p061.c index 0baee70c..42151df9 100644 --- a/test_pool/pcie/operating_system/test_p061.c +++ b/test_pool/pcie/operating_system/test_p061.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pcie/operating_system/test_p062.c b/test_pool/pcie/operating_system/test_p062.c index 645bf0c7..753b1ff6 100644 --- a/test_pool/pcie/operating_system/test_p062.c +++ b/test_pool/pcie/operating_system/test_p062.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c004.c b/test_pool/pe/operating_system/test_c004.c index c1d44cb0..280ddd8b 100644 --- a/test_pool/pe/operating_system/test_c004.c +++ b/test_pool/pe/operating_system/test_c004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c006.c b/test_pool/pe/operating_system/test_c006.c index 25e9bc8a..67d11da6 100644 --- a/test_pool/pe/operating_system/test_c006.c +++ b/test_pool/pe/operating_system/test_c006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c015.c b/test_pool/pe/operating_system/test_c015.c index 56c82fb6..e88fbaa6 100644 --- a/test_pool/pe/operating_system/test_c015.c +++ b/test_pool/pe/operating_system/test_c015.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c016.c b/test_pool/pe/operating_system/test_c016.c index f5bc52e3..9c0869a2 100644 --- a/test_pool/pe/operating_system/test_c016.c +++ b/test_pool/pe/operating_system/test_c016.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c028.c b/test_pool/pe/operating_system/test_c028.c index fae8bdd7..7b794d90 100644 --- a/test_pool/pe/operating_system/test_c028.c +++ b/test_pool/pe/operating_system/test_c028.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c029.c b/test_pool/pe/operating_system/test_c029.c index 13fa0c5e..4b8723f3 100644 --- a/test_pool/pe/operating_system/test_c029.c +++ b/test_pool/pe/operating_system/test_c029.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c030.c b/test_pool/pe/operating_system/test_c030.c index 5c2939b7..76a8b30d 100644 --- a/test_pool/pe/operating_system/test_c030.c +++ b/test_pool/pe/operating_system/test_c030.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c031.c b/test_pool/pe/operating_system/test_c031.c index e215ee28..74211370 100644 --- a/test_pool/pe/operating_system/test_c031.c +++ b/test_pool/pe/operating_system/test_c031.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c032.c b/test_pool/pe/operating_system/test_c032.c index d68047de..73acf74e 100644 --- a/test_pool/pe/operating_system/test_c032.c +++ b/test_pool/pe/operating_system/test_c032.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c033.c b/test_pool/pe/operating_system/test_c033.c index 1289c151..2f0974e0 100644 --- a/test_pool/pe/operating_system/test_c033.c +++ b/test_pool/pe/operating_system/test_c033.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c034.c b/test_pool/pe/operating_system/test_c034.c index dfca79ae..7124fa76 100644 --- a/test_pool/pe/operating_system/test_c034.c +++ b/test_pool/pe/operating_system/test_c034.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c035.c b/test_pool/pe/operating_system/test_c035.c index 0febe50d..39961e67 100644 --- a/test_pool/pe/operating_system/test_c035.c +++ b/test_pool/pe/operating_system/test_c035.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c036.c b/test_pool/pe/operating_system/test_c036.c index cc6a09f1..48fff31c 100644 --- a/test_pool/pe/operating_system/test_c036.c +++ b/test_pool/pe/operating_system/test_c036.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c037.c b/test_pool/pe/operating_system/test_c037.c index a8014bd1..4f7a02e2 100644 --- a/test_pool/pe/operating_system/test_c037.c +++ b/test_pool/pe/operating_system/test_c037.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu003.c b/test_pool/pmu/operating_system/test_pmu003.c index 061b6956..52f12e07 100644 --- a/test_pool/pmu/operating_system/test_pmu003.c +++ b/test_pool/pmu/operating_system/test_pmu003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu004.c b/test_pool/pmu/operating_system/test_pmu004.c index 43d6e89b..967364af 100644 --- a/test_pool/pmu/operating_system/test_pmu004.c +++ b/test_pool/pmu/operating_system/test_pmu004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu005.c b/test_pool/pmu/operating_system/test_pmu005.c index 674b0830..3e01ca42 100644 --- a/test_pool/pmu/operating_system/test_pmu005.c +++ b/test_pool/pmu/operating_system/test_pmu005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu006.c b/test_pool/pmu/operating_system/test_pmu006.c index 6fbe725a..e072464a 100644 --- a/test_pool/pmu/operating_system/test_pmu006.c +++ b/test_pool/pmu/operating_system/test_pmu006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu007.c b/test_pool/pmu/operating_system/test_pmu007.c index 037a30ae..6d1c288f 100644 --- a/test_pool/pmu/operating_system/test_pmu007.c +++ b/test_pool/pmu/operating_system/test_pmu007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu008.c b/test_pool/pmu/operating_system/test_pmu008.c index f657a99b..87679a90 100644 --- a/test_pool/pmu/operating_system/test_pmu008.c +++ b/test_pool/pmu/operating_system/test_pmu008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022-2023, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras001.c b/test_pool/ras/operating_system/test_ras001.c index 4a08197c..05d2713c 100644 --- a/test_pool/ras/operating_system/test_ras001.c +++ b/test_pool/ras/operating_system/test_ras001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras002.c b/test_pool/ras/operating_system/test_ras002.c index 2d4da0f9..2e0d3439 100644 --- a/test_pool/ras/operating_system/test_ras002.c +++ b/test_pool/ras/operating_system/test_ras002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras003.c b/test_pool/ras/operating_system/test_ras003.c index 1b3350f1..2809e5be 100644 --- a/test_pool/ras/operating_system/test_ras003.c +++ b/test_pool/ras/operating_system/test_ras003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras004.c b/test_pool/ras/operating_system/test_ras004.c index 60e54047..dc56d916 100644 --- a/test_pool/ras/operating_system/test_ras004.c +++ b/test_pool/ras/operating_system/test_ras004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras005.c b/test_pool/ras/operating_system/test_ras005.c index 7eac4508..7b40c278 100644 --- a/test_pool/ras/operating_system/test_ras005.c +++ b/test_pool/ras/operating_system/test_ras005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras006.c b/test_pool/ras/operating_system/test_ras006.c index 6d368814..8a1bebb8 100644 --- a/test_pool/ras/operating_system/test_ras006.c +++ b/test_pool/ras/operating_system/test_ras006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras007.c b/test_pool/ras/operating_system/test_ras007.c index bf635a17..803ca4c3 100644 --- a/test_pool/ras/operating_system/test_ras007.c +++ b/test_pool/ras/operating_system/test_ras007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras008.c b/test_pool/ras/operating_system/test_ras008.c index 8e388f3b..cd8d90a6 100644 --- a/test_pool/ras/operating_system/test_ras008.c +++ b/test_pool/ras/operating_system/test_ras008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras009.c b/test_pool/ras/operating_system/test_ras009.c index 6ef435fd..d91df312 100644 --- a/test_pool/ras/operating_system/test_ras009.c +++ b/test_pool/ras/operating_system/test_ras009.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras010.c b/test_pool/ras/operating_system/test_ras010.c index 348fbfb9..a2f2378a 100644 --- a/test_pool/ras/operating_system/test_ras010.c +++ b/test_pool/ras/operating_system/test_ras010.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras011.c b/test_pool/ras/operating_system/test_ras011.c index 882649fe..56f1360b 100644 --- a/test_pool/ras/operating_system/test_ras011.c +++ b/test_pool/ras/operating_system/test_ras011.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/ras/operating_system/test_ras012.c b/test_pool/ras/operating_system/test_ras012.c index 662031ce..f3afeb44 100644 --- a/test_pool/ras/operating_system/test_ras012.c +++ b/test_pool/ras/operating_system/test_ras012.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i003.c b/test_pool/smmu/operating_system/test_i003.c index f2c24a2e..e095740c 100644 --- a/test_pool/smmu/operating_system/test_i003.c +++ b/test_pool/smmu/operating_system/test_i003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i004.c b/test_pool/smmu/operating_system/test_i004.c index ecb319a4..fb3d76f7 100644 --- a/test_pool/smmu/operating_system/test_i004.c +++ b/test_pool/smmu/operating_system/test_i004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i007.c b/test_pool/smmu/operating_system/test_i007.c index c57b8fe6..d8ea7a5f 100644 --- a/test_pool/smmu/operating_system/test_i007.c +++ b/test_pool/smmu/operating_system/test_i007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i013.c b/test_pool/smmu/operating_system/test_i013.c index 6a8ca189..47ef1118 100644 --- a/test_pool/smmu/operating_system/test_i013.c +++ b/test_pool/smmu/operating_system/test_i013.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i014.c b/test_pool/smmu/operating_system/test_i014.c index 438ae0df..69242e08 100644 --- a/test_pool/smmu/operating_system/test_i014.c +++ b/test_pool/smmu/operating_system/test_i014.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i016.c b/test_pool/smmu/operating_system/test_i016.c index 84b9ced2..ee7de255 100644 --- a/test_pool/smmu/operating_system/test_i016.c +++ b/test_pool/smmu/operating_system/test_i016.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/test_pool.mk b/test_pool/test_pool.mk index c24882db..df912782 100644 --- a/test_pool/test_pool.mk +++ b/test_pool/test_pool.mk @@ -1,5 +1,5 @@ ## @file - # Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + # Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/include/sbsa_avs_mmu.h b/val/include/sbsa_avs_mmu.h index fdb557c6..ae66d45c 100644 --- a/val/include/sbsa_avs_mmu.h +++ b/val/include/sbsa_avs_mmu.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/include/sbsa_avs_mpam.h b/val/include/sbsa_avs_mpam.h index 987f2e7a..6cc1ba4b 100644 --- a/val/include/sbsa_avs_mpam.h +++ b/val/include/sbsa_avs_mpam.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/include/sbsa_avs_mpam_reg.h b/val/include/sbsa_avs_mpam_reg.h index d91852d3..0a77ae94 100644 --- a/val/include/sbsa_avs_mpam_reg.h +++ b/val/include/sbsa_avs_mpam_reg.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/include/sbsa_avs_pmu_reg.h b/val/include/sbsa_avs_pmu_reg.h index ce44c5d8..e74a423b 100644 --- a/val/include/sbsa_avs_pmu_reg.h +++ b/val/include/sbsa_avs_pmu_reg.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/include/sbsa_avs_ras.h b/val/include/sbsa_avs_ras.h index 8fbd662c..90e4f87c 100644 --- a/val/include/sbsa_avs_ras.h +++ b/val/include/sbsa_avs_ras.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/src/AArch64/MpamSupport.s b/val/src/AArch64/MpamSupport.s index 17b93837..cef982aa 100644 --- a/val/src/AArch64/MpamSupport.s +++ b/val/src/AArch64/MpamSupport.s @@ -1,5 +1,5 @@ #/** @file -# Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/src/AArch64/RasSupport.S b/val/src/AArch64/RasSupport.S index 12501d07..d144fa15 100644 --- a/val/src/AArch64/RasSupport.S +++ b/val/src/AArch64/RasSupport.S @@ -1,5 +1,5 @@ #/** @file -# Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. +# Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. # SPDX-License-Identifier : Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/src/avs_mmu.c b/val/src/avs_mmu.c index 0d094148..7f4dc87c 100644 --- a/val/src/avs_mmu.c +++ b/val/src/avs_mmu.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/src/avs_mpam.c b/val/src/avs_mpam.c index c379697f..67fde07a 100644 --- a/val/src/avs_mpam.c +++ b/val/src/avs_mpam.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/val/src/avs_ras.c b/val/src/avs_ras.c index 8ee36603..78f9f800 100644 --- a/val/src/avs_ras.c +++ b/val/src/avs_ras.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); From 6e0bd1292a45a2cc1598ef9930f57da2a8841f49 Mon Sep 17 00:00:00 2001 From: Rajat Goyal Date: Mon, 16 Jan 2023 15:50:41 +0530 Subject: [PATCH 8/8] SBSA test_pool Copyright changes Signed-off-by: Rajat Goyal --- test_pool/pcie/test_p059.c | 2 +- test_pool/pe/operating_system/test_c001.c | 2 +- test_pool/pe/operating_system/test_c002.c | 2 +- test_pool/pe/operating_system/test_c003.c | 2 +- test_pool/pe/operating_system/test_c005.c | 2 +- test_pool/pe/operating_system/test_c007.c | 2 +- test_pool/pe/operating_system/test_c008.c | 2 +- test_pool/pe/operating_system/test_c009.c | 2 +- test_pool/pe/operating_system/test_c010.c | 2 +- test_pool/pe/operating_system/test_c011.c | 2 +- test_pool/pe/operating_system/test_c012.c | 2 +- test_pool/pe/operating_system/test_c013.c | 2 +- test_pool/pe/operating_system/test_c014.c | 2 +- test_pool/pe/operating_system/test_c017.c | 2 +- test_pool/pe/operating_system/test_c018.c | 2 +- test_pool/pe/operating_system/test_c019.c | 2 +- test_pool/pe/operating_system/test_c020.c | 2 +- test_pool/pe/operating_system/test_c021.c | 2 +- test_pool/pe/operating_system/test_c022.c | 2 +- test_pool/pe/operating_system/test_c023.c | 2 +- test_pool/pe/operating_system/test_c024.c | 2 +- test_pool/pe/operating_system/test_c025.c | 2 +- test_pool/pe/operating_system/test_c026.c | 2 +- test_pool/pe/operating_system/test_c027.c | 2 +- test_pool/pmu/operating_system/test_pmu001.c | 2 +- test_pool/pmu/operating_system/test_pmu002.c | 2 +- test_pool/pmu/operating_system/test_pmu008.c | 2 +- test_pool/smmu/operating_system/test_i001.c | 2 +- test_pool/smmu/operating_system/test_i002.c | 2 +- test_pool/smmu/operating_system/test_i003.c | 2 +- test_pool/smmu/operating_system/test_i004.c | 2 +- test_pool/smmu/operating_system/test_i005.c | 2 +- test_pool/smmu/operating_system/test_i006.c | 2 +- test_pool/smmu/operating_system/test_i008.c | 2 +- test_pool/smmu/operating_system/test_i009.c | 2 +- test_pool/smmu/operating_system/test_i010.c | 2 +- test_pool/smmu/operating_system/test_i011.c | 2 +- test_pool/smmu/operating_system/test_i012.c | 2 +- test_pool/smmu/operating_system/test_i015.c | 2 +- test_pool/watchdog/operating_system/test_w001.c | 2 +- 40 files changed, 40 insertions(+), 40 deletions(-) diff --git a/test_pool/pcie/test_p059.c b/test_pool/pcie/test_p059.c index ffbaf1ff..0957eb05 100644 --- a/test_pool/pcie/test_p059.c +++ b/test_pool/pcie/test_p059.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2021-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c001.c b/test_pool/pe/operating_system/test_c001.c index 4cd75470..905d48f1 100644 --- a/test_pool/pe/operating_system/test_c001.c +++ b/test_pool/pe/operating_system/test_c001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c002.c b/test_pool/pe/operating_system/test_c002.c index 3f29f05d..dc5b9744 100644 --- a/test_pool/pe/operating_system/test_c002.c +++ b/test_pool/pe/operating_system/test_c002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c003.c b/test_pool/pe/operating_system/test_c003.c index 4ab7c56e..68fb753e 100644 --- a/test_pool/pe/operating_system/test_c003.c +++ b/test_pool/pe/operating_system/test_c003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c005.c b/test_pool/pe/operating_system/test_c005.c index f0f227d2..a589c2f7 100644 --- a/test_pool/pe/operating_system/test_c005.c +++ b/test_pool/pe/operating_system/test_c005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c007.c b/test_pool/pe/operating_system/test_c007.c index 0876ddc2..e18e2ca4 100644 --- a/test_pool/pe/operating_system/test_c007.c +++ b/test_pool/pe/operating_system/test_c007.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c008.c b/test_pool/pe/operating_system/test_c008.c index 41b8b26b..280420fe 100644 --- a/test_pool/pe/operating_system/test_c008.c +++ b/test_pool/pe/operating_system/test_c008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c009.c b/test_pool/pe/operating_system/test_c009.c index 7b98df3d..fdf97bfc 100644 --- a/test_pool/pe/operating_system/test_c009.c +++ b/test_pool/pe/operating_system/test_c009.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c010.c b/test_pool/pe/operating_system/test_c010.c index 613047b4..c311dea6 100644 --- a/test_pool/pe/operating_system/test_c010.c +++ b/test_pool/pe/operating_system/test_c010.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c011.c b/test_pool/pe/operating_system/test_c011.c index c62175a2..08e009ef 100644 --- a/test_pool/pe/operating_system/test_c011.c +++ b/test_pool/pe/operating_system/test_c011.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c012.c b/test_pool/pe/operating_system/test_c012.c index c6dfb73b..904d3e9f 100644 --- a/test_pool/pe/operating_system/test_c012.c +++ b/test_pool/pe/operating_system/test_c012.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c013.c b/test_pool/pe/operating_system/test_c013.c index 002b71e1..c46b4e98 100644 --- a/test_pool/pe/operating_system/test_c013.c +++ b/test_pool/pe/operating_system/test_c013.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c014.c b/test_pool/pe/operating_system/test_c014.c index e8b64f8d..327ec78d 100644 --- a/test_pool/pe/operating_system/test_c014.c +++ b/test_pool/pe/operating_system/test_c014.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c017.c b/test_pool/pe/operating_system/test_c017.c index 42e1c566..7ba16b2a 100644 --- a/test_pool/pe/operating_system/test_c017.c +++ b/test_pool/pe/operating_system/test_c017.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c018.c b/test_pool/pe/operating_system/test_c018.c index c9b352c8..eb0224d6 100644 --- a/test_pool/pe/operating_system/test_c018.c +++ b/test_pool/pe/operating_system/test_c018.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c019.c b/test_pool/pe/operating_system/test_c019.c index 216176d4..48cebe54 100644 --- a/test_pool/pe/operating_system/test_c019.c +++ b/test_pool/pe/operating_system/test_c019.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c020.c b/test_pool/pe/operating_system/test_c020.c index bb73b586..617a992f 100644 --- a/test_pool/pe/operating_system/test_c020.c +++ b/test_pool/pe/operating_system/test_c020.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c021.c b/test_pool/pe/operating_system/test_c021.c index ac7c1e77..3bba49e1 100644 --- a/test_pool/pe/operating_system/test_c021.c +++ b/test_pool/pe/operating_system/test_c021.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2022, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c022.c b/test_pool/pe/operating_system/test_c022.c index 4a6c30e4..2045cf5e 100644 --- a/test_pool/pe/operating_system/test_c022.c +++ b/test_pool/pe/operating_system/test_c022.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c023.c b/test_pool/pe/operating_system/test_c023.c index 52bc5b6b..c36b34c5 100644 --- a/test_pool/pe/operating_system/test_c023.c +++ b/test_pool/pe/operating_system/test_c023.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c024.c b/test_pool/pe/operating_system/test_c024.c index ba2204da..122c511d 100644 --- a/test_pool/pe/operating_system/test_c024.c +++ b/test_pool/pe/operating_system/test_c024.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c025.c b/test_pool/pe/operating_system/test_c025.c index 1bbfdffb..111e8eab 100644 --- a/test_pool/pe/operating_system/test_c025.c +++ b/test_pool/pe/operating_system/test_c025.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020,2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c026.c b/test_pool/pe/operating_system/test_c026.c index ed167c7e..0ee9ddaf 100644 --- a/test_pool/pe/operating_system/test_c026.c +++ b/test_pool/pe/operating_system/test_c026.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pe/operating_system/test_c027.c b/test_pool/pe/operating_system/test_c027.c index a3d6f2bc..5179c102 100644 --- a/test_pool/pe/operating_system/test_c027.c +++ b/test_pool/pe/operating_system/test_c027.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu001.c b/test_pool/pmu/operating_system/test_pmu001.c index 92d7500f..cf475f6e 100644 --- a/test_pool/pmu/operating_system/test_pmu001.c +++ b/test_pool/pmu/operating_system/test_pmu001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu002.c b/test_pool/pmu/operating_system/test_pmu002.c index 5e79674d..61dfc9d4 100644 --- a/test_pool/pmu/operating_system/test_pmu002.c +++ b/test_pool/pmu/operating_system/test_pmu002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/pmu/operating_system/test_pmu008.c b/test_pool/pmu/operating_system/test_pmu008.c index 87679a90..74981198 100644 --- a/test_pool/pmu/operating_system/test_pmu008.c +++ b/test_pool/pmu/operating_system/test_pmu008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2023-2023, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i001.c b/test_pool/smmu/operating_system/test_i001.c index 76e7e575..107b4576 100644 --- a/test_pool/smmu/operating_system/test_i001.c +++ b/test_pool/smmu/operating_system/test_i001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i002.c b/test_pool/smmu/operating_system/test_i002.c index e0a51d57..70e5851e 100644 --- a/test_pool/smmu/operating_system/test_i002.c +++ b/test_pool/smmu/operating_system/test_i002.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2020-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i003.c b/test_pool/smmu/operating_system/test_i003.c index e095740c..0b752775 100644 --- a/test_pool/smmu/operating_system/test_i003.c +++ b/test_pool/smmu/operating_system/test_i003.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i004.c b/test_pool/smmu/operating_system/test_i004.c index fb3d76f7..1356c87e 100644 --- a/test_pool/smmu/operating_system/test_i004.c +++ b/test_pool/smmu/operating_system/test_i004.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i005.c b/test_pool/smmu/operating_system/test_i005.c index a6f60f0f..578df05e 100644 --- a/test_pool/smmu/operating_system/test_i005.c +++ b/test_pool/smmu/operating_system/test_i005.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i006.c b/test_pool/smmu/operating_system/test_i006.c index e2ceeb4c..6acca0a1 100644 --- a/test_pool/smmu/operating_system/test_i006.c +++ b/test_pool/smmu/operating_system/test_i006.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i008.c b/test_pool/smmu/operating_system/test_i008.c index 64c8b2dd..8a04cfd7 100644 --- a/test_pool/smmu/operating_system/test_i008.c +++ b/test_pool/smmu/operating_system/test_i008.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i009.c b/test_pool/smmu/operating_system/test_i009.c index d7b47156..a0a6f71a 100644 --- a/test_pool/smmu/operating_system/test_i009.c +++ b/test_pool/smmu/operating_system/test_i009.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i010.c b/test_pool/smmu/operating_system/test_i010.c index eb710c40..09d7646a 100644 --- a/test_pool/smmu/operating_system/test_i010.c +++ b/test_pool/smmu/operating_system/test_i010.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021-2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i011.c b/test_pool/smmu/operating_system/test_i011.c index cccb3b4b..29b799b6 100644 --- a/test_pool/smmu/operating_system/test_i011.c +++ b/test_pool/smmu/operating_system/test_i011.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i012.c b/test_pool/smmu/operating_system/test_i012.c index 24d2d9b2..e834d168 100644 --- a/test_pool/smmu/operating_system/test_i012.c +++ b/test_pool/smmu/operating_system/test_i012.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/smmu/operating_system/test_i015.c b/test_pool/smmu/operating_system/test_i015.c index f3a12290..5de4a18b 100644 --- a/test_pool/smmu/operating_system/test_i015.c +++ b/test_pool/smmu/operating_system/test_i015.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2016-2018, 2021 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2016-2018, 2021-2023 Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test_pool/watchdog/operating_system/test_w001.c b/test_pool/watchdog/operating_system/test_w001.c index 08dfaac6..15d9afa6 100644 --- a/test_pool/watchdog/operating_system/test_w001.c +++ b/test_pool/watchdog/operating_system/test_w001.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2020, 2022 Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2020-2023, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * Licensed under the Apache License, Version 2.0 (the "License");

-LAfs&Jd!g5ju2WhURmoA=QH@#@Nh?UH!mu}h0 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

aRq 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
?7wFOFSi5)$`N;1 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�dws=xOXybUue-b{b{m4{>$|kHtK;13{<*tM=oBX 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 hh~g5S=JRxteP(QcMZQ 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ℭ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