pax_global_header00006660000000000000000000000064132260064620014513gustar00rootroot0000000000000052 comment=ae78724247a01560164d607ed66db111c74d8df0 arm-trusted-firmware-1.0-aw-6/000077500000000000000000000000001322600646200162045ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/.gitignore000066400000000000000000000002651322600646200201770ustar00rootroot00000000000000# Ignore miscellaneous files cscope.* *.swp *.patch .project .cproject # Ignore build directory build/ # Ignore build products from tools tools/**/*.o tools/fip_create/fip_create arm-trusted-firmware-1.0-aw-6/Makefile000066400000000000000000000352601322600646200176520ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # # Trusted Firmware Version # VERSION_MAJOR := 1 VERSION_MINOR := 0 # # Default values for build configurations # # Build verbosity V := 0 # Debug build DEBUG := 0 # Build architecture ARCH := aarch64 # Build platform DEFAULT_PLAT := fvp PLAT := ${DEFAULT_PLAT} # SPD choice SPD := none # Base commit to perform code check on BASE_COMMIT := origin/master # NS timer register save and restore NS_TIMER_SWITCH := 0 # By default, Bl1 acts as the reset handler, not BL31 RESET_TO_BL31 := 0 # Include FP registers in cpu context CTX_INCLUDE_FPREGS := 0 # Determine the version of ARM GIC architecture to use for interrupt management # in EL3. The platform port can change this value if needed. ARM_GIC_ARCH := 2 # Flag used to indicate if ASM_ASSERTION should be enabled for the build. # This defaults to being present in DEBUG builds only. ASM_ASSERTION := ${DEBUG} # Checkpatch ignores CHECK_IGNORE = --ignore COMPLEX_MACRO CHECKPATCH_ARGS = --no-tree --no-signoff ${CHECK_IGNORE} CHECKCODE_ARGS = --no-patch --no-tree --no-signoff ${CHECK_IGNORE} ifeq (${V},0) Q=@ CHECKCODE_ARGS += --no-summary --terse else Q= endif export Q ifneq (${DEBUG}, 0) BUILD_TYPE := debug # Use LOG_LEVEL_INFO by default for debug builds LOG_LEVEL := 40 else BUILD_TYPE := release # Use LOG_LEVEL_NOTICE by default for release builds LOG_LEVEL := 20 endif # Default build string (git branch and commit) ifeq (${BUILD_STRING},) BUILD_STRING := $(shell git log -n 1 --pretty=format:"%h") endif VERSION_STRING := v${VERSION_MAJOR}.${VERSION_MINOR}(${BUILD_TYPE}):${BUILD_STRING} BL_COMMON_SOURCES := common/bl_common.c \ common/tf_printf.c \ common/aarch64/debug.S \ lib/aarch64/cache_helpers.S \ lib/aarch64/misc_helpers.S \ lib/aarch64/xlat_helpers.c \ lib/stdlib/std.c \ plat/common/aarch64/platform_helpers.S BUILD_BASE := ./build BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE} PLATFORMS := $(shell ls -I common plat/) SPDS := $(shell ls -I none services/spd) HELP_PLATFORMS := $(shell echo ${PLATFORMS} | sed 's/ /|/g') # Convenience function for adding build definitions # $(eval $(call add_define,FOO)) will have: # -DFOO if $(FOO) is empty; -DFOO=$(FOO) otherwise define add_define DEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),) endef # Convenience function for verifying option has a boolean value # $(eval $(call assert_boolean,FOO)) will assert FOO is 0 or 1 define assert_boolean $(and $(patsubst 0,,$(value $(1))),$(patsubst 1,,$(value $(1))),$(error $(1) must be boolean)) endef ifeq (${PLAT},) $(error "Error: Unknown platform. Please use PLAT= to specify the platform.") endif ifeq ($(findstring ${PLAT},${PLATFORMS}),) $(error "Error: Invalid platform. The following platforms are available: ${PLATFORMS}") endif all: msg_start msg_start: @echo "Building ${PLAT}" include plat/${PLAT}/platform.mk # By default all CPU errata workarounds are disabled. This can be # overridden by the platform. include lib/cpus/cpu-errata.mk ifdef BL1_SOURCES NEED_BL1 := yes include bl1/bl1.mk endif ifdef BL2_SOURCES NEED_BL2 := yes include bl2/bl2.mk endif ifdef BL31_SOURCES NEED_BL31 := yes include bl31/bl31.mk endif # Include SPD Makefile if one has been specified ifneq (${SPD},none) # We expect to locate an spd.mk under the specified SPD directory SPD_MAKE := $(shell m="services/spd/${SPD}/${SPD}.mk"; [ -f "$$m" ] && echo "$$m") ifeq (${SPD_MAKE},) $(error Error: No services/spd/${SPD}/${SPD}.mk located) endif $(info Including ${SPD_MAKE}) include ${SPD_MAKE} # If there's BL32 companion for the chosen SPD, and the SPD wants to build the # BL2 from source, we expect that the SPD's Makefile would set NEED_BL32 # variable to "yes" endif .PHONY: all msg_start clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool fip .SUFFIXES: INCLUDES += -Iinclude/bl31 \ -Iinclude/bl31/services \ -Iinclude/common \ -Iinclude/drivers \ -Iinclude/drivers/arm \ -Iinclude/drivers/io \ -Iinclude/lib \ -Iinclude/lib/aarch64 \ -Iinclude/lib/cpus/aarch64 \ -Iinclude/plat/common \ -Iinclude/stdlib \ -Iinclude/stdlib/sys \ ${PLAT_INCLUDES} \ ${SPD_INCLUDES} # Process DEBUG flag $(eval $(call assert_boolean,DEBUG)) $(eval $(call add_define,DEBUG)) ifeq (${DEBUG},0) $(eval $(call add_define,NDEBUG)) else CFLAGS += -g ASFLAGS += -g -Wa,--gdwarf-2 endif # Process NS_TIMER_SWITCH flag $(eval $(call assert_boolean,NS_TIMER_SWITCH)) $(eval $(call add_define,NS_TIMER_SWITCH)) # Process RESET_TO_BL31 flag $(eval $(call assert_boolean,RESET_TO_BL31)) $(eval $(call add_define,RESET_TO_BL31)) # Process CTX_INCLUDE_FPREGS flag $(eval $(call assert_boolean,CTX_INCLUDE_FPREGS)) $(eval $(call add_define,CTX_INCLUDE_FPREGS)) # Process ARM_GIC_ARCH flag $(eval $(call add_define,ARM_GIC_ARCH)) # Process ASM_ASSERTION flag $(eval $(call assert_boolean,ASM_ASSERTION)) $(eval $(call add_define,ASM_ASSERTION)) # Process LOG_LEVEL flag $(eval $(call add_define,LOG_LEVEL)) ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \ -Werror -Wmissing-include-dirs \ -mgeneral-regs-only -D__ASSEMBLY__ \ ${DEFINES} ${INCLUDES} CFLAGS += -nostdinc -pedantic -ffreestanding -Wall \ -Werror -Wmissing-include-dirs \ -mgeneral-regs-only -std=c99 -c -Os \ ${DEFINES} ${INCLUDES} CFLAGS += -ffunction-sections -fdata-sections LDFLAGS += --fatal-warnings -O1 LDFLAGS += --gc-sections LDFLAGS += $(if $(shell $(LD) -v --fix-cortex-a53-843419 > /dev/null 2>&1 && echo 1),--fix-cortex-a53-843419) CC := ${CROSS_COMPILE}gcc CPP := ${CROSS_COMPILE}cpp AS := ${CROSS_COMPILE}gcc AR := ${CROSS_COMPILE}ar LD := ${CROSS_COMPILE}ld OC := ${CROSS_COMPILE}objcopy OD := ${CROSS_COMPILE}objdump NM := ${CROSS_COMPILE}nm PP := ${CROSS_COMPILE}gcc -E ${CFLAGS} # Variables for use with Firmware Image Package FIPTOOLPATH ?= tools/fip_create FIPTOOL ?= ${FIPTOOLPATH}/fip_create fiptool: ${FIPTOOL} fip: ${BUILD_PLAT}/fip.bin locate-checkpatch: ifndef CHECKPATCH $(error "Please set CHECKPATCH to point to the Linux checkpatch.pl file, eg: CHECKPATCH=../linux/script/checkpatch.pl") else ifeq (,$(wildcard ${CHECKPATCH})) $(error "The file CHECKPATCH points to cannot be found, use eg: CHECKPATCH=../linux/script/checkpatch.pl") endif endif clean: @echo " CLEAN" ${Q}rm -rf ${BUILD_PLAT} ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean realclean distclean: @echo " REALCLEAN" ${Q}rm -rf ${BUILD_BASE} ${Q}rm -f ${CURDIR}/cscope.* ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean checkcodebase: locate-checkpatch @echo " CHECKING STYLE" @if test -d .git ; then \ git ls-files | grep -v stdlib | while read GIT_FILE ; do ${CHECKPATCH} ${CHECKCODE_ARGS} -f $$GIT_FILE ; done ; \ else \ find . -type f -not -iwholename "*.git*" -not -iwholename "*build*" -not -iwholename "*stdlib*" -exec ${CHECKPATCH} ${CHECKCODE_ARGS} -f {} \; ; \ fi checkpatch: locate-checkpatch @echo " CHECKING STYLE" @git format-patch --stdout ${BASE_COMMIT} | ${CHECKPATCH} ${CHECKPATCH_ARGS} - || true ${FIPTOOL}: ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} @echo @echo "Built $@ successfully" @echo define match_goals $(strip $(foreach goal,$(1),$(filter $(goal),$(MAKECMDGOALS)))) endef # List of rules that involve building things BUILD_TARGETS := all bl1 bl2 bl31 bl32 fip # Does the list of goals specified on the command line include a build target? ifneq ($(call match_goals,${BUILD_TARGETS}),) IS_ANYTHING_TO_BUILD := 1 endif define MAKE_C $(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2)))) $(eval PREREQUISITES := $(patsubst %.o,%.d,$(OBJ))) $(OBJ) : $(2) @echo " CC $$<" $$(Q)$$(CC) $$(CFLAGS) -DIMAGE_BL$(3) -c $$< -o $$@ $(PREREQUISITES) : $(2) @echo " DEPS $$@" @mkdir -p $(1) $$(Q)$$(CC) $$(CFLAGS) -M -MT $(OBJ) -MF $$@ $$< ifdef IS_ANYTHING_TO_BUILD -include $(PREREQUISITES) endif endef define MAKE_S $(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2)))) $(eval PREREQUISITES := $(patsubst %.o,%.d,$(OBJ))) $(OBJ) : $(2) @echo " AS $$<" $$(Q)$$(AS) $$(ASFLAGS) -DIMAGE_BL$(3) -c $$< -o $$@ $(PREREQUISITES) : $(2) @echo " DEPS $$@" @mkdir -p $(1) $$(Q)$$(AS) $$(ASFLAGS) -M -MT $(OBJ) -MF $$@ $$< ifdef IS_ANYTHING_TO_BUILD -include $(PREREQUISITES) endif endef define MAKE_LD $(eval PREREQUISITES := $(1).d) $(1) : $(2) @echo " PP $$<" $$(Q)$$(AS) $$(ASFLAGS) -P -E -o $$@ $$< $(PREREQUISITES) : $(2) @echo " DEPS $$@" @mkdir -p $$(dir $$@) $$(Q)$$(AS) $$(ASFLAGS) -M -MT $(1) -MF $$@ $$< ifdef IS_ANYTHING_TO_BUILD -include $(PREREQUISITES) endif endef define MAKE_OBJS $(eval C_OBJS := $(filter %.c,$(2))) $(eval REMAIN := $(filter-out %.c,$(2))) $(eval $(foreach obj,$(C_OBJS),$(call MAKE_C,$(1),$(obj),$(3)))) $(eval S_OBJS := $(filter %.S,$(REMAIN))) $(eval REMAIN := $(filter-out %.S,$(REMAIN))) $(eval $(foreach obj,$(S_OBJS),$(call MAKE_S,$(1),$(obj),$(3)))) $(and $(REMAIN),$(error Unexpected source files present: $(REMAIN))) endef # NOTE: The line continuation '\' is required in the next define otherwise we # end up with a line-feed characer at the end of the last c filename. # Also bare this issue in mind if extending the list of supported filetypes. define SOURCES_TO_OBJS $(notdir $(patsubst %.c,%.o,$(filter %.c,$(1)))) \ $(notdir $(patsubst %.S,%.o,$(filter %.S,$(1)))) endef define MAKE_BL $(eval BUILD_DIR := ${BUILD_PLAT}/bl$(1)) $(eval SOURCES := $(BL$(1)_SOURCES) $(BL_COMMON_SOURCES) $(PLAT_BL_COMMON_SOURCES)) $(eval OBJS := $(addprefix $(BUILD_DIR)/,$(call SOURCES_TO_OBJS,$(SOURCES)))) $(eval LINKERFILE := $(BUILD_DIR)/bl$(1).ld) $(eval MAPFILE := $(BUILD_DIR)/bl$(1).map) $(eval ELF := $(BUILD_DIR)/bl$(1).elf) $(eval DUMP := $(BUILD_DIR)/bl$(1).dump) $(eval BIN := $(BUILD_PLAT)/bl$(1).bin) $(eval $(call MAKE_OBJS,$(BUILD_DIR),$(SOURCES),$(1))) $(eval $(call MAKE_LD,$(LINKERFILE),$(BL$(1)_LINKERFILE))) $(BUILD_DIR) : $$(Q)mkdir -p "$$@" $(ELF) : $(OBJS) $(LINKERFILE) @echo " LD $$@" @echo 'const char build_message[] = "Built : "__TIME__", "__DATE__; \ const char version_string[] = "${VERSION_STRING}";' | \ $$(CC) $$(CFLAGS) -xc - -o $(BUILD_DIR)/build_message.o $$(Q)$$(LD) -o $$@ $$(LDFLAGS) -Map=$(MAPFILE) --script $(LINKERFILE) \ $(BUILD_DIR)/build_message.o $(OBJS) $(DUMP) : $(ELF) @echo " OD $$@" $${Q}$${OD} -dx $$< > $$@ $(BIN) : $(ELF) @echo " BIN $$@" $$(Q)$$(OC) -O binary $$< $$@ @echo @echo "Built $$@ successfully" @echo .PHONY : bl$(1) bl$(1) : $(BUILD_DIR) $(BIN) $(DUMP) all : bl$(1) $(eval FIP_DEPS += $(if $2,$(BIN),)) $(eval FIP_ARGS += $(if $2,--bl$(1) $(BIN),)) endef ifeq (${NEED_BL1},yes) $(eval $(call MAKE_BL,1)) endif ifeq (${NEED_BL2},yes) $(eval $(call MAKE_BL,2,in_fip)) endif ifeq (${NEED_BL31},yes) BL31_SOURCES += ${SPD_SOURCES} $(eval $(call MAKE_BL,31,in_fip)) endif ifeq (${NEED_BL32},yes) $(eval $(call MAKE_BL,32,in_fip)) endif ifeq (${NEED_BL30},yes) FIP_DEPS += ${BL30} FIP_ARGS += --bl30 ${BL30} endif ifeq (${NEED_BL30},yes) # If BL3-0 is needed by the platform then 'BL30' variable must be defined. check_bl30: $(if ${BL30},,$(error "To build a FIP for platform ${PLAT}, please set BL30 to point to the SCP firmware")) else # If BL3-0 is not needed by the platform but the user still specified the path # to a BL3-0 image then warn him that it will be ignored. check_bl30: $(if ${BL30},$(warning "BL3-0 is not supported on platform ${PLAT}, it will just be ignored"),) endif ${BUILD_PLAT}/fip.bin: ${FIP_DEPS} ${BL33} ${FIPTOOL} check_bl30 $(if ${BL33},,$(error "To build a FIP, please set BL33 to point to the Normal World binary, eg: BL33=../uefi/FVP_AARCH64_EFI.fd")) ${Q}${FIPTOOL} --dump \ ${FIP_ARGS} \ --bl33 ${BL33} \ $@ @echo @echo "Built $@ successfully" @echo cscope: @echo " CSCOPE" ${Q}find ${CURDIR} -name "*.[chsS]" > cscope.files ${Q}cscope -b -q -k ctag: ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -w -o ctags `find $(CURDIR) \ -name '*.[chS]' -print` help: @echo "usage: ${MAKE} PLAT=<${HELP_PLATFORMS}> " @echo "" @echo "PLAT is used to specify which platform you wish to build." @echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}" @echo "" @echo "Supported Targets:" @echo " all Build the BL1, BL2 and BL31 binaries" @echo " bl1 Build the BL1 binary" @echo " bl2 Build the BL2 binary" @echo " bl31 Build the BL31 binary" @echo " checkcodebase Check the coding style of the entire source tree" @echo " checkpatch Check the coding style on changes in the current" @echo " branch against BASE_COMMIT (default origin/master)" @echo " clean Clean the build for the selected platform" @echo " cscope Generate cscope index" @echo " distclean Remove all build artifacts for all platforms" @echo " fiptool Build the Firmware Image Package(FIP) creation tool" @echo "" @echo "note: most build targets require PLAT to be set to a specific platform." @echo "" @echo "example: build all targets for the FVP platform:" @echo " CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all" arm-trusted-firmware-1.0-aw-6/acknowledgements.md000066400000000000000000000001671322600646200220640ustar00rootroot00000000000000Contributor Acknowledgements ============================ Companies --------- Linaro Limited Individuals ----------- arm-trusted-firmware-1.0-aw-6/bl1/000077500000000000000000000000001322600646200166625ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl1/aarch64/000077500000000000000000000000001322600646200201125ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl1/aarch64/bl1_arch_setup.c000066400000000000000000000046461322600646200231630ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /******************************************************************************* * Function that does the first bit of architectural setup that affects * execution in the non-secure address space. ******************************************************************************/ void bl1_arch_setup(void) { /* Set the next EL to be AArch64 */ write_scr_el3(SCR_RES1_BITS | SCR_RW_BIT); } /******************************************************************************* * Set the Secure EL1 required architectural state ******************************************************************************/ void bl1_arch_next_el_setup(void) { unsigned long next_sctlr; /* Use the same endianness than the current BL */ next_sctlr = (read_sctlr_el3() & SCTLR_EE_BIT); /* Set SCTLR Secure EL1 */ next_sctlr |= SCTLR_EL1_RES1; write_sctlr_el1(next_sctlr); } arm-trusted-firmware-1.0-aw-6/bl1/aarch64/bl1_entrypoint.S000066400000000000000000000136761322600646200232240ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include .globl bl1_entrypoint /* ----------------------------------------------------- * bl1_entrypoint() is the entry point into the trusted * firmware code when a cpu is released from warm or * cold reset. * ----------------------------------------------------- */ func bl1_entrypoint /* --------------------------------------------- * Set the CPU endianness before doing anything * that might involve memory reads or writes. * --------------------------------------------- */ mrs x0, sctlr_el3 bic x0, x0, #SCTLR_EE_BIT msr sctlr_el3, x0 isb /* --------------------------------------------- * Perform any processor specific actions upon * reset e.g. cache, tlb invalidations etc. * --------------------------------------------- */ bl reset_handler /* --------------------------------------------- * Enable the instruction cache, stack pointer * and data access alignment checks * --------------------------------------------- */ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) mrs x0, sctlr_el3 orr x0, x0, x1 msr sctlr_el3, x0 isb /* --------------------------------------------- * Set the exception vector to something sane. * --------------------------------------------- */ adr x0, bl1_exceptions msr vbar_el3, x0 isb /* --------------------------------------------- * Enable the SError interrupt now that the * exception vectors have been setup. * --------------------------------------------- */ msr daifclr, #DAIF_ABT_BIT /* --------------------------------------------------------------------- * The initial state of the Architectural feature trap register * (CPTR_EL3) is unknown and it must be set to a known state. All * feature traps are disabled. Some bits in this register are marked as * Reserved and should not be modified. * * CPTR_EL3.TCPAC: This causes a direct access to the CPACR_EL1 from EL1 * or the CPTR_EL2 from EL2 to trap to EL3 unless it is trapped at EL2. * CPTR_EL3.TTA: This causes access to the Trace functionality to trap * to EL3 when executed from EL0, EL1, EL2, or EL3. If system register * access to trace functionality is not supported, this bit is RES0. * CPTR_EL3.TFP: This causes instructions that access the registers * associated with Floating Point and Advanced SIMD execution to trap * to EL3 when executed from any exception level, unless trapped to EL1 * or EL2. * --------------------------------------------------------------------- */ mrs x0, cptr_el3 bic w0, w0, #TCPAC_BIT bic w0, w0, #TTA_BIT bic w0, w0, #TFP_BIT msr cptr_el3, x0 /* ------------------------------------------------------- * Will not return from this macro if it is a warm boot. * ------------------------------------------------------- */ wait_for_entrypoint bl platform_mem_init /* --------------------------------------------- * Init C runtime environment. * - Zero-initialise the NOBITS sections. * There are 2 of them: * - the .bss section; * - the coherent memory section. * - Copy the data section from BL1 image * (stored in ROM) to the correct location * in RAM. * --------------------------------------------- */ ldr x0, =__BSS_START__ ldr x1, =__BSS_SIZE__ bl zeromem16 ldr x0, =__COHERENT_RAM_START__ ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__ bl zeromem16 ldr x0, =__DATA_RAM_START__ ldr x1, =__DATA_ROM_START__ ldr x2, =__DATA_SIZE__ bl memcpy16 /* -------------------------------------------- * Allocate a stack whose memory will be marked * as Normal-IS-WBWA when the MMU is enabled. * There is no risk of reading stale stack * memory after enabling the MMU as only the * primary cpu is running at the moment. * -------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* --------------------------------------------- * Architectural init. can be generic e.g. * enabling stack alignment and platform spec- * ific e.g. MMU & page table setup as per the * platform memory map. Perform the latter here * and the former in bl1_main. * --------------------------------------------- */ bl bl1_early_platform_setup bl bl1_plat_arch_setup /* -------------------------------------------------- * Initialize platform and jump to our c-entry point * for this type of reset. Panic if it returns * -------------------------------------------------- */ bl bl1_main panic: b panic arm-trusted-firmware-1.0-aw-6/bl1/aarch64/bl1_exceptions.S000066400000000000000000000126571322600646200231700ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include .globl bl1_exceptions .section .vectors, "ax"; .align 11 /* ----------------------------------------------------- * Very simple stackless exception handlers used by BL1. * ----------------------------------------------------- */ .align 7 bl1_exceptions: /* ----------------------------------------------------- * Current EL with SP0 : 0x0 - 0x200 * ----------------------------------------------------- */ SynchronousExceptionSP0: mov x0, #SYNC_EXCEPTION_SP_EL0 bl plat_report_exception b SynchronousExceptionSP0 check_vector_size SynchronousExceptionSP0 .align 7 IrqSP0: mov x0, #IRQ_SP_EL0 bl plat_report_exception b IrqSP0 check_vector_size IrqSP0 .align 7 FiqSP0: mov x0, #FIQ_SP_EL0 bl plat_report_exception b FiqSP0 check_vector_size FiqSP0 .align 7 SErrorSP0: mov x0, #SERROR_SP_EL0 bl plat_report_exception b SErrorSP0 check_vector_size SErrorSP0 /* ----------------------------------------------------- * Current EL with SPx: 0x200 - 0x400 * ----------------------------------------------------- */ .align 7 SynchronousExceptionSPx: mov x0, #SYNC_EXCEPTION_SP_ELX bl plat_report_exception b SynchronousExceptionSPx check_vector_size SynchronousExceptionSPx .align 7 IrqSPx: mov x0, #IRQ_SP_ELX bl plat_report_exception b IrqSPx check_vector_size IrqSPx .align 7 FiqSPx: mov x0, #FIQ_SP_ELX bl plat_report_exception b FiqSPx check_vector_size FiqSPx .align 7 SErrorSPx: mov x0, #SERROR_SP_ELX bl plat_report_exception b SErrorSPx check_vector_size SErrorSPx /* ----------------------------------------------------- * Lower EL using AArch64 : 0x400 - 0x600 * ----------------------------------------------------- */ .align 7 SynchronousExceptionA64: /* Enable the SError interrupt */ msr daifclr, #DAIF_ABT_BIT /* ------------------------------------------------ * Only a single SMC exception from BL2 to ask * BL1 to pass EL3 control to BL31 is expected * here. * It expects X0 with RUN_IMAGE SMC function id * X1 with address of a entry_point_info_t structure * describing the BL3-1 entrypoint * ------------------------------------------------ */ mov x19, x0 mov x20, x1 mrs x0, esr_el3 ubfx x1, x0, #ESR_EC_SHIFT, #ESR_EC_LENGTH cmp x1, #EC_AARCH64_SMC b.ne panic mov x0, #RUN_IMAGE cmp x19, x0 b.ne panic mov x0, x20 bl display_boot_progress ldp x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET] msr elr_el3, x0 msr spsr_el3, x1 ubfx x0, x1, #MODE_EL_SHIFT, #2 cmp x0, #MODE_EL3 b.ne panic bl disable_mmu_icache_el3 tlbi alle3 ldp x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)] ldp x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)] ldp x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)] ldp x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)] eret panic: mov x0, #SYNC_EXCEPTION_AARCH64 bl plat_report_exception wfi b panic check_vector_size SynchronousExceptionA64 .align 7 IrqA64: mov x0, #IRQ_AARCH64 bl plat_report_exception b IrqA64 check_vector_size IrqA64 .align 7 FiqA64: mov x0, #FIQ_AARCH64 bl plat_report_exception b FiqA64 check_vector_size FiqA64 .align 7 SErrorA64: mov x0, #SERROR_AARCH64 bl plat_report_exception b SErrorA64 check_vector_size SErrorA64 /* ----------------------------------------------------- * Lower EL using AArch32 : 0x600 - 0x800 * ----------------------------------------------------- */ .align 7 SynchronousExceptionA32: mov x0, #SYNC_EXCEPTION_AARCH32 bl plat_report_exception b SynchronousExceptionA32 check_vector_size SynchronousExceptionA32 .align 7 IrqA32: mov x0, #IRQ_AARCH32 bl plat_report_exception b IrqA32 check_vector_size IrqA32 .align 7 FiqA32: mov x0, #FIQ_AARCH32 bl plat_report_exception b FiqA32 check_vector_size FiqA32 .align 7 SErrorA32: mov x0, #SERROR_AARCH32 bl plat_report_exception b SErrorA32 check_vector_size SErrorA32 arm-trusted-firmware-1.0-aw-6/bl1/bl1.ld.S000066400000000000000000000114711322600646200200660ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT) OUTPUT_ARCH(PLATFORM_LINKER_ARCH) ENTRY(bl1_entrypoint) MEMORY { ROM (rx): ORIGIN = BL1_RO_BASE, LENGTH = BL1_RO_LIMIT RAM (rwx): ORIGIN = BL1_RW_BASE, LENGTH = BL1_RW_LIMIT } SECTIONS { . = BL1_RO_BASE; ASSERT(. == ALIGN(4096), "BL1_RO_BASE address is not aligned on a page boundary.") ro . : { __RO_START__ = .; *bl1_entrypoint.o(.text*) *(.text*) *(.rodata*) /* * Ensure 8-byte alignment for cpu_ops so that its fields are also * aligned. Also ensure cpu_ops inclusion. */ . = ALIGN(8); __CPU_OPS_START__ = .; KEEP(*(cpu_ops)) __CPU_OPS_END__ = .; *(.vectors) __RO_END__ = .; } >ROM ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__, "cpu_ops not defined for this platform.") /* * The .data section gets copied from ROM to RAM at runtime. * Its LMA must be 16-byte aligned. * Its VMA must be page-aligned as it marks the first read/write page. */ . = BL1_RW_BASE; ASSERT(. == ALIGN(4096), "BL1_RW_BASE address is not aligned on a page boundary.") .data . : ALIGN(16) { __DATA_RAM_START__ = .; *(.data*) __DATA_RAM_END__ = .; } >RAM AT>ROM stacks . (NOLOAD) : { __STACKS_START__ = .; *(tzfw_normal_stacks) __STACKS_END__ = .; } >RAM /* * The .bss section gets initialised to 0 at runtime. * Its base address must be 16-byte aligned. */ .bss : ALIGN(16) { __BSS_START__ = .; *(.bss*) *(COMMON) __BSS_END__ = .; } >RAM /* * The xlat_table section is for full, aligned page tables (4K). * Removing them from .bss avoids forcing 4K alignment on * the .bss section and eliminates the unecessary zero init */ xlat_table (NOLOAD) : { *(xlat_table) } >RAM /* * The base address of the coherent memory section must be page-aligned (4K) * to guarantee that the coherent data are stored on their own pages and * are not mixed with normal data. This is required to set up the correct * memory attributes for the coherent data page tables. */ coherent_ram (NOLOAD) : ALIGN(4096) { __COHERENT_RAM_START__ = .; *(tzfw_coherent_mem) __COHERENT_RAM_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked * as device memory. No other unexpected data must creep in. * Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __COHERENT_RAM_END__ = .; } >RAM __BL1_RAM_START__ = ADDR(.data); __BL1_RAM_END__ = .; __DATA_ROM_START__ = LOADADDR(.data); __DATA_SIZE__ = SIZEOF(.data); /* * The .data section is the last PROGBITS section so its end marks the end * of the read-only part of BL1's binary. */ ASSERT(__DATA_ROM_START__ + __DATA_SIZE__ <= BL1_RO_LIMIT, "BL1's RO section has exceeded its limit.") __BSS_SIZE__ = SIZEOF(.bss); __COHERENT_RAM_UNALIGNED_SIZE__ = __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__; ASSERT(. <= BL1_RW_LIMIT, "BL1's RW section has exceeded its limit.") } arm-trusted-firmware-1.0-aw-6/bl1/bl1.mk000066400000000000000000000033211322600646200176700ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # BL1_SOURCES += bl1/bl1_main.c \ bl1/aarch64/bl1_arch_setup.c \ bl1/aarch64/bl1_entrypoint.S \ bl1/aarch64/bl1_exceptions.S \ lib/cpus/aarch64/cpu_helpers.S BL1_LINKERFILE := bl1/bl1.ld.S arm-trusted-firmware-1.0-aw-6/bl1/bl1_main.c000066400000000000000000000160631322600646200205160ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "bl1_private.h" /******************************************************************************* * Runs BL2 from the given entry point. It results in dropping the * exception level ******************************************************************************/ static void __dead2 bl1_run_bl2(entry_point_info_t *bl2_ep) { bl1_arch_next_el_setup(); /* Tell next EL what we want done */ bl2_ep->args.arg0 = RUN_IMAGE; if (GET_SECURITY_STATE(bl2_ep->h.attr) == NON_SECURE) change_security_state(GET_SECURITY_STATE(bl2_ep->h.attr)); write_spsr_el3(bl2_ep->spsr); write_elr_el3(bl2_ep->pc); eret(bl2_ep->args.arg0, bl2_ep->args.arg1, bl2_ep->args.arg2, bl2_ep->args.arg3, bl2_ep->args.arg4, bl2_ep->args.arg5, bl2_ep->args.arg6, bl2_ep->args.arg7); } /******************************************************************************* * The next function has a weak definition. Platform specific code can override * it if it wishes to. ******************************************************************************/ #pragma weak bl1_init_bl2_mem_layout /******************************************************************************* * Function that takes a memory layout into which BL2 has been loaded and * populates a new memory layout for BL2 that ensures that BL1's data sections * resident in secure RAM are not visible to BL2. ******************************************************************************/ void bl1_init_bl2_mem_layout(const meminfo_t *bl1_mem_layout, meminfo_t *bl2_mem_layout) { const size_t bl1_size = BL1_RAM_LIMIT - BL1_RAM_BASE; assert(bl1_mem_layout != NULL); assert(bl2_mem_layout != NULL); /* Check that BL1's memory is lying outside of the free memory */ assert((BL1_RAM_LIMIT <= bl1_mem_layout->free_base) || (BL1_RAM_BASE >= bl1_mem_layout->free_base + bl1_mem_layout->free_size)); /* Remove BL1 RW data from the scope of memory visible to BL2 */ *bl2_mem_layout = *bl1_mem_layout; reserve_mem(&bl2_mem_layout->total_base, &bl2_mem_layout->total_size, BL1_RAM_BASE, bl1_size); flush_dcache_range((unsigned long)bl2_mem_layout, sizeof(meminfo_t)); } /******************************************************************************* * Function to perform late architectural and platform specific initialization. * It also locates and loads the BL2 raw binary image in the trusted DRAM. Only * called by the primary cpu after a cold boot. * TODO: Add support for alternative image load mechanism e.g using virtio/elf * loader etc. ******************************************************************************/ void bl1_main(void) { /* Announce our arrival */ NOTICE(FIRMWARE_WELCOME_STR); NOTICE("BL1: %s\n", version_string); NOTICE("BL1: %s\n", build_message); INFO("BL1: RAM 0x%lx - 0x%lx\n", BL1_RAM_BASE, BL1_RAM_LIMIT); #if DEBUG unsigned long sctlr_el3 = read_sctlr_el3(); #endif image_info_t bl2_image_info = { {0} }; entry_point_info_t bl2_ep = { {0} }; meminfo_t *bl1_tzram_layout; meminfo_t *bl2_tzram_layout = 0x0; int err; /* * Ensure that MMU/Caches and coherency are turned on */ assert(sctlr_el3 | SCTLR_M_BIT); assert(sctlr_el3 | SCTLR_C_BIT); assert(sctlr_el3 | SCTLR_I_BIT); /* Perform remaining generic architectural setup from EL3 */ bl1_arch_setup(); /* Perform platform setup in BL1. */ bl1_platform_setup(); SET_PARAM_HEAD(&bl2_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); SET_PARAM_HEAD(&bl2_ep, PARAM_EP, VERSION_1, 0); /* Find out how much free trusted ram remains after BL1 load */ bl1_tzram_layout = bl1_plat_sec_mem_layout(); /* Load the BL2 image */ err = load_image(bl1_tzram_layout, BL2_IMAGE_NAME, BL2_BASE, &bl2_image_info, &bl2_ep); if (err) { /* * TODO: print failure to load BL2 but also add a tzwdog timer * which will reset the system eventually. */ ERROR("Failed to load BL2 firmware.\n"); panic(); } /* * Create a new layout of memory for BL2 as seen by BL1 i.e. * tell it the amount of total and free memory available. * This layout is created at the first free address visible * to BL2. BL2 will read the memory layout before using its * memory for other purposes. */ bl2_tzram_layout = (meminfo_t *) bl1_tzram_layout->free_base; bl1_init_bl2_mem_layout(bl1_tzram_layout, bl2_tzram_layout); bl1_plat_set_bl2_ep_info(&bl2_image_info, &bl2_ep); bl2_ep.args.arg1 = (unsigned long)bl2_tzram_layout; NOTICE("BL1: Booting BL2\n"); INFO("BL1: BL2 address = 0x%llx\n", (unsigned long long) bl2_ep.pc); INFO("BL1: BL2 spsr = 0x%x\n", bl2_ep.spsr); VERBOSE("BL1: BL2 memory layout address = 0x%llx\n", (unsigned long long) bl2_tzram_layout); bl1_run_bl2(&bl2_ep); return; } /******************************************************************************* * Temporary function to print the fact that BL2 has done its job and BL31 is * about to be loaded. This is needed as long as printfs cannot be used ******************************************************************************/ void display_boot_progress(entry_point_info_t *bl31_ep_info) { NOTICE("BL1: Booting BL3-1\n"); INFO("BL1: BL3-1 address = 0x%llx\n", (unsigned long long)bl31_ep_info->pc); INFO("BL1: BL3-1 spsr = 0x%llx\n", (unsigned long long)bl31_ep_info->spsr); INFO("BL1: BL3-1 params address = 0x%llx\n", (unsigned long long)bl31_ep_info->args.arg0); INFO("BL1: BL3-1 plat params address = 0x%llx\n", (unsigned long long)bl31_ep_info->args.arg1); } arm-trusted-firmware-1.0-aw-6/bl1/bl1_private.h000066400000000000000000000043121322600646200212430ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BL1_PRIVATE_H__ #define __BL1_PRIVATE_H__ /******************************************************************************* * Declarations of linker defined symbols which will tell us where BL1 lives * in Trusted RAM ******************************************************************************/ extern uint64_t __BL1_RAM_START__; extern uint64_t __BL1_RAM_END__; #define BL1_RAM_BASE (uint64_t)(&__BL1_RAM_START__) #define BL1_RAM_LIMIT (uint64_t)(&__BL1_RAM_END__) /****************************************** * Function prototypes *****************************************/ void bl1_arch_setup(void); void bl1_arch_next_el_setup(void); #endif /* __BL1_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/bl2/000077500000000000000000000000001322600646200166635ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl2/aarch64/000077500000000000000000000000001322600646200201135ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl2/aarch64/bl2_arch_setup.c000066400000000000000000000037331322600646200231610ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /******************************************************************************* * Place holder function to perform any S-EL1 specific architectural setup. At * the moment there is nothing to do. ******************************************************************************/ void bl2_arch_setup(void) { /* Give access to FP/SIMD registers */ write_cpacr(CPACR_EL1_FPEN(CPACR_EL1_FP_TRAP_NONE)); } arm-trusted-firmware-1.0-aw-6/bl2/aarch64/bl2_entrypoint.S000066400000000000000000000077031322600646200232200ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .globl bl2_entrypoint func bl2_entrypoint /*--------------------------------------------- * Store the extents of the tzram available to * BL2 for future use. Use the opcode param to * allow implement other functions if needed. * --------------------------------------------- */ mov x20, x0 mov x21, x1 /* --------------------------------------------- * Set the exception vector to something sane. * --------------------------------------------- */ adr x0, early_exceptions msr vbar_el1, x0 isb /* --------------------------------------------- * Enable the SError interrupt now that the * exception vectors have been setup. * --------------------------------------------- */ msr daifclr, #DAIF_ABT_BIT /* --------------------------------------------- * Enable the instruction cache, stack pointer * and data access alignment checks * --------------------------------------------- */ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) mrs x0, sctlr_el1 orr x0, x0, x1 msr sctlr_el1, x0 isb /* --------------------------------------------- * Check the opcodes out of paranoia. * --------------------------------------------- */ mov x0, #RUN_IMAGE cmp x0, x20 b.ne _panic /* --------------------------------------------- * Zero out NOBITS sections. There are 2 of them: * - the .bss section; * - the coherent memory section. * --------------------------------------------- */ ldr x0, =__BSS_START__ ldr x1, =__BSS_SIZE__ bl zeromem16 ldr x0, =__COHERENT_RAM_START__ ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__ bl zeromem16 /* -------------------------------------------- * Allocate a stack whose memory will be marked * as Normal-IS-WBWA when the MMU is enabled. * There is no risk of reading stale stack * memory after enabling the MMU as only the * primary cpu is running at the moment. * -------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* --------------------------------------------- * Perform early platform setup & platform * specific early arch. setup e.g. mmu setup * --------------------------------------------- */ mov x0, x21 bl bl2_early_platform_setup bl bl2_plat_arch_setup /* --------------------------------------------- * Jump to main function. * --------------------------------------------- */ bl bl2_main _panic: b _panic arm-trusted-firmware-1.0-aw-6/bl2/bl2.ld.S000066400000000000000000000077571322600646200201040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT) OUTPUT_ARCH(PLATFORM_LINKER_ARCH) ENTRY(bl2_entrypoint) MEMORY { RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_LIMIT } SECTIONS { . = BL2_BASE; ASSERT(. == ALIGN(4096), "BL2_BASE address is not aligned on a page boundary.") ro . : { __RO_START__ = .; *bl2_entrypoint.o(.text*) *(.text*) *(.rodata*) *(.vectors) __RO_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked as * read-only, executable. No RW data from the next section must * creep in. Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __RO_END__ = .; } >RAM .data . : { __DATA_START__ = .; *(.data*) __DATA_END__ = .; } >RAM stacks (NOLOAD) : { __STACKS_START__ = .; *(tzfw_normal_stacks) __STACKS_END__ = .; } >RAM /* * The .bss section gets initialised to 0 at runtime. * Its base address must be 16-byte aligned. */ .bss : ALIGN(16) { __BSS_START__ = .; *(SORT_BY_ALIGNMENT(.bss*)) *(COMMON) __BSS_END__ = .; } >RAM /* * The xlat_table section is for full, aligned page tables (4K). * Removing them from .bss avoids forcing 4K alignment on * the .bss section and eliminates the unecessary zero init */ xlat_table (NOLOAD) : { *(xlat_table) } >RAM /* * The base address of the coherent memory section must be page-aligned (4K) * to guarantee that the coherent data are stored on their own pages and * are not mixed with normal data. This is required to set up the correct * memory attributes for the coherent data page tables. */ coherent_ram (NOLOAD) : ALIGN(4096) { __COHERENT_RAM_START__ = .; *(tzfw_coherent_mem) __COHERENT_RAM_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked * as device memory. No other unexpected data must creep in. * Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __COHERENT_RAM_END__ = .; } >RAM __BL2_END__ = .; __BSS_SIZE__ = SIZEOF(.bss); __COHERENT_RAM_UNALIGNED_SIZE__ = __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__; ASSERT(. <= BL2_LIMIT, "BL2 image has exceeded its limit.") } arm-trusted-firmware-1.0-aw-6/bl2/bl2.mk000066400000000000000000000033251322600646200176760ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # BL2_SOURCES += bl2/bl2_main.c \ bl2/aarch64/bl2_entrypoint.S \ bl2/aarch64/bl2_arch_setup.c \ common/aarch64/early_exceptions.S \ lib/locks/exclusive/spinlock.S BL2_LINKERFILE := bl2/bl2.ld.S arm-trusted-firmware-1.0-aw-6/bl2/bl2_main.c000066400000000000000000000171711322600646200205210ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "bl2_private.h" /******************************************************************************* * Load the BL3-0 image if there's one. * If a platform does not want to attempt to load BL3-0 image it must leave * BL30_BASE undefined. * Return 0 on success or if there's no BL3-0 image to load, a negative error * code otherwise. ******************************************************************************/ static int load_bl30(void) { int e = 0; #ifdef BL30_BASE meminfo_t bl30_mem_info; image_info_t bl30_image_info; /* * It is up to the platform to specify where BL3-0 should be loaded if * it exists. It could create space in the secure sram or point to a * completely different memory. * * The entry point information is not relevant in this case as the AP * won't execute the BL3-0 image. */ INFO("BL2: Loading BL3-0\n"); bl2_plat_get_bl30_meminfo(&bl30_mem_info); e = load_image(&bl30_mem_info, BL30_IMAGE_NAME, BL30_BASE, &bl30_image_info, NULL); if (e == 0) { /* The subsequent handling of BL3-0 is platform specific */ bl2_plat_handle_bl30(&bl30_image_info); } #endif /* BL30_BASE */ return e; } /******************************************************************************* * Load the BL3-1 image. * The bl2_to_bl31_params and bl31_ep_info params will be updated with the * relevant BL3-1 information. * Return 0 on success, a negative error code otherwise. ******************************************************************************/ static int load_bl31(bl31_params_t *bl2_to_bl31_params, entry_point_info_t *bl31_ep_info) { meminfo_t *bl2_tzram_layout; int e; INFO("BL2: Loading BL3-1\n"); assert(bl2_to_bl31_params != NULL); assert(bl31_ep_info != NULL); /* Find out how much free trusted ram remains after BL2 load */ bl2_tzram_layout = bl2_plat_sec_mem_layout(); /* Set the X0 parameter to BL3-1 */ bl31_ep_info->args.arg0 = (unsigned long)bl2_to_bl31_params; /* Load the BL3-1 image */ e = load_image(bl2_tzram_layout, BL31_IMAGE_NAME, BL31_BASE, bl2_to_bl31_params->bl31_image_info, bl31_ep_info); if (e == 0) bl2_plat_set_bl31_ep_info(bl2_to_bl31_params->bl31_image_info, bl31_ep_info); return e; } /******************************************************************************* * Load the BL3-2 image if there's one. * The bl2_to_bl31_params param will be updated with the relevant BL3-2 * information. * If a platform does not want to attempt to load BL3-2 image it must leave * BL32_BASE undefined. * Return 0 on success or if there's no BL3-2 image to load, a negative error * code otherwise. ******************************************************************************/ static int load_bl32(bl31_params_t *bl2_to_bl31_params) { int e = 0; #ifdef BL32_BASE meminfo_t bl32_mem_info; INFO("BL2: Loading BL3-2\n"); assert(bl2_to_bl31_params != NULL); /* * It is up to the platform to specify where BL3-2 should be loaded if * it exists. It could create space in the secure sram or point to a * completely different memory. */ bl2_plat_get_bl32_meminfo(&bl32_mem_info); e = load_image(&bl32_mem_info, BL32_IMAGE_NAME, BL32_BASE, bl2_to_bl31_params->bl32_image_info, bl2_to_bl31_params->bl32_ep_info); if (e == 0) { bl2_plat_set_bl32_ep_info( bl2_to_bl31_params->bl32_image_info, bl2_to_bl31_params->bl32_ep_info); } #endif /* BL32_BASE */ return e; } /******************************************************************************* * Load the BL3-3 image. * The bl2_to_bl31_params param will be updated with the relevant BL3-3 * information. * Return 0 on success, a negative error code otherwise. ******************************************************************************/ static int load_bl33(bl31_params_t *bl2_to_bl31_params) { meminfo_t bl33_mem_info; int e; INFO("BL2: Loading BL3-3\n"); assert(bl2_to_bl31_params != NULL); bl2_plat_get_bl33_meminfo(&bl33_mem_info); /* Load the BL3-3 image in non-secure memory provided by the platform */ e = load_image(&bl33_mem_info, BL33_IMAGE_NAME, plat_get_ns_image_entrypoint(), bl2_to_bl31_params->bl33_image_info, bl2_to_bl31_params->bl33_ep_info); if (e == 0) bl2_plat_set_bl33_ep_info(bl2_to_bl31_params->bl33_image_info, bl2_to_bl31_params->bl33_ep_info); return e; } /******************************************************************************* * The only thing to do in BL2 is to load further images and pass control to * BL3-1. The memory occupied by BL2 will be reclaimed by BL3-x stages. BL2 runs * entirely in S-EL1. ******************************************************************************/ void bl2_main(void) { bl31_params_t *bl2_to_bl31_params; entry_point_info_t *bl31_ep_info; int e; NOTICE("BL2: %s\n", version_string); NOTICE("BL2: %s\n", build_message); /* Perform remaining generic architectural setup in S-EL1 */ bl2_arch_setup(); /* Perform platform setup in BL2 */ bl2_platform_setup(); /* * Load the subsequent bootloader images */ e = load_bl30(); if (e) { ERROR("Failed to load BL3-0 (%i)\n", e); panic(); } /* * Get a pointer to the memory the platform has set aside to pass * information to BL3-1. */ bl2_to_bl31_params = bl2_plat_get_bl31_params(); bl31_ep_info = bl2_plat_get_bl31_ep_info(); e = load_bl31(bl2_to_bl31_params, bl31_ep_info); if (e) { ERROR("Failed to load BL3-1 (%i)\n", e); panic(); } e = load_bl32(bl2_to_bl31_params); if (e) WARN("Failed to load BL3-2 (%i)\n", e); e = load_bl33(bl2_to_bl31_params); if (e) { ERROR("Failed to load BL3-3 (%i)\n", e); panic(); } /* Flush the params to be passed to memory */ bl2_plat_flush_bl31_params(); /* * Run BL3-1 via an SMC to BL1. Information on how to pass control to * the BL3-2 (if present) and BL3-3 software images will be passed to * BL3-1 as an argument. */ smc(RUN_IMAGE, (unsigned long)bl31_ep_info, 0, 0, 0, 0, 0, 0); } arm-trusted-firmware-1.0-aw-6/bl2/bl2_private.h000066400000000000000000000033721322600646200212520ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BL2_PRIVATE_H__ #define __BL2_PRIVATE_H__ /****************************************** * Function prototypes *****************************************/ void bl2_arch_setup(void); #endif /* __BL2_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/bl31/000077500000000000000000000000001322600646200167455ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl31/aarch64/000077500000000000000000000000001322600646200201755ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl31/aarch64/bl31_arch_setup.c000066400000000000000000000043301322600646200233170ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include /******************************************************************************* * This duplicates what the primary cpu did after a cold boot in BL1. The same * needs to be done when a cpu is hotplugged in. This function could also over- * ride any EL3 setup done by BL1 as this code resides in rw memory. ******************************************************************************/ void bl31_arch_setup(void) { /* Set the RES1 bits in the SCR_EL3 */ write_scr_el3(SCR_RES1_BITS); /* Program the counter frequency */ write_cntfrq_el0(plat_get_syscnt_freq()); } arm-trusted-firmware-1.0-aw-6/bl31/aarch64/bl31_entrypoint.S000066400000000000000000000155261322600646200233660ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .globl bl31_entrypoint /* ----------------------------------------------------- * bl31_entrypoint() is the cold boot entrypoint, * executed only by the primary cpu. * ----------------------------------------------------- */ func bl31_entrypoint b code_start nop /* align to 8 bytes */ .byte 0x05, 0x00, 0x00, 0xe0, 0x00, 0x04, 0x02, 0xa8 /* l.xor r0, r0, r0 l.ori r1, r0, 0xc0 */ .byte 0x00, 0x80, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x15 /* l.mtspr r0, r1, 0x4000 l.nop */ /* --------------------------------------------------------------- * Preceding bootloader has populated x0 with a pointer to a * 'bl31_params' structure & x1 with a pointer to platform * specific structure * --------------------------------------------------------------- */ code_start: #if !RESET_TO_BL31 mov w20, w0 mov w21, w1 #else /* --------------------------------------------- * Set the CPU endianness before doing anything * that might involve memory reads or writes. * --------------------------------------------- */ mrs x0, sctlr_el3 bic x0, x0, #SCTLR_EE_BIT msr sctlr_el3, x0 isb /* ----------------------------------------------------- * Perform any processor specific actions upon reset * e.g. cache, tlb invalidations etc. Override the * Boot ROM(BL0) programming sequence * ----------------------------------------------------- */ bl reset_handler #endif /* --------------------------------------------- * Enable the instruction cache, stack pointer * and data access alignment checks * --------------------------------------------- */ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) mrs x0, sctlr_el3 orr x0, x0, x1 msr sctlr_el3, x0 isb /* --------------------------------------------- * Initialise cpu_data early to enable crash * reporting to have access to crash stack. * Since crash reporting depends on cpu_data to * report the unhandled exception, not * doing so can lead to recursive exceptions due * to a NULL TPIDR_EL3 * --------------------------------------------- */ bl init_cpu_data_ptr /* --------------------------------------------- * Set the exception vector. * --------------------------------------------- */ adr x1, runtime_exceptions msr vbar_el3, x1 isb /* --------------------------------------------- * Enable the SError interrupt now that the * exception vectors have been setup. * --------------------------------------------- */ msr daifclr, #DAIF_ABT_BIT /* --------------------------------------------------------------------- * The initial state of the Architectural feature trap register * (CPTR_EL3) is unknown and it must be set to a known state. All * feature traps are disabled. Some bits in this register are marked as * Reserved and should not be modified. * * CPTR_EL3.TCPAC: This causes a direct access to the CPACR_EL1 from EL1 * or the CPTR_EL2 from EL2 to trap to EL3 unless it is trapped at EL2. * CPTR_EL3.TTA: This causes access to the Trace functionality to trap * to EL3 when executed from EL0, EL1, EL2, or EL3. If system register * access to trace functionality is not supported, this bit is RES0. * CPTR_EL3.TFP: This causes instructions that access the registers * associated with Floating Point and Advanced SIMD execution to trap * to EL3 when executed from any exception level, unless trapped to EL1 * or EL2. * --------------------------------------------------------------------- */ mrs x1, cptr_el3 bic w1, w1, #TCPAC_BIT bic w1, w1, #TTA_BIT bic w1, w1, #TFP_BIT msr cptr_el3, x1 #if RESET_TO_BL31 /* ------------------------------------------------------- * Will not return from this macro if it is a warm boot. * ------------------------------------------------------- */ wait_for_entrypoint bl platform_mem_init #endif /* --------------------------------------------- * Zero out NOBITS sections. There are 2 of them: * - the .bss section; * - the coherent memory section. * --------------------------------------------- */ ldr x0, =__BSS_START__ ldr x1, =__BSS_SIZE__ bl zeromem16 ldr x0, =__COHERENT_RAM_START__ ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__ bl zeromem16 /* --------------------------------------------- * Initialize the cpu_ops pointer. * --------------------------------------------- */ bl init_cpu_ops /* --------------------------------------------- * Use SP_EL0 for the C runtime stack. * --------------------------------------------- */ msr spsel, #0 /* -------------------------------------------- * Allocate a stack whose memory will be marked * as Normal-IS-WBWA when the MMU is enabled. * There is no risk of reading stale stack * memory after enabling the MMU as only the * primary cpu is running at the moment. * -------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* --------------------------------------------- * Perform platform specific early arch. setup * --------------------------------------------- */ #if RESET_TO_BL31 mov x0, 0 mov x1, 0 #else mov x0, x20 mov x1, x21 #endif bl bl31_early_platform_setup bl bl31_plat_arch_setup /* --------------------------------------------- * Jump to main function. * --------------------------------------------- */ bl bl31_main b el3_exit arm-trusted-firmware-1.0-aw-6/bl31/aarch64/context.S000066400000000000000000000200701322600646200220040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include /* ----------------------------------------------------- * The following function strictly follows the AArch64 * PCS to use x9-x17 (temporary caller-saved registers) * to save EL1 system register context. It assumes that * 'x0' is pointing to a 'el1_sys_regs' structure where * the register context will be saved. * ----------------------------------------------------- */ .global el1_sysregs_context_save func el1_sysregs_context_save mrs x9, spsr_el1 mrs x10, elr_el1 stp x9, x10, [x0, #CTX_SPSR_EL1] mrs x11, spsr_abt mrs x12, spsr_und stp x11, x12, [x0, #CTX_SPSR_ABT] mrs x13, spsr_irq mrs x14, spsr_fiq stp x13, x14, [x0, #CTX_SPSR_IRQ] mrs x15, sctlr_el1 mrs x16, actlr_el1 stp x15, x16, [x0, #CTX_SCTLR_EL1] mrs x17, cpacr_el1 mrs x9, csselr_el1 stp x17, x9, [x0, #CTX_CPACR_EL1] mrs x10, sp_el1 mrs x11, esr_el1 stp x10, x11, [x0, #CTX_SP_EL1] mrs x12, ttbr0_el1 mrs x13, ttbr1_el1 stp x12, x13, [x0, #CTX_TTBR0_EL1] mrs x14, mair_el1 mrs x15, amair_el1 stp x14, x15, [x0, #CTX_MAIR_EL1] mrs x16, tcr_el1 mrs x17, tpidr_el1 stp x16, x17, [x0, #CTX_TCR_EL1] mrs x9, tpidr_el0 mrs x10, tpidrro_el0 stp x9, x10, [x0, #CTX_TPIDR_EL0] mrs x11, dacr32_el2 mrs x12, ifsr32_el2 stp x11, x12, [x0, #CTX_DACR32_EL2] mrs x13, par_el1 mrs x14, far_el1 stp x13, x14, [x0, #CTX_PAR_EL1] mrs x15, afsr0_el1 mrs x16, afsr1_el1 stp x15, x16, [x0, #CTX_AFSR0_EL1] mrs x17, contextidr_el1 mrs x9, vbar_el1 stp x17, x9, [x0, #CTX_CONTEXTIDR_EL1] /* Save NS timer registers if the build has instructed so */ #if NS_TIMER_SWITCH mrs x10, cntp_ctl_el0 mrs x11, cntp_cval_el0 stp x10, x11, [x0, #CTX_CNTP_CTL_EL0] mrs x12, cntv_ctl_el0 mrs x13, cntv_cval_el0 stp x12, x13, [x0, #CTX_CNTV_CTL_EL0] mrs x14, cntkctl_el1 str x14, [x0, #CTX_CNTKCTL_EL1] #endif mrs x15, fpexc32_el2 str x15, [x0, #CTX_FP_FPEXC32_EL2] ret /* ----------------------------------------------------- * The following function strictly follows the AArch64 * PCS to use x9-x17 (temporary caller-saved registers) * to restore EL1 system register context. It assumes * that 'x0' is pointing to a 'el1_sys_regs' structure * from where the register context will be restored * ----------------------------------------------------- */ .global el1_sysregs_context_restore func el1_sysregs_context_restore ldp x9, x10, [x0, #CTX_SPSR_EL1] msr spsr_el1, x9 msr elr_el1, x10 ldp x11, x12, [x0, #CTX_SPSR_ABT] msr spsr_abt, x11 msr spsr_und, x12 ldp x13, x14, [x0, #CTX_SPSR_IRQ] msr spsr_irq, x13 msr spsr_fiq, x14 ldp x15, x16, [x0, #CTX_SCTLR_EL1] msr sctlr_el1, x15 msr actlr_el1, x16 ldp x17, x9, [x0, #CTX_CPACR_EL1] msr cpacr_el1, x17 msr csselr_el1, x9 ldp x10, x11, [x0, #CTX_SP_EL1] msr sp_el1, x10 msr esr_el1, x11 ldp x12, x13, [x0, #CTX_TTBR0_EL1] msr ttbr0_el1, x12 msr ttbr1_el1, x13 ldp x14, x15, [x0, #CTX_MAIR_EL1] msr mair_el1, x14 msr amair_el1, x15 ldp x16, x17, [x0, #CTX_TCR_EL1] msr tcr_el1, x16 msr tpidr_el1, x17 ldp x9, x10, [x0, #CTX_TPIDR_EL0] msr tpidr_el0, x9 msr tpidrro_el0, x10 ldp x11, x12, [x0, #CTX_DACR32_EL2] msr dacr32_el2, x11 msr ifsr32_el2, x12 ldp x13, x14, [x0, #CTX_PAR_EL1] msr par_el1, x13 msr far_el1, x14 ldp x15, x16, [x0, #CTX_AFSR0_EL1] msr afsr0_el1, x15 msr afsr1_el1, x16 ldp x17, x9, [x0, #CTX_CONTEXTIDR_EL1] msr contextidr_el1, x17 msr vbar_el1, x9 /* Restore NS timer registers if the build has instructed so */ #if NS_TIMER_SWITCH ldp x10, x11, [x0, #CTX_CNTP_CTL_EL0] msr cntp_ctl_el0, x10 msr cntp_cval_el0, x11 ldp x12, x13, [x0, #CTX_CNTV_CTL_EL0] msr cntv_ctl_el0, x12 msr cntv_cval_el0, x13 ldr x14, [x0, #CTX_CNTKCTL_EL1] msr cntkctl_el1, x14 #endif ldr x15, [x0, #CTX_FP_FPEXC32_EL2] msr fpexc32_el2, x15 /* No explict ISB required here as ERET covers it */ ret /* ----------------------------------------------------- * The following function follows the aapcs_64 strictly * to use x9-x17 (temporary caller-saved registers * according to AArch64 PCS) to save floating point * register context. It assumes that 'x0' is pointing to * a 'fp_regs' structure where the register context will * be saved. * * Access to VFP registers will trap if CPTR_EL3.TFP is * set. However currently we don't use VFP registers * nor set traps in Trusted Firmware, and assume it's * cleared * * TODO: Revisit when VFP is used in secure world * ----------------------------------------------------- */ #if CTX_INCLUDE_FPREGS .global fpregs_context_save func fpregs_context_save stp q0, q1, [x0, #CTX_FP_Q0] stp q2, q3, [x0, #CTX_FP_Q2] stp q4, q5, [x0, #CTX_FP_Q4] stp q6, q7, [x0, #CTX_FP_Q6] stp q8, q9, [x0, #CTX_FP_Q8] stp q10, q11, [x0, #CTX_FP_Q10] stp q12, q13, [x0, #CTX_FP_Q12] stp q14, q15, [x0, #CTX_FP_Q14] stp q16, q17, [x0, #CTX_FP_Q16] stp q18, q19, [x0, #CTX_FP_Q18] stp q20, q21, [x0, #CTX_FP_Q20] stp q22, q23, [x0, #CTX_FP_Q22] stp q24, q25, [x0, #CTX_FP_Q24] stp q26, q27, [x0, #CTX_FP_Q26] stp q28, q29, [x0, #CTX_FP_Q28] stp q30, q31, [x0, #CTX_FP_Q30] mrs x9, fpsr str x9, [x0, #CTX_FP_FPSR] mrs x10, fpcr str x10, [x0, #CTX_FP_FPCR] ret /* ----------------------------------------------------- * The following function follows the aapcs_64 strictly * to use x9-x17 (temporary caller-saved registers * according to AArch64 PCS) to restore floating point * register context. It assumes that 'x0' is pointing to * a 'fp_regs' structure from where the register context * will be restored. * * Access to VFP registers will trap if CPTR_EL3.TFP is * set. However currently we don't use VFP registers * nor set traps in Trusted Firmware, and assume it's * cleared * * TODO: Revisit when VFP is used in secure world * ----------------------------------------------------- */ .global fpregs_context_restore func fpregs_context_restore ldp q0, q1, [x0, #CTX_FP_Q0] ldp q2, q3, [x0, #CTX_FP_Q2] ldp q4, q5, [x0, #CTX_FP_Q4] ldp q6, q7, [x0, #CTX_FP_Q6] ldp q8, q9, [x0, #CTX_FP_Q8] ldp q10, q11, [x0, #CTX_FP_Q10] ldp q12, q13, [x0, #CTX_FP_Q12] ldp q14, q15, [x0, #CTX_FP_Q14] ldp q16, q17, [x0, #CTX_FP_Q16] ldp q18, q19, [x0, #CTX_FP_Q18] ldp q20, q21, [x0, #CTX_FP_Q20] ldp q22, q23, [x0, #CTX_FP_Q22] ldp q24, q25, [x0, #CTX_FP_Q24] ldp q26, q27, [x0, #CTX_FP_Q26] ldp q28, q29, [x0, #CTX_FP_Q28] ldp q30, q31, [x0, #CTX_FP_Q30] ldr x9, [x0, #CTX_FP_FPSR] msr fpsr, x9 str x10, [x0, #CTX_FP_FPCR] msr fpcr, x10 /* * No explict ISB required here as ERET to * swtich to secure EL1 or non-secure world * covers it */ ret #endif /* CTX_INCLUDE_FPREGS */ arm-trusted-firmware-1.0-aw-6/bl31/aarch64/cpu_data.S000066400000000000000000000060431322600646200221040ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include .globl init_cpu_data_ptr .globl _cpu_data_by_mpidr .globl _cpu_data_by_index /* ----------------------------------------------------------------- * void init_cpu_data_ptr(void) * * Initialise the TPIDR_EL3 register to refer to the cpu_data_t * for the calling CPU. This must be called before cm_get_cpu_data() * * This can be called without a valid stack. * clobbers: x0, x1, x9, x10 * ----------------------------------------------------------------- */ func init_cpu_data_ptr mov x10, x30 mrs x0, mpidr_el1 bl _cpu_data_by_mpidr msr tpidr_el3, x0 ret x10 /* ----------------------------------------------------------------- * cpu_data_t *_cpu_data_by_mpidr(uint64_t mpidr) * * Return the cpu_data structure for the CPU with given MPIDR * * This can be called without a valid stack. It assumes that * platform_get_core_pos() does not clobber register x9. * clobbers: x0, x1, x9 * ----------------------------------------------------------------- */ func _cpu_data_by_mpidr mov x9, x30 bl platform_get_core_pos mov x30, x9 b _cpu_data_by_index /* ----------------------------------------------------------------- * cpu_data_t *_cpu_data_by_index(uint32_t cpu_index) * * Return the cpu_data structure for the CPU with given linear index * * This can be called without a valid stack. * clobbers: x0, x1 * ----------------------------------------------------------------- */ func _cpu_data_by_index adr x1, percpu_data add x0, x1, x0, LSL #CPU_DATA_LOG2SIZE ret arm-trusted-firmware-1.0-aw-6/bl31/aarch64/crash_reporting.S000066400000000000000000000256621322600646200235250ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include .globl report_unhandled_exception .globl report_unhandled_interrupt .globl el3_panic #if CRASH_REPORTING #define REG_SIZE 0x8 /* ------------------------------------------------------ * The below section deals with dumping the system state * when an unhandled exception is taken in EL3. * The layout and the names of the registers which will * be dumped during a unhandled exception is given below. * ------------------------------------------------------ */ .section .rodata.crash_prints, "aS" print_spacer: .asciz " =\t\t0x" gp_regs: .asciz "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",\ "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",\ "x16", "x17", "x18", "x19", "x20", "x21", "x22",\ "x23", "x24", "x25", "x26", "x27", "x28", "x29", "" el3_sys_regs: .asciz "scr_el3", "sctlr_el3", "cptr_el3", "tcr_el3",\ "daif", "mair_el3", "spsr_el3", "elr_el3", "ttbr0_el3",\ "esr_el3", "far_el3", "" non_el3_sys_regs: .asciz "spsr_el1", "elr_el1", "spsr_abt", "spsr_und",\ "spsr_irq", "spsr_fiq", "sctlr_el1", "actlr_el1", "cpacr_el1",\ "csselr_el1", "sp_el1", "esr_el1", "ttbr0_el1", "ttbr1_el1",\ "mair_el1", "amair_el1", "tcr_el1", "tpidr_el1", "tpidr_el0",\ "tpidrro_el0", "dacr32_el2", "ifsr32_el2", "par_el1",\ "mpidr_el1", "afsr0_el1", "afsr1_el1", "contextidr_el1",\ "vbar_el1", "cntp_ctl_el0", "cntp_cval_el0", "cntv_ctl_el0",\ "cntv_cval_el0", "cntkctl_el1", "fpexc32_el2", "sp_el0", "" panic_msg: .asciz "PANIC in EL3 at x30 = 0x" excpt_msg: .asciz "Unhandled Exception in EL3.\nx30 =\t\t0x" intr_excpt_msg: .asciz "Unhandled Interrupt Exception in EL3.\nx30 =\t\t0x" /* * Helper function to print newline to console. */ func print_newline mov x0, '\n' b plat_crash_console_putc /* * Helper function to print from crash buf. * The print loop is controlled by the buf size and * ascii reg name list which is passed in x6. The * function returns the crash buf address in x0. * Clobbers : x0 - x7, sp */ func size_controlled_print /* Save the lr */ mov sp, x30 /* load the crash buf address */ mrs x7, tpidr_el3 test_size_list: /* Calculate x5 always as it will be clobbered by asm_print_hex */ mrs x5, tpidr_el3 add x5, x5, #CPU_DATA_CRASH_BUF_SIZE /* Test whether we have reached end of crash buf */ cmp x7, x5 b.eq exit_size_print ldrb w4, [x6] /* Test whether we are at end of list */ cbz w4, exit_size_print mov x4, x6 /* asm_print_str updates x4 to point to next entry in list */ bl asm_print_str /* update x6 with the updated list pointer */ mov x6, x4 adr x4, print_spacer bl asm_print_str ldr x4, [x7], #REG_SIZE bl asm_print_hex bl print_newline b test_size_list exit_size_print: mov x30, sp ret /* * Helper function to store x8 - x15 registers to * the crash buf. The system registers values are * copied to x8 to x15 by the caller which are then * copied to the crash buf by this function. * x0 points to the crash buf. It then calls * size_controlled_print to print to console. * Clobbers : x0 - x7, sp */ func str_in_crash_buf_print /* restore the crash buf address in x0 */ mrs x0, tpidr_el3 stp x8, x9, [x0] stp x10, x11, [x0, #REG_SIZE * 2] stp x12, x13, [x0, #REG_SIZE * 4] stp x14, x15, [x0, #REG_SIZE * 6] b size_controlled_print /* ------------------------------------------------------ * This macro calculates the offset to crash buf from * cpu_data and stores it in tpidr_el3. It also saves x0 * and x1 in the crash buf by using sp as a temporary * register. * ------------------------------------------------------ */ .macro prepare_crash_buf_save_x0_x1 /* we can corrupt this reg to free up x0 */ mov sp, x0 /* tpidr_el3 contains the address to cpu_data structure */ mrs x0, tpidr_el3 /* Calculate the Crash buffer offset in cpu_data */ add x0, x0, #CPU_DATA_CRASH_BUF_OFFSET /* Store crash buffer address in tpidr_el3 */ msr tpidr_el3, x0 str x1, [x0, #REG_SIZE] mov x1, sp str x1, [x0] .endm /* ----------------------------------------------------- * This function allows to report a crash (if crash * reporting is enabled) when an unhandled exception * occurs. It prints the CPU state via the crash console * making use of the crash buf. This function will * not return. * ----------------------------------------------------- */ func report_unhandled_exception prepare_crash_buf_save_x0_x1 adr x0, excpt_msg mov sp, x0 /* This call will not return */ b do_crash_reporting /* ----------------------------------------------------- * This function allows to report a crash (if crash * reporting is enabled) when an unhandled interrupt * occurs. It prints the CPU state via the crash console * making use of the crash buf. This function will * not return. * ----------------------------------------------------- */ func report_unhandled_interrupt prepare_crash_buf_save_x0_x1 adr x0, intr_excpt_msg mov sp, x0 /* This call will not return */ b do_crash_reporting /* ----------------------------------------------------- * This function allows to report a crash (if crash * reporting is enabled) when panic() is invoked from * C Runtime. It prints the CPU state via the crash * console making use of the crash buf. This function * will not return. * ----------------------------------------------------- */ func el3_panic msr spsel, #1 prepare_crash_buf_save_x0_x1 adr x0, panic_msg mov sp, x0 /* This call will not return */ b do_crash_reporting /* ------------------------------------------------------------ * The common crash reporting functionality. It requires x0 * and x1 has already been stored in crash buf, sp points to * crash message and tpidr_el3 contains the crash buf address. * The function does the following: * - Retrieve the crash buffer from tpidr_el3 * - Store x2 to x6 in the crash buffer * - Initialise the crash console. * - Print the crash message by using the address in sp. * - Print x30 value to the crash console. * - Print x0 - x7 from the crash buf to the crash console. * - Print x8 - x29 (in groups of 8 registers) using the * crash buf to the crash console. * - Print el3 sys regs (in groups of 8 registers) using the * crash buf to the crash console. * - Print non el3 sys regs (in groups of 8 registers) using * the crash buf to the crash console. * ------------------------------------------------------------ */ func do_crash_reporting /* Retrieve the crash buf from tpidr_el3 */ mrs x0, tpidr_el3 /* Store x2 - x6, x30 in the crash buffer */ stp x2, x3, [x0, #REG_SIZE * 2] stp x4, x5, [x0, #REG_SIZE * 4] stp x6, x30, [x0, #REG_SIZE * 6] /* Initialize the crash console */ bl plat_crash_console_init /* Verify the console is initialized */ cbz x0, crash_panic /* Print the crash message. sp points to the crash message */ mov x4, sp bl asm_print_str /* load the crash buf address */ mrs x0, tpidr_el3 /* report x30 first from the crash buf */ ldr x4, [x0, #REG_SIZE * 7] bl asm_print_hex bl print_newline /* Load the crash buf address */ mrs x0, tpidr_el3 /* Now mov x7 into crash buf */ str x7, [x0, #REG_SIZE * 7] /* Report x0 - x29 values stored in crash buf*/ /* Store the ascii list pointer in x6 */ adr x6, gp_regs /* Print x0 to x7 from the crash buf */ bl size_controlled_print /* Store x8 - x15 in crash buf and print */ bl str_in_crash_buf_print /* Load the crash buf address */ mrs x0, tpidr_el3 /* Store the rest of gp regs and print */ stp x16, x17, [x0] stp x18, x19, [x0, #REG_SIZE * 2] stp x20, x21, [x0, #REG_SIZE * 4] stp x22, x23, [x0, #REG_SIZE * 6] bl size_controlled_print /* Load the crash buf address */ mrs x0, tpidr_el3 stp x24, x25, [x0] stp x26, x27, [x0, #REG_SIZE * 2] stp x28, x29, [x0, #REG_SIZE * 4] bl size_controlled_print /* Print the el3 sys registers */ adr x6, el3_sys_regs mrs x8, scr_el3 mrs x9, sctlr_el3 mrs x10, cptr_el3 mrs x11, tcr_el3 mrs x12, daif mrs x13, mair_el3 mrs x14, spsr_el3 mrs x15, elr_el3 bl str_in_crash_buf_print mrs x8, ttbr0_el3 mrs x9, esr_el3 mrs x10, far_el3 bl str_in_crash_buf_print /* Print the non el3 sys registers */ adr x6, non_el3_sys_regs mrs x8, spsr_el1 mrs x9, elr_el1 mrs x10, spsr_abt mrs x11, spsr_und mrs x12, spsr_irq mrs x13, spsr_fiq mrs x14, sctlr_el1 mrs x15, actlr_el1 bl str_in_crash_buf_print mrs x8, cpacr_el1 mrs x9, csselr_el1 mrs x10, sp_el1 mrs x11, esr_el1 mrs x12, ttbr0_el1 mrs x13, ttbr1_el1 mrs x14, mair_el1 mrs x15, amair_el1 bl str_in_crash_buf_print mrs x8, tcr_el1 mrs x9, tpidr_el1 mrs x10, tpidr_el0 mrs x11, tpidrro_el0 mrs x12, dacr32_el2 mrs x13, ifsr32_el2 mrs x14, par_el1 mrs x15, mpidr_el1 bl str_in_crash_buf_print mrs x8, afsr0_el1 mrs x9, afsr1_el1 mrs x10, contextidr_el1 mrs x11, vbar_el1 mrs x12, cntp_ctl_el0 mrs x13, cntp_cval_el0 mrs x14, cntv_ctl_el0 mrs x15, cntv_cval_el0 bl str_in_crash_buf_print mrs x8, cntkctl_el1 mrs x9, fpexc32_el2 mrs x10, sp_el0 bl str_in_crash_buf_print /* Get the cpu specific registers to report */ bl do_cpu_reg_dump bl str_in_crash_buf_print /* Print the gic registers */ plat_print_gic_regs /* Print the interconnect registers */ plat_print_interconnect_regs /* Done reporting */ b crash_panic #else /* CRASH_REPORTING */ func report_unhandled_exception report_unhandled_interrupt: b crash_panic #endif /* CRASH_REPORING */ func crash_panic b crash_panic arm-trusted-firmware-1.0-aw-6/bl31/aarch64/runtime_exceptions.S000066400000000000000000000416351322600646200242560ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include .globl runtime_exceptions .globl el3_exit /* ----------------------------------------------------- * Handle SMC exceptions separately from other sync. * exceptions. * ----------------------------------------------------- */ .macro handle_sync_exception /* Enable the SError interrupt */ msr daifclr, #DAIF_ABT_BIT str x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] mrs x30, esr_el3 ubfx x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTH cmp x30, #EC_AARCH32_SMC b.eq smc_handler32 cmp x30, #EC_AARCH64_SMC b.eq smc_handler64 /* ----------------------------------------------------- * The following code handles any synchronous exception * that is not an SMC. * ----------------------------------------------------- */ bl report_unhandled_exception .endm /* ----------------------------------------------------- * This macro handles FIQ or IRQ interrupts i.e. EL3, * S-EL1 and NS interrupts. * ----------------------------------------------------- */ .macro handle_interrupt_exception label /* Enable the SError interrupt */ msr daifclr, #DAIF_ABT_BIT str x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] bl save_gp_registers /* Switch to the runtime stack i.e. SP_EL0 */ ldr x2, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] mov x20, sp msr spsel, #0 mov sp, x2 /* * Find out whether this is a valid interrupt type. If the * interrupt controller reports a spurious interrupt then * return to where we came from. */ bl plat_ic_get_pending_interrupt_type cmp x0, #INTR_TYPE_INVAL b.eq interrupt_exit_\label /* * Get the registered handler for this interrupt type. A * NULL return value implies that an interrupt was generated * for which there is no handler registered or the interrupt * was routed incorrectly. This is a problem of the framework * so report it as an error. */ bl get_interrupt_type_handler cbz x0, interrupt_error_\label mov x21, x0 mov x0, #INTR_ID_UNAVAILABLE #if IMF_READ_INTERRUPT_ID /* * Read the id of the highest priority pending interrupt. If * no interrupt is asserted then return to where we came from. */ mov x19, #INTR_ID_UNAVAILABLE bl plat_ic_get_pending_interrupt_id cmp x19, x0 b.eq interrupt_exit_\label #endif /* * Save the EL3 system registers needed to return from * this exception. */ mrs x3, spsr_el3 mrs x4, elr_el3 stp x3, x4, [x20, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] /* Set the current security state in the 'flags' parameter */ mrs x2, scr_el3 ubfx x1, x2, #0, #1 /* Restore the reference to the 'handle' i.e. SP_EL3 */ mov x2, x20 /* x3 will point to a cookie (not used now) */ mov x3, xzr /* Call the interrupt type handler */ blr x21 interrupt_exit_\label: /* Return from exception, possibly in a different security state */ b el3_exit /* * This label signifies a problem with the interrupt management * framework where it is not safe to go back to the instruction * where the interrupt was generated. */ interrupt_error_\label: bl report_unhandled_interrupt .endm .macro save_x18_to_x29_sp_el0 stp x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18] stp x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20] stp x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22] stp x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24] stp x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26] stp x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28] mrs x18, sp_el0 str x18, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_SP_EL0] .endm .section .vectors, "ax"; .align 11 .align 7 runtime_exceptions: /* ----------------------------------------------------- * Current EL with _sp_el0 : 0x0 - 0x200 * ----------------------------------------------------- */ sync_exception_sp_el0: /* ----------------------------------------------------- * We don't expect any synchronous exceptions from EL3 * ----------------------------------------------------- */ bl report_unhandled_exception check_vector_size sync_exception_sp_el0 .align 7 /* ----------------------------------------------------- * EL3 code is non-reentrant. Any asynchronous exception * is a serious error. Loop infinitely. * ----------------------------------------------------- */ irq_sp_el0: bl report_unhandled_interrupt check_vector_size irq_sp_el0 .align 7 fiq_sp_el0: bl report_unhandled_interrupt check_vector_size fiq_sp_el0 .align 7 serror_sp_el0: bl report_unhandled_exception check_vector_size serror_sp_el0 /* ----------------------------------------------------- * Current EL with SPx: 0x200 - 0x400 * ----------------------------------------------------- */ .align 7 sync_exception_sp_elx: /* ----------------------------------------------------- * This exception will trigger if anything went wrong * during a previous exception entry or exit or while * handling an earlier unexpected synchronous exception. * There is a high probability that SP_EL3 is corrupted. * ----------------------------------------------------- */ bl report_unhandled_exception check_vector_size sync_exception_sp_elx .align 7 irq_sp_elx: bl report_unhandled_interrupt check_vector_size irq_sp_elx .align 7 fiq_sp_elx: bl report_unhandled_interrupt check_vector_size fiq_sp_elx .align 7 serror_sp_elx: bl report_unhandled_exception check_vector_size serror_sp_elx /* ----------------------------------------------------- * Lower EL using AArch64 : 0x400 - 0x600 * ----------------------------------------------------- */ .align 7 sync_exception_aarch64: /* ----------------------------------------------------- * This exception vector will be the entry point for * SMCs and traps that are unhandled at lower ELs most * commonly. SP_EL3 should point to a valid cpu context * where the general purpose and system register state * can be saved. * ----------------------------------------------------- */ handle_sync_exception check_vector_size sync_exception_aarch64 .align 7 /* ----------------------------------------------------- * Asynchronous exceptions from lower ELs are not * currently supported. Report their occurrence. * ----------------------------------------------------- */ irq_aarch64: handle_interrupt_exception irq_aarch64 check_vector_size irq_aarch64 .align 7 fiq_aarch64: handle_interrupt_exception fiq_aarch64 check_vector_size fiq_aarch64 .align 7 serror_aarch64: bl report_unhandled_exception check_vector_size serror_aarch64 /* ----------------------------------------------------- * Lower EL using AArch32 : 0x600 - 0x800 * ----------------------------------------------------- */ .align 7 sync_exception_aarch32: /* ----------------------------------------------------- * This exception vector will be the entry point for * SMCs and traps that are unhandled at lower ELs most * commonly. SP_EL3 should point to a valid cpu context * where the general purpose and system register state * can be saved. * ----------------------------------------------------- */ handle_sync_exception check_vector_size sync_exception_aarch32 .align 7 /* ----------------------------------------------------- * Asynchronous exceptions from lower ELs are not * currently supported. Report their occurrence. * ----------------------------------------------------- */ irq_aarch32: handle_interrupt_exception irq_aarch32 check_vector_size irq_aarch32 .align 7 fiq_aarch32: handle_interrupt_exception fiq_aarch32 check_vector_size fiq_aarch32 .align 7 serror_aarch32: bl report_unhandled_exception check_vector_size serror_aarch32 .align 7 /* ----------------------------------------------------- * The following code handles secure monitor calls. * Depending upon the execution state from where the SMC * has been invoked, it frees some general purpose * registers to perform the remaining tasks. They * involve finding the runtime service handler that is * the target of the SMC & switching to runtime stacks * (SP_EL0) before calling the handler. * * Note that x30 has been explicitly saved and can be * used here * ----------------------------------------------------- */ func smc_handler smc_handler32: /* Check whether aarch32 issued an SMC64 */ tbnz x0, #FUNCID_CC_SHIFT, smc_prohibited /* ----------------------------------------------------- * Since we're are coming from aarch32, x8-x18 need to * be saved as per SMC32 calling convention. If a lower * EL in aarch64 is making an SMC32 call then it must * have saved x8-x17 already therein. * ----------------------------------------------------- */ stp x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8] stp x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10] stp x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12] stp x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14] stp x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16] /* x4-x7, x18, sp_el0 are saved below */ smc_handler64: /* ----------------------------------------------------- * Populate the parameters for the SMC handler. We * already have x0-x4 in place. x5 will point to a * cookie (not used now). x6 will point to the context * structure (SP_EL3) and x7 will contain flags we need * to pass to the handler Hence save x5-x7. Note that x4 * only needs to be preserved for AArch32 callers but we * do it for AArch64 callers as well for convenience * ----------------------------------------------------- */ stp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] stp x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6] /* Save rest of the gpregs and sp_el0*/ save_x18_to_x29_sp_el0 mov x5, xzr mov x6, sp /* Get the unique owning entity number */ ubfx x16, x0, #FUNCID_OEN_SHIFT, #FUNCID_OEN_WIDTH ubfx x15, x0, #FUNCID_TYPE_SHIFT, #FUNCID_TYPE_WIDTH orr x16, x16, x15, lsl #FUNCID_OEN_WIDTH adr x11, (__RT_SVC_DESCS_START__ + RT_SVC_DESC_HANDLE) /* Load descriptor index from array of indices */ adr x14, rt_svc_descs_indices ldrb w15, [x14, x16] /* ----------------------------------------------------- * Restore the saved C runtime stack value which will * become the new SP_EL0 i.e. EL3 runtime stack. It was * saved in the 'cpu_context' structure prior to the last * ERET from EL3. * ----------------------------------------------------- */ ldr x12, [x6, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] /* * Any index greater than 127 is invalid. Check bit 7 for * a valid index */ tbnz w15, 7, smc_unknown /* Switch to SP_EL0 */ msr spsel, #0 /* ----------------------------------------------------- * Get the descriptor using the index * x11 = (base + off), x15 = index * * handler = (base + off) + (index << log2(size)) * ----------------------------------------------------- */ lsl w10, w15, #RT_SVC_SIZE_LOG2 ldr x15, [x11, w10, uxtw] /* ----------------------------------------------------- * Save the SPSR_EL3, ELR_EL3, & SCR_EL3 in case there * is a world switch during SMC handling. * TODO: Revisit if all system registers can be saved * later. * ----------------------------------------------------- */ mrs x16, spsr_el3 mrs x17, elr_el3 mrs x18, scr_el3 stp x16, x17, [x6, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] str x18, [x6, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] /* Copy SCR_EL3.NS bit to the flag to indicate caller's security */ bfi x7, x18, #0, #1 mov sp, x12 /* ----------------------------------------------------- * Call the Secure Monitor Call handler and then drop * directly into el3_exit() which will program any * remaining architectural state prior to issuing the * ERET to the desired lower EL. * ----------------------------------------------------- */ #if DEBUG cbz x15, rt_svc_fw_critical_error #endif blr x15 /* ----------------------------------------------------- * This routine assumes that the SP_EL3 is pointing to * a valid context structure from where the gp regs and * other special registers can be retrieved. * * Keep it in the same section as smc_handler as this * function uses a fall-through to el3_exit * ----------------------------------------------------- */ el3_exit: ; .type el3_exit, %function /* ----------------------------------------------------- * Save the current SP_EL0 i.e. the EL3 runtime stack * which will be used for handling the next SMC. Then * switch to SP_EL3 * ----------------------------------------------------- */ mov x17, sp msr spsel, #1 str x17, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] /* ----------------------------------------------------- * Restore SPSR_EL3, ELR_EL3 and SCR_EL3 prior to ERET * ----------------------------------------------------- */ ldr x18, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] ldp x16, x17, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] msr scr_el3, x18 msr spsr_el3, x16 msr elr_el3, x17 /* Restore saved general purpose registers and return */ b restore_gp_registers_eret smc_unknown: /* * Here we restore x4-x18 regardless of where we came from. AArch32 * callers will find the registers contents unchanged, but AArch64 * callers will find the registers modified (with stale earlier NS * content). Either way, we aren't leaking any secure information * through them */ mov w0, #SMC_UNK b restore_gp_registers_callee_eret smc_prohibited: ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] mov w0, #SMC_UNK eret rt_svc_fw_critical_error: msr spsel, #1 /* Switch to SP_ELx */ bl report_unhandled_exception /* ----------------------------------------------------- * The following functions are used to saved and restore * all the general pupose registers. Ideally we would * only save and restore the callee saved registers when * a world switch occurs but that type of implementation * is more complex. So currently we will always save and * restore these registers on entry and exit of EL3. * These are not macros to ensure their invocation fits * within the 32 instructions per exception vector. * ----------------------------------------------------- */ func save_gp_registers stp x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0] stp x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2] stp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] stp x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6] stp x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8] stp x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10] stp x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12] stp x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14] stp x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16] save_x18_to_x29_sp_el0 ret func restore_gp_registers_eret ldp x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0] ldp x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2] restore_gp_registers_callee_eret: ldp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] ldp x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6] ldp x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8] ldp x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10] ldp x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12] ldp x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14] ldp x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18] ldp x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20] ldp x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22] ldp x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24] ldp x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26] ldp x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28] ldp x30, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] msr sp_el0, x17 ldp x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16] eret arm-trusted-firmware-1.0-aw-6/bl31/bl31.ld.S000066400000000000000000000112011322600646200202230ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT) OUTPUT_ARCH(PLATFORM_LINKER_ARCH) MEMORY { RAM (rwx): ORIGIN = BL31_BASE, LENGTH = BL31_LIMIT - BL31_BASE } SECTIONS { . = BL31_BASE; ASSERT(. == ALIGN(4096), "BL31_BASE address is not aligned on a page boundary.") ro . : { __RO_START__ = .; KEEP(*bl31_entrypoint.o(.text*)) *(.text*) *(.rodata*) /* Ensure 8-byte alignment for descriptors and ensure inclusion */ . = ALIGN(8); __RT_SVC_DESCS_START__ = .; KEEP(*(rt_svc_descs)) __RT_SVC_DESCS_END__ = .; /* * Ensure 8-byte alignment for cpu_ops so that its fields are also * aligned. Also ensure cpu_ops inclusion. */ . = ALIGN(8); __CPU_OPS_START__ = .; KEEP(*(cpu_ops)) __CPU_OPS_END__ = .; *(.vectors) __RO_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked as read-only, * executable. No RW data from the next section must creep in. * Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __RO_END__ = .; } >RAM ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__, "cpu_ops not defined for this platform.") .data . : { __DATA_START__ = .; *(.data*) __DATA_END__ = .; } >RAM #ifdef BL31_PROGBITS_LIMIT ASSERT(. <= BL31_PROGBITS_LIMIT, "BL3-1 progbits has exceeded its limit.") #endif stacks (NOLOAD) : { __STACKS_START__ = .; *(tzfw_normal_stacks) __STACKS_END__ = .; } >RAM /* * The .bss section gets initialised to 0 at runtime. * Its base address must be 16-byte aligned. */ .bss : ALIGN(16) { __BSS_START__ = .; *(.bss*) *(COMMON) __BSS_END__ = .; } >RAM /* * The xlat_table section is for full, aligned page tables (4K). * Removing them from .bss avoids forcing 4K alignment on * the .bss section and eliminates the unecessary zero init */ xlat_table (NOLOAD) : { *(xlat_table) } >RAM /* * The base address of the coherent memory section must be page-aligned (4K) * to guarantee that the coherent data are stored on their own pages and * are not mixed with normal data. This is required to set up the correct * memory attributes for the coherent data page tables. */ coherent_ram (NOLOAD) : ALIGN(4096) { __COHERENT_RAM_START__ = .; *(tzfw_coherent_mem) __COHERENT_RAM_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked * as device memory. No other unexpected data must creep in. * Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __COHERENT_RAM_END__ = .; } >RAM __BL31_END__ = .; __BSS_SIZE__ = SIZEOF(.bss); __COHERENT_RAM_UNALIGNED_SIZE__ = __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__; ASSERT(. <= BL31_LIMIT, "BL3-1 image has exceeded its limit.") } arm-trusted-firmware-1.0-aw-6/bl31/bl31.mk000066400000000000000000000060051322600646200200400ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # BL31_SOURCES+= bl31/bl31_main.c \ bl31/context_mgmt.c \ bl31/cpu_data_array.c \ bl31/runtime_svc.c \ bl31/interrupt_mgmt.c \ bl31/aarch64/bl31_arch_setup.c \ bl31/aarch64/bl31_entrypoint.S \ bl31/aarch64/context.S \ bl31/aarch64/cpu_data.S \ bl31/aarch64/runtime_exceptions.S \ bl31/aarch64/crash_reporting.S \ lib/cpus/aarch64/cpu_helpers.S \ lib/locks/bakery/bakery_lock.c \ lib/locks/exclusive/spinlock.S \ services/std_svc/std_svc_setup.c \ services/std_svc/psci/psci_afflvl_off.c \ services/std_svc/psci/psci_afflvl_on.c \ services/std_svc/psci/psci_afflvl_suspend.c \ services/std_svc/psci/psci_common.c \ services/std_svc/psci/psci_entry.S \ services/std_svc/psci/psci_helpers.S \ services/std_svc/psci/psci_main.c \ services/std_svc/psci/psci_setup.c \ services/std_svc/psci/psci_system_off.c BL31_LINKERFILE := bl31/bl31.ld.S # Flag used by the generic interrupt management framework to determine if # upon the assertion of an interrupt, it should pass the interrupt id or not IMF_READ_INTERRUPT_ID := 0 $(eval $(call assert_boolean,IMF_READ_INTERRUPT_ID)) $(eval $(call add_define,IMF_READ_INTERRUPT_ID)) # Flag used to inidicate if Crash reporting via console should be included # in BL3-1. This defaults to being present in DEBUG builds only ifndef CRASH_REPORTING CRASH_REPORTING := $(DEBUG) endif $(eval $(call assert_boolean,CRASH_REPORTING)) $(eval $(call add_define,CRASH_REPORTING)) arm-trusted-firmware-1.0-aw-6/bl31/bl31_main.c000066400000000000000000000154411322600646200206630ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include /******************************************************************************* * This function pointer is used to initialise the BL32 image. It's initialized * by SPD calling bl31_register_bl32_init after setting up all things necessary * for SP execution. In cases where both SPD and SP are absent, or when SPD * finds it impossible to execute SP, this pointer is left as NULL ******************************************************************************/ static int32_t (*bl32_init)(void); /******************************************************************************* * Variable to indicate whether next image to execute after BL31 is BL33 * (non-secure & default) or BL32 (secure). ******************************************************************************/ static uint32_t next_image_type = NON_SECURE; /******************************************************************************* * Simple function to initialise all BL31 helper libraries. ******************************************************************************/ void bl31_lib_init(void) { cm_init(); } /******************************************************************************* * BL31 is responsible for setting up the runtime services for the primary cpu * before passing control to the bootloader or an Operating System. This * function calls runtime_svc_init() which initializes all registered runtime * services. The run time services would setup enough context for the core to * swtich to the next exception level. When this function returns, the core will * switch to the programmed exception level via. an ERET. ******************************************************************************/ void bl31_main(void) { NOTICE("BL3-1: %s\n", version_string); NOTICE("BL3-1: %s\n", build_message); /* Perform remaining generic architectural setup from EL3 */ bl31_arch_setup(); /* Perform platform setup in BL1 */ bl31_platform_setup(); /* Initialise helper libraries */ bl31_lib_init(); /* Initialize the runtime services e.g. psci */ INFO("BL3-1: Initializing runtime services\n"); runtime_svc_init(); /* Clean caches before re-entering normal world */ dcsw_op_all(DCCSW); /* * All the cold boot actions on the primary cpu are done. We now need to * decide which is the next image (BL32 or BL33) and how to execute it. * If the SPD runtime service is present, it would want to pass control * to BL32 first in S-EL1. In that case, SPD would have registered a * function to intialize bl32 where it takes responsibility of entering * S-EL1 and returning control back to bl31_main. Once this is done we * can prepare entry into BL33 as normal. */ /* * If SPD had registerd an init hook, invoke it. */ if (bl32_init) { INFO("BL3-1: Initializing BL3-2\n"); (*bl32_init)(); } /* * We are ready to enter the next EL. Prepare entry into the image * corresponding to the desired security state after the next ERET. */ bl31_prepare_next_image_entry(); } /******************************************************************************* * Accessor functions to help runtime services decide which image should be * executed after BL31. This is BL33 or the non-secure bootloader image by * default but the Secure payload dispatcher could override this by requesting * an entry into BL32 (Secure payload) first. If it does so then it should use * the same API to program an entry into BL33 once BL32 initialisation is * complete. ******************************************************************************/ void bl31_set_next_image_type(uint32_t security_state) { assert(sec_state_is_valid(security_state)); next_image_type = security_state; } uint32_t bl31_get_next_image_type(void) { return next_image_type; } /******************************************************************************* * This function programs EL3 registers and performs other setup to enable entry * into the next image after BL31 at the next ERET. ******************************************************************************/ void bl31_prepare_next_image_entry(void) { entry_point_info_t *next_image_info; uint32_t image_type; /* Determine which image to execute next */ image_type = bl31_get_next_image_type(); /* Program EL3 registers to enable entry into the next EL */ next_image_info = bl31_plat_get_next_image_ep_info(image_type); assert(next_image_info); assert(image_type == GET_SECURITY_STATE(next_image_info->h.attr)); INFO("BL3-1: Preparing for EL3 exit to %s world\n", (image_type == SECURE) ? "secure" : "normal"); INFO("BL3-1: Next image address: 0x%lx, SPSR: 0x%x\n", next_image_info->pc, next_image_info->spsr); cm_init_context(read_mpidr_el1(), next_image_info); cm_prepare_el3_exit(image_type); } /******************************************************************************* * This function initializes the pointer to BL32 init function. This is expected * to be called by the SPD after it finishes all its initialization ******************************************************************************/ void bl31_register_bl32_init(int32_t (*func)(void)) { bl32_init = func; } arm-trusted-firmware-1.0-aw-6/bl31/context_mgmt.c000066400000000000000000000335441322600646200216320ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /******************************************************************************* * Context management library initialisation routine. This library is used by * runtime services to share pointers to 'cpu_context' structures for the secure * and non-secure states. Management of the structures and their associated * memory is not done by the context management library e.g. the PSCI service * manages the cpu context used for entry from and exit to the non-secure state. * The Secure payload dispatcher service manages the context(s) corresponding to * the secure state. It also uses this library to get access to the non-secure * state cpu context pointers. * Lastly, this library provides the api to make SP_EL3 point to the cpu context * which will used for programming an entry into a lower EL. The same context * will used to save state upon exception entry from that EL. ******************************************************************************/ void cm_init(void) { /* * The context management library has only global data to intialize, but * that will be done when the BSS is zeroed out */ } /******************************************************************************* * This function returns a pointer to the most recent 'cpu_context' structure * for the CPU identified by MPIDR that was set as the context for the specified * security state. NULL is returned if no such structure has been specified. ******************************************************************************/ void *cm_get_context_by_mpidr(uint64_t mpidr, uint32_t security_state) { assert(sec_state_is_valid(security_state)); return get_cpu_data_by_mpidr(mpidr, cpu_context[security_state]); } /******************************************************************************* * This function sets the pointer to the current 'cpu_context' structure for the * specified security state for the CPU identified by MPIDR ******************************************************************************/ void cm_set_context_by_mpidr(uint64_t mpidr, void *context, uint32_t security_state) { assert(sec_state_is_valid(security_state)); set_cpu_data_by_mpidr(mpidr, cpu_context[security_state], context); } /******************************************************************************* * This function is used to program the context that's used for exception * return. This initializes the SP_EL3 to a pointer to a 'cpu_context' set for * the required security state ******************************************************************************/ static inline void cm_set_next_context(void *context) { #if DEBUG uint64_t sp_mode; /* * Check that this function is called with SP_EL0 as the stack * pointer */ __asm__ volatile("mrs %0, SPSel\n" : "=r" (sp_mode)); assert(sp_mode == MODE_SP_EL0); #endif __asm__ volatile("msr spsel, #1\n" "mov sp, %0\n" "msr spsel, #0\n" : : "r" (context)); } /******************************************************************************* * The following function initializes a cpu_context for the current CPU for * first use, and sets the initial entrypoint state as specified by the * entry_point_info structure. * * The security state to initialize is determined by the SECURE attribute * of the entry_point_info. The function returns a pointer to the initialized * context and sets this as the next context to return to. * * The EE and ST attributes are used to configure the endianess and secure * timer availability for the new excution context. * * To prepare the register state for entry call cm_prepare_el3_exit() and * el3_exit(). For Secure-EL1 cm_prepare_el3_exit() is equivalent to * cm_e1_sysreg_context_restore(). ******************************************************************************/ void cm_init_context(uint64_t mpidr, const entry_point_info_t *ep) { uint32_t security_state; cpu_context_t *ctx; uint32_t scr_el3; el3_state_t *state; gp_regs_t *gp_regs; unsigned long sctlr_elx; security_state = GET_SECURITY_STATE(ep->h.attr); ctx = cm_get_context_by_mpidr(mpidr, security_state); assert(ctx); /* Clear any residual register values from the context */ memset(ctx, 0, sizeof(*ctx)); /* * Base the context SCR on the current value, adjust for entry point * specific requirements and set trap bits from the IMF * TODO: provide the base/global SCR bits using another mechanism? */ scr_el3 = read_scr(); scr_el3 &= ~(SCR_NS_BIT | SCR_RW_BIT | SCR_FIQ_BIT | SCR_IRQ_BIT | SCR_ST_BIT | SCR_HCE_BIT); if (security_state != SECURE) scr_el3 |= SCR_NS_BIT; if (GET_RW(ep->spsr) == MODE_RW_64) scr_el3 |= SCR_RW_BIT; if (EP_GET_ST(ep->h.attr)) scr_el3 |= SCR_ST_BIT; scr_el3 |= get_scr_el3_from_routing_model(security_state); /* * Set up SCTLR_ELx for the target exception level: * EE bit is taken from the entrpoint attributes * M, C and I bits must be zero (as required by PSCI specification) * * The target exception level is based on the spsr mode requested. * If execution is requested to EL2 or hyp mode, HVC is enabled * via SCR_EL3.HCE. * * Always compute the SCTLR_EL1 value and save in the cpu_context * - the EL2 registers are set up by cm_preapre_ns_entry() as they * are not part of the stored cpu_context * * TODO: In debug builds the spsr should be validated and checked * against the CPU support, security state, endianess and pc */ sctlr_elx = EP_GET_EE(ep->h.attr) ? SCTLR_EE_BIT : 0; sctlr_elx |= SCTLR_EL1_RES1; //if use AA32 SVC if(GET_M32(ep->spsr) == MODE32_svc) { sctlr_elx |= 1<<5;//AArch32 CP15 barrier operations enabled } write_ctx_reg(get_sysregs_ctx(ctx), CTX_SCTLR_EL1, sctlr_elx); if ((GET_RW(ep->spsr) == MODE_RW_64 && GET_EL(ep->spsr) == MODE_EL2) || (GET_RW(ep->spsr) != MODE_RW_64 && GET_M32(ep->spsr) == MODE32_hyp)) { scr_el3 |= SCR_HCE_BIT; } /* Populate EL3 state so that we've the right context before doing ERET */ state = get_el3state_ctx(ctx); write_ctx_reg(state, CTX_SCR_EL3, scr_el3); write_ctx_reg(state, CTX_ELR_EL3, ep->pc); write_ctx_reg(state, CTX_SPSR_EL3, ep->spsr); /* * Store the X0-X7 value from the entrypoint into the context * Use memcpy as we are in control of the layout of the structures */ gp_regs = get_gpregs_ctx(ctx); memcpy(gp_regs, (void *)&ep->args, sizeof(aapcs64_params_t)); } /******************************************************************************* * Prepare the CPU system registers for first entry into secure or normal world * * If execution is requested to EL2 or hyp mode, SCTLR_EL2 is initialized * If execution is requested to non-secure EL1 or svc mode, and the CPU supports * EL2 then EL2 is disabled by configuring all necessary EL2 registers. * For all entries, the EL1 registers are initialized from the cpu_context ******************************************************************************/ void cm_prepare_el3_exit(uint32_t security_state) { uint32_t sctlr_elx, scr_el3, cptr_el2; cpu_context_t *ctx = cm_get_context(security_state); assert(ctx); if (security_state == NON_SECURE) { scr_el3 = read_ctx_reg(get_el3state_ctx(ctx), CTX_SCR_EL3); if (scr_el3 & SCR_HCE_BIT) { /* Use SCTLR_EL1.EE value to initialise sctlr_el2 */ sctlr_elx = read_ctx_reg(get_sysregs_ctx(ctx), CTX_SCTLR_EL1); sctlr_elx &= ~SCTLR_EE_BIT; sctlr_elx |= SCTLR_EL2_RES1; write_sctlr_el2(sctlr_elx); } else if (read_id_aa64pfr0_el1() & (ID_AA64PFR0_ELX_MASK << ID_AA64PFR0_EL2_SHIFT)) { /* EL2 present but unused, need to disable safely */ /* HCR_EL2 = 0, except RW bit set to match SCR_EL3 */ write_hcr_el2((scr_el3 & SCR_RW_BIT) ? HCR_RW_BIT : 0); /* SCTLR_EL2 : can be ignored when bypassing */ /* CPTR_EL2 : disable all traps TCPAC, TTA, TFP */ cptr_el2 = read_cptr_el2(); cptr_el2 &= ~(TCPAC_BIT | TTA_BIT | TFP_BIT); write_cptr_el2(cptr_el2); /* Enable EL1 access to timer */ write_cnthctl_el2(EL1PCEN_BIT | EL1PCTEN_BIT); /* Set VPIDR, VMPIDR to match MIDR, MPIDR */ write_vpidr_el2(read_midr_el1()); write_vmpidr_el2(read_mpidr_el1()); } } el1_sysregs_context_restore(get_sysregs_ctx(ctx)); cm_set_next_context(ctx); } /******************************************************************************* * The next four functions are used by runtime services to save and restore * EL1 context on the 'cpu_context' structure for the specified security * state. ******************************************************************************/ void cm_el1_sysregs_context_save(uint32_t security_state) { cpu_context_t *ctx; ctx = cm_get_context(security_state); assert(ctx); el1_sysregs_context_save(get_sysregs_ctx(ctx)); } void cm_el1_sysregs_context_restore(uint32_t security_state) { cpu_context_t *ctx; ctx = cm_get_context(security_state); assert(ctx); el1_sysregs_context_restore(get_sysregs_ctx(ctx)); } /******************************************************************************* * This function populates ELR_EL3 member of 'cpu_context' pertaining to the * given security state with the given entrypoint ******************************************************************************/ void cm_set_elr_el3(uint32_t security_state, uint64_t entrypoint) { cpu_context_t *ctx; el3_state_t *state; ctx = cm_get_context(security_state); assert(ctx); /* Populate EL3 state so that ERET jumps to the correct entry */ state = get_el3state_ctx(ctx); write_ctx_reg(state, CTX_ELR_EL3, entrypoint); } /******************************************************************************* * This function populates ELR_EL3 and SPSR_EL3 members of 'cpu_context' * pertaining to the given security state ******************************************************************************/ void cm_set_elr_spsr_el3(uint32_t security_state, uint64_t entrypoint, uint32_t spsr) { cpu_context_t *ctx; el3_state_t *state; ctx = cm_get_context(security_state); assert(ctx); /* Populate EL3 state so that ERET jumps to the correct entry */ state = get_el3state_ctx(ctx); write_ctx_reg(state, CTX_ELR_EL3, entrypoint); write_ctx_reg(state, CTX_SPSR_EL3, spsr); } /******************************************************************************* * This function updates a single bit in the SCR_EL3 member of the 'cpu_context' * pertaining to the given security state using the value and bit position * specified in the parameters. It preserves all other bits. ******************************************************************************/ void cm_write_scr_el3_bit(uint32_t security_state, uint32_t bit_pos, uint32_t value) { cpu_context_t *ctx; el3_state_t *state; uint32_t scr_el3; ctx = cm_get_context(security_state); assert(ctx); /* Ensure that the bit position is a valid one */ assert((1 << bit_pos) & SCR_VALID_BIT_MASK); /* Ensure that the 'value' is only a bit wide */ assert(value <= 1); /* * Get the SCR_EL3 value from the cpu context, clear the desired bit * and set it to its new value. */ state = get_el3state_ctx(ctx); scr_el3 = read_ctx_reg(state, CTX_SCR_EL3); scr_el3 &= ~(1 << bit_pos); scr_el3 |= value << bit_pos; write_ctx_reg(state, CTX_SCR_EL3, scr_el3); } /******************************************************************************* * This function retrieves SCR_EL3 member of 'cpu_context' pertaining to the * given security state. ******************************************************************************/ uint32_t cm_get_scr_el3(uint32_t security_state) { cpu_context_t *ctx; el3_state_t *state; ctx = cm_get_context(security_state); assert(ctx); /* Populate EL3 state so that ERET jumps to the correct entry */ state = get_el3state_ctx(ctx); return read_ctx_reg(state, CTX_SCR_EL3); } /******************************************************************************* * This function is used to program the context that's used for exception * return. This initializes the SP_EL3 to a pointer to a 'cpu_context' set for * the required security state ******************************************************************************/ void cm_set_next_eret_context(uint32_t security_state) { cpu_context_t *ctx; ctx = cm_get_context(security_state); assert(ctx); cm_set_next_context(ctx); } arm-trusted-firmware-1.0-aw-6/bl31/cpu_data_array.c000066400000000000000000000032701322600646200220710ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include /* The per_cpu_ptr_cache_t space allocation */ cpu_data_t percpu_data[PLATFORM_CORE_COUNT]; arm-trusted-firmware-1.0-aw-6/bl31/interrupt_mgmt.c000066400000000000000000000175121322600646200221770ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include /******************************************************************************* * Local structure and corresponding array to keep track of the state of the * registered interrupt handlers for each interrupt type. * The field descriptions are: * * 'flags' : Bit[0], Routing model for this interrupt type when execution is * not in EL3 in the secure state. '1' implies that this * interrupt will be routed to EL3. '0' implies that this * interrupt will be routed to the current exception level. * * Bit[1], Routing model for this interrupt type when execution is * not in EL3 in the non-secure state. '1' implies that this * interrupt will be routed to EL3. '0' implies that this * interrupt will be routed to the current exception level. * * All other bits are reserved and SBZ. * * 'scr_el3[2]' : Mapping of the routing model in the 'flags' field to the * value of the SCR_EL3.IRQ or FIQ bit for each security state. * There are two instances of this field corresponding to the * two security states. ******************************************************************************/ typedef struct intr_type_desc { interrupt_type_handler_t handler; uint32_t flags; uint32_t scr_el3[2]; } intr_type_desc_t; static intr_type_desc_t intr_type_descs[MAX_INTR_TYPES]; /******************************************************************************* * This function validates the interrupt type. EL3 interrupts are currently not * supported. ******************************************************************************/ static int32_t validate_interrupt_type(uint32_t type) { if (type == INTR_TYPE_EL3) return -ENOTSUP; if (type != INTR_TYPE_S_EL1 && type != INTR_TYPE_NS) return -EINVAL; return 0; } /******************************************************************************* * This function validates the routing model for this type of interrupt ******************************************************************************/ static int32_t validate_routing_model(uint32_t type, uint32_t flags) { flags >>= INTR_RM_FLAGS_SHIFT; flags &= INTR_RM_FLAGS_MASK; if (type == INTR_TYPE_S_EL1) return validate_sel1_interrupt_rm(flags); if (type == INTR_TYPE_NS) return validate_ns_interrupt_rm(flags); return -EINVAL; } /******************************************************************************* * This function returns the cached copy of the SCR_EL3 which contains the * routing model (expressed through the IRQ and FIQ bits) for a security state * which was stored through a call to 'set_routing_model()' earlier. ******************************************************************************/ uint32_t get_scr_el3_from_routing_model(uint32_t security_state) { uint32_t scr_el3; assert(sec_state_is_valid(security_state)); scr_el3 = intr_type_descs[INTR_TYPE_NS].scr_el3[security_state]; scr_el3 |= intr_type_descs[INTR_TYPE_S_EL1].scr_el3[security_state]; scr_el3 |= intr_type_descs[INTR_TYPE_EL3].scr_el3[security_state]; return scr_el3; } /******************************************************************************* * This function uses the 'interrupt_type_flags' parameter to obtain the value * of the trap bit (IRQ/FIQ) in the SCR_EL3 for a security state for this * interrupt type. It uses it to update the SCR_EL3 in the cpu context and the * 'intr_type_desc' for that security state. ******************************************************************************/ static void set_scr_el3_from_rm(uint32_t type, uint32_t interrupt_type_flags, uint32_t security_state) { uint32_t flag, bit_pos; flag = get_interrupt_rm_flag(interrupt_type_flags, security_state); bit_pos = plat_interrupt_type_to_line(type, security_state); intr_type_descs[type].scr_el3[security_state] = flag << bit_pos; cm_write_scr_el3_bit(security_state, bit_pos, flag); } /******************************************************************************* * This function validates the routing model specified in the 'flags' and * updates internal data structures to reflect the new routing model. It also * updates the copy of SCR_EL3 for each security state with the new routing * model in the 'cpu_context' structure for this cpu. ******************************************************************************/ int32_t set_routing_model(uint32_t type, uint32_t flags) { int32_t rc; rc = validate_interrupt_type(type); if (rc) return rc; rc = validate_routing_model(type, flags); if (rc) return rc; /* Update the routing model in internal data structures */ intr_type_descs[type].flags = flags; set_scr_el3_from_rm(type, flags, SECURE); set_scr_el3_from_rm(type, flags, NON_SECURE); return 0; } /******************************************************************************* * This function registers a handler for the 'type' of interrupt specified. It * also validates the routing model specified in the 'flags' for this type of * interrupt. ******************************************************************************/ int32_t register_interrupt_type_handler(uint32_t type, interrupt_type_handler_t handler, uint32_t flags) { int32_t rc; /* Validate the 'handler' parameter */ if (!handler) return -EINVAL; /* Validate the 'flags' parameter */ if (flags & INTR_TYPE_FLAGS_MASK) return -EINVAL; /* Check if a handler has already been registered */ if (intr_type_descs[type].handler) return -EALREADY; rc = set_routing_model(type, flags); if (rc) return rc; /* Save the handler */ intr_type_descs[type].handler = handler; return 0; } /******************************************************************************* * This function is called when an interrupt is generated and returns the * handler for the interrupt type (if registered). It returns NULL if the * interrupt type is not supported or its handler has not been registered. ******************************************************************************/ interrupt_type_handler_t get_interrupt_type_handler(uint32_t type) { if (validate_interrupt_type(type)) return NULL; return intr_type_descs[type].handler; } arm-trusted-firmware-1.0-aw-6/bl31/runtime_svc.c000066400000000000000000000130751322600646200214550ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include /******************************************************************************* * The 'rt_svc_descs' array holds the runtime service descriptors exported by * services by placing them in the 'rt_svc_descs' linker section. * The 'rt_svc_descs_indices' array holds the index of a descriptor in the * 'rt_svc_descs' array. When an SMC arrives, the OEN[29:24] bits and the call * type[31] bit in the function id are combined to get an index into the * 'rt_svc_descs_indices' array. This gives the index of the descriptor in the * 'rt_svc_descs' array which contains the SMC handler. ******************************************************************************/ #define RT_SVC_DESCS_START ((uint64_t) (&__RT_SVC_DESCS_START__)) #define RT_SVC_DESCS_END ((uint64_t) (&__RT_SVC_DESCS_END__)) uint8_t rt_svc_descs_indices[MAX_RT_SVCS]; static rt_svc_desc_t *rt_svc_descs; /******************************************************************************* * Simple routine to sanity check a runtime service descriptor before using it ******************************************************************************/ static int32_t validate_rt_svc_desc(rt_svc_desc_t *desc) { if (desc == NULL) return -EINVAL; if (desc->start_oen > desc->end_oen) return -EINVAL; if (desc->end_oen >= OEN_LIMIT) return -EINVAL; if (desc->call_type != SMC_TYPE_FAST && desc->call_type != SMC_TYPE_STD) return -EINVAL; /* A runtime service having no init or handle function doesn't make sense */ if (desc->init == NULL && desc->handle == NULL) return -EINVAL; return 0; } /******************************************************************************* * This function calls the initialisation routine in the descriptor exported by * a runtime service. Once a descriptor has been validated, its start & end * owning entity numbers and the call type are combined to form a unique oen. * The unique oen is used as an index into the 'rt_svc_descs_indices' array. * The index of the runtime service descriptor is stored at this index. ******************************************************************************/ void runtime_svc_init(void) { int32_t rc = 0; uint32_t index, start_idx, end_idx; uint64_t rt_svc_descs_num; /* If no runtime services are implemented then simply bail out */ rt_svc_descs_num = RT_SVC_DESCS_END - RT_SVC_DESCS_START; rt_svc_descs_num /= sizeof(rt_svc_desc_t); if (rt_svc_descs_num == 0) return; /* Initialise internal variables to invalid state */ memset(rt_svc_descs_indices, -1, sizeof(rt_svc_descs_indices)); rt_svc_descs = (rt_svc_desc_t *) RT_SVC_DESCS_START; for (index = 0; index < rt_svc_descs_num; index++) { /* * An invalid descriptor is an error condition since it is * difficult to predict the system behaviour in the absence * of this service. */ rc = validate_rt_svc_desc(&rt_svc_descs[index]); if (rc) { ERROR("Invalid runtime service descriptor 0x%x (%s)\n", &rt_svc_descs[index], rt_svc_descs[index].name); goto error; } /* * The runtime service may have seperate rt_svc_desc_t * for its fast smc and standard smc. Since the service itself * need to be initialized only once, only one of them will have * an initialisation routine defined. Call the initialisation * routine for this runtime service, if it is defined. */ if (rt_svc_descs[index].init) { rc = rt_svc_descs[index].init(); if (rc) { ERROR("Error initializing runtime service %s\n", rt_svc_descs[index].name); continue; } } /* * Fill the indices corresponding to the start and end * owning entity numbers with the index of the * descriptor which will handle the SMCs for this owning * entity range. */ start_idx = get_unique_oen(rt_svc_descs[index].start_oen, rt_svc_descs[index].call_type); end_idx = get_unique_oen(rt_svc_descs[index].end_oen, rt_svc_descs[index].call_type); for (; start_idx <= end_idx; start_idx++) rt_svc_descs_indices[start_idx] = index; } return; error: panic(); } arm-trusted-firmware-1.0-aw-6/bl32/000077500000000000000000000000001322600646200167465ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl32/tsp/000077500000000000000000000000001322600646200175545ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl32/tsp/aarch64/000077500000000000000000000000001322600646200210045ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/bl32/tsp/aarch64/tsp_entrypoint.S000066400000000000000000000304351322600646200242360ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "../tsp_private.h" .globl tsp_entrypoint .globl tsp_vector_table /* --------------------------------------------- * Populate the params in x0-x7 from the pointer * to the smc args structure in x0. * --------------------------------------------- */ .macro restore_args_call_smc ldp x6, x7, [x0, #TSP_ARG6] ldp x4, x5, [x0, #TSP_ARG4] ldp x2, x3, [x0, #TSP_ARG2] ldp x0, x1, [x0, #TSP_ARG0] smc #0 .endm .macro save_eret_context reg1 reg2 mrs \reg1, elr_el1 mrs \reg2, spsr_el1 stp \reg1, \reg2, [sp, #-0x10]! stp x30, x18, [sp, #-0x10]! .endm .macro restore_eret_context reg1 reg2 ldp x30, x18, [sp], #0x10 ldp \reg1, \reg2, [sp], #0x10 msr elr_el1, \reg1 msr spsr_el1, \reg2 .endm .section .text, "ax" .align 3 func tsp_entrypoint /* --------------------------------------------- * Set the exception vector to something sane. * --------------------------------------------- */ adr x0, tsp_exceptions msr vbar_el1, x0 isb /* --------------------------------------------- * Enable the SError interrupt now that the * exception vectors have been setup. * --------------------------------------------- */ msr daifclr, #DAIF_ABT_BIT /* --------------------------------------------- * Enable the instruction cache, stack pointer * and data access alignment checks * --------------------------------------------- */ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) mrs x0, sctlr_el1 orr x0, x0, x1 msr sctlr_el1, x0 isb /* --------------------------------------------- * Zero out NOBITS sections. There are 2 of them: * - the .bss section; * - the coherent memory section. * --------------------------------------------- */ ldr x0, =__BSS_START__ ldr x1, =__BSS_SIZE__ bl zeromem16 ldr x0, =__COHERENT_RAM_START__ ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__ bl zeromem16 /* -------------------------------------------- * Allocate a stack whose memory will be marked * as Normal-IS-WBWA when the MMU is enabled. * There is no risk of reading stale stack * memory after enabling the MMU as only the * primary cpu is running at the moment. * -------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* --------------------------------------------- * Perform early platform setup & platform * specific early arch. setup e.g. mmu setup * --------------------------------------------- */ bl tsp_early_platform_setup bl tsp_plat_arch_setup /* --------------------------------------------- * Jump to main function. * --------------------------------------------- */ bl tsp_main /* --------------------------------------------- * Tell TSPD that we are done initialising * --------------------------------------------- */ mov x1, x0 mov x0, #TSP_ENTRY_DONE smc #0 tsp_entrypoint_panic: b tsp_entrypoint_panic /* ------------------------------------------- * Table of entrypoint vectors provided to the * TSPD for the various entrypoints * ------------------------------------------- */ func tsp_vector_table b tsp_std_smc_entry b tsp_fast_smc_entry b tsp_cpu_on_entry b tsp_cpu_off_entry b tsp_cpu_resume_entry b tsp_cpu_suspend_entry b tsp_fiq_entry b tsp_system_off_entry b tsp_system_reset_entry /*--------------------------------------------- * This entrypoint is used by the TSPD when this * cpu is to be turned off through a CPU_OFF * psci call to ask the TSP to perform any * bookeeping necessary. In the current * implementation, the TSPD expects the TSP to * re-initialise its state so nothing is done * here except for acknowledging the request. * --------------------------------------------- */ func tsp_cpu_off_entry bl tsp_cpu_off_main restore_args_call_smc /*--------------------------------------------- * This entrypoint is used by the TSPD when the * system is about to be switched off (through * a SYSTEM_OFF psci call) to ask the TSP to * perform any necessary bookkeeping. * --------------------------------------------- */ func tsp_system_off_entry bl tsp_system_off_main restore_args_call_smc /*--------------------------------------------- * This entrypoint is used by the TSPD when the * system is about to be reset (through a * SYSTEM_RESET psci call) to ask the TSP to * perform any necessary bookkeeping. * --------------------------------------------- */ func tsp_system_reset_entry bl tsp_system_reset_main restore_args_call_smc /*--------------------------------------------- * This entrypoint is used by the TSPD when this * cpu is turned on using a CPU_ON psci call to * ask the TSP to initialise itself i.e. setup * the mmu, stacks etc. Minimal architectural * state will be initialised by the TSPD when * this function is entered i.e. Caches and MMU * will be turned off, the execution state * will be aarch64 and exceptions masked. * --------------------------------------------- */ func tsp_cpu_on_entry /* --------------------------------------------- * Set the exception vector to something sane. * --------------------------------------------- */ adr x0, tsp_exceptions msr vbar_el1, x0 isb /* Enable the SError interrupt */ msr daifclr, #DAIF_ABT_BIT /* --------------------------------------------- * Enable the instruction cache, stack pointer * and data access alignment checks * --------------------------------------------- */ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) mrs x0, sctlr_el1 orr x0, x0, x1 msr sctlr_el1, x0 isb /* -------------------------------------------- * Give ourselves a stack whose memory will be * marked as Normal-IS-WBWA when the MMU is * enabled. * -------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* -------------------------------------------- * Enable the MMU with the DCache disabled. It * is safe to use stacks allocated in normal * memory as a result. All memory accesses are * marked nGnRnE when the MMU is disabled. So * all the stack writes will make it to memory. * All memory accesses are marked Non-cacheable * when the MMU is enabled but D$ is disabled. * So used stack memory is guaranteed to be * visible immediately after the MMU is enabled * Enabling the DCache at the same time as the * MMU can lead to speculatively fetched and * possibly stale stack memory being read from * other caches. This can lead to coherency * issues. * -------------------------------------------- */ mov x0, #DISABLE_DCACHE bl bl32_plat_enable_mmu /* --------------------------------------------- * Enable the Data cache now that the MMU has * been enabled. The stack has been unwound. It * will be written first before being read. This * will invalidate any stale cache lines resi- * -dent in other caches. We assume that * interconnect coherency has been enabled for * this cluster by EL3 firmware. * --------------------------------------------- */ mrs x0, sctlr_el1 orr x0, x0, #SCTLR_C_BIT msr sctlr_el1, x0 isb /* --------------------------------------------- * Enter C runtime to perform any remaining * book keeping * --------------------------------------------- */ bl tsp_cpu_on_main restore_args_call_smc /* Should never reach here */ tsp_cpu_on_entry_panic: b tsp_cpu_on_entry_panic /*--------------------------------------------- * This entrypoint is used by the TSPD when this * cpu is to be suspended through a CPU_SUSPEND * psci call to ask the TSP to perform any * bookeeping necessary. In the current * implementation, the TSPD saves and restores * the EL1 state. * --------------------------------------------- */ func tsp_cpu_suspend_entry bl tsp_cpu_suspend_main restore_args_call_smc /*--------------------------------------------- * This entrypoint is used by the TSPD to pass * control for handling a pending S-EL1 FIQ. * 'x0' contains a magic number which indicates * this. TSPD expects control to be handed back * at the end of FIQ processing. This is done * through an SMC. The handover agreement is: * * 1. PSTATE.DAIF are set upon entry. 'x1' has * the ELR_EL3 from the non-secure state. * 2. TSP has to preserve the callee saved * general purpose registers, SP_EL1/EL0 and * LR. * 3. TSP has to preserve the system and vfp * registers (if applicable). * 4. TSP can use 'x0-x18' to enable its C * runtime. * 5. TSP returns to TSPD using an SMC with * 'x0' = TSP_HANDLED_S_EL1_FIQ * --------------------------------------------- */ func tsp_fiq_entry #if DEBUG mov x2, #(TSP_HANDLE_FIQ_AND_RETURN & ~0xffff) movk x2, #(TSP_HANDLE_FIQ_AND_RETURN & 0xffff) cmp x0, x2 b.ne tsp_fiq_entry_panic #endif /*--------------------------------------------- * Save any previous context needed to perform * an exception return from S-EL1 e.g. context * from a previous IRQ. Update statistics and * handle the FIQ before returning to the TSPD. * IRQ/FIQs are not enabled since that will * complicate the implementation. Execution * will be transferred back to the normal world * in any case. A non-zero return value from the * fiq handler is an error. * --------------------------------------------- */ save_eret_context x2 x3 bl tsp_update_sync_fiq_stats bl tsp_fiq_handler cbnz x0, tsp_fiq_entry_panic restore_eret_context x2 x3 mov x0, #(TSP_HANDLED_S_EL1_FIQ & ~0xffff) movk x0, #(TSP_HANDLED_S_EL1_FIQ & 0xffff) smc #0 tsp_fiq_entry_panic: b tsp_fiq_entry_panic /*--------------------------------------------- * This entrypoint is used by the TSPD when this * cpu resumes execution after an earlier * CPU_SUSPEND psci call to ask the TSP to * restore its saved context. In the current * implementation, the TSPD saves and restores * EL1 state so nothing is done here apart from * acknowledging the request. * --------------------------------------------- */ func tsp_cpu_resume_entry bl tsp_cpu_resume_main restore_args_call_smc tsp_cpu_resume_panic: b tsp_cpu_resume_panic /*--------------------------------------------- * This entrypoint is used by the TSPD to ask * the TSP to service a fast smc request. * --------------------------------------------- */ func tsp_fast_smc_entry bl tsp_smc_handler restore_args_call_smc tsp_fast_smc_entry_panic: b tsp_fast_smc_entry_panic /*--------------------------------------------- * This entrypoint is used by the TSPD to ask * the TSP to service a std smc request. * We will enable preemption during execution * of tsp_smc_handler. * --------------------------------------------- */ func tsp_std_smc_entry msr daifclr, #DAIF_FIQ_BIT | DAIF_IRQ_BIT bl tsp_smc_handler msr daifset, #DAIF_FIQ_BIT | DAIF_IRQ_BIT restore_args_call_smc tsp_std_smc_entry_panic: b tsp_std_smc_entry_panic arm-trusted-firmware-1.0-aw-6/bl32/tsp/aarch64/tsp_exceptions.S000066400000000000000000000126421322600646200242040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include /* ---------------------------------------------------- * The caller-saved registers x0-x18 and LR are saved * here. * ---------------------------------------------------- */ #define SCRATCH_REG_SIZE #(20 * 8) .macro save_caller_regs_and_lr sub sp, sp, SCRATCH_REG_SIZE stp x0, x1, [sp] stp x2, x3, [sp, #0x10] stp x4, x5, [sp, #0x20] stp x6, x7, [sp, #0x30] stp x8, x9, [sp, #0x40] stp x10, x11, [sp, #0x50] stp x12, x13, [sp, #0x60] stp x14, x15, [sp, #0x70] stp x16, x17, [sp, #0x80] stp x18, x30, [sp, #0x90] .endm .macro restore_caller_regs_and_lr ldp x0, x1, [sp] ldp x2, x3, [sp, #0x10] ldp x4, x5, [sp, #0x20] ldp x6, x7, [sp, #0x30] ldp x8, x9, [sp, #0x40] ldp x10, x11, [sp, #0x50] ldp x12, x13, [sp, #0x60] ldp x14, x15, [sp, #0x70] ldp x16, x17, [sp, #0x80] ldp x18, x30, [sp, #0x90] add sp, sp, SCRATCH_REG_SIZE .endm .globl tsp_exceptions /* ----------------------------------------------------- * TSP exception handlers. * ----------------------------------------------------- */ .section .vectors, "ax"; .align 11 .align 7 tsp_exceptions: /* ----------------------------------------------------- * Current EL with _sp_el0 : 0x0 - 0x180. No exceptions * are expected and treated as irrecoverable errors. * ----------------------------------------------------- */ sync_exception_sp_el0: wfi b sync_exception_sp_el0 check_vector_size sync_exception_sp_el0 .align 7 irq_sp_el0: b irq_sp_el0 check_vector_size irq_sp_el0 .align 7 fiq_sp_el0: b fiq_sp_el0 check_vector_size fiq_sp_el0 .align 7 serror_sp_el0: b serror_sp_el0 check_vector_size serror_sp_el0 /* ----------------------------------------------------- * Current EL with SPx: 0x200 - 0x380. Only IRQs/FIQs * are expected and handled * ----------------------------------------------------- */ .align 7 sync_exception_sp_elx: wfi b sync_exception_sp_elx check_vector_size sync_exception_sp_elx .align 7 irq_sp_elx: /* Enable the SError interrupt */ msr daifclr, #DAIF_ABT_BIT save_caller_regs_and_lr /* We just update some statistics in the handler */ bl tsp_irq_received /* Hand over control to the normal world to handle the IRQ */ smc #0 /* The resume std smc starts from here */ restore_caller_regs_and_lr eret check_vector_size irq_sp_elx .align 7 fiq_sp_elx: /* Enable the SError interrupt */ msr daifclr, #DAIF_ABT_BIT save_caller_regs_and_lr bl tsp_fiq_handler cbz x0, fiq_sp_elx_done /* * This FIQ was not targetted to S-EL1 so send it to * the monitor and wait for execution to resume. */ smc #0 fiq_sp_elx_done: restore_caller_regs_and_lr eret check_vector_size fiq_sp_elx .align 7 serror_sp_elx: b serror_sp_elx check_vector_size serror_sp_elx /* ----------------------------------------------------- * Lower EL using AArch64 : 0x400 - 0x580. No exceptions * are handled since TSP does not implement a lower EL * ----------------------------------------------------- */ .align 7 sync_exception_aarch64: wfi b sync_exception_aarch64 check_vector_size sync_exception_aarch64 .align 7 irq_aarch64: b irq_aarch64 check_vector_size irq_aarch64 .align 7 fiq_aarch64: b fiq_aarch64 check_vector_size fiq_aarch64 .align 7 serror_aarch64: b serror_aarch64 check_vector_size serror_aarch64 /* ----------------------------------------------------- * Lower EL using AArch32 : 0x600 - 0x780. No exceptions * handled since the TSP does not implement a lower EL. * ----------------------------------------------------- */ .align 7 sync_exception_aarch32: wfi b sync_exception_aarch32 check_vector_size sync_exception_aarch32 .align 7 irq_aarch32: b irq_aarch32 check_vector_size irq_aarch32 .align 7 fiq_aarch32: b fiq_aarch32 check_vector_size fiq_aarch32 .align 7 serror_aarch32: b serror_aarch32 check_vector_size serror_aarch32 .align 7 arm-trusted-firmware-1.0-aw-6/bl32/tsp/aarch64/tsp_request.S000066400000000000000000000041441322600646200235110ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include .globl tsp_get_magic /* * This function raises an SMC to retrieve arguments from secure * monitor/dispatcher, saves the returned arguments the array received in x0, * and then returns to the caller */ func tsp_get_magic /* Save address to stack */ stp x0, xzr, [sp, #-16]! /* Load arguments */ ldr w0, _tsp_fid_get_magic /* Raise SMC */ smc #0 /* Restore address from stack */ ldp x4, xzr, [sp], #16 /* Store returned arguments to the array */ stp x0, x1, [x4, #0] ret .align 2 _tsp_fid_get_magic: .word TSP_GET_ARGS arm-trusted-firmware-1.0-aw-6/bl32/tsp/tsp.ld.S000066400000000000000000000101631322600646200211050ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT) OUTPUT_ARCH(PLATFORM_LINKER_ARCH) ENTRY(tsp_entrypoint) MEMORY { RAM (rwx): ORIGIN = TSP_SEC_MEM_BASE, LENGTH = TSP_SEC_MEM_SIZE } SECTIONS { . = BL32_BASE; ASSERT(. == ALIGN(4096), "BL32_BASE address is not aligned on a page boundary.") ro . : { __RO_START__ = .; *tsp_entrypoint.o(.text*) *(.text*) *(.rodata*) *(.vectors) __RO_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked as * read-only, executable. No RW data from the next section must * creep in. Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __RO_END__ = .; } >RAM .data . : { __DATA_START__ = .; *(.data*) __DATA_END__ = .; } >RAM #ifdef TSP_PROGBITS_LIMIT ASSERT(. <= TSP_PROGBITS_LIMIT, "TSP progbits has exceeded its limit.") #endif stacks (NOLOAD) : { __STACKS_START__ = .; *(tzfw_normal_stacks) __STACKS_END__ = .; } >RAM /* * The .bss section gets initialised to 0 at runtime. * Its base address must be 16-byte aligned. */ .bss : ALIGN(16) { __BSS_START__ = .; *(SORT_BY_ALIGNMENT(.bss*)) *(COMMON) __BSS_END__ = .; } >RAM /* * The xlat_table section is for full, aligned page tables (4K). * Removing them from .bss avoids forcing 4K alignment on * the .bss section and eliminates the unecessary zero init */ xlat_table (NOLOAD) : { *(xlat_table) } >RAM /* * The base address of the coherent memory section must be page-aligned (4K) * to guarantee that the coherent data are stored on their own pages and * are not mixed with normal data. This is required to set up the correct * memory attributes for the coherent data page tables. */ coherent_ram (NOLOAD) : ALIGN(4096) { __COHERENT_RAM_START__ = .; *(tzfw_coherent_mem) __COHERENT_RAM_END_UNALIGNED__ = .; /* * Memory page(s) mapped to this section will be marked * as device memory. No other unexpected data must creep in. * Ensure the rest of the current memory page is unused. */ . = NEXT(4096); __COHERENT_RAM_END__ = .; } >RAM __BL32_END__ = .; __BSS_SIZE__ = SIZEOF(.bss); __COHERENT_RAM_UNALIGNED_SIZE__ = __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__; ASSERT(. <= BL32_LIMIT, "BL3-2 image has exceeded its limit.") } arm-trusted-firmware-1.0-aw-6/bl32/tsp/tsp.mk000066400000000000000000000047441322600646200207240ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # INCLUDES += -Iinclude/bl32/tsp BL32_SOURCES += bl32/tsp/tsp_main.c \ bl32/tsp/aarch64/tsp_entrypoint.S \ bl32/tsp/aarch64/tsp_exceptions.S \ bl32/tsp/aarch64/tsp_request.S \ bl32/tsp/tsp_interrupt.c \ bl32/tsp/tsp_timer.c \ common/aarch64/early_exceptions.S \ lib/locks/exclusive/spinlock.S BL32_LINKERFILE := bl32/tsp/tsp.ld.S # This flag determines if the TSPD initializes BL3-2 in tspd_init() (synchronous # method) or configures BL3-1 to pass control to BL3-2 instead of BL3-3 # (asynchronous method). TSP_INIT_ASYNC := 0 $(eval $(call assert_boolean,TSP_INIT_ASYNC)) $(eval $(call add_define,TSP_INIT_ASYNC)) # Include the platform-specific TSP Makefile # If no platform-specific TSP Makefile exists, it means TSP is not supported # on this platform. TSP_PLAT_MAKEFILE := plat/${PLAT}/tsp/tsp-${PLAT}.mk ifeq (,$(wildcard ${TSP_PLAT_MAKEFILE})) $(error TSP is not supported on platform ${PLAT}) else include ${TSP_PLAT_MAKEFILE} endif arm-trusted-firmware-1.0-aw-6/bl32/tsp/tsp_interrupt.c000066400000000000000000000120231322600646200226400ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "tsp_private.h" /******************************************************************************* * This function updates the TSP statistics for FIQs handled synchronously i.e * the ones that have been handed over by the TSPD. It also keeps count of the * number of times control was passed back to the TSPD after handling an FIQ. * In the future it will be possible that the TSPD hands over an FIQ to the TSP * but does not expect it to return execution. This statistic will be useful to * distinguish between these two models of synchronous FIQ handling. * The 'elr_el3' parameter contains the address of the instruction in normal * world where this FIQ was generated. ******************************************************************************/ void tsp_update_sync_fiq_stats(uint32_t type, uint64_t elr_el3) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_stats[linear_id].sync_fiq_count++; if (type == TSP_HANDLE_FIQ_AND_RETURN) tsp_stats[linear_id].sync_fiq_ret_count++; #if LOG_LEVEL >= LOG_LEVEL_VERBOSE spin_lock(&console_lock); VERBOSE("TSP: cpu 0x%x sync fiq request from 0x%llx\n", mpidr, elr_el3); VERBOSE("TSP: cpu 0x%x: %d sync fiq requests, %d sync fiq returns\n", mpidr, tsp_stats[linear_id].sync_fiq_count, tsp_stats[linear_id].sync_fiq_ret_count); spin_unlock(&console_lock); #endif } /******************************************************************************* * TSP FIQ handler called as a part of both synchronous and asynchronous * handling of FIQ interrupts. It returns 0 upon successfully handling a S-EL1 * FIQ and treats all other FIQs as EL3 interrupts. It assumes that the GIC * architecture version in v2.0 and the secure physical timer interrupt is the * only S-EL1 interrupt that it needs to handle. ******************************************************************************/ int32_t tsp_fiq_handler(void) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr), id; /* * Get the highest priority pending interrupt id and see if it is the * secure physical generic timer interrupt in which case, handle it. * Otherwise throw this interrupt at the EL3 firmware. */ id = plat_ic_get_pending_interrupt_id(); /* TSP can only handle the secure physical timer interrupt */ if (id != TSP_IRQ_SEC_PHY_TIMER) return TSP_EL3_FIQ; /* * Handle the interrupt. Also sanity check if it has been preempted by * another secure interrupt through an assertion. */ id = plat_ic_acknowledge_interrupt(); assert(id == TSP_IRQ_SEC_PHY_TIMER); tsp_generic_timer_handler(); plat_ic_end_of_interrupt(id); /* Update the statistics and print some messages */ tsp_stats[linear_id].fiq_count++; #if LOG_LEVEL >= LOG_LEVEL_VERBOSE spin_lock(&console_lock); VERBOSE("TSP: cpu 0x%x handled fiq %d\n", mpidr, id); VERBOSE("TSP: cpu 0x%x: %d fiq requests\n", mpidr, tsp_stats[linear_id].fiq_count); spin_unlock(&console_lock); #endif return 0; } int32_t tsp_irq_received(void) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_stats[linear_id].irq_count++; #if LOG_LEVEL >= LOG_LEVEL_VERBOSE spin_lock(&console_lock); VERBOSE("TSP: cpu 0x%x received irq\n", mpidr); VERBOSE("TSP: cpu 0x%x: %d irq requests\n", mpidr, tsp_stats[linear_id].irq_count); spin_unlock(&console_lock); #endif return TSP_PREEMPTED; } arm-trusted-firmware-1.0-aw-6/bl32/tsp/tsp_main.c000066400000000000000000000356671322600646200215530ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "tsp_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __COHERENT_RAM_END__; /******************************************************************************* * Lock to control access to the console ******************************************************************************/ spinlock_t console_lock; /******************************************************************************* * Per cpu data structure to populate parameters for an SMC in C code and use * a pointer to this structure in assembler code to populate x0-x7 ******************************************************************************/ static tsp_args_t tsp_smc_args[PLATFORM_CORE_COUNT]; /******************************************************************************* * Per cpu data structure to keep track of TSP activity ******************************************************************************/ work_statistics_t tsp_stats[PLATFORM_CORE_COUNT]; /******************************************************************************* * The BL32 memory footprint starts with an RO sections and ends * with a section for coherent RAM. Use it to find the memory size ******************************************************************************/ #define BL32_TOTAL_BASE (unsigned long)(&__RO_START__) #define BL32_TOTAL_LIMIT (unsigned long)(&__COHERENT_RAM_END__) static tsp_args_t *set_smc_args(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t mpidr = read_mpidr(); uint32_t linear_id; tsp_args_t *pcpu_smc_args; /* * Return to Secure Monitor by raising an SMC. The results of the * service are passed as an arguments to the SMC */ linear_id = platform_get_core_pos(mpidr); pcpu_smc_args = &tsp_smc_args[linear_id]; write_sp_arg(pcpu_smc_args, TSP_ARG0, arg0); write_sp_arg(pcpu_smc_args, TSP_ARG1, arg1); write_sp_arg(pcpu_smc_args, TSP_ARG2, arg2); write_sp_arg(pcpu_smc_args, TSP_ARG3, arg3); write_sp_arg(pcpu_smc_args, TSP_ARG4, arg4); write_sp_arg(pcpu_smc_args, TSP_ARG5, arg5); write_sp_arg(pcpu_smc_args, TSP_ARG6, arg6); write_sp_arg(pcpu_smc_args, TSP_ARG7, arg7); return pcpu_smc_args; } /******************************************************************************* * TSP main entry point where it gets the opportunity to initialize its secure * state/applications. Once the state is initialized, it must return to the * SPD with a pointer to the 'tsp_vector_table' jump table. ******************************************************************************/ uint64_t tsp_main(void) { NOTICE("TSP: %s\n", version_string); NOTICE("TSP: %s\n", build_message); INFO("TSP: Total memory base : 0x%x\n", (unsigned long)BL32_TOTAL_BASE); INFO("TSP: Total memory size : 0x%x bytes\n", (unsigned long)(BL32_TOTAL_LIMIT - BL32_TOTAL_BASE)); uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Initialize the platform */ tsp_platform_setup(); /* Initialize secure/applications state here */ tsp_generic_timer_start(); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; tsp_stats[linear_id].cpu_on_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu on requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count, tsp_stats[linear_id].cpu_on_count); spin_unlock(&console_lock); #endif return (uint64_t) &tsp_vector_table; } /******************************************************************************* * This function performs any remaining book keeping in the test secure payload * after this cpu's architectural state has been setup in response to an earlier * psci cpu_on request. ******************************************************************************/ tsp_args_t *tsp_cpu_on_main(void) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Initialize secure/applications state here */ tsp_generic_timer_start(); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; tsp_stats[linear_id].cpu_on_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x turned on\n", mpidr); INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu on requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count, tsp_stats[linear_id].cpu_on_count); spin_unlock(&console_lock); #endif /* Indicate to the SPD that we have completed turned ourselves on */ return set_smc_args(TSP_ON_DONE, 0, 0, 0, 0, 0, 0, 0); } /******************************************************************************* * This function performs any remaining book keeping in the test secure payload * before this cpu is turned off in response to a psci cpu_off request. ******************************************************************************/ tsp_args_t *tsp_cpu_off_main(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* * This cpu is being turned off, so disable the timer to prevent the * secure timer interrupt from interfering with power down. A pending * interrupt will be lost but we do not care as we are turning off. */ tsp_generic_timer_stop(); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; tsp_stats[linear_id].cpu_off_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x off request\n", mpidr); INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu off requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count, tsp_stats[linear_id].cpu_off_count); spin_unlock(&console_lock); #endif /* Indicate to the SPD that we have completed this request */ return set_smc_args(TSP_OFF_DONE, 0, 0, 0, 0, 0, 0, 0); } /******************************************************************************* * This function performs any book keeping in the test secure payload before * this cpu's architectural state is saved in response to an earlier psci * cpu_suspend request. ******************************************************************************/ tsp_args_t *tsp_cpu_suspend_main(uint64_t power_state, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* * Save the time context and disable it to prevent the secure timer * interrupt from interfering with wakeup from the suspend state. */ tsp_generic_timer_save(); tsp_generic_timer_stop(); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; tsp_stats[linear_id].cpu_suspend_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x suspend request. power state: 0x%x\n", mpidr, power_state); INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu suspend requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count, tsp_stats[linear_id].cpu_suspend_count); spin_unlock(&console_lock); #endif /* Indicate to the SPD that we have completed this request */ return set_smc_args(TSP_SUSPEND_DONE, 0, 0, 0, 0, 0, 0, 0); } /******************************************************************************* * This function performs any book keeping in the test secure payload after this * cpu's architectural state has been restored after wakeup from an earlier psci * cpu_suspend request. ******************************************************************************/ tsp_args_t *tsp_cpu_resume_main(uint64_t suspend_level, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Restore the generic timer context */ tsp_generic_timer_restore(); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; tsp_stats[linear_id].cpu_resume_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x resumed. suspend level %d\n", mpidr, suspend_level); INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu suspend requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count, tsp_stats[linear_id].cpu_suspend_count); spin_unlock(&console_lock); #endif /* Indicate to the SPD that we have completed this request */ return set_smc_args(TSP_RESUME_DONE, 0, 0, 0, 0, 0, 0, 0); } /******************************************************************************* * This function performs any remaining bookkeeping in the test secure payload * before the system is switched off (in response to a psci SYSTEM_OFF request) ******************************************************************************/ tsp_args_t *tsp_system_off_main(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x SYSTEM_OFF request\n", mpidr); INFO("TSP: cpu 0x%x: %d smcs, %d erets requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count); spin_unlock(&console_lock); #endif /* Indicate to the SPD that we have completed this request */ return set_smc_args(TSP_SYSTEM_OFF_DONE, 0, 0, 0, 0, 0, 0, 0); } /******************************************************************************* * This function performs any remaining bookkeeping in the test secure payload * before the system is reset (in response to a psci SYSTEM_RESET request) ******************************************************************************/ tsp_args_t *tsp_system_reset_main(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; #if LOG_LEVEL >= LOG_LEVEL_INFO spin_lock(&console_lock); INFO("TSP: cpu 0x%x SYSTEM_RESET request\n", mpidr); INFO("TSP: cpu 0x%x: %d smcs, %d erets requests\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count); spin_unlock(&console_lock); #endif /* Indicate to the SPD that we have completed this request */ return set_smc_args(TSP_SYSTEM_RESET_DONE, 0, 0, 0, 0, 0, 0, 0); } /******************************************************************************* * TSP fast smc handler. The secure monitor jumps to this function by * doing the ERET after populating X0-X7 registers. The arguments are received * in the function arguments in order. Once the service is rendered, this * function returns to Secure Monitor by raising SMC. ******************************************************************************/ tsp_args_t *tsp_smc_handler(uint64_t func, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t results[2]; uint64_t service_args[2]; uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; INFO("TSP: cpu 0x%x received %s smc 0x%x\n", read_mpidr(), ((func >> 31) & 1) == 1 ? "fast" : "standard", func); INFO("TSP: cpu 0x%x: %d smcs, %d erets\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count); /* Render secure services and obtain results here */ results[0] = arg1; results[1] = arg2; /* * Request a service back from dispatcher/secure monitor. This call * return and thereafter resume exectuion */ tsp_get_magic(service_args); /* Determine the function to perform based on the function ID */ switch (TSP_BARE_FID(func)) { case TSP_ADD: results[0] += service_args[0]; results[1] += service_args[1]; break; case TSP_SUB: results[0] -= service_args[0]; results[1] -= service_args[1]; break; case TSP_MUL: results[0] *= service_args[0]; results[1] *= service_args[1]; break; case TSP_DIV: results[0] /= service_args[0] ? service_args[0] : 1; results[1] /= service_args[1] ? service_args[1] : 1; break; default: break; } return set_smc_args(func, 0, results[0], results[1], 0, 0, 0, 0); } arm-trusted-firmware-1.0-aw-6/bl32/tsp/tsp_private.h000066400000000000000000000106661322600646200222760ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __TSP_PRIVATE_H__ #define __TSP_PRIVATE_H__ /* Definitions to help the assembler access the SMC/ERET args structure */ #define TSP_ARGS_SIZE 0x40 #define TSP_ARG0 0x0 #define TSP_ARG1 0x8 #define TSP_ARG2 0x10 #define TSP_ARG3 0x18 #define TSP_ARG4 0x20 #define TSP_ARG5 0x28 #define TSP_ARG6 0x30 #define TSP_ARG7 0x38 #define TSP_ARGS_END 0x40 #ifndef __ASSEMBLY__ #include #include /* For CACHE_WRITEBACK_GRANULE */ #include #include #include typedef struct work_statistics { uint32_t fiq_count; /* Number of FIQs on this cpu */ uint32_t irq_count; /* Number of IRQs on this cpu */ uint32_t sync_fiq_count; /* Number of sync. fiqs on this cpu */ uint32_t sync_fiq_ret_count; /* Number of fiq returns on this cpu */ uint32_t smc_count; /* Number of returns on this cpu */ uint32_t eret_count; /* Number of entries on this cpu */ uint32_t cpu_on_count; /* Number of cpu on requests */ uint32_t cpu_off_count; /* Number of cpu off requests */ uint32_t cpu_suspend_count; /* Number of cpu suspend requests */ uint32_t cpu_resume_count; /* Number of cpu resume requests */ } __aligned(CACHE_WRITEBACK_GRANULE) work_statistics_t; typedef struct tsp_args { uint64_t _regs[TSP_ARGS_END >> 3]; } __aligned(CACHE_WRITEBACK_GRANULE) tsp_args_t; /* Macros to access members of the above structure using their offsets */ #define read_sp_arg(args, offset) ((args)->_regs[offset >> 3]) #define write_sp_arg(args, offset, val) (((args)->_regs[offset >> 3]) \ = val) /* * Ensure that the assembler's view of the size of the tsp_args is the * same as the compilers */ CASSERT(TSP_ARGS_SIZE == sizeof(tsp_args_t), assert_sp_args_size_mismatch); void tsp_get_magic(uint64_t args[4]); tsp_args_t *tsp_cpu_resume_main(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7); tsp_args_t *tsp_cpu_suspend_main(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7); tsp_args_t *tsp_cpu_on_main(void); tsp_args_t *tsp_cpu_off_main(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7); /* Generic Timer functions */ void tsp_generic_timer_start(void); void tsp_generic_timer_handler(void); void tsp_generic_timer_stop(void); void tsp_generic_timer_save(void); void tsp_generic_timer_restore(void); /* FIQ management functions */ void tsp_update_sync_fiq_stats(uint32_t type, uint64_t elr_el3); /* Data structure to keep track of TSP statistics */ extern spinlock_t console_lock; extern work_statistics_t tsp_stats[PLATFORM_CORE_COUNT]; /* Vector table of jumps */ extern tsp_vectors_t tsp_vector_table; #endif /* __ASSEMBLY__ */ #endif /* __TSP_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/bl32/tsp/tsp_timer.c000066400000000000000000000106511322600646200217310ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "tsp_private.h" /******************************************************************************* * Data structure to keep track of per-cpu secure generic timer context across * power management operations. ******************************************************************************/ typedef struct timer_context { uint64_t cval; uint32_t ctl; } timer_context_t; static timer_context_t pcpu_timer_context[PLATFORM_CORE_COUNT]; /******************************************************************************* * This function initializes the generic timer to fire every 0.5 second ******************************************************************************/ void tsp_generic_timer_start(void) { uint64_t cval; uint32_t ctl = 0; /* The timer will fire every 0.5 second */ cval = read_cntpct_el0() + (read_cntfrq_el0() >> 1); write_cntps_cval_el1(cval); /* Enable the secure physical timer */ set_cntp_ctl_enable(ctl); write_cntps_ctl_el1(ctl); } /******************************************************************************* * This function deasserts the timer interrupt and sets it up again ******************************************************************************/ void tsp_generic_timer_handler(void) { /* Ensure that the timer did assert the interrupt */ assert(get_cntp_ctl_istatus(read_cntps_ctl_el1())); /* * Disable the timer and reprogram it. The barriers ensure that there is * no reordering of instructions around the reprogramming code. */ isb(); write_cntps_ctl_el1(0); tsp_generic_timer_start(); isb(); } /******************************************************************************* * This function deasserts the timer interrupt prior to cpu power down ******************************************************************************/ void tsp_generic_timer_stop(void) { /* Disable the timer */ write_cntps_ctl_el1(0); } /******************************************************************************* * This function saves the timer context prior to cpu suspension ******************************************************************************/ void tsp_generic_timer_save(void) { uint32_t linear_id = platform_get_core_pos(read_mpidr()); pcpu_timer_context[linear_id].cval = read_cntps_cval_el1(); pcpu_timer_context[linear_id].ctl = read_cntps_ctl_el1(); flush_dcache_range((uint64_t) &pcpu_timer_context[linear_id], sizeof(pcpu_timer_context[linear_id])); } /******************************************************************************* * This function restores the timer context post cpu resummption ******************************************************************************/ void tsp_generic_timer_restore(void) { uint32_t linear_id = platform_get_core_pos(read_mpidr()); write_cntps_cval_el1(pcpu_timer_context[linear_id].cval); write_cntps_ctl_el1(pcpu_timer_context[linear_id].ctl); } arm-trusted-firmware-1.0-aw-6/common/000077500000000000000000000000001322600646200174745ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/common/aarch64/000077500000000000000000000000001322600646200207245ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/common/aarch64/debug.S000066400000000000000000000125011322600646200221350ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include .globl asm_print_str .globl asm_print_hex .globl asm_assert .globl do_panic /* Since the max decimal input number is 65536 */ #define MAX_DEC_DIVISOR 10000 /* The offset to add to get ascii for numerals '0 - 9' */ #define ASCII_OFFSET_NUM 0x30 #if ASM_ASSERTION .section .rodata.assert_str, "aS" assert_msg1: .asciz "ASSERT: File " assert_msg2: .asciz " Line " /* * This macro is intended to be used to print the * line number in decimal. Used by asm_assert macro. * The max number expected is 65536. * In: x4 = the decimal to print. * Clobber: x30, x0, x1, x2, x5, x6 */ .macro asm_print_line_dec mov x6, #10 /* Divide by 10 after every loop iteration */ mov x5, #MAX_DEC_DIVISOR dec_print_loop: udiv x0, x4, x5 /* Get the quotient */ msub x4, x0, x5, x4 /* Find the remainder */ add x0, x0, #ASCII_OFFSET_NUM /* Convert to ascii */ bl plat_crash_console_putc udiv x5, x5, x6 /* Reduce divisor */ cbnz x5, dec_print_loop .endm /* --------------------------------------------------------------------------- * Assertion support in assembly. * The below function helps to support assertions in assembly where we do not * have a C runtime stack. Arguments to the function are : * x0 - File name * x1 - Line no * Clobber list : x30, x0, x1, x2, x3, x4, x5, x6. * --------------------------------------------------------------------------- */ func asm_assert mov x5, x0 mov x6, x1 /* Ensure the console is initialized */ bl plat_crash_console_init /* Check if the console is initialized */ cbz x0, _assert_loop /* The console is initialized */ adr x4, assert_msg1 bl asm_print_str mov x4, x5 bl asm_print_str adr x4, assert_msg2 bl asm_print_str /* Check if line number higher than max permitted */ tst x6, #~0xffff b.ne _assert_loop mov x4, x6 asm_print_line_dec _assert_loop: b _assert_loop #endif /* * This function prints a string from address in x4. * In: x4 = pointer to string. * Clobber: x30, x0, x1, x2, x3 */ func asm_print_str mov x3, x30 1: ldrb w0, [x4], #0x1 cbz x0, 2f bl plat_crash_console_putc b 1b 2: ret x3 /* * This function prints a hexadecimal number in x4. * In: x4 = the hexadecimal to print. * Clobber: x30, x0, x5, x1, x2, x3 */ func asm_print_hex mov x3, x30 mov x5, #64 /* No of bits to convert to ascii */ 1: sub x5, x5, #4 lsrv x0, x4, x5 and x0, x0, #0xf cmp x0, #0xA b.lo 2f /* Add by 0x27 in addition to ASCII_OFFSET_NUM * to get ascii for characters 'a - f'. */ add x0, x0, #0x27 2: add x0, x0, #ASCII_OFFSET_NUM bl plat_crash_console_putc cbnz x5, 1b ret x3 /*********************************************************** * The common implementation of do_panic for all BL stages ***********************************************************/ .section .rodata.panic_str, "aS" panic_msg: .asciz "PANIC at PC : 0x" /* --------------------------------------------------------------------------- * do_panic assumes that it is invoked from a C Runtime Environment ie a * valid stack exists. This call will not return. * Clobber list : if CRASH_REPORTING is not enabled then x30, x0 - x6 * --------------------------------------------------------------------------- */ /* This is for the non el3 BL stages to compile through */ .weak el3_panic func do_panic #if CRASH_REPORTING str x0, [sp, #-0x10]! mrs x0, currentel ubfx x0, x0, #2, #2 cmp x0, #0x3 ldr x0, [sp], #0x10 b.eq el3_panic #endif panic_common: /* * el3_panic will be redefined by the BL31 * crash reporting mechanism (if enabled) */ el3_panic: mov x6, x30 bl plat_crash_console_init /* Check if the console is initialized */ cbz x0, _panic_loop /* The console is initialized */ adr x4, panic_msg bl asm_print_str mov x4, x6 /* The panic location is lr -4 */ sub x4, x4, #4 bl asm_print_hex _panic_loop: b _panic_loop arm-trusted-firmware-1.0-aw-6/common/aarch64/early_exceptions.S000066400000000000000000000107171322600646200244330ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include .globl early_exceptions .section .vectors, "ax"; .align 11 /* ----------------------------------------------------- * Very simple stackless exception handlers used by BL2 * and BL3-1 bootloader stages. BL3-1 uses them before * stacks are setup. BL2 uses them throughout. * ----------------------------------------------------- */ .align 7 early_exceptions: /* ----------------------------------------------------- * Current EL with SP0 : 0x0 - 0x180 * ----------------------------------------------------- */ SynchronousExceptionSP0: mov x0, #SYNC_EXCEPTION_SP_EL0 bl plat_report_exception b SynchronousExceptionSP0 check_vector_size SynchronousExceptionSP0 .align 7 IrqSP0: mov x0, #IRQ_SP_EL0 bl plat_report_exception b IrqSP0 check_vector_size IrqSP0 .align 7 FiqSP0: mov x0, #FIQ_SP_EL0 bl plat_report_exception b FiqSP0 check_vector_size FiqSP0 .align 7 SErrorSP0: mov x0, #SERROR_SP_EL0 bl plat_report_exception b SErrorSP0 check_vector_size SErrorSP0 /* ----------------------------------------------------- * Current EL with SPx: 0x200 - 0x380 * ----------------------------------------------------- */ .align 7 SynchronousExceptionSPx: mov x0, #SYNC_EXCEPTION_SP_ELX bl plat_report_exception b SynchronousExceptionSPx check_vector_size SynchronousExceptionSPx .align 7 IrqSPx: mov x0, #IRQ_SP_ELX bl plat_report_exception b IrqSPx check_vector_size IrqSPx .align 7 FiqSPx: mov x0, #FIQ_SP_ELX bl plat_report_exception b FiqSPx check_vector_size FiqSPx .align 7 SErrorSPx: mov x0, #SERROR_SP_ELX bl plat_report_exception b SErrorSPx check_vector_size SErrorSPx /* ----------------------------------------------------- * Lower EL using AArch64 : 0x400 - 0x580 * ----------------------------------------------------- */ .align 7 SynchronousExceptionA64: mov x0, #SYNC_EXCEPTION_AARCH64 bl plat_report_exception b SynchronousExceptionA64 check_vector_size SynchronousExceptionA64 .align 7 IrqA64: mov x0, #IRQ_AARCH64 bl plat_report_exception b IrqA64 check_vector_size IrqA64 .align 7 FiqA64: mov x0, #FIQ_AARCH64 bl plat_report_exception b FiqA64 check_vector_size FiqA64 .align 7 SErrorA64: mov x0, #SERROR_AARCH64 bl plat_report_exception b SErrorA64 check_vector_size SErrorA64 /* ----------------------------------------------------- * Lower EL using AArch32 : 0x0 - 0x180 * ----------------------------------------------------- */ .align 7 SynchronousExceptionA32: mov x0, #SYNC_EXCEPTION_AARCH32 bl plat_report_exception b SynchronousExceptionA32 check_vector_size SynchronousExceptionA32 .align 7 IrqA32: mov x0, #IRQ_AARCH32 bl plat_report_exception b IrqA32 check_vector_size IrqA32 .align 7 FiqA32: mov x0, #FIQ_AARCH32 bl plat_report_exception b FiqA32 check_vector_size FiqA32 .align 7 SErrorA32: mov x0, #SERROR_AARCH32 bl plat_report_exception b SErrorA32 check_vector_size SErrorA32 arm-trusted-firmware-1.0-aw-6/common/bl_common.c000066400000000000000000000241221322600646200216060ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include unsigned long page_align(unsigned long value, unsigned dir) { unsigned long page_size = 1 << FOUR_KB_SHIFT; /* Round up the limit to the next page boundary */ if (value & (page_size - 1)) { value &= ~(page_size - 1); if (dir == UP) value += page_size; } return value; } static inline unsigned int is_page_aligned (unsigned long addr) { const unsigned long page_size = 1 << FOUR_KB_SHIFT; return (addr & (page_size - 1)) == 0; } void change_security_state(unsigned int target_security_state) { unsigned long scr = read_scr(); assert(sec_state_is_valid(target_security_state)); if (target_security_state == SECURE) scr &= ~SCR_NS_BIT; else scr |= SCR_NS_BIT; write_scr(scr); } /****************************************************************************** * Determine whether the memory region delimited by 'addr' and 'size' is free, * given the extents of free memory. * Return 1 if it is free, 0 otherwise. *****************************************************************************/ static int is_mem_free(uint64_t free_base, size_t free_size, uint64_t addr, size_t size) { return (addr >= free_base) && (addr + size <= free_base + free_size); } /****************************************************************************** * Inside a given memory region, determine whether a sub-region of memory is * closer from the top or the bottom of the encompassing region. Return the * size of the smallest chunk of free memory surrounding the sub-region in * 'small_chunk_size'. *****************************************************************************/ static unsigned int choose_mem_pos(uint64_t mem_start, uint64_t mem_end, uint64_t submem_start, uint64_t submem_end, size_t *small_chunk_size) { size_t top_chunk_size, bottom_chunk_size; assert(mem_start <= submem_start); assert(submem_start <= submem_end); assert(submem_end <= mem_end); assert(small_chunk_size != NULL); top_chunk_size = mem_end - submem_end; bottom_chunk_size = submem_start - mem_start; if (top_chunk_size < bottom_chunk_size) { *small_chunk_size = top_chunk_size; return TOP; } else { *small_chunk_size = bottom_chunk_size; return BOTTOM; } } /****************************************************************************** * Reserve the memory region delimited by 'addr' and 'size'. The extents of free * memory are passed in 'free_base' and 'free_size' and they will be updated to * reflect the memory usage. * The caller must ensure the memory to reserve is free. *****************************************************************************/ void reserve_mem(uint64_t *free_base, size_t *free_size, uint64_t addr, size_t size) { size_t discard_size; size_t reserved_size; unsigned int pos; assert(free_base != NULL); assert(free_size != NULL); assert(is_mem_free(*free_base, *free_size, addr, size)); pos = choose_mem_pos(*free_base, *free_base + *free_size, addr, addr + size, &discard_size); reserved_size = size + discard_size; *free_size -= reserved_size; if (pos == BOTTOM) *free_base = addr + size; VERBOSE("Reserved %u bytes (discarded %u bytes %s)\n", reserved_size, discard_size, pos == TOP ? "above" : "below"); } static void dump_load_info(unsigned long image_load_addr, unsigned long image_size, const meminfo_t *mem_layout) { INFO("Trying to load image at address 0x%lx, size = 0x%lx\n", image_load_addr, image_size); INFO("Current memory layout:\n"); INFO(" total region = [0x%lx, 0x%lx]\n", mem_layout->total_base, mem_layout->total_base + mem_layout->total_size); INFO(" free region = [0x%lx, 0x%lx]\n", mem_layout->free_base, mem_layout->free_base + mem_layout->free_size); } /* Generic function to return the size of an image */ unsigned long image_size(const char *image_name) { uintptr_t dev_handle; uintptr_t image_handle; uintptr_t image_spec; size_t image_size = 0; int io_result = IO_FAIL; assert(image_name != NULL); /* Obtain a reference to the image by querying the platform layer */ io_result = plat_get_image_source(image_name, &dev_handle, &image_spec); if (io_result != IO_SUCCESS) { WARN("Failed to obtain reference to image '%s' (%i)\n", image_name, io_result); return 0; } /* Attempt to access the image */ io_result = io_open(dev_handle, image_spec, &image_handle); if (io_result != IO_SUCCESS) { WARN("Failed to access image '%s' (%i)\n", image_name, io_result); return 0; } /* Find the size of the image */ io_result = io_size(image_handle, &image_size); if ((io_result != IO_SUCCESS) || (image_size == 0)) { WARN("Failed to determine the size of the image '%s' file (%i)\n", image_name, io_result); } io_result = io_close(image_handle); /* Ignore improbable/unrecoverable error in 'close' */ /* TODO: Consider maintaining open device connection from this * bootloader stage */ io_result = io_dev_close(dev_handle); /* Ignore improbable/unrecoverable error in 'dev_close' */ return image_size; } /******************************************************************************* * Generic function to load an image at a specific address given a name and * extents of free memory. It updates the memory layout if the load is * successful, as well as the image information and the entry point information. * The caller might pass a NULL pointer for the entry point if it is not * interested in this information, e.g. because the image just needs to be * loaded in memory but won't ever be executed. * Returns 0 on success, a negative error code otherwise. ******************************************************************************/ int load_image(meminfo_t *mem_layout, const char *image_name, uint64_t image_base, image_info_t *image_data, entry_point_info_t *entry_point_info) { uintptr_t dev_handle; uintptr_t image_handle; uintptr_t image_spec; size_t image_size; size_t bytes_read; int io_result = IO_FAIL; assert(mem_layout != NULL); assert(image_name != NULL); assert(image_data != NULL); assert(image_data->h.version >= VERSION_1); /* Obtain a reference to the image by querying the platform layer */ io_result = plat_get_image_source(image_name, &dev_handle, &image_spec); if (io_result != IO_SUCCESS) { WARN("Failed to obtain reference to image '%s' (%i)\n", image_name, io_result); return io_result; } /* Attempt to access the image */ io_result = io_open(dev_handle, image_spec, &image_handle); if (io_result != IO_SUCCESS) { WARN("Failed to access image '%s' (%i)\n", image_name, io_result); return io_result; } INFO("Loading file '%s' at address 0x%lx\n", image_name, image_base); /* Find the size of the image */ io_result = io_size(image_handle, &image_size); if ((io_result != IO_SUCCESS) || (image_size == 0)) { WARN("Failed to determine the size of the image '%s' file (%i)\n", image_name, io_result); goto exit; } /* Check that the memory where the image will be loaded is free */ if (!is_mem_free(mem_layout->free_base, mem_layout->free_size, image_base, image_size)) { WARN("Failed to reserve memory: 0x%lx - 0x%lx\n", image_base, image_base + image_size); dump_load_info(image_base, image_size, mem_layout); io_result = -ENOMEM; goto exit; } /* We have enough space so load the image now */ /* TODO: Consider whether to try to recover/retry a partially successful read */ io_result = io_read(image_handle, image_base, image_size, &bytes_read); if ((io_result != IO_SUCCESS) || (bytes_read < image_size)) { WARN("Failed to load '%s' file (%i)\n", image_name, io_result); goto exit; } /* * Update the memory usage info. * This is done after the actual loading so that it is not updated when * the load is unsuccessful. */ reserve_mem(&mem_layout->free_base, &mem_layout->free_size, image_base, image_size); image_data->image_base = image_base; image_data->image_size = image_size; if (entry_point_info != NULL) entry_point_info->pc = image_base; /* * File has been successfully loaded. * Flush the image in TZRAM so that the next EL can see it. */ flush_dcache_range(image_base, image_size); INFO("File '%s' loaded: 0x%lx - 0x%lx\n", image_name, image_base, image_base + image_size); exit: io_close(image_handle); /* Ignore improbable/unrecoverable error in 'close' */ /* TODO: Consider maintaining open device connection from this bootloader stage */ io_dev_close(dev_handle); /* Ignore improbable/unrecoverable error in 'dev_close' */ return io_result; } arm-trusted-firmware-1.0-aw-6/common/tf_printf.c000066400000000000000000000101651322600646200216360ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include /*********************************************************** * The tf_printf implementation for all BL stages ***********************************************************/ static void unsigned_num_print(unsigned long int unum, unsigned int radix) { /* Just need enough space to store 64 bit decimal integer */ unsigned char num_buf[20]; int i = 0 , rem; do { rem = unum % radix; if (rem < 0xa) num_buf[i++] = '0' + rem; else num_buf[i++] = 'a' + (rem - 0xa); } while (unum /= radix); while (--i >= 0) putchar(num_buf[i]); } static void string_print(const char *str) { while (*str) putchar(*str++); } /******************************************************************* * Reduced format print for Trusted firmware. * The following formats are supported by this print * %x - 32 bit hexadecimal format * %llx and %lx -64 bit hexadecimal format * %s - string format * %d or %i - signed 32 bit decimal format * %u - unsigned 32 bit decimal format * %ld and %lld - signed 64 bit decimal format * %lu and %llu - unsigned 64 bit decimal format * Exits on all other formats. *******************************************************************/ void tf_printf(const char *fmt, ...) { va_list args; int bit64; int64_t num; uint64_t unum; char *str; va_start(args, fmt); while (*fmt) { bit64 = 0; if (*fmt == '%') { fmt++; /* Check the format specifier */ loop: switch (*fmt) { case 'i': /* Fall through to next one */ case 'd': if (bit64) num = va_arg(args, int64_t); else num = va_arg(args, int32_t); if (num < 0) { putchar('-'); unum = (unsigned long int)-num; } else unum = (unsigned long int)num; unsigned_num_print(unum, 10); break; case 's': str = va_arg(args, char *); string_print(str); break; case 'x': if (bit64) unum = va_arg(args, uint64_t); else unum = va_arg(args, uint32_t); unsigned_num_print(unum, 16); break; case 'p': unum =(uint64_t)va_arg(args, void *); unsigned_num_print(unum, 16); break; case 'z': fmt++; bit64 = sizeof(long) == 0x8 ? 1:0; goto loop; case 'l': bit64 = 1; fmt++; goto loop; case 'u': if (bit64) unum = va_arg(args, uint64_t); else unum = va_arg(args, uint32_t); unsigned_num_print(unum, 10); break; default: /* Exit on any other format specifier */ goto exit; } fmt++; continue; } //for windos newline"\r\n" else if (*fmt == '\n') { putchar('\r'); } putchar(*fmt++); } exit: va_end(args); } arm-trusted-firmware-1.0-aw-6/contributing.md000066400000000000000000000143031322600646200212360ustar00rootroot00000000000000Contributing to ARM Trusted Firmware ==================================== Before you start contributing to this project you must sign the ARM Contributor License Agreement (CLA). Individuals who want to contribute their own work must sign and return an Individual CLA. Companies that want to contribute must sign and return a Corporate CLA if their employees' intellectual property has been assigned to the employer. Copies of the CLAs are available from the [contributing page] of the ARM website. For this project, ARM also requires the GitHub account name(s) associated with each individual contributor or the designated employees of corporate contributors. Only contributions originating from these accounts will be considered covered by the CLA. To avoid delay, you should provide the Github account name(s) at the same time as the signed CLA. ARM reserves the right to not accept a contribution. This may be for technical, commercial or legal reasons. Getting Started --------------- * Make sure you have a [GitHub account]. * Create an [issue] for your work if one does not already exist. This gives everyone visibility of whether others are working on something similar. ARM licensees may contact ARM directly via their partner managers instead if they prefer. * Note that the [issue] tracker for this project is in a separate [issue tracking repository]. Please follow the guidelines in that repository. * If you intend to include Third Party IP in your contribution, please raise a separate [issue] for this and ensure that the changes that include Third Party IP are made on a separate topic branch. * [Fork][] [arm-trusted-firmware][] on GitHub. * Clone the fork to your own machine. * Create a local topic branch based on the [arm-trusted-firmware][] `master` branch. Making Changes -------------- * Make commits of logical units. See these general [Git guidelines] for contributing to a project. * Follow the [Linux coding style]; this style is enforced for the ARM Trusted Firmware project (style errors only, not warnings). * Use the checkpatch.pl script provided with the Linux source tree. A Makefile target is provided for convenience (see section 2 in the [User Guide]). * Keep the commits on topic. If you need to fix another bug or make another enhancement, please create a separate [issue] and address it on a separate topic branch. * Avoid long commit series. If you do have a long series, consider whether some commits should be squashed together or addressed in a separate topic. * Make sure your commit messages are in the proper format. If a commit fixes a GitHub [issue], include a reference (e.g. "fixes arm-software/tf-issues#45"); this ensures the [issue] is [automatically closed] when merged into the [arm-trusted-firmware] `master` branch. * Where appropriate, please update the documentation. * Consider whether the [User Guide], [Porting Guide], [Firmware Design] or other in-source documentation needs updating. * If this is your first contribution, you may add your name or your company name to the [Acknowledgements] file. * For topics with multiple commits, you should make all documentation changes (and nothing else) in the last commit of the series. Otherwise, include the documentation changes within the single commit. * Please test your changes. As a minimum, ensure UEFI boots to the shell on the Foundation FVP. See the "[Running the software]" section of the [User Guide] for more information. Submitting Changes ------------------ * Ensure we have your signed CLA. * Push your local changes to your fork of the repository. * Submit a [pull request] to the [arm-trusted-firmware] `integration` branch. * The changes in the [pull request] will then undergo further review and testing. Any review comments will be made as comments on the [pull request]. This may require you to do some rework. * When the changes are accepted, ARM will integrate them. * Typically, ARM will merge the [pull request] into the `integration` branch within the GitHub UI, creating a merge commit. * Please avoid creating merge commits in the [pull request] itself. * If the [pull request] is not based on a recent commit, ARM may rebase it onto the `master` branch first, or ask you to do this. * If the [pull request] cannot be automatically merged, ARM will ask you to rebase it onto the `master` branch. * After final integration testing, ARM will push your merge commit to the `master` branch. If a problem is found at this stage, the merge commit will be removed from the `integration` branch and ARM will ask you to create a new pull request to resolve the problem. * Please do not delete your topic branch until it is safely merged into the `master` branch. - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ [User Guide]: ./docs/user-guide.md [Running the software]: ./docs/user-guide.md#6--running-the-software [Porting Guide]: ./docs/porting-guide.md [Firmware Design]: ./docs/firmware-design.md [Acknowledgements]: ./acknowledgements.md "Contributor acknowledgements" [contributing page]: http://www.arm.com/community/open-source-contributing.php [GitHub account]: https://github.com/signup/free [Fork]: https://help.github.com/articles/fork-a-repo [issue tracking repository]: https://github.com/ARM-software/tf-issues [issue]: https://github.com/ARM-software/tf-issues/issues [pull request]: https://help.github.com/articles/using-pull-requests [automatically closed]: https://help.github.com/articles/closing-issues-via-commit-messages [Git guidelines]: http://git-scm.com/book/ch5-2.html [Linux coding style]: https://www.kernel.org/doc/Documentation/CodingStyle [arm-trusted-firmware]: https://github.com/ARM-software/arm-trusted-firmware arm-trusted-firmware-1.0-aw-6/docs/000077500000000000000000000000001322600646200171345ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/docs/change-log.md000066400000000000000000000551251322600646200214720ustar00rootroot00000000000000ARM Trusted Firmware - version 1.0 ================================== New features ------------ * It is now possible to map higher physical addresses using non-flat virtual to physical address mappings in the MMU setup. * Wider use is now made of the per-CPU data cache in BL3-1 to store: * Pointers to the non-secure and secure security state contexts. * A pointer to the CPU-specific operations. * A pointer to PSCI specific information (for example the current power state). * A crash reporting buffer. * The following RAM usage improvements result in a BL3-1 RAM usage reduction from 96KB to 56KB (for FVP with TSPD), and a total RAM usage reduction across all images from 208KB to 88KB, compared to the previous release. * Removed the separate `early_exception` vectors from BL3-1 (2KB code size saving). * Removed NSRAM from the FVP memory map, allowing the removal of one (4KB) translation table. * Eliminated the internal `psci_suspend_context` array, saving 2KB. * Correctly dimensioned the PSCI `aff_map_node` array, saving 1.5KB in the FVP port. * Removed calling CPU mpidr from the bakery lock API, saving 160 bytes. * Removed current CPU mpidr from PSCI common code, saving 160 bytes. * Inlined the mmio accessor functions, saving 360 bytes. * Fully reclaimed all BL1 RW memory and BL2 memory on the FVP port by overlaying the BL3-1/BL3-2 NOBITS sections on top of these at runtime. * Made storing the FP register context optional, saving 0.5KB per context (8KB on the FVP port, with TSPD enabled and running on 8 CPUs). * Implemented a leaner `tf_printf()` function, allowing the stack to be greatly reduced. * Removed coherent stacks from the codebase. Stacks allocated in normal memory are now used before and after the MMU is enabled. This saves 768 bytes per CPU in BL3-1. * Reworked the crash reporting in BL3-1 to use less stack. * Optimized the EL3 register state stored in the `cpu_context` structure so that registers that do not change during normal execution are re-initialized each time during cold/warm boot, rather than restored from memory. This saves about 1.2KB. * As a result of some of the above, reduced the runtime stack size in all BL images. For BL3-1, this saves 1KB per CPU. * PSCI SMC handler improvements to correctly handle calls from secure states and from AArch32. * CPU contexts are now initialized from the `entry_point_info`. BL3-1 fully determines the exception level to use for the non-trusted firmware (BL3-3) based on the SPSR value provided by the BL2 platform code (or otherwise provided to BL3-1). This allows platform code to directly run non-trusted firmware payloads at either EL2 or EL1 without requiring an EL2 stub or OS loader. * Code refactoring improvements: * Refactored `fvp_config` into a common platform header. * Refactored the fvp gic code to be a generic driver that no longer has an explicit dependency on platform code. * Refactored the CCI-400 driver to not have dependency on platform code. * Simplified the IO driver so it's no longer necessary to call `io_init()` and moved all the IO storage framework code to one place. * Simplified the interface the the TZC-400 driver. * Clarified the platform porting interface to the TSP. * Reworked the TSPD setup code to support the alternate BL3-2 intialization flow where BL3-1 generic code hands control to BL3-2, rather than expecting the TSPD to hand control directly to BL3-2. * Considerable rework to PSCI generic code to support CPU specific operations. * Improved console log output, by: * Adding the concept of debug log levels. * Rationalizing the existing debug messages and adding new ones. * Printing out the version of each BL stage at runtime. * Adding support for printing console output from assembler code, including when a crash occurs before the C runtime is initialized. * Moved up to the latest versions of the FVPs, toolchain, EDK2, kernel, Linaro file system and DS-5. * On the FVP port, made the use of the Trusted DRAM region optional at build time (off by default). Normal platforms will not have such a "ready-to-use" DRAM area so it is not a good example to use it. * Added support for PSCI `SYSTEM_OFF` and `SYSTEM_RESET` APIs. * Added support for CPU specific reset sequences, power down sequences and register dumping during crash reporting. The CPU specific reset sequences include support for errata workarounds. * Merged the Juno port into the master branch. Added support for CPU hotplug and CPU idle. Updated the user guide to describe how to build and run on the Juno platform. Issues resolved since last release ---------------------------------- * Removed the concept of top/bottom image loading. The image loader now automatically detects the position of the image inside the current memory layout and updates the layout to minimize fragementation. This resolves the image loader limitations of previously releases. There are currently no plans to support dynamic image loading. * CPU idle now works on the publicized version of the Foundation FVP. * All known issues relating to the compiler version used have now been resolved. This TF version uses Linaro toolchain 14.07 (based on GCC 4.9). Known issues ------------ * GICv3 support is experimental. The Linux kernel patches to support this are not widely available. There are known issues with GICv3 initialization in the ARM Trusted Firmware. * While this version greatly reduces the on-chip RAM requirements, there are further RAM usage enhancements that could be made. * The firmware design documentation for the Test Secure-EL1 Payload (TSP) and its dispatcher (TSPD) is incomplete. Similarly for the PSCI section. * The Juno-specific firmware design documentation is incomplete. * Some recent enhancements to the FVP port have not yet been translated into the Juno port. These will be tracked via the tf-issues project. * The Linux kernel version referred to in the user guide has DVFS and HMP support disabled due to some known instabilities at the time of this release. A future kernel version will re-enable these features. * DS-5 v5.19 does not detect Version 5.8 of the Cortex-A57-A53 Base FVPs in CADI server mode. This is because the `` reported by the FVP in this version has changed. For example, for the Cortex-A57x4-A53x4 Base FVP, the `` reported by the FVP is `FVP_Base_Cortex_A57x4_A53x4`, while DS-5 expects it to be `FVP_Base_A57x4_A53x4`. The temporary fix to this problem is to change the name of the FVP in `sw/debugger/configdb/Boards/ARM FVP/Base_A57x4_A53x4/cadi_config.xml`. Change the following line: System Generator:FVP_Base_A57x4_A53x4 to System Generator:FVP_Base_Cortex-A57x4_A53x4 A similar change can be made to the other Cortex-A57-A53 Base FVP variants. ARM Trusted Firmware - version 0.4 ================================== New features ------------ * Makefile improvements: * Improved dependency checking when building. * Removed `dump` target (build now always produces dump files). * Enabled platform ports to optionally make use of parts of the Trusted Firmware (e.g. BL3-1 only), rather than being forced to use all parts. Also made the `fip` target optional. * Specified the full path to source files and removed use of the `vpath` keyword. * Provided translation table library code for potential re-use by platforms other than the FVPs. * Moved architectural timer setup to platform-specific code. * Added standby state support to PSCI cpu_suspend implementation. * SRAM usage improvements: * Started using the `-ffunction-sections`, `-fdata-sections` and `--gc-sections` compiler/linker options to remove unused code and data from the images. Previously, all common functions were being built into all binary images, whether or not they were actually used. * Placed all assembler functions in their own section to allow more unused functions to be removed from images. * Updated BL1 and BL2 to use a single coherent stack each, rather than one per CPU. * Changed variables that were unnecessarily declared and initialized as non-const (i.e. in the .data section) so they are either uninitialized (zero init) or const. * Moved the Test Secure-EL1 Payload (BL3-2) to execute in Trusted SRAM by default. The option for it to run in Trusted DRAM remains. * Implemented a TrustZone Address Space Controller (TZC-400) driver. A default configuration is provided for the Base FVPs. This means the model parameter `-C bp.secure_memory=1` is now supported. * Started saving the PSCI cpu_suspend 'power_state' parameter prior to suspending a CPU. This allows platforms that implement multiple power-down states at the same affinity level to identify a specific state. * Refactored the entire codebase to reduce the amount of nesting in header files and to make the use of system/user includes more consistent. Also split platform.h to separate out the platform porting declarations from the required platform porting definitions and the definitions/declarations specific to the platform port. * Optimized the data cache clean/invalidate operations. * Improved the BL3-1 unhandled exception handling and reporting. Unhandled exceptions now result in a dump of registers to the console. * Major rework to the handover interface between BL stages, in particular the interface to BL3-1. The interface now conforms to a specification and is more future proof. * Added support for optionally making the BL3-1 entrypoint a reset handler (instead of BL1). This allows platforms with an alternative image loading architecture to re-use BL3-1 with fewer modifications to generic code. * Reserved some DDR DRAM for secure use on FVP platforms to avoid future compatibility problems with non-secure software. * Added support for secure interrupts targeting the Secure-EL1 Payload (SP) (using GICv2 routing only). Demonstrated this working by adding an interrupt target and supporting test code to the TSP. Also demonstrated non-secure interrupt handling during TSP processing. Issues resolved since last release ---------------------------------- * Now support use of the model parameter `-C bp.secure_memory=1` in the Base FVPs (see **New features**). * Support for secure world interrupt handling now available (see **New features**). * Made enough SRAM savings (see **New features**) to enable the Test Secure-EL1 Payload (BL3-2) to execute in Trusted SRAM by default. * The tested filesystem used for this release (Linaro AArch64 OpenEmbedded 14.04) now correctly reports progress in the console. * Improved the Makefile structure to make it easier to separate out parts of the Trusted Firmware for re-use in platform ports. Also, improved target dependency checking. Known issues ------------ * GICv3 support is experimental. The Linux kernel patches to support this are not widely available. There are known issues with GICv3 initialization in the ARM Trusted Firmware. * Dynamic image loading is not available yet. The current image loader implementation (used to load BL2 and all subsequent images) has some limitations. Changing BL2 or BL3-1 load addresses in certain ways can lead to loading errors, even if the images should theoretically fit in memory. * The ARM Trusted Firmware still uses too much on-chip Trusted SRAM. A number of RAM usage enhancements have been identified to rectify this situation. * CPU idle does not work on the advertised version of the Foundation FVP. Some FVP fixes are required that are not available externally at the time of writing. This can be worked around by disabling CPU idle in the Linux kernel. * Various bugs in ARM Trusted Firmware, UEFI and the Linux kernel have been observed when using Linaro toolchain versions later than 13.11. Although most of these have been fixed, some remain at the time of writing. These mainly seem to relate to a subtle change in the way the compiler converts between 64-bit and 32-bit values (e.g. during casting operations), which reveals previously hidden bugs in client code. * The firmware design documentation for the Test Secure-EL1 Payload (TSP) and its dispatcher (TSPD) is incomplete. Similarly for the PSCI section. ARM Trusted Firmware - version 0.3 ================================== New features ------------ * Support for Foundation FVP Version 2.0 added. The documented UEFI configuration disables some devices that are unavailable in the Foundation FVP, including MMC and CLCD. The resultant UEFI binary can be used on the AEMv8 and Cortex-A57-A53 Base FVPs, as well as the Foundation FVP. NOTE: The software will not work on Version 1.0 of the Foundation FVP. * Enabled third party contributions. Added a new contributing.md containing instructions for how to contribute and updated copyright text in all files to acknowledge contributors. * The PSCI CPU_SUSPEND API has been stabilised to the extent where it can be used for entry into power down states with the following restrictions: - Entry into standby states is not supported. - The API is only supported on the AEMv8 and Cortex-A57-A53 Base FVPs. * The PSCI AFFINITY_INFO api has undergone limited testing on the Base FVPs to allow experimental use. * Required C library and runtime header files are now included locally in ARM Trusted Firmware instead of depending on the toolchain standard include paths. The local implementation has been cleaned up and reduced in scope. * Added I/O abstraction framework, primarily to allow generic code to load images in a platform-independent way. The existing image loading code has been reworked to use the new framework. Semi-hosting and NOR flash I/O drivers are provided. * Introduced Firmware Image Package (FIP) handling code and tools. A FIP combines multiple firmware images with a Table of Contents (ToC) into a single binary image. The new FIP driver is another type of I/O driver. The Makefile builds a FIP by default and the FVP platform code expect to load a FIP from NOR flash, although some support for image loading using semi- hosting is retained. NOTE: Building a FIP by default is a non-backwards-compatible change. NOTE: Generic BL2 code now loads a BL3-3 (non-trusted firmware) image into DRAM instead of expecting this to be pre-loaded at known location. This is also a non-backwards-compatible change. NOTE: Some non-trusted firmware (e.g. UEFI) will need to be rebuilt so that it knows the new location to execute from and no longer needs to copy particular code modules to DRAM itself. * Reworked BL2 to BL3-1 handover interface. A new composite structure (bl31_args) holds the superset of information that needs to be passed from BL2 to BL3-1, including information on how handover execution control to BL3-2 (if present) and BL3-3 (non-trusted firmware). * Added library support for CPU context management, allowing the saving and restoring of - Shared system registers between Secure-EL1 and EL1. - VFP registers. - Essential EL3 system registers. * Added a framework for implementing EL3 runtime services. Reworked the PSCI implementation to be one such runtime service. * Reworked the exception handling logic, making use of both SP_EL0 and SP_EL3 stack pointers for determining the type of exception, managing general purpose and system register context on exception entry/exit, and handling SMCs. SMCs are directed to the correct EL3 runtime service. * Added support for a Test Secure-EL1 Payload (TSP) and a corresponding Dispatcher (TSPD), which is loaded as an EL3 runtime service. The TSPD implements Secure Monitor functionality such as world switching and EL1 context management, and is responsible for communication with the TSP. NOTE: The TSPD does not yet contain support for secure world interrupts. NOTE: The TSP/TSPD is not built by default. Issues resolved since last release ---------------------------------- * Support has been added for switching context between secure and normal worlds in EL3. * PSCI API calls `AFFINITY_INFO` & `PSCI_VERSION` have now been tested (to a limited extent). * The ARM Trusted Firmware build artifacts are now placed in the `./build` directory and sub-directories instead of being placed in the root of the project. * The ARM Trusted Firmware is now free from build warnings. Build warnings are now treated as errors. * The ARM Trusted Firmware now provides C library support locally within the project to maintain compatibility between toolchains/systems. * The PSCI locking code has been reworked so it no longer takes locks in an incorrect sequence. * The RAM-disk method of loading a Linux file-system has been confirmed to work with the ARM Trusted Firmware and Linux kernel version (based on version 3.13) used in this release, for both Foundation and Base FVPs. Known issues ------------ The following is a list of issues which are expected to be fixed in the future releases of the ARM Trusted Firmware. * The TrustZone Address Space Controller (TZC-400) is not being programmed yet. Use of model parameter `-C bp.secure_memory=1` is not supported. * No support yet for secure world interrupt handling. * GICv3 support is experimental. The Linux kernel patches to support this are not widely available. There are known issues with GICv3 initialization in the ARM Trusted Firmware. * Dynamic image loading is not available yet. The current image loader implementation (used to load BL2 and all subsequent images) has some limitations. Changing BL2 or BL3-1 load addresses in certain ways can lead to loading errors, even if the images should theoretically fit in memory. * The ARM Trusted Firmware uses too much on-chip Trusted SRAM. Currently the Test Secure-EL1 Payload (BL3-2) executes in Trusted DRAM since there is not enough SRAM. A number of RAM usage enhancements have been identified to rectify this situation. * CPU idle does not work on the advertised version of the Foundation FVP. Some FVP fixes are required that are not available externally at the time of writing. * Various bugs in ARM Trusted Firmware, UEFI and the Linux kernel have been observed when using Linaro toolchain versions later than 13.11. Although most of these have been fixed, some remain at the time of writing. These mainly seem to relate to a subtle change in the way the compiler converts between 64-bit and 32-bit values (e.g. during casting operations), which reveals previously hidden bugs in client code. * The tested filesystem used for this release (Linaro AArch64 OpenEmbedded 14.01) does not report progress correctly in the console. It only seems to produce error output, not standard output. It otherwise appears to function correctly. Other filesystem versions on the same software stack do not exhibit the problem. * The Makefile structure doesn't make it easy to separate out parts of the Trusted Firmware for re-use in platform ports, for example if only BL3-1 is required in a platform port. Also, dependency checking in the Makefile is flawed. * The firmware design documentation for the Test Secure-EL1 Payload (TSP) and its dispatcher (TSPD) is incomplete. Similarly for the PSCI section. ARM Trusted Firmware - version 0.2 ================================== New features ------------ * First source release. * Code for the PSCI suspend feature is supplied, although this is not enabled by default since there are known issues (see below). Issues resolved since last release ---------------------------------- * The "psci" nodes in the FDTs provided in this release now fully comply with the recommendations made in the PSCI specification. Known issues ------------ The following is a list of issues which are expected to be fixed in the future releases of the ARM Trusted Firmware. * The TrustZone Address Space Controller (TZC-400) is not being programmed yet. Use of model parameter `-C bp.secure_memory=1` is not supported. * No support yet for secure world interrupt handling or for switching context between secure and normal worlds in EL3. * GICv3 support is experimental. The Linux kernel patches to support this are not widely available. There are known issues with GICv3 initialization in the ARM Trusted Firmware. * Dynamic image loading is not available yet. The current image loader implementation (used to load BL2 and all subsequent images) has some limitations. Changing BL2 or BL3-1 load addresses in certain ways can lead to loading errors, even if the images should theoretically fit in memory. * Although support for PSCI `CPU_SUSPEND` is present, it is not yet stable and ready for use. * PSCI API calls `AFFINITY_INFO` & `PSCI_VERSION` are implemented but have not been tested. * The ARM Trusted Firmware make files result in all build artifacts being placed in the root of the project. These should be placed in appropriate sub-directories. * The compilation of ARM Trusted Firmware is not free from compilation warnings. Some of these warnings have not been investigated yet so they could mask real bugs. * The ARM Trusted Firmware currently uses toolchain/system include files like stdio.h. It should provide versions of these within the project to maintain compatibility between toolchains/systems. * The PSCI code takes some locks in an incorrect sequence. This may cause problems with suspend and hotplug in certain conditions. * The Linux kernel used in this release is based on version 3.12-rc4. Using this kernel with the ARM Trusted Firmware fails to start the file-system as a RAM-disk. It fails to execute user-space `init` from the RAM-disk. As an alternative, the VirtioBlock mechanism can be used to provide a file-system to the kernel. - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ arm-trusted-firmware-1.0-aw-6/docs/cpu-errata-workarounds.md000066400000000000000000000033271322600646200241020ustar00rootroot00000000000000ARM CPU Errata Workarounds ========================== ARM Trusted Firmware exports a series of build flags which control the errata workarounds that are applied to each CPU by the reset handler. The errata details can be found in the CPU specifc errata documents published by ARM. The errata workarounds are implemented for a particular revision or a set of processor revisions. This check is done in the debug build. Each errata workaround is identified by its `ID` as specified in the processor's errata notice document. The format of the define used to enable/disable the errata is `ERRATA__` where the `Processor name` is either `A57` for the `Cortex_A57` CPU or `A53` for `Cortex_A53` CPU. All workarounds are disabled by default. The platform is reponsible for enabling these workarounds according to its requirement by defining the errata workaround build flags in the platform specific makefile. In the current implementation, a platform which has more than 1 variant with different revisions of a processor has no runtime mechanism available for it to specify which errata workarounds should be enabled or not. The value of the build flags are 0 by default, that is, disabled. Any other value will enable it. For Cortex A57, following errata build flags are defined : * `ERRATA_A57_806969`: This applies errata 806969 workaround to cortex a57 CPU. This needs to be enabled only for revision r0p0 of the CPU. * `ERRATA_A57_813420`: This applies errata 813420 workaround to cortex a57 CPU. This needs to be enabled only for revision r0p0 of the CPU. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2014, ARM Limited and Contributors. All rights reserved._ arm-trusted-firmware-1.0-aw-6/docs/diagrams/000077500000000000000000000000001322600646200207235ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/docs/diagrams/non-sec-int-handling.png000066400000000000000000007475101322600646200253630ustar00rootroot00000000000000‰PNG  IHDRœÀ0ÅæsRGB®ÎégAMA± üa pHYs.#.#x¥?vÿ¥IDATx^ìý °]g}çùêV*7=“[4“šá¶1rîÌtàŽÝeZd†t÷%dœä¸¸—Lhƒcå*)…‰Û ±°Üð`ƒ„ƒ…íÀdžKi«í8ö±¨H"É66X’ ÄI–‘_$ü‚¡aR©®šû×ù=~ô{Ö^ûu­ý¬õ|W}êÔ9ÏzÙko³ÎZ_í}öªÿ“‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰©SQ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰©cÓŒ£Þ¡§üΑݻößt×}×À4¾õø_Ùñä™ç¿³r|Éo²}³=üú£ÛdÏ@ØEý¢7ÿŸÿnåw?SNÓ´Qïȱ‡íÞǾô/ÿàOþ4gã–s¾òÀŸÌ·ñ½øã£v~ÿÙ;×^²ùTÙ=Ðon:ë‹_ùƒ}î¢ñ11111e2Mõ¾õø_ÝöÕÙ/6ùUM³#=ýàÊñ¨ùé™ç¿ó•þ„ÿ½æ’ͧ~öε÷}ëË?ù»¬œ+011111Íc;ê}ëñ¿ª¿²Ýøåñ©?Û—ÖÞµë`2Ÿ½ýv$ùØIŽ0±OÝöö¦ÓÞs/>qÓÒïÊíÆþÝMÿì“·.ÜxÛù·ïü(è/.]l¿âÍ%× |zþnüùÝÈ÷˜˜˜˜˜æ5õŽ{Ø.¡å7™¹~Û®¯ìÈ‘;ÿÏÿãQh‚av>ðÇŸúó·ÉñÇ|öεϽøÄÊqjvÓOþî·}õCéËlÿÝMÿì?ì¸â‘oïøñs?…xæÉÇ¿¶o۟ݹîßüé/ȹÁ†›Îúú£ÛVN ˜˜˜˜˜˜ZœFŠzvqk—ÍòÛ릿<ï¾}ŸüÉ‹ʵ74ÇŽ9väùìíï#Òm_ýÐ ÿŸ|çC7~àÆŸ·ÿñÿ«÷ìþÔ‘ÃÊ)>(Í·ݵeûeR÷>ö¥Ùæß9rìáïÙmg,wÝwÍ¿òŸºí퀬|öεþ¶KûÜeGì|tå>ÓixÔ³_ò·óìršç嘯C‡o“'îÙÉôôOÙûûÿüwòzÛwÓ?ûÚ¾mr6 ÷ÜÓOß¾ó£ñ‹s/Ù|ê®ý7­œR43}ëñ¿ºuçûùËæÐE·œ³ó¡gûÞC¢Þ¾wÅOWÙøåñƒ·Ê¥5Ì˾¿ýìGnþ§áeÇ«ïÙ½rüzîÅ'â¿úoþôvÜû§r<óäã_\º8œ<˜[w¾åÄbvÓ·ÿ«›–~W^Fè¨Üòæ;öüñLž»Wõv>tc|«_¹÷Ãr9 9¸ã«/LOüŸä‡ž~ðƒŸý'a;×ýùÿòÜÓOˉ;@ê»ßy ~5î§n{û¬Þ÷ȱ‡¯¿ý_…-Ç>±õ\ó…—mý›«î~ð3ØÈÄW¿õíàl6ß~¾«ÿퟭ‘c¸ùÀ?×}×LùW¤F½;öüq¸¥K6Ÿ²ïo?+Wѯ?òi;R…£–WŽe£Mßzü¯â÷ÄØ²ý29Y¨ñÌ“üßÿj8—ØpÓYSv½|ô‹_ùƒ°A÷þÎX¼û÷wî¿õɾpôÇ?tÅcÏ<ö÷_÷±/¿ô›Â}ð³ÿdš?ÝPõ¾þè¶p>ÿþ‚€üÙ‘ÊŽWáØ5úûÐ=óüwÂëY.¹îÔ=_ÿ²œ¦ õƒï?ÿgw® §"Ÿºíí?ÿbçC7Ê[ðo¾ýü=Þ-—ˆ€Î9ðìáí{o¾ü3'½ÛÒGnyó‘c¯ügªˆz‡ž~0ü ±+䟿W®œ Ov¼ ]ÏŽc£¼ ÝOþîá¯M_rÝ©|{‡œ Œîöõó 3Áß×ûûÿüw¶VØ‚ùØ—õ;äšÐiOþð…m{>ñþÎGûÜøóûܵòË`äI£Þs/>þªÔnXýÌÓ_‘kæÞ¸nÓ‡iÍ™±[>w,\¸ö²ðÛÞ*Ëdë©C».]¡íó«_+lð#Wþ¡,tšµìØå1;šÕ¿®7ê¶·û†çè€é-Þñžpv±ó¡WN;F˜^üñÑ[Î ë^þ™_øê·þ£\zãð Ï|aÇeá°oÆýCRõâß"ßzìf¹Zî“}ÿ¡\ù‡«¢éŒÕ¯µAYÌ=uhW¼ð/­9óÁ=·É2y²Ý¶ûeûl/\ûûÒØþûñ©+÷‘»Âqì³w®]9ºUMñý;®3r€ üàûÏÇ_oÄWTÙbáÕæ[ϵ‹=¹üôÏvÄOÙ»iéwGÿë 'E½}î [ÙùÀËur/]¸ö+eky²/e˜·°šö—›K×_8è~í¼ç}6õÐ?v G³o=þW+Ǹ“§|4ü©o;_NÇ&öÌ“_ñ¹3ý4£þ¿}Š_/enúÊż”ã›O=¿CîMK¿»òëaØtRÔûØ—þ¥¯ÿÙÛëÚVŸÈ“õlÚyÏ-²Là Ÿ±úµ2ž'»#~~iÍ™2ËÝò¹k|¢zÉŽc~@³#ÛÊ1îä鶯~Èø7ú ?øþór.0¯í{é½러÷÷ÿùïÂ…ØÅ›O½ûÁÏÈÅ ÷¿ðÌæÛÏ¿8¾òÀŸ¬ü’¨^Šz;ºÑ×¼dó)=þSz"tºð´µA Ìt+ê…'!ÚnˬÀï5Q½täÈဘþÁQ;·s¿úÀÍr0½OÞºà'ƒþ‹Ñ§›–~7œ–ìÜ«\æÊqímÿKø0è5gñ´õþþ?ÿ]x¾÷m;Þ'ׯ=æî—–ß%c¹€Ÿ®ÛôaYÌu+ê…LYõl–Ý÷G÷ß#ã@?„'ë}ä–7Ë_%øìk}ÖU_øçrþ 0ßýÎ~¾a½§áWø“°Ìv\&Ww€¢~á™}~å¯7|àÆŸæùï¬ü¶0­D½]ûoòu.Ù|Ê‹Ïß+Æ=w:ÿ“yþeå_Íë_Ôúí¹cmÇ4?¸ÙQÎw6Ù‘ÑÍ×öm“óo€Y¹ñ¶•×RU>Y/~éÀµ·ý/ri(Ð7Ÿz8¼oFý½mZ‰zŸºíí¾BQOÓ3q§ „ΦÊwÌ=ê=¸ç6[8¨y}«Ír·|î[2þ‹~î¿ÇW¿nÓ‡Ÿ:´+Œ(D½šÂvÉwCv¯ží¼ívXÑ>„}ÿ¡pÇ]˜U¹€<—0žë·ÏõGÒÅã±ÉîºÈŽi~p³£œîlºë¾k|§é€FÅOÖKŸp®Âþퟭá½nnÏ£w_|âMïûÖ—W~gTMÇ£ÞOþîá- ¹S.‰ûí#'wºøÍpÓÖ# Wºås×ø3þl1·¼±ã_V¾ª×ËØd7aƒOÚõö…·® -O¶Ì¥ë/ŒW*ÞBåMe;ãûfî;9Èí[¯¯|l²Ï}O죌Ç[H.9hõ°Ã>¥›5“Ý)tWøËzv”³cø6n9ÇïÙý)9ó˜­ð—õîºï?ñiß»|ÜìâA¹¢”ì ;.ó_üì?‘¿%OÇ£Þ}ßú²/ºáóoëáÞûÈÉîGßÈ+MéÜdáTh‚öIxnÝÎ{n Û¬|àƒ{n \·üŒ6ûÒØHòó"6"»Ý•Õ–§q£Us·|î±{ßÁ°dìÒõ†Â#`»íƒ6Å»²£ÝJ lõpßÓ vÆW÷/íó°VºÙÉîºÎŽl~ˆóÿâxîÅ'üKsäð£rÚ 0[÷ìþ”ŸxlÜrÎò%ØÊÞñvóíç˵ pž=ž¬·ó¡W~s$Óñ¨Þn©´×Þš´ÓÅJ"Z}Ô‹{–ÌŠ³]e\óØd“mÄ–ŒŸ”¯;è¦ »ä“Ýʈ/5õÜf7g·.³ÂÎܾõz™uˉ7IÎâ»êA÷+¬UõlßÂ\[2Ü»}ÿ!—-ܼek¼…ó.X+ ŒÎ6n‹¨W²m{>á¿,â7~Œ§Uß9²Û—øØI.ƒK0¨Ó…HgSÈ@5QÏ}a[Ff¡+¥Ù+Ì´zØþQÏÝrâ<ÂdÛL ×£ûï seVP¹3a0M–ƒÌ*êÕ쪛øN¡7>ró?õ]8â™çž~ZÏÔ@É’7+_}àf?ý¸þöe×`_yàOüË}ùWåú ¨wù† ~ÙRŒlÐçÚb2 £¯Mƒ^˼yqÑH£ž™¾Äí?pðœ…߈OD½’}ó©‡ý÷… oüO«Â»d\¿mA.ƒK0¨ÓÅOŽ Ei”…k’Phji¢ ³š‹zζ6e“}.Œ_êk³*…-„~7Ùs mI_ÅÖ•YnVQo²;…>ùÔŸ¿ÍtõõOû'—\wªžÇ€B$Ñ­i_Û·ÍÏ@>ö¥i×`álÛó ¹~jì?pПVSy|¢Þd¶ïÚ½|Qx|ªù…Ý*£^È‚“•8[=üûvlšlSèûgküW†¿ñ£L«Â}qi­\—`P§3¡(Ùä¡gО¨K6Ùç27L·ÐZÔ3?úþCo?ñ¶³6I/‹ïõÐ)ì툀kU>þ&ìÌ”Qo²;…>±ã›è¶ìø€rÅçÎÔó{Ð?I_›‹o?¶ËÏ@6ÜtÖOþîþ¹á-20–«6nòk–ÊœäüŹD½ÉŒõ¶--Ù³záõ¶ç,,Øöm$<ï’¨W¸/ÿõÿ•ñÙ;×®”¼hZuÛW?ä³ïÚõGr\Ï=ƒªPhm¾À …GLZ!-¥[h3ê¹øõÅñ¤ ;i»d·U/üU>ûÜײÉ>[«ÖôøÇ;#³ÌÐÕƒÉîú$¼îŸþÅùþÉ'o]Г~hÌÞ¯íݵcW sÌLRÓ2q䉗Þ7¼RêCŸ?S®Ü€záU™5QÏß,Õ«Æ5bÔ3ö _µq“ š‰£žý“Ù*ñ;œL¼)ôÌvøo ãÇ•˜wbZuÓÒïúì]_ÿ˜\—ÀsÏ *´3zÇŒK×_8há;õ~ôý‡Â6ã¿ñ÷¯08Ôˆ€k züëwfèêÁdw }ò•{?ìºM[ÎñOïx^葽_Û{Ò;Ï&Þ¯-È\/3ÔÒK¼û[Ë …ÉFlû6W–0¶$ŸåéÏ>ïg fÛ߬<ç⦯\,Wn@=&—M5QÓ=ê 2ÃGÔCpñæSýÇs/>±óNL«Ât¸oß'å2¸ž{jªPxF›-ãš-]xĤÞ6MKíG=n4ޟп†–²Øˆ€k º­™G½±îúÄŽo~ »úßÿ ÿäÏî\§WúåèG~í¥¿3mŸoøàáåÎHƒÝ–/n‰{Üï¾@¨a·|Ñû.ZºcÉØ'ñ6¯_” ‘ô²®ð3ó¹».ôO¶þÍUrÙÔ‹_¹gï>™;"*ßÙkÖ8ÛææÅEY¦’-f ‡mÇmƒ6÷àÑcöeÌFâÕÓÍõ[ wж¿î¢õáF+ïøÄwJõ§}þLÿÅñ#»WbÞ‰‰¨7$êÅoáŸT.–TåLˆhí¼û­-ùèþ{d0VÓ+ïf°‡¾ûíÄw ½AÔÊ´kÇ.?þÛ´áƒd®³e¼²ÙG™eÖ¼iå9•sk„í™uô‰£ñf|ë€,@%¬‹ü ÄüÉX¹þÚ¾÷f¹lê…÷]µé쉞¬wÞkO_~†Ð¿ÂÖj–Ý®¯e}-ÿÒ'ûÒ–9xôXظO²A[ ~SW[RæV®¾î¢õñ Mé~Nv§*Ùò¾®M麣¼´™¨‡&|ìË¿ê¿8¾þè¶•˜wb"ê ‰z&¤%Ÿ*¶AŸ›» ,ÿ ;7ó¨çÁ«þ~…·Ë¸pí;Â`1Óý¬1Ê# †V¹°‡SF½‰ïzƒ¨+<-nPÔ36˨Ìv>kÐÜží5»¥;ŽÿmŸ.zßE2€ä°~ð3óÑ/üOþÉžGï–Ë6`¨P¬l²ÏÇúÛy¾îé«WÇkùŸróqÎðwÞ°é¼ Ö†ÁƒGÅí,ŒÇÙ±2¨ÙF|ne¨² smg¼ÖÙöÃmÙ$›ìN RõFy¢š°ùö•? ¿ó¡WbÞ‰‰¨7<ê™Ýlª\8„¿A›ª²XCQÏ&»]™„mJç ;S™Òœ­"k…çýÙfŸ:´+žÈ*î¿ÇW±)ÝO» a§Œzf²;…Þ êÅ%ê[¬‰¨WóŠÝ°céSù€B%¬gü Ä\þ§ÿOÿdÿÊe0Ôž½ûqTƃð \¢J—į¾ò3ØgËe0ŠýÆÏ\³éôÕ«ëÓ^e€ öìÝçsm;²ÏX6¥ÕÌØÚíc<V©Œz¡š Uaõtg®Ú¸éòèOõM|§jÄQÏ6 ;FÔCû¶þÍUþ‹ã‹_ùƒ•˜wb*=ê…l4ô)Zñ;fÈ,g#)waÝÊœ¿meTŠ“be1L…àe“mSžg»ç·h++aØa›l»Ñ\ù‡ÆÆ}ÅÊý´ÇÐW±É³…}-{}­ôîÇ7dÛ ËÛ—¶µ8ÛI%4žá|åv“Ý)tÖc±ûö]ë:¢Pš£Þ G½¡ÂŽõþ@O$Á«~“k6`,—oØ2“OöåU7Éb.ü1»AA*l*~‰ð丱¢RØÔ”QoÝEëe–˜ìNÕ‹£ž­[%êaˆzvÞsK(z6y„JËQž‰feV`Ûü¥Ϲ³ÅìsÖúHÕ³ð®Ûôá°ŠOöeÜà.]¡o!L¶ÛéRî¿GÖòý±aܶSóN¶·²Ÿl°&,Þò¹k­uûÖëea'wߦ°°íÃÊÐÉ·kÿLq¡³ÉæÖÿó¹ÉîòvR¼„¨+´³¬¢Þo;¶tÇ’Ìú)‰\¥ñ3˜\³¸²üD­X}º}ëõ¾˜Œ Ûò¥ë/ü¥å¢g.\ûŽšç‘]·éÃáÖƒ¸ÙÉ,74ê¹÷ÜæÛ;cÞ¾ðV©c\÷Ô¡]¶º-Öµ/ý½¼@Ö²O†>Ζo"wÜÇíŸ)ŒÄ†F=3ÙB6´Öˆ¨«>êÙàÆ«7Ê`¬¡¨wÁ»/ðÍò4=ô_Ò¶Šåg 1¹f&³ù %ü׊OÒà QmZwÑúË7lH…@vvôRÖ0h „Á¡ÂZ•­-T³A¡ª~õ`â;U¯&êœmË2³¹¾ú ;8ºn ]GÔÐ]Zè&@ÔŠUõü-hëÿ¤]Q/=þšú,IZð3˜\³Ó¸yËÖаl²/ì8TÙ2õâ·•°/}­úŒ%ÂZ•U.ìŒ-&³\ýêÁÄwª^¼Ùt¶--½fÍ ×8;¢š@ÔÐ9æ¦AÔŠeçò~BœF½…_;þª¢6£ÞÒK~£¶µt€>HJ?‰É50¥ðÆ6ÅkhGÄ–÷sŽzãÞ©za³6ÕïÀ D=4¨ 4ÆÍ Q(VˆzöÉš7­ ÂxÓQoéŽ%Ûȯ-Ä·xà[d1 Û’€…”ŸÄäš ˜^ø+xqš¸Ùò¾"Qot#–¸ýÝ>QQ@δÁÍQ(Võ„7õÂâɶÆ3õÐI·B ?‰É50½Ê 4q¨²øZ9G=›ÆºSõFßìž½û*±Äù›xÔßQQ@ž´¾5„¨+Ä;‰h¾u`Í›ŽŸO7õŽ>qt׎]nãÕýå·>Ù6mP–: ÉU…ŸÄäš êòå÷ÁXhR’B)Û¼¸× ï;úM˜ú*7hƒúÕc“Ý©za÷lªß»õÊ»0b‰ó¯¿ ¢¢€¬htkQ(Ö ¨g¯_´ñ¦£^j鎥°Wö /ÅEg$• cñ3˜\³Cy Ú³wŸŒ!I† ynô·Œ0ë.Zïk•|'mªlmC·Võ&»SõFŒzv×lÊ»0J‰ ý¨‡õdBs[;ˆz@±j¢žYøµ… Þ} Æšˆzf׎]aÇld.—$Na2~“k6`(^ç]°Vƃð7õ.?ù }WmÜäã6m[ZŠg›%îÙ»oeÁ¯Àµ‘2ª\ºŸ¶d˜;(T…ꃗ™ìNÕ³]Ùbíøã\yF)qöÈÔ/àˆzˆzæNC[›ˆz@±ê£ÞP E=^‡;ó-3“d)LÃÏ@brÍ ‚Wå“àÂó¿*Px^›Í•Õ÷8è™)í_>îÓU7ųìæ|›ë.Z‡Uì†âÖvó–­6rù† ~/*wÒø\›*ìNÕͦAQ/<Ε[ŽwIf¹P6-Ä›š8ÑoD=ó¢}m.ˆz@±Ú‰z¾u`Ü¿Ž¶lYyIjfÂÏ@brÍ å1ȧó¢§ÈÙ'ë.ZRQe -É'ûüì5kœÛ'²Š iɦ°VØ”=š—OñòÞݺR Müä»Q^T;ñªtðè1[Þ7e“ݵ˗ÿˆaÌöp‹éÆãý±Od]¯nŸÈêÆ¶`ì OºôÉ·æs÷8(k¡÷ˆzÚ§emŽˆz@±FŒzƒªÜˆQÏßsc¬6g û–m"ê!I‡Â ùHL®Ù€¡ÎYX8}ùýV~,·žð¥}rÞkkŠÍò-øòa²‘Ëkß#NQa:{Íšø‰x±Í‹‹²|Xx{ôúV›l±ð'ã æ“ÍMߘøN »¡t#õ“D½ÊG©f²…ãÕ„¼ASº"z¨ MÚÔæŽ¨kĨ7¨ÊõüVÆjsþ6>íýÚ^™ ´*ÉOh‚ŸÄäš Ñþ·ïÚ}ÕÆMþä/g#²Ø ¶úæÅŰâ 0'd­š7ëp¶|ØÃø&=ýyga–)lù°@ÉîTÌnHnz(yìKY`¨xõ±¶ +¢÷ˆzÚ¡5-D= X£D½ß:0¨Êõ–îXyQ¼ú¯-¬yÓššZ7b.š•„'4ÇÏ@brÍ@%¢€hJËQ(Ö(QÏûš-yà[*gù\™\ðî ÒüvkÞZןhSÍŽMIzZàg 1¹f Q@£4¢å†¨”iWôwëµ³£OõW™íBzõì&*W÷A›¶|qK<î6^½ÑçÚöeЬ¤4¡5~“k6*õ4DóYžˆz@™ü9t>-üÚ†n½ï¢PßÒl‚Ï•umÐê²bx®m3ìÕš7­‰_± 4+iLh™ŸÄäš €JD=3§á,gD= 4{¿¶7dµ'©rq°e’Õ7^½qÍ›ÖÄ[°Ï×öÉ^u‹Ö$u ság 1¹f QÀli5ËQ(Ю»Æ¯¾÷k{eîPñê/^¿žÜg- Ì^Ò•0G~“k6*õÌŠö²N ê ’ä$äÀÏ@brÍ@%¢^'ýÒš3ÏXýZ#ãyzpÏm22nÝå"i,ë ¢ IHB>ü $&×lTêgÔ»ås×üÒš3ÇráÚwÄ[°/eóö…·ÆËŒèºM¶u=H9ÛøS‡vÉb£ÛyÏ-þgwâ}žþ.Û½“Œ,3.ÛUÛÈô%®ò.Ûçñ®ŽÂþ-Âêf&wùÑý÷\ºþB[1þ'6¶qûG‘…{J3Y·õ=—$$äÆÏ@brÍ@¥Þ>SïºM>cõk½ÙW›@ˆWêЮK×_¸2oy²&xÆ™­eëÚ ]¸ö¹òí£ß¨}œ¸øØF–÷hÕ£ûï‰Ç§¼Ë¶µ·/¼ueÞòd7$71:{Ã~ÚÊÜqUÞåÊ£T|—íŸ ¬n¦¼Ë¶µ°qûÄnËFlƒñ-Úe­ÞÑFÖ9D=@o%ñyò3˜\³P©Ï/¿‹Ï jÑ/\¸œ úÜ3V¿öGßHæå«Ûºñ­Ûç!úܾõú0>:_½r‡§¿Ëaß*çŽ(®]6Ùç²À¸jî²?È5·òÔ¡]a‰zn²»l¯¯eÓÛÞ*ßáA¶ÉþQâY=¢u¬£ˆz€J²ræg 1¹f RŸ£^xͦMƒ —ñâStB#› K…uÓgä}äÊ?ôYlöºMöu啤nú»ì³ÍÊ_oë[Ów3V—Gù7zêÐ./w•Qo²»¢Þ µÂf§¼û¹Ò4Ö]D=@¯$Áùó3˜\³P©ÏQ/~.UMáºåsר•ifâú*Ò }®Mã¾×SÑ ÍN—CŠªœ[#¼ÞÖöÍ7»õðÊÖA{;¢ú»<â¿‘ï[Qoç=·È,v̦š‹nÒ.ÖiD=@O$©]ág 1¹f Q︷/¼õª¿}6qÔ +VnÖL’ݯ5h³ÓßåÉvÌøóéâ—šNüèņÞåoÅŸBXù\¿Éîò¾ÿÝ´‘ñ þ·¨¼ÝnÒ"ÖD=@ç%‘Ýâg 1¹f Q¯ÎÄY*t¢A5g²-_xâ/µ zvØôwy²Âåä'~ôbCïòô·2Í]®ÿ[ Úù®ÑÖD=@‡%y]äg 1¹f Q¯ÎÄÁÈ–÷ÝîÎÑþøðÍÖìÌôwy†…k&Qoè]Î6êùkœ}ýu3¦-¬7ˆz€NJºËÏ@brÍ@¥¢£ž Ö¿§ídÁh”²/3âk3C$²½’YÁЛ¶Áú»œUÔå.×ߊÝÙAÿACQ/<Çp⻟ ­`=CÔtL’„Ðu~“k6*•õüoÀÕÔ"3Y–ò-]Ëæúbõûx{²µž:´KfÓß嬢Þ(w¹þVüÍ:ê»Þ ïr,üûŽms¥ ¬ˆz€.IzzÀÏ@brÍ@¥r£ž§œúÂ5Y–q­}ê÷Á…·Ó}ûÂ[eVlú»<ÃÂ5Ù£Œx—kn%l¡ý¨wéú g¾ÍyÐþÕKD=@7$%½ág 1¹f R)QïÒõ~dù½J?Ë&û\ÖŠÙ\_l¬,5âZÞ›lô¾®±‰nùÜ52+6ý]Î'êx—ã[ñ{„ûÒrÔ 0Ñv©æ9†ÙÓøÕWD=@î’„žñ3˜\³P©”¨7húHQo”–ä Ýéïò ×d^0â]·R3µõ~ôý‡Âž×ßnÆ4{õQ¯¤þ —ü $&×lT*%êÝò¹kìË ” úÂ5Y–q-O?6 }¦^xæ×¥ë/”Ybú»œIÔý.Ç·ß_ÞªÂ>—µb³zakõO0̘6¯Þ#êr”tô˜ŸÄäš €JåþM=9j}áš,K¸Vˆzõû`Â+gÝÌÓßåL¢Þèw¹þVüAn-ê…ŒHÑë¢ ;IôA¿ùHL®Ù¨TnÔ»åsל±üWØd<6Y–q-ïM6ÕïCx·‡Q’Óôw9‡¨7Ö]®¿• ×¾ÃÆÛ‰z½Ž"ê2’ä”ÀÏ@brÍ@¥r£Þ(&ËRa-›jn×»•M×mú°ÌŠ…­’Ц¿Ë9D½±îòÄ·Ìä.Û?¢oÄöGfu„¦®rõYHBÊág 1¹f Q¯ÎdÁh”Û}tÿ=+K Û7o#îÀôw9‡¨7Ö]Î!êÝò¹k| Cÿ’²ƒbùHL®Ù¨DÔ[yjXe¯%…çåÅ7ÊÔ ÖÞݵþêÙíÖl$5ý]öDeSÍúß«yLÜdQoÜ»<â­\ºþÂA›æ.ûfmܾ dV`s³|Ÿ¶­bõsd”ÌÏ@brÍ@%¢ÞJ€«LB££už:´+ †×ÚT™{ly›U³YÞ{¡>üŦ¿Ë£._¦~çÍQo‚»<â­Ø\[fâgêUÞåð¯\³·~j¶<'¶JFÔ´* :€ŸÄäš €J}Žz¡Ù4¨p=uh—çžÊìžO7(ýèûùêéaÝ “¿ :”}"³b•!©ÞôwÙg škBɪâGÏ(™[i‚»<ôßÈ„7²¨|À'¾Ëaom³•Â6íóxÅyÓªU8¢ %IÊœŸÄäš €J}Žz!©ØtËç®ypÏmÂ½ËØTtBî±Od]¯ž¥ÐÎlŠ»^èniì‹…WõV>¹l)ï²-öÙæÆ+º\ù‡ñ²z`÷Ý–ôÅ|ò­Ébb²»öÇ>‰w5ˆ÷9k¶ÀdwÙIeJow~4i¨hCÒq€ÀÏ@brÍ@¥~F½÷ÜžÀ5â$‰êºM¶‘•y#LgT=MìÑý÷„Øö¹ç!û8è 4‚çì¾È¬JÓßeÛ¥P¯F™ducûl[p+ <ù¬tE7î]÷ßÈ&‰kÓÜå±n:›¨§= †¨hVRpág 1¹f Ro£ÞG’×BÖ»îä?‹f_ÊCÅ«Çlg.\ûŽ_Zs¦³%㿾7ˆÇ&û(ãƒL—eîP²ºýA“ݸwy‚#É…2w¨ø.uë#fʆiÌ‚#ê”ä åg 1¹f RŸ_~Û]á¥CŸÐ×ÞåviÉB@Ô4" 7À ~“k6*õrä/¤=ãäwÔí·ïr‹4c!FÔÌ^Rm€~“k6*õ²Þac¬÷‹è´ïr‹´aAõ³”ô`(?‰É5•ˆzÙ¹tý…«–§[>wÌê«ïr[4`!EÔÌLk€QøHL®Ù¨DÔËŽ?gÍ>Êxx—[¡õ •ˆz€H2 0:?‰É5•ˆzyÙyÏ-ËOY[uáÚwȬ¾*ð.·BÓ!ꦕ4`,~“k6*õòâïaÓ£ûï‘Y}Uà]nžv+Ô ê&—Ô`~“k6*õòò‘+ÿÐ\·éÃ2ÞcÞåæi·B ¢`BIš&ãg 1¹f QèV¨—gÔûÚ¾m·ïü(ÐEöÝ+ßÏ@%Q˜†ŸÄäš €JD= O´Xa¨ £ÞsO?}Éu§øÎsÉu§Ê·4Ð7I‘¦$R#×lT"꽡¹ £È0ê9ü¨íÆn~õ¿ûóS€nñ"ù–ú#i1ÀLøÁ3&×lT"êý ­ #Ê6ê]rã«o¸÷õ@·ø‘|K=‘„`Vüà“k6*õž;ö×wíú# /.ûþvQÒ!ê3ä?Dò-öýàûÏï¸÷OåÏb*ÿ;fì»ß}@ÂVÉüà“k¶yÙ¹ÿV»\²õÕoýGù¦Jc?þ‹£¬¨·ñË+Wï@_½øü½R¯P‰¨ÌÿÉ·4Ú·ãÞ?õ [ÿæOAÂVÉäÁ1rÍ6ß|êaÙ+ Cž=,ߺ@Q z>ÿ»_WÞúå=ð‡›_mßÞÏûªÔ+T"ê3ä?Dò-öݾó£öqÙM¯‘_@&VŽIÛ*–? 1¹f›‹ì°=±ùç2áW==ó˜|ëE):ê}ê?]®F€°s/ûö&ꈨÌÿÉ·4ÚçQÏ.xäÈÄʱ"i[Åò$&×lsáQï²›^#ÿ|@&üª‡¨‡ÂõôÐtQo,D=`†ü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7¢0CþC$ßÒhQ™[9V$m«Xþ€Ääšm.ˆzÈQ0D==4]GÔ Q˜!ÿ!’oi´¨‡Ì­+’¶U,@brÍ6D=dލ¢ž€®#ê…¨ÌÿÉ·4ÚGÔCæVŽIÛ*–? 1¹f› ¢2GÔ QO @×õÆBÔfȈä[í#ê!s+ÇŠ¤m˘\³ÍQ™#ꆨ§‡ ëˆzc!ê3ä?Dò-öõ¹•cEÒ¶ŠåHL®Ù您‡ÌõCÔÓCÐuD½±õ€ò"ù–FûˆzÈÜʱ"i[Åò$&×lsAÔCæˆz€!êé¡è:¢ÞXˆzÀ ù‘|K£}D=dnåX‘´­bù“k¶¹ ê!sD=ÀõôÐtQo,D=`†ü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7¢0CþC$ßÒhQ™[9V$m«Xþ€Ääšm.ˆzÈQ0D==4]GÔ Q˜!ÿ!’oi´¨‡Ì­+’¶U,@brÍ6D=dލ¢ž€®#ê…¨ÌÿÉ·4ÚGÔCæVŽIÛ*–? 1¹f› ¢2GÔ QO @×õÆBÔfȈä[í#ê!s+ÇŠ¤m˘\³ÍQ™#ꆨ§‡ ëˆzc!ê3ä?Dò-öõ¹•cEÒ¶ŠåHL®Ù您‡ÌõCÔÓCÐuD½±õ€ò"ù–FûˆzÈÜʱ"i[Åò$&×lsAÔCæˆz€!êé¡è:¢ÞXˆzÀ ù‘|K£}D=dnåX‘´­bù“k¶¹ ê!sD=ÀõôÐtQo,D=`†ü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7–¢Þ•·žzùçÿñˆâ¯Ýñ:™kâFa«œû{?ç.Þ<ö…Aý΢;ÿ!’oi´¨‡Ì­+’¶U,@brÍ6D=dލ¢ž€®#ꥄ¨÷Öw½üU§üôªÑ¦¸”­»úÕ²âê7üƒýÅia¿sÅ«Þø–ŸõÕícØŽ}òæßx™,\£~ç}˶Á÷*çþÞÏùnÛ'2«ü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7–B^~{ñæ×„ ?ÓÍÅñξŒW¼vÇë¬Ñc\XåoùÙ+o=ÕmV¿áø¸}jÐÎ{7 ³ì^ÈŠy:÷÷~Î÷™¨‡æõ¹•cEÒ¶ŠåHL®Ù您‡ÌõCÔÓCÐuD½±”ó7õ<´ÙGw—þûö‰Ì %î—¼Bf ⛪,w>˦߹âU2«FÍοù7^欜Û>{”ìŽ×P¢Z@ÔCæVŽIÛ*–? 1¹f› ¢2GÔ QO @×õÆBÔ üYo5Q/5ˆßVå_Ð{ë»^î[³›“Y5êwÞçÚ4zvlŽ?\•AÓ…¿ThŸÈ¬ð"ù–FûˆzÈÜʱ"i[Åò$&×lsAÔCæˆz€!êé¡è:¢ÞXˆzÁº«_½ú ÿ ¼Z6˜ êy´’Až§V“½Rõ;^„;V(lˆïêX÷®Oü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7¢ÞPD½!ê½õ]/—Y5êw~²PØ„ýÅiD=#ßÒhQ™[9V$m«Xþ€Ääšm.ˆzÈQ0D==4]GÔ Qo¨ÙF½°µÊç2bÔ“Pøæßx™Ýœ“?rçù.ˆŸŸ8h–ÝŠ}iû`íó°|ð±¿8Ífùžøb?…°æFíóxVxñï\ñ*û²òF×]ýjÛ¬Í2vïêßÿ×æÚƒã›ò­5ôReÿ!’oi´¨‡Ì­+’¶U,@brÍ6D=dލ¢ž€®#ê…¨ç9)LÂæz¨š>êýίòMõ4=3hç]ØCyó »Sᕹ¶L<ëÚ¯ )Цø®Ù¬w^ò ¿EŸelu ƒ6¥•Pð/ƒÊ-Ç[ð~糼߅fçƒ6…{a·.³ìóA]϶ì ÛÃ~ñæ×Ø>ø ÙÇš÷Éø‘|K£}D=dnåX‘´­bù“k¶¹ ê!sD=ÀõôÐtQo,D½·.¿sEM° ¥©f™QxD³¨|š[½A;oê_ñZ?·æ®ùÃb“g¸°Ïö¥ÛTùdÚ›saËéÚ}–-c[Ï¿[wõ«}³6y’{ã[~ÖgÙ*á^ØZaS­ësã½½vÇë†îçdü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7–£Þ¹¿÷sAM` B3š êÙ*o~ÝŠßúßò³“=5,켌ß=›5h÷|ÝÊzUs×ìÁñY¶úº«Oú·š-»š›saËéڈϲ¼óä—dž˜h³äI‚!VÞ¨ï¬b½§7NɈä[í#ê!s+ÇŠ¤m˘\³ÍQ™#ꆨ§‡ ëˆzc)-êÙdŸÄ|pP35åk¨°}ŸlS•!l(ߎ}´}ü9k6^ß }ÝÊàUs×BzKŸþf û,»]™ejnÎõd–ÝÁA³Œßh:+¤ÀšÛJ{ß4ü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7–Â_~^šFŸ ¦| e«˜‹7¿æÜåw™ðíØ-Ês߆òL§Q6åëNõâW­ºÐ×*·Yssn”¨—–D3ôŽØ#Ž»¡»:ÿ!’oi´¨‡Ì­+’¶U,@brÍ6D=dލ¢ž€®#ê…¿©çOæJSàa¨~™ů!ëu¸açm\Hc>(ËÇ|ÝšfSº…šôfj¶Y3Ëõl™e†Þ[@Æ}ûhL…¹²Ö4ü‡H¾¥Ñ>¢2·r¬HÚV±ü‰É5Û\õ9¢`ˆzzhºŽ¨7¢ž¿¬}”ñ ¦|MàÍ¿ñ2ßZåkW©Üù8ú»FTòukZ˜M½z¶À cýC å?Dò-öõ¹•cEÒ¶ŠåHL®Ù您‡ÌõCÔÓCÐuD½±õ†Z=Ó¨Wÿ·á´óo|ËÏúÖjþ0œ¯k÷BÆMÍ]ëSÔ«Ù™™ó"ù–FûˆzÈÜʱ"i[Åò$&×lsAÔCæˆz€!êé¡è:¢ÞXˆzCy0²iPÔó7¬ýå´ìÉ U¿ڔþñ;çëÖ´0›úõÒñæø‘|K£}D=dnåX‘´­bù“k¶¹ ê!sD=ÀõôÐtQo,D½àâͯ±¹iNª)_Î_Q;hnj‚ÒT³Jx²Þ —‘úº5-̦tç‰z“ñ"ù–FûˆzÈÜʱ"i[Åò$&×lsAÔCæˆz€!êé¡è:¢ÞXˆzÁ 6WS¾œo9Ìõ?Ò÷ÎK^ˆ…÷Û«4Õ¬6hÓï\ñ*™kjÖ­¹kSF½Ê›smF½P<+™&ø‘|K£}D=dnåX‘´­bù“k¶¹ ê!sD=ÀõôЀ² Ô`¬wºì¢øÎּ瀈×22w2D½±õ_ ý>¬zþØx³¶˜TþÔ‡w·¨ìVƒ„¯|CŒðæ5•Í&ÙŸ°'6¥wmú¨7è½;ÚŒzáåÉ•k™7¾ågg{pö"ù–FûˆzÈÜʱ"i[Åò$&×lsAÔCæˆz€!êé¡atvõ“¹,Öû¶³ËE¿ ­¹¤ŒÉce=\5s¯Ýñº°z ËÌœí‰_Tû4z­ˆ¢ô‚|2D½±õ\èbéÏKøÞNgÙ[š“l1_>ý©·Y¾£b¾–M•?Îñ“õÒŸ¾8ù…ÐöÖw½Ü¾¬¹×¶€ÏJ7XsMxrœmÜG.ÞüŒoÚH·\ÓàÂ}Œê fVØÛ¦m?Œÿί²[…¨×K½z•¿ë‡’8ûá² ûytï¼ä•KÆÛõ?D²pL–,Êʱ"i[Åò$&×lsAÔ3òc; ÙB`³Â¡ÆØ—áÜ ^¦†, ¢`ˆzzh]¸Rò©òÅMvÒ/f—Ov9'ËôÛÐç‰ö[Í–ñ…}ôpÕoÓæÊvìŸ@–iˆýzö[´OdV û ]sA>¢ÞXJˆzöÃê•Mö"ü;Ð'9eŒŸÎ&k™°büݾ¥m²eìÇÁ~*m;¶>>Ödºó•×Ïá§Ï&ù´-Äûél;ñZöe|Ç×]ýêxÛÿ0˶Õí~…YÎv/^×?¯fËñÿ جøwŠ<rãûn‹ÙÂñ\6k“ï’ïƒÜë™ð"ù–Fûzõâoû'û¶—Øý8‡ ?¶Æ~¬âŸ£t²åmSöVeE¿E»¡øPPˆ•cEÒ¶ŠåHL®Ù您g¿%W~\Ç™äw«]Ú¹^ü§Þ?÷/í/Ÿc¤“/Ÿž{‹¨¢žÆŸSÚAVæþ¼ [ ½Ö*ÿÞ’ßXƒ„sßš‡+<Ï¥æ1÷µ)>)oZøÅ/—ÜCùÞÖܱõÆRBÔ³ŸûÉQœÌüÉ\£Ng?¼¶®ß®}c¶XåÿÔHw^n+°ñ°ŒüàË¥{ø µOìKÙ¬Ç5–tÒ{äÿµà·/P¿åxÿ]X±æFí™%÷Ýùb¾K¾W ]ø‘|K£}åD=û~^wõ«í÷¯±ïs´ïp1ñ’ñBa·“Šp¾aŸØO/o ;û!õY¶Jؾý¼Û*¾)›*­h_†m™¢ÎWŽIÛ*–? 1¹f› ¢žý¨úO¨ý¨ÚïÍðóë?¹ö1ŒØñ'ü8Û—a ösíãö3~ã›A‡¦xV|(3ñ#=@•‰¨¢žÆb‡W?°úd‡ZYÀÙy›Í-öàë¿~F¼ûáŒ<ý „ßg6Ù?Ìuvs6·f#MßöËXfÕ›íÞõÆRÎËoø‘|K£}…D=û½_$‡ßÂrÊáN~Éú¹DMƒKÏ[•vú[ÞnÚ7hSZÌkV4!#ÚÕôÏʱ"i[Åò$&×lsAÔ Gù¹öŸw9ª„«˜øyÐñĄ㘌:”™ðgOlª<|•†¨¢žÆâÇ\;‡#{|røb•Góøƒ3úÝfåYûÿwù26Užÿ…×òo»ð;xÐ^ â{kwJÆ'CÔ Q˜!ÿ!’oi´¯¨gWËñà +ápæFìúÜ—´UÂ`0èÿbýFmªü-ÿÖÁ/#¨_Ñ„®7úÉR×­+’¶U,@brÍ6D½p­'ã6R3,vaxü{ðϾ-ŸndС̭»úÕ>×V,ê齕ˆz€!êé¡a,~̵n8]“óK“ñBø¯·Ñï¾-¹üX®²³j™eü?Á†žþúVn¡9áwð ß܃ø]N©O†¨7¢0CþC$ßÒh_!QÏN âÁš+a‰Ɇ3 [% Ælûã>á.ÜzúÛ¼~Ev©f™>Y9V$m«Xþ€Ääšm.ˆzþs>KÀ/4ÒvûáÀ2ôgߎ3鬚C™ó[·©å+ õCÔÓCÃXü˜ëÜpx•SL/V dF¿ûá÷_åË™ýIìöúmjüÿØ+g5*ü÷ŒÜOågµÃD½±õ€ò"ù–FûzõüÝoe0üNO9®¼õÔxyÿµkÓX—ÄC¯ÏýÌÄ&Ù·¡+šðäÁöÏ^æbåX‘´­bù“k¶¹ êûq¶Ž ú{úÓ*‡¦ð³?èo4Uª9”¹p«9¤‚¨¢žÆâÇ\?àÖü1¸x±Aìdΰu}òÆNÞ «}í˜n_úê>øæè«‡ç~lù/@ûb6ŸËÚ/!û}㱕·ØvlOl ¾©tk1›;ôîÇÂ3Õ+Wñ›³Oì}±ð þ¿déÿª¶ÿáÎûÄ®Üÿ¡£ïŒ ¿ƒk~ÅÚ?n¶Yÿ7µµâMMƒ¨7¢0CþC$ßÒh_ï£^¥¡WÂý÷%kNRáú|Ðoyû=nsÓßæCW4vjá«ÛdwDæöÏʱ"i[=ö“çRØ\³ÍQoA?ì¢æò°ÆÐC™_8Ø4ÖKôQ0D==4ŒEj]ÈLò¿1²˜°¹~h¶ÕßyÉ+ìèìÁ¨r•kw¼Î–‰OûLøÒ'±%¯¼õTo[6ù/û½bŸ8·iÝÕÇÃÝh:Kî…³%C“²ìô4Ük›*µø6ÝýJ¾Š}”q$ý܇ã7Yõ©}õA¿çüq°l;ö¹W¶å-UœÜz}Ħx'}÷ltÖî7d«Ø6m÷lÏãG/ÞÔ4ˆzc!ê3ä?Dò-öõd–°_Á¾¤M£w½ú6n=ým^¿bÎ.ê뇕cER¾:GÚÜÄü‰É5Û\õñŸÖQNÝÃÏõè—BCea›é3JCÔ QO cñcn8àÚ5âレ, «È9e8ݬ\+d&|vòg7Níó°¤­n#¶Œ/é ÏŸhæ Û>+¤±°ô‘`Ðï[×ÇßXõ'm;é*õBê’0çwÜí¡óeä¡óñtçÝïœø³p]¸×•'÷ò0ÚFì¡ðÇ0¾¡ðøTžŽûFì£<‡?ü[ ÚçqõÆBÔfȈä[í#êɬTøåk“uÈùF¥pªPù[¾æD¢~ÅÀφ.Ö+ÇŠ¤‘eHê[Cü‰É5Û\õ±“vûQåÔ=\%Ùd?ãv! ¤êeõ‰¥!ꆨ§‡†±ø17>¤†Üç­t±Àë•ýJHÿXC8ÝLÏíÂÙ¡­ÿn°UlÄn.ŒØú’ö‰Ü„ÿ6²IV1ƒšZø“žûúÖ죌Ÿ5Ö/žðûÏÏxÜ6ßDåúƒ“žR;_%þ× Âc•Þ»0ËV—‡7¾õðøÔü“U^6TÞ‘‰õÆBÔfȈä[í#êɬJq׳ÉÎ >VûV’áWyú[Þn:ü*O7R³b,œlŒ¸ÿ¶r¬H ÚÜIkk? 1¹f› ¢Þ cº‡#€Oö^y9ÔÊŸ«Q8¢`ˆzzh‹så€ëGy›Bn«\Ì z®™ sÓ_áwàt„ã~úÿB¡ÜI835gŸv_Œ ¿¡Êßmþ€¤w¿FøË2ñZ>„$Ÿ@ûžTþ² ­°òÉÂÜôQõmÚTÿßkáwpú¸ùݱ2îê王¨7¢0CþC$ßÒhQOf âOÀ÷µl²ÏÓ“¢ òìÈnÔ¾ ¿Ç+Ï*WL…“Ñ÷¿»VŽISk“dµùò$&×lsAÔ$üÈËø va~À}ªù_„ÊC™]Úá%l¤æHU¢ t,ñçD½iø1Wνì€ëGÛp ¯\Ì„“<;§”Y.üƒ~X±¾1?ôWþÊ ±Ý“Yö‹ÇgÕŸ}ÆjnÈïEz÷ë…ûFü«áBÂóðW¹ÆwÒ&û½(³Lø š®îÝ ß¾.lA·0>(ÂÖÔ?ѯ(D=ô’4»¡ˆzzh‹sÓsGyÜ ÅÂaÝYnÐáìpЊoÁ~ȸ©Ùˆï°MõgŸ±šòßCéݯg'ÇË»ðR¸ôG5>ÏOf ÿ[å™oÐ^ùžT@ͽ‹ zÜÂC=èñqû#"ê…¨ÌÿÉ·4ÚGÔ“YC]»ãuáÄæÊ-„ßævšaÕö¥±MÏ£ÄÐÓç'C뇕cEÒÝfKÂYÎü‰É5Þ\õtÉ0 û÷Õ} é!ć2ûÜ–7vÌz¨)Q]'yn2D==4ŒÅ¹é™_x¦›©-ÎÞ£-`GöÊñ”o¡òWNÍF|‡m²edV`ËØÜ7¾ågí&âßL²˜ñ¹éݯžðžÝfÛI·/÷û[ùìÆN7 Z æaŒ zÜÂC=èñqû#"ê…¨ÌÿÉ·4ÚGÔ“Y# ç6¥¿²‡þ6dÄýdÀ¦A/àè“•cE’á¦$¥¬Cü‰É…ß\õtÉ0";XùlJŸ™;ý¡¬D=tŽô¸™ êé¡a,~Ì­< ‡ÿïµ#µ/–—ÃÙ›- ³Ü ÂÙá ßBåÖlÄwئʳO ¿ÉìnÚ—ñˆ,l|Ö¿–âmú.…ÀøÓ÷ÂíÚ'áóT¼ÁJƒ¨ycƒ7û²r<qû#"ê…¨ÌÿÉ·4ÚGÔ“Y£ Ù#ý¥<ô·ù #®è'!6 ú¿É>Y9V$UnRÇ:ʘ\ÎQoÿiæÔÝŽWa#òÊý™Ê AÔCþ$À5¨§‡†±ø1·ò€~íŽ×ù‘Ú&?ALËžrl²íÈ,7hpv8hÅÀ·P¹‡5ñûeSzö6(Í¡æ†üq°d|¨°MûU÷Öå·Nÿ„D8ù¶}öÿ`ôÚ[ã{R¹“nÐ5÷.6èq uúxº·?"¢ÞXˆzÀ ù‘|K£}D=™5–A'C›2ÊŠñ‹Õ¼öÖ„ý¬ü·ž/½ 5c,õ3ûå[óßxé¬pö•þ–¯WsÚf#¾3ö1=뱕cEñ-/ð$&sAÔ«dÿ±µ©þÒ#OÒÿBbiÊŸ-!³ ˆzh™Ô´LõôÐ0:;àú‘Ú&;.§'.¼cÆ SÀpª÷Æ·ü¬ÏÙ%ñ;/y…¯RYôìÐ~‘Tþ’B›³É6ïa¼Û±x#ñý²eâß4áwŒM6˳Æö9D+ ¿ÞìÃo,›j¥AÂ]°[‘YÝúÐeb¡ëÙþØ=²ÕÃ?DL'ã _Þ67›$šø¡ðÇÍØ Í +Ú—C»äPD½±õF1†Nq×óëU“^Ê¢—ü‡H¾¥Ñ¾£ž¦êO9Â’ö‰-i(cç>nã㘓íÛò#žÒÄ+Ú'ö?7W¿·½´r¬(¾åþ€ÄäJr.ˆz)9á·ÏkNÝã%í"Â5ÆÇíg?Mù²ý™\ôQ툖¢žFg‡f;ævÌ•;^×/pñæ×Ø\;²¶ñÊÿ°õ½¨<ÖûÆl›>+ÝH˜eä~™xû¶«¶@ØOûµäãï¼äaù°5»SaÐÕ<•®Væ¶À÷9ìÌPöàÄ÷ÂØŽÙ]“ÅLÍÃ(|bé¿ ÿ÷[ŒðñµmtD½±õF¿£·}ëÚoÌFÂ\û2¬eßó>8ú':͈ä[í+-꥿¬MÍïS;LÙAÉqû/eg_¦ÿ'g*ϾF9¥©\ÑÙ­Û>Tž{”À¶JæHL.)炨'ýDÇ×J1·CŠ_É¡Æ.m*S¾—bÓ_ôQM“|–'¢ž€®#ê…¨7:;³ôBg»`ÝÕ¯NçõJã?Dò-ö•ùò[tˆ+$l•̘\XÎQ™#ê¡!RÍ2GÔÓCÐuD½±õFWõŒ/Ï Œ/}/ ô’ÿÉ·4ÚGÔCæüX!a«dþ€Ää s.ˆzÈQ3'½¬ˆzzhºŽ¨7¢Þè†F=þ ¡ þC$ßÒhQ™óc…„­’ù“ë̹ ê!sD=ÌŠd²n!êé¡è:¢ÞXˆz£õÿ!’oi´¨‡Ìù±BÂVÉü‰Éç\õ9¢¦'¬‹ˆzzhºŽ¨7¢ÞèÆŠzñ›ç˜øé{òw¦ÃŸ¥÷?uïCÚ‡.iå¯õ­»úÕo<ñ68oNÞPR6hÒ¿?m¬—¿]þ|Û«øaÛ'6"Ë zXüF}Åø±rþfJaÛ“tË™ð"ù–FûˆzÈœ+$l•̘\vÎQ™#êa’ƺ‹¨§‡ ëˆzc!ênõ€¨÷±¿8Íf…âæ®Ýñ:yUÕ[â¯r>Ë«\øÒ§êÒ%C³óA›l_øÍ'ÞF|eƪUö¹t=Û«•yËsÓ·žôÕÓmɰ'öIHo¶X¸]ûÄvÒ¿ô%ÃqéÃb—>ÉcõÖw½Üm۔Ͳ/}ù4;æÀˆä[í#ê!s~¬°U2@brñ9D=dލ‡ÉHë:¢ž€®#ê…¨7º´ÒBgƒR¯œ©tsñæ×ø,[ƶüæßx™-c›òbo-]ÒsÛº«_r˜?îoùYŸ8[+lÊÙb>+Ýç+o=ÕgÙ$™ÒøžØÆ½Ï÷Á>Æ÷Ñ>ãa0‹>¯uöÑãíø’¶LüN#ñ3á?Dò-öõ9?VHØ*™? 1¹ ¢2GÔø$‡õQO @×õÆBÔ]eÔó´Ú`eÔ« UÎF|Ö«–ŸàƽëÅ[‹—”Ðf_†YñFL(_¶{ñ¸ñ iSÅBD³éSá|E¹!_8½û!¦÷=<,¶®m3ŒÛ–m$,îB¼ŒóÇÜ–§ÎÿÉ·4ÚGÔCæüX!a«dþ€ÄäBt.ˆzÈQ£“Ö'D==4]GÔ Qot!ê½jù¥¦ÎGlš&êÉ,Q³dxb]åF|÷Æše÷ÑxKçúøÅ'¿b×v/½w¦æ¾‡YÒÅ Ý0a iï›/ÿ!’oi´¨‡Ìù±BÂVÉü‰Éåè\õ9¢F! ¬ˆzzhºŽ¨7¢ÞèBÔû+^å%Ë„W’NõêÖ KV¾ÚÔóœí›ŒßáÊ(zYüL7ûÜFÞyÉ+üy6ÉnÛÜʪ4JÔ«Or5w-ÛWàú‘|K£}D=dζJæHL.J炨‡ÌõPOâW_õôÐtQo,D½Ñ…¨'•ÊÕÄQ¯rÅXý’5å«&ê…l¿ž×ÿÂg>ßlœÌ|yýošû^3+÷ÚöÄ–¡¥ŽÛá?Dò-öõ9?VHØ*™? 1¹4 ¢2GÔà ’½ú¨§‡ ëˆz‰ïÔ¸oߟøŽ¨7Ô ¨wå­§zxŠ V®bB´ª\1V¿¤×·q£žIW´Ï×¾n<÷ËﺾLÙãðÎK^ñæßx™oÇ·oSzßk– ÜkÛŽo°ÒÐç9¶Ìˆä[í#ê!s~¬°U2@br:D=dލ‡”¯õôÐt]ñQO³]=¢ÞèVˆz5rŽzòëÂkoýKßsñ'îùÜAmÝÕ¯·e›µuoߦô¾ûÆ+gá^çöÛzþC$ßÒhQ™óc…„­’ù“ËÔ¹ ê!sD=©]… êé¡èº"£ž¦ºÑõF׳¨^ëØ.~í­ oÁæÚçòîÍ¿ñ2›eëÊ+skîûXQ¯ò®eˈä[í#ê!s~¬°U2@br¥:D=dލ‡@:WQˆzzhº®˜¨§yn2D½Ñõ,ê_÷oùYûÜöOÍ­Üκ«_mËØ$EÏLõü¹¶Lå]Ë–ÿÉ·4ÚGÔCæüX!a«dþ€Ääzu.ˆzÈQF Wˆzzhº®ïQO«Ü”ˆz£óFVŸ¢DæQ/,àÍŸ”„§àùTÞzXFÆMx/‹ô¾õŒmÖ–ñÝ“YÙò"ù–FûˆzÈœ+$l•̘\µÎQ™#êAòV™ˆzzhº®§QOcܬõF¢žÄ¯™G=Q­Mo¬zŒðú\Ÿ[YÖâ,_»ãu¾c6¥׈Q/dÁÊ¿ågëÊS sà?Dò-öõ9?VHØ*™? 1¹p ¢2GÔ+™„­’õôÐt]¿¢ž6¸™#ê.D½Ñߺ!d©´Ç]¼ù5>«²ÇÅj– ¯QM“œ©™åÂê6U²ú¹&dÁ¸»ÙÛ®†‡+½ï5K,.ƒ¶ýÐ í[Ñf }èÚç?Dò-öõ9?VHØ*™? 1¹| ¢2GÔ+“$-õôÐt]_¢žÖ·†õFê•M¯J^©ZiÝÕ¯MÊ>‰ßeâÊ[O Í«~k5K~ì/NóW¿ú$̾\™qraã•ûæV¾E†‹ï£-o}?à íK{(Âò5KÊ6/Ø—>MÏø‘|K£}D=dζJæHL.b炨‡Ìõ $= †¨§‡ ë:õ4º5¨7Šß¹âU«—Ÿz«)qÆcœ°AŸûÆ·ü¬Ì´µš%ßü/4+Ýáø™t±w^ò ›[óD¼š¹ÎÛbÈm! Ê#à÷½þaäÜßû9[,Ü„íOýƒ?GþC$ßÒhQ™óc…„­’ù“ëØ¹ ê!sD½¢HÉB@ÔÓCÐuzšÛÚAÔfȈä[í#ê!s~¬°U2@br5;D=dލWÉXˆõôÐt]£ž†¶6õ€ò"ù–FûˆzÈœ+$l•̘\ÐÎQ™#ê•@RD==4]ש¨§‰­}D=`†ü‡H¾¥Ñ>¢2çÇ [%ó$&—µsAÔCæˆz½'õ •ˆzzhº®#QOãÚ¼õ€ò"ù–FûˆzÈœ+$l•̘\ÙÎQ™#êõ˜t+Ô êé¡èºì£žfµù"ê3ä?Dò-öõ9?VHØ*™? 1¹¾ ¢2GÔë+‰V¨GÔÓCÐuyG=mjsGÔfȈä[í#ê!s~¬°U2@br‰;D=dލ×KR¬0QO @×åõ´¦e‚¨ÌÿÉ·4ÚGÔCæüX!a«dþ€Ää*w.ˆzÈQ¯g¤UaDD==4]—_ÔÓŽ–¢0CþC$ßÒhQ™óc…„­’ù“kݹ ê!sD½>‘P…ÑõôÐt]NQO Z†ˆzÀ ù‘|K£}D=dζJæHL.w炨‡ÌõúAÆEÔÓCÐuÙD=Így"ê3ä?Dò-öõ9?VHØ*™? 1¹è ¢2GÔëéS˜QO @×eõ4œåŒ¨ÌÿÉ·4ÚGÔCæüX!a«dþ€Ääºw.ˆzÈQ¯ë$Na2D==4]7﨧Õ,sD=`†ü‡H¾¥Ñ>¢2çÇ [%ó$&—¾sAÔCæˆzÝ%Y Ó êé¡躹F=Mfù#ê3ä?Dò-öõ9?VHØ*™? 1¹ž ¢2GÔë(iR˜QO @×Í)êi,ë ¢0CþC$ßÒhQ™óc…„­’ù“k๠ê!sD½.’ …éõôÐtÝ<¢ž–²!ê3ä?Dò-öõ9?VHØ*™? 1¹ ž ¢2GÔë©Q˜ ¢ž€®k7êi#ë¢0CþC$ßÒhQ™óc…„­’ù“+á¹ ê!sD½n‘…Y!êé¡èº£ž²."ê3ä?Dò-öõ9?VHØ*™? 1¹ž ¢2GÔë ‰P˜-¢ž€®k+êië(¢0CþC$ßÒhQ™óc…„­’ù“Kâ¹ ê!sD½N…™#êé¡èºV¢ž¦±î"ê3ä?Dò-öõ9?VHØ*™? 1¹*ž ¢2GÔËŸä'4¨§‡ ëŽzÅºŽ¨ÌÿÉ·4ÚGÔCæüX!a«dþ€ÄäÂx.ˆzÈQ/sҞТž€®k2êië¢0CþC$ßÒhQ™óc…„­’ù“kã¹ ê!sD½lIuB£ŠŽzWßùÚÛOzæâëŠzšÃú¨ÌÿÉ·4ÚçQïÃÿþÿ.¿ €Lø±BÂVÉü‰Éò\xÔ{ÿg_#ÿ|@&üª‡¨—INhZ¡Qï#7ÿS¿k@_Í:êi ë ¢0CþC$ßÒhß]_ý„ÿ[ÙºäºS%l•L#ÉsñC»e¯€ õ²"½ -(4ê}ë±›?õçoC;>ró?½èSÿ胟ýïd|®~µßnÛñ¿&UnbZÁz†¨ÌÿÉ·4Ú÷ÌS/ÞñžOnYÀLüo_øçv&óÏñÉ\»å\˜¯>p³„­’ùÁ3&×ÉórÓW.þÄÖs1WùWíHrñ§O•qLã ;.“oZÌ‘Ä&´£Ð¨‡6Ù÷Ïñï°¥µ2>?­PCXÿõ€ò"ù–F۞nj=òíã/Büä–—t ðƒgL.•Ñ=ó˜ýË~èógÊ8ÐRšÐ¢GÔë,í_½”mÔ»øúWËß òç?Dò-V%! Ó›IÔ“ˆÄüà“«eôQ=&™ m"ê¡q™E=éVDãW_eõžyòqß £ä[íIBfbʨ'ùHŇP'Ìè¢úJZFÔCãˆz¤å«Ç2Œzæöýä­ hŸ;ó¢Oý#û(ã˜ûî•ïg´$iI˜•i¢ž´ ’ŸÄäš=@ÔC/I`Bûˆzh\NQOÒ*iöê·<£šsûÎÚ¿2á }“´$ÌÐdQOª PÃÏ@brÙŒ ê¡g$-a^ˆzhQ¯S´yõQ¯4D=ôSR”0CD=I6@=?‰ÉÅ3z€¨‡>‘®„9"ê¡qÙD=©WHið*Q¯4D=ôPR”0[ãF=é5ÀP~“ëgôQ½!Q óEÔCãˆz¡µ«D½ÒõÐ7IQÂÌõ¤Ô#ò3˜\B£ˆzè)J˜;¢—GÔ“€¡©«D½ÒõÐ+ITBFŒz’i€ÑùHL®¢ÑD=ô€ä$䀨‡Æõ²§«(D½ÒõÐITBC†F= 4À¸ü $&Ò袺NZ2AÔCãˆzyÓÈU¢^iˆz艤+¡9õQOê 0?‰Éµ4z€¨‡N“„|õи¯?òéãßaóŒz’±há*Q¯4D=ôD’–Мš¨'i˜ŒŸÄär=pàÙÃö/KÔCIEBVˆzhÜßÿ§‡?{û;¾sðVo‘”,8Í[e"ê•æñCßxÛùöQÆ.IÒõƒgŸ_¼ã=_Û·-”(LÃÏ@brE~øò_oø‹û¯“A s’¢zOJœ¶­bõtLÔ•0/Rd€)ùHL.ª`.¤!CD=ôžÄ, [%#êè’¤.¡}’c€éùHL®« }'¢úMbŒV­ÂõtFR—Ð2 1À¬øHL.­ eRŽ-¢úMz4i¨ 3’Æ„6I…fÈÏ@bru m’l„œõÐcÒ³ = †¨ ’Æ„6I‚fËÏ@br ­‘f„ÌõÐc’´ §1 ލ ’Æ„6IfÎÏ@br¬|é?Þ¾æüŸÚô/ÞúÖ»vþï²@$!D=ô•$­ÂiÉB@Ô»¤1¡5R^€†øHL.³‘•3~þÿ±ªõéï>_v˜9©Eè¢Úðâó÷ÊHó¤j•L3bD½=÷ôÓ2d-)MhGÜ\žæ™øK`¶ü $&WÚÈÊ)¯}íªU«ÞóoÿÑÅ›_Ó‚_ýí—õÐIEè ¢wäÈö]tÇW/–ñ&IÕ*™6,¢^iö|ýËö¯üµ}ÛdÈTRšÐŽ8¸}ê°7¶|å²x˜!?‰ÉÅ6²âQï#·½ö†{_ß‚ >ø*¢š&BÔCãìûçøwØÒZo’„­biÀBЍWšÛw~Ôþ•í£Œ9JJÚ!Áå‘oï°ãƵ[Εq`Vü $&×ÛÈ Q=#‘ÝBÔCãZz¶Š¥õ •ˆz¥!ê¡3’Ò„HjqD=4ÍÏ@brɬõÐ3‰Ð-D=4ލ7'Z¯P‰¨W¢º!‰Mht–€¨‡¦ùHL.¹‘¢úD :‡¨‡Æµõ$lKÓ!ꕆ¨‡nHzš&‘%FÔCÓü $&WÝÈ Q½!y]DÔCãˆz­Ón…D½ÒõÐIoBÓ¤°¢šæg 1¹ðFVˆzèiCè(¢GÔk—F+Ô#ꕆ¨‡Ü%½ ’¶R‰¨‡¦ùHL®½‘¢z@º‹¨‡Æµõ$oH‹†"ꕆ¨‡¬%É ’°2QMó3˜\~#+D=tT!tQ#êµEsFAÔ+ QùJ’%U¥QMó3˜\#+D=tš$!tQk+êIá*æ*Œ‚¨W¢ò•T'4G’J=¢šæg 1¹GVˆzè.éAè¢GÔk…¶*Œˆ¨W¢2•T'4GzÊPD=4ÍÏ@brެõÐQƒÐD=4®•¨'…«4ª0:¢^iˆzÈQRÐ))#"ê¡i~“Kqd…¨‡.’„Þ ê¡qD½†i¥ÂXˆz¥!ê!;IxBC$£ŒŽ¨‡¦ùHL®Æ‘¢ºHJzƒ¨‡Æ5õ$rEÆEÔ+ QÙIÚš e,D=4ÍÏ@br5ެõÐ9’Ð'D=4îë|úøwQ¯š¨0.¢^iˆzÈKҞР(ã"ê¡i~“ rd…¨‡n‘„ž!ê¡q?yñÁë·-ìûÛÏÊøŒHä*Šö)L€¨WšÇ=üÉ[죌s´'4AêÉ^|ö…·ï7n•q`Vü $&×äÈ Q"ýCÔC×Iç*‡Æ)L†¨`>’ö„&H:òäg 1¹,GVˆzè ©?è%¢:M:W9´LabD=ó‘ä'Ì–D g~“+sd…¨‡Nôƒ¾"ê¡Ó$uB³¦AÔ0IÂlI12çg 1¹8GVˆzÈŸtôQ&µ«š¥0 ¢€¶% ³%¹h¯/¬yÓcŸÈ¬}ìóYξ”R~“ëó±l^\[kÃ7Ø—¶Ø…üJ? 1ÿŸÿõ¿zù+ÊÆ·--³°`λ`­×º³×¬‘Ëxa Ûb6Å­-µ}×nÛ -¼gï>¯{¶Š})‹ÙÍÙb›íó›·lõ}ð—ñ†€¿¯nå Ý ô»ãÛ´/ãûâƒvö¹Ýœ}n#^óDÔC†$ô D=4ލ7P˜-¢^iˆz˜ƒ¤CaV¤˜4„¨‡J!êÏsöexÇŒ4êmýâV[FýY~¯ÿÅŸñ“÷šÓÚO?ÔŒg8ú§ñÎ^³òöö‰¼cF`›2ñˆ¯nÎxŒ·pù†ã÷1쀯÷»úAûèÛ?xô˜Ýzhˆö‰}éÏãså©|Y!ê!7RyP¢7ë¨'Í«÷4Ba¶ˆz¥!ê¡mI‡Â¬Äe¤QD=TŠ£ž¹*zÇŒ4êù‹7,ƃûØgƒ/åOÅOÖó¨'¯B­ìe•lE/€6³°°ÿäíz›“û`m{öß+ &NŠãF½ÊH·méø_$´âA»•Ê[ÏQY‘ăÒõÐ8¢Þ´@aæˆz¥!ê¡mIŠÂôâ&Ò¢*IÔó'âÙäF=‰îî»ãÁ0þ+çÿC?1õäIy£G=³ÿÀÁó.8þ@›N?ù­o};þZ×À£^ˆkÒø*UîOÍ`åÓýIyR‰z‚¨‡ÒwP ¢7Ó¨'Í«ß4?¡ D½ÒõЪ¤FazDZ@ÔC%‰zfá׿dÕ[žD½Ý;އ*YÞÙb6ëŸýúÿÍÏCÌôQÏm;ñ÷ìâ@F*ù2£ÜÖ¸QOîŽóY²Aå*9 ê!wP&¢GÔ›”æ'4¨W¢Ú“Ô(LOjH;ˆz¨”F½ðŽ‹7,æõŒmäô办(ç_Ö÷²Qn«¦ßõƽSsGÔC&$î LD=4nvQOšW¿i{BCˆz¥!ê¡%IÂô$…´†¨‡JiÔ3á3$êùßγ©—߯dÅQ¢Þ9Ëï’1Û—ßVÞ¢ßQ¯Q•¤ì XD=4ލ7> OhQ¯4D=´$ R˜’t6õP©2êæMqÔ3ïä2Âøoð~b&‹zWmÜT™á|Åðζþ¥ü;a·bËØ’2«ÜŸšÁʨ7Ê eˆ¨‡¹“¬ƒ’õÐ8¢Þø4<¡9D½ÒõІ$HaJAZFÔC¥AQ/¼c†D½µï>þÎ ¿¾.Þ°hƒ¯ÿÅŸñ“çQOÞY¢²—Å<¥ïGáŸ.¼îæÅã·h# ˘«6n áÏö'ôÉÖâ[÷7âˆßÓvû‰—úVF½tÇÌ ²/ë³ã|õ0_ÒtP8¢7£¨'Ù«Ç´:¡QD½Òõи$HaJq™ ¢*yÔ;øíƒ2nâwÌ⿸ç#»wì¶?Mϼü•?e‹IÕò4V“º<ê¾zuÈ<½UnÊ>^µqÓö]»7/.ž³°`+ÆO¦³U|k¶Ù°Œ­ð8h“/`m®¯—>ãÙnО‡²Ol;¶ó¶º} c†ˆz˜# :Q#êC“šFÔ+ QKš¦‚ÈõZøõïqkÞ´fë·Ê\ïwò¤<Wôeö=°ÏÏ@Üëñg^þÊŸ:}ùéuá)oÝœ$³`ÛÒÒÙkÖ„ÅœTÖ1g«–'ûľ”'î™u­—e-`½ÙÙÛç&¼x”=÷µÂ Ù*{öî“e²BÔÃIЈzhÜ,¢ž”¯Ó䄦õJCÔC³’&…iH™¢fn÷ŽÝñ;føHL.ãǵ}×îøiwƒŒ²ØÐeâ¹iÝž½û†îL&ˆz˜©9€!ê¡qD½‘ioB ˆz¥!ê¡AI“Â4Bï˜;¢šæg 1¹’GVˆz˜ I9€#ê¡qSG=)_}¥± í ꕆ¨‡¦$M Óä1_D=4ÍÏ@br1¬õÐ>é8@@ÔCã^|þÞë·-|ý‘OËøÈ$~õ’–&´†¨WšÇ=üÉ[죌ÓJ²&&½cî^|ö…·ï7n•q`Vü $&×óÈ Q퓎D=äOúW/iiBkˆzf ÉR˜˜Ä ~“ëyd…¨‡–IÄbD=dNâW/ifB›ˆz¦•d)LLJP?‰É%=²BÔC›¤à‚¨‡ÌIÿêmLhQÀ´’2…ÉHæÊág 1¹ªGVˆzhä EÔCΤõ’6&´Œ¨`*I™Âd¤qEñ3˜\Ø#+D=´Fò "ê!gÒ¿úGÚGÔ0¹¤La28€ÒøHL.ì‘¢Ú!í¨DÔCÎ$õ&´¨`rIœÂ¤nò3˜\Û#+D=´@ 0QÙ’þÕ?Z—0D=Jâ& i(“ŸÄäòY!ê¡iRm€D=dKXÏhZ¼õL"‰S˜€t  X~“+|d…¨‡¦Iµjõи#Gî¼dó)wíú#¯% ¬4-a^ˆz¥yèá»ì_Ù>Ê80†$Na5rvô©Ãï¿áŒÛvlq`Vü $&Wø9Û¶´tù† öQÆ[ÓþõÐ(I6@=¢gß?ǿÖÖÊx-I`=£] sDÔ+Íí;?jÿÊöQÆ1$} ã’¢‘¹G¾½ÃŽ×n9WÆÑ]ûØ·æMk‚…__Zæg 1¹ÈÏÓå6œ¾zõÙkÖ„¦¶yqѾ λ`­/)ãÎæÚŠÛwíöe¹j㦰Ê9 ¶)YÀ£žÍµYwÑz™Û¢š#½Ѝ‡ÆõN¦Q óEÔ+ QÓJúÆ%9#D½^ZºciõëW¯ZµjîEÏøHL®ó3´î¢õöè…l\µq“Û$}-¿|ÃcŸœ¾úø?ÁÙkÖÄK›=Ú'ÛwíÞ¶´tÎÂBÍò¶3¾}Ÿ9¢"±Q?êIëJ˜/¢^iˆz˜JÒ§0.i@Ôë+z>8ù «~}aí»×Êàü $&—úí8ga!t•ö8xúêÕFÆÏ²Vž‚W9~ð豳׬±A»é0è¶--ÙxÚï¼Ü êz~{öî“ñÙ"ê¡!k€QõÐ8¢^D‹推W¢¦’$*ŒEBFWõújÍ›Žç¤i¢Þêׯ¶Èàü $&—úí8}ùiq2XÉŸ¦7è9q•Qoи?ƒÏfŃÆcßÍ[¶Êxˆƒ¶¢Ì2¾c#¦É‰õÐ)5ÀˆˆzhܘQO*XÏhQÂÜõJCÔÃä’D…±HÅè¢^_Mõ–î8þT²ÞD½AÏŒ«äÅÍÿŽ^j¬¨g_Ú Œo^\´‘´ô¹šáú½´â¬õ0s’i€ÑõÐ8¢Þ š“¢^iˆz˜P’¨0IÝBÔë«4ê-Þ°hƒ&ü¡=›ë#Òþü­6lu²ž‹_Š{ðÛ׿o}˜µéêMa–±íÇã¿þÞ—¿þæ5§ÿ´}´o¶_9ÿž}â}!ü‚ÝEë}䪛öìÝ矛ð:ÓÊÁðö¾ýžwÁZ‘ç²ùêžÃ|t™Ø lçÍ­÷¨g³l÷Â`M¶3ƒžÜgìŽ š5CD=Ìœd`tD=4nœ¨'¬O´%!D½Òõ0¡¤RatqËè"¢^_­©z¦Þ¦«£Õ¯_½{Çn[`í»×.üúñÀdSÜìl­õï;þJO[Ò>w¡ÜÙº6n+î{`Ÿ×=[2„BcƒáÖmîË_ùS¯9ý§íKûÄÏFB·Ú¾k·'6/b—oØ`×ÿ7oÙjŸÛ²mKK¾L<(Û9Æ‹“™¿m…/éïba*_ßjü°FÆß~¼5ãvC²3Æ—´YñàcÏ<¶õo®ú‹û¯»sçv›kSzfЭÏQ³% Q#ê-Ó–„LõJCÔÃ$’J…Ñ…ŠÑ]D½¾ªŒzfõòhx×ó‘PúÂ2ÆæÚ m$t¶¤,ì·µxÃb±ÛõÕ×¾{­Ÿ¼þ&D=»Î?}9œ½f÷)ov¡sU¦«t0h õ|³Ò=áÅ ÇíÏÏ@bv©úø/q4˜nÇ–±%ãqi!êÙM˜ð¹ÔFçs%ê=ùöþÍUï¿áŒõìûÒã´7èÖgˆ¨‡Y‘:L€¨‡Æõ´"!+D½Òõ0ž¤Rat!^tQ¯¯Šz¾¤o$ó¨ç·îg 1»Ú?½•¨šš´õÂøy¬õí„×¾¤D=wø…g>öÙ÷Ù\›Þù¯Î®8í ºõ"êa&$Í“!ê¡q£E= a½¡ ¹!ꕆ¨‡1$• £ 墈z}ÕhÔ‹—¬”CÔ³)¼U®´õŒÝœ¤o³ëãƒvfÛÒ’Íýoþñ+ÞÃñƒæiïu¯?½òÖgˆ¨‡éI—&FÔCãˆzÈQ¯4D=Œ! UQ\.z€¨×WD½xÜGZŽz›mĦmKKaЄ'ñŃÿA@ÛÕÃ/<ã/ȺÿêUÇßGøÎÛe­"êazÒe€‰õи‚£žö#dˆ¨W¢F•„*Œ(Îý@Ôë«™D½tI߬¼QFj¾QÏŸìMuÁÐ%mVºƒÆýIyç,,ă¾{6Iìs¾ð"žö.ÿÌ/øC÷òWþ”ÍýíËO•¿µ7CD=LI¢ 0 ¢÷âó÷^¿máë|ZÆ#ÒÂzCû2DÔ+Íã‡þä­ öQÆ“$¡ #Š›Eo¼øì 7n;ÿÞoÜ*ãèº)£Þ¾öÙˆüöÁ0ho8þì3?ö½cñø¦«7Ù¬ð¥G½)ß(#~oÜ«6n²›Ò¨gƒáe¶ÎŸ ÿÑ:[ÀFláÊw®ˆÍ6ê…'ëÅ÷Åœ³°`ƒûÌÍ[¶ÚxúŒÂ'øÂ_ÜÝåŸùzþçö.Þ|êv\vàÙòð”ˆz˜†`JD=ä@ZX?hèãñÛ׆…å=m= ÚÇ¥;–oX´Od|ÓÕ›vïØm³~}Á¶7A»]_Æ>÷3Øþ=ݼe«^ ºyqqû®Ýö¥ñg½IóíØÜ0â-íb¾º}ܶ´dˤ ¶MS™ÿ<ºÙ$»1hÜx¿³ Ê;føþØž‡²um1—F<ùÃ^sÊ+îUÿ× ÿø•áÁœyÚ#êaRd€)õÉa= åÙ"êPI«Â(Bªò·ï}kÞ´fõò3ò̯/TŽ{“ÁøÙv»wì¶‘UËÏ˳ؒaÖÚw¯õY>×¾ŒŸ¸çs­èg Áoðg¯Yãá̤̳°`smûöñª›l$¬'<_ÆgÙGÿ$^ ؾk·/lmãƒÂ™ñÅÒçâyt Â3;»¡0Kî캋ևYÎFâ„?ßðu¯½?k/~Tg˜öˆz˜˜ä`zD=Ìä°~Ðr„lõœ$iUEH@vïØ-¯À lVüì¼Aü $&!`ýÆe­2Ãy óÏmá´Ä [`è+pÏ^~—ÄØþœw♉õûæŒÏvÏ>/ÈØ™¤=¢&#-˜ ¢æNrXh6BΈzN’ä* %yÀ¸ü $&-`qÔ›ÿû}é¼kÎÁ£Çì^„`7ˆ¿1nüLÀ&ÒQ“‘ÌQó%9¬4!gD=/Ir†’6`~“0&¢žñÍ}Nß …¿ÊwÞký¯ïm^\”—ëÚ«Ù¦=¢& !˜¢æKrXh3BæˆzV$¹ £6`~“0±íÃÞ©vb›O¼Û†¼»E£üFý»õøÕÄþ]É|±Y¥=¢Æ%˜!¢æKŠX×i0BþˆzV$¹ CI˜0?‰I˜Ì¶¥%ÿãw6Õ¿ñÅdnÞ²Õ¶ïq­µ¿¯gwjÝEëíî„[´OÂn z³àØôi¨‡qI…fˆ¨‡9’"ÖŒ?¢€ã’\…¡¤J˜˜ŸÄ¤LæàÑcþή¡§Ôí_~³Ž6Ÿ¯'ünŽûB`O{úü™ñÃ>bÚ#êa,’`€Ù"ê¡qGŽÜyÉæSîÚõG2ž±®ÓZ„N ê•æ¡‡ï²eû(ã(Z’«0”$‰~;úÔá÷ßpÆm;6È80+~“(€ælß{ó¸i¨‡ÑIfލ‡ÆÙ÷Ïñï°¥µ'Kë­Eè¢^inßùQûW¶2Ž¢%Å õ¤GôÞ#ßÞaÇk·œ+ãÀ¬øHLºš6VÚ#êatÒ_€™#ê¡qeD=MEè ¢^iˆzPI±B=‰% ê¡i~“.€vŒ˜öˆz‘Ä  D=4ލ‡œõJCÔƒJ¢jH‰(QMó3˜¤´ihÚ#êaR^€†õиª¨'E¬ë´¡Cˆz¥!êá$I´B Éå ê¡i~“:€öÕ¤=¢F!åhQ#ê!gD½Òõð’$Z¡†4ˆ¢õÐ4?‰IÀ¼T¦½W¾úõPO² Т×÷¨§‘ÝBÔ+ Q/IºjHƒ( Q 9úÔá·oßZ}ê‰Ol=ù¸òæ5o>ÕOÍË~î§V­Zõº_ø?ÿ?üc9çÿ÷r#ƒC½úµ?MÔëi.@£ˆzh\õ$ŠuF"t Q¯4D=¬H¢jH‰( Q ÙûÈÝ~înyý/þ̪‰¦÷üñ+mõ·¾ëe+_3ýÁ%—J9B¶¤¹"ê¡q½ŽzZˆÐß ˆz¥!êá¸$Z¡†dˆõМß}пÁÄv O_þë+þíMoùw×­Û¶´4–[n»å¼üÜ\{üß÷ª›þ¿2w(ÉFÈ– iD=4îä¨'Q¬Ó¤!O/õ»JD½Òõp\Ò­0ˆˆ2õÐ4?‰I&@<öÌcö/{Ùgþ{%ïâÝ¿/  $¸M#ê¡qD=´H›ÝPD½Òõ Ñ 5¤;‹¨‡¦ùHL2zÀ£Þ‡>æžGï¦ëõ•Ô D=4®§QOZæKSÝèˆz¥!ê•.éVD¢CɈzhšŸÄ¤ BÔ³Ïéz½$©hQ‹¢žt±N“¨„öiž› Q¯4D½Ò%é ƒHt(QMó3˜Äô@õ ]¯$µí ê¡q}ŒzR—Ð&­rS"ꕆ¨W´¤[a)…#ê¡i~“X€¨gèz}"h Q#êa4ÆÍ Q¯4D½¢%é •$7€¨‡¦ùHLzz z†®×Y€6õиŸ¿÷úm _äú$u”Ä&4M3ÜlõJ󸡇?yë‚}”qô_’®PIZ̋Ͼpã¶óïýÆ­2ÌŠŸÄ$ ïþý/ÿõ¤ëõ€D MD=´FÒXwIrBs4À5¨!IW¨$¡@;ü $&Éýº^šü?),@ˈzh‡t±î’ê„&hwkQ(BR¯’Ê 5~“j€Þó®·ùöóeù“´Œ¨‡vHë.ÉO˜--n- êý—Ô+T’Ê 5~“j€~áAþ$¯í#ê¡’Æ:J fH[[kˆz@Ï%é •$1h“ŸÄ$È´`.ˆzh¤±î’…™ÐÊÖ2¢ÐsI½BJú€–ùHLÚ€ I[您‡Hë(IQ˜ Mlí#ê}–Ô+¤$.hŸŸÄ¤È„`^ˆzhÔ±Ž’…)i\›¢ÐgIÀ‚²`.ü $&ù@n$¬óBÔCÓ$u”)LC³Ú|õ€ÞJ„dóâg 1É(ÖÖ¿¹ÊÈ æNª 0GD=4í±#Gþò’ͧܵ벓3Y·H–ÂÄ´©ÍQ¯4=|—ý+ÛGGß$ )É äèS‡ßÃ·íØ ãÀ¬øHL zàɾð¡ÏŸù‰­çÊx½Ë?ó öý°x÷ïË8æH’ 0_D=4í±ûö]{ü;liíÉ™¬C$Ka2ZÓ2AÔ+Íí;?jÿÊöQÆÑ7IÀ‚¦€|{‡7®Ýr®Œ³âg 1‰èÇžyÌþe?ôù3e¼ÞžGï¾xó©¶"]/’T€ù"ê¡QÇ£QÒѲBÔ+ Q¯IÀ‚ €zD=ÌÒ ü $&=0YÔ3t½¬HO推‡Fbz§0.h¹!ꕆ¨W„¤a!¦‰Ãõ0DéÆåg 1é艣ž¡ëåCz 0wD=4g¥‹u9êIŸÂ¸´ eˆ¨W¢^ÿ% 1QÇ%%n†ü $&=0MÔ3t½HLr@ÔCsVÒQ¯HÚβEÔ+ Q¯ç’†¡# ê'‰nMó3˜¤ôÀ”QÏÐõæKJ ¢š³’Æ:õ¤RatÎrFÔ+ Q¯ç’†…˜– Œ†¨×sIbkŸŸÄ¤& ¦z†®7GRR€LõЗêQ¯$šÌòGÔ+ Q¯Ï’†…˜† ŒŒ¨×7IS›;?‰IM@Ì$êºÞ\HFòAÔCC^ªcD½bh/ë¢^iˆz}–d,50¢^$-+~“ €˜UÔ3t½öIFòAÔCC^ªcÝŒz’«0”Ʋ® ꕆ¨×[IÆBLÆAÔë¤$œåÌÏ@bÐ3Œz&t½/ÿõ™…™“†d…¨‡&œȈzÐRÖ!D½Òõú)iXˆiìÀ˜ˆz‘IJ®ð3˜4ôÀl£žÙóèÝï¿áŒþò=2ŽÙ’€䆨‡&œÈ:õ¤X¡†6²Î!ꕆ¨×OIÆB Õã#êå.idãg 1É è™G=´C ¢špR##êõ—²."ꕆ¨×CIÆB í!êå(ébæg 1É è¢^I=2DÔÃÌI ë\Ô“n…A´ŽuQ¯4D½JJœFLЍ—‹¤…õ†ŸÄ¤, ˆz]$õÈQ3'Œ¨×KšÆº‹¨W¢^ß$% LЍ7gIë?‰IY@õ:GÒ '¢fNÙc/>ïõÛÎýú#×Ëx–$]¡’v±N#ê•æñCòÖû(ãè¤$c!Ð,‚)¼øì 7n;ÿÞoÜ*ãhVR¾zÌÏ@bЋwÿ>oVÛ!’N€<õ0[ÒÈ:GêRÅºŽ¨tXR²à4Ž’¯øHL‖I7²EÔÃlI#ë©WšÃú¨tUR²à4‘t®¢øHLú€6I4rFÔÃlI&ëiXˆi ë ¢ÐUIÌ‚ÑPd.É[eò3˜$ ÆžGïþÐçÏ´2މI4rFÔà I#ëiXˆië¢ÐIIÌ‚Óbd+ [%ó3˜$ ÆÖåKzû(㘌 sD=Ìd²n‘Œ…@+XÏõ€îIJœF CIÏ‚ñ3˜T Qo¶¤˜™#êaV¤‘u‹d,šÀú‡¨tO³`4¹IJ?‰IejõfHr ?¢fE2Y·HÉ‚ÓþÕKD= c’˜§ÈD°ò3˜„ Qo†$—ù#êaV$“uˆ”,8_}EÔ:&‰Y0šQ€$é ƒøHLBPƒ¨7+ÒJ€N êa&$“äÈ‘¿¼dó)wíºLƳ!1 FËWõJóÐÃwÙ¿²}”qtC³`´¤`ÖŽ>uøý7œqÛŽ 2ŽjI±ÂP~“Ö€xò‡/|èóg~bë¹2>½4êm^\<{͚༠ÖVŽ;›{ù† Ûwí«Wºj㦰Ê9 ¶)Y`D¶¢­oÊn=̵ ³‚u­·[ßà`XlbñMWúß6n’bÒö0šCGÉ8z¨‡™Lv’ûö]{ü;li­ŒçAbŒf¯~#ê•æöµeû(ãè€$fÁhOAùö;n\»å\‡JZFäg 1)èÇžyÌþe?ôù3e|z•ÏÔ»jã¦UËÓº‹Ö÷ dŸœ¾zµœ½fM¼d°yqѰ¹öÉö]»·--³°P³| [Å6eû`Û1ç]°vy_VÅIÑm1ß=Fä¾L`ÿƒ~gãí›ð ØçRLºÂ÷ÿ+»vË8z¨‡™Rv¢^§hóê=¢^iˆz–ô,­*hQo¸¤Ra,~“h9ê…z%OÁ«?xôØÙkÖØà9 aÐm[Z²ñ´ßyh«ëy ´ ƃ¾xg6/.Úˆíd ƒ6Ù'ñø*÷üØò¿-çÎÌ£ží¤íù½{÷ɸ±GÌõ DÔÃô$“©Œ£žô,hð*Q¯4D½®JbŒ†4ƒ¨W'éS˜€ŸÄâÜ€~h9ê™Ê¨7hÜŸÁ')Íxì»yËVqÐV”Y•|ùtû{öî³Áxgìóš=+#Vº|Æt;GìF3z¾ó”;Ĉz˜ž”2EÔë­]… ꕆ¨×UIÏ‚¶4†¨W-)S˜˜ŸÄâÜ€~È<êyJ“ñÊ'Íc½wPªK ZÒ{Ö([¨—F=I$9ó²IÔCŒ¨‡éI)SD½.ÐÔU¢^iˆz”ô,h^A“ˆz'I‚¦çg ±Ðˆz6kô~õÙnГû*þ̾Q¢ÞyÑûi„— oŽÞ¤æUº£D½w¼}üt´}û<,lüU±¶¤Ï]wÑzyÊx›Ï kù{tÄ·ró–­ñ’þaßùàÞ½ûÂ*aWcÛ––â»ã·Øêa–¿ª7lÍÖzøÀÁxa䉨‡)I&«kÔ“ªU2í\E!ꕆ¨×IIÒ‚v4‰¨·"IQ˜?‰…Ü€ÞÈ<ê¥©Ëø’6+ ¼¾Ù”ÞD¥s–¡Mõ]oPÔóÕí£}þ -ߺÖo_îé±ÿäáåà?ýíP´ýxÜ¥‹Ù -æ™ïæ-[ís[FÖ²A/t¶˜}n#¡úù­ûf½¾­»h½ßM¾Y³miÉöÜ—´ìsçÛñÞgs}áÀ–´qÛì½{÷Ù …û×:Û²oÖ>±‡×Øò>bK†Å-¢¦$¥¬Q/o¹JCÔ+ Q¯{’žM-hQO fÎÏ@b!@ 7rŽz³A# û’—Ï(ê™ÐªìyÇŒÀ7k7-ƒ¾3ñZ¾µð¤<¿CŸ –mÓ|e×îw-¿uFúšVß~Èj‡–·/EÏS£íUñ퇭Ù¶VüÖ!´…߈Ý\¸-ã{eë†㻔%eá›·lõÍÆƒ¾Y»ÅxÐ7k«‡°›°/ݲBÔÔ¤”UÈ2êIØ*™F®ÒõJCÔ똤gAk šWtÔKòšàg 1ÉèÜ¢ÞæÅE¯Zë.Zo#g/G®Ê%gõŒßœ¯xÎÂBüj_盵eìg;`_yQ­Íòq߈mí¼ ÖÆ Tòèæ7áüË´^yØ2þ¼6Û~\â̽{÷ùvâA6µíÄ{‡YÆæÊZ¾K²qãû—¾±¢ž/¯nÂ>ÇOÖó%íŸ&Œ„AÛ·x"êaRʪõ2¦…«@D½Òõ:&IZ…Óà‚Võ’ð„æøHL2z ¹¨·çÑ»m³öQÆ= mêÎ^þ»iáó4®Ÿ;Û¨gì¶Î[~¾˜Mv²zجÍr¶{ë.Z_¹‡žÃÎYX°l1™[ÉWñ…½‰økW+K™lÐ\l-[@bÙ ¨gȳ[”q1êÙ—• ûøÐV˜Þ:òDÔÃ4¤”UË/êIØ*–æ­2õJCÔë’$iA³ ZQ\ÔK’šæg ±¸A š‹zƒx»õ¸÷5ʸó×–ÚÖd|t¶¾3ñ_Ê7êm^\´åe#5¼ Ù’22ȧ£íˬ¡ÙkèÎw)]ÌWŸ è#D=Ĉz˜˜”²2‹zҶʤa«dD½Òõ:#IZ…Óø‚•õ’Ò„ÖøHL2z ç¨7¨‹…'ñŃ¿¶ôìÑ^ô:H(Gad¬¨çYðªïý:Ê“õ¼ ÙíJ1÷îÝ'OÇûÊòöÃ{ËÊ\_Ý„/0´‹ù.¥‹¥YÍGF‰zþ·ó*¶Ålœ—ßöQ“X6Q/3Zµ GÔ+ Q¯3’ªU2/hWÿ£^Ò˜Ð2?‰I†@äõŒœsâA.žM•O‚óíÈ›W rÕÆM²qç·od¬¨g«ûÛÝza¬¼ áÍV”2bìF¥aÙbþv·aûñÜšM¹¡ 8_LnÚØŠ6žÖ·tIc;odDVÇã—ûf‰zEÔÃÄ$– ”SÔ“¼U MZ ꕆ¨× IÕ*œ&´«ÏQ/©K˜ ?‰I†@dõ“õ$ÒùsÍÒXvó–­6~öÈOÓón•ÆAÛ¿ ÆèQÏö*~ÉpˆPa¤’ï‰-,eÄ fܰlûéß³‹xøÀA0mÝ0hÂ2ƒ°/ãwÏð]’bèëšxÐÿ9Ò÷É5é¶XºY5± ú]“Lï/òDÔÃd$–Õyñù{¯ßvî×¹^ÆçA Wi´gÁõJ󸡇?yë‚}”qd$IZ…Ó ƒÖ½øì 7n;ÿÞoÜ*ãÝ–t%Ì‘ŸÄ$C ïþý/ÿõä4+Ýl’H7hÜx0:=y«Çó.XÒ›­k‹Ùøž½ûÂbõ¼[ÙZÛ¢®ç/ï]wÑú0bü9q¶dåÛݾnœ&uIáwÇ>ÆYäÞ½û|<„-/bñ“×Â׋ŸûöÖî -l³ìaŒ7°OlÛ¾mÙ¾Œ7?8>rèè1ߟx1öÁoÎ6å „zhÿ¾aá06b«Øˆ‘wñÅlãAßD†ˆz˜ŒÄ²®ÈUíY0D= ;IÕ*™†`zIQÂÜùHL20nÁå'ž¼6hÜíÙ»/Ì’.¶î¢õa–³‘x¡¶--½flÄFä†Î[^Á <6eŸøˆí|¼ýA+ž³°–©ä/Þ¾w¯~a±¸µùƒ³jy²OÒ§ÑÙã/`û M-D=c·â7dãBxôåmE‘}“®î²/“Þzü˜øe0½GÈ Q“‘XÖ R¸J£1 ލä%©Z…ÓL)ÉIȟĤD9Øà ??îôaO£«·}×îôEÁí2C_ÙµÛƒà ÷îÝ7hz¡ÐÙb8/ lným¥†îº‹¨‡ H,ë ‰\EÑ’…€¨ä%©Z%ÓL# IȇŸÄ¤D5ö¦}”ñ&ÊxCÂ_å;^ë6/.šðjÍÔ¼ž—'$…䃨‡iõ0ée «Ú° ˆz@F’°U,2Àd’x„<ùHLbP£å¨g6Ÿx»ovg¯Y“I¶«')$öÚƒÉ[R`2D=ŒKbY'Hç*‡,¤ˆz@.’°U2M3À’r„lùHLbP£ý¨g¶--­»hý9 WmÜ$³ò$$ö0†BÊ“õ0¢Æ%½¬$u•CRD= IÕ*™¦`\I3Bæü $&=¨1—¨×9ÒAòáoaÈ\`(¢Æ%½¬$uBë*õ€,$a«XZg€±$µàg 1é@ ¢ÞPA€>!êa,ËFräÈ_^²ù”»v]&ãm‘ÔUMW„¨Wš‡¾Ëþ•í£Œcž’°U2m4ÈÀѧ¿ÿ†3nÛ±AƳ“¤"t…ŸÄ$I žüá úü™ŸØz®ŒO¨7”D Oˆz‹ô²‘Ü·ïÚãßaKke¼-R»J Ý 5ˆz¥¹}çGí_Ù>Ê8æ) [ÅÒFƒ<<òívܸv˹2ž‘$¡[ü $&I=ðØ3Ù¿ì‡>¦ŒO¨WO Ð3D=ŒEzÙHæõ¤vB»jõJCÔËN¶Š¥™ÙÈ=ê%…ãg 1©è¢Þ¼Hz†¨‡ÑI/Q¯]­P¨W¢^v’¶U,-5ÈF¾Q/iCè(?‰I•@õæBòÐ?D=ŒNzÙ¨æõ¤v•@‹†"ꕆ¨——$lKc r’iÔKºËÏ@b&ÐD½¹ütÈ÷GCÔÃè$™Š¨×ÍUQ¯4D½¼$m«Lk™ì¢^’„Ðu~“0Ñu»|ÆQÈŠÛ––â¹öåþ}Vå6¯Ú¸iû®ÝaõAl1YQزÊôÚ‰zö°Ø#°gï¾xbI"²%n,D=ŒHzÙˆzmÑ\…QõJCÔËHҶʤ½ùÉ+ê%==àg 1i]·}×îUËÓé«WŸ½f±O*¿ŒWññu­¿|Æó.X»¼U6–±q ÛñUŒ-Km[Z²%}ݰ¢³u}PV™^;QÏ“&ö¿‹¤›ù07 ¢F$½l sŠz¼zO[FDÔ+ Q/#IÞ*“&ä'—¨—” ô†ŸÄ¤MtG½¸4Ùç6rù‰§æÙãüËýÚçR¦6/.¦¹Ê\ØŽñMÙà9 a0uÕÆM¶L¸Åàæ-[Ó[™‰ÙF=»Ëáé„D½JÒP€ù’7CD=ŒH’ÙˆzÍÓP…ÑõJCÔËEҶʤÕYÊ"ê%}âg 1É]çQoóâb‘¨gλ`mHlë.Z/s­%¹*ÝŽñügSÍ«P}—Ò¨gÒ[™‰ÙF=Ûó°“qÔãå·Nz 0/àš@ÔÃ(¤—gQOšW¿i¥ÂXˆz¥!êe!i[eÒjƒ\Í9ê%ýãg 1)]·gᄈ׬ Ϥ1nÛÒRxn]:×Ù$W ZÒŸ¬—Ž5Q/½•™˜aԳݳQoÏ£wÛfícXV€6ItkQ£d6¢^ôRa,D½Òõ²ä­2i»A®æõ’úƒ^ò3˜ŠþãÜ9 6·þõ³®‰¨È{ql[Zòñx0,lö8¿ÇæÅEÛB˜ûØ3]øÇ¯üŸß}j˜f™ø-A|Ĩ\Òø_´«øKq×aWcñM¤ „=¯ê ;רN´CZ[kˆz…$³ñ´õ¤yõ›&*Œ‹¨W¢Þü%m«LÚn±ùD½¤û Çü $&‘¢ê£Þ毟­¿ S¹ýË’ÏÆ·~'Üʨg7’V9¾ËO‹ mË–ñuãÜfŸÛÈ9 Û––lßxÇ®¹îš—¿ò§þ_ÿÓ+nÞ²uÝEëmx›öIHu³Yö‰oĦøq°›ð{í[p¾€ïƒÍ’ÄŸ)i³ìvíÖý†l$~B¢í¶„qûè«ø UVÂlIj%‰­}D= %ÉllD½ÆhŸÂˆz¥!êÍ_’· ¤ùy›CÔK¢úÍÏ@b)úÇûÑ ¨gâšVS”*·c_úŠñ H£žØ—é.ùžÄOôvC{8½y— [óþ‡ñ_†—ßzŒ7vÉË úvl²OdÉÊ;è÷]î…?JñÃXù…°q¿wžm0ÞÏÌIpš#qm^ˆzJ’ÙØˆzÍÐ8…ÉõJCÔ›³$o•I òÖvÔKŠzÏÏ@bÒ)úÇSQZÐb6÷ôOU;ga¡òïÜ¥Ûñ\%Ñ-åË— ìËÊ]ò[ñ¬æOŒ[X@öÐ6:š-pÚé§]øÇ¯Œÿ¦žßhx²žØv$b†'Ö…‘±¢^Z]z[!êÅ-àƒa$s’]€™“¦6wD= %ÉllíF=)_=¦q “!ꕆ¨7gIÞ*d¯½¨—´ÂÏ@bÒ)úÇ+XeA‹ù‹R=?ÙGIiÆ·c³b¶J\Ê*ÅËyüªÜ¥={÷ù–ýu©²Œ ú¦âÁ˜ßÖi§Ÿfÿ²õlÜæÆ#évÒ¬æ1ê z¨}|ÝEëÃHåf}°æÞeEâ 0C’ÒòAÔÃPRÍÆöâó÷^¿íܯ?r½Œ7CÊW_i™ÂĈz¥yüÐß¼uÁ>Ê8Úä­iÄA¼øì 7n;ÿÞoÜ*ã3–„”ÃÏ@b’*úgPiªä)Í–·éæ-[ãY¡Lm_sñ¬z•­Ê¶6h—ÂßÑ‹_cÏ’óÐfëžñßÿ7ÿí?9Õ–t6bã¶zXÒFd—Lº«>Ry‹~[ñ½ð[‘gÿ{Ðd#•›­| ²%˜ ‰h¹!ꡞ$³ÌIùê+ÍR˜QhOR¸ ¤0IâAiü $&©¢Î'ê9_E’ÓÛq´*¿­ø©mÎ;šìX,,`7šŠß!×ö'Ý%[ÆV·É>‰G*oÑo+~@<ê…uƒt·+7ëƒD=”IòYžˆz¨'Õ,s¿úJ³¦AÔZ’ä­iÊLÒwP ?‰IªèŸ³Çqþ–R—&ØŽ·UÙ­Ûmy “g z«ÙTšÏ±¤ÛIwµ²¾9¿­øñ}ŽŸèü™zé;uÈf;õ$ÇÓp–3¢êI5˜į^Ò&…)õ€–$…«4šr“Ä”ÉÏ@bR+ú§>ÆÙxúrÑʺT¿5­ê¼ ÖÊÛJØÎØ’{öî Þ.þ›}C³×è]Ì–IKW—‘=Þý¡ÏŸiíó4êùC”>Á0}è|³D=N’Yþˆz¨!É,s¿zIƒ¦GÔÚ®iÍAá’¬ƒ’ùHLjEÿÔǸÓÿé:ÉmMD=ŒÃ–¼Ý­W3)_¶€ Êûxì‰Þ ·r##¶˜‘wùð§ÔňìüÖåKzûhŸûîň„…ƒô¶:õ¤Ëã’RÖ!D=Ôj–9é_½¤A Ó#êKòV4è pIÓAáü $&Á¢N_Ž\R蟯ƒGy¿“gðù’éÓІ o|Q94»ÝÊ„/ÂYØgûľ /ÔM°;2hËq’Û¾k· )}¾¤ïÃMwÿûžñ¨ç°r³ñ+pmE‘Ç-<1$ê¡’ɺ…¨‡RÍr&ñ«—´Fa&ˆz@ã’ÂU :(\t?‰I°è“={÷yQò©²Ç}â¯×yöò/ícüÇì=¶csÇêzWmÜäÛ·)܄ߊzVóîf_Úxˆ‰ñºq׳Ï}Ü>:yží¡,îsXàœ…Û_Åöa{ò6¶ñã{°¼ð¯¾ëTûžÙú7WÅû—ÁðöÁ¾Yûh‹É­‡;kS¸_2¿§GV$У“@ÖED= "Õ,sÒ¿úGSf…¨4+)\Ò¦ƒb%)p~“fÑ'Û~òÛ¿Ênÿƒ6몛.ß°Á>V.¶àdn={÷ɺÂëU¼«¡gɺ>èlŸ}‡C¶ÀæÅE[À>Ê3ïÜé˱Ïn˶`‹¹‰˜í‰o*¼ü¶fß|ùšÝ“—šÁ I¦F!i¬»ˆzDªYΤõ’¦(Ì QhVR¸J£YÅJ:øHLš áQO‡Z¼û÷í{Æ_~[ )5ÀPÅºŽ¨‡A$œMîÈ‘¿¼dó)wíºLÆgGúWÿh‡Â õJóÐÃwÙ¿²}”q4")\¥Ñ¬ƒn:úÔá÷ßpÆm;6Èø’ˆÄü $&Ù=ðä_øÐçÏüÄÖse<6AÔÛ¹ÿVû†¹xó©ûŸxPfBz PCrX?õPIªÙTîÛwíñï°¥µ2>;’ÀzF#f‹¨WšÛw~Ôþ•í£Œ£Iä*–tÓ#ßÞaÇk·œ+ã£J  ü $&Ù=ðØ3Ù¿ì‡>¦Œ{öî[µü7òd¼Æv\¼ùøÔ»ûÁÏȬBH²jH ë ¢*I5›JÃQOXÿh„ÂlõJCÔkOR¸J£e5yÔKÚ PÉÏ@bR.ÐõQï`ô¾#¾é‡mðý7œaÛüÂŽËdV9¤Ú•¤‚õ Q•$œM…¨7-P˜9¢^iˆzíI"WQ4î Ë&ŒzI¸ñ3˜” ô@}Ô ïŒá½ÕFpø…gþퟭ± n¾ý|™U 7@JúW/õ’j6­&£ž$°žÑü„&õJCÔkI¹J£}]6IÔKª PÃÏ@b/ÐC_~;º'øÂ'¶žk[ûÈÿ¹}.sË!ù¿úЍ‡”„³iõ&¥ù M ꕆ¨×’$rEû:n¼¨—ô`(?‰I¼@Ì0êÝô•‹mS—æl›2«’o€˜d¯~#ê!%álZD½‰h{BCˆz¥!êµ!‰\EÑăî#ê%±…ŸÄ¤_ fõö OhQ¯4D½Æ%‘«(ZyÐ #E½$Ó£ó3˜$ ôÀ _~ I9€‘ÔU¢„„³h&êIë­NhQ¯4D½Æ%«(zРã^Òh€±øHLz€¨7+’r‰\¥!êAH;›¢Þ˜´:¡QD½Òõš•D®¢hèA_ ‰zI Æåg 1©è¢ž{ú¹>ýäóOzö©ƒÏùæÓ扟xâk‡FÙÿä“ß|úÉ¿}æ)ûÞ;ôì3O¿pì…Ië(¢bÎfƒ¨7MNhQ¯4D½f%«zÐ#£^’f€ÉøHL:&¶miéò bñÜ«6nŠg{ô¹J&ë¢bÎf£¨'!¬7´7¡D½Òõ”t®¢hîATG½¤Ëó3˜Llÿƒç]°vÕòtúêÕ7oÙÏݳwßÙkÖø\[,ž5seF½§_øá‘ÇŽ~çâ!oßûÆ÷ž:øýc?ú±ô²N ê!&íl6ˆz#ÓÞ„õJCÔkPÒ¹ÊqRëAïTD½$ÊÓð3˜”LéôÕ«W­Zµî¢õ2n¶ïÚm³Î^³FƧçO _Nõ8°cçþ[e°žyñ?=ùÝc’NÜá¯>tÿáƒ÷?~àþC߇-Lî¾Cö]g_þ&”oKó½Ÿxêð÷¿ßµ´GÔC álfˆz£ÑØ„võJCÔkJÒ¹ÊñRèAOiÔKŠ 0%?‰IÁ”üÉz•ålÖæÅEŸžÝÜé«W‡/'ˆz{½ÛV¹xó©2ž¹g~ôã'=›þ¥¼C_;|à¾CMá;ÀL¼ïÐã'—šï}ã{Ï<ùœ„³œõH8›™Ÿ¿÷úmç~ý‘ëe|RÒÂzCcÚAÔ+Íã‡þä­ öQÆ1­$u•#¤ôՋϾpã¶óïýÆ­Ç¿Lr 0=?‰I%Á”6/.®Z~ù­Œ›s*ǧg›•-/Þýû_þë“þ¨_o>õðûo8þ¾°ã2™•³§¿ÿâ÷¾ñ½8‘žºå9É1À ¼ïPüMkž|ä©®¼“Q´³lI ë-Mh Q˜¤s•#N?è¹$ijâg 1 %˜Þé˯Àݾkw:>è¯ém^\ô7иjã¦ýÊ\–ñÅöìÝçãþ@Ûx˜kÂZÆ– ãéóÿxÓ_ôÉÕöð¯¯ýg>n¨Ñwó˜ÒSß{.~‚Þ¬rž“ ÌÜÁûß½æ{>qôû?‚–!¢igy’Öš™Ð&¢0Iê*„FôXRa€ò3˜´LÏßCþ¬ž?ƒoÛÒRòͧ_ê _;ü$ÉM)n.@Óœüjܧ¾{L:ZVˆzpÒβ%9¬´1¡eD=`*Iç*‡vôUÒ_€™ó3˜FLÍ£[gξŒãšóv¶ùä—Äž½üÌ»0èË\µqSXÀØ—ñˆß\øÒíÙ»ÏûŒûö×]´þ˽Á¾.Þ|êŸoÿ‚Ø?C0ϧéùÛgBþ8üµÃÒãfBš дïÞw(~‡Ü§=+)-D=8igy’ÖÚ˜Ð2¢0•$u•CÓz)‰/@ü $&Ñ3qúò+XC˜ó×ÕÆÏyŒ“qn¡ú¦ê›oGm ¶¢m­rüœwþ¢|õ[ÿÑ6n#éróÔÁgCø8DÑC¿Ä]ï™§_š– ¢Œ´³lIë LhQ˜\ҹʡé½”” !~“n‚™XwÑúãáìÄß¶;ûä¿sç<¥Ùdsc^ñ|ùA϶•Q϶`ëÊŸö3Û––^}ÚO¿oãñým{>a#¾'vÓñb¹yúéBòh¨èé,@›ß¢ë=øÄÑç~(A-D=igy’ÖZ—0D=`rIê*„¦ôR’]€æøHLÒ f"~W^ckÂ2öIjÏò›ÛÚ'G½³O~Æ_pû_mûݽÊþéïþ}ñ[É9ê=ýÜÃ{ݾŸ¢‡~únô÷õ¾·÷ȱýXšÚÜõ`$ŸåIŠXh]Â\õ€ %©«ZÐ?Isåg 1©'˜•ÓO¼lÖ_{+sÍ(Á.,“¾t7f ¤Ûñ¨'Ï<üÂ3tÃíßýÝxÍ“?|ÁózGö?bÇw’7+q^æâÀý/u½§~_šÚÜõ ílöŽùËK6Ÿr×®Ëd|LRĺNÓæ…¨Wš‡¾Ëþ•í£ŒclIê*„ÖôO\Ž>}øý7œqÛŽ 2ÌŠŸÄ¤ž`Vü .Ö]´þì5kìs™ëN_þ¤¼A|™íÃþ¦^¼'øÂ‡>æ9ÿê¿KS¿ÝíÚ ¯xó[΃™G½§¿ô§ô¾{¿–¸Y‘¶ÌËÁèùz¹½—¨ig³wß¾k‡-­•ñqHëMK˜¢^inßùQûW¶2Žñ$©«ZÐ?Im1üí;n\»å\fÅÏ@bP0+›W-?ÉÎ>Æï*ó?{—&¿›·l ŸZ&Nr+=ó˜ýËþö~Þw ~–ßǾü«ë>ñš—ýÜOÅ/Î:êýèÇßûÆ÷›=¢^B»戨W¢Þ $©«Ú€Ð'Id‰õÐ4?‰ICÁ =à­*b›CûóOÎYX¿ 'ËyOÛ={÷Å \¸îBû—ýÐçÏ´YžmOl7üsÛ~¼®'B[×&[ààÑcñÜùzæÅÿô½ïq¨±÷Ç0’T€¹{éÉz<•·ÒlW¨W8ig˜:êIë:J˜/¢^iˆz3Ô®BhBo$…EõÐ4?‰IFÁ m[Zº|ÆQ2™/yÕÆMñ‹jÅæÅE[Æ>V¾i† ÚêÆ>ñ—ßzÔóY5ëÚîmÞuWæÎ×Sß{놑 7CS€Äï„ûÌ÷_LbÜÄ´Ó…¨W8Ég êE´(aîˆz¥!êM+I]…Ð „ÞHòJЍ‡¦ùHL2 z@¢^wùÖÓ5Þÿ¸”¸’˜dâñûW¢ÞÓŸMÚÜè4ÌMƒ¨W8Ég˜.êIë:-J˜;¢^iˆzÓJjW 4¡7’¶R‰¨‡¦ùHL2 z Qï™ýø‰¯½ýNRâf(Î(@>Þ¿òd½#{ŸLR]=q³BÔ+™ä³¦õNМ„õJCÔ›JR» ¡%ý„•AˆzhšŸÄ¤¤ BÔ;ðìa™Õ!O?ù¼üö¥òsô…¡o—¡® D½’I>k QïÍIÈQ¯4D½©$µ«Z‚ÐIU©AÔCÓü $&%=àQï_߸Ú>ÞýàgdnWyì¨çŒCD=”*¼]ÆS‡¿ŸT<§Ý­QD½’I>kÊQO¢X§iKB&ˆz¥!êM.©]…ЄH’J=¢šæg 1))ÈÊcO=½mii\·ÜvË»/û¯ýß÷Ïþãf™;ÔÏ=/»1áµ·ß½_KܬH@rsðÄ“õžüæÓslyQ¯X’ÏDÔ[¦- ™ ꕆ¨7¹¤v•@cz é)CõÐ4?‰IIAVþçßøUM¿û±WÙ?îù¿\ùzœé.¹Tv£}ϼøŸ¼e)q3$ÈMxÜïí=2Ç–õŠ%ù¬AD=©HÈ Q¯4D½ %µ«ƒÐILQMó3˜Ädå”×¾vÕªU¯û…ðóÿÃ1–·¾ûþ¿ÿÕËdp¨W¿ö§íæÞùîóe7Ú÷ôs?l:êI=2¢ž‘¾6D½bI>kФQOºX§iHB>ˆz¥!êM( ^%Є®KJʈˆzhšŸÄ$¦ +õ>rÛko¸÷õ-¸àƒ¯Ê%êý‡ŒæÞ%Cê §õ޽øcIlí#êK ZƒŠzZ‘¢^iˆz“HjW ´¡ë’Œ2:¢šæg 1‰)ÈJ±Qï©'ŸóñøýD=é&@¶BÔ;úÜ$±µ¨W&ÉgÍ"ê!gD½Òõ&‘¯hB§% e,D=4ÍÏ@bS•b£Þ“‡žõqˆ¨‡²¾ÿDÔ;úIlí#ê•IòY³^|þÞë·ûõG®—ñZÒźKrCÔ+Íã‡þä­ öQÆ1PR»J I–”q½øÜ 7n;ÿÞ‡n•q`Vü $&1Y)7ê}÷˜‡Œƒ÷?.=n&¤›Ù:|â™zÏ<ù¼$¶öõÊ$-C’Æ:Jû2DÔ†H‚WïiB§%õÈŸÄ$¦ +åF½ÇŒzM€œõ0_’Ï2$i¬»´!CD= N¼J UÝ•¤ O~“˜‚¬õˆz(Qó%-C’Æ:JãòDÔê$Á«÷´ ¡»’ndËÏ@bS¢ÞÌ£ž sD=Ì—´ Ië(GÈQ( ^%Ð0„ŽJ¢ 3?‰ILAVˆzD=ލ‡ù’‚–Ic¥åÙ"ê%Á«÷4 ¡£’bdÎÏ@bS¢Þl£žä D=Ì‘´ Ië(-GÈQ(i^ý¦a•ä ~“˜‚¬õˆz(Qs$-CRǺH³rFÔª%Í«÷´ ¡‹’Vt‚ŸÄ$¦ +D½F=i%@'õ0GRÐr#u¬£4!*Ý·ïS~ #ê'IšW¿iB%¡è ?‰ILAVˆzD=ލ‡y‘‚Ö’#Gþò’ͧܵë2¯"u¬‹$$a^4Þ BÔ+ÍCßeÿÊöQÆq’¤yõžæ!tNRIfèèÓ‡ßÃ·íØ ãÀ¬øHLb ²BÔ#ê¡pD=Ì‹´–Ü·ïÚãßaKke¼Š².’´„6i°Q¯4·ïü¨ý+ÛGÇI’æÕoš‡Ð9I"™­Gþv‡7®Ýr®Œ³âg 1‰)È QoVQOBI±öÜyÿ¶›îpö¹ÌE†ˆz˜)h-9êIë"iLhFºqõJCÔ.i^½§…Ý’ô‘™#ê¡i~“˜‚¬õˆz¿òËo;í”ÓÆb«ÈFöÜyÿo.ü–ϵbŸü˳ÞpÖ>ý¥°ä—^éãƒØÆ?¾aSX~¶ŠÝJºWQó"­%D=4CóÜdˆz¥!ê —4¯~ÓB„nIâHˆzhšŸÄ$¦ +D½™D=©$ÝrÖÎZNpÇÜÅ¿w©û•_~›Ú'a0,iŸÄ[øø†M¶®ÿæÂo}áÓ_ò§éÙò>h“}/osì÷¼ë½aûž}Ün‹תákÙGÇ(ˆz˜ )hí)&êIrBC´ÊM‰¨W¢ÞIóê7-Dè–¤Œ4„¨‡¦ùHLb ²BÔ#êyª;í”ÓâWË^ü{—Ú MqÛ·ó›žÏâ¨gkùà{ÞõÞ0èB¼‹7âBLËÝo.ü–ϲuíen%¿û(ãQs!­=£E= d]$í ³¥1nVˆz¥!ê ‘d¯~ÓH„I²HsˆzhšŸÄ$¦ +D½é£ž$’Îñ¾&I®2ê…ñ8êyƒÔ|îXQÏx¤³) …•lûNÆ1 ¢æB"Z{ʈzR 0Cšáf‹¨W¢^¤yõ›F"tK’EšCÔCÓü $&1Y!êõ¼¯mß²#ôxg“”2^^õêŸ%÷…OɾâÒ+e¼>ê½ç]ïõ¹ñ ¡!D=´O Z«FˆzȺH:fB\ˆz¥!êÕI²W¿i$B‡$M¤QD=4ÍÏ@bS¢QïŠK¯LŸã6(êù¬8ÒÕG½Aê£ÞÇ7lò¹ãn ê¡}ÑZU@Ô“…éizkQ¯4D½’æÕo‰Ð!IiQMó3˜Äd…¨7eÔ“>Ò5QOxÔ³é†k>#³jÔG=ô¹C£ží^>Ðí¹ó~›õžw½×nÔØ'¶pü†¼…#ê¡}ÑZEÔÃ84º5¨W¢Þ@Iöê1D褆´€¨‡¦ùHLb ²BÔ#êUºx䨿¯Ee¡«Tõ­Ûb2K¼ç]ï U±ra_ÀøÛøÚ2aùÑ÷¶ßˆzhŸD´V ‹zÈ:Gš&¦¹­D½Òõª%Ù«ß´¡+’Ò¢šæg 1‰)È Qoš¨'q¤OFzáÝom²O>¾a“,P©>ê…P8èÉw±°iÔó¿Ígsã[±Ï}y¢ž#ê¡eÑÚFÔôµµ†¨W¢^µ${õ˜v"tEÒAZCÔCÓü $&1Y!êõ*õÌÇ7l ]Ϧ³ÞpÖЗâÖD½Ýì£ÌÄ—O£ž¿'y ]¿wD=GÔCË$¢µ­×QOÊ& •­eD½Òõ*$Ù«ß4¡’Ò&¢šæg 1‰)È Qoâ¨'e¤gÆŠzfû–¡Óùô+¿ü6yGÝØ ¨ú }ýôUF=»õå[Xõ› ¿;Š^@ÔCË$¢µ­6êI#ëéS‹öµ¹ ꕆ¨W!É^=¦©–õÐ4?‰ILAVˆzD½JãF=÷ñ ›â´wÚ)§ zýlXÌ> ¼ÍÙTS•Q/ŒÛGÞ£Qm’ˆ6ýz’¨0kóBÔ+ QO%Ù«ß´!IþhQMó3˜Äd…¨GÔ«4YÔsW\zeÈs6Uná¬Qï=ïzïo.ü–}éoda뎕óÜ ¨çSÏ'»•=wÞ/ ÀõÐ&‰hsðâó÷^¿íܯ?r½Œ/“LÖ-R©0"ÍjóEÔ+Íã‡þä­ öQÆË•d¯ÓZ„ü%íc.^|î…·ïC·Ê80+~“˜‚¬õ&‹z’Eúgš¨göíüfÈv§rZZÓÂÜ™¼ vPÔ3á=7l²Å~å—߯³öQm’ˆ–idÝ"¡ #Ò¦6wD=-É^=¦µùKÂÐW~“˜‚¬õˆz•¦Œz.”»ô­*Z‹zæ ŸþÒ¯üòÛüæ|ªü+{Å"ê¡MÒѲ"™¬[¤Ua(­i™ ê¡hIùê1 FÈ_>€¾ò3˜Äd…¨7AÔ“&ÒK3‰zß°É7’æ¶6£žû§¿?k¯~á¢õЉh¹‘LÖ!’«0”¦´|õP®${õ˜Ö"ä/©@ùHLb ²BÔ#êUšIÔÛvÓ¾‘¢žû§¿ä Ûôñ ›dn™ˆzhD´¬H&ë)V¨§-+D=”+)_=¦Á™K’Ðo~“˜‚¬õˆz•FŒzÛnºã´SNK_]ëBÔû•_~›ÌšWÔ3áùƒÓôÊ>!ê¡5ÒѲ"™¬C¤X¡†´ õP®¤|õ•#d.é@ïùHLb ²BÔ7êIé«Ñ£ž-sÚ)§É¸ ùìŠK¯”Y!êÍäm+*£žÝ¨¤ï¥R#QÏõÐéhY‘RÖ!Ò­0ˆæ³<õP¨¤|õ˜6#ä,‰@ ü $&1Y!êõ*½ç]ï]_CÞS¢>y¹«L~!êͤ¬yÔ“ò.™îHiï+Q툖Éd"Ý ƒh;ËQ…JÊW_i3BÎ’ÒÂÏ@bS¢ÞXQOjH_m[~Qírø:^Êj^!¢žM¿¹ð[_øô—lÄ||æPôÒÕm$lßÛsçý²ÀX®¸ôJß”M7\ó™0îQÏ&Û±ÐïlÇü¦ëceQˆzh‡t´¬H)ëIW¨¤á,gD=”()_=¦ÙÙJ2P?‰ILAVˆzD=ñ› ¿uÚ)§‰A lßÎo¾ç]ï=ë gùbÇÚòÖJƒÝ—^éscéësGô+¿ü6ÙTØÕ®ùL¼caà ocD=´C:ÚÜ9ò——l>å®]—EƒRÊ:Dê„&³üõJóÐÃwÙ¿²}”ñ²$嫯4![IãÈÊѧ¿ÿ†3nÛ±AÆYñ3˜Äd…¨7zÔ“±çÎûýizfÊ'ßÍV¶;– ¢ZòÙüÝ·ïÚãßaKkOŒH&ë XÚË:¨WšÛw~Ôþ•í£Œ$)_}¥Ù9KGVùÛvܸv˹2ÌŠŸÄ$¦ +D=¢ GÔC ^jjsGÔ+ƒÆ²® ꕆ¨'å«Ç4![IàÈ QMó3˜Äd…¨GÔCáˆzhÁKMmîúõ¤a!¦¥¬Cˆz¥)=ê%嫯4![IÝÈQMó3˜Äd…¨7bÔ“ôQ-x©©ÍÝÉQOJY‡HÆB ™¬[ˆz¥!êBËò”¤<õÐ4?‰ILAVˆzD=ލ‡¦ÔÔæ®QO2mdCÔ+MÑQ/)_}¥åyJºF¶ˆzhšŸÄ$¦ +D½Q¢žD OˆzhÚIMmîˆzý¥¬‹ˆz¥!ê•@ã2”DœõÐ4?‰ILAVˆzD=ލ‡¦ÔÔæ.ŠzRʺBJŒ¦±î"ꕦܨ—”¯¾Òx„<%Q#gD=4ÍÏ@bS¢Q…#ê¡išÕ拨×;ÚÅ:¨W¢^ïi›®ùŒÈ÷ÅÜ ¸xVØÛ¾ï‰Ýñx÷böX zLâ‡Ýò˜Ä|ìÖmyûh«Øìs¿9Y8D=Ìœ¤´L¬”²ûöýÉñï°¥µa$WÒ¹Š¢©«D½Òܾó£ö¯le¼?’þÕ?’‰¤SôÆ#»ÃŽ×n9WÆYñ3˜Äd…¨G=‰-û§¿äüΧm7ÝfíÛùÍß\ø­Ó–ŸpgÓÅËåË>†Ÿlõ°Š¹ášÏÈñ”&Ï6nŸ„›;ë gmß²#^ì=ïzoج͵‘oØßVîs¼®M>ßq›k#oÄgÙäËñÖl1IûÒÓ¡ÛsçýÞ×MñÃnüÖm#öI¸;éc„°el÷ì~ÅûcŸËò9 êa椦eb%–õ²§«(D½Òõz@[rDŠ>!ê¡i~“˜‚¬õò‰z.4,©K&<¿ìâß»Ô;ë gÙˆ-f_ú¸Mñóõöíü¦Í5!3ù—AXÒxê²Í†[Ýíct{î¼?lÓ‹Þ{ÞõÞØâåÓ}öOÂ`XÒ×µa$¨\ÞÝpÍgÂ,ßþ—^iwÍn7…¶Ãa¿ï¶¤Ïò/ƒ°˜ñeF|LŒï§m3~6_XÅg…ñ|õ0sRÓ2±ˈzyÓÈU¢^izõ’þÕ?Ú’ƒ¤Pô QMó3˜Äd…¨—[Ô»øD¡“ÀdlÄgvÊiò¤¼+–ßËÕ¦ÊØdËšåÞsâ]#öüâÓ8ÉÅãÆ·iMØÕ/|úK6ßP¼Ïñ¸ßÍx³^¾l±0„Ç$Ýeû.t½8̹š›sã>&a<}Ío¼“2+D=Ì–¤´|¬Ä²ŽD=I]…ÐÂU ¢^iˆz]§9 9H EÏõÐ4?‰ILAVˆz!êI阗°ê£žÌ25ÙÈg¥ÍË…äôžå¿…'­ëã6Éߘ³Œ_šï³Ô1›LõŒïIº}ã‘Ñçʬú¨7ÁcR¿A_eÐÜù"êa¶$¥eâ¥^FÔË•æ­2õJCÔë4mIÈA’'ú‡¨‡¦ùHLb ²BÔëbÔKŸwfj²‘ÏJÜ Ïò“<çm¶ææbaŸå©…©)£Þ {çsm’dz¾Áû˜l߲×t7ëon¾ˆz˜-©i™x©—u!êIí*„æ­2õJÓ稗$°þÑœ„¹KÚD/õÐ4?‰ILAVˆz]Œz•m«&y„”½ÂkT?¾üú„oÖ&û<^«~›­å«Wîs¬fÿ§‰zaÿ%ÏÕÜœ÷1 pÐݬ¿¹ù"êa¶¤¦eâ¥dFÔË’¶­bõJCÔë.ÍI˜»$LôQMó3˜Äd…¨çQO2Ç…€‚Q`#>«²Õd£³—-VCöÇFj¶Ôïs¬fÿÃcR¹‘ú= yNÖ­¹93îcR¿‡¦þææ‹¨‡’”–‰“’YöQOjW 4l•Œ¨WšÞF½$õ%Ì]&úЍ‡¦ùHLb ²BÔ#êMÖ›ê·Ì=ê Z·þ^û˜Ôï¡wƒm"êa†¤¦eâ¤jFÔËŒV­ÂõJCÔë(ÍI˜»¤JôQMó3˜Äd…¨wðþÇ¥qÌWÈC-G=›Ò[¬Q¿Í`îQ/~!m<^ssfÜǤ~MýÍÍQ3$5-'U3¢^N4i¨Wš~F½$õ%ÌW’$ú¨‡¦ùHLb ²BÔ#ê…ìÕ˨盵Iî]ÍÍ™q“°‡¶¢Ìrõ77_ó‰z?©ö终z&)-’Ì2zÒ¼zO“ˆz¥!êu‘%ÌWÒ#z¨‡¦ùHLb ²BÔ#ê…[|Ï»Þ+³jÔo37êÙ´}Ë™ö°r#õ{âsÓ‡¥æá2ã>&ánÚà ÝÈA³Q/Évõˆz&5-R͈zùОCÔ+M£^’ÀúG£æ+é½GÔCÓü $&1Y!ê•õ¥=wÞØ·ó›2×ø;ÀÊ ¯2è7èu²¶K~[6ÕD=û(ãfû–¾âo.ü–Ì QÞ×Mð˜„L7Þ·r'çnÆQ/étc!êušÔ´LH5Ë9êIóê7YpD½Òõ:G‹æ+‰% ê¡i~“˜‚¬õ²zW\z¥Ì ¬ò5ž!Bɸ +Žbñ翹ð[¾€-¹çÎûøñýIŸ°Vss±ú}Ž…òeû:Úö-;ìËÐûj¢žMiMóûe È2áqŽwÌö!'Ò¿úG£êõJóÐÃwÙ¿²}”ñ.I*XÏh]Â\$Ñ¡dGŸ>üþθmÇfÅÏ@bÒS¢Q…#êaJÔr áì$÷íû“ãßaKke|¤õ’F+Ô#ê•æöµeû(ã]’T°>Ñ´„¹HŠCáùÛvܸv˹2ÌŠŸÄ¤§ +F½cD= BÔÔ$¨å@ÚÙIˆz-Òb…¡ˆz¥é|ÔK*XÏh]Bû’Ü¢šæg 1I*È Q¨‡Âõ0 ©i9p¦ˆzmÑ\…QõJCÔË™Ö%ÌE’@ÔCÓü $&IY!êõP8¢¦!A-ÎT6QOXÿh®Â(ˆz¥!êåLëÚ—´¢šæg 1I*ÈJiQÏ‹Qˆz˜†µH;SD½Vh«Âˆˆz¥évÔK*XŸh]Bû’ÐGÔCÓü $&UY!êõP8¢¦!A-ÒÎQ¯yª0:¢^iˆzÙÒÀ„ö%¡ލ‡¦ùHLª ²RlÔ{êà³2}í°4 (/E½g~ ‰­}D½n‘š– gòˆzRÁzFC*ü]µûöõÊÒᨗT°>Ѻ„ö%•QMó3˜Td¥¨¨Šžyú{ÏyÈxœ¨‡²½õžý¡$¶öõºE‚Z¤U ê5,©W0I¼„¨W¢^ž40¡eIb@Œ¨‡¦ùHL ²RlÔ{æéIbVá’f7QoŽ.x÷kÞ´¦†-àK.^¿Û—a#•lxã½ï¢ß:à³E½Ñwf>’ 6ºWoÜðÁ Kw,Éx>40¡eI_€ ê¡i~“°‚¬”õâ¢w<ê}ÿE¢`BÔ“¾6D½n‘ 6wÒΪõš”T­%n,D½ùºàÝØyêêÓWoøà†˜Øøš7­ Kn¼z£ØtÑû. ƒ©-_ÜâëÚb»vìZºc)Ü„}i üÿÙûÿ(¹ÊûÎ÷õÜÜœä:9q&?&ž!qp“œ›øÎÊ5žÄÖ%sã̱㉙Ö!ðÜŒ òÏÉÄ&ÈFqÆ6ÄÍÉÈ,#-(žFŽ –8ÈÂÇЀ#ÙŽ‰±Z’ ôB⇰¬Ø9+ÿÌýV}»Ÿ~úó­ªÞµ÷~~ì½?µ^«WÕ³Ÿ½kww¡ÞõfWÕˆ3õŠïL&„'{.û/ߌçEfúF= M@|ÐV(+z'OÿkÐ8ˆºãéù¨÷Ü{úZŒz A-ÐÎcÔ Æä­N1y®F½´¦ožÖŽã{Ý+ƒ~G;ôC×´Í 3uÕ”ÌYóé5þàä»'eP·6"êß™L{wï•=ì}ãfÑäù“oì•JÏ&ŠÌIJõ(4=ñA[¡¬t6ê‰g÷<«9ãiS:ˆ:âð|Ô;¶ïyèkI0ê5µ@;,uÔƒÖ&ru‡ sU0ꥵcÛŽML¾{Rø#E¢ÞšO¯µ„_ëFD½±v&*Â,ÝùœOÇÅdÊ ĨG¡éˆÚ e¥#Qrž:ö4gy„'ëQG}¤÷Ÿ€8~ôeèkI0ê5µä  Ũ†I]­gz\-õÒÑѬ"Qo êQ/1¬+>x…ì|ã¢6&ŠÌ”ˆQBÓ#äÊJ—£Þ ÏÏ}î3ŒzÔUúŸ€Èá£o£^ƒ@SKÚÙPI£„°Ö0Á«ÝL‰«£^Zq¢ž¾Yž~ÒEŨ·÷ÑÞ«\éùì˜|÷¤ŽÀ }›nߤgùéRÙ‡ÞVxd n‚,•íû‹æ¶yþä÷O}ÿÐã‡d‚ÛŽŸÆzï$øÆÞG¾ê±æÓkô5¹J®û«Ùà¼BÉöåkïãD?äOÐq¡¯ê•=×ùZ×Çn`c¢˜LV aõ(4=ñA^¡¬t9êùo«÷ô#;ˆZï{C½½Ç ®¥Â¨×Ôrùl¨Ó§vݼeùcn†ñ( …µ†É^me\íõÒØÑ–½uYïŒ3oD•‹zzšžlSo=²ÿ†/MÊW7Á)¸3ºA¹øýnÓí›dD&»Ù—ôc¢®®5ÐÝtäîôgë¯~²HV™xcïS>du™ß[¥ßïzßQ¿‹|î¤lsòüÞûÊW¹®´»õ6ÛŸßû¹y5M; lD§Mß2-7…Œ»9‡?äöYóŸ|Õ­ÉW(€%`c¢˜LS N¿òêú-?ü­/Á8Q]ôÄy…²Ò…¨-Ï÷ü·ç^{˜Qºçè|Ô>þôK×RaÔk j9€|–'haí`ÊW+™ú£^Z®£É¥kªŽ¨7Óÿè[YkàÖ¬â;£ã½¬6?"sü›:ëÊþø#:A‹žreÐìݽWF&Þ81yþäÉçNj “Ó²ÖÛÔ| [¸»ùGܬåF=~H¶anú–þ‹”ß8áF„nVå'éuƒïk,˜™(ˆ(-=ñAa¡¬t<êæ%zQ»¹Ï½'_: q-F½¦€ –´³êù9LÌm¿lÔÓ;YÇýØ7p³:Ȩ×T¦&QrzâƒÂBYi}ÔƒŠg?Ì“õ¨süÓôNœø.”µ„õ‚Z Ÿå rX ˜Ö&&·ÅÁ¨—ÖÀøuÉ{/ñ_”ê`ð*LϪ³ Œµ3BÜÌï5¯Å‹²×âqG'èêÖÜûñktÔsgðé{+.ž)4ÕùQOV„µ°Û‹G`³vÚ¸03Q4&%QôÄ‘…²Â¨wòôß=÷ßžÓºq„]ºá™ù¢÷üw^€¬–£^#@PKÚYž ‡µ€©`­aB[LŒzi ìhÃÈ4™ÜKQfÑh{í½3ݒ뎵3JwÉÿÄ µ½;KNèé÷¯QO.î3mÖ7ŨG LJ ¢èˆ" e…QOæe âi“?ˆZæ°ÿnz§Î@VK‹Q¯ ©%ù,OPÄZÀ´°v0•-2F½´Ft´“Ïž\xk¹¾aQï’÷^b³(ÇÚ!÷«w-kõ²—·H?Icঔý¨ 4ß¿FD=|`}S➬§4ÊW72p³:X:êaf¢hLG ¢Lèˆ" e¥ÝQâÝPg¾ïNÖìzÔb‡Y(zÏ?qšZrŒzM-9Èg‚Ö¦…µ€ékI0ê¥5¢£M¾{š×°0'ã.êí}t¯­obغ¾±vfͧ×èÈ¡ïÒÏÜ3ã–ŽØ”Zr‚K`£ÞÜ+MÔÚdPõ¾÷Å#~¼óÇ{/7žaÔkˆ(zâƒÎBYaÔS'^ú®ûÄŒgø"\j)ÿ­ôžÛóì‹ßý;hjÉ1ê54µä  eŠX ˜"Öt&®¥Â¨—Öˆ¶%ƒ½l´xD&÷â”7¨y«Wú7e™æ>aVMß<-s`kVñ‘;•·'›nߤ+ú÷+óýS²'®9œpè;‡z­M®Ï'0=«Î½ÌVé)u~k›;7Ðä?¡wÔkŽó#Ó·ô~ 0ùÐã‡dµßõ>ä× ö~ Þ`AXš(ˆ(zâƒÎBYiqÔƒl·¤ž{ÅõŽ£ìzÔFÏ<2÷vϳ'_: A-Œzùƒ –ä³¥;vï•7uïŽÂxHPĚαF3Y--F½´®øà½º´¸£iØškIóƒÎä2}óôŽm;ÔÌ=3Æô¦|u}MœèU­W¾ÿ­ý÷ÊoY¾êR_Á‘û•9½¤åMs÷ëFÜË꺫rEVtQÏŸ KeŽÜ…L›~Ó¨çj’ëÝ—7M“œÎ”MÉÄ­¢ã½ý÷æë»9'Ÿ;©#²q7GÈ{_úƒ‚Á‚°4Q¦ ÐXN¾ðÌGn9çîmS0NT=ñAj¡¬0êùüOÂ=ò»µŠûp ñ±W ¦e‚Q/ÐÔ’ƒ|¶´]³Ÿí=ÂfVÀx0PÄZÀt±æ2M-9F½„.éG®\ª›¾y7sÓí›&ß=©ƒËúgí q)mëöOÊoY¾êM§àÎø{"×íº½Ô5¿M,âr‘+þn(Ù[ÝI ×e¤·È«`šäzÓÞØ› W\ŒóMß2­“ý “çOÊMÕû¼ù½†ØwïÝ»7¡÷}ͯ+Û1X–&ŠÃä×'¶É¿7nZãDuÑ#¤Ê £8ö\øàëp©ž~Ä;GïÑgŽ~ RZ>õòM-9(hKcÔ«Æt±æ2A-Œzmuè;‡vôÏæƒñaQ/œ½îµ»áÓ]•¯s#‹C˜æ3½>÷-ž–œöîîïžcÅaò‹QBÓ#¤ÊJ[£¤ºâNžùþ±Ç]þx†Ÿ›A wÈ{=ñüS/BGË £^þ ©¥ù¬F½ Lk(“ÒòÁ¨×5ñ£Þ؇0?ê5–&ŠÃ´*QBÓ#ÔÊ £Þg¾ÿü“/úä° %Dpø‘£þ#ù…g3}խè—9hjÉA>+$nÔƒ(Öt¦Ž5‘éhYaÔëF½T06Q&P9Œzšø ¶PVõ†9þÌË~ yæÑg=‚Å„([‡Ÿ ÷ÜžgOœø.´ 1êešZrPÐ aÔ+ËÔ±&2-7Œz]“{Ô[Âvèò2êQ9&P9Œzšø ¶PVZõ Ï•vâ¥ï>·çY¿ŒðÕ¸”¿C‹?C›}þä«g Ÿå‰Q/sÐÔ’ƒ‚V£^Y&5Ž)hbÔëšE=÷Ù¾r™<rïî½þÒfÁØD˜j@¥1êQhzâƒàBYaÔíäé¿ó?×9òè3‡LL!JHGÍõ¹=Ïö^rûw?€v–-F½ÌASK òYQ£D±F3¬YL;Ë£^×dõ‡°“ÏÔOÆPr&4ö& Í$ª‚QBÓ#Ê £^'_=sì‰KÔÑGž9üÈQqhבCÅs¸çè‘Gz'Âògϳ/yùÅæä<Ũ—3hjÉAA+ŠQ¯“ÉÄ„³œ1êuMƒ¢^k`o¢L2 *õ(4=ñAp¡¬´/êA«Ñ‰—NK{DùxnϳÏ?õâ‹ßû>ô²F`ÔË4µä  +êAk4“ÉÄT³Ì1êu £^|Ø›(4Ó ¨"F= M@|Ð\(+Œzc;óýž?õü“/ÂÛí¥õÜÞcÇŸ~éä‹ ø4ŒõrM--(hc`Ô“Éd b’Yþõº&ߨgZX;`o¢ÐL, êõ(4=ñAs¡¬0êUqâ¥ÓǼ,žòÅç¿ý‚€ÎBBï\¼ï¼ Ž~éøÑ—_xö•“§šñ9KbÔËdµ´  QoL¦”5…éeÀ¨×5Œz‘ar¢ÐL, êõ(4=ñAs¡¬´,êAt£Ú½Öß·‡ÉUT£^¶ ©%m Q¢t±æ2¥¬)L,k F½®É4ê™ÖØ›(4S ¨Œzšø »PVõ¨8ÓàêeºXs™VE1êe šZrÑÆÀ¨7ËÁ”²aÔëF½˜09Qh¦P-õ(4=ñAv¡¬0êQq&ÃÕÈt±æ2¡ŠŠcÔË4µ´  ‡Q¯0ËÁd²faÔëF½h°7Qh&P]õ(4=ñAv¡¬´)êA¢z™ W/“ÆÊT* £^¶ «¥m<§OíºyËòÇÜ ãõ4Ö\¦—åÏ4²ÆaÔ뚣Gö¿õw~á_¼åÍËÞºL]òÞKü “ïžt‹äº¿(“ÃÚ“eÕèô+¯®ßrñÃßúŒÕE@|P^(+ŒzTÉp52i¬¡L¢¢q1êå šZrÑri¬¡L/ËŸ dMĨ×M—¼÷9>– =qòÙ“ËÞºLMœ=±cÛX„Éa-€É‰B3€¨¸‡¶?4»{)&=ñAyÉÙν³ìxÛQŠ0®^¦Ž5‘éST£^ž ©¥-CPÇÊ$³Ì™:ÖPŒzÝtè;‡&ΞCäM·o‚Ebêª)Y$_a¼ºÉwObF49¬09QP&P&?qxíuk§®žRrý¡í¹¥þ¢Íwlvã`æ+3nš¬K•?GL¯Ÿ.éd÷V\¼bâËÞºL®Èˆ¿‘^<ö¢¿¹/)Ü»¿È‘ŸƒÜ»›³$ø•Ü‘ÿóT²o0MÀOÞçÿr?óûÜfýÁ¿ wïo;ÿµ¿ùëô8ä·/üq¹ù±©)ß–™™{gýsøä‹0gíšµ0dˆ-Ë +wxÉŠß\¶ì쉉ߛœ„l«ÖD=ˆPT/“ájdêX™8Eå0êå ²ZZPÐri¬¡L2ËœIcÍŨ×Yz:ÞÀr'‹&Ξ€ÁZÈfeã‹MkLN”É”‰•—¯œxãÄäù“Zmôß¹¸º4ó•7(3ÝŠÀÍ‘+6ÉÖd\V_qñ ¹½ÓÑT²)™#üÚåÖ•mêfíM¹ø«È7(ã#î}zý´Ôí覄¬;"xù´?öï¼÷spt³r×þd¹©3Þ£?Sø¿7YÉ|Ô™ÃöAèLùê6ë¾k¹h0µdƒnί½íGÿãu?«Ç!¿ùë^öëøo.[¦ÎžèÍ”+_Ü´YsÌ;Ò9²ÈŸcoêü-332Ø_ca³JgÊ)>65÷3t[Óiâ/Y±ïÐa7Ó‘íë„.t=F=Z’Ép52u¬‰L™¢ÒõòY--ˆh¹:ÖP¦šåÌt±FcÔë¬+>x…"Ë“1ò¤Ä¾,·º™{fðMk¬N”)”ƒ•—¯”ÿÞáÄ:ùÏ_ý"æò“\æ-œ[¼xE%#&̹A72Ðäù“²Í™¯Ìøƒ°5Ý=Ùm7¾¹YäÞõ¾üí¼xìEÝÌÁý(ü»›^?­ƒÐõd³0xø‰Ãzþn(ù5ɸݓÍwl†ù÷Ahžƒ-èÝÉeØ÷¨÷«ôÄùí \ÆÏžïqê/™KŠ[ffä¦F=¿ÄÉuùØü©y2A+››píšÞ=ÂfÅ7õ¾SSB¦ù[ûÖ}EÏÚ“³Ûi¥vD=ˆPT/SâjdYã˜,EU0êå ²ZZÑru¬‰L5Ë™‰bMǨ×Y{Ý+‡ÈòtƧoî=Eœ¹gÆ…,š|÷¤~’Æ%ï½D¶„ Ê"™ dòšO¯Ñq}‚'÷è–öÒ¡×Âdfo•óç¶ßÛo©Û¬®µw÷ÂÉufZ˜œ((“ (6ñˆ™¯ô’‡ßƒ¦®ž’iZžÏ%ƒúŸ9¬¨d]·/ÝÕÍ Oã”##þnب§M÷D¿©Òóõü»áÎSƒô9‚·Ÿƒž=÷¨?1?ê Ýa¹Àä¦ Â”lv{à>û]뺺'òsó)Y$ÿàËZB@œ÷g?%kÙú¦¡í÷&'åºF½›¦§ÝRˆzâ/YáoDW±›².Ä8»5åºÞÀóõt5;¶£f2\L kÓ¤¨"F½ ASK Zn Ž5‘©f93E¬õºl¢ÿ¶zÓ7Oûƒ“ïž´¥O\òÞKd\ ÝÌ=3r]@û“MÉ Ì<ôCB®Èöåi›,šºjJÏ ” r]õ¶Öa‡?$ÓäyÝô-ÓrS6«Ïe ÜešLÖ9ré} ‡7--¬NŽi”‰‘bÖ·óePçÈXwØùeÊV'ŸV6›'ÏŸôáÀ'sô¤ÂK•ý6ÎÔÄna ?‡©N·,÷ëF”nÆeEø“<üÄaýfû `PöAè¯I~hþ"¡»­‘T¶©G ΰ¨÷'Wôú¯ŽïÜ;û›Ë–ùeÍf¸-33ZÕˆ¨'Û—Í‹zBËÝ^²Æ…&?ÙOoF=Í”¸™FÖ,&HQuŒz‚¬–D´Ü@ k"βerX;0êu™62ùêNœ=ÑKiÞˆ˜êt†=µéöM2"OØÜÈLÿÕµ“ïžt#B¶ææìضcÑ*^“AYÔûÔŽù‘CÒ§Žþùzº—ç‡'Ÿ;)#²cr“Q¯£7ʇ{‘æÌâ·ZZ»ê¿/ž¯ïËöâ±õ_ÛŒdpåå+ýÁ‚t]Û¼À°§\U„ÏͰ†mGwcØö­?¹)ƒ0>ìÔ-À¹ºYä3p’}É_™+ôLw×zâ ‹zë¿ÕÝÀ*'Fd85"êY#¶æ·E {(ëÂxË´ êA„¢™ W#ÓÈšÅÔ(ª£^† «¥-+PǚȄ³l™ÖŒz]¦nÂ;/OOµ;ôCnDÉ ?Í ÊêîE¸“ïî½iœ÷'KÝ„aQon7Þ8áFÔdÿ]¨zÍq~ÄE½CrƒYÁêDá,”Jò_ëèú㢞28uN6¢#²æ/ÕÁ%»á@º{›£L†qå^?+Fw½aÛÑÕmzfàÏÁìæê7[v; 'ß¹²æÊOÚŸ²û ÷bÏy²ºMýÇ^+‹dÄݵ8âžž7,™•‹z²M÷¹·¾[Ó÷Γ‹lÕ ›‹Q†1®F¦‘5‹IQTF½ AVK"ZIÇŽÝ{åMgÝ»ã£0^²&2í,O&„µ £^×|kÿ½ò[–¯zœ<zÝÑèfÇuÝÞYrÞM·)kQÔóB˜žØ÷ݸ<Ùs# [ð¦eÃ…ãÕ íä Ï|ä–sîÞV´=‰‡úŸ¡ÿ 8™Nk—L¶çséé~ÚÝtS~HÒƒÅÙ 4,Æ9Ôä"˜ÀÔÀíÈ·¦+Ê÷î0p·5™Ù*ƒõdŽ)ô‡)÷Gä&¬®`ô<Ê?"ÔmêOÉŸ#?+]äîZ@œQïðÉeDÆý÷Ñó•ˆz2"7®2bkº¹0êA} „Q¯AL‰«‘Éd b:ÕˆQ/7ÕÒ‚ˆVÒ®ÙÏöa3+`¼2dcÚYžLkF½®Ùºý“ò[–¯zSO¯›ºjJ®úΡ‰³'àT;¡qM.²ÔÒuçΡôf|ΰ¨7÷äS¶ã йm6'êau¢p¼p@xb›ü»qã¦å0>ÚìîYý¯[ÿCXˆ´vi!‚ó¹Vô_ž©×eu7Mi ‚ÁâìãÀæ;6ëÖt¦ýÔa·#ߦ®å¾ß"`·?qX;ÝC‘q÷3—ßŰ¢'ÜS¶ïÈÍ¿2]3þˆdP–êuéò¥,Ò=Ñ»–EzâØ¨·efF+ÛÀw²S£ž\ü¿cÃVaÔ¡éQ:ÕÅd¸™LÖ &BQ½õrY--ˆh%…‰zÈšÈä³ ™Ö>Œz]Qoͧ×Ȳ<¿Ò뫜F=3 £žÀðDxÕ€â(õÔôúiýo\ÿã…¥~ÔÓó¹&ç?QAþÛwç¾Éu7M¹åg78P‘¨§d¦nS.6œévä"sùNÇ}í°Þ…¿10½éÏÜÍÑ냣ЦL+J_ =p˺5ùeéLmšD2(‹ôº&EÝ ž¢¨/–-è]눣QO.~}ûÍeˆ£§ F=Ù”\Q×®é}§ŒzãbÔ£L‰«‹Éd b ÕŽQ/7ÕÒ‚ŽV£Þ &ŸeÈô¯VbÔëˆzzvžÆ8yš¡üð7ÌÞG÷ʹzùí⦧çØñé[æÞ(Êäõ0¹/™©MèŽéÏÖÍqdSºÔ”-¸Õ}öG'߬K±>Ù‚Û¦{­±\—q?Rw×zâ¸3õ4½ÁçÒS<êùƒ²£Þ¸õÈ2%®F¦”5…ÉO£^n «%­Œ{²›²h¬¨§\>óKlg ‚»-æþa÷ªœŽ ¬o²A»ÏÃŒµþ6uEù}Éy0è »k=q†}PÆhå¢Þ0#¶vÓtïÁ=›OîÅ}ví±gþõWÿDxÿë§~ö+_þß]#sÏï™q#ÙF= OÈ| Èj‰zBÿ£öKD=w>Wï¿}¯Öé„$ñ)# Ü U"ƹÚèo<‡¨§?[¹¸ æÈe\6ãµþ6å7¥÷⺻Ö?NæQoćð2ê…À¨—?SâjdJYS˜öD0êe²ZZÐÑÊcÔ3LAË)_-ƨ×56ê¹WÎ^ñÁ+Ü Øtû&sÉ{/™¹gfǶ2yâì ?êé+yeÎä»'ý9þ'oèóLùºåîÛ¦Öýk}ȉ+þó[â§~HÆO>wR3™&ÂÞö½væ^ë¦eÛ2(²q£ÞÌWfüœäè¿þ§ÄBÔò¸þ+áFÜ „$÷Ê}PÉ <%͸AktŒ“oÄÿ^ݸ¾gœÊ!ê‰a?1WÖ`\¬¸xü$‡í¼bZÈù#úqÆrñÏÁtwíþ¨øQï/Yñ{““þȰ­þ^F½õògJ\]L)k ž(F½¬@VK :ZyŒz‹™‚–“½ÚQ¯klÔòüãì‰Cß9ä‚M·oê=Cëg;ù*×eæìضcô™ðÿüýŽÿú`ë=Þ¾ú'Çž=øýSýéèŸÁ!kõ6òÆþçêzálú–Þ3F7gïî½þÒ„0n“ù²Ö°Ü&ô³nífuü/YáêÖü¨·efF6>ú.õB`ÔËœ)qu1±¬Lr¢Ðõ²e-!èh•0êyLDËŠ ^]À¨×5£^h½œ÷ÀG¯\÷ ú[¿åâ§ŸÞ i¬¹°=Q^ øÆzk¯[;ÑJòuYÿÜ[í;пÜ4YºùŽÍþ"gv÷¬±aÓ¦úgúw¤“efút¤7 ÅP/²çþùeJuÿݽëžÀfa;~è,næ+3þ·&?:˜àøÂkgº·ü“­é"÷[ÐAÇ ºoÇߦpÛÔ™Â}×tJ~›î^~ím?úGWý´þøí ü'æ‡tü÷&'·ÌÌ@—±vîÕèôò'W¬„ âÚ5kµÓÉå7—-sÜ ëw‡O¾è¶&KÝ4½>ðU·Ž~††Lƒñ–aÔ#Ç”¸º˜XÖ¦7QŒzù€¬–t´Jõ<¦£eů.`ÔëšÈQ¯Ý9O`{¢L  ÈÊ}PÆCۚ鿹ž+öÕ¸³»geŽÖ}^<ö¢›3bš»#1bš£ÉiÅâÈüûÃbœ,š^?íî– ·K *øsPþLKÝ]7ânã¾qØËß+|ØÎ¿ë÷g?õ¯ûYýKñGWý´Ü|`ÇCêðÉ¡ËX2ÇÍW0AìÜ; s€G°HÈêné›ê| 'ýµOC£Ô(ª…‰qu1½,&6QŒzù€¬–D´ªjzÐÈšÅD´¬˜ÚÕŒz]-êaλ»m9Oa~¢L  ÈÊE½œÍÌ¿êÆryË‚™­¤)|cšâ7ûïÄ7úl¾`Ô#eJ\]L/k›(F½|@YK:ZUŒzóLGˇI]ÝÁ¨×5¢Þ+/¼ ÛÿÈ-çè#jÝ]=ýÔîÞ"SÄšÛ…`žüS|í‹zbYÿ•¤3ÞŸ.‚‡úŸ1ð’Uy Gÿ^ø Ç4¾C‡õUº0Þ>Œz¤LŒ«‹éeù3¥‰¢aÔË”µ„ £UŨ×g:Z>Lçj»Ã>F½® õ çÝð¥Éo›[jŠX `~¢Ì“Н•Qoó›_³ømàÒòOÍ0³•ô¯†rL#è;ñµþ4=ÑĨ5Šª3%®.¦—åÏd&ЉQ/ÕÒ‚ŽVU}Q2Y³˜”– ^-³¨ß Ĩ×5¢Þ¨œ§Lk:lO‚yæOI´2ê‰éõÓý¶XyùÊ=Aèß™œ]»fíǦ¦ôÃ4ºPô£ ãjazYþLc¢Èõ2Y-!èh58}j×Í[–?vàfd²1)-XÁÚËÝŒz]sôÈþ¾4)_a¼´¥sž2Q¬é0?QíÌÓ~Jåô+¯®ßrñÃßúŒ·ƒ~È£^ZúÄE&gõŠ|Jo¶þÛ‘‡vÚVÜ›Ï;ëu?÷½ìû¹ßôúÞõG?ɨ—ãêb’YæL`¢øõ2e-!èhYRÖ &¥e[X£a­+ˆQJûîK§îèsÿ«7é#ghΦˆ5æ' Á<í'¢Š<±­.GŸÙwN¿ò*LVì\wÏׯßÜóEYEÿŽøN~ÿ‡^~fóß^[ÐWYçß¾g÷Ü´õâë7/鯻/’ý‡=QÛ÷}ÉýŸ°%}ìóo¶ûö|&ðá›~áÛÇ÷ÃÔߘ‚ÉE|àúŸý‘ý¿¼&â¥JÔƒ EÕ™W “Ì2gê%Á¨— (k AGËd²1)-Å #ݸõ¨Èy×Þööoí¿æ,b¢XÓa~¢Ú™L@‘=ñÔCPd†yþ¹'a]gXÜVwN¾ð̽{=Ä ê6=øÑ7-æ‹_ý€ì?쉒Laý–‹‡mçáowäŸ\ù9ÀÔöGƈ;5ÖõîÞ6^$:thŒˆ“ßÿÁmÛ> ƒ£í{vßqœéû>3#¨+¢ˆzìý¢Ü ÌæSw¾kØvvÚErIWÿÕo½çòÿiÙoýËh~çï¸wû×aÏ‹ƒ E™WSÍ2gê%Á¨—ÈjiAJË”²15-˜ÆÛ\iŒz4›óÝs)b-€ªÕžxò¡o+âùgŸ„uÓ/¿ “}»g¿ µ¥Ûù<´çС=ë·\ ñe˜M~Vwö~û>˜<Âô=—Õwê"÷8,É· “GwnŸù0ÌM~/°5îþÔ¥®hUËvFD½oîùâ•ë ÅxLV1âñüÄS­»ë"˜/ä÷ÿ‘Šv®“U`?ÅÉ1ÏÔ{`ïýˆã{æÕþKGã;…Ý „ IQE&ÆÕÂ$³Ì™´D©0êå²ZBÐѲ¥¬ALPË6²Á*W£^s~üðÌ=3Ñ|uëWnýòŸþ§[~E'×løÍ¯|óSfj÷ôÓ»¡¦9Çž=xï7¯ßúõO±m×_ÁêÎÑ£ûa²Z¿åâ6MyF*«@®R{Œw–ôŸ¿°LΣ]{ÛÛO¿ü*쉒L¡wŽ?[PãFùyÂÔ¿šàL1ì$²q÷gØv¦ï¹ fŽ6l;ãF¢Z|æŽw:yöDxb<&G(w’°íÈÏ JP-عÎ?O +Œ &0âLFràÁ) Ê•AŠ*21®.¦šåÌt%JˆQ/PÖ‚Ž–Èd bjZ0“5ö¸Z0ê5ÔáÇϽÇL¬Ëÿ÷Ïÿ±>BÄåóW"8öìA¿Á9ýÕ?™£Õ¸ÈUjܸS‹Þ™;CbÜXQïÆMˇÅÁݳ_ö³Ëh½—+ÙÎÇ·ˆ;ë·\ µ¥»÷}Âsêä (/#Œxï0“G`Ü!þQÐeˆJƒ&E™W SÍrf¢¥Å¨—(k AJË”²1A-9,e€%®FŒz 5sÏÌk^óš{í?úå7ÿho¿èÇÿô†Þ#D|týÿôéÛþÕ _š\š9Ùm,[¿þIhpΰ3ìê½FØlA ;ãOVñÏTÃNCS0¹ŠÑwÔræÙ>µžþqñA—!* šUab\-L5Ë™)J”£^ ¬%)-Pʚµä0–å\íõJ£Þ/¿ùGoyøqÈ}ýØOü£µ_ø#÷ÎMëï¾øé§vÃŽ!Ñš ÕË<Õ'¢.Ð?+>è2D¥A–¢*L«… g93E‰’cÔK²ZBÐÑò¥¬ALSK“Yΰ¾¨×PI¢žÜ£Üï‰çnzà£~Ú{üàؽ&Š5(ªyªOD] P|ÐeˆÊ&EU˜W SÍrfrå€Q/9(k AJ«Í±c÷^yÓY÷îø(Œ¥¬)LPK«Y¶°»Ũ×P £žî¤½¾4yàñmn÷æ˜(ÖtX ¨^æy>eâä Ï|ä–sîÞ6ãDuÑ?%>H3ÔÏïÕ«7œ{ýæå0d)ªÂô¸Z˜p–-Ó’(ŒzÉAYKRZmvÍ~¶÷›Yã…A,k ÓÔÒÂp–-Œn¡1ê5Tò¨§–H{&Š5(ª—y’Où8ðÄ6ùüÆMËaœ¨.úGÄi†ZàÉOÊoöê çÂxP¥¨4ãjaÂY¶LH¢|0ê%e-èhuªõ ”5…ijÉa;Ëæ¶8õ*“¨§N<tëöO~ä–sô!4—öLk:ŒPT/ó$ŸòÁ¨G¡éŸ¤jøQ²Uaz\-L;Ë“©H”F½´ ¬%)­NŒzéa>Ë †¶˜õ*«¨§^yá…EioÓäˆÏœm"ŒPT#ó Ÿ²Â¨G¡éÔjF½æ21®¦eËT$Ê £^ZPÖ‚”V§îE=ÓÔÒ‚–¬l‘1ê5T†QOAÚ»ö¶··#ía„¢z™gø”F= Mÿdø ÎP 0ê5—éqµ0í,O&!QnõÒ‚²–¤´:UˆzËšÂdµ´0¢e[|Œz •mÔS¯œxaë×[•ö0BQÌÓ{Ê £…¦,|Pg¨"G=ÈRT…éqÕ™v–'Ó(CŒziAYKRZÍ:õLSK #Z>0®¥Â¨×P™G= a¯œxáÞo^ÿñ¿z“>´š›ö0BQ½ÌÓ{Ê £…¦&|h¨õÊô¸Z˜|–!(OŒziA\KRZÍõ’ÁŽ–,k 1ê5T#¢žúî˧îès~Úûæî/úò‡ŠjdžÛS†õ(4ýáƒ@C-À¨×P¦ÇUgòYžL<¢<1ê%e-!Hi5+õ –5…)k aJË6µäõ*ë¨g¢˜€´÷‰[ÏmJÚÃE52Oì)OŒzšþiðA ¡ˆõ KQi¦ÇUgÚYžL9¢l1ê%e-!¨i5ëRÔ3Y-!¬i9À –F½†j\ÔSML{Ø¡¨Fæ‰=å‰QBÓ? >h4ÔŒzMd’\u&ŸeÈd#Ê£^BPÖR”V?F½°¦åkZ&õ*ߨg¢˜Õ¬´‡ŠêbžÕS¶õ(4ýsàƒFC-À¨×8¦ÇUgòY†L3¢Ì1ê%q-Hiõ+õ –5‚)k aPKSZ>õªÑQÏùæî/~âÖsõ÷—_xÛ‰ãGaBrØ¡¨FæY=e‹QBÓ?>h4ÔÑ¢”)*Í$¹êLAËiF”9F½T ¬%5­~Œz±aPK #ZnõªQO¹´÷ôÓ»aQrØ¡¨.æ)=åŒQBÓ#djF½f1=®:“Ï2d‚%÷òRþwF½D ¬%5­~݈z¦¬¥‚M--,hbÔk¨L£ž‰b†ŠjdžÒSÎõ(4=ñA¦¡`Ôk“äª3-7&'QdPë bÔKÊZ*Ò‚?êA/k×RÁ¬–æ³<1ê5£^Ø¡¨.æùˆ5DE@Ÿ¢L’«ÈD´¬˜&E¥Ah‹‰Q/ ˆk©@MË$³ü™¾Ƶ$°”5£^CåõLk4LQT 󞆰ÜÏ-{ë²ÃO†¥¾ÛÑWÔj>sFD=Y½wg#ƒšF:¹Œîz.êékiáì?Ù%=Ïîöˆ×ÞRkèˆb Ñ’ NQ &ÉUg:ZVL™¢qA_K‚Q/>(k©@MË$³Ì™¾–öµø0“5 £^C1ê‚)ŠjažÀÓcœO#—\dæÀ§ng`¿«õ„nA.reØð¹¨'×eß„‹’²Š»iw[W”q7Bí£G >è5DK‚>E%˜$W‘‰hY1}ŠÆe-!F½ø ®¥5-PÍ2gúZ|Ø×âÃFÖ8Œz ŨÖ(ª…yO#تeÍ|eÆu4™?ð9ÝÎôúiÙ”+º |€¬¨õÄÊËWê=ÊeòüI{¡õôEÄn·e¾;qÏ~ûŒz] G >è5DK‚>Eã2I®:ÓÑòaM-9F½ø ®¥5- cÇî½ò¦³îÝñQ7 ™eÎôµ$0±E†¬‰õ*£¨gºX£a¢ê̳wÍV­a\§“‹Muºùªd¦Ìx]‘¨÷Gû…»· =+P~â°Ö:¹È=·àG=}±Ü¯\—µd²|/:M®»iŠQ¯ ôĽ†Zàùï½zõ†s¯ß¼Æk}ŠJ0I®"ÓѲbB5-ŒzñA\K‚Z@»f?Û{„ͬ€qªYæL_‹[dXÇŠQ¯¡õBÀEµ0ÏÞi4[µFs ª\ñí‰zÿîÏ~êÆMËaé@úZZY2œõ„ΙÝ=+ãþL»ÛŒz] G >H6ÔOžxR~³Wo8Æk}ŠÆe’\u¦£åô*Zt´¬0êÅq- ¨ia1ê‰-2LcÍŨ×PŒz!`¢êÌSwZ’­ZKÒ®§'¾9Å·3"êéküâ/þ3ùëP0ê ¹S½wÿÄ@ˆz+/_)7õE»úÊî¶žÖ'ãö%½ÔzâƒdC-À¨—3“ä*2-&WÑhPÐ2ĨĵT ¦…U,êA2ËœIlñae‹ »X£1ê5T.QÏt±æÂEµ0OÝiIÅcœã²—?X|;#¢ž~²í¿zÇyòסxÔv›õfwÏÊM¹@­³»­¯Ï•A÷]j=ñA²¡õ OѸL’«Î¤´|˜hEÃ@;Ë£^d×R £^ý°²Å„Q¬éõŠQ¯vX£¨:ó¼Šã&ÏŸ´‹!“eYѽ߰¨7»{V7²á‹kä¯ÃÀ¨';ã>ã§Ûô3D=¡s`õ»­3íû ¸Ô,zâƒjC-À¨—-“ä*2-¦[Ñ@PÍ2ǨĵT ¨…Õº¨g[|Ú¢Á"ÖŒz ŨW/¬QT ó¼Šãd©mXúRVh^£Þ‹Ç^ÔqÙø'¶É_‡QOSÿ2[%÷.üSðlÔ[{ÝZ™çß ÜíÍwl–AYãzŸì§?HM¤G >¨6ÔŒzÙ2U®"“Ò2aÒ É,Œz‘A\KjZp¢T³Ì™Ä†¶h0‡µ£^CeõLk.¬QTyÒNEè iåâ¿ÍœO›—ßïd~AÓ &—%_²úâ±u›îÚþÐTÿÃ+„–¾%£žÌô»ž¾Ç*-úzÿôIDAT| ZGïψWÚê6ý;’ÉšõZ@@|Pm¨E=èS4.“ä*2)-¦^€XÖŒz1A\K‚ZpŒzuÂÐ ¶°Ö`Ôk(F½za¢êÌ“vZ’Kijà«JW\¼ÂŸ£dÐ/zÓë§a©[fwÏ.{ë2²’Á•—¯tÛõf¾2c· #PåüÝÖPhm¾c³›3pšlsàÞ  Ô zâƒpC-À¨—'Så*2)-&`‘2Y³0êÅq-jÁµ+ê™Ê¶¶80„µ £^C¥z¦‹5Ö(ªÎhdèĵT ¨ǨWlmÑ`kF½†bÔ«)ªÈ<]§¦+õˆJÓ#„jQËT¹ŠLMË„ÉX¤ Ž5£^L×’€šÃRQªYÎLe‹ [[XÁZ†Q¯¡õê‚AŠª3Oשéõ(4=ñA»¡`ÔËIr™”– S²HAk.F½˜ ¯%A-F½z`k‹Xû0ê5Tâ¨gÒXsa¢ŠÌsujF= M@|Ðn¨õrcª\E¦¦åÀ”,ÅšŽQ/ˆk©@P‹Q¯˜Û"ÀþÕJŒz ŨWlRT‘y®N-À¨G¡éˆÚ µ£^VL’«ÈÔ´L˜žEPÄZ€Q/ˆk©@P‹adÔƒj–3SÙbÂÜƯ¶bÔk(F½Z`¢ŠÌujF=ªÁwGÑ#´jÚ£T*‹©r™š–Ó³:ZXk0êEq- j‘0êÕ‹[hX¾ZŒQ¯¡RF=“Æš ›UÏá©-õhi¦ÓE@|o¨õ²bª\¦¦åÀ$­ŽƒÖ&ŒzÑ@_K‚Z$§OíºyËòÇÜ ã}βe*[LXÜ"ÀòÕbŒz ŨW)ªžáS‹œ~åÕõ[.~ø[_‚qê(“äªÓ#äj‡éû>pç7¦`°4¨TTœ©r™ –Sµ: Xû0êE}- j9€v–-ÚbÂâf¯vcÔk(F½ê°IQE𴟈ÚÁ¸ôÄù†@¥¢±˜*W…©i90a«³ µ£^×R –„³l™Ê·Ð°yµ£^C1êU‡MŠª€ @DÍeŠ[z⃂C RQq¦ÊUd‚ZLÛê&ˆ_mŨĵ$ ¨åÚY¶Lh‹‹[h¼º€Q¯¡õ*Â&EA ¢1‰->=ñAÁ!ª¨8Såª05-¦mud¯vcÔ‹úZÔrí,[¦µEƒÑ-4 ^]À¨×PŒza“¢* QþLVKK@|Ppˆ|P©¨8Så*2A-9“·:šWë1êÅ}- jÉA8Ë– mÑ`q kWG0ê5£^ؤ¨ (Ô%Óë§§®ž3_™=H¹05-z⃈CäƒPEÅ™*W… j90…«k xu£^Ð×’€¦–´³l™Ö F· 0uu£^C1êUYŠª€d@a¬¸xŲ·.sfwÏ[4½~Ú- míuk'Þ8!ÿ2L]=å庌À ¥d Z†ôÄ‡È¡ŠŠ3a® Ô’3…«k vu£^×’€ –hgy2¡-ŒnAaçêF½†bÔ«³•í€BZqñŠ~+{Íæ;6[´öºµ°(´Éó'å~¡ß-{ë2;H±™p–3=ñAÄ!òA¨¢‚L•«ÂµäLáêè\¨ôµ$ ¨%í,[¦µEƒÝ-(ì\¨×PŒz¥a–¢* "PHÓë§å¿Á‰7NÀ¸xhûCÃ…¦çå1êeÄô²FÐ#D"BgÂ\¦©%g:Ww@äêF½ ¯%M-ªcÇî½ò¦³îÝñQoÚY¶Lk‹£[P¹º†Q¯¡õJÃ,E¥AJ ÀF”»ÐQïä Ï|ä–sîÞ6 Ò1êåÂd²fÑ#tjç¿÷êÕν~ór„**ÈT¹*LPKÎt®î€ÂÕAŒz@_KÂÕ´vÍ~¶÷›Yá B;Ë“imÑ`w  W1ê5£^9˜¥¨ h X¨wà‰mò×áÆMËa\0ê%fêXCéˆ:µÀ“'ž”ßìÕÎ…ñqA«¢‚L˜«Â4µäLêêÈ[ÝĨôµø\JKƒQo<ØÝÂÁ¼ÕMŒz ŨWf)* Ê…W.êÍ|eÆÿ$ øÉó'u\ߌO&ëˆ|õ?»Öz2S'ÈWÙ²¾_Á¨wø‰Ã+/_)K¼ ìÌæ;6»ñ§Q‰bM§G >è8ÔµD=UT©r™¦––I]m«³õBƒ¾–„Kii˜¨í,[&·Åé-Ì[ÝĨ×PŒzå`™¢Ò 1PxãF½Íwl^öÖe28½~Z&¬ÿ¤Z¿ë~â°Ì‘Á©«§4·ÉW&_e©NÓ¨÷—ë×mPgwϺè(õddÝÉó'eE­{2Çv°32YoÊ7§ëL k =ñAÊ¡`ÔKÈT¹*LSKˤ®Ž€°ÕeŒz¡A_Kb¡¯%Ñ̨gZ[ØÝÂÁ¶ÕYŒz ŨWf)* BEáÊ\?CC‹˜Âv4w#bªÿúYYwÅÅ+Ü T9zÿü7~^á³weE¦‚Օ̸‡~dÔ‘q·3“çOÂZe*XËèˆRµ£^B&ÌUa²ZZ¦vuT­ŽcÔ úZ }- F½1`z ÃV—1ê5£^ X¦¨4È ÅCý¨'—eó/_õÉ8įÙݳ²Š?¢[Éþ ëh#<±í÷/½ Qðå·ºÁ•—¯t#nÐ?YOGXñ˜øÕVz⃔C-P=êA¨¢‚L•«Â4µ´Líj=èY$õBƒ¾ßB\KeqÔƒv–'ÓÚâÀô†­.cÔk(F½qa–¢Ò :P,šä¯‹|§iGóœô£ÞÛέ?â \ÝF=³üà^Ü´¿Ž2Ù«ÝôÄ5‡Z€Q/æª0Y--Ó¼Ú b)F½  ¯%±¨¯%Á¨W¦·@°ju£^C1ê Ë•éb)õfwÏÎ|efªÿFuvšv4?À¹A?ê½þì¶ÓÄÀÕmÔ“;•ù:›6pkc‚Wèˆjµ£^¦ÊUašZZ¦yµ”,rõ‚‚¾–Ä¢¾–£^!˜ÞÁ¤EŒz Ũ7ÌRTÔЍDÔÓÇ+.^1•AÔ“ýt# ÜZW˜ÎÕ)z⃚C-À¨—„ sU˜¬––É^-‹|ŒzAA_KbQ_K¢iQÏä¶8°¾‚I‹õŠQo,X¦¨4ÈѸQOßíÎ)ëÀi;šúQïÿüGügàêŒzã1…«ƒôÄ5‡Z bÔƒVE™0Wšiji™ìÕbа0ê}-‰E}- /êA>Ë“Ém`z { F½†bÔ –)*Jsã¦åßÜóE+êÍîžµ“«D=}O={ï“çOÚÕmÔÓ‘%ß,oàδ™i[¥G >:ÔŒzñ™0W…Éj ™ìÕb°ÈbÔ úZ|Ø×’hTÔ3¹-¬o!`Ì"Ũ×PŒzÅa™¢Ò GP0Ÿ¸õ\ù×X¾úio¬¨7p²ž»70êAnÓA?êýÑU?-#r™ùÊŒ›&÷"[“AÈp6êM¯Ÿ–™üâ±Ý X{ÝZYänÜ™v2U«ãôÄA‡Z€Q/>æJ3Y--S¾Ú ê Ĩôµ$°¯%Á¨·¬o`Ì"Ũ×PŒzÅa™¢r IPHõÔµ·½}÷¾/Ë {G<èbbíukuÑá'»AÍm²ÖCÛ+.^!d¶ ¥Ïõ;¥÷åG=Ù“þ?¯÷2½~Z68uõÔäù“:S6âÖÏËÓAù*{+«ËFduÙš\wsîLÛ˜žEÂ=à:ÔU¢´**„¹*LVKÈ”¯¶‚tEÃ0ê…}- ìkIÌG½÷™‚–!SÜ"Àú–,rõŠQ¯8ŒST„ Ézê-¿ýógýÂë5É-{ë²ÙݳnòÔÕS:®6ß±Yǧ×OËMùÏV.²ŠŽë·—ùÄäù“º¢Ô¨wã¦åšádƒòUCž»w·ºÎQût˺Kºò¢[Ñm­ULÉ"Ç´+h:ÔŒz‘™0WšÉji™øÕJЭhF½p ¯%}-‰æD=“Û"Àúf,ò1ê5£^AX¦¨h˜zʵWÜCÛò `9.êÉõÃOöÏ­³§ .IV÷·Ð ¦aðç šµ£^L&ÌUa²ZB&~µD+Q/èkña\Kåô©]7oYþØ[LDË)n`€ 3ùõŠQ¯ ŒST lXÔS×Þöö½ß¾V êô+¯®ßrñÃßúŒÓÒL½¢àA. éP;Lß÷;¿1ƒE@±¢%™0W…)k©˜øÕJP¬hIŒzá@b‹ãZjPÐ2dŠ[hXßBÀ†E€Q¯¡õŠÀ2Eå@¤ ðFG=uã¦åžØ+RFL·¢àá- éP—A®¢"L˜+Í”µ„LÿjÈUT£^ Ð×’€¦–ä³ ™â¸ÚaÀ"‹Q¯¡õŠÀ8Eå@ª ðŠD=Å´—#S¬hIðÀu¨Ë WÑ’L˜«Â”µTLÿjhUT£^ Ð×’€¬–´ ™â¸0`‘Ũ×PŒzE`œ¢ VPÅ£žbÚË…iUT<¤dê2(V´$æJ3e-!“ÀZBǨôµø ©%-7¦¸E€®vX¯h F½†bÔ[Æ)*šE1nÔS7nZþÄSûЬ˜PEÅÁƒY@֡΂\EK2a® SÖR1 ¬e RÑXõÄ4µ´  eÈ·Ð0ÀÕÓ è×PŒzKÂ8E%@³ X®\÷ úr ë·\|èÐØ …e ÆÊu+Z’ s¥™²–©`m‰ŠÆÅ¨$¶ø «¥-C&º…† ®v˜®hF½†bÔ ã•å‚bÑ«`Ú‹ÄÄ)*ÀÊu+Z’is¥™²–Š©`m}ŠJ`Ô úZÕÒ‚‚–SÜBÃW;ìV4£^C1ê†qŠJ€xAé¿ÆÕ1í…eÊ•]e‡: ŠfÂ\i¦¬%dBXk@œ¢rõB€¾4µä ¢åÆD·Ð°ÁÕ»À¨×Pñ£Þùÿá'õ’ÜGn9ç†M“£Ý¸iy›üè=_¿6¹Zwàñmõ{bl§_y«•ùŠÖo¹øè3ûá.¨Ó¤¨"xÐ (;ÔMP¬hI¦Í•fÊZ*&„µ”)*Q/HlñASKëécÇî»ò¦³îÝñ±Å)-&º…† ®^­h4F½†Šõþ?ÿö'þ×Oý¬>Hˆröñ¿zä×TîÞ6¶ øŽjñů~àùçž||öñÿùÇǵêÊ•ÿïóê=—ü6Œ±þ¦õXÄÍÔ(ª<\…_v¨žÿÞ«Wo8÷úÍËa|(V4š sU˜¸–„ a­YŠª`Ô [|ÕÒzz×ìg{°™÷-Ni™0Å-4lpõÂbEKbÔk(z?öÚôËoþÑ8ä¾2yùí+'^ÀsÊyà¡uÐb’ØôàG¡%¥Råã(ŽßùƒŸ“ÿ#_>»æ³˜Æʤ(ª E゜A)è¿ÆÕ]{ÛÛwïû²¿eF½ñ˜öDÀCW@ß¡`Ô Ê´¹ÒL\K´°v€Eµ`Ô«$¶ø «¥ÕkgŒzs°ÁÕ [Ĩ×5íŽzا¨ˆ”‚þk\…ÍyŠQ¯(S((x è;ÔŒzá˜0Wš‰k©˜Ö¢¨.ŒzµƒÄdµ´zí,רg¢[h˜áj„¡ŠŠcÔëš¡Qϲ&Â>Eã‚®A‰è¿Æå ËyŠQ¯“œ(4x è;ÔcE=ˆV4šis¥™¸–„Éa-ŠjĨW;HlñAVKh.Ÿ1êõ`†«†**ŽQ¯kõhH”ˆþk<®Ñ9O1ê-ÁÄ&ŠÌµ£^8¦Í•câZ*¦ˆ5D(ª£^½ ¯ÅY-­¹|ƨ׃®FX©h,Œz]Ó⨇}ŠÆuƒÒÑ‹»qÓò½ß¾62£Þ(¦4Q4ðx¨õ1m®4×’0E¬ BQ½õê‰->ÈjiÍå³,£ž‰nAa†«V* £^× Žz&5&*JGÿ5.âÆMË<± VQo(“™(&x` H<ÔÅ£D+Í´¹ÒL_K±¦ƒEµcÔ«$¶ø «¥5WÐõL†«&*£^×´5êaŸ¢qAà ¤ô_ãÑÆÍyŠQo˜(>xx ¨<ÔŒz!˜0Wš‰kI˜"ÖtŸ(F½zAb‹²ZB QÏ”¸a¢¢q1êu £ ™ƒ’Ò‡)—ó£2u‰’€¹€ÊC-À¨‚is¥™¾–„‰bí‰aÔ«$¶ø ¬%´PÐò‹z&º…®Fا¨F½®õL k"LT4È”šþkl­ßrq霧õ˜®D ÁC]@å¡`Ô Á´¹rL\KÂD±FƒðDá0êÕúZ|ÕÒZˆhŒza`œ¢rõº¦•Q b¥¦ÿûÖo¹øÐ¡=0­F½9&*QZð€Py¨ F=ˆV4‚is¥™¾–„ébÍÕ‰‚bÔ«$¶ø «%´(¢u:êa‰«Æ)*‡Q¯kõAì  è¿Æª®œ§õzLQ¢äüǼ‚ÐC-À¨W;ÓæJ3}->ÓÅ ªŨW#HlñAYKhQD;}ê‘›·,ìÀ-0žˆénAa‰« –)*Q¯kŽÙ×&åë܈ dƒ‰ŠÆ½ƒ2 ÿ×›óT×£žiI” }Ìû ôP;Lß÷;¿1ƒº`Ú\9¦¯%aºXsAr¢Ðõj‰->(k AGËŠéná`‰«–)*Q¯ëL#kLT4H”‡9Ou:ê™DùÐ#„êˆV4‚is¥™¾Ÿébͽ‰"`Ô«$¶È «¥-+&½…ƒ%®.˜¥¨ F½®3¬q°RÑX zPÛu7ꙊDYÑ#´êèV4‚is嘾Ÿébͱ‰â`Ô« $¶ø «%-+¦»…1®.˜¥¨ F½N3¬q0QÑX zPt1ê™~DÒ#´êèV4Œis¥™ÄŸIc ¥‰¢aÔ« $¶ø ¬%-+¦»…ƒ%®.ؤ¨"F½N3¬q°RÑX }Pt.ê™xDyÒ#´êHW4Œis嘾ŸIcÍ¥‰¢aÔ« $¶ø ¬%-+&½…ƒ1®.ؤ¨"F½N3¬q°RQqÐ>¨ºõL9¢léˆZut+Áä¹rLb‹Ï¤±†‚ÌD11êÕ[|PÖ‚Ž–ÓÝÂÁW RT£^w™@Ö8X©h,?¨ºõL3¢Ìéˆrut+Æ´¹ÒLb‹Ì¤±†‚ÆD‘1êÕ[dÕ‚Ž–“ÞÂÁW RT£^w™FÖ8X©h,A¨:õL0¢üéˆru¤+Æ´¹rLb‹ÏÔ±&‚ÀDñ1êÕ*[dPÖ‚Ž–“ÞÁW¬QT F½î2¬q°RQqA¨3ÚõL-¢FÐ#äêHW4ŒÉså˜Ä™©c ‰âcÔ«$¶ø ¬%­çرû®¼é¬{w| Æã2é-ŒquÁEµ`Ôëšoí¿W~Ëß:p/²ÆÁJEcBÑò¨gR5…ø ÷P <ÿ½W¯Þpîõ›—ø‚nEØ6WŽIlñ™:ÖDP—( F½Z@b‹ÊZ*ÐÑæìšýlï6ó>ˤ·p0ÆÕSÕ…Q¯k¶nÿ¤ü–·~ý“ÐÈ+„º¤µQÏD"ÊÇß÷ï—¤G >(>ÔOžxR~³Wo8Ƥ+Æä¹rLb‹ÌÔ±&‚´D©0êÕ[dPÖ‚Ž6§[Qc\]0EQ]õº†Q°†P—´3ꙊD‘A¡+A@|P|¨õª3m®4SÙ"3¬q +QBŒzµ€Ê”µ„ £ÍÉ ê™ôƸZ`‡¢1êuM;¢V**juL £ž LĸºèˆŠµÀˆ¨銆1m®“Ø"3¬‰ +QBŒzµ€Ê”µ„ ¥ÍéPÔÃW ŒPT/F½®aÔë:"Ô1m‹z&9Qí ¾¢G >ˆ>ÔŒzÕ™õ*‚Ä”µ„ ¥-Òþ¨‡=®Øž(F½nixÔÃPEA¡kjÔ3¹ŠF€^ÖzâƒîC-00êA½¢Lž+ÇT¶ÈL&k¨H”F½Š ²Ee-!Hi‹¤‹z¦¾‚=®: O£^‡ô»£^A¡kdÔ3ÑŠ‚LÖ,zâó»µ£^i&Ï•c*[L&“5$$Ê £^EPÙ"ƒ²– ¤4Ĩ7> O£^‡ô»£^A"¡k^Ô3éŠÔ±†Ò#Ÿß}¨õÊ1m®SÙ"3¥¬A !Qnõ*‚ÊĵT ¥¡–G=ìqµÀðDá0êuH¿‹57êa¨¢‚ ‘P·5)ê™zE>ˆbM§G >¿ûP;0ê•cò\9¦²Åd2Yƒ@?¢ 1êU‰->ˆk©@JC§O=ró–可3õ-ìqÕau¢ õºb>=ºÿ†M“òÕ4¶**B u[c¢žiXä@k=ñù݇Zcú¾Üù)wê dò\ ¦²EfJYS@<¢<1êU‰-2(k AMË„©o!`«V' ŠQ¯+L#k UT„ê¼fD=“±H@k=ñ¹îC-õŠ,“çÊ1•-&SÊšÊe‹Q¯ ¨l‘AYKRZ>L€ {\u˜œ(4F½®0™¬Y°UQAÐJ¨óõLÌ"è_­¤G >¨?ÔJ°È2y®Úb2±¬) Q¶õª€ÊĵT ¥eÂÔ·@0ÉU‡É‰BcÔëÓÈ[­„(ÿ¨gzVÇAùj1=ñAý¡V‚€E–És%˜Ê“)eMÙˆrƨWT¶È ®¥5-¦¾…€=®:ìM£^'˜FÖ,ت¨ È%D™G=“´: ‚WèˆêµÔ+²Lž+Ç„¶˜L,khF”9F½* ²Eq-¨i™0.LrÕao¢õ:Ád²fÁVEE@.!êË7ê™°ÕMººC@|€¨} `‘eò\ ¦²ÅdbYS@3¢Ì1ꕉ-2(k©@JË„©o!`«cÅÁ¨× &“5 æ**Š Q_¦QÏ´­‚ÈÕ5zâƒDí‹€Éså˜Ð“‰eÁˆòǨWT¶È ®¥5-&À…€I®:ŒM£^û™FÖ,ت¨(&DórŒz&ou ä­nÒ# jXd™=ñù1ˆÚÁE=Xd™BW‚ mј^ÖЉ¨AõÊÊĵT ¦ 1ê™ú&¹Š°1Qd»ö­ÓèõÚÉd2F½–ƒtB´XQÏÔ®Öƒ€E–ø Q 0êdò\9¦µEczYþ Q³0ê••-2ˆk©@PŠQo$lLÌ‘õÚÌ42Ñ ¨‡¹ŠŠðÓ ‘‘>ê™àÕn®h=ñA¢`Ô+Èä¹Lh‹É$³üA$¢faÔ+*[d×’€š6J«¢&¹Š :Q½°ß Ĩ×f&“ F½6sÝ„hˆÄQÏ4¯vƒnE#èˆzµ£^A¦Ð•`B[4¦—å 5£^9PÙb‚¸– Ô´QbE=àBÀ*WD(ª›Ý’õÚÌd2Ñ”¨‡¹ŠŠðÚ Ñ@)£ži^-ÅŠ–¤G >èAÔŒzE˜èAÔ±Èg ] ¦µÅaªYÎ Q;0ê B[L×’€ –Óàj‡U® ¨Wdat Q¯mL&kÌU´$“lˆFcÔ´' D@|Ѓ¨é a‘Ïä¹Lk‹Æ„³œA ¢v`Ô T¶È ¯%A-¦ÁÕÃ\°È‡¹-F½¶1¥¬A°XÑ’L²!Qo,ž(=ñA¢¦ƒŒE>SèJ0­-SÍr%ˆZƒQo,PÙ"ƒ¾–µäL€«V¹* a‘[[4ŒzmcJYƒ`±¢ÑL¯!Z£^qP((=ñA¢¦ƒŒE>SèJ0¹-βˆÚ„Qo,PÙ"ƒ¾–4µäLƒ«†¹* c‘ƒ¡-&F½V1™¬A°XÑ’L¯!Z£^Л(=ñA¢¦ƒŒEŽÉs%˜Ö‡ g9ƒ Dm¨7¨l1A\K‚ZLƒ«V¹* c‘ÂÄ£^«˜RÖ X¬h4kˆŠ`Ô[Ä&ŠC@|„¨Ñ c‘ϺLn‹Ã„³lA¢–aÔ „¶˜ ¯%A-&ÃÕ Ã\³H`_K‚Q¯UL)kŒV4š‰5DE0ꙉbÒ#T!j4ÈXä3…n\¦µEcÚY¶ QË0ê•-2èkI@PKÎ4¸Úa˜«za\K…Q¯=L&k,V´$kˆŠ`ÔE¦G >¨BÔh±È1…®ÓÚâ0á,[€¨}õŠƒÊôµ$ ©uìØ}WÞtÖ½;>ã•™W/¬rU@Ï",k 1굇)e}ëÀ½ò[–¯0ž+Í”¢‚õ‚ÀDñ鈪5š¬ãß{õê ç®Ù¼Ü%-2…®“Ûâ0í,OP¨•õŠƒÊĵ$ ¨a×ìg{°™÷Áxe&ÃÕ Ã\´º ›ZrŒzíaJÙ@[¿þIù-ËWO £fJ QAŒzÒ¥¢G >¨BÔ\.`=uâIùÍ^½á\7B¦ÐË´¶8L;ËÔj%F½â ´Å}- jcõLƒ«†¹Ò juµ0굄ÉdÃdõ°XÑh&ÓǨ烮D éˆÂ5— XŒzÀºLn‹Ã´³CÔ\®a1êSèÆer[¦å ºµ£^APÙ"ƒ¾µñ0êuv´¬0굄)eÃäõ0ZÑh¦Ñ…QZeB@|†¨¡ü†Å¨ç3…®“Ûâ0ù,OÐ}¨Åõ ‚Êôµ$ ¨'@Ô3 ®^檀¼ÕAÑrèצ”À¨×l¦Ñ¥ãQBåC@|І¨¡üŒÅ¨ç3…®“Û"0í,O}¨Ýõ ‚Ðôµ$ ©§ÃQòVaAË£^˜R6£^ƒ™@C4®.G=¨H”=ñA¢†ò3£žÏºq™Ü‡Ég‚âC­Ç¨W„¶˜ ¯%Mm<Œz]…ù,OŒzm`JÙYE=ŒV4š 4DãêfÔƒ~DÒ#´!j(?c1ê9¦Ð•`r[&Ÿå е£^AÚb‚¾–4µñÔõLƒ«†¹Ò pu ¶³l1ê5ž)e£1ê5•©3D%t0êA<¢<éˆÚ5”,F=ǺLq‹Àä³ Aî¡.`Ô+B[LÐ×⃦66F½îÁp–3F½Æ3¥l4F½¦2u†¨„®E=(G”-=ñA¢&‚’Ũç˜B7.“Û"0ù,O{¨ õŠ€Êôµ$ ©Q¯c°šeŽQ¯ñL)-Ÿ¨‡ÑŠF0i†¨œNE=ÈF”3=ñA¢&‚’Ũ§L¡+Á·L>Ë´êF½" ´Å}- hjc«5ê™W/ s¥AçêLfùcÔk6SʖĨ×H&͕Ө͈2§G >ÈCÔD³õ”)tã2¹-SÐ2­‡:‚Q¯m1A_K²ÚØõ:{Y#0ê5›)eKbÔk$“fˆÊéBÔƒZD G >ÈCÔ8P²£ž2‘n\&·E`òY† ôPw0ê¡-&èkñAS+£1QÃ\iº:cYS0ê5›)eKÊ$êa´¢L—!*­õQR5…ø Qã@ÉŒzºLq‹À´ Aè¡î`Ô+B[LØâƒ¦VÆéSܼeùcnñRL‰«¶¹Ò vu–²aÔk6Ë–tôèþ6MÊW »`º QiíŽzЉ¨AôÄ…ˆb–š¾ïw~c ;źq™ÜÉg‚ÊC¨W„¶h ¯%M--“áê…m®4^­‡™¬YõÌ”²ÁnEØ(CTE‹£D"j=ñA!¢Æ˜EÊDºq™â)h¹ÄC]è·$m1A_K²ZZ&ÃÕÃ\i¼º3Y³0ê5˜)eMÝŠF0Q†¨Š¶F=(DÔ8zâƒBDÍ%‹”)t%˜âš)h‚ÄC]è·$m1A_‹šZr¦ÄÕÛ\i¼ZYã0ê5˜‰eMÝŠF0Q†¨ŠVF=ÈCÔDzâƒHDÍ1‹”)tã2Å-SÐr}‡:ˆQoIÚb‚Ä4µ´L†«¶¹r xµ²&bÔk*SÊ» cŠ QE-‹z†¨¹ôÄ‘ˆšb)éÆeŠ[&¢åúu£Þ’ ´Å‰->Èji™ W#ls¥Aój7¬c Ũ×T¦”5v+Á¢ŠÚõ  Q£éˆ"5 Ä,¦Ð•`Š[h¦ åâu£Þ’ ´E}- Èji™W#ls¥Aöj1LcÍŨ×T&–5v+Æä¢êZõ QÓéˆ"5Ä,R¦ÐË·LDË Äê&F½%Ak‹úZ|ÐÔ’3%®FØæÊìÕbØÅQ¯©L,k LW4ŒÉ1DÕµ#êA¢Ð#t"jˆY¤L¤—)n¡™‚–(;ÔYŒz£Ah‹ [|ÐÔÒ2®FØæJƒòÕbØÅQ¯‘L)k ìV4‚É1DÕµ êA ¢vÐ#t"jˆY¤L¤—‰n¡™ˆ–(;ÔYŒz£Ah‹ [|ÕÊ;vì¾+o:ëÞƒñq˜W#ls¥Aùj+ŒbMǨ—ÄÔUS£ÍÜ3£3×|z?~òÙ“½qËœ½»÷ú«ÈM˜ð­÷ÊoY¾Âx-N>wrǶöNìV4Œi1DµhzÔƒD­¡G >èDÔ ³œãß{õê ç®Ù¼Æ»Àºq™â‰hY¬C]ƨ7„¶˜ ±ÅY­¼]³Ÿí=ÂfÞãã0%®FØæÊòÕVXÄZ€Q/‰é›§'ΞçºòuÙ[—ùúϸ_3uՔΜ¹gÆ ^ñÁ+æ¶`b™Øtû&9yþ¤¬~É{/™xcï.äŠ?më×?)¿eùêÖEîWîQvÆLW4Œi1DµèýSÒØ¨ˆÚD@|Љ¨A g9OxR~³Wo8Æ»ÀDºq™âš‰h¹¬C]ƨ7„¶h ¯%Y­¼ÊQÏd¸a›+ âW+akF½T&ß=)Ïu{ýkñø¼BÆ]Ôk>½FF&Ξ˜1¥LiÑ›¾eÚìØ¶C»^okóƒñ£žž9(W°[Ñ0&ÄÕEþ • ¤·pjŒzЀ¨eôĈšb–Q¯ÝB3-+Ðt¨ãõFƒÖ ôµø «UÒ¨ñ«•°…µ£^* ýË,š8{Âz;¶í™KF½Éó'í)r28w/ó#A£ÞÀ—ßʽO¼qB®`º¢aLˆ!ª‹üƒ HoáÔõ QûèˆR5Ä,_g£ž)tã2Å-4ÑrM‡:ŽQo4hmÑ@b‹²Z%Œz­€-¬5õRõö>ºwî½óú F½ô¼¿hQo ‰7N0êÇ„¢ºÈ?rôN-Qêµ’ø QS@Ïò1ê•e¢[h&¢e‚£ÞÚb‚ÄdµJòzØæJƒþÕ>ÂÚ„Q/•Q,Šz&™&Û—uõÕ¯jDÔ›¾eZfŠ5Ÿ^sèñCn>¬Cgî™q#½õè¿öÖ¿©æ^;üÆÞ¹‡6,ò™ CT#ùïQ.Þ©õ ýP[éˆR5ô,£^Y&º…f:ZV è1ê¡-&HlñAV«¤ZÔ3%®FØæÊþÕ>XÁZ†Q/•©AQoòÝ“{ÝëˆÒQoú–é¹»ðF=¹‹‰7ö>²CVYóé5znksrEnʦä"KuðÐã‡tð’÷^¢PÖÕùÖtμB«¢\䊚<3ùL…!ª‘þ÷é-œŠQºµ˜ø Q#@ÌÝŒz¦ÐË·ÐLDË Ô"Á¨7„¶˜ ±EY­*F½&ÃÖ>Œz©Ø¨§'µíضèQïÐ㇮øàoœ€¾6êižëíÉüÈÞÝ{eD¸­~²þYxvûúM¹¨§tS˜®h “`ˆêôÝ&E=ˆ>ÔnzâƒZD= 0ê•b¢[h¦£ej‘`ÔB[4Øâƒ¬VU¦QÛ\9ÀÚXû0ꥢýK.gO(½Y1ê¹óìd•KÞ{ |f…°QO¦ÉdÿcsÅ2óYºpÞŸž…ç–*F½ª ÁÕ¨_Êä¿P¹@z §tÔƒâC­§G >¨EÔг£ÞøLq ÍD´¬@Ê!RŒz#@k‹[|ÕªªõL‰«æ¹r µ ö¯VbÔKEûײ·.Û±m‡Ò¸6*êy¥lýüÙé[¦ek.íùlÔÓèæ¿‰žÐ¨yN÷ðŠ^¡¯´•ûò— F½J ÁÕh>–É¡rôN¹¨¹‡º@@|P‹¨ gF=éÆe¢[h¦£eR‘bÔB[LØâƒ²V£^3aüj+F½T\Ôó'Ξ¨õ|²âÄâ7¹õtãr‘=ñ銓çOº•,’qYÚÛÏÅ‹£^%Paˆj4ßËzÿµçõ õPGèˆjåz–Ũ7>ÝB3-ÐqˆF½a ´Å‰->(kUåõ°Í•¬e0~µ£^*£Þ@¥£ž¸âƒWôÖõÞo`ÔÓHgÙWïê‹pe>œÙ§õ* CT/™É¡rôθQBu‡ø Qþ gYŒzc2Å-4ÓѲ‡ÈaÔB[LØ"ƒ¬VF½ÂòÕbŒz©Œõ¼0ç\òÞKÜÇÑd×õÜ„Ñd‡õE¸½=7Kõʃ CT—ÅÕLþ • ¤·pÆŠzPy¨SôÄÁˆò=ËêZÔ3‘n\&º…f:Z> âùõ†Ð $¶ø «Õ lÔ3%®F˜çÊÖ˜½ÚQ/•QO{]lþæˆî&ƒPÐÀ’QOÈR™cOʳ&ÏŸÔwè“+²Ê¼Â_*†E=œÝ=‹‹|bˆja™üÇ(Hoázx¨kôÄÁˆòIËbÔ“‰nA™Ž–ˆ8D>F½a µE‰->(k5hiÔƒÖ&˜½ÚQ/•aQoï£{e¼HÔÓWÂÊR½)à31„¾üÖk<õ´ÐÙu7ݾɿéÜíÉçNjªƒ9#¢ÞÌ=3˜±ÈCTÓÎä?F¹@z §`Ôƒ¾C¤G >F”9èY1êÃD·ÐLGË"À¨7 ´¶h ±Åe­§O=ró–可—bJ\]0Ï•!¬5°yµ£^*“ïî¥4õôÅ­Ó7O»‘5Ÿ^##õ=~HÖ•q?êõV¼eÚÍ‘E2(ü³ðŽÝæIùêFfå2uÕ”¾SžÌ—ÝðWÔ€(3õ¦‘9n„6D×þÄNý@£¡ ~ü°Ü\ùÁ•z…@ˆ!ª…igBþc” ¤·pŠD=ˆ;ÔMzâƒfD™ƒž5Ìô}¸óS0ØJ&ÒËD·ÐLJË"À¨7„¶˜ ±EY--ãê‚y®haí€Á« õ’Ðø%—‰³'–ùŸ9{v/ÌÉ¥WÊú3×|zÔBçè kj“çOê lGϪ“›òÕnÃLß2­ëº-ËÖÜGahg”‹;›ïäs'5ÕÉEækìëíêü^¹“õ~pê³»gý¯üàÊE=‹´¢êL;Sú_(¤·p–ŒzPv¨³ôÄ͈2I‹L¤—‰nA™Ž–È7D£Þ@Úb‚Êdµ„L‰«æ¹ …µÖ®Ž`ÔKb‡ùœYàfî}t/,ÚÎYóé5SWMÉ×"o“盹gfàŠïÎ<ùÜI‘µüA¦Ñêðã‡×~z­à9z@‹!ªÎ´3'«¨Y‡ºL@|ÐŒ(s´ÈDº±˜èšIiù€|Cd1ê ¡-HlñAYKÈ”¸º`ž+rX;`íêF½f˜OiÍ‚õjˆoîþâ'n=÷#·œsêÄ XÔ cˆª3ùÌÉ'êAÓ¡ŽÓ#4#Êô,¦ÓÅD·ÐLJË´¢õ‚Ö $¶ø ¬%db\]0Ï•-¬0uu£^˜XÖX¯ ÍyúÀûÌï:ýò«0¡ ÇUdò™/“¨A‡Hÿø QΠg‘‰tã2Ñ-(“Òòí†h F½ µE‰->(k ™W,t%@kL]ÝÁ¨×&–5Ö+Ÿó®½íí»g¿ ºr QE‹Û™•CÔƒšC$ôÏ²å ’™H7ÝB3)-nˆ†aÔZ[4Ø"ƒ¬–)quÁ Ü ègAh‹ *[dPÖ21®.˜çJ€Ö¹º†Q/w&–5Ö+æ< Š QE^¼&mÔƒŽCäèŸd#Êô,2‘n\¦»eRZ& ÚÀ¨gAh‹[|PÖ21®.XèJ€"Ö¹º†Q/w&–5…_¯˜óƒ"CTÅâx7L¨‡È§ |PŽ([´ÈDºq™î”©i™€jC4£ž­-HlñAY«Í±c÷]yÓY÷îøŒaJ\]0Ï•E¬é°pu£^îL,«è[î•ß²|…ñz¹nÅœ7 D¢ÒL¼&UÔƒ‚CôÏ„Êe ’ÖÇ¿÷êÕÎ]³y9Œ·Œ‰tc1Ñ-(“Ò2Ɇh4F= Z[4Ø"ƒ²V§]³Ÿí=ÂfÞãC˜WÌs%@k:Ì[ÝĨ—;ÓË*ÚúõOÊoY¾Âx½~Àœ·$ˆ2DU˜x7 £åIÿXø Q¶ iðÔ‰'å7{õ†sa¼ML¤—énA™š– H6D£1êYÐڢʔµ:1êå óV71êeÍIJê"D=æ¼B Ê•fÊÝŒz”'ý“áƒrDÙ‚ª5£^¦»ejZ ×-‰QÏ‚Ö T¶È ¬Õ)‹¨‡y®ˆb†m«³õ²fzYuA£s^QeˆJ3Ùn4F=Ê“þáðA9¢|(O´Fk}Ô3‘n\¦»ejZ ÖÁ¨ ´E‰->ˆkubÔˆ­.cÔË— gµ¨=êAÎ{tv ,² Í•cšÝ’õ(OúGÄñˆòUk4F½¥˜îŽ©i™€XCT£€Ö $¶È ¬ÕŒQ/3Xµ:ŽQ/_&ŸÕ¢Æ¨gsž b½" º Q9&ØÁ¨GyÒ?%>ˆG”'¨Z£1êdº[P¦¦åJ QAŒzZ[4PÙ"ƒ²V³ôQó\ ÐÅ «VÇ1êåËD´ZÔõæ<…‹,H3D%˜ZW£åIÿ ø Q† i-‰Qo$ÓÝ‚2A-Pjˆ bÔÐڢʔµšŽz&ÆÕ ] ÐÅš “1êeÊ+hõªõFä<…‹¤¢rL­+ˆQò¤V|Ð(C´–Ôî¨g"ݸLw ÇÔ´@¦!*ŽQ@k‹*[d×jƨ—LZĨ—©Å¥l ýùÇ~ë¼ß×›~ýìvÎÿM¾Âø’þÍ{Þü§7þS}¬ºùìÕë†M“àÆMËÕ=_¿cÖ¼COïY¿åb7s´6oͼC‡¸ÖnçîmS§_y¶ ÆÛÎöþvL°‡/±û§¯;ûŸÿ¤·põ¨ ýãâƒ~D‚ªµ$F½áLw ʵ@¦!*ŽQÏ¡-Hl‘AY«_⨇y®èbÍ…=‹£^¦LÂÛØÞ?á&Þåâ«~Z!=ÿì“ZñÀ¿ú˜9Zk·óÜ“u·£Úº'žz¶ ÊlÇ=Qd;+¦~úüK_Ç/¿ùGå_F=ZhmÑ@e‹ ÊZýõò€1‹£^¦LÅ3÷ÌÈSå³Îù‘ßôú8~åÍÿÃÿòR$^÷Ï>ÿåÎÞ}àñmzz4/çÔ‰0y„¶mç‰9‡í¦ãœ:yÂM[·3ZnÛVôÄÛ9ØßŽÉyêÔ‹'dÂgÿÚkâ§~¨êã]þò ‡èô#Ê $­"ZõL¤—énᘚ–h4DcaÔóAk‹*[dPÖêW,ê™W,t%@k(ŒY¤õrdž¥Qï—ßü£ðb·pôŒ›-wßö×_ý}¨\¹î6=øÑÇê.Aä¢LÊ!©xãÚz×Öÿ§ëO>xÉoþëÿû».ü/â/?ñ—'ž9‡èŸ$$Ê T­"õ†0Ý-(Ôr†h,Œz>hmÑ@e‹ âZýRF=Ìs%@k(,Yä0êåhq¿(UÔ“û•{?öìA›ö0`‘†h,¦ÐEsàà6ùýÆMËaÜ@C4.ýƒâƒ„D¹ªU£Þ¦»…cjZ ЋQÏ­-¨l‘A\«£^°d‘è—#“ð¬´QOÙ´wòø3˜±È@C4.“Ò¢õ Î• J|(7PµŠ`Ô¤·pLPË¢q1êù µÅ‰-2(kAœ>õÈÍ[–?và_Ìô¸Z`¡¤±†ÂŒE>F½yñn˜¢žbÚ+  ÑXLJ‹éô+¯®ßrñÃßúŒ H3Dåè$$Ê $­â¦ïûÀߘ‚Á¦3‘n,¦»e‚ZrPgˆJ`Ôs µE•-2(k©˜WŒtã‚:ÖP˜±ÈǨ—ÅÉl˜|¢žzþÙ'ÝÇn2í †h,&¥eº QiúçɲU«ãL§‹énᘠ–¨3D%0ê9ÐÚ¢ÊĵTLŒ«º Ž56,ŒzÙ1½l Ü¢ž¦+¦½¡ ÑÅÔ´@”!ªBÿpø "QV juœétc1é-Ô’ƒ4CT£ž­-¨l‘A\KÅô¸Z`¡+Yã`À"‹Q/;¦— ”gÔSL{@£!*ÎÔ´L@”!ªBÿdø "QV ju™‰tc1Ý-(ÓÔ’ƒ4CT£ž­-¨l‘A\KÂĸº`¡²&€E£^^L,&«¨‡«io4¢âLJË¢Šô…*eÂV—™N7ÓÝÂ1A-9è2D¥1ê9ÐÚ¢ÊĵTLŒ«º 5Ö+ˆQ//¦— “ÔSL{=iˆŠ35-cˆªÓ?>¨H”¨Zg:ÝXLz Ç4µä Ë•ƨç@k‹*[d×R1=®XèJ€FÖ8X¯h F½¼˜^6LS¢žêzÚƒLCT©i9€CT ýáƒDù€ªÕe&ÒÅt· LSKº QiŒz Z[4PÙ"ƒ¸–ŠéqµÀB7.dƒéІaÔË‹éeÃäõ0` ×Ñ´™†¨ SÓr!†¨.ú§Á!‰òa«ËL§‹énᘠ–D¢*õ´¶h ²Eq- ãj…®hdƒéІaÔËÈâX6Z£žê\ÚƒRCT jÉA…!ª‘þQðAH¢|@Øê2ÓéÆbÒ[8¦©%Q†¨ F=­-¨l‘A_ åô©Gþü–‰]ã}¦ÇÕ ] ÐÈš»À¨—‘űl´æF=Õ¡´¥†¨ÔÒ:ùÂ3ÿü›îùƵbˆê¢|’(PµÆõ©;ßµþ«—Á`s™N7“ÞÂ1M--(2D1ê)hmÑ@e‹ âZ@»f?Û{„ͼÆûL«ºqA#kìV4£^FDzÑ2‰z°Æä§½ÜrΩ'`BãA©!*Â4µäÜ&ÿ‘Þ¸i9„¢ºè´$ÊT­±ÈI”[ãbÔë3é-ÓÔÒ‚CTF=¹-¨l‘ùq-8F½(°UQAŒzYðj]AÉ£6,ÐkˆF3M--.Œzšø 'Q l«5QÏtº±˜ôŽÉjiAˆ!ª £ž€ÜT¶Èü¸£^ت¨ F½,,vE0êe z Ñh¦©%Á…QBÓ#ä$JÂV Œz}&½bšZZPaˆjĨ' ·Å• íٹł9eùe-†Z¢Þž[ÕÁ}_ƒEÂ-¦Ó™¬A0TQqŒzé-®u1êe ’ Ñh¦©¥µE0êQhz⃢DÉAØ*Q»[P&«¥†¨FŒzÐڢІ.]q¡<{ÔË9oðÉ"˜<&¿¬Å0(êa•[Ò¥+.r?ãGöyiÿ“ïÔ¥2íÌËûM­+JYƒ`¨¢âõÒ[\ë Jõ°a€dC4‚ijiAjQŒzšø (Qr¶JhGÔ3n,&½…c²ZB`ˆêŨ­-mœ·ì-òR¾º‘í÷ßfÇçÊZ$µD=¡ß»\.˜|',çL¼¡÷cÁN7(eM•ŠÆÂ¨—ž vE0êå ’ Ѧ©¥ÅaÔ£ÐôÄE‰’ƒ¶U£v·pLVK  Q½õ µÅ•m°Õ×|Xž@B¿;~dç9oñuk?áÕµHjŒzú½Ëeëæõviµ¨¥¬A°RÑXõÒ3Á®F½|Aµ!Ádµ´ ³8Œzšø (QrжJ`ÔÃôŽÉjiA‚!ª£ä¶8 ² 60ê ‘ñþÙj‹Æ se-’£žXµòýó?–KMª+JYS`¢¢q1ê%fj]AŒzù‚jC4ŒijiAdñ1êQhz⃢DiAØ*§óQϤ·pLVKú Qíõ ·Å•m°ÑQÏŽ«ƒûÐOÕ8~d',ê{úà¾÷ìü²ãB›9óÒ¾qu›òÕÍ:GOŸzdõc×ìgç-”¸…O·ð‡‘oùœ‰7œyi¿ž¯·úš+aiïg‚©®çøÑ‡îÈ,_t+er]?ºËd ‹Q/1Së Jõ°a‘ª Ñ&«%…|ï•ï^{ÛÛÿö±0NT=ñAT¢´ l•vãÝ}áÁÃ`ƒ˜N7“Þ1Y--è/Dµcԃ܄¶ÁFG=Y ã{vnÑìµjåez>Rß ‹¼4Ökmî£9ÜH‘ÁãGv^0ùNÝ”\ú÷Øk|zGþ §×àV­|¿Lu/]q‘\Ûï¿Ãºt›reã­×Ëfåºÿ‰²T@°;~ôá –÷vO¾º;ZwÔ›pæåý²H÷sÏÎ{¶?p‡ÛsùºêCï7-+ا¨F½ÄL­+ˆQ/SPmˆ†1Y-!È+Dñ鈢¥m«³L§‹©o˜¬–Ä¢õ ·Å±ÚFõ¶ß›ö&8ïà¾dÐM—ÉLùêFd‚pqmÏÎ/ËM¿ÖÉ}É*þȰAÝø¥+.”¥ý··{zÝÚ)‘‹\±ƒ‹Oâ›û([÷¾xÇ<¬ûk d³ýýŸ».[XøÄŒÿspÔÓUÜ zg^Þ¯+ú]Oèઽ_®Üÿ7ÇîÒ=ìíRÖçëaŸ¢õ3µ® F½Aµ!Ædµ´ ¯ŧG >ˆJ”´­Î2®8“ÞÂ1e-!ˆ/D!t<êAk‹f®²f£ž~úí9½“Únsƒê‚ÉÞéf÷=àFô#5ú¬wsÏÎ-ó[sqíé­›×o¿ÿvwSÛV‘¨'7e°×¼zmqÑLô_«kWß~ÿ2²Ðãú4¢­Zù~ȦúßNïºnD.sepPÔ›Ûfïl»…ÁæÎòóu'û«/$3™#ƒ7¬ñs‚qŠÊaÔKɤºâõrá†h“Õ‚¶B”„ø *QZжºÉtº±˜ôˆÉj Ay! „Q/¾¹è¶$zçL¼As•6¦KW\hß,ïà¾t&Œë*{vn‘ëõdd÷>z@ÛVñ¨¯«u§ïùƒrV×þ¸ní”æ9¥ìe5oèÁÝÔf7·Ê ¨7ÿíãûè™ñò¢Œ@¿ÓÁÕ׬òs‚qŠÊaÔKɤºâõrá†h “Õ‚°B”Šø *QBж:Ëtº±˜úˆ)k Ay! „Q/¾EÝmw¦Þžþ_h“›þéxjÝÚOÈ¢sz¯¥ý°OëÕÆ[?£Ó´RÉ l >ÔBÍg¬¢Q¯Ôà\S[µòý2踗»ºfgÉžø}b†‰zÇο¤÷èÃnPùkõÍõ;ÿ³2Ü`®QË•ƨ—’IuÅ1êe Ñ0¦¬¥U…(!=ñAW¢„ mu–étÅ™ôŽ)k Ay!*í•‘õâ[ÔãFXm^~«ç¸ù#Jgžc¢žò^«Û;™N“–\dköæ3V‚¨ç¸fgɞȺþȺþ{öÉàñ£ËÒÞOf¾ÜíÙ¹U¹gá;šaÔë4F½”Lª+ŽQ/;nˆ2e-!¨*D 鈺%m«³Lª+Τ·@LVK¢ ÑX ÛÆ¨ßBŒmµ‰zú6yýÒ´è£oíÌ!zYM6²úš+u;òÕïz µk~dØ Ü,;è½úÕËsEÈžô"”­]ºâ"¹"\¹sQÏž©·ðÍ4.êa–¢*õ’1n,ŒzÙvCd™¬–$¢´ôÄ]‰‚¶ÕM¦ÓÅÔ·@LYK ÑhÐéÆÂ¨„¶¡¦:}n¿m- ºÄõYhmg^ڧѪÿsƒ µË›9pФºâƒsMmã­×ûm®YÑF=÷‰²H&¸r'dDÆ—zO½^&Ó]bÔë&F½dL§ £^^ Ý dÊZ*ÐSˆ’Ó#t%JÚVg™N7Sß1e-è5DÃ@ž+§ËQZ[4Ú†õÜÉz«V^fí§âºOÕEýŠ]ÈmÛï¿}~ûs#ókQ•Ó-/•ê–ü—ËÿñŽÇ®Ó §oŸŸ~[„ìžì þ÷ùO¹•Kï{ñâ~;ðé·÷M{Û™ée2Ù¨‡MŠ*bÔKÆtº±0êåÚ ‘eÊZ*SŠxñ…g?þù7Ýókaœ¨.z⃴D©@ÛªèSw¾kýW/ƒÁF0®8“Þ1e-!7D>HrÕ1êE¶¨¸æ>ÆõCfÏé½rvá3ÜdWñ„¾ƒÞ™—fåúêþKnϼ´Ï…¹·^/«ôãà¢*'ÑiòU6;ß¶¤:ÿ,?¡;æoÐ ¾ùw~ìö™÷i†;~¤÷2¸ÎûÜí÷ß!wÔ¿—ùZgÈ„^ŒƒñÿóЙ—ç>1C&̧ºžzß`ï»~y¿ÔØ»£¹‘^)ÓïqÝ ×xíŒQ¯+õÒ0‘n\Œzy|Cd™¸– Ä”"¾}p»üu¸qÓr'ª‹ø -Q*жªxêÄ“ò›½zù0ž?ÓéÆbê[ ¦¬%‡HAŒ« £^ds¹mI[7ߢ¡J¾ÊuXê–jžF(Y$W„^qáÏ»·^¿gç—×­Ò ~€sgüé"ù*“uE¹¾ýþÛuÚÁ}ÊR”+n];ø“?óCW}ú_»'›u“õŽÄ袷uóz]Eö|Ñ¢~›[wCï3zßÎ|¼S«>ô~߸A¾ë­Zôäëü„^&Ûz×_é–eÚñ£»ìàÁý£ƒÀ EÕ1ê¥a"ݸõ2í†È2e-()1êQhz⃴D©@Þª‚Q/,SÖRŽC ®vŒz‘͸%­^ü ¶z¶³ýþÛÜ"|ã­ŸÑsëä«\÷yiߺµS«V^&Kç'\¯éÍwüÈN#_û'ý=­k­žûhÚÞÑ›Kêõ?¾üü·ÿÚ‹VœëǸãG–Eº3rEnúK-Ý”Ú~ÿ ‹æûŒ¯»aÊÝtîÿš,rw$7½¥½R¶úšUÎÆ kì œÁ—)ªŽQ/ éÆÅ¨—È7DÀ”µT £ǨG¡éˆÒ¥y«ŠNF=“Þ1e-!:ÔePßaÔ‹l¡²E7—íâÛ5ûÙÞ#lþå·uZÈså@2Ë)ªŽQ/ éÆÅ¨— È7D–‰k©@F)ŽQBÓ#¤%JÚVEŒz™²– 4ê&ˆn¡1êE¡-&lmÑäõ —åkÕ‚Q/SèJ`ÔËä"`ÊZ*ÐPÆÂ¨G¡éˆê%m«¢†F=ÓéÆbê[ &®¥q‡ºr[zÐڢР†¶˜õj‚5ŠjÁ¨—€)t%0êå 0q- (ãbÔ£ÐôÄu‰’€¼UQ÷¢žIo˜²–$êm11êÅ¡-& m11êÕSÕ…Q/SèJ`ÔËä"`âZPOJ`Ô£ÐôÄu‰’€¼U£^(¦¬¥•‡:[|Œz1Ah‹ C[L¡¢Fº±@2˦(ª £^¦Ð•À¨—(8DÀôµ$ ž”À¨G¡éˆêÅm«:F½PL\KZuôµ$õb‚І¶˜õ*ÃE5bÔ‹Íä¹rõ²‡ÈgâZNÊaÔ£Ðôĉ⃶U]£žétc1õ-SÖRÖC­e-!F½˜ ´Å„¡-&F½Ê°CQõb3y®F½ô àùL\KºIiŒzšø 0Q|·ªëXÔ3õ-×RâC-M-9F½˜ ´Eƒ•-² Q#ݸ šå #T§œyùÛ{vÞ3š› ãÊ-nË_¸ó#ÿîÏ~Jüéê¡W®¹áÂÛvPz}I ÑŠF3y®F½ô âùL_KºIiŒzš>çòA`¢ø oUǨ„‰k©@÷¡V‚š– F½˜ µEƒ•-²]³Ÿë=Â2ŠzPÍ2‡5ªS¶?ð_Ï[ö–×ô/çL¼ÁçÝäKW¼GåâϲÈMSþ–òg~Hüô?ù1½¢ƒgOh„’+nD ¼É®W”Éså0ꥇÈ1q- ˆ&U0êQhúœË‰âƒ¼U£^ýLYKÒµ¤´|t3êAk‹B[LXÙ"cÔ«fQŠê =;ïéG³×Àiw[ïú¼ žãE=¡N¾ºïüAå¶Ü;MÏ{ùíÊ«O'G½é›§õæÔUSrsÙ[—éÍÛvèF½BL›+Q/1ˆ8D>Ó×âƒbR£…¦G >L´­Z4.ê™NWœ©o˜¸– Ôjˆh¹aÔ‹B[LXÙ"cÔ«`Q„ê¬súçåAÔ—®xD½Õ׬’™ÐïŽ}D·°î†küq¡ãõþúÿø“KÞ{‰õ&ß=é²D=±æÓkd„Q¯ÓæJcÔK "‘cúZPL*bÔ£Ðôĉ"ƒ¼U F½ú™¸– j(hbÔ‹B[LXÙ";}êÑÕ_ü]³ŸÃ0WFº±@5ËÜ¢ÕYâÞÁýÛV_³Êõ„ž¬wÁòß…ñaQoï£{§®šÒ5qöÄšO¯qYÊF½Cß9$sõ 1m®4F½” âùL_‹rIuß{å»×Þöö¿}l#ŒÕE@|И(2È[u¹ñðà‡a0[&Õgê[&®¥ ˆZÚY¶õ¢Ð6žãGvîٹť#abKÁT¹áöìÜê?ò0,ƒn,PÍr¶(?uÙ°¨gŽzv|XÔÃå±QŠ2a® F½” â9¦¯Å­„¨ôĉ"ƒ¼ÕA¦ÓŸL\KJµ„³œ1êE­­¨ƒû¸`òçL¼á¼eoÚ ä뺵Ÿ€™C@_‹Ï$¹!V_s¥|_î;ÕoSÀ´ìtcp–³Eù©Ëäa ?êmà¿Ú×ÒŠÑQNëºe?êýþ寻øÿ%Ö(£^y&ÌUÁ¨—t"eúZÐJˆAŸsù 1QdP¸:ÈtºâL} Äĵ$ Q @2Ë£^ÚŠ:¸ï\g^šÕ¹2Ÿ'>즉->“ä¹tÅEòMm¼õz7"×e¢Þž[îûšét…œyy¿¬nÂY¶µ§Ž³QOþ+°åN ŒzÛø¯úX:~ô‘ùÁ£êœ‰_’E~Ô{ýÙ?üË¿úóX£<Œzå™0W£^2ÐqˆÓ×âƒPBÔúœË‰b‚¼ÕM&Õgê[&®¥=ˆšzY#t0êAn‹B[QL¾SžCn¿ÿ6ðø‘çL¼¡MQïྯɷ٠1‹Ç/]qD=¹Ùï5ìŠX}Í•r/ý0ù,O MŠ4êiÈSs3ÓF=ýôÛs&~iûwº–çhÔ{ýÙ?,Þð+?)_å&£^(&ÌUÁ¨— t"eúZ|PIˆDŸsù 3QL·ºÉ¤ºâL€ Áĵ$ QÓA,k F½8 ´¥-þ‰ÞºµŸ€Ò7$¶ø’Ü0šÛz!fñøÁ}_“Eîæñ#W‰zz2`C¢ÞB¥"¡ÿ!¬úÐûW_³JÈ•¹Œ™©QO'ç-ûÚì.]ñžãG…œ§t›çÇÞvþkßõž³åŠÜdÔ ÂT¹Šõ’”C¤Lb‹* Qƒès.d&Š òV™NWœ©o˜¾–$!j.Èdͨ„¶¢´el¼õ30>Œù$ èk={v~Ùqƒ÷=¨#reô Žˆ3/íƒinŽ7>òó.æiÔ“oÆkºYqpÿ¢—â?ú°[ä‹3/ïŸûanX³gç= RÚñ£»tüàþ¿EÑa«ê8ýÝões#—®xψ¨wÞ²±gçW„LÓ›÷o‡œ§ìËoím?ʨ„©r1ꥇH™¾$¢fÑç\>ÈL®2©®8SßB0q-CÔPÐȇQ/Ž…î6}ùí9oXòo7Þú™vÞ²·¬Zy™\ýOÒXTÙ¶n^ïæÈ×ù-÷bÜêþ‡TÈH/”ÌÏ8xéŠ eD.²ôø‘º¹ÈL7G¶)ã2²jåûõÊ¥+.‚BçÓ—ßÊeÄ4ý´&WÔËß©Ínã†ë厔N“+Ç>¬K·Þµ^nºÂïz,ÿ]‘Ð+ýÕw¹¥Ña«ê8ùÈïÎzg^þöÁýÛÜ;^¤[}ÍŸÉÌó–ý —íä #>õþãu?û©õˆAÊèW’©r1ê¥)‡H™Äô¢ÆÑç\>ÈL ä­n2©®8àB0q- CÔPÈšˆQ/lpéeÈÓHù:âMô6Þú™³jåenDÖÖÍë]hÓϸtÅ…nD‹¡;ÃNV—›²¢› ÜÉqþ ÎÔ2(›ÕV(téÁ}ÊuÙxÿf¯Ç­ZÙ{±¤|u…ÎÒׯÊEVì}†™ öìÜ*z;ã‚'.XÞûFzApøˆÐŸ‰òY$ûì*ÞÖ»þjþŽM‹ÅUÔ#¿ùß.ê[ˆt6ê?ú¨–;YäõÄ_ÿ‚AÊèW’©r1ê¥)‡H˜Äô¢ÆÑ#”&ŠòV7™TWœ p!˜¾–´!j"¨c ŨÁB}+aÏÎ-Z£ä"W¾w¾©-Œhæëe©ù7?gî¦Ø~ÿí2Á½´v`¿1([sApëæõ2¨×µÎo¶ã>~ïë~ö‡ÿÙ/ü´ËsiûÓ-_ºâ"û¢ÝaQ¯zÝÜ){jã†^Á„™rSmÔÓl®»áPöA·?p‡? +õ¶?pçË×t6ê }î9¿äªaQoæž™ÉwOb–êcÔ+Ã$¹êõ€”C$L_‹âH/¾ðìÇ?ÿ¦{¾q-ŒÕE@|Pš(È[õúÔïZÿÕË`07¦Ógê[&®%mˆºX£1êE°ÐÚJ[}͇µkȥܢuk?a÷ìÜ"ƒ²Š†6=MÚ7êÍŸ‹·ÈÁ}z÷;ãvÍ~î'æ‡d¼÷Vw^¤³¶ß‡6A݈춿tXÔ³tfo7¼ÁaQO°ð>z:yõ5«üÁ(E+Rú;ZõzIîÒïT70깓õV}è?øãbXԻ佗Lœ=eªQ¯ “äªcÔKj‘0‰-2(#|ûàvùëpã¦å0NT=ñAi¢h pÕè©OÊoöê çÂxnLª+θL_K 5 D±¦ëZÔƒÜÇBk«H_÷*—~e›Ô &_W_óaGfžÓ?5ïø‘ÿ}þðdÐÕ7kܨ'_ýAµnm¯wÈýÊRç/ÿ7õ Ò ³ýþ;´©Á*Õ¢Þ\§ƒ¨wpÿßèÌÕýUutrÿ¼ “£pÑŠæ?úˆü‚æw22×ãμüís&~ ¢žûd P¬úÐèÿ¢ÉÿÄ û ê­¿ëýgO ‹zW|ð YeØRÌ$¹êõ€šCd[|PFaÔ£ÐôÄ¥‰¢ÂU#F½z˜¾–D"j(b-À¨ÁB•«N_W+—þç`ôF4?AÔëë5ýŒZ#7ýd©Ìé%³bƒ·¦‹lÔ{Ûù¯½hŹÛï¿Ãº%é>÷ÂÜüÈ訷qÃõ,§,•U´õÖ]˜08êÉÍù^õ¼&7ŠE=‹Î¼ümítrYõ¡ÿ°úš?Sr]{œßï¶Þõy”¯rÝ+7ûwÊMËoþ“‡è»Þs¶|•ë?÷úÿQž‹·éöMgOèZk>½–ÒP&ÉUǨÔ"a[dEÂaÔ£Ðô9—JÅy«^mz¦¾…`âZ‰¨A ‡µ£^‹ª\uîÔ<½©­jõ€ÑXhm:'™z‹çÏŸ]³Ÿë=ÂfÞçFŠp‰ë>7cXÔ“qü¥_ú§ëÖ}T?ñ¶ø™z.êùƒé`Ò¢íü×ùÆ:—óÀºþ7—í`Ñ™—¿í‰íÜéù7ÿøO'ßvþk]ÔðG¿9uÕ”mv'Ÿ=)ã¾™{f` `z\-õbƒšCd[dÐD‚bÔ£Ðô9—bÅy«^ˆz&Õg\¦¯%ˆšZXk0êE­m {vn±úšËË~8ëÝÔ×äö?ÖvÑ4¿µéœùÖ6X-Qoûý·Ë¢^#ëÝœËsKF½ƒû¾6ðoe;²µ=óïÄ7(Õõ¼á ?ÿ3?ÿc—þ矹ò¦³tÄÌì%3z7¬ñ"ZLî£o“¤E} a.„]ûnÒè ~ú-Íô¸Z0êÅA‡ÈT¶È ‰ŨG¡éˆbÅ…«^Œz50}- HEÔÂÚ„Q/4mcлØ~ÿm0®oçNÍÓäöÖâiÿýïŸÖ7ÔúAý9 Nè‹sÕÀ~§÷U<êÉ=ʽÈRÿ•¶õnºã=nÈöûw±hðø‘‡5·Í :ÿî©#w}äÓËdðõgÿðUŸÿÕǬ×qýô[of/™iÔ[m>ûbØxôÌ%‹6¸Ú1êgz\-õbƒ Cg[dDBcÔ£Ðôı‰â€ÂU/F½˜¾¤"Ê$°öaÔ BÛ4êõk×Âà™—f5uõƒÝÜ f)ÿd=YzÁä;û/ÑËmÞœ¹‘í÷ß>¿ÞÍ=;¿,dD®èÈêk®Ôµúû0·–ŽË ¿qŸë€Ç<¬=n×ìçÞü;?öOþéOœyiÿ\¡[Lï>FCï¥÷Q:ÒÏs²{2¸î†©§ŽÜõ¹»Þõ΋ÿÇ?ºê§eäŸõŸ9ôM³gçV&_uD«Ùª½_å¾Î¼|@nÜÿ7ú‰·7¬ÑÉÛ¸CgŠu7\#áAÌ"¬o0ê…eb\]õ¢‚ Cd*[dDBcÔ£Ðôı‰â€ÂU¯VG=SßB0}- F”9è_­Ô©¨¹-޹ÊV‚F=¹œ·ì-óŸ}ña¹~ÎÄ6Þú˜é2–LÐ9~¿{v~ÙŸ#_E¿£-Ì‘qª•—¹ÒçfÜ÷ ›¶uóz·®Ïߎ8ë~æõgÿðg¦ÿ­ v@ß%P.—®¸huÿ³5äŠÜìwÃùiý<§aN.²ÁŸü™úõó~rûîO.ŸüŸeÄÝ8¸ÿkrS×Ý0å¢Þñ£»tPgÊWzBïÎ_$¶ÞõWº4HZ‡é-F½°LŒ« £^Tt¨ãLb‹ jHŒzšø 6Q·j—Ô3©®8àB0}->F”9ˆ_mŨÚBz+áà¾Ö­ý„¶èM®Ú1êUe[|ÐŒ(gP¾ZŒQ/4Lo±`e‹Ë‹qe?ýÖ§9OW}þW·ïþ¤Ëy@>ËT­ÎÂâ£^X&ÆÕ…Q/:Ôq¦²E)$F= M@|Л((\µcÔ«Äôµ$ Q¶ {µ£^hÐÚ¢ÊÙ¢$W%ê=u¸JÎSÏ2a«³0·ÅÁ¨–‰quaÔ‹šu™Il‘A‰†QBÓ#ô&Š Wí2z¦Óg\¦¯ÅÙˆ²Í«õõ‚‚ÐT¶È…¹rQ¯Žœ' Ÿå ÚV7ak‹†Q/ SâjĨdê2SÙb‚£…¦G >èMD®Ú1êUb[|PŽ(O¼º€Q/(mÑ@b‹oQž7êÕ”óä³Ëä­ÂÊ£^@¦ÄÕˆQ/È:Ôe¦²Å$2F= M@|œ(4(\!´4ꙂékñA<¢ AêêŽîD=Èmq@k‹[d˜êNŸztõc×ìç`Ü78çéRìtc‚–!(\]ƒ‰->F½€L‰«£^$u¨³Le‹ òG|ß{å»×Þöö¿}l#ŒÕE@|œ(4(\Üx÷E_xðÃ0˜“êŠ3.“Øâƒ~D¹ÎÕ)ŒzAAk‹*[d‹jÝ’Få<…®8Èg‚ÂÕ5Ø×’`Ô Åd¸z1êÅY‡ºÌ„¶˜ µø 9Qh¹ºÆ¤ºâL€«ékñA?¢Ü@äêF½  µE•-2¯Ç´tÎS˜êŠƒ‚–!ˆ\Ýe-!F½PL†«£^ u¨³Le‹ ÚQ+鈒…‘«kLª+Î4¸Ú™Ä$$Ê ®bÔ B[4Øâ3UÎ(šóvº±@Aˤ®ŽÀ¬–£^(&ÃÕ‹Q/(;ÔY&´Å탨•ôÄɉ‚‚ÂÕA&Õd\&±Å‰²…«ƒõÂÖ $¶ÈL•[lŒœ§°Óù,Cº:›ZrŒz¡˜ W/F½à ëPg™Ê„¢¶Ò#T' WטTWœ pµ3}->HH”È[ÝĨ´¶h ²Efªœç?­ŸÐGTL7où_LM›ó¥¯ýG˜óa˜ mu£^8Ðڢʆ(J””,rõÖ T¶È0Õ‰»·ýéÜ#læ}°ÈZ”öî(ö  å²W‹a>Ë£^ýG´Ü0ê- âu mÑ@éÈ£…¦G >OD®p2Œz&Õg\íLb‹¢¥%‹F½@ µE•-2Œt§O=zåMgÍ= D=U9íADË ”¯¶Âv–-F½š-.hbÔ[Äê&ÓÚ¢Ò‘ F= M@|ž(ˆ\A1êÇ$¶È (QZ±ÈǨ´¶8 ±E†mNèiz×Ýñ/{°ÂQOíÚW:íADË Ä¯VÂp–3F½š-.hbÔ[Äê ڢ̑F= M@|О(ˆ\A1êÁ$¶ø *QBаt!êAn‹r[PÙ"Ã*wìØ}zšÞ}}¼÷3êi¡+•ö ¢eâW[a8Ë£^Í´ ùQ{ è;ÔA¦µÅ#+Œzšø =Q ¹‚jQÔ3 ®v&±EQ‰‚€E£^ÐÚ¢ÊV¹ÿ²õByðÈ×]³Ÿë=ÂÆŠz‹;Ý8i"Zn ~µV³Ì1êÕÌD´Ü0êq‡:È´¶h qd…QBÓ#´' "WP¹E=“êŠ3 ®v¦²E]‰RzE1ê…­-¨l‘-ªrÇŽÝ'œ+o:ëô©G«G=U,íADË Ä¯VÂd–?F½:™‚–!F½Q ïP™ÖŽÜ0êQhzâƒöD@ç ŠQo ¦²Ei‰’€tEÃ0ê…­-¨l1a•{ðá)yäܽíOåz]QO-•ö £eúWû`/kF½:™‚–!F½Q ïPטÖ ŽÜ0êQhzâƒöD!@ä ­-QϸڙĤ%JÒ è´¶8 ²E†Uîþîñ§ߥ×ëzjHÚƒˆ–H`-ƒ±¬)õêd Z†\ÔÞEÐw¨ƒLk‹êF†õ(4=ñA~¢ r…ƨW”©l‘AZ¢$ [ÑŒz!@n‹*[d¦ÊyÆŽz‹ûÝöž:r—éhù€Ö>Ëš‚Q¯N¦ eˆQo(è;Ô5¦µEu#CŒzšø ?Q¹BË*ê™TWœipµ3•-2¨KD+Q/Èmq@e‹Ì„9O¸¨§\Ú»ò¦³LJË$°–ÁRÖ Œzu2-CŒzCAâ¡®1­-HybÔ£ÐôÄù‰B€Î£^!&±Eu‰âƒbEKj}ԃܴ¶h ²Efœ'tÔS»ö}®ÿ"\Hiù€ Ö&˜Éš…Q¯6&Ÿå‰Qo0è;Ô5¦µÅ]#[Œzšø ?QйBkEÔ3 ®v¦²E‰âƒbEKbÔ«´¶h ²ÅdªÜbq¢ž‰hY Ö&ØÈ‡Q¯6&ŸåI£Þ=_¿«VÇAâ¡®1¹-èÙbÔ£ÐôÄù‰j‘+F½BLe‹ E¹ŠŠ`Ô«´¶h ´ÅdªÜb§O=ºú‹¿±kös0>¦ºâ £eBX›`#kF½Ú˜|–§ÇŸÜqímo?ôô¬Z‰‡:Å´¶8 jäì{¯|WþÝøÛÇ6Â8Q]ôÄŠj‘+Žï¾è ~ã3©®8Óàjg*[L˜(2hUT£^í µÅ•-2æªÀTWt´¬@k dMĨW“Ïr†I«ã ñPטÜD ¢.Ó#(ªt®N1©®8Óàêe*[dИ(&UT£^í ·Å•-²^ŒûÁé½_øê¿ìÀú…õè•7%•cÇî[Ès%`ª+:ZV ‡µ¦±æbÔ«‡ g9äÕqx¨SLk‹réˆ Õ "W§˜TWœipõ2•-2ÈL $*W»£ä¶ µE¡-¦^ŒÓÓôþËÖ ò\9˜êŠƒŽ–haí€]¬ÑõêaÂYΰjuTê“Û"€–ADB@|¡¨^й:ŤºâL†«—©l‘Ai¢8 OQ Œzõ‚Ö „¶˜;vß•7%ªž¦'0Õ)-ÃZ£XÓ1êÕÀT³œaÒ"¨<Ô&·Å-ƒˆ„ø BQ½ suŠIu™W;SÙb‚ÒDÑ@Ÿ¢õê­-¨l‘ú/[/”ÉÝÛþtQž+S]AÐÑò9¬0Š5£^ L8Ë&­ŽƒÊCbr[2ˆHéˆ"Õ :W§˜ZWipµ3¡-&(MÄ)*‡Q¯^Ûâ€ÊÕ±c÷É#äÊ›Î:}êQ,tãÂTW¤´|@k,b-À¨WÎr†U«ã òPw˜Ü„ "RzâƒEõ‚ÎÕ&Õg\½Le‹ bEeŠJcÔ«ä¶80´Etèæ-Ëå2ú4½Ó§ýó[&v<öG˜êŠƒ”–(bM‡9¬õj`ÂYÎö¸ï#·œ#_1ou„ê“Û"€ŠÑ /¾ðìÇ?ÿ¦{¾q-ŒÕE@|¡¨FйbúÔïZÿÕË`0&“ê 2 ®v¦²Å±‰"€,EU0êÕ r[Úâ™}bƒ<<–¸]þݸqÓr'ª‹ø CQ sEóÔ‰'å7{õ†sa<&Së 2 ®v&´Å½‰"€,EU0êÕZ[4ØÚ¢ùÔí¿%í»?‰yn±ÀQRZ> ˆ5¶°Ö`Ô«Ê„³œý€QÏ¡‡ºÃä¶ a4 £…¦G >èPT#è\Ñ0ê e*[dЛ(4hRTQ‹£· µEƒ­-ŽÙ'n•ÇÆUŸÿÕø»Ç1Ï-ƨ×|ÂÚ„Q¯*ÎröF=„ê“Û Ñ,Œzšø CQ sE“<ê™TWœÉpõ2•-&èM)ªŽQ¯FÐÚâÀÖÇ?üÝw¦6üº<6–ìFÄñ#éxæQïÌK³{vnA5¿ÿ­ˆz˜êŠƒš–Hc …Ù«ÝõÊ3í,[~ÒbÔÃÜC]`Š[h,šŽQBÓ#Ô(ª¤®Èõ m1A{¢@ ?QA¢žÆ;õ„ö8?ê‰KWüÁÀù«V^*ãòÆ7ÞzÎþRܹ֦M¢žÐ-dõd·û;9 ëÉ"qæ¥}¦µ…rúÔ#÷îøØN«Ó„¹‘ÂD=¨i™€:ÖP˜½ÚQ¯$Îræ'-F=Ì=Ôz¦¸EÁ¢éõ(4=ñA¢Z@ꊌQ™Ð´' Ú’EÔÛ~ÿF”‹éŽÙ!“ÅÀ÷ÝÓí\ºâ`|Þ\kõD?Ší…Á²0ºÕâÒÊÎ;YÏ/nü—­Ê#á±·ôoš07ÒéS®þâoìšýŒÏÁZWÔ´L@k"l^­Ç¨W’ g9ó“ÖO>tímo?ôô°C ÷P˜âÔŠøÞ+ß•7þö±0NT=ñA¢Z@êŠïÆ»/úƒ†ÁL­+Èd¸z™Ð ´' Â…“EÔÓù0®§é·ì\7âÓ¥ï¢o.·ˆzÎÁ}Èý::x楽nĶ?·HôG ·=µgç5lüÌK³0âæ(™ ¯±Ýxëgü9úšÜ¾Á¯½=¸ïAY$ä ,:óÒ>]ä¯ 7š}âVy\õù_ý‡¿ûNÄ„¹*°Ö5-PÇšƒW0ê•dÂY¶°juäj=SÜ"€ZADKÒ#Ô(ª:Ww˜TWipõ2¡-&ÈO„' '£3õ`¾ö¸açâ <¹Ï3WßlÔ;~ä!h|rS7%—KW\¨ƒýwîë55Ù‚\÷'Ëø“ïXµòR _ý·jåeý ï”MɱýþÛÜR=ùN.²=;·œ·ì-º¹Èu7mëæ[䦎ëF”¬"[ÓErÓïnbûý·ëå^däŠÜ”A˜àÖ]·vJ®ôï¤7²uóz7|êöóäa°}÷êùæJÃTWµ@ k" ^]À¨W’igÙªÕqP|¨õLq R¡G >RT¤®î0µ® “áêeB[LŸ¨vP(¨,¢ž~L-¼wžÎ\}͇üAGïB.°©¾¹'lÔÓçnªù7é{Ãñ#¹AYW¸›B“\ÿ:z7ϼ´WVéomQ³Ûºù½yüÈN WÜÍj²KL¾S{ŸÌ—92(#nš›©'èùô$¾þý.t·=;¿,#²Š{£=þ){²TeW…ì˜,Õ;’¯nšÏœ¦'L›+ S]APÓ2á×±&ÂÚÕŒze˜p–3¬Z]¹‡ZÏ· UQz⃠EÕAêêSë 2®^&´Eù‰B€êDA¥zúé·öŒ¼£^¿võ »éÏQúzÞKçÏÔÛxëu2Ío|zn d¾~›{‡¶¶í÷ß& Ìiæ[µò27"×ûÛY8/Oèºr9¸ï78,ê s®» gÛé½÷wiaPV”Áþw:7²8>.ÌTOÓXë ‚š–¿Ž5Ö®Ž`Ô+ijœaØê2(>Ôz¦¸…‚ˆ Ò#)ªRWw˜ZWÉpõ2­-ÈOT;HNZš¨ç›ÜýsßϬ%ê]0ùŽÕý‹ó9laŽ£“×­ý„lSæô·¼°T™lÁœ× mL¾SWwéMÈ|ôžŽô·³0MÈ=Âxñ¨wp߃2ÓQÛï¿ÝŽëºÐïd¤_øæz;»NŸºýïbëæ›Ý¥3‡}P†‹zƒ>(c¡¸Ù¨'ú÷¾pÓ·ní'd~¿yá¢ùìe×]m2¢žã¦Éõù]šQšðüsúŠG½Õ×\9¿®Kosæw»dÔÓÀâAæJÃTWÔ´L@#kì\¨76Îr†U«Ë øP»™âD "*N@|Ф¨"H]Ýaj]A&ÃÕË´¶h @Q½ 6QéßSïÒ0p²ö8ù ãjÝÚ¿v~qõF¸tÅ…ºJÿ-ç-Òìµä™zœotÔóß}oܨç8ó{Ũ4²ÆÁÎÕ)Œzc3á,g¶º ¢µ›)n¡A¡ ¢±èˆšU©«;L­+Èd¸z™Ö D(ªÄ&Š#}Ô;~d‡Â+mGf»¹ÌrßBqõd ýO¥XYµòÒ~Cœ[ ^;|Ss¡MÜÆ[?ãFõüñ„07ð½óÄž_¶ã°®”™¢ž sœ>õèŸß2±ã1ùF/ÂZWµ@#kŒ\]è76β…U«oïû>rË9òÆÛ¢µ›‰n¡A¡h™_xöãŸÓ=߸ƉÆpz=ñA“¢Š u¥ò©;ßµþ«—Á`8&Õg2\Lh‹ Õ JE“>ê w²Þñ#;üñ±Oœyé[²ÈÎï[T܆•¸·^7¿ #çÌÜ­Œkùò«Ÿ¾;^ÿ³nçFÔ™—f5´ÍOXôé·–F=ÿŒ<¥YÍ~ú­ÍBwϵ6÷ÞyÛï¿Ý Šuk§æwiaÖuƒ23PÔÛ5û¹Þ#læ}0nj]AÔrà7²fÁÂÕAŒzc3í,[XµúîùzïÏž|…ñ–ƒâCífŠ[h/ZçÛ·Ë¿7nZãD˜`W„ø IQEP»’xêÄ“ò›½zù0ŽIu™ W/ÓÚ¢E5‚ÌD1‰zšÌÎ1QÏ”QÏÙwn;#àÏÐXTÜ´UÙ¨§'ú¹f§Ï?5OÓ›ž¸§ŽyH·Öÿ|Û¹A¹~Þü»à¹²æîöûo“ ~˜Ó-ËL7"ô½ü ®ZyYÞ¢ÝPöÖ%?½£ƒût¹ÍKŠ.À=­YJŸ]× Fz˜ê ‚š–ÈdÍ‚…«ƒõÆcÂYÎ0lõ1êQû™èFÖaÔ£ÁL›+M@|Ф¨ H]©0êÍ1­-èPT#ÈLSýQïà¾ûõü8¹¬[ûnüÌKßÒ'¹'Ù­¾æCºH®ÈL7Þ?®wRž¬"‹„l\nú[^l.·iqÓm^0ùŽÕÞgVèîõ³Zošž£'#~­[µòÒþª½®§§ïéL”ùýÝèòæ¿çÝÆ[?£›êOx‹N{t„ÜÔ\0ùÎí÷ß&«ëˆ‹ƒŽ«„nkõÖõÏ¿“Kÿÿ\n{Z6¨ƒÛï¿]è*o½ÞŸ3p]ðÌKûܸЀ7âU¹Âõr…y«›õÆcÂYÎ0lõ1êQË™âfŽ6bÔ£¦ÇÕB@|¥¨ H]©0êÍ1­-èPThLYýQoÝÚ¿Ðú¦úŸ,Ñ—+þxÿ´¸E+ºEnuüÈÙæ¥+þ@Ïæ;¯wöÜÂRc®Êyi¯&¼t¦uýÇ8¸ï}ë½ &ß៑ç?²SV9oÙ[„\‘›0Aå»Xµò2Yý‚ÉwÊ´KW\8ìøäîd©Ìq÷uæ¥ÙÕ×\éÀYxrS¶,óeËëÖNõï}aé™—öÙu:W}þW¯¼é,oÄ«r…1êå óV71êÇ„³laÕš×ŨчÚÍD· °w´£^§™‚ø KQºR‰õLª+Îd¸™Ð t(ª4&Š,ÈËoÙºùæþùd‹N4æê[,‹\õä+ŒÃ%¶àž:¼yö‰[çozIn­ŽzÉÛVg1êÇ´³laؚǨGmf¢[h˜?ZŠQ¯sLt M@|¥¨ ¨]©4$ê™ W/ÓÚ¢EuÀDñ5)ê }¯}—=D·Ð ·-­YQo1/ɃQ/Kض:‹Qo<¦e ÃÖˆSTÔ®´õ’€ EÕAQ¢äõª€ÜÁ¢â>ú×uº±œ>õèê/þÆ®ÙÏÍ`­+‚ZrËc)F½¢L;ˆ­Åžxò¡ko{û¡§÷Àx Aú¡¶2Ñ-(l(Ýð½W¾+ÿnüícaœ2b2Y³èˆâ•µ+¹ï¾è ~kgj]A&ÃÕÈ´¶h HQE“(mŠzPÜ"€âÁ¢â>\ž«Öº‚ ©%½¬0f‘bÔ+Ä„³laØê2H?ÔV¦»…%…(-SÇJ@|§¨¨]aj]A¦ÄÕÈ´¶8 HQu“(ŒzU@q‹£[húÀ0WÖº‚ ©%½,X²ÈaÔ+Ä´³laØê2H?ÔJ&º…=…(!ÓÅM@|§¨¨]aj]&ÃÕËä¶8 HQEÐ’(Œz¥An‹£[húÀ0WÖº‚ ©¥½¬°d‘èWˆigÙ°ÕY~¨­Lw « Q*&Š5ø NQ9P»ºÀÔº‚L†«—Émq@“¢Š %Q&õJƒÜF·Ðô€a® ¬uE@SKzYþ0c‘Q¯Óβ…m«³ ýP+™èV¢$Lk=ñAœ¢ vu„©u™ W#ÓÚ¢&EU@H¢|0ꕹ-,nèÃ\슀¦–$³üaÆ"£ÞÒL8˶­Î‚úC­dº[PØVˆ"3!¬MôÄ}ŠJ€ÚÕ¦ÖdJ\Lk‹šU!‰òÁ¨W·°¸E  s¥a­+šZZÐËò‡ ‹£ÞÒL8ˆ­Î‚ôC­d¢[P˜Wˆb2 ¬}ôÄ}ŠJ€ÚÕ¦Öa2\½Ln‹šU‰²Â¨W·°¸E ls¥a­+²ZZÌò‡ ‹£ÞÒL;˶­Î‚úC­dº[PYˆâ0ñ«­ôÄ}ŠJ€ÚÕ&Øa2\½Ln‹²• ‰rèW·°¸E ls¥a­+²ZZÌò‡ ‹£ÞÒL;˶­Î‚úC­dº[8ØYˆ"0Ù«ÝôÄ}ŠJ€ÚÕ¦Öd2\Lk‹²U ‰rÓš¨Å-(n`q‹@ØæÆtúÔ£~ËÄŽÇ>cj]ÐÔ’ƒd–9 Xd1ê-Í´³laÛdïû>rË9òÆ[êµénAaméž_xöãŸÓ=߸Æ)Ó¼ZO@|Ч¨^9øÔïZÿÕË`°F¦ÖdJ\Ln‹²•ýˆ2ĨWä¶8°¸EðÛþøÛÎíêk®ꄎ«í÷ßK]³Ÿë=ÂfÞg‚]ÐÔÙ¸aÍêkV9{vÞêÉ,°ÈbÔ[‚ gÙ°5Ä=_ïýÙ“¯0ÞP¨•Lw kK'}ûàvùwãÆMËaœêgjWGèˆú jWž:ñ¤üf¯Þp.Œ×ÈÔº‚L‰«‘Émq@™¢Ò Q†õÊÜ·~ÿò×½þì~Mÿb»ÞÆ[¯?gâ ²èÒyi?,uBD½ÖÈ]Ÿ·ì-šó.Xþ»ó;¹ fÖ ’Yæ°^Ñ@ŒzK0í,[ض†`Ô£Æ3Ý-(l.Ĩƒé\¢G >HT4.¨]9È5ê™ W#ÓÚ¢2Eå@<¢<1ꕹ-Ìmq\yÓYo;ÿµÚËΙxÃñ#C°»`ò2ƒ ö¨·õ®¿’ý¹tÅEþ Ü”AF=Ö+ˆQo ¦e ÛÖŒzÔx¦»…ƒÙ¥«õ‚3‘«kôĉЯµ+¡£ž©u™W#ÓÚâ€2E¥A<¢<1ê•Å-Ìmqü—­¾íüמõ ?sÞ²·¼æ5¯¹`òìV_seȨMmŽîŒ}±­ìIȨÉ,s˜®hF½%˜v–-l[C´<êAý¡ö1Ý-(,/]ŨÉ[ݤG >HT4.^9`Ô‹Ê•刲ŨW·0·ÅñƒÓ{ÿü¯&Þø‹{vn=§ÿJÛ­›×ûÁ.IÔÓ=±Qïàþ¿9óò¬T³Ìaº¢aõ–`ÚYž°m ǨGÍfº[8_:ŒQ/Ó¶:K@|¨h\¼rÀ¨ Ä)*Êe‹Q¯(n`n‹¥—íúm몕ï—+ç-{‹ìFD½í÷ß!KÅ_þo~ÿò×AÔÓEbûwèȺ¦ä¦|usLV›£Q¯àIy²}™©îÿXªdÜÍý]ê/™ëeÞàÕ‘3/Û Êu9¸›Þ\wÃ5:G?úˆŒè¢Öú‹j…ÝŠF`ÔÅ´³laÛŽQšÍ¤·p°¿t£^ýLÕê8=ñA¢¢qAðÊA–QÏd¸™Ö”)*²åŒQ¯(n@k‹f!êÉõùš¶ð‰rÝF½ƒû¾vÞ²·Èøª•ïߺyýäo“µ~å×~îàþ¯¹`·qÃ܇lȶ޵^®ë*2ÒÛàȨ§oŸ'—ÖÀ" Û\wÃ52S?LcµI«>Ô‹•²Í=;ïÑërÑÓõã8äf­¹d¶qÃZ;(×ûëõV”ë2Açôèâ/]ñž­w}^îH®ËÒãGqêƒÝŠF`ÔÅ´³laÛ®ÍQêµéná`‚é6F½š™¤EzâƒDEcÚ• F½8 NQ9(gíˆzPÜBƒÜ´¶8æ²]¿Uõ¢ÞºµSrýï3F½óúïy·ýþ;ôæ®ÙÏé§mô ×\Ôºeg^Þ/#îE¾óçë-ªo>½ ¹\°üwÝK•Ìéíª·T7îNÄZñúçÓÍh1t¯íÕ;òû1xéŠ÷¹)[»“A]ºõ®ÏËR¹;½)äNeDößÔ£ƨ7ŠigÙ¼5£5˜Ioá`…é6F½Ú˜˜EJ@|P©h,P»24ê™ZW)q52¹-ˆST4#Ê£^ Û"€ÖM/ÉùQOhºrŸ˜a£Þº~øó?RCßSïŸüÓŸq÷b[õz«Ï­l,§«løóõd rÞMoã†5²HÆýAݸ<~t—¬Ûß…92¸º÷*Ú¹­õüHwpÿ6á–ÊÁyyzïuŸ¬‡ÑŠFcÔÅ´³¨T4^™È/ê™ W#“Ûâ€8E%@0¢ü1ê•Å-hmÑô’D=¡§ÈõZØ ¨§¡Ê½öVìÚ׋zïþƒ7Í­µ¸ßÉW7âûÓ°¯ ³õ®¿Ò;•¯îŶ:"Û:Mç {—=Ÿ®R<ê ,t2SïW÷ÁÑì¿øW) ‹-‰Qo(Óβ…mk¤ÖF=@Ô2¦»…9¦óõ*1‹,=ñA¥¢±@ðÊ£^Ч¨F”?F½ ¸E­-š^’ó£ÞS‡ïú‡¿{üÌKûµFÉ"ÑkdóýNè"?jÔ»hŹ2~^€¨'ô ìú[›+tzsã†5²ÈÒ9r/þ*ysÚÙˆÁþÆ•F=™à˜[,V´$F½¡L;Ëæ­‘õ¨‘Lw ‹ 1êUaê ¤G >¨TTÔ®|„‹z¦ÖdJ\Ln‹ú j5£^ PÜ"€ÖÇ\’ÓʶgçÖǬ—ÃÝÛþT×ÍbÆ¥+.õd‚ñÏÔë¿Y^ýQO,œ?Ø¿©»±Ç{A®¥Þw蜺¢Œ× sÁ¨7”igy¶µF=j$“ÞÂÁ(CŒzå˜nE#èˆBÁ+Œz¡AŸ¢ Q#0ê•Å-ÈmqÌ%9õŽ»O WÞtÖéSʸ6¬sôƒ&æ'»ñU+ßïF4êé{êù ¯\Ô;óòÕÞY8ÎúŸSÑ»©»á¬­åµ6\äèvö»ƒ£ž Ê¢ÞÊ,úÿ³÷ÿávU÷}ï«{sÒ8½iê¤u’ºþÔŽ{O°c«$oomÚ©ŠÌOËÔÄÇÿø~×úî=öØŸïZs͹æsŽ9æg=¯g=k9æ\sK íÉû™kÍ 0WQŒzc™|–&l[“0êQ÷˜îvbÔ«ÌD+*¦G >UT¯t$õL† Èä¶f@Ÿ¢ª QW0êU¹­Ûš1—ä\Ô“ÇŸÛþNy?Ìîý¤ï6h@”“ÞâÁ4CCßî{òïÆ7Ø ã4š)V4‘ø TQy¼’rå­gýÑ]çÃ`}&Ø•aJ\@&·5U©ˆº"ƒ¨Ñ-6Èm €ÖÖ˜E‘N/|ñø“·Èûáâkßð£ÿùˆ<ÕO¼úýNiÀÚ¨ŸÀ¦: º•§28ìn ƒ%£ž¼Ä0Ÿ- ÊÈ`O¼™ºòÒZñŽݳ~Ýôƒ 6;y9 ynŽË|z…\™½ó ?þá¹—É«fΖA¿ô zPúŒÃWŸ«xº©áOºhæ´°UQIŒz£™v–,Ì[ý ˆrbº[<˜fˆª2­ŠJÒ#„**‚W˜`W†)q™ÜÖèSTt"êF½ª ¸5Z[cynㆵšÆN[~êöm›däS7üÚð-q•<Ö+fì:ðgZ¸Î\ñöõë.8såÛe½WÌmYnîd=p8.½ùüªÎ‘{bBŸ¹òî<µo÷Ý ¬óý³ð”ãçÂÏ×: ¼Û:×õ4PêหÙÊYªs”[=lUT£Þh¦% óV?A¢œ˜ô¢JL¨¢òôÄ¡ŠÊƒà•=SëJ2%. SÜ‰Šª‚ND¨W·@kkÆBžÛ·{»’Ç2²ÿÑ-ò–øÔ ¿æOÐÇ@mܰvýº †m!ç©C¶<ØÂ¢Á¹ËÂze :øU™°~ݱuËåó|nZÁeõ1sæ’Ùì_¥z²ž>2y80¢Õ¡ƒwë uìè7·nÙ ›’{y KkÀPEå1êfÚYš°mõd ʉIo‘` !ªÄT*ªD@|ª¨$^}`j]I¦Ä…br[3 QQ%‰¨[õª‚âÖÈmÍÀBçüè>rñµowÅþG·À¢Ñ·¼rü¬Ö.hgÉÂPEå1êfòYš°mõ4 ʉIoñ`£!*Ï$*ªJ@|Ъ¨$^}`j]¦Ädr[3 RQ%‰¨[õª‚âÖÈmÍ0mÎ3»÷“ò®øÜöwÂøhìÊ€²Ö"hgiÂJE•0ê`ÚY²0oõd ʉIo‘`£!*ÉÄ)šŽø UQI¼úÀ»2L‰ Èä¶@¢¢J Qç0êUÅ­ÛšaÚœç¥^põ«åñï܋ֺ’ ¬µòYš°RQ%Œz#˜v–,Ì[ýˆ²aÒ[hUT¯>0Á® Sâ2Å­P©¨(DÔ9ŒzUAq‹ Z[cLž[ìÖ»?,oŒ/þÙ`a­+ ÊZ[ ¥ UŨ7‚igi¶ÕO('&½Åƒ±†h"“¥¨=ñA«¢’ xeÏÔº’L‰ Åä¶f@¥¢ò Q1êUÅ­ÐÚcòÜb'ž¿_Þ\ýjy‹ÁZW”µA>K&*ªŠQo“ÏÒ„y«Ÿ QNLz‹c ÑD¦IQMzâƒVE%AóÊž©u%™ŠÉm €JE•@¢.êzÔƒè·@kk†is£|nû;å½±ãëk`|‘a§;ñÂýÛ´ôÞo}Ú+w ¬µòYš0QQUŒz#˜|–&Ì[å<øÐí^³Lîa¼« Q6Lz‹{ OÿÕS]ûÆ_»Æ{Ê)ªO@|Ъ¨ ^ úÔM§oºí\¬ÃÔº2L‰ È·@¥¢ò  QG1êUÅ­ÛšaÚÜ(ßùÎíòÞ¸øÚ7üè>‹ ;ÝžW Þa;ÿ£Wî @Ykä³aŸ¢)0ê!ÓÎ’…y«œ÷ ~íÉ=Œw” ʆIo‘`¯¡Q>4+ÿn\yóJï#S£(=ñA®¢2 x¥æñãÉßì%[Nñ:L°+Ô¸€Lqk„**Úu£^%Pܹ­¦ÍqÕ-§ËÛãÈ··ÃøœùN×ͨù,Mاh ŒzÈ´³4aÛ*-«¨ˆ²aÒ[<˜lhF½Ó¡( =ñA®¢2 x¥&xÔ3µ®$Sâ2Å­ª¨ÈUT4¯ÔäõLnkT**Âu£^%Pܹ­&ÏMg¾ÓU‰zPÖZ-A§h:ŒzÈä³4aÞ*Q:ÀÔ·H0ÜÐ}z¦@Qpzâƒ\Ee@óJMQÏ”¸€Lqk„**Âu£^%PÜbƒÖÖ“ç¦3Ÿê:õ Ÿ¥ ãM‡QoÓÎ’…y«4F=JIo‘`¸¡ñzõL~¢ôĹŠ&‚à• F½ TQIP…¨ÓõʃâÖhmÍ0mnjó©ŽQo¢cG¿¹o÷ñâ³ÎÃ2EScÔ[Ä´³4aÛª"Ÿ¨%ˆ²aê[$Ønh¼þF=Óž(=ñA±¢‰ x%ˆQ/8UTT!ê4F½ò ¸5rÛ‚Ö®_w3{Ç 0¡Óæ¦ã¥º¤¢ÞÆ+Ö­_·ÆyñÙ‡Æ-š½ó &¥Eñⳟ¹òK†7yÝ‚A–)š£Þ"&Ÿ¥ óVŒz”4“ÞâÁ|Cãõ4ê™ðDñ舊MÁ+Aa£ž©u%™Š)n €PE%A¢®ëtÔƒè·@n[0{Ç §-?U‹ÏšÕç¾øÌ˜PƒÉsÓñR]騷Þ♽óÆ…?ºóÞç/:tð«nѪ™³G‘¾4ô»‘ƒÐ¤¨&F½EL>Kæ­*õ(i&½E‚ù† õ1ê™êDQ鈊MÍ+AŒzÁA«¢’ Q×1ê•Å­ÛÙ¸aí’%K–-= ÆË“-¬_w b››šW뚉zzž Ž$3çþèÌ¢Ù;oœ_äG´&ÈÎ3êÅ÷m‹Qo“ÏÒ„y« F=Jš©o‘`Á¡B½‹z&9QlzâƒbEAóJPQÏ”¸€Lqk´**ze€Q¯<(n €Ü¶È¾ÝR3ê¶üÔQ«›Kæ­Šõ(]¦¾E‚‡&éQÔ3±‰š¡G >(VT ‚WšrŽz¦¸5Z•1ˆòÀ¨WD·Ø µ!õ^|总t†~ËÞ±#»õéÖë>㦩óŸÞu«Wèı#÷É®¾°höŽaùÐyÿî­güÌ9k^ûüwpK_|öàxøæ/_"‹Îš9eãkå©[:{ç®è Gôò28—ØtÄ ;ºÇÈc7M¸OÔº Ÿà›:êÍÞù·q¸Œ†»È†<Б­[6èȱ£ßtÓ|‡Þ­„L^sÞûä¥å±?§ êÍÞyÓúuU‡κqáÆeŽ<=vôþW|BGüiùÂlWŒQoÉgi¼U£%ʤ·H0âP }‰z¦4QcôÄÑŠŠAðJSÀ¨gj]I&Æ…bŠ[ WQƒ(Œz%AqkÀ¢g–-èˆÜïÛ½C§­9ï}2.ƒr“êÌ•ïpÛSD=Ù”mÊy9Ý¿µÍÞùݹ?tðnÝ&÷öBº«fΖEr/‹6^±ÎMö·)t›‹Ýê´åoZ¶ôu¯øÄÖ-ô"¹~°“AYªƒÛo¹VëS¹ws2…Á® F½&Ÿ¥ óVE9D=ˆA”Sß"ÁŽC%ô"ê™ÌDMÒ#D+*Í+MŒzaA®¢‰ Q6õJ‚âÖ€…T7Ò¸ßj’ûU3ïÔ‘­×}FFävèÀ]nšuÍêƒf·}Û&™¼fõûô©Ø8<­Ï¯~BW—AYêæ¼õŒŸùÔ ¿öãÖÝX5s–ØsàªßùèÏÿÒßÿYÔ„7ߪ¢Þ‡_Š7\ˆznP·£#/>û·¶0sîÇñFÆ©õd—†ûp¶ÙºeƒæÖ•“Ç2òâ³ë® ãÂL{RžÌ”aPèêÞà ]iÑ;vô~³´ÙéyyjýºÊˆì³L–™Ã=¬å&dS]yŒz L>Kæ­êõ(Q¦¾E‚)‡JÈ?ê™ÆD Ó#D+*Í+MmG=Sâ2Å-6ÈUT” Ê£^IPÜà·¶Š£ž+zþàÆA}[”uÍêƒZ'“eÜ—§t²?(Oe›ƒ07?²ç·\¸ñÉfÿ£[æcÖÛüÃÃ'^¸ýõo¾ùË—:øgšðæ[Õ䨧A N»;vt¾ºÿY]ÝC÷´€Ö7¹é*@Ç]Vú©[ø­NöG\ÔÓ¢§d]Ø lÇ®+æO¸›õ´' ãBÒZsÞûaP£Þ²¥¯{ñÙ‡uäØÑû÷íþ²›ŒtU1êÍ1ù,M˜·ª{ô±]—~þm‡ŸØã]1ˆ2`Ò[$˜r¨œï?÷=ùwãl…ñL˜ÀDÍÓ#D+*Í+YWÞzÖÝu> NÁ»2L‰ Å·@®¢2 Q6ºõ ºÅÅ­~k¡8êÍÞqƒ¸…Á¹´äüø¯ïÛ½}~³s©NɈŒËRD@ûûʽÿUÞ0WÝrº¾âÖ-Ÿñ²Ý‚…ýY,Šz0(ìdÝ÷´€«o0.¼E em$™#3¼Û躲cnÄ úÔŸ¦¹ñáO´0èý˜òtаN[þ&ÙºeƒWµæž,‚hÙÁ<7F½9&Ÿ¥ óV?A¢ ˜ú Ö"S—¨zâƒhEÅ yåÍÔº’LŒ Å·@®¢‰ QNõJ‚âÖ¿µPõd©œõUNæèfeŸŒÈøÆá'mÕüêsOÕ‰çï¿àêWË{æÍoþåánl÷²ÝÙàÜþ, NõÖœ÷>72·?ÞœqÆG½ Î’9BæÈLyàˈì˜qƒþõŒ¼áž/LÞOº0èý™ÈÓAÉÒOÚž¶üM`ø* Ÿ®Õ¨'÷n$/æê`Ô›còYš0oõÄ Êƒ©o1`Í!2i‰Ú¢G >ˆVTšWöL­+ÉĸPLqk+š2å„Q¯$(n±¹Ð6VÔ¨'ó÷íÞn½øÌA×ïæWŸ{êÜ:ûayÏ,{ÃßîFɨ7hj^ÀZm^êZ:YîÝÈÜþxsÆñB,õ^|öa½>†ÕW—ÛQO×…x'¼ŸtapñäAÏÒ¨·uˆ}»¿l¹ì•uÔÃ*W£Þ“ÏÒ„…«‡ QL}‹ƒõœéJÔ"=ñA·¢м²gj]¦ÄdŠ[l«h"h@”F½’ ºÅæBÛX±£ž‹tã̯ŽãßùÎíòžùû'ÿÔp7âF=|n¼9ãTz2¨÷/b+Oe¦,r#ºîàn~Ä úÔ=‡Kgï']ô~̹¤¥QÏïw#åõ0ÉÕǨ7`ÚYš0oõô Ê€©o1`Сž3Q‰Ú¥G >èVTšWöL°+Ô¸PLqk+še†Q¯ (n p¡m¬ QO½Kâ’ܾ1ß©gÉœÑÓ~xøs;ÞùÊ×ÿäp7âF½W¬s#s?ÎÁ¯º‘q¼Ð‹FG=}-¿è }¹)¢žþD0M¬š9[Ƈ?é ÷g2Wµô“¶¯ø„)Ǩ‡1.F½“ÏÒ„y«Ÿ Q×™ú 6ê3S”¨uzâƒnE yeÏ»2LŒ Å·@±¢b€(?Œze@qkÀBz'TÔó.©1Wåt|ëuŸq# FdÚðÕFæüððãGnѨ·çÞ[æ³Ý"g®|»,~¯œŽ<ùâ³éëB¿Ó¶jæ,Pè«;ºÇ‘™þõpÇõmdÔÓ×òGôš¶r›"ê¹ëáú—Ó}ñÙ‡eDÆ'F=­u§y×ÄP‡Î ÷4»¨‡%. F½“ÏÒ„y«‡ QL}‹³õ–ÉI”=ñA·¢м²g‚]&Æ…bŠ[lP¬h"@”F½2 ¸5`!½³qÃZmC0>²ßˆh[·l˜_„emørƒ§³w~AFæü…¨çj#+¡np¸«ƒ®'+ÊÎë™zîUü™Ðæô¸2_+Þ±£÷Ëô/‰»æ¼÷_Û_7a† ‹QoÀä³4aáê!èA”SßbÀ¬C½eZ%B@|Э¨4¯¼™ZW’‰q¡˜è+šå‡Q¯ (n XHo#mܰV£Ò0î¼Ó}„vÍêsuP–nß¶ÉÊŠ:(d-݈܋5«ßçœ<öÁÒŸ9¨YMn§-?uöŽÝ"mvkÎ{Ÿ.ýù_ø¯X«ƒ@s•ÜdãòøÐÁ¯º~ç×:7¨ãòôÌ•ï€9J¶ ãþd˜ 6^±N§ÉM~ ¯Ù~˵n‘¼Ê¡ƒwkYsãºeYôâ³ëþ~üáÇrµô Wä6]e-ß7ñ\Ý Ì‘‘Å?þ`š<®*ƒ¯ó?o»o÷—õC¸ºHÈÓÙ;ord²†?¹­9ïýn¼ƒ0ÀÅÀ¨7`òYš°põô ê:Sß"Á²CýdB¥C@|Эhh^Ù3µ® SâB1Å­P¬¨ÔÊRG£D·Ø ¸Å6Ý :p×¾Ýâ¼øÌ÷]é9¨ŽÙ½qÃZ¡çèùddëuŸY¿î¹·K÷¹$®;Üsï-ïÿø?x×Ç~ñÐÁ?;ñÂýÛ´ôÞo}Ú=5{ç²}÷Yy öíÞ1<ým®Áiê’ûC¿ºñŠuò`ë–ËÇ‚'ã2GŒ› d;ú‹_hѼÛ_äœ8vô›úê®ô¹É:MîÝŠBçŒt¶nÙ Ô&(äðgί8¸¬­ÿÑZ%ƒë×}TØ‹fÈd]KÁÒîÀú £„³daÞšÖƒÝ~á5Ë䯻’u©o1`Ù¡êžþ«§.ºö;¾v)Œw‰©H”=ñAº¢q y%îS7¾é¶sa°ìÊ01.SÜÑŠŠAý¡,1ê•Ñ-¶…èÖ …`W‹×ì^:ñàñãw˃=®¼ÃvþG©g¡¸Y.êÁxh ­-=ºzÓ[<ŒzÐÎ’…ykZ;îüÚ“{ïèA”àbÀ¸CÕ=|hVþݸòæ•0Þ&!QjôÄéŠÆæ•²Ç?&³—l9Æ+1Á® ãB1Å-6(VT ÒåŠQ¯ ˆn±Ank†ÉsÓÁ`7À¨WÔ®>À³daᚣ¥ÂÔ·0îÐTºõL?¢éˆÒÍ+eŒzõA´¢b~(WŒze@t‹ r[3Lž›»Â¨q éå/zõ võF·Øõ % ×´õ(&ÀÅ€}‡¦Òá¨gâ¥I@|®hh^)«õL­+Ô¸€Lt‹ ¢€îCcÔ›Š[ ·5Ãä¹é`³˜:êm¿å³î‚î«÷"€Ž–^ÙÃâÖF=hgi¼UCW£ô ê:Sß"ÁÄCSéjÔ3划¥G >HW4d¯”åõLqkt+*݇2ƨ7·@nk€isÓÁ`7g꨷~Ý, :ZR yå s[3úõL>K®õ( ¦¾Å€‰‡¦Õɨg²¥L@|®h$h^‰cÔ« ¢ƒîCcÔ›Š[lÛšaòÜt0ØÍ©óñÛF@GK4¯¼akk £^'`áªQ’`\ XyhZÝ‹z¦QâôÄõŠF‚æ•8F½š ZQˆ>”7F½‰ ºÅ¹­&Ïñ¥›¯ùøEv>ð¾ÿ¿þ«ýÊ›–½jÙßøÇÿï_r#¿ô‹¯XRîö²—ýÔŸóOM† RZ: {e C[“õ: W ŒzÔ>SßbÀÊC50êQlzâƒzE#AóJ£^MЭ¨DÊ£ÞDÝbƒÜÖ Œwã¼ìe?5Û¼}ü☠t´¤@ùÊV¶†1êu®:õ Q×™Vª¡cQÏ#JŸø ^ÑHмW3ê™ZW†)q¡˜âÖèV4Ê^£D·Ø ºÅ¹­ïÆÑÊvƪŸSÿþÂWœõ+§pÙŸžtÍ}'O$/Ñã¨å+W˜Øš×ë¨gÚYš°pÕèGí3. =TC—¢ž©EÔ zâƒzE#AöJ£^Э¨Ê£ÞDÝbƒÜÖ ŒwãhÔƒô£^î°¯µ‚Q/}X¸êaÔ£–™ú†ª§3QϤ"ê =ñA½¢‘ {%ŽQ¯èV4äêF½bPܹ­Xî 0ê5úW~0®µ…Q/}X¸êaÔ£–™¶ª§QÏt"ê=ñA½" šWúõê€tEã@î¡>`Ô+Å­P܀宣^S åËZ‹õÒ‡…«žîE=HBÔu&À‡­‡jë@Ô3‘ˆºE@|°È‚敾|¢ž)n €tEã@î¡>`Ô+Å-6ÈmÍÀrW »¨)-À2ƒY­]ŒzéÃÈU£µÉ¸0÷Pm©G=Sˆ¨sôÄ‹,h^é«õL­+ÃĸPLq‹ º­‡z‚Q¯D·Ø ·5Ë]F½F@Ë 6µÖõ7ê™v–&,\µ1êQ›L€‹‹ÕƨG±éˆY½ÒǨ75HW4´ê F½bÝbƒÜÖ ,wõ,3ØÔZǨ—8,\µ=úØ®K?ÿ¶ÃOìƒñtA¢î2õ-Ì=Â÷Ÿûžü»ñ¶ÂxL¢.Ò#,² {u•·žõGwƒe˜`W†‰q¡˜è¤+ Bõ£^1ˆn±Ank–»Œz€ – j)`ÔK®¾*Df\ X|(o¦ QGéˆY½òf‚]&Æ…b¢[T®h=Ô‹zÝbƒèä¶`¶+öò¿ý³K–,¹ü®×A}‹ä=ÿ‚¼ÜÌ9¿mb\Ò,'XÓÁ¨—8Œ\}Uˆ:Í¸à°øPÞL¢îÒ#,² {åÍ»‰L‰ ÅD·Ø ]Ñ8z¨?õŠAt‹ Š[0Û;鵯Z²dÉú[_ õ-F½Œ`JK£^ʰpõT!ê.àbÀèC3Uˆ:M@|°@óÊ› ve˜Љn±Aº¢‘ òP¯0êƒè·`¶+ƨ´°<`GK £^ʰpõ T!ê4à‚ÃèC3IˆºN@|а@öÊ› ve˜Љn±A½¢‘ òP¯0ê€âÖ(n ÀlWŒQ/2haÙÀŽ–”žF=“ÏÒ„‘«o  Q§™vʘIBÔuz⃆E²WÞL°+ÃĸPLt‹ Ò‰‡ú†Q¯·Ø ·5³]±Œ¢Ô´D@ ËF´Ô0ê¥ #Wß@¢î2.ì>”+Óƒ(z⃆E²WÞL°+Ãĸ Lt‹ ꉇú†Q¯D·Ø ·5³]1F½È ‡e Z‚õR†‘«o Qw™vÊ•‰A”=ñAÃ"Ù+o&Ø•az\&ºÅõŠF‚ÄC}èW¢[lÛ€Ín"F½˜ ‡eóYšõ’……«‡ Qw™¦Ê’)A” =ñAÃ"Ù+c¦Ö•ab\(&ºÅõŠ,è;ÔCŒz ºÅÅ­Øì&bÔ‹ ŠX0Ÿ¥‰Q/YX¸yð¡Û/¼f™ÜÃxr  Qw™Ö êé¿zê¢k߸ãk—ÂxÓL ¢lèˆù {uȧn:}ÓmçÂ`1ìÊ01.Ý¢‚zE#Aß¡bÔ+Ñ-6(n Àf7Q.QjZ" ˆu¶³dõ1ê™|–&Œ\ì¸gðkOîa<9†¨»L€ Ó…öð¡YùwãÊ›WÂx£L¢œèˆ2ù {uÅãÇ“¿ÙK¶œãÅL°+ÃĸPLw‹ êYw¨Ÿºõ ºÅÑ-6(n Àf7Ñ?ú‡'/Y²díM¯úɇ6ü=y¹Óßþ/L•« jZ  ˆu†³”1ê% #W ŒzÔ(àbÀúC¡µõL¢Ìèˆ2ù {uE磞‰n±AÀ" âõ£^ˆn±Aqk6»‰~ã×uÉ’%ç_ýJ¨o‘È ÉËýƯ¿ÅT¹š ¨¥¢X×a8K£^²0r¨G2.8¬?AËQÏ Êø c‘²WW0êU‹,ˆ;ÔOŒzã@q‹ r[3°ÙMĨ D±NÃj–8F½4aá §QÂu—ipÁa¢ÚŒz¦þP–ôÄ‹|½ºbЍgj]&Æ…b¢[TP¯È‚²C½Å¨7D·Ø ·5ƒ]YD=¨i)€(Öi˜ÌÒǨ—&Œ\á0êQsL€‹EÀ¨G±éˆ2ù |u£^%°È‚²C½Å¨7D·Ø ¸5ƒ]Œzq@ë4Lféë]Ô3ù,M¹ÂaÔ£æ˜ Š£µ¨gÒåJ@|±Èå«+ºõLt‹ È:ÔgŒzã@t‹ Š[0Ø•Á¨t±îÂ^Ö ŒziÂÈ£5Ç4¸à°QíD=Ó}(cz⃌Ed¯aÔ«È:ÔgŒzã@t‹ Š[0Ø•Á¨¤±ŽÂXÖŒz ÂÂT¢„!ê(à‚ÃDÑ´õLô¡¼éˆJ9½:„Q¯<XdAÖ¡>cÔ¢[lPÜ€Á®ŒîG=¨i)€4Ö]˺‚Q/A¹‚bÔ£†˜f ІQbÓ#”,r {uHÕ¨gj]&Æ…bº[T°@Ó¡žcÔ¢[lPÜ€Á® F½ u–²aÔKF® õ¨!¦Á‡ˆ¢i:ê™âCÙÓ#”,r |u£^yа@Ó¡žëPÔƒèD·¨ ·5k]I G½‹®•¼Ü?ú‡'›675j)€:ÖE˜Éº…Q/A¹‚bÔ£&˜f Š©Ñ¨grõø d‘å«C:õLt‹ h:ÔsŒz#At‹ Š[°Ö•4sο[²dÉ{.þ¨o‘¬¿õµòr'½öU¦ÍM ‚Zë Žuf²néWÔ3ù,M¹‚J=êA¢Ž2 .8,ASsQÏ´ê =ñAÉ"ÊW‡0ê•‹"F½‘ ºÅÅ­XëJbÔ êXa#ëF½Ô`ä Qš`\XX‚(2F=ŠM@|P²HAöêF½’ a€ CĨ7D·Ø ¸5k]IzÔR¬s0u£^j0r…ƨGÑ™– Ь¡¨gBõ‡ø f‘‚ìÕ-•¢ž©ue˜ŠénQAÃ"Ô"Á¨7D·Ø ¸5k]IŒzAA ë" d]Ĩ—Œ\¡=úØ®K?ÿ¶ÃOìƒñT@¢.2 .8ŒAÙ÷Ÿûžü»ñ¶ÂxH¦òP¯èˆb)(_så­gýÑ]çÃàH&Ø•ab\(¦»E‹|Psˆ£ÞHÝbƒâÖ¬u%1ê¬s°Žu£^j0rõ ´!ê"à‚ÃDy0•‡zE@|³HAùʘ ve˜„‰nQAÃ"5‡H0êÑ-6(n ÀZW£^PÐÈ:ëXGõ(ê™|–&ì\½yˆºÈ4¸à0QL⡾Ñ#Ä,RP¾2f‚]¦Çaº[TаÈ)‡H1êÑ-*Èm ÀTW^—£µÖA ëLcÝŨ—Œ\}yˆºÈ4¸à°Q×™¾C=¤G >ˆY¤ |eÌ»2L Ât·¨ c‘R‘bÔ º[TPÜ€©®~ч—,YrƪŸƒú¼œÜL¡›4µvA#ëŒb]Ǩ—Œ\½yˆºÈ4¸à0 Q§™²C½¥G >èY$ |eÌ»2L ÂD·¨ c‘ãõ„Ix£žÑ-6(n ÀTW^g£4µÖA&ëŒb]×—¨gòY‚0rõ ä!êà‚Ã$Df²õ™ø g‘€ò•1ìÊ0=.ÓÝ¢‚ŒE>l=”1“íŠ1êYÝbƒâÖLuå1ꙬC°ˆe€Q/¹ú uŽipÁa¢N3Y‡úL@|гH@ùʘ ve˜„énQAÆ"£åǤºòõ,ˆn±Aq‹ ;]%Œz@)ë,b`ÔKF®8|èö ¯Y&÷0Þ>(DÔ9¦Á……Iˆôô_=uѵoÜñµKa|z¦éPÏéˆz (_]ô©›NßtÛ¹0h™`7‘‰q¡˜î”,r0QNL¤«ŠQÏ‚èD·Ø°ÓU¨d²Á–F½t`äŠcÇ=ƒ_{rã-ƒHZå«‹õŠAÉ"…Uˆ:Ê”¸)=ñAÒ"(_]T&ê™`W†éqA˜î”,R‰¨+Lª›:]%Œz¢[lÝbÃHW£^=Ë:X~õR€‘+&F= Ì4¸à0Qãõ(6=ñAÒê9(_ŨWb)LEÔ &Ø€<7F=Ñ-*(n ÀHW•F½_~Ëß<ÿêWNtî'~ñŒU?§þ݇~~åæOtê¿ú™ð+?­ô;õõÚƒ ,?ùG=SЄ‘+¦ä¢"êÓàÂÂ6Dm¨õLÁ!z⃪ÕsP¾:ŠQo(Yä`-¢Ä™fWÂ\Œzº[TPÜ€‘®*zUoÿô7þ¦¼‹ÞvöÏÎ=¯x{ÙË~ê…ãšZWdµvA/Kö¯,1ê¥;WLŒz˜Épaa¢6ÔŠz&ßYz⃪ÕsP¾:*NÔ31.ÓÝ¢‚’E ƒ¥Ì4»äêcÔÐÝ¢‚âÖŒtUýÕÑ=ÿvÅ¿ú_ÿÕ2dæÇ/þð%¿÷Ÿ>tÅß—wÑ¿ÿÐ?þøÅ)c˵—ÍÞy£óÈþ»Lª+²Z‹ —uö¯,1ê¥;WLŒz’ipaa¢–0êQlz⃪ÕsP¾:ŠQoˆY¤0Q²L¶b\(Œz>ˆn±AqkFºiü°šv¾wî¶ó½¦¸ÅY­]ÐËÒ‡ñ+WŒz­ÃÈ£…d2\X˜‡¨%ÓG=ÓnˆFÒ#T­žƒòÕQ£ž ve˜„énQAÌ"…åˆÒdÊÝHáÂbÔóAt‹ Š[l&ÏMÁ4»bßùÎíòþ9oãàL=F½®Áø•+F½ÖaäŠ,­¨…ˆ:Çd¸°°QK¦Œz&Ü£G >¨Z=ñ«£õF‚’E Ë%È”»‘ ÀÅÀ¨çƒèD·ØL¡›‚ÉvÅ>uã¯Éûç¿ßºbðëuÔƒ^–>,_Ë<Ꙃ– ì\‘1êQ0¦Á………ˆÚèG±éˆªVÏAüê(F½‘ f‘Â~D©1ñ΂ôOúQº[TÝbƒè›)tS0Ù®ÀžWÉ›çâkßðÝïή¿þÍòÔD·Ø ¬µ’Yú°|eŒQ¯uع"{ô±]—~þm‡ŸØãí€HDÝb2\XXˆ¨=ßî{òïÆ7Ø ãELµ!* G >¨Z}å«Ó®¼õ¬?ºë|tL°›Èĸ Lw‹ b)LH”ÓïD·Øõ|Ý¢‚âÖSè¦`ÊÝ8?úÁ#_ûyóÜû­O›ÖÖ(k-‚d–8Ì^ycÔkv®^HDÝb2\X‰¨CL²!*¦G >[}å+c¦ÙMdz\¦»E1‹&$J‡éw·0êù »EÅ­¦ÐMÁÄ»qný°¼s>u㯙ÐÖÈjí‚j–8Ì^Yù¿£^»0rõ D"êÓàÂÂHDÝb’ Q1=ñAØê3(_3Ín"Óã‚0Ý-ˆY¤0$Q"L¿ÐÚèçƒî·˜B7ïF:~üî ®~µ¼sŽ<µÃ´¶Æ@Vk$³Ä™ –ò|ŒzíÂÈÕ+‰¨[L† #uˆé5DéˆÂVŸAùÊ• ve˜„Ioñ@Ì"…-‰R`€ÐÖ$F=t·¨ ¸5ÀºªL¼çs;Þ)o›?úÊ0¡­IPÖZÕ,q¦ˆu—éw#1êµ ;W¯@$¢n1.,ìDÔ!¦×M¤G >[}ñ+W&Ø•az\&½Å1‹¶$JIx>HlÍcÔs ºÅÅ-6Sè¦`âÝHûÝ"ï™ ®~õ‰öšÐÖ$(k-‚j–2ÓÅ:Ê”»9G=SЄ«W Q‡˜F"êkˆÊÐ#„­>ƒø•+ìÊ0=®>ÓÝ¢‚žEsµÎT<ôµV0ê9Ýbƒè›)tS0ýÎúÑYý›å=s×}kMek”µ¶@5Kœ©ccšÝDŒzíÂÎÕ+Љ¨CL† ;u…)5D%éˆÂVoAùʘ v™„énQAÏ"ÌIÔ:Sñ(k-bÔs ºÅÑ-6Sè¦`žõø‘[ä ³vË?ýÑ1•­IPÖZÕ,q¦‘uˆ©u%1êµ ;W@$¢n1.,LEÔ¦Ô•¤G >h[½å+c¦ÙMdz\¦»Å=‹%j‘©x>ÈjíbÔs ºÅÑ-6Sè¦`žõ£<ò•]ÿõ;ß¹}øB[“ ¬µªYÊL&ë Óé*aÔkv®^HDb\X؉¨+L¦!*O@|жz ÊWÆL³›Èô¸ Lz‹z ìJÔSñ|ÐÔZ—xÔƒîD·¨ ¸5Àº),îw%Ì%¶/ìýئ¥÷~ëÓn$>(k-‚p–2ËÒg ÝõZ„«>tû…×,“{ot"ê“áÂÂTD xú¯žºèÚ7îøÚ¥0¾À4¢JôÄm«· |uݧn:}Ómç 0Á® Óã‚0é-èY„]‰Úb*ž‚Z õènQAqk€)tUa°›h!±í9pÕà¶ó½þ`dPÖÚÕ,e¦—¥Ïä¹édõLAKv®Fì¸gðkOîa¼iЉ¨CL† S¥ááC³òïÆ•7¯„ñ¦ÑU¢G >h[½ñ«Ó?þ˜üÍ^²å&Ø•az\}¦»EI‹0-Q+LÅs ¥¥ƒQÏî·ØL¡›6»‰[ãQÊZ‹ œ¥Ì$³Ä™675F½açjDQ"uˆÉpaa*¢4Lˆz&ÐU¥G >h[½ñ«Ó‚F=Óã‚0Ý-èY$°.QóLÈs £%…QÏîD·ØL¡›6»‰*£^òL2K™©r51êµSW#õ¨“áÂÂZDi`Ô£ØôÄm«· ~u£žza]¢æ™ç@DK £žÝ-*ˆn±™B7lv-T6F½ä™p–,“äêcÔk v®¦0êQ-&Ä©ˆ’QõL!š‚ø mõįNcÔóAÒ" LÔ0ò(h bÔSÝbƒè›)tSÀf7ÑBeëkÔƒp–,Î’ez\ŒzmÁÎÕF=šžÉpaa-¢dŒz&ÍMG@|жú ÊW×1êù i6&j’ yä³41ê)ˆn±At‹Íº)`³›óÒ‰¿øg8~ün÷+£^ÚL;K)qåõLAKv®¦´õ Q‡˜ #J£ŦG >È[ýå«ëÆE=ìÊ0=®>ÓÝ¢‚¤E˜™¨1&ä9ÐΒŨ§ ºÅÑ-6S覀ÍnÎ}å?È;ä®ûÖ._TÙšzPÖZí,M&Ÿ%Èd¸°õÚ‚©«)Œz4=“áÂZD)õL—!ššø oõį®cÔs gf&jŒ y„³”1ê)ˆnQAqk€)tU- v Ž<µ]Þ\ýê/Ü¿xÑ¢ÐÖ˨í,Y¦ ¥Æ4¸àõÚ‚©«)Œz4%“áÂZT‹(1Œz›ø oõį® õL ¤·x i–&jŒiy ªYâRŽzÐÝ¢‚î·ØL¡›Â¢`·àS7þš¼=f÷~Æ!´1ê%ÌD´¤˜£^+°s5ˆQ¦d2\X‹j%fDÔ3Q†¨=ñAÞê'ˆ_]Ǩç@Ò",MÔ Óò$³ô1ê)ènQAt‹Íº)`³˜ÝûIyo|êÆ_ûÑEÚõRe"ZRL}‹„Q¯عĨGS2. …TDIbÔ£ØôÄy«Ÿ ~u£žI«ç°4Q3LËSÐË:QOAw‹ ¢[l¦ÐM›Ýá/Üñµo÷Æ_<~,ZÚõRe:Z:Lz‹‡Q¯عÔrÔƒND]a2\X ©ˆ’„QÏ¢šôÄy«Ÿ ~uÝȨg‚]¦ÇÕgº[<´c5À´<±¬+õt·¨ ºÅf ݰپuöÃòÆøÜŽwÂø¼E¡­Á¨e­-ÐÎÒd:Z:Lw‹*èg Z‚0u5ˆQ¦a2\X.QšE=“cˆêÓ#ä­òËWõ$-ÂÞD±™–§ ”u£ž‚îD·ØL¡›Ââf÷ïÜ.ïŠ ®~õsÏÜ ‹† ´1ê¥É¤´D˜è£^+0u5ˆQ¦a2\@~<¢41êQlzâƒÂÕC~ùÊC ¨gz\&½ÅI«ç°7Ql¦å)Èdݨ' ºÅÑ-6SèªÂfwøª[N—wÅŽo¬ñyÚõdRZ"Lqk£^+0u5ˆQ¦aJ\@~<¢4-D=Óbˆ‚Ð#®òËWõT­žÃäDQ™–§ ‘u£ž€èD·ØL¤«jq³ÛÿèyK\|íF]CAh{òÄ {×_ÿæ=®‚ñ ®µ Z‚LMKÉmÍ`Ôkv®f=úØ®K?ÿ¶ÃOìƒñ&@'¢®0.,èG” ï?÷=ùwãl…CŠø põ_¾²qå­gýÑ]çû#¦ÙMdz\&½ÅU«ç°:Q<¦å)d]Ĩ' ºEÅ-6Sè¦à»ýà½>ÆmòǃÐÖ$ˆk­€|–&ÔZgZ[cõš‡©«? QW˜ Ä#Jš 1D¡èˆ Wùå+c¦ÙMdz\&½EI«ç°:QT&ç ¨cŨ' »EÑ-6Sè¦à»¯ìú¯ò~¸ü¦éÚq­-Ïd‚ZëLhkRnQÏ´aêêHEԦĄوRfB Q(zâƒÂÕC¿²d‚]¦ÇÕgÒ[Øýè<~ä–ñ×ÇPÚšq­PÐdšZ»Lbk£^ðsõ¤"ê SâÂrDÉ2 †(,=ñAäêˆ_¹2Ín"Óã‚0é-[}†í‰b09O@Ë£ž€îD·ØL¡« ›ÝDÚš}­PÐd²Z‹L_k£^Ã0uõ¤"ê“áÂÂrDi2ý…(8=ñAäêˆ_¹2Ín"Óã‚0é-¨Z=‡ù‰bèAÑŒzº[TÝb3‘®*lvAhk ĵ¶@AKÉj-2q­-Œz ÃÔÕP‹¨L† Ë%Ëô¢àôÄ‘«o ~åÊ4»‰L«Ï¤·x jõ¶'ŠÁ=9,ŒzÝbƒè•)tSÀf7´¶Æ@\k´™²ÖSÖZ”UÔ3-A˜ºúju‚)qa9¢4™øBƒø rõ į,™`W†Irõ™ô„­>ÃüDÁ™œ' …eƒQ¢[TÝb3…n Øì&‚Ö6pâ…½Û´ôÞo}ƃ‚¾Ö (h©1e­E¦¬µˆQ¯a˜º÷àC·_xÍ2¹‡ñè Q'˜Æ#JÓ0¸<}ü©‹®}㎯]ê QXzâƒÈÕ7п²ñ©›NßtÛ¹úØ»2L’«Ï¤·x lõ( Ëä<!,'ŒzÐÝ¢‚è›)tSÀfW BÛœ=®¼Ãv¾ƃ‚¾Ö ˆh©1e­-&«µ‹Q¯IعڰãžÁ¯=¹‡ñ¸ Q'˜ –#JÓ|pyø±YùwãÊ›Wº¢°ôÄ‘«o\ËÉãÇ“¿ÙK¶œ¢OM°›Èô¸ Lz‹ªVŸa¢àúTô£t·¨ ºÅf Ý0ÛƒÐ6‡Q/ &®µÂ4µÖ1ê5 SWõ¨,SâÂxDiš.Œz›ø rõŠ«`™aÔ#…ŠÂêQÑû¡ºõÞÿ¦¿8õÑ-6SèªúááÙ½ŸÜñ5‹Ë]msâG=ˆk­€‚–×Za‚Z õš„©« ŒzT–)qa<¢yÁ…QbÓ#t®^q,3)F=“Þâ°Õg¡( Sô„ia5—ð,F=ènQAt‹ÍDºª~xø‚«_-o€Åå®´¶9Œz 0}­&¨¥€Q¯I˜ºÚÀ¨G¥˜ Æ#JÐâà¨G±éˆ:W¯¸ –?ê™`W†Irõ™ô„­>ÃE¡˜œ'LëŒwã¤õ »EÝ-*ˆn±™HWÕë`q¹+­m£^ÛL\k…©i‰È'Ꙃ– L]mh!êA-¢N0%. ìG” ÅÁ…QbÓ#t®^ñCXNõH`‡¢€2)zØì&bÔƒîD·¨L¡›£^ÐÑ’búZóLJK£^“°vµQJ1%. ìG”\õ(6=ñAçê?„å¤ÏQÂVŸa‡¢P:_ô0ՕǨÝ-*ènQ™B7…jQBÛ‚D=ˆh©1‰­y&¥¥ƒQ¯1˜ºZ¨G“™ ö#J .Œz›ø sõŠÂrR/Ꙅ©o‘@Øê3LQD‡‹º)ô<êAt‹ ¢[l¦ÐM¡QúZ+ ¢%Åôµæ™Ž–F½Æ`êj £MfJ\@Ø(5¦¶F=ŠM@|йzÅa9I.ê™ô„­ÞÂE¡t2êa››£^c ºÅf ÝõÊ‚Ž–“Øf"Zjõƒ©«%Œz4™)qaB¢Ô˜Ú"õ(6=ñAçê?„å„Q0EQÝ+zXåjbÔk D·ØL¡«j˜êô à•»ÐÚ0êµÊT¶†™ˆ–F½Æ`êjIÓQju‚)q¡`?¢Ô˜Ô¢õ(6=ñAçê¿‚eÆE=ìÊ0I®>“Þâ¶Õ[X£¨¾Ž=ìqA0ê5¢[l&ÒU5LuúðÊ]hm rzÑ’b[ÃLAKP&QÏ´aíj £M`J\@˜(5&µ(F=ŠM@|ºúBXNzõ lõÖ(ª¯KEK\@Œz蛉tU S¾¼rWZÛF½ö˜ÊÖ$“ÏÒÄ¨× L]íaÔ£ L‰ %Åt‡QbÓ#¤®þ€–“QÏô¸ L}‹ÚVoa¢úºõ°ÁǨ׈n±™HWÕ0ÕéÀ+wã@h[$fÔƒ¾Ö èhé0•­a&Ÿ¥‰Q¯˜ºÚèG˜V$JŠé,£ŦG >H]ý!,'iE=“Þâ¶Õ[¤¨&½yŒz±ìÛý¥Åþ¼øÌ pò‰cGv{…n˜i½øÌÁÿõa¹ß·{ûD‡üÙ¢–ç k¾¼x7´¶EõZb*[“L;K£^30uµ‡QŠ˜ &$JЉ,>F=ŠM@|ºúBXNõz›Õ”zÑÃôO‚Qº[TXâZ5óÎ%ó·eKOòéàúuh¤›½ã†Ó–Ÿªƒ0SÆ·oÛärž*·åÃr¯Oa)<•—XÔòœa­Ó7€ïÆÖ¶È‰ö®¿þÍ{\ã!@_kt´¤˜ÐÖÎRÆ¨× L]íyô±]—~þm‡ŸØãQ@0¢ô™V$JЉ,¾ï?ÿ=ùwãl…q¢PôÄ©«? „eæÊ[Ïú£»Î7Ín"“äê3é-[½…AŠjZ\ô„ij-Âè£^Dšê†ÕlQ•;sÅÛeÜE=±o÷Ÿ Ûyà]•ÛzÝgÜ *±å¹¨'sôÄ=¡!oßîíútÕÌYóñZžš¯uúpOǃÖÖHlÍƒŽ–ÚšdÂYÊõšµ«' QúL‰ +¥Ã¢†éˆRW@Ë’iv™$WŸ©o‘@Ûê-lRT‹Þb}ŽzØà‚[¿îü‘éíØ‘ÝË–žäG=1_Ü¢žÐ“òd‘?(\°ƒqoËsQoöŽ]ªƒ¨§#Œzõ@JK‡ m1Õ,qŒz ÀÔÕŒ(}¦Ä…‚‰’b QÃôÄ©«' ~eÉ»2L’«ÏÔ·H mõf)ªƒEo1F½ˆÆE=±qÃÚÙ;nðGFF=™#ƒr;tà.|\ÔÃ-BžÌÖÀ…Tg£Þª™³Î\ñv÷tÁ|­ûÔ¿vñµopOǃÖÖHl̓”–ÓÚcªYârˆz&¢¥SW@0¢Ä™V$J‡É+DÍÓ#Ô®ž€þ•%ì&2=®>“Þâ¶ÕOؤ¨ŽÅEO˜²Ö mMbÔ‹¨ êY#£ÞÈ劂¨7d"ÝzcÍ׺ýà‘—N<螎­­Ð×Z)-&´5Æ$³ô1ê5SW@3¢Ä™†$J‡É+DÍÓ#Ô®ž€þ•%Óì&2I®>“Þâ¼ÕO˜¥hj,z£0êE42ê­_w»î­¯àL½á w ƒbdÔó¶l"ÝÐQ¯hm¾Ö×6êy[6…n£^hÒÒar[3L/ëF½`íê F”8SâÂDé0m…¨zâƒÚÕп²dšÝD&ÉÕgê[$жú ³MmqѦ¯5 ãZ[õ"Ò¨·lx1 5²Ü)»HËݪ™wºGÙ²)tóæç0ê…)-¦µ5ÃIJ®`ÔkÖ®ž€fD‰3%. I”VˆÚ¢G >¨]=ý+K¦ÙMd’\}¦¾Ey«Ÿ°LÑtXôÆcÔ‹ÈE½õë.P§-?u>½a§ÓâæG:±õºÏÀ4å¢Þ¨-›B7O_brÔÃf7´¶Æ@bkÔ´D˜ÜÖ ËÒö”³çÀ×èõ"ÁÔÕÐŒ(q¦Ä…‚!‰Òa Q[ôĵ«' åÇ»2L’«ÏÔ·H oõÆ)š‹ÞxŒzÙß;²{ÙÒ“ ¢ÞÖë>#Kå^ž ûÁ[¥QoÌ–M¤›§/Ñ|Ô;ñÂÞmZzï·> ãõ@_k¤´D˜ÖÖ LfiZy¾ÎG=ÑRƒ©«m>tû…×,“{ ‚%Δ¸€0$Q"LU)ðôñ§.ºö;¾v)Œ…¢G >¨]}ý+K—Ýtú¦ÛÎ5Ù®€éqõ™ôä­~Â8ESX\ô„©lM¦Ö:F½ˆF^(cdÑóÅmn©^"CnÛ·mrsõÄüº&ÒÍk+êí9pÕà¶ó½0^$¶æAMK„ÉmÍÀ|–¬x€Q/6¬]mÛqÏ¥ò·,÷04#Jœ)qaK¢D˜ªRàáÇfåß+o^ ãD¡èˆ‚W@ÿÊÏãÇ“¿ÙK¶œbÊ]“äê3é-h[ý„qŠ¦Ã¢W(µ¨Ý-*lpÁŒzã@Ô«fÞ)#2îFœ‘Qož‰tóâD=hm#0ê5Èä¶`DKÆ»qõbÃÚÕ6F=Á”¸P0$Q"LR)ƨG±éˆ‚W@Ë£^aœ¢)°èMÒÛ¨‡.†‚¨·jæ7¬õGlÔÓOÔÊàúu¸AUõVÍœ5ܲIuSE½Ù½ŸÜñ5þˆ­mF½¦˜ÜÖLi)ÀlWŒQ/6¬]mcÔ£LŒ [%Â$•bŒz›ø xõ$°ü0êõö)ªjqÑ&´5;ZRõ"õ´ÖAª³QO¸“õd|\Ô;vä¾ù-›T7UÔ»àêWËÀ1 µcÔƒš–SÜ€A­uØì&bÔ‹ SWõ™¶$Jé)1êQlzâƒàÕÀòè×7اh ,z%0êE¤IΦ7Mr½3õÜIyõܸlÊ/±e“êæ£ÞðŠº¸h¯ÙéÀ1 µ!êAbkÔ´D˜âµva­+‰Q/*L] h"êA3¢Ä™ ¶$J„é)1êQlzâƒàÕÀòóDå¨gz\¦¾E…«‡°OQU‹‹ž0¹­XÐĨËöm×hD“ûõë.pÎ\ñv”›ëw/>s@#ÜäÁÈ“òä&d¦Œlß¶iÒ–ñ\¼cGî[5s–.=mù©‡üLX°¸ÙéƒÜ6£^#Lqkfµ¶`§«¤ÛQÏD´Ô`íJ£!ãBÁ–D)01¥ F=ŠM@|¼úX~’ˆz&½Ey«Ÿ0QQU,zå0êŲ~Ýùóº›O ˜½ã|x&ÝBÔn‘ÌôŸŽóâ3!ÕÉ6aLX°¸ÙéƒÜ6£^#Lq‹ ËZ[0ÒUŨÖ®0êÑ"¦Ä„9‰R`bJŒz›ø xõ$°ü0êõ &*ª„E¯4F½Øå¹øL¤«jq³Ó7 .¹m„ì¢Ô´D˜èƵæaž›£^TX»À¨G‹˜æ$j))%1êQlzâƒà•=è_YbÔëLTTUËQÃYÊõbƒè›‰tU-nvú€A´¶Ñõâ3Å-6ìkÍÃ675F½x0u¥Q1%.ÌI”SRJbÔ£ØôÄÍ+{п²Ä¨×+˜¨¨½*õbƒè›‰tU-Îvú€A´¶ÑBG=Hl̓ –ÝbÃÄÖ0 su0êŃ©+ Ñ£4#Jœ‰q¡`N¢Ö™ŒR£ŦG >h^Ùƒþ•%F½^ÁJEå-.zÂD·¨0™¥Q/6ˆnQ™B7…ÅÙNß0èÜ6£^|&ºE…‰­I˜äêcÔ‹kWõh)qaQ¢Ö™ŒR£ŦG >h^Ùƒþ•¥þD=È[=„•Š*aÑ«(©¨Ý-ènQAw‹Êº),Îvú€Aä¶Ñõ"3Ñ-6 mÁD‡£ž‰h©ÁÚ•F=Z`J\(˜“¨u¦¡T¨G±éˆšWö åç™ÊQÏô¸úL}‹ Wa¥¢òÚ,z{Y'0êÅÝ-*SèªÂfǨgAPK‰nQahk ƸPõâÁÚ•F=Z`b\(X”¨u¦¡T¨G±éˆšWö åçF½>ÁPEåµõ0–u£^lÐÝ¢2‘®*lvŒzµ˜î¶¶f`‰ ˆQ/¬]iˆõ QâLŒ ‹µË”ªõ(6=ñAóÊ$°ü<è×'ª¨$½©0êÅÝ-*éªÂfWõ µuâ…½ë¯óžWÁø´ ²5 ‚ZëLt‹ [[30ÅŨ Ö®d<úØ®K?ÿ¶ÃOìƒñ0 QÊL‰ £µË”ª¾ÿü÷äßo<°ƉBÑ#4¯¼AÿÊ’¦º+o=ëï:ß+wL’«ÏÔ·H põ †**¯µ¨‡™¬[õbƒî•‰tU kÝÖ-ŸY¶ô$õòWü„Ðǧ-?uýº ޽¯jÔ [VÍœíþ@fï¼ ²ÚiËß´léëÔÖ-`i|¦»E…¹­Øà‚cÔ‹kWO@6¢”™ %j—©'D Ò#d¯¼AÿÊ’iv™$WŸ©o1@áê! UT‹Þ´õ¢‚蛉tUÍÕºÃÛoÙ´dx{û9ûw>úóûvoŸ½óÆ3W¾]F–-=Ižö*ê‰5ç½Oÿ@N[þ&“ÕæºÞ¾Ý_†ñF˜îæ¶`€‹Q/¬]=ÙˆRfb\(•¨]¦ž%H@|½òý+K¦ÙMd’\M¦¾E…«‡°UQI,zÓbÔ‹ ¢[l&ÒU5õIJ¥'-Y²äÃëÿÙÅ×¾Á j×;mù©Ã§Ûš¹­ë×­6½Ám㟀²¶æ¼÷/[ú:l„énQaq‹ ë[$]z&¢¥kWO@6¢d™F%j‘I'DiÒ#d¯¼AÿÊ v™$WŸ©o‘@áê!lUT†WôŒzXÇ:ŠQ/*ˆnQ™B7…ùx'4êí¹÷–—N<è·nùŒ Ê¢á‡p!·5s[3Ö¯[#?õšóÞ?üñ_÷â³ûqmýºæõ°¸Å†é-F½H°võd#J™)q¡`T¢v™tB”&=ñAöÊ$°ü˜f7‘Irõ™ú ®¾ÁVEe°èÕèt·¨L¡«Ê+zB£Þü'mçÈSœ‡ÜÖ ÌmÍШwìèý§-“üø«fÎöã£^hØÝ¢bÔ‹ƒW@6¢”™ F%j‘é&DÉÒ#d¯¼AËiv™$WŸ©o‘@äêÌUT£^==ŒzÐÝ¢‚tUyñND=Y4|º(·iö:mù©r/Öœ÷>˜°ý–ÏêÒ3W¾Cç ?Æ;X´uËå:"Üü‘ƒîš²‘ÿðÈö[®]üŠƒ·ñŠu:âú¼[÷Aוû}»wÀ ¿Ý·û˳wÞ$äæ_1c\ÔîÞàëöܽŒøt\Èä©nÇ)dº[<Ý¢Âè£^ X»z²¥ÌĸP°+Q‹L7!J–ø {å X~L³›È$¹úL}‹ Wa®¢‰XôjcÔ‹ º[T&ÒUåÅ;±lTÔ[5s– ž¹òí®²Í·¶³dþö[>«Oõ²2è&È"äÅgÒ æ&lÝr¹LðG„®å úÚÆ+ÖÉ ¬¾jæl±ý–kÝU,d‘^‘v!ÏíÛ½C6xæÊw ?B{äØÑoÊSqèàÝþ4à¢ÞxT֕ǧyWÌõdP¦ÉÎèSw–Ô:™ ƒkÎ{¿,•{Ùs‘›½Òîb&½ÅƒÝ-,n `Ô‹kWO@6¢d™ F%j‘‰&D)Ó#d¯¼AËiv™$WŸ p1@áê!,V4Q Q£X×¥õ ½ÅÝ-*ènQ™HW•ïÄ2õfï¼QO[~ê‹ÏtÝMhž·0¨«:øU}*k ·¶ÃM8vtÏðl»¹§²H&ÈZndÔà ¯é Üü³ð4„ÉÌW¬ƒA=§Ïј¨EOi%„iÀzÇŽÞ¿léëä©»b†zzB߸AÙ‚Ôö'ƒÃø87¨ÝpÍyïw#£˜ô¦·x°¸5€Q/¬]=划eb\(Ø•¨E&š¥L@|½2ý+K¦ÙMd’\M¦¾E…«o0WÑD,z!0êEÝ-*éªòŠžÐ*·æ¼÷­_wÐ6<ÕN',¤7ìÜàúukäñ‰ö¾jéËÜÓ‘ªF½áàBtÛºeƒtçô¹我~Ô®Äé3lÔsçßùƒB¦É¸ý\ÝÔ0).LÓAÿdÀQLz‹»[<˜ÛšÑɨg"Zj°v¥äÁ‡n¿ðšerãuA6¢”™ v%j‘‰&u<}ü©‹®}㎯] ãD¡èˆÊWÆ eÉÕºËn:}Óm级c˜$WŸ©o‘@äê,V4QÓQsXõ¢‚tUyEO,ó¢ž~êVF¶ß²i~Â\w;vtŒ‹}»wøæÏ5œ¾·çÀUo=ãgä©ÜdS²Š[Ý‘Udé°¬ úšŽ sµµÉ½,r¶ßr­þnšQOègieSòØF=]êÇ;¥,~ÂÓ~'÷nÄ F=“ÞâÁô ¶¶Æ0êÅ€Á+%;î¹Tþ–åÆë‚lD)31.ìJÔSLjzø±YùwãÊ›WÂ8Q(zâƒò•1è_ùqµî‰ãÉßì%[Nq#c˜$WŸ©o‘@äê,VT¬é¢'0‡åQ/ˆn±™HW•WôIJÅ¿ÝxÅZy*ƒ‡þÙpdQw“ÛiËOµôKôö¸JÞEgÍœ¢Û”û3W¾cöÎÝFÜv†e­`pÐ×tP6îŠ[ùAy¬”VÁ×êieó£Þö[®•¹ÍÞy“zzFž?_ÙZ§#rïFÜ`QÓ[$ښĨ¯”0êõ)q¡`W¢™bR£ŦG >(_ƒ–Wëõò†ÅŠ&j:êa Ë£^<Ý¢2…®*/ç) p›®ÿ/;¾±FGÎ\ùöai:uøt\wA£Þ ;ß{ìèž5ç½O·,·­[.wsFnÇ úZÉ~7rPËÈðSÀ ÓÊÐÊ‘Îv'KGF={¥ [ëtDî݈ìMÔÃÊÖ0F½à°v%†Q¯ïLŒ »µÅä’úõ(6=ñAùÊ$°ü¸Z—}ÔƒÈÕ7X¬¨‹^8Œzñ@w‹ÊDºª¼œ§4½½ëcƒ7€ŽÌÞy£ŒÈÍqîã·nÄrQϸÏóºâ–ˆzs}­NÔ›ÿª»…+l”¤• ¢ž»bÆiËß42êAªÚýïÚ›*ê™ô Ö·H°²5ŒQ/8¬]‰aÔë;ãBÁ´Dm1¹¤>F=ŠM@|P¾2 ,?®Ö1êå £k4êaË £^<ÐÝ¢2‘®ªÅEO,F½ßùèÏËÀ z'ë-¤7é—>°çÀU²?ê ]kßüå5÷»9šF=½tÆpƒ ÓÊõ„Ž·¹(깓øüA¡±Ï¿Ðmï£&¶æ1ꇵ+1Q¢d#J™‰qA`W¢¶˜V£ŦG >(_ƒ–WëZ‹z¦¾E‘«o0ZQF‹žÀ –F½x »Ee"]U^ÎSÝ ê¹“õüëØêE$N[~ê‹Ï>äüªŒèçí9pÕË_ñÿùÂá– Y*/á_4C_Ñ}מ,Ò462êA˜+_úôU6^±Î”aàFÀ¸¨'N^¢Þì7éà±£÷à ¤:ݲ^p[ŽzXßbÀ¾ÖŠîE=ÑRƒÁ+1Œz½fb\(˜–¨-¦•Á¨G±éˆÊWÆ åÇÕ:F½Œa´¢bF=L`ùé[Ôƒît·¨L¤«ÊËyB/‹!··žñ3òð¹Oκú&N›¿…,Õ@&õÒ·B£Þ/ýýŸÝ~ËguDϘÓËh8.áÉŠB¶¹o÷mpÃ]_4D—¥nPæÛAý°­ ;úM7¸uË”›l_6%+Ê}-7Ç8ª›‚óé”^1¢žÐUN[þ¦Cgåéì7É1ò‹ùdüÅgvƒó{¾hpž©o‘`€ ãZ[õ‚Ãà•F½^31.LKÔ JBaÔ£ØôÄå+Wпòã׺rQÏ$¹úL}‹:W¯`´¢,z¡1êÅÝ-*éªò²ÝÖ-Ÿ9mþ‚°¯|ýOþÊÿçoúK_|öà™+ß¡KýÜ®_·FF– ¿_O&øÉoÏ«d#ÿð—Q—jDž+77ÁY5s–NzÞŸN¾Ö†“œ>UZëFj„A5{ç4;êÆeÏÝ¢‘VÍœ}Úò7)ÿëð™ „A±ý–k‡/4hyº®âžð·ì¶0rÐcê[$Øà‚øÖF½à0x%†Q¯×LŒ ӵń’Põ(6=ñAüÊ$°üøÁ.﨑«o°[QF½ÐõâtUyÙÎwñµo7ÀìÞO.ÇWÌ^(£: mÍ‚¬Ö.SßbÀ–µ1ê……µ+=Œzýeb\(˜–¨-&”„¨G±éˆâW® åÇvŒzÃnEã°èEHÔƒôt·¨ »Ee"]U‹šÝ‚ýn‘7ÀW¿úÈSÛ½q(n0ê…cê[$Øà¬Ö.F½°°v¥‡Q¯¿LŒ ÓµÂT’€õ(6=ñAüÊ$°üøÁ®¨gê[$¹z»`Ñ‹€Q/ˆn±™HWÉB­áÖÙË{`í–úÒ‰‡#Û&ëxÔƒ¬Ö.SßbÀfµv1ê……µ+=ᣔ#J–‰q¡`]¢V˜J£ŦG >ˆ_¹‚–?Ø1êå »ã½ÈQ³WÞõ"蕉tU-®xàG?xäò›þ¥¼ >·ãÃÈm“1ê…c\ Øà¦ֺŽE=ÑRƒÁ+=Œzýeb\˜–¨&‘„ŨG±éˆâW® åÇvŒz¹ÂtEã4Tôf¯¼1êEÝ-*éªZ\ñ¬çž¹÷c›–Ê;aøåzÛ&cÔ Ç¸à°Á……A-ŒzaaðJ£^O™ Ö%j…I$a1êQlzâƒø•+H`™`W"ê™$WŸ©o1@äêLW4’Wô"G=l^ÙcÔ‹º[T&ÒUe*žå}¹ÞSÜ&`Ô Ä¸0Ã……A-ŒzaaðJ£^O™ Ö%jžé#Á1êQlzâƒø•+¨`™fǨ—%LW4NCQƒW0êEÝ-*éª2 o$ïËõö›èVäÄ {×_ÿæ=®‚ñÒ ²5 ÊZ‹L€‹3\@XÓÁ¨Ö®$=úØ®K?ÿ¶ÃOìƒñéA<¢4™Ö%j…é#Á}ÿùïÉ¿ßx`+Œ…¢G >ˆ_Y‚–Óì^ºòÖ³þø®óaÐc’\}&ÀÅ«W0]Ñ8M=Á«õ"tU™~7’ûr½¿xüÓÝ¢‚ÊÖ$Èjí2.8ÌpaJK£^@X»úÊ%Ëô¸ °.QóL!ê"=ñAÿÊ$°ü˜f7‘Ir5™ú t®^ÁtE#yE/fÔÃÚÕŒz‘@w‹ÊDºªL¿ç¥>~äÝbƒÐÖ$Èj-2.,qaJK£^@¼úÊ¥ÉĸP00QóL!ê"=ñAÿÊ$°ü˜f7‘©r5™ú t®þÀtEã4QôÖ®žèUÔƒît·¨L¤«Ä”»I ¸5B[“ ¬µÈ¸à0Ä-)]Šz&¢¥ƒW@<¢4™ &jž‰#D]¤G >è_Y‚–Óì&2U®&Sßb€ÎÕ+˜®h$¯èÅŒz˜ºúƒQ/ènQ™NW 6»bÛš¡­IPÖZd\pXâBÁˆ–F½€0xõÄ#J“‰qA`]¢æ™2BÔQzâƒþ•%H`ù1Ín"Såj2.è\½‚õŠFbÑ‹,…¨é-ènQAw‹ÇDºª0ÛƒÜÖ mM‚²Ö"Óà‚à F´Ô0ê„Á« Q‚LŒ 5Ï”¢ŽÒ#ô¯,AËŒ v™$WŸ p1@çê¬WdyEQ/F½ »Ee"]U˜íŠAnkT¶&AVk‘ pÁa‰  Z‚õBÁÚÕ(M&Æ…‚‰f²QwéˆúW– ‚eÆ4»‰L’«Ï¸ sõÖ+‰E/>F½ »Ee"]U˜íÙºå3§-?uÙÒ“yºæ¼÷™ô„¶(Žý檙³ýsø“¾éØÑûM_k…ipÁaŒ  Z‚õBÁàÕ(M&Æ…‚‰f²QwéˆúW– ‚eÆ4»‰L’«ÉÔ·H uõÖ+²¼¢-êaáê!F½ »Ee"]U&ä9«fÎZ²dÉÆ+ÖêÓcGï;mù©2"÷.º?>{×}ë^:±ß„†.¸}»w Þ©‡Þ­#¯X'?¦Üöíþ²ék­0 .,,q¡`>K£^(¼J˜y×ÌÒ“—XqÆ ¹ùšÍþ¸òÔX¤RŽzûvïÓF=(kÇŽÞ¿lé릎z[· NJ4êaŒ ÃYÊõBÁàUή»wìhbõWϼkÆ‘i2¹8êíܱsíÅkí {•‚¨Wig µjç—?cOOÇ+`b\˜¨a&ˆÄƨG±éˆX~ åÇ4»â¨g’\}&ÀÅ©«?0`‘=êaÛê-F½ »Ee:]% Á­9ï}òÿ‡Ë–ž´o÷öùAÈm þ¿ÿæ—_þŠŸxͲÿ×É'¿ZVÙºår©F½™ÿòVYtÚòSõã®BÏø“ÉúT¸UÎ…6w-‹áçXlݲÁÍÙ·{‡›¶ý–kõ%ô^&¿øìÃn©%sä'•/_Èjà ¾Iæ ÿ@iŸì‰~8WÉdYÅ-ÝxÅ'dV÷?Š«Û×uÑp‡ç–bƒ {\ÎRƨÖ®Ò :šU&êä>“+§‹z#@H`ù–Óìõr‚‹‹^ƒúõ »EÝ-éªò*8vô>­]r¿uËg†ƒ ÎwÚòS—.}íïnx«¼U®ºå_Ÿ¹ò²ÖÆ+Ö¹ {\õËoýiP¯D!+êÓ­[.×Ò§jû-Ÿ\hmnÅ5ç½O^hýº5º“.êé9qà O·ßr­Î×§#i¾”Ûª™³½oÖsMí衃³ûvYcœ2Ó©çÖuìßá÷ëÓùvçô™Ƹ °š%ŽQ/ ^¥ìhû÷îú/ŸöGÔÔQO¿OÏà«õ`gä©Lp6oÚ¬ñhù[–ëÈàSº^TZý¡Õ:¨K| væœÁ:Ü·A!uPÈÓm7nó_e×ì.7S^Eö\wÞY{ÉZoýùÊmÐÝˈ?Á½œ¶B¹×§n$u&Æ…‚‰šdjHõ(6=ñAËT°Ì˜f7ÐhÔ3õ-H]ý ‹£^ƒõb€ô‰tU-y`ßîíšÌävæÊ·ÏÞy£Ý”^!wû-Ÿu_®wíMÿYFüB·ö“ï–‘ßxÇ?p#â´å§ÏV<ö>»0aäcÝ ;±nxšÛÜ…ký¦,‚„çEÆ…A [“9ºåõëÖ µ©-Шƒû†±o¸3 ƒ2"›’EnDˈ—êæè§za|~‡µš ö¸ °š%ŽQ/×¼ªÙÑÍÈ|„VȸL®õô õ܇g«F=»32M÷dæœ×vÍÖõG„F±_Þ©OíÉt:aÿÞýúTã£_ý¶Ý8¸<ˆÌ‘AYºyÓf!kéà“>©ÓäÕµëɽËfe©ÜËþèˆÜÜÏ•.ãBÁÌDM25¤Œz›ø å*XfL³È/êAçê XXôšÅ¨t·¨L¤«Ê„<ðâ³WÍœµl>íù—ÈÇŽî‘EBŸê—뉓Nú{2yxöÜ`üýg'ËÓ‹/û×úÔš"êùƒŽ¶¹ù*7G¯c[|²žÐ8(3å&Û—§~h#£ÞHzîÞì7¹‘qQo~‡?êÊSo²Épaa«“Yúõ‚ð›W%®£­½x­ÒW?êíܱsõçÎ’“Çn¼LÔ›¸3îKú4œ‰™sfVœ±b!'Íç0ÿÌ»'}r°ñùj¦ü“ãöïݯ›u#ºŠ Êd7(4Àùƒé É)ìG=ý>ÿ…üA× …nVýDããê­v#‰21.lLÔ0SCÀ¨G±éˆX~ ‚eÆ4»F½l`Ã"À¨×,F½à »Ee"]U¦âtìè}zFžÜ†ul®»éÇfedßîê6ýo¿óÑŸÿù_ø2îÎì{õk^ñòWüÄÕ7þŽ[x©näàBzÓÁq…N&ËÒ­[6èΨ’QOɺºÝŽßÚªF=?Õ‹z²A}!™àxQÏ4¸°°ÇÉ,}ŒzA@ó*O;šÜ–¿e¹Ò†U3êíß»ßmMÈw=܉QOnº®®.OGîŒÖ. yþ`ƒL^”“^ì­€AGk ¯è¸‘Óäeš?^)êiO´UN_Ý?UÐÿ1aÐþÈÉ1=.lLÔ$“BšÁ¨G±éˆX~ ‚eÆ4»F½l`Ã"ŸWôâD=LZÔzÔƒô¤·x »Ee"]U¦ßЄ'7w¾žö²eó—¿ÿ|ù)'ÿ£Ÿ{åëRîõô4ýü?Qpõ[*ê¹ñ ?ê‹óGzñÙ‡µÊ-[úºcGï÷\AÔ›½ó¦õë>*¯"ëjª+õdÜî°Épaa«{Y't#Ꙉ–^幓ãÜÈÓ9ø¸hͨç“MÉZrÛ|ÍfyZæL=72vg†ÍHcÙêá·æ¹Ðª‘§Âù6oÚ,d »æ?-«ôgô?Ù*#v;2¶_)êéˆ‚ç'¼‘›íFÔ31.ÌLÔ$“BšÁ¨G±éˆXf åÇ4»ñQÏ$¹úL€‹RW`Æ"‹^ãõ‚ƒî•‰t•˜lWhÚÜ%qõ©wÜBŒ;ñÂÞ‹¯}ƒ¼m¾²ë"yÚ|Ô“90^Õ‹Ï>¬¹Í?Yo\ÔÛ~˵2~Úò7­_÷Q=ÕN˺壞,…ñy&Ã……I®>ìeÀ¨W¯*lG.Ûà`ÖÑàU5ê ízú*•¢ž½3Ãlä>këØÄì¥du™cù”9ƒ]òÖõäæbâÈú¦dƒ²ÈzºÛþˆ²»=r³vZŠLŒ 35ÆtÆ0êQlz⃠–H`ù1Ùn€Q/ذÈç=F½Æ0êÝ-*Óé*ÁlWlD}s¿Õ§ÎãGnÑwŽ<8vtÏ«_ó ™ö^µ¦9a£Þì_€ñêF|„vdÔÓ‹ÕϪ[¬õüoß[Ìd¸€°ÇÕ‡±¬+õêÃàUÅÈŽ6Î\Š2Qïé¿|zжúž|d®¾ÉºU£ÞhÃlä®AaóÖÄìU¾‹ÉK viñ ;SÏ}ÿÝÈú¦äUd‘zöJv¯FnÖNK‘‰qA`f¢&™ÒF=ŠM@|PÁ2 ,3¦ÙÍaÔËf,ò±èµQ/8ènQ™NW f»E– ®{72m³wÞ(ÿ#ç*Þ¡ƒ_•§2óØÑ=:â|e×EòÎùÃ/ý[y¬Qï?_ø/ü ¾‘QoöÎ/Ì.ä¶â¨§×uÆ-cýº5ðÔ4Ìù¹mäYuvš´QÏ6Ao‡™ &¹ú0–u£^}¼ª(èh;wìÜpÙDS”z+ÎX1L‹[wº¨‡;3ÌFò¢k/Y»zxÙY¸…~ºv°)oÐç>~ ã–lÄnÇE=7¢¡mäÅ+Üó…OÿôIDATäUd‘zê„~üÖ߈nfê £5ÍtÆ0êQlz⃠–¨`™1ÍnNsQÏÔ· uõf,ò1êµQ/8ènñ˜HWÕB°aÙð›ò¼‘AhÓËe¬\^v.½Íg©EWÅÝ~Ëgeݯ|mí‘§ÀýÀ‡KæüÃ_þÅŸ}ÈÍÙºåò5ç½Ï=•—“9îÚÇŽîÑ-Œz&ÃÍqP¦¹ÁŸ}xÕÌÙÃ}^˜éè'ˆ‡_ÿç;z¿=/O£žKuúu{¶ß /µ±h¦Ð ʠ˺º<•AYä·Âù–ÕM‰ {\}XÊ:„Q¯¾…ÔU]AG[>ü ª?¢)ÊF=Ÿy׌>ÞpÙH©·ïþé¢îÌâËÝÊ"YÑÿ̬¼nÊ¿’¬oâGæ viñ m‚¡MwÏzö»ó”¼ŒûºíjÔ31.ÌLÔAšÄ¨G±éˆ*Xf ‚eÆ4»9ŒzyÀŒE‹^Kõ‚ƒô‰tU-»´²¶üÔÙ;oÜ·{û¾E—‘+qâÐÁ¯êL¹_sÞûdŽLÇ[·\îæì9pÕ+_ÿ“vÎ0½ÍÍq O&™ Kå© n¿åZWÜtæ×unÁª™³u‚lP&ËS} ÓÝ ÜälSÌÞyÓiË]ÀÕo×/J+7ÙæšóÞ/޽_æÈˆ<–™ ‹t©NóWŸÿ3e‘¼„ŽËcîð` ú3\X˜äjÂLÖ-Œzõ-¤®êv ÄâqÍpƒlä jr‚¨·ùšAÞrײUdÌÑïÔ4¬ÂïÔ+»3ËÏÊÈÓßyZÒþ½ûåéàuM8ƒ3øäé¶·éã‘d©¼Û²ÍÊ4ø¨¬®ë×7wn [×åBÙ Lv×ñð“¢~Ìù¡ýv’QZ`"H“õ(6=ñAË T°Ì˜f7‡Q/X²ÈaÔk £^pÞâ1‘®*ò|[·|fÕÌYZß”<öSsìè™é¦Écø4îžWÉ»è7ûŸÌn#ò`xNßà;òäE‡¯»AžÊ½>U‡ÞíÚœO§é¦ä®;α£ßÔÈè­ò¦U3gë™t@[žð'¬_÷Q”‡¯utãŸÇº£Î\ù9< oa|¸ÃƒŒèo3\XXåjÂLÖ-Œzõ¹ø5…™wÍh]Úu÷.gó5›µCù—ÝpÙ ¡ËmõW˸’ÇÚ¼ÜL]Q·Ý°Mžîß»_ɈŒ?ùÈ“2RõJî̆?ì $-ÝÁºó]OKŸÎ\;ü”®<õ×rä^–ÊY*ýú&ÜF\×›9g°ŸÚ„›)›ZqÆ ý­ûâ?˜¯‘ɲòT6.Ó„ß%…ÖC÷;£® ƒi11.ÌLÔS@ƨG±éˆ*Xf ‚eÆ4»9ŒzÀŒE‹^{zõ »ÅÝ-*éª2!¯Ð¢Wɉö®¿þÍ{\ã…°¾5h!·µÇd¸€0ÉÕ„¬s:õLDK‹bUͼkf¹wÉWË}VËZ7óÉGž”Ç2¢‰JøKÅ£íºôóo;üÄ>7¢J'®¾Íœ³°î ï3­û÷î—En7Öšï°{òÑ'Ý!í§quÑê­–-ècyáOíšÝ¥sü ²?òTù_–'¶Ý¸M–ºmÊRxõ‘?׸6-¦Ç¥‰c Hþÿü÷äßo<°ƉBÑ#T°Ì@ËŒiv ®¼õ¬?¾ëüŃ&ÉÕg\ P»zK9ŒzíaÔ º[T&ÒU…Ù®À\kûóoþéÇ/þÈ>ð¾ÿð¿þ–éüù7o3Ý-ˆkm1%. ¬r5a#ëF½šü.ÖÐ"ÓèƒTÄĸP°4QcL!ÊŒø ‚åX~7»‰L’«Ï¸ võ–,r"F=lXõ‚t•`¶+6(zý½G^ö²ŸZÒøíãĤ·x ®µÅ”¸€°ÊÕ„¬sõjÂàÕ"cÔ«Ìĸ 03QcLþ Êø „åX~L¶+f’\M¦¾Å©«?°d‘bÑk£^XÐÝ¢2®ÌvÅæÎÔÓÊvƪŸ«êß_øŠó¯~eUoýÍ¿Õ˨g2\@˜äjÂ@ÖEŒz5aðêHH‘1êUfz\Xš¨1&åG@|Âr ,3¦ÙMdª\M&ÀÅ©«'°d‘è×*F½° »Ee:]%˜íŠ-Šz×Üwr3ÎXõsŒza•« Y1êÕ„Á+{Ð"Ûvã6ùgpéâËÔҦǥ‰šaÚQ–ôÄ!,'PÁ2cšÝD¦ÊÕd\ P»zK)½¶µõ ½Åé-ènñ˜HWf»bŒzM2%. ¬ru`ë(F½š°yeúQL›7mÖÓôÔ¶·ÁÍô¸ 06Q3Lû Ê’ø „å*XfL³›ÈT¹šL€‹jWO`Ì"Ũ×6F½° ½Åc"]U˜íŠ1ê5É”¸P°ÊÕ„u¬£õjÂæ•=èG”ã‚ÀÒD1íƒ(Kz⃖¨`™1Ín"Såj2.¨]=1‹T¬¨‡éŠÆaÔ Ò[<&ÒU…Ù®XO¢ĵV˜V¹:0uWêQÏD´¤`ðêHH”Óã‚ÀÒDÍ0áƒ(Wz⃖¨`™1Í®˜Irõ™¤®žÀ’E*Vј®hF½° ½Åc"]U˜íŠ1ê5Æ”¸€0ÌÕi¬»õêÀàÕ(5¦Ç±‰šaÂQ®ôÄ!,'PÁ2c²]1“äê3 .8¨]=1‹T¬¨‡ÝŠ 0êÝ-*éªÂlW`®è1ê5”¸P°ÊÕ]¬ÓõêÀàÕ>tû…×,“{/ú%Èô¸ 06QLõhÑÓÇŸºèÚ7îøÚ¥0NŠø „å*XfL¶[ä²›NßtÛ¹ÞˆIr5™Ô®žÀ˜E"VÑØ­¨@¢¤·x »Ee"]%˜íŠ1ê5ÉĸP0ÌÕ]¬ÓõêÀæÕ;î¹Tþ–åÆK~D©11.ŒMÔ S=Zôðc³òïÆ•7¯„q¢PôÄ!,À2ãÕºž8þ˜üÍ^²åoÐT¹šL€‹jWO`Ï"+êa´¢bŒzAw‹ÊtºJ0Û[ˆz/{ÙO-Y²äª¯½ê[$ÿþÂWÈË}à}ÿÁÔ·H ¯5Ï”¸€0ÌM £X×1êÕÍ« õrfz\›¨¦z´ˆQbÓ#´°l@ËŒWëF`Ôë.ŒY¤xš^õ‚î•ét•`¶+¶õNzí«–,Y²þÖ×B}‹ä=ÿ‚¼ÜÌ9¿mê[ Ð×ZaJ\(æêÀ(ÖuŒzu`óêF½œ™Æ&j€IíbÔ£ØôÄ-,PÁ2ãÕºõº c ž¦— F½€ »Ee:]%˜íŠ1ê5ÆÄ¸P0ÌM ‹Xõ¦†Á«#õrfz\Ø›¨&y´‹QbÓ#´°l@ËŒWëFÈ#êAíê ìY$õ’Á¨t·xL¤« ³]1F½Æ˜ ¶¹©aË@ÒQÏt´¤`ðêˆ÷\úËoýéW¾êï.=y©šy׌?aÅ+Ü¢åoY¾°ú¥ÆÄ¸ 06QLïh£ŦG >haÙ€ –¯Ö`¢žIrõ™Ô®žÀžE,z)aÔ Ò[<&ÒU…Ù®£^3L‰ Å«rûîûÓõŸøèÆ+߬‹Xõ¦pùe—¯½xí®»w-¯îÐ3õÎ9÷íòÏ‹Üä bæ]3²hQÑ(5¦Ç½‰`zGëõ(6=ñA ËT°Ì¸~7Rô¨g\ P»ú{ F½”0êé-éªÂlW`¡è1꛽ó¦U3gŸ¶üMÎúu=tpV—ú‹Öœ÷~·–gàd7MVYsóŽÝ+«»9:mã¿Óö¸íÿãs§ýó7-[ú:Y]£Þ™+ß!#zhÖ/z[·\qæÊÓÝRy¼þº@æ/rd‚¬åæL$“a `¸ÿƒ™ðr‡ºgä¸XõGvcö®/êßĨ·â7W,Ër°öâµ›ÿpóá¿8ìÏ23lͮ⿄<–ë¢÷>èÆ‹ÎXá—5yjm¾fa`¾oçŽv¼ÜH2Gf^~ÙåùàGô\6yÅEå+yîã·²óò/ÌÈý_ýÁÕ#ABšŠ¼¨üà …az\Ø›¨¦w´ŽQbÓ#´°l@ËŒëw#1êuö,,z)i1êAz‹Ò[<Þâ1‘®*,wzõ ¯U¶jælÙÕ5ç½ßî/‹õë>*Oå&`ŽÜ–-}ô œ,Ò9#‹ÞÖ-WȄӖ¿IìÛý§³w~QÏo'/=™vÚ?Ó|žÐ×’ÁõŸø¨8så;tSútÕœÛÛ}÷ýéü*OÉd™°ñÊßßwßmbÕüù9·i ;öí}ºÙáv.Tg®<]Gʧ=y‰á†åô?¹íݸ<ÐiþËÉc·úÈÝw#n¦˜õÿÅ᥯Ô¹_{ñZµâ7WèÈæ?ÜìO—_v¹,’ÛG>ø7ß_ÅŸ¼ü-ËeDV¹÷î{Å{Þõ]W&<ÿy íIî?rXë›úî_~WV—Er/ݸÛ¹iƒ³Vœ1عÁº;wìÔ—“ þÎ/Ú±ùÉOÿåÓºÛnض(~¥ÍE=ÝùÕ\ „,’?Ä„4Ù¬l) ÓãêÃØD 0±#Œz›ø …e*XN\¼‡Q¯£°gOÓK £^@Þâ1‘®ÌvÅõ&Ó„ç÷;±ñŠOÀ NÓØ4{çMn|Þ·gïü¢,Ò۾ݺ(Ì ‹žŒŸ¶üM0.#²M\0ìqãŽ}{ï|žñâs¡O×b°{~øÓ®7õ§¿ÉS8ÙM»ž‹znd¸œ6܇…ôVÀU9ËB^]ý*7òåÆËêºYYêË|üV“Öò·,÷];Û¹c§?î"à\˜ó R‘õ4óÁêúZ.ê mOùàG\MsÖ^¼Vɽ?(ëÊ ¶¹‘k Yª`]]4r|aÇæG^zþ¥'yR7µ(~¥ÍE½ —mÐ?(˜ ?ÔˆØ ©ºÍ›6Ë+2êEaz\Ø›¨&v¤€QbÓ#´°<@ËŒ‹wã0êu&-Šõ0TQyŒz¡@w‹ÊtºJ0ÛcÔ›l.?íþ²‡¨§#2ùÌ•ïpãCƒ'ƒƒÄO¾ƒ¨wìè^YW ?Ï»0.ôô=\ð[C˜_딬5ø ðüSõtEzZÙ/ä52qè¡{dÐOoë?qáüv¦ ™&ãkÎûO0>ŽÎ‡¨'dË~Ô÷rãÆeƒºe·‘2QOÛD=¡ñnÎFÛ¨wùe—»¨§íÏo|êÁû”Aõleºc°H£ÞækýhéÉKýEj°'/ÕHg7;îåÜû ¬å¢žK]:¿CÂuQÏIyàOÐØ·ï~pà…—fΙ‘ùò#늛7m^Ô•†6üÁã¦ÉZn\¶,7þGqåå© º×^²Ö-úên-yu}*vÍîògö‘éqA`o¢˜Ø‘F=ŠM@|Ãò,3.Þ“AÔƒÚÕس(JѪ¨ð©_’—û·+Þn\p~_«l.?™¨4ê:8+÷bñÒ¹l§…n¸µEQoÍyï—A{šÞdÿ÷ܺ~¿Së?ñQïûòFD=žÊ7ha²t°Û‹™5®¦ÉÈÈñqæþLÔU£žp§ êÓ:QOFFŽ‹z>Mo6ê-2Ìgú*¶² Ý1X¤[¾ù†›—ÒàL@o© ¾ç]ï·Ù‚—ó¹Ô¥_?M™‹zòXÿˆ6\¶ÁŸ Âxaî3¹ƒØ7¬Húæ °a.* Íœ3¸Â†”òt°µ^Ú5»Ë©'•ÛÚÎ/>ø,‹ž|ôIÑMùÕO¸ ®þÐjY´ö’µú#0êAŒ {ÅfJG"õ(6=ñAËT°Ì¸x7£^aÒ¢(Q+U’}Ôƒôt·¨L§«³]±EQï7~ý-òç_ýJ¨o‘È ÉËÉ‹šœß×*Óü4ü<\äÓsôöíþ²~{ÝÖ-¼¥ƒKd 2Óü×êAÔÓA™ãN6 sZÓÖâ£.Õ42êÍ[ø<¬»HÅ8ÅQïÌ•§Ãø8s¢žJ¹éG‰ëG½÷¼ë=0^&ê¹Oé^~Ùå°hÎ|>ÓWYÙtÇ`‘F=Ô¥ƒÝó–îܱSõš#7[ðr>W»ô¼6YË$ÎzZ$ál~©ž¾™OhbÛvã6W‘öïÝ/#2Ùh³Óóòù“qan×쮹?+o‚’í×øÜ Ì÷ÏÔ-ȸ{Ù%Ù ¬ØG¦ÇÕ‡½‰`JG"õ(6=ñAËT°Ì¸x7Nܨg\ ¼ú“1ꥇQ/ènQ™NW f»bŒz“i­“[q×sQoë–AYü ÜùÃŽŠzz –2LróuÌ]ïb´â¨'ô;õäVÜõÆÕ4݉MЙßí…¨'; wOÕQOèÆukõ?~k¯•a£Þ{Þõž溷úzrÝõæó™¼®ÌYÙtÇ`‘‹z‡9¬©È_ªçèɃq›µã›¯|ÌÓ=U®víº{.3¹‘ÄùQÏî¼üàögYøêÀÅ!IFduw–œþÑíüòN7Œ‹zî >·'빨çFhÀô¸ °7Ql&s¤ƒQbÓ#ä°<@ËŒ‹wã,Žz¦ÊÕd\ ¼ú“Vϱè%‰Q/ènñ˜HWf»b}ˆz®¬MÏ¿²íâSð¸¨'eš8vôþá¢Á%2†O÷ÊcíM~¿“ÇÃm·õZ˜,îÈ`šžæf¬iz5[Ù°ØünÏE=y #IE=´§é ûî^ÓvðIØ×>Y Ó„f ¹É¸b†Ëg:ÇÖ7¡û‹\ԓǺîæk6»¥KO^ªOÇmVÇ?òÁèÎ ‘µ`š ^ŽzBÜüá»§þ‰{J¿ PþvÍlVÍ­;_ñä©pŸŸµdÝŒ¯þÐü ƒ‹Çõö²M72n }gz\˜œ(6“9ÒÁ¨G±éˆrX ‚eÆïw#1êuV­žcÔK£^(Þâ1‘®*Ìv=Á¨W`ãŸÐT$·Ó–¿É^ßÖze•ᢹKdh‰›‹Yõ£Þ|•›¯c¢žXsÞr?æ™+O·W³u5mß}·)÷vò&ÐW‘{Gž¶õ4rmþÃÍ+~sÅÒ×/µ—ÈPõäÞÑÕaš’è¹ÉfÿÅá¹EóùLV”E¶¾ Ý1X${èµF­8c….ÒKdèãq›ÕqíSJŸÂ4¼:õ}l×¥ŸÛá'öéÓ™w ΆÓkÝê'j]àsôÏY~Fùñôô4· þ 7yÆ%9‘q¸,†°ÛdÔÍô¸ 09Ql&s¤ãûÏOþÝøÆ[aœ(=ñAËT°Ìøýnœ+o=ëï:øØT¹šL€ jW`Ò¢ðEO`¢¢ªõBô‰tUa¹+À¨WÙúáWãÉnË NÙó£Þì7Éãá…/ŽºKdhŒÓÕ“‰z˜ÃıoïÓN'7Ù8¤:­i2îÈ6ËêÖ‘e;òÇ¢epûÿØ,#íF½¥Ã³í„vºA[<ÍÑHwïüÇo¿ûÔwuE7þ‹Ãï^‹V_enÅù|&+ʸ­oBw ùQO,†¹Ã–Dz)÷{ã6kÇeÙ‚{*üàÕ¹¨´{êþ¯þàê‘?ˆþ9ËŸ ¶$Oý¨·úC«aœQ¯,ÓãêÃÞD±™ÆAÔ+z⃖¨`9ñË]9¦ÊÕd\p¼ú“VÏñ4½T1ê…é-é*ÁlWŒQoÇŽÞÚò¹©úçëùQOhW:tpV; ‹q:žrÔS³w >2,« vÞ/®iåÍïöB1”m¶õ–ÏW¹{ï¾W³Ý |-ž© ê‰Ë/»|äu};wìÔå~02_дøØú&tÇ`D½Ë´Ê¸Kdèø¸ÍÚqYÅë§üàÕõ¨'dç…~qžž²Æ}çïÉG«Ë´]ã/D;.ÉéwçÙqÿ⹊Qo4“äêÃäD±™ÆAÔ+z⃖¨`™1Ín"Såj2 .8^}€U«çõRŨ ¤·xL§«³]1F½éi6^ûbn¢ž,Ò 2S/‘¡æbÖâ~§ƒîl¾É¼07·ÁÐQOì~Ϭå¿^¼¨wìÛû^|î÷TMõ=t,’›n|ºïÔ»ü²Ëedéë—>xÿƒnбQ¯$— ߯7_ÐäueÄÖ7¡;‹ êiË“¼gþjÜf ^ÎñƒWQOdýîà2²f‚»ÐmÁ÷å zþÅj=óNÙïÎSûüËé2ê`z\˜œ(6Ó8ˆzE@|PÄ2,3¦ÙMdª\M¦ÁÁ«°jõ‹^ÂõBôét•`¶+Ö‡¨7WÜ‚Óf§°Uõœ•§r[6‰ 5³FE½áÕu‹xan¾ŽMõ0‡Y2_ÖÒSÞT¼¨7ÒQ®Ú1õ…2´ÙkÚŠ‚¨7±ôÙ¦fGݱÁÅs½AˆzBc“Üü+fŒÛlÁË v~øÀ^D½ — ššÜäg‡Es^xIOxôûšØvã6Yåéï<­O×^2÷>q#bó¦Íîsµîl>wm W uÜ‚²~I—{Íô¸ 09QT&põø ˆe*XfL³›ÈT¹:L€‹‚W`Øê3F½„µõ ½Åé-Hoñ˜NW f»b-G½‹®•¼Ü?ý_ß`J\@sÅmj‡Ξ¶üMrãšð†nш‹zB?¥ë.‘¡FF=½°Æ Cyƒjë–+FŒ/„¹0Qoã•¿æÊÓý¥Qop áüHúQO÷Y&èÓ©£Þæ?|$Snƒ³ê¼q1.ê ®S¡­>µ©ùõí#üˆŒ ^}~ÄÑÉ®µ)õô û–.þ^<]·|Ô{pïƒîµüà•AÔÓÞÊO±á² °hÎ ƒ“õtŽÜ¯þÐêµ—¬•?(y çåéŸÌÙå} Wã N˜9gF&è¸lGŶ·ÉÓ'}R7Û×nÛì;ÓãêÃäD±™ÀAÔ7zâƒ"–¨`™1Í®˜©r5™¯ìaÕê9½„1êÝ-*Óé*ÁlW £ÞÌ9¿-ÿ?ùž‹ê[$ëo}­¼ÜI¯}•)qÍõµ©íÛýeÙÉõë> ãìükeب§Ì…ÕÎŬÅQO/¦!ã¯ø}\È É"ôÂÜÔQoQÓFæÌVÉÆ… ÜÄ£ž^âß:ê Í.v|\Ô“™.êé6GA¡×µPúùÙ¥'/ýî_~× y*ƒƒW÷…zî}PfºKd(ÝùòQOÛb–QO þj ~„a)ì-í/“äêÃäD±™ÀAÔ7zâƒ"–¨`™1Ù®˜©r5™¯>ÀªÕgÙ”>Õ¨'Ûô»žžR÷‘~įiBÇWœ±ÂÅ>y {%/ç¦)ÝHxÖÒáyg0MC¡ŒCÔ“mjlÒ§~ðÊ#êM‰Òaz\˜œ(*S7ˆzH@|PÄ2,3&Û3U®&Óà‚ƒàÕ¶ú,|ÔÃ,Euäõ ½ÅÝ-éªÂlW‹ž`Ô³^|öá3W¾cÙð„5œ»·jæìQ‹¼÷Ãoo¿åsnÎü´EfïüâÈׂðú©NhÉZÿ‰Â¸sìÛ{eŽÛš<Þþ?>çg/1{×ý9næ°.L;såéþÒCÝã/-I¶é6"F~ìWÁ˹ýqG&¬ú¿cO6œõVüæ ={N,ËòÃqØ_úžw½Gégi7ÿáf7y$÷‘Û;vÊÖ`©ŒÈ¼ ¦Ö^¼V³š³âŒƒ ¸xÚækæ>Å©`©Ò h§=¸÷A|$™ÁK¿NV„ñ|@E¢¤˜V'ŠÊÔ ¢Ò#± @ˉiv™*W“ipÁAðê [}ÆÓôÒÆ¨¤·xL¤« Ë],z"»¨·݂طûËâØÑûa|<¯ÄU±o÷Ÿ*Ÿ³¸Ùéçjáoñx¡EÙ ì»ï¶‰ŸŠí2gêÅvïÝ÷âgug8çð#‡ç&›Eæµúƒ«å &÷nä»Ç¾½ñ–³n¾ëwåLǃÝ~á5ËäÆÇ‚ŠDI1=.¬N•© zúøS]ûÆ_»ƉBÑ#± @ˉivc]vÓé›n;“\}¦ÁÁ+{XµúŒ§é%Q/Hoñ˜HW f»bXô£^h¦ÇÕ‡yîÛ‡\fwÙસh<,_½øÜ#ë?qá80¹øðŠ·žñ3âô³_¯~ûÝ¿ºöâµâ»O}wQhk’Ii逿µ|ø)à;vº‘£G^°ñ5ò»CîL{;î¹TöMîa|,¨H”ÓãêÃäDQ™´‘¦‡›•7®¼y%Œ…¢ÿÏåƒ"–a9r7ÎÇ“¿ÙK¶œ‚I®&àb€æ•= [}ƨ—(b€–ˆwã0êu†­> \ô6)ª‰Q/Hoñ˜NW f»bXô£^P¦Ç…nàÐC³šÌ&^w³WÞRøø-2-)®v=ùÈ“ú|»îÞå}~Úò8…´Ç¨—Óã‚ÀêDñ˜®‘,F=ŠÍý®t ˆuT°Ì@¼‡Q¯C0lõOÓëF½ ½Åc:]%˜íŠaÑŒzA™W湇šÕ‹l ¯q6,] ³WÞõªzéù—fÞ5£9oÅ+öïÝ¿(šöô¹¢õ´Ç¨—Óã‚ÀðDñ˜®‘,F=ŠMEú ŠuT°Ì@¼§»Q‚W`Ûê-F½.`Ô Ò[<¦ÓU‚Ù®=ÑpÔ»ìOO’—û¥_|…‰q¡@ek˜Irõažaß}zè¡Yô`óÊ£^U/=ÿÒþ½ûÇ7Îw}ûæ»~×¥½M_:çðû`N3ªE=¨H”ÓãêÃêDQ™®‘,F=ŠM9ú ŠuT°Ì@¼‡Q¯+0lõ‹^0êé-Óé*ÁlW ‹žø?>ú%K–üÛÿüw ¾Å#/'7ã‚€ÄÖ<“äêÃB7l^ÙcÔ«›WE)¤=F½L˜V'ŠÇD”1êQlúkÑQ¬ë ‚åÊ]F½®À°Õ[,tSÀÚÕŒz•`ó êij/4ö*D=¨H”Óã‚ÀðDñ˜¢‘8F=ªï‡ßÿaýÅçƒ(ÖuÂr宣^'`Ûê'ž¦×)ŒzõAz‹ÇtºJ0Ûܧ2ŠzPÙf’\}X覀µ«'õ*Á줽_wÊ×÷^sê`ÔËéqA`x¢HLìH£UÍn"ý•çƒ(ÖiPÁ2宣^'`Þê§ÀQ#…ŨW¤·xL§«³]1ÌyŠQ/“äêÃBW¦®þ`Ô«³WL_ß{ýǯ;EÿR¦=F½˜W†'ŠÇäô1êÑDéªÒ_v>èb,3Pî 0êuæ­~âiz¨W¤·xL§«³]1Ìyª­¨÷×ß{ÔT¹š ²5Ì$¹ú0ÒU…©«?õÊÃæÕH{wîÚxâÙ`N%Œz90I®> O‰I!À¨Gã@››šþšóAë4¨`9lWŒQ/}ضú)ðiz#…ŨW¤·xL§«³]lyΆ?¸xÉ’%ÿòì¿ é-ž¿ó÷þyÅ#‡¾aª\MPÙf’\MX覀©«?zõž;þW=rwIº 6¯¡£GÂd5»çÚ÷\Ê5_:çw7ý#ý úȯúísù×Oûõé¼ùWÿÙëÿñËõWOñkV¯yþøóØ•¨E&ÉÕ‡í‰"1M¤¾ÿü÷.ýüÛ¾ñÀV§~‚„þ‚óAë4a9l7Ñ•·žýÇw]€a®Óà‚ƒì•7Ì[ý8êa¢àõêƒôét•`¹+€-ÏÙríeK–,yëoþ-HoñäõL’« ]Uعòðܳß|üè—&Úñõ õºqQo÷7mŸýän¾ów¯øâŠÊnØý­›\}ó}ïÙçe©îg_ùúg` J¶ãN+cóŽse-ÈyâùãÇ/Øø˜Ü€÷þþ+ä_†&o;¿¼»µÅô¸ °=Q$¦ud¸°àל€.ÖiÂrÍ®Såê0.È^yüÕO [Pß{öù·œ¥±Œû÷IÖ‚¢§n¾ëw¯¼y¥uÃÎóál»©mû³‹ÿÛÖ·¹êì ~þ—ßúÓç_ýÊf¼zÙO1ê¥Åô¸ú0ð©_:cÕÏôêeãWÿõÏÜxÛ‡¾²ë¢bßùÎ¦Ü üè‡nØùÞ«nù×åéÛ¾¦¯ìºØä¼/|ë‚«_ “ ܰs´<õÜ3{`f±Ïí8ZžzîÙjÛ eÇ7.„ §~ôÒë¯3Lçc›–ÎîûlÁùâWÿwÈ‹#­ßú«nmÜ™z_ß{=œ‚WÒ»®‚O¤–ç¸t@ÎkÀw}ûæ»~× ¸yǹ_ºõóò¯Ð?ø•Ÿ†|â‘×bÔK‹Irõa{¢HL+!Jt·¨ôלºX§AˉivÅL•«É4¸à ye W1êu£^MÞâ1‘®ÌvŰå9õš¼ýoû;ú&œè†ï…œ§ž{f7ÌlÆìÞÿ9OýènÇÙ üÅã_€œçÈKøçâ;þݯCΛ÷ÔþC×Ãizâ/ž¸ >¦:µçžý¦ßÚR“ÖwꙎ–(nQAÎÛô¥s?±OÆwîØ)ÿ20êõšIrõa{¢HL4!J·è/;t±Nƒ–“튙*W“ipÁAóÊæ­~ Yôæ'ŠQ¯&Hoñ˜NW f»bØòœ?ÿæŸþÒ/}•Õoüú[¦ðoW¼ýãd¤‹×¾û²Ï¾Nʳf÷^úÒ‰óœãÇïyüÈÿðÜZ 2\PæÀHWF®¾aÔ+Ïnñ<üøŽ{.µ9O1êõéqA`{¢HL:!J ´¶Æè¯<t±Nƒ–“튙*W“ipÁAöÊæ­âizÝÔ|ÔƒôÔ·H ½Åc:]%˜íŠaË‹ \# ´5É$¹ú0ÒU…‘«oõJrY-ÍyîK!ç)F½¾3=.lOƒ©'DIÊÖ0ýÅçƒ.ÖiÂrb²]1Såj2 .8È^yÃÂÕCŒzÝĨW¤·xL§«³]1ènQAnk„¶&™$Wºª°põ£^I×Â:ñì ~λòæ•=r7ÌQŒz}gz\}Øž(ÓPˆ}­úëÏ]¬» ‚åÄ4»‰L•«É4¸à {å W±èuS®QÒ[<Þâ1®Ìv ºÅ¹­Úšdª\MéªÂÂÕCŒz%A\ åij/ܹkãEŸ}£þáä<Ũ×w&ÉÕ‡í‰"1%…¨uPÖZ¤¿}ƺ BXNL³›ÈT¹:L€ šWÞ0oõOÓë,F½š ½Åc:]%Xî @t àÄ {?¶ié½ßú4ŒAnkT¶†™*WFºª°põPBQÏt´¤@\«¯jÎSŒz}g’\}Øž(SºåéãO]tíw|íR§î‚¦Ö:ýUèƒ4Ö]ÂrbšÝD}ÙM§oºíÜEmnj¦ÁÙ+oX¸zˆQ¯³õj‚ôét•`¹+Ñ-€=®¼ÃW§ÅE¦¸5*[“L’«#]%˜·ú‰Q¯$ˆk5}}ïõ.ç]úù·=øÐí0aF½^3=.ÌOƒI*Ýòðc³òÕ•7¯„qê"¨i‰Ð_ˆ>HcÝ!,'¦Ùûë'Ž?.³—l9eQ››šipÁAöÊ®bÑë,F½š ½Åc:]%Xî @t €QožIr5a¤« óV?1ê•qmj_ß{ýǯ;Eÿ¨/ýüÛöîÿ˜PŒQ¯×L«ÛEbÂJ·0êeRZ:ô×¢ÒXwAˉÉvÅõ’†…«‡õ:‹Q¯&Ho‘˜HW–»Ý`Ô›gª\MéªÂ¼ÕOŒz%A\›ÂÞýR'ç)F½^3I®>lOƒ +è—ˆh©Ñ_Ž>HcÝ!,'&ÛcÔK®¾™/z!¢&'ŠQ¯Hoñ˜HW f»bÝõ ·5B[“L•« #]%ضz‹Q¯ (kUíÝÿ'—~þmúÇûñëN¹ï[_„ å1êõšIrõa~¢L^éF½Nƒ|–&ýéƒ4Ö]Ârb²]1F½taáê!ž¦×eŒzu@z‹ÇtºJ0Ûƒî@JQ*[“L’« #]Uضz‹Q¯ (kåAÎûúÞëaBUŒz½f’\}˜Ÿ(Y:‡Q¯» %KQú u„°œ˜lW¬cQ²WÞ°põ£^—1êÕé-Óé*ÁlW º[ŒzC¦ÊÕ„‘®*l[½Å¨W”µ2zänù`ý# ’ó£^™W¶'ŠÁD–.bÔë"¨f‰Ó_—>HcÝ!,'&Û õLƒ ²WÞ°põÍ|Ñ õ°7Qõê€ôét•`¶+Ý-F½!SåjÂHW †­>K%Ꙏ–(kmúÒ9ú‡yÑgß8»çZXZ£^™$Wæ'ŠÁ¤–.bÔëHféÓ_š>HcÝ!,¦ÙMĨ—.Œ\}ÃÓô:ŽQ¯Hoñ˜NW f»ÝÂ`Ô2U®&ìt•`Øê3F½2 ¬MôñëN¹è³o¼sׯϾ‹jbÔë/“äêÃüD1˜ÚRÓ3ÇžÙýµÝxà¬xäЂ¿hä6e¾›àG=˜&Ü´ªd'ÝF`‡ýEþžÏí¬ ~ð,A,ë =ñAë(a91Ín"F½taäêF½Žk8êAz‹ê[$Þâ1®,w º…Á¨7dª\éªÂ°ÕgŒze@Yk£^™$Wæ' ΗúÖýÞ:ùORnKO^ªF>]þÖån•Xñ[+d‘ #÷>½A'ÜqÛ2®+êFYQ–º¨÷̱gddäLÙÂuŸ½Î½h±m_ئ{»äœü˜:(7™àVþθÇ÷ƒË ÌÌ”²Ñ#Ô±Ž‚–ÓìŠ J£^š°põÍ|Ñ õ06Q3õê€ôét•`¹+Ñ- F=Lrõa¤««VÏ1ê•e­EŒz=ez\}˜Ÿ(Ó\êÓ¨·ü­ËŸ9öŒŽh«rç Í¼{F'èÓЪåæËy*sdS:"du‘›.›nJnÿp½üvp¿ÕWôW¿î³×é6ÝëÉ2S6îFäEá§~¾y²ž êZrÛö…m°T·)î¸í78™LÖ-zâƒ:ÖQÂrb²]±A‰cÔKF®¾áizÝ—eÔƒô¤·xL§«Ë]ˆna$õ ´5ÉT¹š°ÓU‚U«çõ&‚¬Ö.F½ž2I®>ÌOƒÉ.õiêòC•Ía2⺕žËæÏšÃü*'ìv„®þ+§üùí࢞m‚þøÄd&/$`PKD=™¦;`_Kè„‘»ízüàBvoâv².Ò#Ô±Ž‚–“íŠ J£^š0rõ OÓë>F½: ½Eb"]UXî @t cLÔƒâÖmM2U®&ìt•`Õê9F½‰ «µ‹Q¯§L’«ógÊKZ²ü[µfÞ=ã>a:²y‰ ŸÞÁkäLmmr{÷ÅwbÔs)mdƒS²}™?‚’µÜé„úT¦mû¶qóepõ‡Wë+Ânëy#?f+?µý n§Aë(=ñAë(a91ٮؠÄu(êAöÊF®^™/zŒzƨWÔ·HL¤«³]1?ºè‡I®&Œt•`Ò꽿Üsàõ:F½q «µ‹Q¯§L’« gâK$#«–£KË|ÛÝÈíhƒ“Ûï|ôç'F=¡5M6㎋z#?Që“íËL™¯;×Á¸ã¶;d\?\¬Óü¥:Xæ§î:HcÝ¥G >¨c!,'&Û”¸`QÏ4¸à {å ;W¯0êeQ¯¨o‘˜NW f»b~t †Q«\MØé*¤ÕC õ&‚¬Ö.F½ž2I®>,Pœé/‘Œ¬ZŽ~|U挛àŒÜηÝ!ƒ¯=éUòÛ¡LÔsgöAƒóé Mü ¬‹z«?¼ZȽ¿T~.=Ïî¶<–ŸØ ; ¢X×éˆêXGAˉÉvÅ1ŽQ/Mعz…E/ ŒzSƒôét•`¶+æG·`N¼°wýõoÞsàªÅãPÜ¡­1¦ÊÕ„®(\½‚9O1êMY­]Œz}dz\}˜Ÿ(8“`âãw.›ÜÌpÎÈíè™w¿uÆ—~þmßx`«D= jr·?Â…?ÙŽ½À…㢞üò@vÏ-ÒÏùê‰xv·uE~~ ˆe@@|PÇ: BX6L³›h®Ç]yëÙ|×îé”Lƒ ²WÆ0rõ OÓË£ÞÔ ½Åc:]%˜íŠùÑ-6(n €ÖÖSåjÂNW t®>ÀŠ’ˆz¦£%²Z»õúÈ$¹ú°@Qp¦ÂÄ32Æùd‘f8¹ÉƒqJµÛÙðé 2"ãpÚ]ͨ'dôåä¶â·VØËYõä±¾¢›&‹\³³»}Ôƒ–=ñAë(haÙ0Ín"æê0 .8(_ÃÎÕ+Œz¹`Ô›¤·xL§«³]ˆn±Aqk´¶Æ˜*WFºJ veûÝHŒzAVk£^™$W( ΄˜xlÕIC˜Ì”ÛÈ+HèÒåËà y*d¦ý mý¨'Ž:2óî·KðéZáG=Í‹2_ÉZn¾n¡?QZX6ôÄu¬£ …eÃ4»b¦ÊÕd\pP¾2†«WXôrÁ¨75Hoñ˜NW –»Ýbƒâ„¶&™0WvºJ ye Ë]F½bÐÔZǨ×G&ÉÕ‡ŠÂ2!&*[µ è÷ÓÉm¹ùJ;Ýκß[§dƒã¾“.HÔSò+†ßú'7×ì”¶9ÝŽ~ÞV;^"Ãí›ýñuEœa9Ñ#Ô±.‚–“튙*W“ipaAöÊv®^aÔË£ÞÔ ½Åc:]%Xî @t‹ Š[ ´5É„¹:°ÓUå+W˜íŠ1ꃦÖ:F½>2I®>ŒP–i1QÙªUÌ}¥Ý†OoðÇËo§ êé…5üèV†~sŸÜü³ý¨'´ýÉÎËÿLC»ÛîSÃn$PÁ2£G >d]!,'&Û3U®&“á‚ì•7ì\ý1_ôõ2À¨75Hoñ˜NW –»ÐÝ¢‚âÖm1U®&ìtåAùÊ»2õŠASk£^ï˜W( Î䘨ªF=¡ÌOc"HÔÓ3§júê~g„¨§-R^Zfú_ hw[Ë vô¯,éˆYAˉÉvÅL•«Éd¸° {e ;W¯°èe„QojÞâ1®,w »EÅ­ÐÚcª\Øé*þ•¬u%1ꃦÖ:F½Þ1I®>,P–)2±Ǹ‘ãÚËà¸ÅÛñD=ÝÈÈEê™cÏŒ| »MˆzB7.÷nÄ Â6 vãŽÛî€Sñ+Wzâƒ@ÖEÂrb²]1Såê0 .8(_ÃÎÕ+ŒzaÔ›¤·xL§+³]1ènQAqk´¶Æ˜0WvºJ eS]yŒzÅ ©µŽQ¯wL’«#…e¢Ll#«–’AYd¯-«w…æU°0.êi†ƒVdT9e_]·æènÃ%5Fî¶Î¹'2X¼‡Iò•1=ñA ë"a91Ù®˜ su˜”¯Œaçêù¢W;êa]¢Väõ ½Åé-Óé*ÁlW º[TPÜ­­1&ÌÕ®ØOõ½A-~ìtæÝ3öåî¸í#vÂÃÍÊo‡+o^ù̱gü™JæÃ‰rÅd²¬¥5PÈ{š¡î³y¢€Ý9MåGÖÒº'#•0¼ú@@|ȺZX6L³›h®Ç=qüqù›½dË)nd¦Á…Ù+cعúc¾èÕŽz˜–¨-ŒzÓôét•`¶+àr[xŒza`§«rX°ÍMQ¯µ0êõ‹Irõa„¢°LɃ‹z0N1@íê =ñA ë"haÙ0Í®ØBcÔK ¦®þ`ÔË£Þt ½Åc:]%Xî ¸Üž‰zPÜ­­1&ÌÕ®<ÈaÀ0W£^j)`Ôë“äêÃEa™@“F½Æ@êê=ñA ëa91Ù®ØBcÔK ¦®þSô¦%j £Þt ½Åc:]%Xî ,4¸àõÂÀTW±®Ã*W£^j)`Ôë“äêÃE™@“ F½f@çê=ñA#ëa91Ù®ØB õLƒ ÊWÆ0uõOÓË£Þt ½Åc:]%Xî ,4¸àõÀNW D±NÃ$W£^j)`ÔëÓãêÃEa™F“ F½@äê=ñA#ëa91Ù®ØB’cÔK ¦®ž˜/zŒz9aÔ›¤·xL§«Ë]…\_£ž su`§+¢X§a ‚Q¯µ0êõˆIrõa„¢°L¦É£^lP¸zH@|ÐÈ:BXNL¶+¶äõÒ©«?Â=]‰ZĨ7Hoñ˜NWf»b .¸¶£´¶Æ˜0W¦ºò ‹uö¸ õ @PK£^˜$WF( Èdšœ0êEy«ŸôĬs „åÄd»b IŽQ/˜ºúƒ§éåˆQo:Þâ1©®<ÌvÅ\pŒz`ª+ºXwaŒ …Qo¨i‰`Ôë“äêÃE™R“F½x mõ–ø ‘u„°l˜f7ÑB’K?êAùʦ®ž˜/zŒz™aÔ›¤·xLª+³]±…£^]Øé*4ÖQXâj9ê™”–¨i‰`Ôë“äêÃE™X“F½H lõ™ø ‘u´°l˜f7ÑB’cÔKÖ®žSôF%j£Þt ½Eb:]%˜íŠ-4¸àõêÂNW¤±ŽÂ £Þ8PÓÁ¨×¦ÇÕ‡Š2±&3Œz1@Õê9=ñA#ëhaÙ0ͮآ$Ǩ—¬]=ÁÓô2Ũ7¨o‘˜NW f» .†ÅQŠ[ µ5Ĺ:0Õ•u¬‹°ÁǨ7Ô´D0êõ…Irõa‡¢€L¯É £^ PµzN@|ÐÈ:ZX6L¶+¶(ÉÕz¦Áå+W˜ºúƒQ/S™E=Hoñ@}‹ÄtºJ°ÜXÔà‚cÔ« S]yÈ:\ Œzã@MK£^_˜$Wv( ÈôšÌ0êI‹ôĬs …eÃd»b‹ª£^"0uõÄ|ÑcÔëº F½é@}‹ÄtºJ°ÜXÔà‚k5êAkkŒ su`ª+ Ya€‹Qo¨i‰`Ôë “äêÃE™d“F½° g‘Ð#4²n–“íŠ-ªrŒz‰ÀÚÕ,z]4õ ¾Eé-Hoñ˜NW –»‹\pŒzµ`ª+Yç`}‹„Qo¨i‰`Ôë “äjÂE™d“‚ØýµÝNÁ¢gŽ=ã/)HÔ;rèÈò·._zòR±î÷Öéà¶/lÓû™+ˆY¤ôÄ™¬[ „åÄd»b‹ª£^"°võ£^A¼‡Qo Þâ1®,w5¸àN¼°wýõoÞsàªáSˆn±AkkŒisSÃTW4²nÁô£ÞHÒÒÁ¨×¦ÊÕ„Š2Õ&ë~oÝÒ“—ʼr[ñ[+ür·áÓÜ¢åo]~Çmw¸Eã|ÿùï]úù·}ã­0>yEy]õÄî¯íÖýéCÔƒ’EŽø “u „°œ˜lW ÃÜ•·žýÇw]ƒe™į\aíêƒù¢Ç¨× Ðì&bÔ›¤·xL§«Ë]E .2ˆn±Akk† su`ª+2Y·`z‹‡Qo$Hié`Ôë“äêÃE™p“ˆu¿·Nþã]zòR×}ö:]täÐXÛꯖ—ö£žèIÔƒŒE>=ñA&ëaÙ0Ín"æê0 .,(_¹ÂÚÕ,zµ®$F½)@z‹Çtºò0ÛƒîD·Ø ·5Ĺ:0Õ•¬[°»EÕfÔ3)-ÒÒÁ¨× &ÉÕ‡ŠB1á&»¿¶[ËŒ‹‚E±ijìaÔƒ†E@@|ɺZX6L³›È„¹:L† âW®°võ£^ò ÓU¨7Hoñ˜TWf»bÐÝ¢‚èä¶f˜075LuåA&ëŒn±1ê)-Œz½`’\}˜¢(ÓnÒÁ¨—hXôÄ™¬[ …eÃ4»b¦ÊÕd2\X¿r…µ«'õ…n ŒzS€ôIuåa¶+Ý-(n €ÜÖ Óæ¦†©®<(e]Å­Œz#AJK£^/˜$Wv( È´›tLõŽ:",rãîKúô²rïæXn-ÙòQÏ­>q\ŸïL+ `‘¥G >ÈdÝ-,&Û3U®&“á‚ø•+¬]}0_ôêE=LQT´¹©1êMÒ[$¦ÓU‚Ù®t·¨ ¸Å­­1¦ÍM S]y˺‹[õF‚”–F½^0U®&ìPÉ7éØ]=ê]÷Ùë–¿u¹ÒÐ&üïÝ›y÷Œ ÊmÝï­“ñ¿µB§ÉM»iŽ^”C¬þðj¬óKF=YKÉŠòºº®»¬Ç3Çž‘ñá+V”q݈ÜdŸÝRõŠFÒ#d²n– “튙*W‡ipÁAüʯ>àizI‚0W£Þ ¾Eb:]%Xî @w‹ ¢[lÐÚcÚÜÔ0Õ•¥¬+0·5ƒQo$Hié`ÔËŸIrõa‡¢PL¾™Ú±ÿëq©¯jÔÓF6ó¡WºÁåo]¾í Ûddç7ȈܮûìuþL÷W—×ÕôV&êÉŠ2¨/!Ž:"Ó„ed޼<¸ã¶;ô“Šz®h=ñA&ëhaÙ0Ù®˜ su˜į\aðêF½Ä@’«Qo Pß"1®,w »EÑ-6hmÍ0anj˜êʃXÖ˜ÛšÁ¨7¤´t0êåÏ$¹ú0EQ(¦àLíãײéOÎyòÈ0^‡–;¹-Ÿ?ùÎ'ãõfÞ=³bñÙvz‘\™ìêçge]¿Ái€óûÐç>¨«ô¥'F½;n»CF`ôUVxµÑ­ù{¸áÓ„{Ú.èVT@@|ɺZX6L¶+fÂ\¦Áñ+KX»z‚Q/%Ðã‚`Ô›Ô·HL§«Ë]ènQAt‹ r[3L››¦ºò –u¶¶Æ0êYÐђ¨—?“äêÃE¡˜ˆ3µ_wŠþ 0íiÔÓú´ÖÉ"XÈL;M£ô;„¸#JgNŒzz’ ä9û*õÒ©x>ˆVTLßÿ>Èd!,'&Û3a®Óà‚ø•+¬]}0_ôêE=,S4(qåõ ½Åõ-Óé*ÁrWº[x'^Øû±MKïýÖ§Mt‹ r[3L››¦ºò —¥C[“õ,èhIaÔËŸIr5a‡¢PLÄ©ÃE=$íLrª`‘ÏM{úøS]ûÆ_»TGV9›ÛFž»'F®n£žŽ¬þðj™éè6ýÝ֨篘ˆVTÌÿ+(e!,¦ÙMdÂÜþú²›NßtÛ¹0XŠÉpaAüʯ>àizi€ £Þ ¾Eb:]%Xî `ƒ nÏ«ï°ï5Ñ-6ÈmÍ0mnj˜êJ‚^Ö ښĨgAGK £^þL•« S…b"NõTÍ´7]Ô»î³×­ø­ˇÊв&÷?6+ûsåÍ+eºrQOsL#Wךõ7-٨Ŋ&òßù JY‡@ ˆiva˜{âøãò7{É–S`¼“á‚ø•+ ^}À¨—hpÁ1êMê[$¦ÓU‚å®6¸àZŠzÐÚcÚÜÔ°Ö•½,}XÙÖZÔ3)-Ðђ¨—9“äêÃE¡˜ŽSÇȨ§¦N{U£ž jË»î³×éÅ(Ü´©£^Í3õü‘‘ÒŒz«¨ ÿ=¯ ”u´°l˜f7†9F½ÖaðêƒQ•õ-F½ª ½Åc:]y˜íŠaƒ ®OQÏ„¹©aª+’Yú°²5ŒQÏ‚Ž–F½Ì™$W¦( Âtœš ¢žš"í¹$ãbä"y*ük˺iSD=½H®?âOŒzZëàrºV‚QZ•ä¿Û”²– Ó슙*Ǩ— ^Ùãiz­‚ô£^UÞâ1©®<ÌvŰÁǨ7 LuåA2K&¶æ1êYÐђ¨—9“äjÂE¡˜”SÓĨ§*¥½JQOG Á¹ëiLõÆ]‹CûÝĨ§_ŸW¿µõ²á¿Ï”²– “튙*W'ê™į,aðêF½ö@w‹ª™¨õ-¨o‘@z‹Ç¤ºò0ÛÀ£Þ40Õ•É,qØ×ZÁ¨gAGK £^æL•« S…bRNM%£ž*™öÆe5qÇmwÀ¢Ðw¦Þî¯íÖÖ&÷6êAn³QOèêþ'på±f¸‰QOvCý+ÛÊnËêþººµt®~ ¡ŠÊóßá JY‡@ ˆÉvÅL˜cÔk¯>õ°UQÝbcÔ« Ò[<&Õ•‡å®¸õ¦µ®$¨f‰Ã¾Ö F= :ZRõ2gª\M˜¢(SsjªõTqÚ;ðÀ ^rƒæuäБ¿µB­þðj7®ƒKO^*+*Ùˆ–µ‹?þyÅ+o^é6+ãwÜv‡®ènûÂ6·A­Š:.ä^F4ÿù«Ëîé´™wÏ`Ôk·0êUé-Óé*ÁrW\ ŒzÓÀZWT³”a\k £ž-)Œz™3U®&LQ„©9õMõÔ¸´·áÓÖy—‹…Xæ/rqMÈZËߺ|Åo­9:¢s>rþ¹ÿù~áÊ›WÂfÝZvPÉÆõì¼Õ^­çÊdwM[y*;æVþÎYEeu!ÜY„Ê­%d³þ¢æA¢¢ªà- ”u´°l˜lWÌ„9F½¶aðÊ^€¢'°XQ1ÈmÍ`Ô« ê[$¦ÓU‚宸zõL˜›¦º’ š%ãZ[õD´Ô0êåÌ$¹ú°FQ&èÔ7uÔSS\F£ÿã·4$*ªÊ?+(e-,&Û3aŽQ¯mؼ²ÇÓô­­1ŒzUA}‹ÄtºJ°ÜÀ£^eXëJ‚j–2,k-bÔÑRè—3“äjÂE¡˜ S_ͨ§â¥=F½bЧh þ;YA)ëhaÙ0Ù®˜ sŒz­ÂàÕŒzÍ‚ÐÖ$F½ª ¾Eb:]%Xî `€‹¡¨¹­¦ÍM k]IÎR†e­EíD=“ÒÒ-5Œz93U®&LQ„ :A‰z*FÚcÔ+qŠ¦ã¿‡”²®€– Óì&2aŽQ¯U¼²7_ôõš•­aŒzUA}‹ÄtºJ°ÜÀ£^eXëJ‚p–,ÌjíbÔÑRè—3SåjÂEA˜¦DÀ¨§Â¦=F½q LÑÔüw¯‚XÖвaš]1Så†õZ„Í+{ŠžÀtE#Abk£^UPß"1®,w0ÀÅÀ¨W ¦ºò % ³Z»õD´Ô4õÞòoþÖ¿ûðÏ­»ö_ÈÿÏQ$ç_ýý8,—öÖœ·FþéhòöÚ×¼®z‘%(S45xë ˆe]-,&Û3Unhʨg\pп²„Í+{Ë%j©r5a¢ LÜ ¥fÔ+ÈyŠQ/ ¨Q¼¥IJ®€– “튙0W‡ÉpaAÿÊ6¯ì1êEM­uŒz•@}‹ÄtºJ°Ü€ît·¨ ·5Ãä¹é`­+ òYš°¦%‚Qχå+cP”¨]&ÉÕ‡5Šê3q' ©£ÞÄœ§õ‚EAÀ[@,ë haÙ0Ù®˜ su˜ ô¯,aóÊÛ|ÑcÔ‹‚Z õ*ú‰ét•`¹+Ý-ˆn±Ank†ÉsÓÁZWä³aJKG QϤ´t`ùÊD%j—Irõa¢úLÜ hЍW2ç)F½P EQ(ðö˺ZX6L¶+fÂ\&Ã…ý+K˜½òÆ¢Ô´D4õ ¾Eõ-¨o‘˜NW –»Þâè䶘675¬u%AAK¦´t0êù°|e ¢µË$¹š°FQ¦ïT)êUÊyŠQ/èP¼ÉIJ®€–Ó슙*W“ÉpaAÿÊf¯¼1êE)-Œz•@}‹ÄtºJ°Ü€ôD·Ø ¸5À´¹©a­+òY‚°£%…Qχå+c•¨]¦ÊÕ„5Š‚0‰' ’QoŠœ§õ‚€EÁ[]@,ë Èay0Ù®˜©ru˜į,aóÊ£^Ðђ¨W Ô·HL§«Ë]Hoñ@t‹ Š[L››Öº’  %;ZRõ|X¾2Q‰Úeª\MX£¨>Ówšõ¦ÎyŠQ¯>ˆP¼áIJN€– “튙0W‡ÉpaAÿÊ6¯¼±èE-)Œz•@}‹ÄtºJ°Ü€ôD·Ø ¸5Àä¹é`­+ Zj0¢¥†Qχå+c•¨]¦ÊÕ„AŠê3‰'¬‚¨W3ç)F½š @Qpð¶ÐË:ZX6L¶+fÂ\&Ã…ý+K˜½òƨD´Ô0êUõ-Óé*ÁrWÒ[,'^Ø÷±MKïýÖgL}‹r[3Lž›Öº’ ¢¥#Zjõ|X¾rôàC·_xͲ¾»µÅ$¹ú0HQ}¦ò„52êÉyŠQ¯&(P¼ùô²N€– “튙0ç¹ì¦Ó7Ýv. 1.,è_YÂì•7F½  %ˆQ¯¨o‘˜NWf»˜ÞâÙs`ãà¶ó½&ÀŹ­&ÏMk]PÐRƒ-AŒzį\í¸çRù[–{LKÔ“äjÂEõ™ÄD½€9O1êÕù‰bðßÿ zY'@ ˆÉvÅL˜›÷ÄñÇåoö’-§Àx“á‚þ•%Ì^ycÔ òYšõ*ú‰Iuåa¹+€é-žÜ£žisSÃ`WD´Ô`AK£žñ+WŒzÉ1U®& RTŸ©<Á¹¨<ç)F½©A{¢Hôýïƒ^Ö Ð²a²]1ææ1êµ³WÆæ‹^¨‡I‹ Ÿ¥‰Q¯K£žñ+WŒzÉ1U®& RTŸ =ÁíyðæH9O1êMÂÅ£G >èe-,&Û3an£^ó0{åQ/(g)Ë#êA}‹Ò[$¦ÓU‚室·xõÊÁZWD´Ô`>K£žñ+WŒzi1I®> RT“ =]Ĩ7Oø —u´°<˜fWÌT9Oå¨g\Xп²„Ù+ou£V­žƒp–2F½ò ¾Eb:]%Xî @z‹‡Q¯ ve@DK ¶³d1ê9¿rŨ—“äêÃ&E5™ÐÓEŒzS€êDQéˆzY'@˃ÉvÅL˜ó0ê5³WÞõÂj–8F½ò ¾Eb:]%Xî @z‹§É¨¹­&ÏMƒ]ÐÑ’‚í,YŒzį\1ê¥Å$¹š0HQ}¦õt£^Uœ(6=ñA/ëÈay0Ù®˜ sF½æaöÊXÝ¢'0lõ$³ô1ê•õ-Óé*ÁrWÒ[“{ºˆQ¯*HN›ø —uä°<˜lWÌ„9£^ó°|eŒQ/HfécÔ+ê[$¦ÓU‚室·xõJÀZW¤´t`8K£ž‚ò•1F½´˜*W)ªÉ´žŽbÔ«z5@@|ÐËÒ-,&Û3aÎè×0Ì^y«õ0lõô²Nˆõ ¾Eõ-¨o‘˜NW –»ÞâaÔ+k]ÐÑ’‚á,eŒz ÊWÆõÒbª\Mؤ¨&“{:ŠQ¯èMÔ=ñA2K´°l˜lWÌ„9£^Ã0{åQ/ˆe]Á¨WÔ·HL§+³]1Hoñ0ê•€Á® èhéÀj–8F=å+cŒz 1I®>lRT“É=ŨWÄ&j†ø ™¥ZX6L¶+fœ‡Q¯a˜½2V·è Ì[ý±¬+õʃú‰Iuåa¶+Ý-*F½0Ø•)-XÍ×hÔ3)-P¾2ƨ—“äj Eõ™âÓQŒz%Ai¢Æèˆ’Yú …eÃd»b&Ìyõ†å+cŒz!@)ëF½ò ¾EbR]yXî @w‹*ã¨gÚÜt°Ö•)-˜ÌÒǨ§ |eŒQ/!¦ÊÕ„AŠj2ŧ»õJ‚ÒDÑ#$³ôA ˆÉvÅL˜óT‹z¦Á…ý+KX¾2V7êaÞê!ÈdݨWÔ·HLª+Ë]ènñ Z£ÞXëÊ€”–LfécÔSP¾2ƨ—SåjÂ&E5™âÓ]Œze@f¢&鈒Yú …eÃd»b¦Íyõ†å+cŒzµA&ëF½ò ¾EbR]yXî @z‹gÐÚN¼°oýõoÞs`£Wßb€â֓禃Á® HiéÀd–>F=å+[/¼ôèã».ýüÛÞ·¨.Q+L•« ›Õd¢Ow1ê•™‰š¤G >Hf郖Ó슙0g\yëÙ|×08šÉpaAÿÊf¯ŒÕ-z Wß@#ëF½’ ½ÅcR]yXî @z‹º[TPÜ`òÜt0Ø•)-ØË:QOaüÊD%j—©r5a“¢:Lñé4F½‰ 1QÃôÄÉ,}Ãò`²]1æê0.,H`ùÁò•1F½Ú ‘u£^IÞ"1®,w ½ÅÝ-*(n 0yn:ìÊ€š–ìeÀ¨§0~å ¢µÈ$¹š°IQM&út£^1LÔ<=ñA2Kä°<˜lWÌ„¹:L† X~°|e¬nÔÃÂÕ7ȺˆQ¯$¨o‘˜NW –»Þâî·˜<7¬u%AMKƲ®`ÔX¾2]‰Zdª\Mؤ¨&Ó}:Q¯&jžø ™¥rXL¶+fÂ\&Ã… ,?X¾2ƨWÔ±ŽbÔ+ ê[$¦ÓU‚室·x »EÅ­¦ÐMk]PÓ±¬+õ–¯ŒAW¢™*W6)ªÉtŸNcÔ+u‰Z¡G >Hf郖“튙0W‡ÉpaAË–¯\Õ-z;W¯@ë¨ ¢Ô·H ¾Eb:]%Xî @z‹º[TPÜb3yn:ìÊ€š–Œe]Á¨'°|e ºµÈT¹š°IQM&ýt£^¨KÔ =ñA2Kä°<˜lWÌ„¹:L† X~0~劧éÕi¬»õJ‚ú‰ét•`¹+é-ènQAt‹Íä¹é`°+jZ °”uHsQϤ´t`ùÊt%j‘©r5a“¢:L÷é:F½q -Q[ôÄÉ,qвa²]1æê0. è_ùÁò•1F½ u£^IPß"1®<ÌvÅ ½ÅÝ-*ˆn±™<7 ve@PK–²aÔX¾rQ‰Úeª\ؤ¨&“~ºŽQoHKÔ=ñA5K´°l˜lWÌ„¹©™ $°ü`ùÊ£Þ´ ‹u£^IPß"1©®<Ìv »ÅÑ-*(n 0yn:ìÊ€ Ö:Ìdݨ'0~å ¢µÈT¹š°IQM&ýt£ÞHЕ¨Ezâƒj–8haÙ0Ù®˜isS3.,H`ùÁò•«ºEO`êêèbƨWÔ·HLª+Ë]HoñÌ·/ìûئ¥÷~ë3n$(n 0yn XëÊ€ –Ìdݨ'0~åj˜“|øö ¯Y&÷ ‰šgª\Mؤ¨&SºŽQo$èJÔ"=ñA5K´°l˜lWÌ´9ã²›NßtÛ¹08‚ÉpaAËƯ\ñ4½iAë:F½’ ¾EbR]yXî @z‹g®¸í9°qðÛù^7·˜B7 ve@PKf²naÔ¿r5ÌI;î¹Tþ–å~!0QóL•« ›ÕaÒOõ,ˆJÔ.=ñA5K´°<˜fWÌ„9ã‰ãËßì%[NñL† X~0~åŠQo*PÄ25êA}‹ê[$Pß"1©®<,w ½Å3WÜrŒz&ÏMƒ]ÔZ‡¬sõ°|el˜“õ’`ª\M˜¥¨S2À¨gAT¢v鈪Yâ ‡åÁd»b&ÌŒzÁø•+F½©@Ë£^IPß"1©®<,w ½Å3WÜõÆÂ`W4µÖa#ëF=,_æ$F½$˜*Wf)ªÃÔŸ 0ê(JÔ:=ñA5Kä°<˜lWÌ„9ƒQ¯1¿rŨWä°<0ê•õ-“êÊÃrWÒ[g)ƒ–“튙07 £^0~e‰§éUý+KŒze@}‹Ä¤ºò°Ü€ôÏBtcÔƒÝDÐÔÚ…]¬ÓõšáÎÔÛu÷.5ó®Á§YkF½§ÿòi™¶ùšÍ²5—ö`Μù¨ô†r’L;ÿ¢³ÜˆÐ<'âmøƒÁ¹„ƒ}~SžŸbÔ›†©r5a™¢©™ ”ù¯RnÞâI-êA?¢éˆÂYÊ ‡åÁd»b&Ì’BÔƒ–ì_YbÔ«úW–õÊ€ú‰Iuåa¹+é-ž…èvâ…}_û†=6úƒá@q‹Íä¹é`³›²Z»°‹u£^3F~§ÞÒ“—ÖŒz>™¯+ÊkÁ"?*½æµ_æü³_ùeÙŸ ÊêþL¡ß£'ãzq À¨7 SåjÂ2ES3%('ò_¥Ü ½ÅèGUéˆÂYÊ ‡åÁd»b&Ìqù¶•›oÿ/0ˆL‰ X~°e‰Q¯4ˆ_¹bÔ+ê[$&Õ•‡å®¤·x ½ÅÑ-6“禀Á® ÈjíÂ.ÖiŒzÍõÆ™.ê‰Õ|ŠvÐæ`‘•tã›7mÞ5»ËògŠ'}Rço»q,ŒzÓ0U®ÌRT‡)A9‘ÿ*åé-ž¤¢Ä#J“ø œ¥ rXL¶+fÂ\¦Ä ,?Ø¿²T+êaöÊį\1ê•õ-“êÊÃrWÒ[$ÐÝ¢‚è›)tSÀ`Wdµaë:F½f‰z²‘¢Ka OÖ“ËD½’Ñm朙g¬U„a ŨW™©r5a–¢:L ʉüW)7Hoñ0êQUzâƒp–2Èay0Ù®˜ sS3.,H`™Áø•+F½r |eŒQ¯ ¨o1˜NW –»Pß"îD·ØL¡›»2 ¬µ£X×5õLJKƯh ¢ž ÂfÇE=™YœËD=n#?N Ö^²vðróñNû ¢ÞÿŸ½ÿ¾ä¾ë;_îÝݺ»[ÙÍ’›uwƒÃCURÔ®œkÐn¥BR ƒ´Ù½Y²×@T^H¨Õ&˘KFckðDz°‘%[rŒä8ž1²-Å‘äŒAkè׌fdi~HMdŠÊ÷3ßÏwzúû|ŸþœOwÞŸÓÝçÕõð©óýtŸ>ßÑ÷;ç|æéîÓ9ûßF¦ÊÄ,%ƒ™´0áoeXÞüL'ê¡ÉdÅHÂÙ”!‡-ƒÉvi¦Í f2\Y¨` ÃøµH£Š^Àòµ`(_ ¦¨—΃ét½°Ü% ¾9Aws…èæÍºìÖBVÛ,F±¹Ûæ¨Çòå©+ê=ü»‡ñœ¨÷Ô\8¶Ù2Ü·GíÅÓo¯ü+1ÞîJ]….|'í‹Ûâr·aŸáQ¯û'¯k6Q[Ê.SåFb™’ÁL Z˜ð·2,Ho~õ¤¯8iC8›2ä°e0Ù.Í´¹ÁL†+ laØ¿IQ/²×²ùE=Ô7'¨oPßœ˜N× Ë]¤7?èn®ݼ™B7›ÝZÈjÄ"¶ŠzuÄ(f£^¼î­ï¹µ‰™/,ˆzqËvÔ _¶¶ƒ»%îâ஽i)>öê¹:6»§þð©}oÞo}ï­qƒûw.wÛs͇ë5Ûaƒ0‚>¯™6ŽWË _®ü<¾-eªÜH,S2˜‰A þV†éÍÏD¢²‘LYœ´!œMZØb˜l—`ÂÜ&Õ… ¶0ì_‹¤¨—ÙkÙõÖB}sb:]/Œw]Þü »¹Btóf Ýlvk¡¬m‹Ø(êU  Ë+¾åW´.83YXš~wðÃx kÛâ`õâGÝ…‘°}ØÜ[¸E ܵ7-ÝÏýx–ðelpA |qÏgž9c¿‹K<4ïÆ_º1nÖŒ4Ú;¿pØ`kÕ¶3Un$–)Ìô …‰%‘Þü(êI_qÒ†v6YhaË`²]š sc˜ W*ØÂ°-Ò¨¨ÇòµTh^‹§¨·ê›Óéò±Ü% ½ùAws…èæÊä¹ìr ¬m‹Ø(êUpÿçîOk¶–»¤7?èn~ݼ™B7ƒ]”µMa[E½åCWš’ÓÏ=ý‡oÍurM•‰eJ3=hyõdââ ¤ íl²Ã–Ád»4æÆ0%® $°…aüZ${›ÍkñõÖB}sbR]>–»¤7?{ÒÛùs‡¯¿å²CGnÂx ˆnÞL¡€Án-”µ b[E½åÛ›–:zà†Û.·¯ìôsOß~÷?»ö¦—…_¹méz¦ÊÄ2%ƒ™´<ÛõŒdúâ ¤ íl²Ã–Ád»4æºí¿ãª[\ƒÁ=L‰+laØ¿IQ/‚×6˜uÔC}s‚úæÄ¤º|,w Ho~ö¤·CGnºðvðµ/ÑÍ›)t°Ù­…²¶AÌaË ¨·|{ÓÒ'î}kø)‡[ŒWÓÎyÁ‡¾þü ç°Í2™*7Ë” f’Ðò(êÉÄÅw„6´³ÉB[“íÒL˜ëðÄ©ÇÃOöÍï¿ã{˜W*ØÂ°-Ò¨¨ÇøµT^Û@Qo-Ô7'&Õåc¹K@zó³'½)êíÁf·ÊÚ¦°…-†¢ÞòíMKŒzÈyü7×|ùäcØfÉL•‰eJ†1=h‘õdââûBÚÙd!‡-ƒÉvi&ÌuPÔsÅþµHŠzë vm E½µPßœ˜T—å.éÍÏžô¦¨·›ÝZˆk›Â¶ŠzË·7-m$êm{΋L•‰qJ†1=h‘¶*ê¡É,Äw‡6´³ÉB[“íÒL˜ë°>ê™ W*ØÂ°-Ϩ¢°-j×–PÔ[ õ͉IuùXîÞœ »)êµ0Øå@\Û¶°Åpz&¥Mã×RíMK•£žrÞ%¦ÊÁ2%ƒ™$´HŠz2qñ=¢ íl²Ã–Ád»4Óæ:(ê¹b[E½uº¶‡¢ÞZ¨oNLªËÇr—€úæÝm1QϺìr ®m [ØblmÔcùZ°½i©ZÔSÎÛÃT¹‘X¦d0“„i{¢R‘ÌE|§hC;›,ä°e0Ù.Í´¹Šz®˜À–gTÔcÿZ$¤®í¡¨·ê›Óéza¹K@}s‚×Â`·ÊÚ¦0„-‰¢Þòí­K¢žrÞ ¦ÊÄ2%ƒ™*´HŠz2qñý¢ íl²Ã–Ád»æº)êùaÿZ$E½$t®­¢¨·œÓéza¹K@}s‚×Âf·âÚ¦0„-‰¢Þòí­K®QO9¯“©r#±LÉ0& -Õ–D=t"™‘ø®Ñ†v6YÈaË`Ê]‚ sÝ6õPÁ†ýk‘õ’й¶Š¢ÞZpL§ë…å® Ò›t7¿¨‡èæÍºØìÖB\Û†°%QÔ[8¤%·¨§œ·†©r#1NÉ0¦ -•¢žL\|ïhC;›,ä°0Ù.Í„¹nŠz~Ø¿–gTÑ ˜À–k«(ê­…çÁtº^ïº ½ùAzSÔka³[ qm#XÁFQoá–¢žr^SåFbœ’aLZªmˆzˆD2/ñ¤ ílšÃ–Ád»4æº)êùa[E½$D®m£¨·œÓéò±Ü% ½ùAzSÔ»ˆÁ.úÚF°‚-Œ¢ÞÂ!-zÊy=˜*7Ë” fÂÐR)êÉÄÅ÷‘6ä³iB[“íÒL˜ë¦¨ç‡ lyFE=&°åAäÚ6Šzi¨oNLªËÇr—€ôæéMQï"»µ×6…laõi©PÔSÎëÍ„¹1X¦dS…lñQ…Hf'¾›´!ŸMrØ2˜l—fÂ\7E=?L`Ë£¨× …k )ꥡ¾91©.Ë]Ò›¤·eD=Sè`³[ qmSXÁFQoá–FG=å¼!L•‰qJ†1ahÁõdââ{JòÙ4!‡-ƒÉvi&ÌuSÔóö<ŠzÝP¸¶¢^ꛓêò±Ü% ½ùAzSÔ»ˆÍn-ĵ`[E½…C]õ”ó†3Un$Æ)Æ„¡SÔ“‰‹ï,mÈgÓ„¶ &Û¥™0×mMÔ3®,T°…a[žáE/`[®-äõPßœ Ày@}sbR]>–»¤7'èn(êíb³[ }m#˜À–GQoáP—E=å¼±L•‰qJ†1ahÁ–õ‡dŽâûKòÙ4!‡-ƒÉvi¦ÍuSÔsÂþµ<:L¯òÖvRÔKC}sbR]>–»Ô7'ènœ?wøú[.;tä&Œ†îæÊºØìÖB_Û&°åñz&¥MË× }幯üÍÿñoƨ».WüàŸù§ï¼ð‹‘ã—ÿå÷~îi&­_øý¾ñ=ߊí»,v?¿¹³邾û9óÜ &ª‡~ÿví§ä~N@?Š=4¿ýüÝ×ü—»«k-Šz’¿®òÙ4!‡-ƒÉvi¦Í%í¿ãª[\ƒÁ]&Õ…¶$L`Ë£¨× yk;)ꥡ¾91©.Ë]ê›t7Wèn®L¡ë‹Án-ĵ`ÿZ$E½™:ø‰ƒ»ÿnv^þ—òñ#ǵ7½ìøÓ_BöŠ>þ¹}Ø8a±ûy÷Î~LÑ >~O¿ý<ýô#ÈU‘ö”ÜωGТ9îçê}~÷ou­å×nþ5|ŸІd¦ðë ŸMrØ2˜l—fÚÜ`&Õ…¶$L`Ë£¨×mkk)ꥡ¾91©.Ë]ê›t7?ˆnÞL¤ë‹Ín-ôµ`ÿZ$E½™ŠQïÛþûÿ g½yøÅåïû¯ã¯ÇÏÜü×>øƒ[²†Ixc RÉ@¦ ÉL¡ ÉLÅ·˜6ä³iB[“íL˜Ãd¸‚PÁ† lyõ: mm­ùF=Ô7'¨oNLªËÇr—€úæéÍ¢›7éúb³[ }m#Ø¿IQo¦jF½èüŸþ‹ÿígþŸñ—ä†Û.WÚëÁ„¹1§dÓ†dކd¾â›KòÙ4!‡-ƒ)w &ÌaJ\A¨` ö<Ë^À¶$h[[KQ/ õ͉IuùXîPßœ ½ùAtóf"]_lvk¡¯mû×")êÍTý¨ž+<ã>ú oý*J{YL•‰qJ†1yHæaHæ+¾­´!ŸMrØ2˜r—`ÂܦĄ ¶0L` £Ãô: lm3E½4Ô7¦ÓõÂr×éÍÒ›D7W¦Ð Àf·úZ}Œ_K¥¨7S›ŠzÿõÁ¯Ÿûúï¹Si/—©r#1NÉ0&É! É|Å7”6ä³iB[“íÒL˜Ô¸‚PÁ†laõ: lm3E½48¦ÓõÂx×éÍÒ›t7W¦Ð Àf·[}Œ_K¥¨7S›z‘Ò^SåFbœ’L’9B’Y‹o%mÈgÓ„"¶&Û¥™07†)q¡‚- Øò(ê­‚ªµåõÒà<˜N—å.éÍÒ›t7W¦Ð Àf—†¾¶Œ_K¥¨7SSˆz‘ÒÞ¦ÊÁ8%Ø<$s„*$³ßDÚϦ ElL¶K3an0“áÊB[&°åQÔ[UkË)ê¥!Ày0©.Ë]Ò›¤7?èn®L¡ë‹Ín-ôµúX¾LQo¦¦õ"¥½N&ÌÁ8%Ø<$³ƒ$$sß>ÚÏ&9lL¶K3mn0“áÊB[&°åQÑ[UkË)ê¥!Ày0©.Ë]Ò›¤· Ο;|ý-—:rÆÇAwse"]_lvk!±ÕÇòµ`Šz35µ¨)í­`ÂÜŒS2Œ)D’væÔ‰ð7úÀ}û1¾AHB2wñ£ m‚ÖÁd»4ÓæÖÙÇU·¸ƒ˜ WBØ’0-ŒÓ[IKõÒà<˜T—å.éÍ ºÛ®CGnºðvðµÝÍ•‰t}±Ù­…ÄVËׂ9F=“Ò¦lަõ"¥½=L˜ƒqJ0yHÖ:úØ=á¯ó;o¿ ã„$$sß2ÚPÐ&9lL¶K3m.é‰S‡Ÿì›ß9Æ/0®,„°%a[E½U´DQ/õ͉IuùXîPßœ »írˆzˆnÞL¤ë‹Ín-$¶úX¾l £êØLM9êEJ{˜*7û” `ò¬5µ¨‡$ ß,ÚPÐ&9lL¶K3m.iSQlaXÁFQo$-QÔK@}sbR]>–»Ô7'Ho»fõL¡€Ín-$¶Ê˜½–MQo¦¦õ¢mO{¦ÊÄ>%˜B$k)ꉷø6ц‚6AÈaË`²]šisIŠzXÁFQÏ@Ï’@Q/õ͉IuùXîPßœ ½íRÔ3Í. ‰­>f¯…z&RÔ›©¹D½h{Óž©rc0NÉ0¦ÉZ“ŠzˆA² ñ ¢ m‚ÖÁd»4Óæ’õŠc[==KE½Ô7'&Õåc¹K@}s‚ô¶kÛ£›ÝZHlõ!~-ÌnËk(êÍÔ¼¢^´iÏ„¹1§d‰d-E=ñßÚPÐ&9lL¶K0anE½â˜ÀF‡éˆY)ê% ¾91©.Ë]ꛤ·]Šz=!±Õ‡ ¶Ìy‘¢ÞLÍ1êEH{_øýbƒE1an Æ)À"É1¨‡$‹ßÚPÐ&9lL¹K0anE½âXÁFQÏ@Ì’HQ/õ͉IuùXîPßœ ½íRÔë ‰­2„°e`ÈkSÔ›©ùF½¨öþðñû±v9L˜ƒ}J0‘Hr(ꉷøvІ‚6AÈaË`Ê]‚ së(êÇ ¶0Šzb–DŠz ¨oNLªËÇr—€úæém—¢^O¨l•!‡-+(êÍÔÜ£^ô»GîüÔ¿{ÇùÎa|9L˜ƒ}J0‘Hr(ꉷ8iCA› ä°0Ù.Í„¹uõŠc[E½½P²¤áõPßœ Ày@}sbR]>–».Ho~Þv)êõ„ÊVŠØ¬±ß­¤¨7Sˈz gªÜHìS2€‰D’c"QH–$Î@ÚPÐ&ElL¶K3anΨg2\YaK ¶0*z{¡dICQ/õ͉Iuùïº ½ùAzÛ¥¨×[}èbóÅx×EQo¦õfÀT¹‘اdÓ‰$‡¢žx‹36´ B[“íÒö†¹ Šzű‚-‰Ó3P²¤¡¨—€úæÁtº|,w HoNÐÝ.)õÝ\™B7³][eèbóÅr— ¨7SŠz3`ªÜŒS2€‰D’IQO¼ÅH Ú¡ˆ-€Évi{Ã\E½â–DQo/d,i›iÔC}s‚çÁ¤º|,w ¨oNÞ.Ùê¨Çf·*[eHc3Ål—æõLJ›¤±ùRÔ›æÆ`Ÿ’L$’LSˆzh@²0qÒ†‚6A(b `²]ÚÞ0—a#QlIXÁFQo/d,iSÔK@€ó`R]>–»Ô7'Ho—(êõÊVêØ±Ù­¥¨7SŠz3`ÂÜìS2€éD’IQO¼ÅH ÚÔ ‡9ù­ƒß´oßZoÛ#xó­·¶7¸û¾û›U+÷¶Û˜lG×íÛ×òë΃Ÿf°k™rÔ{ðá#Ÿ½ÿ§ÏœÅø”±‚-Œ¢Þ^ÈXÒ¦¨—€çÁ¤º|,w ¨oNÞ.QÔë•­2²Ùa°Ë¡¨7SŠz3`ÂÜìS2€éD’iãQH–'Î@ÚѦ¦id®Þ´o_xç Ë«®¸"êú²yÈÍ·ÞúòW¼"ŒÄZ÷ýW^· ÷ã_zò©×üëã`³Ÿ |xݾ}ymqçqËöcãÃÃrݾ·0صL9ê}çÎ!|ÿŸ2V°…õ˜Ã K@Q/΃IuùXîPßœ ½]rþÜáëo¹ìБ›0>º›+éúb³[ •­&²Ùa­Ë¤¨7SŠz3`ÂÜìSÒ—éD’ïÌ©7Üvùûöc¼ Yž8iCD›š&¢¹ŠQï5ÿðêf$6µæÈ»›o½5|ùª‹Qß탘ðš¨|ᡇÃHXÚGðÅ]…%Ýõ^½S Ã3"Ì]ó“¯Ûyl*êûï¸êÖ×`®¬v{úÌÙðÞuðÓíÁHQort˜^ –€¢^œ“êò±Ü% ¾9AzóƒîæÊDº¾ØìÒPÙ*C#›¦º|Šz3¥¨7u¦ÊÄD%}™N$3‚$Ëg mˆhSÓ´0WoÚ·ïå¯xÅ—ž|ªAÔ‹#MÔ‹G̵×Fa›vÔ‹#v˘ÿÂ*„¼¶ëv:£zAxàÚ¨·š)qµ+Øgï |ó+ËN¿{»–€¢^Ô7'&Õåc¹K@}s‚ôæÝÍ•‰t}1Û¥¡²U†L6#ìt½(êÍ”¢ÞÔ™*7•ôe:‘Ìê,Rœ´!¢MM»…ùyÛþ¿ÿÊ+Û#6ƽiß¾æÐ¼•©.øÂC;}¦=²rË;^˜Z„å3ÝŸ¯—ˆz‡:rüôY f1%® v{û7†o~^‡ã%0„-‰¢^ –XŠz]Pßœ˜T—å.õÍ Ò›t7W&ÒõÅl—†ÊVJÙ\0Òõ¥¨7SŠzSgªÜìS2€IE2¨?²HqÒ†ˆ65íVSW¶‹âZ”·ÒÊý|æ¾ûÃ`X†E½Æ?}]ëê±ô…Ûfämûoloèá#ͪàÂÕ6ö†¹öXû¶oŒãáFâ–M{úÌÙxŽí«¯¼2nÜuðÓñœÜhå‘z¿zëmÍ>|¤½Ê>öèSÇâ—áQí-=0„-‰¢^ –XŠz]Pßœ˜T—å.õÍ Ò›t7?¦ÐõÅf·*[M(esÁB7€¢ÞL)êM sc°OÉ&É, ýÈRÅH"ÚÔ´[XMé¨ÏŸ ËÍ·ÞŠU`÷söâÇê…UíŠ+£Þ«¯¼òÐCGš/yòX<8,á[jÆã·Vµ/’?Œï5W_ý™û¸æuî‡%Ü….«Â·V}èŽ;Âý¸q³6ì*>W¸ [†;ñO–›/–µ£O ßd·ßyÅÑÛo¼1¬½nß[âöŸ½ÿ¸}ôwÜ7›ýê­·ÅÏü᫯noÓ~l¸¶ož=lßÞ²,V°…õXÄK,E½.¨oNLªËÇr—€úæéÍ º›+éúb³[ ¡­&IJY`žFQo¦õ¦Î„¹1اdS‹d~d©â ¤ mjšVY F]Q/hjÚ÷_yeûÃøÀîçìÅ‹`ìd¸=!¯ÍF½·í¿pNëgî{ ‰âwr]ëSöžÛ bÑk² b¶k¢^Ì|ºãlpa·GbV ß|ðÈSÇÚ›…?æÑ§Ž5!,nn›‘F<ˆ¯õ|øH,tíÃ÷â¢ð]5#A|l¸mz߯Þz[ Žì+ˆlaõ.B½’•õº ¾91©.Ë]¤7?¨oNÐÝ\™H×›ÝZm5¡—ÍóÜ0Šz3¥¨7u&ÌÁ>%}™T$sô#Kg mˆhSÓ´°ÊÖF½ 9^/lîãÓô"ìçKO>ÕF‡Š1ê…%¯¸Ÿ°Ø¨wè¡Ý(âûÐíŽzÃ}qƒ&Ï윾züÌÙxßnpçÁOÇgoF>³sù‹0Õ#a¼àzE½Øïâ¡|».>{{0>GðÅA<¼ V°…ѹ·¡^ÉJŠz]Pßœ˜T—ñ® Ò›Ô7'èn®L¤ë‹Í. •­2ô²éc›Ì%ê™”6Hcó¥¨7u&ÌÁD%}™T$³€î# g mˆhSÓÔ±Êb¨JG½à·üþ&–ð»}ÜO¸m»nß>$<«9Rï3÷=Åh£^⋇ý·Ïºm¯m—¸¶ØàÚ'ÛMÂÈÝO<Êï;¯¸¢ a½¢^x Œ´Çï:øéf$>¶=Ò ®|®"XÁ–døaz£ØÜ¡^ÉJŠz]Pßœ˜T—ñ® Ò›¤7?èn®L¤ë‹Ù. •­2$³‰c˜c«¢ºØ¬)êMš©r#1QI_¦É, ûÈ‚ÅH"ÚÔ ‘U‹ÒÚ¨}pçะ}¸Å©¸q7ëŠz1á ‹z>|$|žºÙ akÛ\ù\E0„-‰¢ÞEHWÒEQ¯ ꛓêò1ÞuA}s‚ô¶Çùs‡¯¿å²CGnÂø èn®L¤ë‹Ù. •­&$³‰c•IQo¦õ&ÍT¹‘˜¨¤/S‹¤—3§NÜpÛåîÛqoè>²`qÒ†ˆ65í@VSŒq™Q/[Æ‡à’¸v?ˆw]VF½„xŽmxȇn¿#|¹ÿŽ«n=pM\óÜuë¢Þ5¯{ÝgîÀj6 ÷w¿¥Öcƒ˜ðÚa.ެ msáÛPÔs7<ê1ŠÍÒ•tQÔë‚úæÁtº^ﺠ¾9AzÛãБ›.ü†|-ÆAwse"]_Ìvim5¡šM«ÜHŠz3¥¨7i¦ÊÁ>%˜Z$½}ìžðîðÎۯ¸+DY¶8iCD›š¦…UfcÜZ͇嵫E½ðì¯Þ¹ìlðÀÄŸì›ßy\›ήm‹\×]ý¢tÔûÎAGêŨ{¥‹¸eûÃòõ SÔ»éJº(êuA€ó`:]>–»Ô7'Ho{liÔc³[ ¡­&T³)c’OQo¦õ&Í„¹1ا¤/S‹¤/E=ñg mˆhSÓ´°ÊQïØé3oÚ·Ï^# †‡|ÿ•W¶=¢^¼àZ#á˸e¬i¯|Õ+ÃO¶‰zqÐÆ¸FÜàÕW^‰qHG½ðð&„Ù‘† sñ?>)¯oo©¨W˜Î½Ýn% Å£ê›8pLªËÇr—€úæémyF=éúb³[ ¡­&„³Éb+BQo¦õ&Í„¹1˜¨¤/S‹¤/E=ñg mˆh“Ò„°úQ/ †U7ßz+Æã3Þ¶ÿÆö`ñ¨wè¡ Bw]+êár·ñôþû¿ýŸ7Q¯¹Ží#OkǸ ×Ó¸xgåÇÏœýÐw4_ƨ6kF¢ðM†ñ_½õ¶&„Ũ÷­c÷6ÌÅo×´W¿Åõ SÔÛn% Šz]à<˜T—å.õÍ ÒÛŠzPÙjB8›2ö¸"õfJQoÒL˜ƒ‰Jú2µHúªõP|dñâ ¤ mRšVÙ—ž|*Æ8º(F½°A;Õ…ûa$hF‚/<ôpØ2,¿uð`3ˆx×%¦.õâI¾7ßz[ü2^îöšŸ|]³Á#Oûæ—sØæúGÿm3Øì-†¼Gž:vݾ·„6á)Âí“vcÔ K³M6 #¨oñòa‰'ÏÞuðÓMt³ .ö»ð\ö ¼ß¸ãŽf¤D¿sz¬`K2üÜÛ€]lÖЭ$AQ¯ œ“êò±Ü% ¾9AzÛCQ/B[Mg“ÅWŠ¢ÞL)êMš sc0QI_&I_Šzâ-Î@ÚÐÑ&¥ a5}ðö;â¡gayùÎÅd±Áz8ŒÇµaË(Üÿþ+¯ «šÍ~ëàÁ•ûA¼[隟|]óÀæ)â³Äñx ÜæÂ—aÕñÓgc¿k–°A Â6q0<$îö3­‹`±ë5o»ñÆöMÔ «^sõÕaçá6|ˆüðΪ¸ñw^qE v×¼îÒŸ«ìÂýøŒáQa·aûp¿}è_°ò±íÁö§ï•¶$ã£Ø¬!ZIÚ£ê›8&Õåc¹K@}s‚ô¶‡¢^„¶šÐÎ&‹1®E½™RÔ›.SåFb¢’¾L0’¾õÄ[œ´¡£MJÈjúÂCß}ßýmØ Š›½iß¾àæ[omç¼èØé3í4 ß­ô™ûîßñ@—Øé=t#A¸çoÿÖ?øé?÷c7üÕæœÜ ¾þLJ>rݾ·Èy°ÁÛn¼1lÐ>¯£Þ«®¸â‘§ŽÝ|ëma³°qxHX…ÅôÚ–÷ÙûhØ+c„Áøí…;X4 šÇ®,ˆ!lIõv ZIš¢^8&Õåc¹K@}s‚ô¶G¹¨‡îæÊDº¾˜íÒÚjB;›&–¸‚õfJQoºL•‰‰Jz1µH¨õ{dÄH:Ú¤4l1ïÖ¹ØãzzâÔãá'Û|¦Þ.éúj¢Æ–„!lIõv ZIš¢^8&Õåc¹K@}s‚ú¶‡¢^„¶jÐΦ‰®,E½™RÔ›.SåÆ`¢’¾L0’õÄ[œ´¡£M ŠØ˜l—ÖJr}¬ˆz{3Ü0Šz‹2°èìbó…b%k)êuA€ó`R]>–»Ô7'¨o{lcÔc³[ ­­ä³ib†+k{¢¢ØÜ)êM— sc0QI_&É5£ZOŸ íùçž[~é÷¾„UA³ [Zq³°Œ¯ž½Ù³t‰36t´IA[“íÒ.uº^œ¢ÞÛn¼QQo!†¦0ÍŠ•¬¥¨×΃IuùXîPßœ ¾í¡¨—­­ä³ bƒ+®|Ô35m"ÅæNQoºL˜ƒ‰Jú2ÍH˜fÔ»úGw?ð>,¯ø–W´ÅÁ·üì[â–áN3ØÞ,¸ê¯Bt{þ¹çÃàʃ8þÀN× »_b-¾¼â»®hï_VŠ36t´IA[“íÒ.uº^<¢Þ¡‡¼jçR/Å+.\{·µ !lIØÂCçÞî@±’µõVB}sbR]>–».HoNÞh†QÏDº¾ØìÒÚjBA› 6¸âõfJQoºL˜ƒ‰Jú2ÍH˜fÔ ®ø® ÿ˜·Õ,V¹&ê1À½â[^ÑŒìxÌ‚aÐL“\{AxHoG½ðìÍ!íµAÜ¿¢^Ž8iCG›±0Ù.íR§ëÅ#êÅ h4ŽŸ9Û¬B[¶°ÅPÔ3¹Jr(ê­„úæÄ¤º|Œw]Pßœ ½‘¢Þ:m5¡ M œE½™RÔ›.æÆ`¢’¾L3’ªE=„žµš¬†ñXßÚIîÏ_øÔ­0ØŒD1Ã]õƒWa<æBD½àý·¼?Œ·£Þoÿ›ßnÖ"êÅE½qÒ†Ž6)(b `²]Ú¥N׋Óé·]ƒ!lIõL®’Šz+¡¾91©.ã]Ô7'Ho¤¨·B[5(hÄçAQo¦õ&ÊT¹‘˜¨¤ÓŒd˜ÙE½àW~ùWÚ¹­+êýÔ?ý©•ã]Q/ƒñмp´Qïê½ÚC±â ¤ mRPÄÀd»´K®E½"–DQÏä*É¡¨·ê›“êò1ÞuA}s‚ôFŠzë µUƒ‚65¬oNõfJQo¢L•‰•Jz1ÍH†™cÔƒ®¨÷Ð+ê%ب'™â ¤ mRPÄÀd»´K®E½"–d`Ñ ˜Ææ ¹Jr(ê­„úæÄ¤º|Œw]Pßœ ½Ñùs‡¯¿å²CGnÂxHo~L¤ë‹Ù. ­­D´©a}s¢¨7SŠzeªÜLTÒ—iF2Ì™S'n¸íò÷íÇxY¨<9VF½0Ø|È]#}¤žÍ‚6êìøÚƧ¨7Xœ´¡£M ŠØ˜l—v©ÓõµÿŽ«n=pÍ¥Sâ B [ †°Å~˜^À46ShU’IQo%Ô7¦Óåc¹K@}s‚ôæé͉t½°Ù­…ÖV "Ú¤0½ùQÔ›)E½‰2an &*éËd#™2Tž6ê}ì#[™Õº¢^ÌpáQ·Qï§þéOÙ‡ƒ¢Þ`qÒ†Ž6)(b `²]Â¥BW€)q¡…-[ØbèÜ[Óª$“¢ÞJpLªËÇr—€úæéÍ º›+Óéza³KCh« mR˜Þü(êÍ”¢ÞD™07•ôe²‘L*OŽõ^±s1Ѝ+«Ù¨×\ývåñw1êµ÷Œ‡¯Ôõì²Vœ´¡£M ŠØ˜r—`ÂܦĄ¶la‹¡¨gZ•dRÔ[ ΃IuùXîPßœ ¾9Awse:]/ÌvimÕ ¢M »›+E½™RÔ›(æÆ`¢’^L3’)CâÉÔD½p'Šõ­+ê…¥‰t1ص/¦Ñ÷sÕ^Õì9l¯¨ç'Î@ÚÐѦ9lL¹K0an SâJA[¶°ÅØú¨‡P%ùõVB€ó`R]>–»Ô7'¨oNÐÝü˜H׳]Z[5èh“ÂîæJQo¦õ&Ê„¹1X©¤“dÊx2½Åœ~{ü±ã¯ø–WtE½¸*ˆ _¾ÿ–÷cË(F½°Y3¶TÔóg mHiÓ¶ ¦Ü}ýmûo¼nß¾Føò⪠1îº}oi»éz1%® „°%a [ E=JQo%8&Õåc¹K@}s‚úæé͉t}1Û¥¡µUƒŽ6ŒnÞ¶$ꡈ-€¢ÞD™07+•ôb²‘LO&õ‚•M­‰zÍHÓõŽ?v¼lب¬­uŠzƒÅHRÚt ‡-@òÚî–»Ô7'¨oNÞü˜H׳]Z[5HiÁâV¢ÞL)êM‘©rc0QI_¦Éd¡ïäKD½«ôê_ùå_i¾\õÞËûÃ`Xì'ë%¢ÞU?xÕ—~ïKŒõ‹36¤´é@[€V°£x8Þuûöµw“Ü«¯¼2¬}äÉcÍHo¦ÄŸ¹ÿÂ_Õ §ôšU½ …-CØbèÜ[AQo%8&Õåc¹K@}ó€ôæé͉t}1Û¥¡µÕ”6,n(êÍ”¢Þ™07•ôb²‘LúN¾®¨?Y¯äVF½ Æ;»‡®¨;`W¶SÔ,Î@ÚÒ¦ElZÁŽ^ó/\!úÕW^ÙÜMr/Å+vÆ[‘®/Sâ‚·ÝxcxFE½.la‹¡¨'#Ì.꡾9A€ó`R]>–»8Ho+œ?wøú[.;tä&Œ÷„ôæÇDº^ØìÒÐÚªAJ›æ¶: G=SÓ&Elõ¦È„¹1X©¤“dŒ3§NÜpÛåîÛñ"wz¹úG/›äbìk©cœzûÈÇÂ86bž³Q謁*Œ§Ôëºø†$ÄHRÚt ˆ-@+ØQ<÷å¯xEkðB»óà§ÃøÍ·Þv©Ð]ôÈ“Çv.²qávƒýw\uëkÚÛÄÍŽŸ9{vçÜÛøA~¯¾òÊf-NÅ _v­ šUwüôó_ÿã£O{û»OÔNcóŶŠz2BÙ¨‡çõÍ œ“êò±ÜuA}s‚ô¶Â¡#7]ø ;øZŒ÷„ôæÇtº^˜íÒÐÚªAM›æ¶:õfJQoŠL˜ƒ•Jz1åHÆ8úØ=áÝá·_…ñ"wò}ì#‹-ܾågßÒˆÝ-,Ís_ú½/Å#ï‚xÄíÃN𶉇Uí=Ç„-›Ç6Ž?v<ư„ͺªŸt‰36¤´é@[€V°[!ž{çÁƒG.´¹×üëwJßž`Ü|ëma<¬ýÐíw\ó“¯ ÷_uÅÍ)ºOœz<üdÿ§ô߆ñW_yå?ý¶oŒû¿nß[yêX<¥7|…mb°;ôð‘ðeXuÍë^÷¡;îxÍÕþÆ…‘0ÞD½ø ÄþÆ®æÑìul¦ØÂc»£•ô¥¨·œ“êò1ÞuA}s‚ô¶‚¢^7´¶jPÓ&‚¹­E½™RÔ›"æÆ`¥’^L9’1¦õÚ¹m¥çŸ{>nù+¿ü+íq|‚ÞñÇŽ7«ÂC‚æË.í‡Gï¿åýk·‘„8iCJ›±¹{üÔcœ8Ü$<ëÕW^Þý¯ùÉ×]¹ç^¾SîâýƇn¿ãâ–»#oÛá\Úæ,Ý'N=þ?þ_…‘ÝÇ^Ìpa事çÛ†;í/Û^µs_û輸qoFšÁ¾úêï¼âŠ£O{úÌÙpGQoê½€lލ¤/E½•à<˜T—ñ® ꛤ·õº¡µÕ”6lmÕ(êÍ”¢Þ™07+•ôbÊ‘ŒáõPvdkÅHRÚt ŠÍÝÏýúá¿öþ;®:üäçš×vó­·†wÿ—_:w÷ÜÛ qíb¼‹âat¸tFiŸ8õøýòÿ$<öÐCG.¬me¸&ÕuE½øY{úàÞñ°óÝoæâHÜCúÌÙÂŽ>uì³÷?Ðt±Yc [ {+#(ê­„çÁ¤º|Œw]Pßœ ½­P"ê¡»¹2®f»4ä¶:PÓ&‚­­E½™RÔ›"æÆ`¥’^L<’1õÄ[œ´!¥M¢ØÜÝýÐßøžoÿÍW¦½Gž|êb˜{*vºx’l¼ßøÌ}®EcÇÃHkÃý»ïÿípÿÏý¥ÿÇîÚV›ktE½x˜^×ø5¯{]3÷ðÃW_¶ la˰ÝçÞHTÒ—¢ž…úæÄ¤º|Œw]Pßœ ¾­0«¨g"]_ÌviÈmu ¦MC[MŠz3¥¨7E&Ì ÆD%½˜r$#)ꉷ8iCJ›D±8yîÔÇþÝ[i/†³·í¿±étâÚÅlÅ”V…ÛbÔ‹Ý÷ÖÂýoúÖ?³û¨V›kÄýØx÷Ó>"/ºæu¯ ãቚ‘fÈa À¶ÛõЧdE= õ͉Iuùﺠ¾9A}[AQ¯r[jSÀÐV“¢ÞL)êMŽ sc°RI/¦ÉHNQYG¶Yœ´!¥MŠØÄr—H{×íÛ&ñ£ñâ•(pŽmSÚ«®¸â3÷=`?}6lsí?{}ØfLÔûÌý`¼y^Œ„[±` [ E=GQÏB}sbR]&–»Ô7'¨o+(êuCn«AmãXÙ*Û†¨‡¶ Šz“cÂܬTÒ‹‰G2’¢žx‹36¤´é@[€XiïÐC‡ ÀËwN­}õ•W6¾h»×̪FŒz»§ß¶Â\[“ä0¾{ÄßÅ+á6â‘zíÏÚSÔ›E=GQÏB}ó`R]>–»Ô7'¨o+lQÔc³KCk«Am XÙ*SÔ›)E½É1an V*éÅÄ#IQO¼ÅHRÚD ‡-C;êE6í½ì›ÿr˜|èö;^þŠWÜ|ëmíT}¦ã3õÚîüíß ÛäD½v¤‹^e>;¯=ÞŽ€Šzó³ÅQqJ†QÔ³à<˜T—å.õÍ êÛ ŠzÛê@P›V¶ÊõfJQorL˜ƒ•Jz1ñHFRÔoqÒ†š6ÈaË€¢×h§½¿ö]æ/û濜Èvñ`:›üš‘'N=þ_ý…ÿhw›V˜;ôð‘æ~LríÓiÛãž}ïx yêX3¢¨7?:LOÆQÔ³à<˜T—å.õÍ êÛ ŠzÛê@PÛ8&¶úõfJQorL˜ƒ•Jz1ñHFòˆzh:²åâ ¤ 5m"Ã!ÏŠiï¼þ‘zayÕßþ+‡Ÿ¼§ vmMwk*Þ?ýªËeÄ/Ÿ8õøwýÀŸ¹´ÍNƒ w—ºã޸塇ì<Ïî™¶aa·qUج^sõÕa‡ïÅr¿óŠ+PÄ€-ltî­Œ¦¨g!Ày0©.Ë]ê›Ô·õ: ·Õ¦¶qLlõ)êÍ”¢Þä˜07+•ä3ñHÆSÔoqÒ†š6(b €„×åä¹Sÿ¯¿üçÃ4àþ'ß~:;Ÿµ·"í]󓯋é-ÜFa¤YûÄ©ÇÃcÿ»¿ùç± Ü‹©.nðª+®h.Žqèá#ñdÛW_yåuûÞnÃ(zo»ñÆ0V!ŠÍsØ2(êÉhŠzœ“êò±Ü% ¾y@z[MQ¯r[hj›Å¾¶Šz3¥¨79&ÌÁP%ùL<’ñõÄ[œ´¡¦MŠØ Þ%¼mÿo|ó›Ìe4˜öyòØÍ·Þvݾ·„[\$7F½7¿ÿò0þ¶o ÛÜyðÓí$׈è­\{èá#‰Ç†µŸ¹ÿÏ^„(6wÌa˰ÅQeJSÔ³à<˜T—å.ÎÒÛjŠzÛê@VÛ,öµ(õLM›ä°ePÔ›æc¥’^L<’ñŠG=‘8iCM›±@¹[çB›;yîôÚ´·Rõ.|iz\AhaËÀ¶Šz2š¢ž…çÁ¤º|,w pÞVõÐÝü˜H׳]r[hjǾ¶Šz3¥¨7-&ÌÁJ%½˜~$ã)ꉷ8iCM›±0Ù.íR¡öõÆ` [ E=MQÏB€ó`R]>–»8¨o«?wøú[.;tä&ŒgCzóc"]_Ìv Èmu ©mãÚ¦(êÍ”¢Þ´˜07+•ôbú‘ŒwæÔ‰n»üÀ}û1>‚ŽHœ´¡¦MŠØ˜l—ÆN×7í… n=pÍ…û¦Ä„¶ la‹±­E/@™’Áõ,8&Õåc¹ë‚úæõÍ Ò›éza¶KCn«Ym³×6EQo¦õ¦Å„¹1X©¤ÓdjPsD‚8iCM›±0Ù.‘.rB®)q!‡-[Øbè0=MQÏB€ó`R]>Æ».¨oNPßœ ½ù1®f»4ä¶:Õ6‹qmSõfJQoZL˜ƒ•Jò™~$„š#ÄHjÚD ˆ-€Évi¦ÍµôK{¦Ä•‚¶laË so¥E= ΃Iuùﺠ¾9A}s‚ôæÇtº^˜íÒÛê@VÛ –µ RÔ›©õj.ßößÿ§ÿøí1þ’÷ñÏíc&»(¬ÂÆ SÛO)¿gëÕEa6N˜Ú~J¹ôý˜~ÔûÏeömd?¥LíÏõ[÷¾A§Vaã J}?SÛO)¥¾Ÿ~ê<¼Ñk?·¸¡­ñ‘»¿_áûA&kôú~¦¶ŸRö}àÿÍœ˜WZØb0‡-ƒ¢ž” ¨g!Ày0©.ã]Ô7'¨oNÞü˜N× ³]r[Èj›Å²¶AŠz3uìýÙ?ûgw{[•åŠ+ÿLü ñðËÿòûÐÎa6N˜Ú~Jùåßü¾¦šAX…¦¶ŸR.}?&6õþs™=DÙO)Sûs…Ñt½öSJ©ïgjû)¥Ô÷sÃm—ãá^ûyóû/GËk¼ý#øï¾´³F¯ïgjû)å§ÞýM,z)q¡…-sØ2(êI Šzœ“êò1ÞuA}s‚úæéÍét½0Û¥¡¸U€¬¶Y,k´ø¨‡¶X¦=IUæÚ1š@&½™Ø$Sƒš#ÅH‚ÝD4Án1Ì ¶ »Iî΃Ÿþé7]·Ò~ö'~ê_‚?ùÎÿú§ÞöwÞðæŸÂ6\×ÏÏÿâ/=ñÜ)Ä».ha‹Á¶ ÛõФd¤yE=Ô7'pLªËÇx×õÍ ê›¤7?¦ÓõÂl—†âV²Ú1«m–¢Þ 0I}&ÌÁP%ùLB’©Aʉ⠤ 5m"PÄÀ”»„ݨ÷ÿøOÿÓÝcø[Ë_øoþãø±ÿ*þì®yÇ_ü›ÿóñŸÿ—ÿ÷Ýu%–ëîŸ#ÞuA [ æ°eÐazR‚¢ž…çÁ¤ºL,w ¨oNPßœ ½ù1®f»ä¶:PÖ6ˆYm³õ–Iê3an0V*éÅ$$™¤‘(Î@ÚPÓ&ElL¹KØz±²ýÀÿþÑÿrÍŸû±þâOíŸüÊ_ú‡oþóWýÄîª"âuº~úºëﺠ…-sØ2(êI Šz€úæÄÔºL,w ¨oNPßœ ½91‘®/–»ä¶:PÖ6ˆYm³õ–I*3an V*Égú‘L :ŽH#Î@ÚPÓ&ElL¹KØõÞó…où•Ï~óõüoâÏëuïúKoùè_¾éó/o_7¿ˆøß¿QQ-l1õ¤„‚QΜÔ7'¦Öeb¹K@}s‚ú¶Úùs‡¯¿å²CGnÂx6Ô7'&ÒõÂl—†ÜV²Ú±©mœ¢Þ 1%=tôÀ ·]n1.Ù07C•ä3 IJ9sêDxÝ8pß~Œ÷…Ž#Òˆ36Ô´‰@›;“íÒ.E½¿ðßüÇr^¤¨°…-ƒ>PO QÔÔ7'¦Öeb¹K@}ó€ôÖéБ›.ü†|-Ƴ¡¾91®f»4· PÖ6ˆMmãõ–)é÷¾5ü”Ã-Æe8æÆ`¨’|&!I)G»'¼n¼óö«0Þ:ŽH#Î@ÚPÓ&QlîL¶K»Pô9ñÅæ³ó¼s^¤¨0‡-ƒ¢ž¢¨¨oNL­ËÄr—€çé­“¢žâVÊÚ±©m\±¨gjÚD°-S’¢^y&ÌÁP%ùLB’RŠD=D‘¶8iCM›±0Ù.å‘_¼ù®‰?kÞñ+ä¼HQ/`[E=)DQPß<˜T—å.ÎÒ[§qQéÍét½0Û¥¡¸U€²¶) jS ¨·hLIŠzå™07C•ä3IJQÔoqÒ† 6(b €l×呇›œ÷úw¿,^ÙéÍ¢^À¶ ŠzRˆ¢ Ày0©.Ë]œÔ·NŠzŠ[ˆk›Â 6ŠzK€Æ”¤¨Wž sc0TI>S‘¤E=ñg mjS€"¶ˆwrÞ‡?÷ÏŽ=âv¤7?ŠzsØ2¨èI!Šz€çÁ¤º|,w pPß:)ê(n ®m ƒÚ(ê-S’¢^y&ÌÁP%™LB’‚õÄ[œ´!¨MŠØ áµ­ÌyÍ…2&õЃ9lõ¤E=@€ó`R]>–»8¨oõöBn«emSXÓ&BQo И’õÊ3an0†*Ég’4>ê¡àˆ@œ´!¨MŠØ äE«rÞÓ;«.]ýVQ¯2æ°ePÔ“Bõ΃IuùX¾9A}뤨·Š[ˆk›Âš6ŠzK€Æ”¤¨W˜ sc0TI>S‘¤ E=ñg mjS€"¶í–tç¼HQoc˜Ã@¨'å(꜓êò1ÞuA}s‚úÖIQo/· ×6…5m"õfiE½ÂL˜ƒ¡Jò™Š$)ꉷ8iCP›±h‚ݺœ)êm ‹ØleÔCŠ’Rõ΃Iuùﺠ¾9A}ë4‡¨g"]/Ìvi(n ®mSÚt(êÍÓ:Šz…™07C•ä3I RÔoqÒ† 6(b pök_ÿƒg¿”‘ó‚Ý¢§¨WsØ2(êI9Šz€çÁ¤º|Œw]Pßœ ¾uRÔÛ Å­ôµ`J›ŽeG=ö¯EBcZGQ¯0æÆ`¨’|¦"IA#£òˆg mjS€"¶g¿öõŸûõ+Âíd΋õ6†9lF=f²yAŠ’Rõ΃Iuùﺠ¾9A}뤨·Š[èkÁ”6Šz³‡Æ´Ž¢^a&ÌÁP%™LE’²õÄ[œ´!¨MŠØœýÚ×ÿÝ£wÞùÀ;’9/RÔÛæ°ePÔ“rõ΃Iuùﺠ¾9A}뤨·Š›7ĵ`G›E½ÙCcZGQ¯0æÆ`«’L¦"IYŠzâ-Î@ÚÔ¦ElL¹KPÔÛæ°eй·RŽ¢ Ày0©.ã]Ô7'¨oõöBt󆾶ìh“¢¨7{hLë(êfÂÜlU’ÉT$)kLÔC»Y)Î@ÚÔ¦ElL¹KPÔÛæ°ePÔ“rõ΃Iuùﺠ¾9A}뤨ׂâVúÚF°£MŠ¢Þì¡1­£¨W˜ sc°UI&’¤,E=ñg mjS€"¶¦Ü%(êm sØ <÷6`)›t()HQà<˜T—ñ® ê›Ô·NçϾþ–˹ ãÞü˜N× Ë]Š[èkõ1¢M¢Þì¡1­óÐÑ7Üvy¸Å¸ dÂÜ` U’Ï„$)ëÌ©áuãÀ}û1žíFd¥8iCP›±¹3Ù.MQocXÄ@QOŠRÔ8&Õeb¹K@}ó€úæéÍét½°Ü% ¸U€ÄV#ÚÔ”‰z¦¦Mû×"¡1IM&ÌÁP%ùLH’é@»Y)Î@ÚÔ¦QlîL¶K›AÔC [ ±õ˜ÉæJ RÔ8¦Öeb¹K@€ó€úæéÍét½°Ü% ¸U€ÄV#ÚÔ(êÍ2“ÔdÂÜ U’ÉT$™„‘.qÒ† 6ˆbsg²]š¢Þưˆ-ÀöE=D()KQà<˜Z—‰å.Îꛤ7?¦Óåc¶KCq󆾶ŒhS£¨7{ÈLR“ sc°UI&’d:nDºÄH‚Ú ŠÍÉviŠz›Á¶ ŠzR”¢^ê›Së2±Ü% Ày@}s‚ôæÇ¤º|ÌviˆnÞÐ×êcA› E½yCc’ÊL˜ƒ­J2™$Óp#Ò%Î@ÚÔ¦QlîL¶KSÔÛ æ°eRô–²A„’²fõà< ¾91µ.Ë]œÔ7'HoNL§ë…Ù. ÑÍ[},h¤¨7ohLR™ sc°UI&’d:nDºÄH‚Ú ŠÍÉviŠz›Á¶ ŠzR”¢^ꛓêò±Ü% Ày@}s‚úæÄtº^˜íÒݼ!±ÕÇ‚6AŠzó†Æ$•™07[•d2!I&ÕF$!Î@ÚÔ6ElL¶KSÔÛ æ°eز¨‡%Å)êµ!Ày0©.Ë]œÔ7'¨oNL§ë…Ù.Å­$¶Ê˜Ï¦IQoÞИ¤2æÆ`«’L¦%ÉD Úˆ$ÄHšÚÆ¡ˆ-€ÉviŠz›Á¶?P/`,› ()NQ¯ ΃IuùXîà< ¾9A}sb:]/,w (n ²UÆ|6M Žzì_‹„Æ$•™07C•ä3-I&ÕF$!Î@ÚÐÔ6ElL¶K¸Tôõ*c[€Q¥lFP ¤¸RQΜ8&Õåc¹ë‚úæõ-åü¹Ã×ßrÙ¡#7a<ê›Óéza¹K@qó†ÄVóÙ4)êÍS†‡Ž¸á¶ËÃ-ÆeÓæc¨’L&$‰‡3§N„×÷íÇxªHBœ´¡©mŠØ˜r— ¨·1,b  ¨'¥)êµ!Ày0©.ã]Ô7'¨o)‡ŽÜtá7ìàk1žõ͉ét½°Ü% ºyCb«ùlšõæ )Ã'î}kø)‡[ŒKo&ÌÁV%™LHG»'¼n¼óö«0ž€d#’g mhj‡"¶¦Ü%(êm ‹Ø(êIiŠzmpLªËÇx×õÍ ê[Š¢ÞEˆnÞØ*c;›,E½yCfÊ ¨WŒ sc°UI&Ӓă¢žx‹364µC[Sîõ6†El†½€¥l.ŸÄƒ¢^œ“êò1ÞuA}s‚ú–24ê!½ù1®–»D7o¨l•±M–¢Þ¼!3ePÔ+Æ„¹1ت$“iIâAQO¼ÅHšÚÆ¡ˆ-€)w ŠzÃ"¶ŠzRš¢^œ“êò1ÞuA}s‚—²ä¨Çl—†èæ •­2¶³ÉRÔ›7d¦ ŠzŘ07[•d2-I<(ꉷ8iCSÛ8±0å.AQo3˜Ã–AQOJSÔkC€ó`R]>Æ».¨oNàRõ.Btó†ÊVÛÙdˆz¦¦Mû×"!3ePÔ+Æ„¹1ت$“iIâ¡oÔC¯Y+Î@ÚÐÔ6ElîL¶KSÔÛ æ°øzcÙ\ ?‰E½68&Õåc¼ë‚úæ.eÚQÏtº^˜íÒÝ\!±UÆp6eŠzó†Ì”AQ¯æÆ`«’L&'‰E=ñg mhj‡(6w&Û¥Í ê!‡-‹ØlYÔC{'ŠzmpLªËÇx×õÍêÛŠz;ݼ¡²UÆp6eŠzó†Ì”AQ¯æÆ`«’¦%‰E=ñg mhj‡(6w&Û¥)êm‹Ø ŒzŒesö$NõÚà<˜T—ñ® œÔ·5õv ºyCe«ŒálÊõæ ™)ƒ¢^1&Ì ÆV%™LK'Šzâ-Î@ÚÐÔ6QlîL¶KSÔÛ ±PÔŠzmpLªËÇx×ÎêÛŠz;ݼ¡²UÆp6eŠz3†Æ”GQ¯Óæc«’L¦%‰“^Q±F$Gœ´¡©m¢ØÜ™l—¦¨·,b  ¨'õÚà<˜T—‰å.ÎêÛŠz;ݼ¡²ÕÄj6qŠz3†Æ”GQ¯Óæc«’L&'‰E=ñg mhj‡(6w&Û¥)êm‹Ø )zcÙ\ =‰E½68¦Öeb¹K@€ó€ú¶†¢ÞD7om5±šMœ¢ÞŒ¡1åQÔ+Ĺ1ت$“ÉIâDQO¼ÅHšÚÆ!ŠÍÉviŠz›Á"¶ÛõžÄ¢^œSë2±Ü% Ày@}[CQo¢›7„¶šXÍ&NQoÆ™ò(ê•aÂÜlU’Éä$q¢¨'Þâ ¤ MmãÅæÎd»4E½Í`[E=q ¨×†çÁÔºL,w pPßÖXlÔc¶KCts…ÊV«ÙÄ-5ê±-2SE½2L˜ƒ­J2™œ$Nò£JH¦8iCSÛ8D±¹3Ù.aOÑ õªa›»¨°—Í“øQÔkC€ó`j]&–»8¨ok(êí@ws…ÊV“Ùô)êÍ2SE½2L˜ƒ­J2™¢$NõÄ[œ´¡©m¢ØÜ™r— ¨·1Œbs70ê1–Í“øQÔkC€+Τº|,w pPßÖ8îðõ·\vèÈM_õ͉Iuù˜íÒÐÝ\!´ÕÄd6}Šz3†Ì”ç¡£n¸íòp‹qéÇ„¹1ت$‡ÉIâçÌ©áuãÀ}û1n¡ÔˆdŠ364µÍB[Sîõ6ƒElõć¢^\q&Õåc¹K@€ó€úæõ͉Iuù˜íݼ!´ÕÄd6}Šz3†Ì$5™07s•ä09I¦¥F$Sœ´!«mŠØ˜r— ¨·,b °MQÕI\)굡ÁgR]>–»8¨oÞœ˜N× Ë]¢›7„¶š˜Ì¦OQoÆ™¤&æc«’L&'ÉÆ!Óˆä‹36dµÍB[Sîõ6ƒElõć¢^΃IuùX¾9A€ó€úæÄtº^Xîݼ!´UÃ^6 Šz3†Ì$5™67[•d2EI6™F$_œ´!«mŠØ˜r— ¨·,b 0¤èìe³€ê$®õpLªËÇx×õÍ œÔ7'¦ÓõÂr—€èæ ­­ö²YPÔ›1d&©É´¹Áت$“)J²qÈ4"ùâ ¤ Ym³PÄÀ”»E½Í`[E=ñ1—¨‡ç΃Iuùﺠ¾9A€ó€úæÄtº^XîÝ\!´ÕÄ^6 c£ž©iÁþµHÈLR“isƒ±UI&S”dãiDòÅH²Úf¡ˆ-€)w 3ˆzÈaËÀ"¶ŠzRÔ‹ý–¢ÞEpLªËÇx×õÍ œÔ7'¦ÓõÂr—€îæ ¡­&ö²YPÔ›1d&©É´¹Áت$“)J²Yh4"½ÄH²Úf¡ˆ-€)w Šz›Á"¶ú@=)¡iy E½œ“êò1ÞuA}ó€úæõ͉ét½°Ü% »¹Bh«†±l.õæ Ij2an ¶*ÉaŠ’lH/qÒ†¬¶Y(b `Ê]‚¢Þf°ˆÍÝNÑSÔ“ÁòÚõpLªËÇx×Îê›Ô7'¦ÓõÂr—€îæ ­­Ʋ¹PÔ›+d&©É„¹1˜«$‡)J²qh4"½ÄH²Úf¡ˆÍÉviŠz›Á(6wŠz2ž¥¨×@€ó`R]>Æ».pPßÖ;îðõ·\vèÈMOB}sb:]>f»4t7WhmÕ0–Í…¢Þ\!3e{èèn»<Üb\z0an æ*ÉaŠ’¸:sêDxÝ8pß~Œ·¡Ñˆôg mÈj›…(6w&Û¥)êm£ØÜ)êÉ èw+‰zpà< Ày0©.ã]8¨oë:rÓ…ß°ƒ¯Åxꛓêò1Û¥¡»¹Bk«†±l.õæ ™)Û'î}kø)‡[ŒK&ÌÁ\%9LQWG»'¼n¼óö«0Þ†F#ÒKœ´!«m¢ØÜ™l—¦¨·Œbs§¨'=¡Ü%(ê5à<˜T—ñ® œÔ·õ¶>ê!ºyCk«†±l.õØ¿ ™)›¢^&ÌÁ\%9LQWk£H_qÒ†¬¶Yˆbsg²]š¢Þf0ŠÍÝÖD=”)Ù.MQ¯çÁ¤º|Œw]à< ¾­§¨WB[5,e3¢¨7WÈLÙõ 0an0¶*Éd¢’¸RÔoqÒ†¬¶Yˆbsg²]š¢Þ°ˆ-À¢0™Mâ”ô…`—CQ¯çÁ¤ºL,w pPßÖSÔ«­­–²QÔ›+d¦lŠz˜67[•d2QI\)ꉷ8iCVÛ,D±¹3Ù.MQoXÄ@QO2 ÖeRÔk Ày0µ.Ë]œÔ·õõ*Bk«†¥lFõæ ™)›¢^¦Í ÆV%9LQoŠzâ-Î@ÚÕ6 QlîL¶KSÔÛ±ÐêÉ:HuùõpL­ËÄr—€çõm½©F=Óéza¹K@ws…ÖV KÙŒ(êÍ2S6E½L›Œ¹Jr˜¢$ÞÒQuFd€8iCVÛ,D±¹3Ù.MQoXÄænk>P/@¨’Lèt½(ê5à<˜Z—‰å.ÎêÛzý£ê›Óéza¹K@ws…ÖV3Ù¼(êÍ2S6E½L›Œ¹Jr˜¨$ÞõÄ[œ´!«m¢ØÜ™l—À¢(êUÀ(6wŠz’„H×—¢^΃©u™Xîà< À­§¨Wr[Ìdó¢¨7WÈLÙõÆ2an æ*Éa¢’xSÔoqÒ†¬¶YˆbsgÊ]‹^ ¨W£ØÜmMÔC«’(t(ê5à<˜Z—‰å.ÎÜzŠz!·ÕÁL6/Šzs…Ò”MQo,æÆ`®’&*‰7E=ñg mÈj„"¶¦Ü%°èŠz0ŠÍ¢žt@žFQ¯çÁÔºL,w pàÖSÔ«­­f²yQÔ›+”¦lŠzc™07s•ä0QI¼)ꉷ8iCYÛ ±0å.E/PÔ«€Qlîõd´¹ÁõpL­ËÄr—€çn½F=f»t7WhmÕ0“Í‹¢Þ\¡4eSÔË„¹1˜«$‡‰Jâ-õfD†‰36”µ B[SîXô‚©E=ä°e`›»!E/`2›>D+I@˜CQ¯çÁÔºL,w]Pßœ À­§¨W Z[ld³£¨7KÈL}(êeÂÜÌU’Ãt%ñ¦¨'Þâ ¤ emƒPÄÀ”»½@Q¯F±¹SÔan E½œSë21ÞuA}s‚·ž¢^-Èmu°‘ÍŽ¢Þ,!3õ¡¨7– sc0WÉZ&*IŠzâ-Î@ÚPÖ6ElL¹K`Ñ õ*`›;{+{¡Ê¤¨×@€+Τº|Œw]Pßœ À­§¨W r[ld³£¨7KÈL}(êeÂÜ`ÌU’ÃD%©@QO¼ÅHÊÚ¡ˆ-€)w ,z¢ž7±PÔ“$¹ñõhpÅ™T—ñ® ꛸õΟ;|ý-—:rÆ»¡¾91©.Ë]º›+ä¶:ØÈfgTÔ35m"˜À–™©‡Ž¸á¶ËÃ-Æ%—isƒ1WI•¤‚3§N„×÷íÇx€4#2Lœ´¡¬mŠØ˜r—À¢(êyc›»¢§¨'z\Šz 4¸âLªËÇx×õÍê›Ô7'&Õåc¹K@ws…ÜVÙì(êÍ2“ÔdÚÜ`ÌU’ÃD%Ù t‘Áâ ¤ emƒPÄÀ”»½@QÏ£ØÜ)êI z\Šzœ“êò1ÞuA€ó€úæõ͉IuùXîÐÝ\!·UÀ@6GŠz³„Ì$5™67s•ä0]I6]Fd°8iCYÛ ±0å.E/PÔóÆ(6wŠzrb\)Šzœ“êò1ÞuA€ó€úæõ̓ét½°Ü% »ùAn«ƒlŽ–õØ¿ ™Ij2mn0æ*Éaº’lºŒÈ`qÒ†²¶A(bsg²]‹^ ¨çQlîõdJ\AŠzœ“êò1ÞuA€ó€úæ΃ét½°Ü% ½ùAn«ƒlV¾:òžøB§¨7'ÈLR sc0WIÓ•dƒÐeD‹36”µ B›;“íÒXôE=oŒbs·QK,”¸‚õ"8&Õåc¼ë‚çõÍ œÓéza¹K@zóƒÜV2Ù\ìæ–»¤7?ˆnÞPÓ¦€®E½™Afêï¡£n¸íòp‹qYÏ´¹ÁX¬d-“™¤¦3§N„×÷í÷Y|dÙL}sg mˆk›‚(6w&Û¥™67L«ÁíÿØU·¼¦=2òT\±`›5{»MÚjRÔ‹ÐàŠ3©.ã]8pPßœ˜T—å.éÍ¢›7µ)`§ëEQof™¤&Óæc±’µLf’Maô‘3éÍOœ´!®m ¢ØÜ™l—fòÜ0¦ÄÁ˜SqQÄæŽQlîõ¶*[eŠz\q&Õåc¼ë‚çÎꛓêò±Ü% ½ùAtó† ¶qŒt})êÍ 2“ÔdÚÜ`,V²–IK²Œ>²`¦»¹Š36ĵMA›;“íÒLžÆ”8«}*n¸ƒµ ˆbsÇ(6wŠz[•­2E½΃Iuùïº Ày@€ó€úæÄ¤º|,w Ho~ݼ¡©m#]_Šz3ƒÌ$5™67‹•¬eê’l»,•‰nÞâ ¤ qmSÅæÎd»4“ç†1%®Ks*î±N`UD±¹c›;E½í€ÄVŸ¢^€çÁ¤º|Œw]à< Ày@}sbR]>–»¤7'(n ©m ÝŠz3ƒÌ$Õ˜07‹•¬eê’lÓ,’)nÄHâÚ¦ ŠÍÉvi&Ï cJ\§Ïÿd=±`›;E½í€ÄVŸ¢^€çÁ¤º|Œw]à< Ày@}sbR]>–».Ho~Pܼ¡©m ÝŠz3ƒÒ$Õ˜07‹•¬eê’lë,ÉmuÄHâÚ¦ ŠÍÉv ¦Í fb\)(b À(6k;EoÙQmk;¡¯m„¢^€çÁ¤º|Œw]à< Ày@}sbR]>Æ».Ho~ݼ¡©m ÝŠz3ƒÒ$Õ˜07‹•¬eê’l,ŒimÕÄHâÚ¦ ŠÍ)w ¦Í fb\)(b À.6kŠzÛ}m#õ8&Õåc¼ë‚çÎê›Óéò±Ü% ½ùAt󆦶YÌsÃ(êÍ J“TcÂÜ,V’fÒ’l,imÕÄHâÚ¦ ŠÍ)w ¦Í fb\)(b À.6kŠz[qmSõ8&Õåc¼ë‚çΜ“êò±Ü% ½ùAt󆬶YÌsÃ(êÍ J“TcÂÜ`,V²–©K² @²0&´Õg mˆk›‚(6w¦Ü%˜67˜‰q~òžîŸ|ñt{ElØÅfMQo ®mŠ¢^€çÁ¤º|Œw]à< Àå:îðõ·\vèÈM_΃IuùXîÞü ºyCVÛ ¶¹Áõf¥©¿‡Ž¸á¶ËÃ-Æe Óæc±’µL]’ÊΜ:^7Ü·ŸHÃT¶Êâ ¤ qmSÅæÎ”»Óæke¸ý»êփ״G2Ý|ׄߊ7Ýòí¿üfElØÅfMQo ®mŠ¢^€çÁ¤º|Œw]à< Àå:tä¦ ¿a_‹ñUà<˜T—å.éÍ¢›7”µ b›LQofPšúûĽo ?åp‹qYô¹ÁX¬d-Ó˜¤²£Ý^7ÞyÇU,A² &±Õg mˆk›‚(6w¦Ü%˜67ØÅ÷ÄéÇÃOöÍÉwì…¿ø‘ï‹¿w>°?¢ˆ-»Ø¬-½è(\Ûemƒõ8&Õeb¹K@€ó€—KQÏ¢›+dµ b˜CQofPšúSÔÈ´¹ÁX¬d-Ó˜¤2E½%3}m#â ¤ qmSÅæÎ”»Óæ»æÆD½è£Ÿß=Þùñ:ùâi±`›5¦·t(k¤¨ Ày0µ.Ë]œ¸\ŠzžÐÝ\¡¬mÃÜŠz3ƒÒÔŸ¢Þ@¦Í Æb%k™Æ$•)ê-™ékg mˆk›‚(6w¦Ü%˜67ØÅ$7>ê‡;ðÆ÷|kØÏ›nùö‡Ž?€(6wìb³¦¨·hÈj›¥¨ Ày0µ.Ë]œ¸\Šznݼ¡¬mÃÜŠz3ƒÒÔŸ¢Þ@¦Í Æb%k™Æ$•)ê-–‰k›g mˆk›‚(6w¦Ü%˜67ØÅW$êíSqïz`?ºØ¬±‹Íš¢Þ¢!«mÖô£œ8¦Öeb¹K@€ó€—KQÏ ¢›7”µMa•i`Ô35m"˜À–¥©?E½L›ŒÅJÖ2I*SÔ[&SÖ6(Î@Ú×6QlîL¹K0mn°‹1®TÔ‹šSqÿÅÇ虥œŠË.6kŠz‹†¬¶YŠzœSë2±Ü% À‡úÖƒ¢žD7oˆk›Â*7’¢ÞÌ 4õ§¨7isƒ±XÉZ¦1IeŠzËdÊÚÅHâÚ¦ ŠÍ)w ¦Í v1ÕzÁÂNÅe›;E½åBSÛ8E½΃©u™XîÐàŠC}ëAQÏ ¢›7ĵ`’oIQýk‘PšúSÔÈ´¹ÁX¬d-Ó˜¤2E½2Ym³â ¤ qmSÅæÎ”»Óæ»ØàŠG½ç¿þÇÇ[§â=ùÅv# Þ~ã×í{KBØ nùô™³X„µŸ½u+ÌÜóÊÝ®6f›µ¢§¨·Thj§¨ Ày0µ.Ë]\q¨o=(ê¹Ats…¸¶)Lrã)êÍ JSŠzC˜07‹•¬e“T¦¨·4¦©m\œ´!®m ¢ØÜ™r—`ÚÜ`œGÔ‹n¾ëGžÿÕ}omF¢»~ú;¯¸âv–p§íå¯xEl6¾nß[â–aU{³àÕW^Ùleîù³÷?·iö×Ú/ÃÆìb³¦¨·hhj§¨ Ày0µ.Ë]8¨o=dG=Ô7'&Õåc¹ë‚ôæÝÍâÚ¦0ɧ¨73ˆMý)ê aÂÜ,V’f“Ô§¨·4¦©m\œ´!®m ¢Ø¬™l—fÚÜ0­çõþí—n{¾ïîjFo¿ñƦšµýÆw„ñ˜Þ1±Åãæ¢£O ÛØ-ƒœ=Ǩ×~lÜ[óaƒ°E½‹Φ k{ ¨M¢^€çÁÔºLŒw]à< Àõ ¨çÝÍâÚF°Ç¡¨7'(Mƒ(ê aÂÜŒV’f“Ô÷èc÷†× E½…0Am â ¤ qmSÐÅfÍd»4“ç†i58¿¨t]+#f5›Þ‚ïÜ9V#íâÝuðÓa0,87gÏq›_½õ¶öª0Ò~оújE½‹Î& k« ¨M¢^€çÁÔºLŒw]à< Àõ ¨çÝÍúÚF°Ç¡¨7'(Mƒ(ê aÂÜŒV’f“Ô§¨·¦¦MDœ´!®m¢ØÜ™l—fòÜ0­çõº$ÒÛѧŽ=øð‘öÈʨ„‡Ûñœ=‡Û°Ïðe³Ê>Å]?Oïe›µ!QálÊй¶jÚD(êpL­ËÄx×Î\SŠz¦ÓõÂx×éͺ›+ôµ`+BQoNPšQÔ„¹ÁX¬d-˜¤>E½å05m"â ¤ }m#ÅæÎd»4“ç†i5¸©E=+õâµ/½öÜèzŠ€]lÖõ 5m"õ8¦Öeb¼ë‚箇…D=–»¤7?èn®Ð×êcŒ+EQoNPšQÔ´¹ÁX¬d-˜¤>E½…0)m:â ¤ }m#ÅæÎd»4“ç†i5¸²QE¬ËÊôöÃW_B­,nGŸ:£ëëµçÆVE=“íÒΦ ©k{ ¦M„¢^€WœIuùïº Ày@€ëAQÏ¢›7$¶úãJQÔ›”¦Aõ†0mn0+YË&©OQo LG›”8iC_ÛD±¹3Ù.Íä¹aZn"Q/Œ„/Wfµ•Å퇯¾: †Ûö`ÐkÏ E½n gS†Ôµ%Ò¦CQ/@ƒ+Τº|Œw]à< ÀõpþÜáëo¹ìБ›0n Ày0©.Ë]ê›D7WèkÁWŠ¢Þœ 4 òÐÑ7Üvy¸Å¸¤˜67‹•¬e“ÔwöôÉðºqà¾ýìD2#¦£MJœ´¡¯m¢ØÜ™l—fòÜ0{KÜþ]uëÁk08 ŠX—˜Þb}kte5·>ÒUô‚^{n(êuc8›2Ô®-”6Šz\q&Õåc¼ë‚çΜ“êò±Ü% ¾9Aws…¾VK\AŠzs‚Ò$Õ˜67‹•¬e“TÆ6$sd"ÚÔÄHúÚF ŠÍÉvi&Ï cb\)(b]šãéÂèí7ÞØ•ÕbqkºpûwÜÍ¢^{n(êuc8›2Ô®-”6Šz\q&Õåc¼ë‚çΜ“êò±Ü% ¾9Aws…ÄVK\AŠzs‚Ò$Õ˜67‹•¬e“TÆ<$sd"ÚÔÄHúÚF ŠÍÉv ¦Í fb\)(b]šôÖüÎ+®HD½fU–¸‚õæ¥Iª1mn0+YË4&©ŒyHfÇ´ Š36ôµ@›;SîL›ÌĸRÚ9ìŸ}äæ»~$ܶ£•é­‹-nqäÕW^ÙŒ4zí¹±Qo§è)ê- :Ú¤(êhpÅ™T—ñ® œ8pLªËÇr—€úæÝÍ[eÌpe)êÍ J“TcÚÜ`,V’f“ÔÇB$óbòÙ4ÅHúÚF ŠÍ)w ¦Í fb\)íö¯î»p°pÛŒFF½»~:Œ„åWo½­Œõ:)ê-:Ú¤(êhpÅ™T—ñ® œ8pLªËÇr—€úæÝÍ*[eÌpe)êÍ J“TcÚÜ`ŒV’f“ÔÇH$óbòÙ4ÅHúÚF ŠÍ)w ¦Í fb\)í6,êýðÕW㼕Å-lêö`ÐkÏ E½nlg“…Úµ ѦFQ/@ƒ+Τº|Œw]à< Ày@€ó`R]>–»Ô7'èn®PÙ*c†+KQoNPš¤Óæc´’4˜¤>F"™ÓÎ&+Î@ÚÐ×6QlîL¹K0mn0ãJiç°aQ/ "Õ­,nÍÁzïµçFWÔc›5E½ÅAD›E½ ®8“êò1ÞuA€ó€ç΃IuùXîº ½ùAwóƒÄV\qŠzs‚Ò$u˜07£•¤™À$•1ɼ˜v6YqÒ†¾¶ˆbsgÊ]‚isƒ™WJ»ˆ%¢^¼"­Moqü‡¯¾º=6 ƒ×¼îuíÁ`å3zí¹ŸÂÇÇ.6kC¢ÃÙ”!xmD´©QÔ ÐàŠ3©.ã]8pà<˜T—ñ® Ò›¤7?¨l•±Á7$Ꙛ6L`˃Ø$u˜07£•¤™Æ$•1ÉŒ˜p6eqÒ†¾¶ˆbsgÊ]‚isƒ™WJ»ˆuE½·ßxcŒhaùÎ+®h4ƒÍsOŸ9Ë]XÂÚðÀf'ÁѧŽÅ‡„ÇÆUù{n<øð‘æ)‚tÈ.6kŠzË‚‚6AŠz\q&Õåc¼ë‚箇óç_Ëe‡ŽÜ„q΃Iuùïº ½9Aws…ÊV\qŠzs‚Ø4ÈCGÜpÛåáãÒÉ„¹1­$Í4&©,桳§O†×÷í¿ŒdúL8›²8iC_ÛD±¹3å.Á´¹Áö–¸ý»êÖƒ×`p˜vëŠz>|ä³÷?ðô™³ÍÆXÕŒGÍ®Âö—]Ú{ŽÂ¶i¯e›µEŸ{ y- Ú)êhpÅ™T—ñ® œ¸¹éÂoØÁ×bÜ@€ó`R]>Æ».¨oNÐÝ\¡²ÕÄçAQoN›ùĽ&¾áãÒÉ„¹1­$Í4&©,æ¡G»7¼n¼óŽ«.#™8SÍ&.Î@ÚÐ×6QlîL¹K0mn°V†{âôãá'ûæ÷_Þ¬]ĺ¢ÞŒ°‹ÍÚ¢£‚×6@A› E½ ®8“êò1ÞuA€ó€×ƒ¢žt7Wm51ÀyXLÔcÿZ$ĦAõz3an0+YË4&©,"E½ù1Õlââ ¤ }m#ÅæÎ”»Óæke8E½v±YSÔ[´ RÔC€ó`R]&–»8p=,!ê±Ü% ¾9Aws…ÐVœE½9AlDQ¯7Óæc±’µLc’Êb!RÔ›“̦/Î@ÚÐ×6QlîL¹K0mn°V†SÔK`›5E½A>›&E=8¦Öeb¹K@€ó€×C^ÔC}sbj]&–»Ô7'èn®Újb€ó ¨7'ˆMƒ(êõfÚÜ`,V²–iLRYŒDŠz3c’ÙôÅHúÚF ŠÍ)w ¦Í ÖÊpŠz ìb³¦¨· ÈgÓ¤¨‡çÁÔºL,w pÅ!Àõ£¨çÝÍB[5¬oNõf¥i(E½ÞL›ŒÅJÒL`’ÊšH¤¨7'¦—ÍBœ´¡¯m¢ØÜ™r—`ÚÜ`­ §¨—À.6kŠz ‚|6MŠzpL­ËÄr—€W\?“‰z&Õåc¹K@}s‚îæ¡­&Ö7'Šz³Ò4”¢^o¦Í Æh%i¦1IeM'RÔ›ÓËf!Î@ÚÐ×6QlîL¹K0mn°V†SÔK`›¯¢§¨· hg“ó'»~ë~E=w¦Öeb¹K@ƒ+®E=Ho~Újb}s¢¨7(MC)êõfÚÜ`ŒV’f“TÖt"E½Ù0±l.â ¤ }m#ÅæÎ”»Óæ†Ù›áõ˜ÆæKQoAѦãbÎSÔ‹à<˜Z—‰å. ®8¸~õ ½ùAh«‰õ͉¢Þl 4 ¥¨×›isƒ1ZIšiLRY“ŠõfÃIJ¹ˆ36ôµ@›;SîLžfo†+õPÄõ&DQoA˜Ò¦`o΋õà<˜Z—‰å. ®8¸~õ ½ùAh«†éÍ¢Þl 4 ¥¨×›isƒ1ZIšiLRY“ŠõæÁ”²‰36ôµ@›;SîLžfo‰ó‹zÿöK·‡=ß÷wa|F˜ÆækHÔc8›,4¯ÅcPÛ,ÓòŠzpL­ËÄr×Î\?ŠzÞü µUÃôæGQo6Pš†RÔëÍ´¹Á­$Í4&©¬©EŠzó`JÙŒÄHúÚF ŠÍšÉvi&Ï ³·ÄùE½à™Ocd^˜ÆæKQo)ØÔ6Ë„¼6E=8¦Öeb¼ë‚ç®E½ÒÐÝ\¡µUÃôæGQo6Pš†RÔëÍ´¹Á­$Í4&©¬©EŠz3`2Ù¼ÄHúÚF ‹ÍšÉvi&Ï ³·Ä¹F½¹c›/E½¥`VÛ Sñ@Q΃©u™ïº Ày@€ëg›¢ê›t7WhmÕ0½ùQÔ› ”¦¡õú1an F+I3Ijj#E½0™l^â ¤ }m#ÐÅfÍd»4“ç†Ù[âõ˜Ææ«wÑ ØÎ& ÙkÙXÖ6Å$D±¹3Ù.Íä¹aö–8E½¦±ùRÔ[–µM1ýn¥‰G=8pL­ËÄx×Î\?Šz¥¡»ùAk«†ÝÍ•¢Þl 6 ¥¨× sc0ZIšÉLRS;)êMid³g mHlõ!ŠÍÉvi&Ï ³·Ä)êua›5E½E`\Ûïº(ê!Ày0µ.ã]8pýœ?wøú[.;tä&Œï…çÁ¤º|Œw]Pßœ ½ùAk«†ÝÍ•¢Þl 6 õÐÑ7Üvy¸Å¸¬fÂÜ`,V²–ÉLRS»=}2¼n¸o{P&Ä4²Ù‰36$¶úÅæÎd»4“ç†11nÿÇ®ºõà5QlîØÅfMQoØ×ê3å.AQ΃©u™ïº Ày@€ó€çÁ¤º|Œw]Pßœ ½ùAk«†ÝÍ•¢Þl 6I¦Í Æb%i¦1IeÌF2Y&ÍQœ´!±Õ‡(6w&Û¥™<7Œ‰q¥ ŠÍ»Ø¬)ê-[e&Û¥)ê!Ày0µ.ã]8pà<˜T—ñ® ꛤ7?hmu0ºySÔ› Ä&©Ã´¹Á­$Í4&©ŒåH&˲9Š36$¶úÅæÎd»4“ç†11®D±¹c›µåF=d¯cb«Ì4»µõà<˜Z—‰ñ® œ8pLªËÇx×õÍ Ò›ä¶:ݼ)êÍb“ÔaÚÜ`ŒV’f“TÆr$ÓdêØLÅH[}ˆbsg²]šÉsØW ¢Ø>ûÈÍwýH¸Åø\°‹Íš¢Þü±²Õd‚]E=8¦Öeb¼ë‚çΜ“êò1ÞuA}s‚ôæ¹­F7oŠz³Ø$u˜67£•¤™Æ$5±Éd™:6SqÒ†ÄV¢ØÜ™l—`ÚÜ`&Æ•‚(ö¯î»p°p‹ñ¹`›5E½ùch«É»ŠzpL­ËÄx×Μ8&Õeb¹K@}s‚ôæ¹­F7oŠz³Ø$u˜67£•¤™Ì$5±Éd™:6SqÒ†ÄV¢ØÜ™r—`ÚÜ`&Æ•‚(¦¨7;EOQoîÚª1µ.“¢œSë21ÞuA€ó€ç΃©u™XîPßœ ½ùAn«€Å­E½Ù@l’:L›ŒÑJÒLf’šXŽdšL›¯8iCb«QlîL¹K0mn0ãJASÔ›Š!Qíl²P¾–Š¡­“êò)ê!Ày0µ.ã]8pà<˜Z—‰å.õÍ Ò›ä¶:XÜ*PÔ› Ä&©Ã´¹Á­$Íd&©‰ñH¦É¤±ùŠ36$¶úÅæÎ”»Óæ31®D1E½©PÔ›?¶¶:L§ëEQ®8“êò1ÞuA€ó€ç΃©u™XîPßœ ¾9An«ƒÅ­‚eD=ö¯åAi’jL›ŒÑJÒLf’šd‚L›µ8iCb«QlîL¹K0mn0ãJASÔ› E½ùcn«Ãtº^õÐàŠ3©.ã]8pýœ?wøú[.;tä&Œï…WœIuùXîPß< ½ùAn«ƒÅ­E½y@iá¡£n¸íòp‹qYÍ´¹Á­$Íd&© ýèìé“áuãÀ}û1.›dºØ¬ÅH[}ˆbsgÊ]‚isƒ™·ÿcWÝzð €(¦¨7ŠzóÇÜV‰t})ê¡ÁgR]>Æ».pàú9tä¦ ¿a_‹ñ½ÐàŠ3©.Ë]œ¤7?Èmu°¸U ¨7(M#|âÞ ßp‹qYÍ´¹Á­$Íd&© ýèÑÇî ¯ï¼ã*ŒË&™.6kqÒ†ÄV¢ØÜ™r—`ÚÜ`{Kܧ?Ù7¿ÿrŒ€(¦¨7Šz3ÇÜV‡‰t})ê¡ÁgR]>Æ».pàúQÔ+ éÍr[ÌmuúRϨg‚Ú0-JÓŠzý˜67£•¤™Ì$5¡)êMމbsg mHlõ!ŠÍ)w ¦Í ¶·Ä)êua›¯ÞE/`;›&į¥bn«ÀºõÐàŠ3©.ã]8pýdD=8&Õåc¹K@€ó€ôæÅ­æ6wz¢Þ< 4 ¨×isƒ1ZIšÉLR û‘¢Þ™(6wqÒ†ÄV¢ØÜ™r—`ÚÜ`{Kœ_Ôûõ»¯ {VÔÛóЇšF6;Lcó¥¨7g,nÞL›LQ ®8“êò1ÞuA€+®7E½¢Þü ¸y3éÍÉÞ¢(êÍJÓŠz=˜07»•$˜Ì$51!)êM)b g mHlõ!ŠÍ)w ¦Í ¶·Ä•z§^zñ_|ü‡Âßøžoï1zÓØ|)êÍ£›7ÓæSÔCƒ+Τº|Œw]ÐàŠC€ëMQ¯(¤7'(n˜úæÁ½@Qo›FPÔëÁ„¹1Ø­$Ád&©‰ IQoRL[†8iCb«QlîL¹K0mn°½%®lÔûâ“÷„½½é–o?zò‹í@6GLcó¥¨7gŒn®L˜CQ ®8“êò1ÞuAƒ+®7E½¢Pßœ ¸U`\q&çEŠzó€Ø4‚¢^&Ì Æh%i&3IM¬HŠz“brØ2ÄH[}ˆbsgÊ]‚isØW*êÅvê¥ïûƒ»Ž¿p¢IcóÅ46_ŠzsÆîæÊ„¹1õÐàŠ3©.ã]4¸âàzSÔ+ õÍ Š[¦Á•eZ^CQo›FPÔëÁ´¹Á­$Íd&©‰IQoRL[†8iCb«QlîL¹K0ynãÊF½Å`›5E½9cwócªÜHŠzhpÅ™T—ñ® \qp½)ê…úæÅ­“áÊ2-¯¡¨7ˆM#(êõ`ÚÜ`ŒV’f2“ÔÄŠ¤¨7¦…-Fœ´!±Õ‡(6w¦Ü%˜<7Œ‰q[õΜ=œzæ…çŽ?ÿìg¿üèsËö¬Œsê©çOáôÉžþßá:¨oØÝ\™*7’¢\q&Õåc¼ë‚W\oŠzE¡¾9Aqóf\Y&äµ)êÍbÓŠz=˜67£•¤™Ì$Õ°"íPÔ› ÓÂ#Î@ÚØêC›;SîLžÆÄ¸­Šzg¿úõS_þÊ—;}âð‰¿ó´È_~äÙÓ'_xáů¢ÄÄîæÇ$¹ñ¶<ê!Ày0©.Ë]\qp½)ꕃôæÑÍ›Ép™ŠŠzó€Ø4‚¢^¦Í Æh%i¦4I5¬H;õ¦Â´°Åˆ36$¶úÅfÍd»4“ç†Ù[â‚­ˆz_ýú©g^øò£Ï!ʈñÌÃ_>uì…¯¼TþØ=¦7?&ɧ¨çÍÔºL,w hpÅ!Àõ¦¨WÒ›D7o¦Äd*(êÍbÓŠz=˜67£•¤™Ò$Õ°"íPÔ›–$Î@ÚØêC›5“íÒLžÆÄ¸aQï¹—^¼õà5¿ðáïwâ;Údœzæ…“¿w&zzDZßyú©?uèØ“^òÔV;.tèø±Ÿ>þàîï ~‘v>q!í=-—é͉éqE(êy3µ.Ë]\qp½Í;ê±Ü% Ày@zóƒèæÍ”¸RL³õæ±iE½L›ŒÑJÒLi’j’v(êM‚ aKg mHlõ¡‹ÍšÉvi&Ï ³·Í¢ÞÉOÿâG¾/<êM·|û”£ÞéS/>óð—Q^bÅ{òÁcJyb«—õvJŸ |'Ÿ<}ò…s_ûcä¹aXßœ˜Wʨ‡ç ®88¦Öeb¹K@ƒ+®·óç_Ëe‡ŽÜ„ñ8¦Öeb¹K@€ó€ôæÑÍ›‰q¥˜„g)êÍbÓ=pÃm—‡[ŒË ¦Í Æh%i¦4I5 I;Ξ>^7Ü·ãR• aKg mHlõ¡‹ÍšÉvi&Ï ³7ÏEû?vÕ­¯Á`—'N?þs¼"ü2¼ùý—ÿÁ³4ãj›uö«_·'Û{ðé'Öµ¼†é\[Å,IzêÁãøe{æ¡gžá%º¾˜Þü˜W„¢ž7Së2±Ü% Á‡ç΃©u™Xîà< ½9Aq«Àĸ"L¿[IQo›¤Óæc´’4Sš¤†$™SÁ&Î@ÚØêC›5“íÒLžæbƒæ‘“_|ã{¾5ü&ü‡¿ûØ 'Ú«Õ6èÌW^zæ¡gÚ…åØïÆ».¨oNPßœ »¹2In<“íÒõf¥iœ‡Ž¸á¶ËÃ-ÆeÓæc·’Sš¤椋Ξ>^7Ü·ãRƒé_‹g mHlõ¡‹Íš)w ¦Í fb\°ÿcW­¼¦í#'¿øÜK/b° Z[§O½Øä’1׺µLçÚ*lR2Öƒ—ºÞ©§žG¿[‰ ®8ÓàŠSÔófj]&Æ».pàz;tä¦ ¿a_‹ñ4¸âLªËÇx×õÍ ê›t7W&ÉdšÝZŠz3€Ò4Î'î}kø)‡[Œ ™07»•$˜Ò$Õ0']ôèc÷†×wÞqÆ¥Ó¿)Î@ÚØ*C›;SîL›Ìĸ'N?~²o~ÿåï ¹­ŽgŽ|9†’ã¿Sæ£ô¦sm¤¤„§šãõŸøÊK_GÂ8¦Á§¨çÍÔºLŒw]à< Àõ¦¨Wê›t7W¦ÊdšÝZŠz3€Ø4Ž¢^.æÆ`·’Sš¤椋õ6ÆÄ¯¥Š36T¶ÊÅæÎ”»Óæ31n¾Q¯}˜Þ¦Ê´·smÖ()¥ùu]{°\q&ÀyPÔófj]&Æ».pàzSÔ+éÍ ¢›7SåÆ0Á.‡¢Þ 6£¨—Ë„¹Á­$Í”&©†Eé"E½1ñk©â ¤ •­2D±¹3å.Á´¹ÁLŒ›kÔûêןy虘HЦ˜Ôµ=˜¢¤”öÁzÏŸ{ !¯ ®8à<(êy3µ.ã]8p½­‹zpLªËÇx×Îê›D7o&Ìa‚]E½@lGQ/—isƒ1ZIš)MR ‹ÒEŠzcâ×RÅH*[eˆbsgÊ]‚isƒ™7Ó¨×>L=®“º¶S”Ô\ ÷¹ÇÏ äµ±ÁgœE=o¦Öeb¼ë‚ç ®7E½BPßœ º¹2Un$ìr(êÍbÓ8Šz¹L›ŒÑJÒLi’:˜“Zõ6ÆÄ¯¥Š36T¶ÊÅæÎ”»Ó挟¼ö ß0tù_þé7þØÏÿ…ÿè?ù¿í~·|Ó_ù+üþC›ŠzÏ>~&Æ‘cê0½²Ø¡¤ æ`½“‡O"äµ±Á•eê›E=o¦Öeb¼ë‚ç ®7E½BPßœ »¹2Un Së2- ê1-bÓ8Šz¹L›ŒÑJÒLl’:˜“Zõ6Ô¯‹36T¶ÊÅæÎ”»&Æ».pÅ!À qþÜáëo¹ìБ›0~œSë2±Ü% Ày@€ó€îæÊ´¹ÁL§ëEQo›Æyèèn»<Üb\È´¹ÁØ­$Á”&©ƒQi¯³§O†×÷íǸx1Íkñâ ¤ •­2D±¹3å. ÏÚž¨÷Üñçc9¦¨ç‚JŠk¢Þ³>W/ê™èæMQÏ•IuùﺠÁ‡ç΃©u™Xîà< Ày@wseÚÜ0&Òõ¥¨7ˆMR‡isƒ±[I‚‰MR£’l–i^‹g m¨l•!ŠÍ)w LxÖF½§<ŽWŠé\[…JŠ ¿ºŠzŠz#™T—ñ® \qpà<˜Z—‰å.Μt7W&Ï c"]_Šz3€Ø$u˜67»•$˜Ø$u0*əൠ⠤ •­2D±¹3å. ÏRÔ+Èt®­Â%Å)ê)êgR]>Æ».hpÅ!Ày@€ó`j]&–»8pÐÝü˜67˜‰t})êÍb“ÔaÚÜ`ìV’`b“ÔÁ®$d‚×6ˆ36T¶ÊÅæÎ”»&›FSÔËbÚÜ`ìV’`b“ÔÁÀd(ê¹3‘kÛÄH*[eèb³fÊ]ûÝJŠz¥˜Ôµ=؞ĉ¢ž¢Þx¦Öeb¼ë‚ç nE½à< ¾91‘®/æ¹.½D=&°åAlMQ/‹isƒ±[I‚‰MR“¡¨çÎD®mg m¨l•¡‹Íš)w ìw+)ê•bR×ö`{'ŠzŠzã™Z—‰ñ® œ4¸!Ο;|ý-—:rÆw Ày0µ.Ë]\q¨oNPßœ˜H× ]_{Š^ ¨7uˆM£=tôÀ ·]n1.{˜67»•$˜Ø$°.­röôÉðºqà¾ý—bLäÚ6qÒ†ÊVºØ¬™r—À~·’¢^)&um¶'q‚¨ÇWŠ©l•)ê¹2µ.ã]8hpÅ!Ày0µ.Ë]\q¨oNPßœ˜H×#]_ŠzsƒØ$u˜67»•$˜Þ$°.ÉF˜Èµmâ ¤ •­2t±Y3å.ýn%E½RLêÚlOâ¤FÔ3‰­>E=W¦Öeb¼ë‚ç ®88¦Öeb¹K@ƒ+õÍÒ›éúb¤ë…E/èõLP›&°åAl’:L›ŒÝJLo’ X—¤>S¸¶Pœ´¡²U†.6k¦Ü%°ß­¤¨WŠI]ÛƒíIœ(ê->ê!Ày0µ.ã]8hpÅ!Ày0µ.Ë]\qpÞü˜H×;]/,z¢ÞÔ!6I¦Í Æn% ¦7I LRŸ)\[(Î@ÚPÙ*C›5SîØïVRÔ+Ť®íÁö$NõõÆ3µ.ã]8hpÅ!Ày0µ.Ë]\qpÞœ˜B×#]/Ìy‘¢ÞÔ!6I¦Í Æn% ¦7I LRŸ)\[(Î@ÚPÙ*C›5SîØïVRÔ+Ť®íÁö$NõõÆ3µ.ã]8hpÅ!Ày0µ.Ë]8pPßœ˜H×;]/Ìy‘¢ÞÔ!6I¦Í Æn% ¦7I LRŸ)\[(Î@ÚPÙjB›;SîØïVRÔ+Ť®íÁö$NõÒQÎ\qpL­ËÄx×Î\qpL­ËÄx×ΜÔ7'&ÒõÅN—-¯¡¨7uˆMR‡isƒ±[I‚éMR“Ôg ׊36„¶šÅæÎ”»ö»•6õݼ)ê¹a{'îQÏôµPÔsej]&Æ».pÐàŠC€ó`j]&Æ».pà< ¾91‘®/¦º|ly E½©Cl’:L›ŒÝJº˜Ø$u00Ie&om§8iCh« QlîL¹K`¿[IQoŒß¾ýs¯üŽWöu÷íŸC{à“þØk~<¬úæoúæFøòï_ùCïØwc{Ëïù[ßÛìǺö'Þðᛳ½}lOâDQOQo7xǾw%ÛSÛŸü;?ð¯¯ý‰ŸÂöá~ioFíq¬ºûö{ګ—íµÍxØyx–}oø9l}øæ„o£½}BØCØUØ>< ß³6Ž;Ûg>E_ŠzŠzã™Z—‰ñ® œ4¸!õFC€ó€úæÄtº^ìr0áYŠzS‡Þ4š¢Þz¦Í Æn% ¦7IlLõ¼˜¶µµâ ¤ ¡­&D±¹Û›íÒØïVŠõéÍ¢^ÛÝ·nç?ÿ…åûnÄÚ.k£^s¤Rì{Ã[š-Ã7¾öâ¥xã‚=<ðÉ¿ço}oØ Ï·|åwüßüä§àîÛïÙÙø¿ Â6á6î3ܹö'~ºÙ¦ ZXxÔîŠgi¯úûWþP{‡qðÇ^óÚ{ÛI¥»Û‡gl¯ {Kt·ðljO¿ó ìmeÚ{ï/Ý‚wžá—ÅÓž¢ž¢Þx¦Öeb¼ëÒ®oNÐà†PÔ Îê›éúb°ËÁ„g)êMzÓhŠzë™67»•$˜Þ$°1uPÔóbÚÖÖŠ36„¶šÅæÎ”»ö»•b€@zó£¨ß³ó){qÉ<[63êå<{Ð|a·;¥ìR­‹ƒÍ–á~oÁ×\Ò]¯©u;×Ù ÛÄÁ&êE1Š…ÅV°°e\¶Áª#÷{ ·; þAؾÝûⳇ?c\Õ®~v‡Ñ;v>è0l¶sùà #|òwÂÆq0 ½ùQÔƒöu-ÂòÊïxåÚCöÒQïÚ‹§ôîô,®µšíÃÞ‚huáÌÜp? ¶£^±»™ ,lêö`+¢^Sîl #qÕÊ×´¶p§½Ïð¨ø]ÅU1íEM ËÝæݦEî{ÃϵÇ?|óGâCÚ» âÆ â_QoE=W¦Öeb¼ë‚ç nE½Ñà< Ày0®Öºìw+)êMzÓhŠzë™67»•$˜Þ$°1uPÔóbÚÖÖŠ36„¶šÅæÎ”»ö»•vJ…¢^{;WcåŽÜs´}¼^X—¾ù7±Y#õö½á-qUxê˜çÖjG½öxüÔ¼f'q³°Û>ù`³MVXÚ +Ö®•%îÚOÈÝC”õÂb³Z³*üÇĪ{Í?Š«Pî‚øƒß<ƃø'j¯zà“¿Ã›ÁfUøCíü×Û3>’¢ž¢Þx¦Öeb¼ë‚ç nˆF=“êò1ÞuA€ó€ç΃ét½0Øå`¿[IQoêЛFSÔ[Ï´¹ÁØ­$Áô&©€©ƒ¢žÓ¶¶Vœ´!´Õ„(6w¦Ü%°ß­t¡m(ê•Ðî\½¢^ôŽ}7ÆCášåÇ^óãØ&j¢^Øÿµ;—³¾gç£îâx¸oÓ[—XëÂî`U[âOÔœmÚ>V®ijèw+zö˜»¦ÜµOŒV~ÃAél" bï ‹m—á¶x¿[É1꙲¶AŠz®L­ËÄx×ÎÜŠz£!Ày@€ó`:]/ v9ØïVRÔ›:ô¦ÑõÖ3mn0v+I0½I*`cê ¨çÅ´­­g mm5!ŠÍ)w ìw+ÅNôæGQ/íûnlÚ\Xì±xA;ê… Âm¼üØk~ñÅSƒíxÔì°}|_SúÂ÷`ëaqŠzŠzã™Z—‰ñ® œ4¸!õFC€+õ͉ét½0Ø­Åx×EQoêЛFSÔ[Ï´¹ÁØ­$Áô&©€©ƒ¢ž ¶¶Yœ´!´Õ„(6w¦Ü%°ß­“Ò›E½Í ­a±Ð%N¿ 'ê5Ï–Ø÷ºp´ZXÐÝšà–°MøC­¼zl0‘¨×<$ìp¥¸¶ý¨æq Û`Ÿe)ê)êgj]&Æ».pÅ!À ¤¨7\q¨oNL§ë…Ín-Æ».ŠzS‡Þ4š¢Þz¦Í Æn% ¦7IÌLõ\˜°µÍâ ¤ ¡­&D±¹3å.ýn¥#Þü(êejºžÝÉ£Þ½æÇÃ}ã_GöØsŠ÷4/ûñsAN€«õ·¶ébÏ´ l’_XÂ}ûi}E(ê)êgj]&Æ».hpÅ!À ¤¨7\q¨oNL§ë…Ín-Æ».Šz“†ØT‚¢Þz¦Í Æn% ¦7IÌLõ\˜°µÍâ ¤ ¡­&D±¹3å.ýn¥˜!Þü(êå‹; Ë{s[ø2Ž×z;'Øb-Ó…´góÜÔ¢Þ°$‡´·òƒùFRÔSÔÏÔºLŒw]ÐàŠC€HQo44¸âPßœ˜N× ›ÝZŒw]õ& ±©E½õL›ŒÝJLo’ ˜™:(ê¹0ak›ÅHB[MˆbsgÊ]ûÝJ1@ ½ùQÔË÷Ê‹×͘NÔ[õŒ O]ÞûK·4Í««¦M$êa¼—f'aɹHH/ŠzŠzã™Z—‰ñ® \qp?wøú[.;tä&Œï@ƒ+Τº|Œw]à< Á‡úæÄtº| vk±Ü%(êMbS =pÃm—‡[ŒË%¦Í Æn% ¦7IÌLΞ>^7Ü·ã2Š [Û,Î@ÚÚjB›;SîØïVŠõéÍ¢^Ûß¿ò‡Vû¶k:Q/èþ1<%|øæÄçB¡kB˜½ÖDͨ׌·¯ø1@óÔØÿx^QÏdµÍRÔsej]&Æ».hpÅ!Ày@ƒ+Τº|Œw]àŠC€ó€úæÄ¤º|lvk±Ü%(êMb“ÔaÚÜ`ìV’`z“TÀÌ$5™°µÍâ ¤ ¡­&D±¹3å.ýn¥XÞü(êµÅl×u½Ú¸Öîd#Q¯¹êÅNwk¯ÚíMí£ÒŽÜsôÚŸøé•ǩŃõº¢žýĽ0WUˆzAüöÂm×5=ÚŸþ€aö#öûIQOQoù`Ø&ø%Òì³ ÛäÃ~l°Ò‡oþÍø}î{Ã[ÚŸ1aUüÔ¹hß~.±qôŽ}7ÆÛ[ÆÇÞù4§Ä†;q¤­yƃœUm|òwšo&ܱá¯öÐl¹vã‘õõF2©.ã]4¸âà< ÁgR]>Æ».hpÅ!Ày@€ó`:]/ÌviÌviŠz“†Ø$u˜67»•$˜Þ$°4I5¦jm¹8iCh« ]lÖL¶Kc¿[IQ¯d¯mÂð$~õõF2©.ã]4¸âà< ÁgR]>Æ».hpÅ!Ày@€ó`:]/ÌviÌviŠz“†Ø$u˜67»•$˜Þ$Þ˜™¤&Sµ¶\œ´!´Õ„.6k&Û¥±ß­¤¨W„I]ÛƒáIü(ê)êdR]>Æ».hpÅ!Ày@ƒ+Τº|Œw]ÐàŠC€ó€çÁtº|lvk1Û¥)êMb“ÔaÚÜ`ìV’`’“xcf’šLÕÚrqÒ†ÐVºØ¬™l—Æ~·’¢^&um†'ñãõLSÛ8E=?&Õåc¼ë‚WÜ@çϾþ–˹ ã;ÐàŠ3©.ã]4¸âà< Ày0©.›ÝZÌviŠz“†ØTÂCGÜpÛåáãr‰isƒ±[I‚IN♩ÛÙÓ'ÃëÆûöc\†3UkËÅHB[Mèb³f²]ûÝJŠzE˜Ôµ=žÄ¢ž¢ÞH&Õåc¼ë‚WÜ@‡ŽÜtá7ìàk1¾ ®8“ê2±Ü% Á‡ç΃IuùØìÒØìÖRÔ›4Ħ>qï[ÃO9Üb\.1mn0v+I0ÉI¼13u{ô±{ÃëÆ;ï¸ ã2œ©Z[.Î@ÚÚjB›5“íÒØïVRÔ+¤®íÁð$~õõF2©.ã]4¸âàRÔΜ“êò1Û¥±Ù­¥¨7iˆM%(ê­gÚÜ`ìV’`’“xcfꦨWž©Z[.Î@ÚÚjB›5“íÒØïVRÔ+¤®íÁð$~õõF2©.ã]4¸âàRÔΜ“êò1Û¥±Ù­¥¨7iˆM%(ê­gÚÜ`ìVÒÅô&©€™©›¢^a&iIœ´!´Õ„.6k&Û¥±ß­¤¨W„I]ÛƒáIü(ê)êdR]>Æ».hpÅ!À ¤¨7œ8&Õåc¶Kc³[KQoÒ›JPÔ[Ï´¹Á˜®¤‹éMRKS7E½ÂLÒ’8iCh« ]lÖL¶Kc¿[IQ¯“º¶ÓøQÔSÔɤº|Œw]ÐàŠC€HQo8pLªËÇl—Æf·–¢Þ¤!6• ¨·žisƒ1]IÓ›¤–¦nŠz…™¤%qÒ†ÐVºØ¬™l—Æ~·’¢^&um†'ñ£¨§¨7’IuùﺠÁ‡7¢Þ8pà<˜T—Ù.Ín-E½ICl*AQo=Óæcº’.¦7I,MÝõ 3IKâ ¤ ¡­&t±Y3Ù.ýn%E½"LêÚ OâGQOQo$“êò1ÞuAƒ+n E½qà< Ày0©.³]ƒ]E½ICl*AQo=Óæcº’.¦7I,MÝõ 3IKâ ¤ ¡­&t±Y3Ù.ýn%E½"LêÚ Oâ§|Ô3Am õü˜T—ñ® \qp)êƒç΃IuùXîìr(êMbS Šzë™67Ó•t1½I*`iꦨW˜IZg mm5¡‹ÍšÉviìw+)êaR×ö`x?ŠzŠz#™T—ñ® \qp-:ê!Ày@€ó€çÁ¤ºLÌvi v9õ& ±©E½õL›ŒéJº˜Þ$°4uSÔ+Ì$-‰36„¶šÐÅfÍd»4ö»•õŠ0©k{0<‰E=E½‘LªËÇx× ®8¸õÆA€ó€WœIuù˜íÒìr(êMbS Šzë™67Ó•t1½I*`iꦨW˜IZg mm5¡‹ÍšÉviìw+)êaR×ö`x?ŠzŠz#™T—ñ® \qp)êƒç ®8“êò1Û¥1ØåPÔ›4ĦõÖ3mn0¦+ébz“TÀÒÔMQ¯0“´$Î@ÚÚjB›5“íÒØïVRÔ+¤®íÁð$~õõF2©.ã]4¸âàRÔ®88&Õåc¶Kc°Ë¡¨7iˆM%(ê­gÚÜ`LWÒÅô&©€¥©›¢^I¦gIg mm5¡‹ÍšÉviìw+)êaR×ö`x?ŠzŠz#™T—ñ® \qp)êƒWœ“êò1Û%°ÖeRÔ›4ĦõÖ3mnv+I0½I*`lꦨW’éYÄHB[Mèb³f²]ûÝJŠzE˜Ôµ=žÄ¢ž¢ÞH&Õåc¼ë‚WÜ@Šzã Á‡çÁ¤º|,w ¬u™õ& ±©E½õLž†ÝJLo’ ›º)ê•dz–qÒ†ÐVºØ¬™l—Æ~·RŒz•E½ax?ŠzŠz#™T—ñ® \qp?wøú[.;tä&Œ›çÁÔºLŒw]à< Á‡çÁ¤º|,w ¬u™õ& ±©„‡Ž¸á¶ËÃ-Æå“ç†a·’Ó›¤ƦngOŸ ¯îÛqÂô, â ¤ ¡­&t±Y3Ù.ýn¥¿ýw¿g·´ÕZþìŸý³½ë.E½¥`x?ŠzŠz#™T—ñ® \qhpÅ!Ày0µ.ã]8hpÅ!Ày0©.Ë]k]&E½ICl’:Lž†ÝJLo’ ›¤Ó³$ˆ36„¶šÐÅfÍd»4ö»¾îÑÍ›¢ž†'ñ£¨§¨7’IuùﺠÁ‡WœSë21ÞuA€ó€Wœ“êò±Ü%°ÖeRÔ›4Ä&©Ãä¹aØ­$Áô&©€±Iê0=K‚8iCh« ]lÖL¶K3ynãJAtó¦¨çƒáIü(ê)êdR]>Æ».hpÅ¡Á‡çÁÔºLŒw]à< Á‡çÁ¤º|,w ¬u™õ& ±Iê0ynv+I0½I*`l’:LÏ’ Î@ÚÚjB›5“íÒLžÆÄ¸Rݼ)êù`x?…£ž©i¡¨çǤº|Œw]ÐàŠCƒ+΃©u™ïº Ày@ƒ+΃IuùXîXë2)êMb“ÔaòÜ0ìV’`z“TÀØ$u˜ž%Aœ´!´Õ„.6k&Û¥™<7Œ‰q¥ ºySÔóÁð$~õõF2©.ã]4¸âÐàŠC€ó`j]&Æ».pÐàŠC€ó`R]>–»ÖºLŠz“†Ø$u˜<7 »•$˜Þ$06I¦gIg mm5¡‹ÍšÉvi&Ï cb\)ˆnÞõ|0<‰E=E½‘LªËÇx× ®84¸âà<˜Z—‰ñ® œ4¸âà<˜T—å.µ.“¢Þ¤!6I&Ï Ãn% ¦7IŒMR‡éYÄHB[Mèb³f²]šÉsØW ¢›7E= OâGQOQo$“êò1ÞuAƒ+ ®88¦Öeb¼ë‚ç ®88&Õåc¹ëÂT—OQoÒ›¤“ç†a·’Ó›ÄK“Tcz–qÒ†ÐVºØ¬™l—fòÜ0&Æ•‚èæMQÏÓøQÔSÔɤº|Œw]ÐàŠCƒ+΃©u™ïº Ày@ƒ+΃Iu™Xî˜êò)êMb“ÔaòÜ0ìV’`’“xci’jLÏ’ Î@ÚÚjB›5“íL›ÌĸRݼ)êù`x?ŠzŠz#™T—ñ® \qhpÅ!Ày0µ.ã]8hpÅ!Ày0µ.Ë]S]>E½ICl’:Lž†ÝJLro,MRéYÄHB[Mèb³fÊ]‚isƒ™W ¢›7E= OâGQOQo$“êò1ÞuAƒ+ ®88¦Öeb¼ë‚ç ®88¦Öeb¹K`ªË§¨7iˆMRisƒ±[I‚INâ¥Iê01K¢8iCh« ]lÖL¹K0mn0ãJAtó¦¨ç€ÕI\SÔSÔǤº|Œw]ÐàŠCƒ+΃©u™ïº Ày@ƒ+΃©u™Xî˜êò)êMz“T`ÚÜ`ìV’`’“xcl’:LÌ’(Î@ÚÚjB›5SîL›ÌĸRݼ)ê9`uWŠzŠz#™T—ñ® \qhpÅ!Ày0µ.ã]8hpÅ!Ày0µ.Ë]S]>E½ICo’ L›ŒÝJLroŒMR‡‰YÅHB[Mèb³fÊ]‚isƒ™W ¢›7E=¬NâJQOQo$“êò1ÞuAƒ+ ®88¦Öeb¼ë‚ç ®88¦Öeb¹K`ªË§¨7ièMRisƒ±[I‚INâ±Iê01K¢8iCh« ]lÖL¹K0mn0ãJAtó¦¨ç€ÕI\)ê)êdR]>Æ».hpÅ¡Á‡çÁÔºLŒw]à< Á‡çÁÔºL,w Luùõ& ½I*0mn0v+I0ÉI¼16I&fIg mm5¡‹Íš)w ¦Í fb\)ˆnÞš¨wìÁ§‘äÆ3µkK°:‰«mˆzç'õà< ÁgR]>Æ».hpÅ¡Á‡çÁÔºLŒw]à< Á‡çÁÔºL,w Luùõ& ½I*0mn0v+I0ÉI¼16I&fIg mm5¡‹Íš)w ¦Í fb\)ˆnÞõ°:‰«c‡õÎ+ê93©.ã]4¸âÐàŠC€ó`j]&Æ».pÐàŠC€ó`j]&–»¦º|Šz“†Þ$˜67»•$˜ä$Þ›¤³$Š36„¶šÐÅfÍ”»Óæ31®D7o§¾ü•DžþE½RXÄUõž{ì ]_&¨M¢\q&Õåc¼ë‚W\qpL­ËÄx×Î\qpL­ËÄr—ÀT—oÖQ lyЛ¤Óæc·’“œÄc“Ôab–DqÒ†ÐVºØ¬™r—`ÚÜ`&Æ•‚èæíÌÙó»QOGêÃê$®Ž?xá88õÔóŒt}™ ¶q±è)ê¹2©.Ë]\qhpÅ!Ày0µ.ã]¸âà< Ày0µ.Ë]vº^õ& ½I*0mn0v+I0ÉI¼16I&fIg mm5¡‹Íš)w ¦Í fb\)ˆnÞΜ{)‘Inûì9Fº¾LSÛ¬¦è­‰za(®ûÔ}ÿ?E½þL­ËÄr—€W\qpL­ËÄx× ®88hpÅ™T—ñ® ;]/Ÿzà†øB÷+ûÁÝ;½’9/2Mmã˜À–½I*0mn0v+I0ÉI¼16I&fIpî…ÓqÒ†ÐVºØ¬™r—`ÚÜ`{c\)(nuœ<|"6‘'d•ÉÔ®-Áê$®âooðü /1Òõe²ÚfåF½O<ðóqÝG?óõú3µ.Ë]\qhpÅ!Ày0µ.ã]4¸âà< ÁgR]>Æ».ìt½|ô³ÿg|¡ûà§ÿxçŸ໘ó"ÓÔ6Ž lyЛ¤Óæc·’“œÄc“Ôaz–'ž9g ?óÞo‹w„¶šÐÅfÍ”»Óæ3=®ä¶:¾ü‡§b)~\S»¶«“øyêÁݨwòð‰s_ ³-Óéz1YmƒÚEoMÔ»ç÷ß×½ï®ÿ¢^¦Öeb¹K@ƒ+ ®88¦Öeb¼ë‚Wœ4¸âLªËÇx×…®—÷}âĺO>ðÅ;o|Ï·2çE¦©mØò 7I¦Í ¶'ZIšINâ±Iê0=K‚G¿7Î@~áCÿC¼ ´Õ„.6k¦Ü%˜67˜éqE ·Õáw\S»¶Óøi>PïÙ?<ÍB7€)kÔ#ê=üä§âºýùÛŠzý™Z—‰å. ®84¸âà<˜Z—‰ñ® \qpÐàŠ3©.ã]vº^öôïÆºßýÃÅ;Á‹g¿Â¢˜¦¶qL`˃Þ$˜67»•$˜ä$Þ›¤Ó³$¸ï÷#N?š4ÚjB›5SîL›Ìô¸"Ûêh¬ÞEÏÀ5µkK0<‰ŸæW·ÀꦬmP¨wì¹ÃqÝõ·üUE½þL­ËÄr—€W\qpL­ËÄx× ®88hpÅ™T—ñ® ;]/׿ï¯ÅºðŠwí»_ï?ö%½À4µc[ô&©À´¹ÁØ­$Á$'ñÆØ$u˜ž%Áû÷ÇéGóæÁ“Ï?ÖV ºØ¬™r—`ÚÜ`{c\)ÈmÕ|ùÑçbyJQ¯†'ñrñÜÛàÜ×¾ÎB7€)k›‚¢¤¢Þ×ÿäÅæ}å…3ÿVQ¯'Së2±Ü% Á‡WœSë21ÞuAƒ+Î\q&Õåc¼ëÂN—ï…vÿ¯‹ ¼â½ý7ÿN¼ÿùßý ‹^`šÚÆ1-z“T`ÚÜ`ìV’`’“xcl’:LÏ’àÝÿ¡8ýøÔ¡_j>VïȉÃhmÕ ‹Íš)w ¦Í fz\hmÕˆÖV ºØ¬™r—`ÚÜ`{c\)hm5=wìù&‘ Í fj×–`~Íaz_>ò,ÛÜ`&®mr^ôKù¾øÆñ𓟺PòZË…¨wê+ÇÕÁù¯|AQ¯Së2±Ü% Á‡WœSë21ÞuAƒ+Î\q&Õåc¼ëÂT—éü‹Gš×·ðZ_øÂ”:Ž<ðÅ(êmz“T`ÚÜ`ìV’`’“xcl’:LÒ’~êš8ñøè=o óp¿¼ãß½­­t±Y3å.Á´¹ÁL+¡­ª¯~ýääX¡®gj×–`~’â\Ó L_Ûä¼ègßy|ã8öÜáøOÚf¹õÂÒ\[ýÐÿ¢¨×‡©u™XîÐàŠCƒ+΃©u™ﺠÁ‡ç ®8“êò1Þua­ËtèKï‰/náU.¾Ü…¥™Lÿú'ÿE½ÍCo’ L›ŒÝJLroŒMR‡IZ[î¥ÏÿÌ{v?DïÑ㟠óæ“@Þóo~ ­­t±Y3å.Á´¹ÁL+‚¡­®ö'ë¹ ®©][‚JŠ{úâ/ê³xšan Ó×69/xþkçã»FðÂùñŸ´Í²õ>ñÀÏÇ-ö½ÿ;þô«_RÔËfj]&–»4¸âÐàŠC€ó`j]&Æ».hpÅ!Ày@ƒ+ΤºL,w ¬u9þôï{ÿ_Ü«\|¹ K˜RÇÁkozÙÿ®¢Þ†¡7I¦Í Æn% &9‰7Æ&©À$-¹ûлã¬ãgÞûmúþ$ÌC~òSqäM·|;Z[5èb³fÊ]‚isƒ™W*[m_ýú39¶’§K¬gj×–`’²šoƒçϽÄ07†ék¢~ü`ó>ÿ=Û^v£Þù¯n>½õžßýyE½l¦Öeb¹K@ƒ+ ®88¦Öeb¼ë‚Wœ4¸âL­ËÄr—À`—ãžÃ»ÿOxx} ¯rñå..ÍgT¿÷ã?¢¨·aèMRisƒ±[I‚INâ½I*0IkË=sòº[¾=N9šÿñOÿß4ÿòú½c÷#·Õ.6k¦Ü%˜67˜éqE°²Uwæìù&—pl×3µkK0BIAOµN¼}îɳçPåF2}m#Pô‚æÒ·¾ûŸÆ÷‘ö²õÂòñÏ¿9nwý-õâÁzhpÅ!Ày@ƒ+ÎÔºL,w hpÅ¡Á‡çÁÔºLŒw]ÐàŠC€ó€Wœ©u™XîìÖúÓ?>~ýûþZ|Y ¯o»¯t—æÿ$ö¬gšÚÆ1-z“T`ÚÜ`ìV’`’“xco’ LÕÚrw|öMq²qýûþzòo÷!·Õ.6k¦Ü%˜67˜éqE ±mÄsO_ºbÆÈ×3µkK°CI)O=x©è=ûèsç¾öÇË‹zÈyQó}ñ~k÷]¤µ\Šzám¦ùðøîÿTÔËcj]&–»4¸âÐàŠC€ó`j]&Æ».hpÅ!Ày@ƒ+ÎÔºL,w lvk}üÞ×Ç4L£›å}Ÿ¼:nðÖßønE½MBo’ L›ŒÝJLroìMR©ZÛì왓—Î…úý÷îÎ?v–C~$Žÿܯ_ÜVºØ¬™r—`ÚÜ`¦Ç¾¶)_~ìt“Nžñáz¦vm ¦()¢}qŒgz&ü#éÜÿÉ6D½GN|!¾_„7”•ÿª½õÂÞl.nýMÇžþ¸ipÅ!Ày@ƒ+ÎÔºL,w hpÅ¡Á‡çÁÔºLŒw]ÐàŠC€ó€Wœ©u™XîØìÒŽ<^Çâ ¦ÑÍòÌ™/Å ‚Oßÿ.E½Ao’ L›ŒÝJLroìMR [ÛìÝÿ¡8Íø…ýø—Øù¯n&!GNFq«]lÖL¹K0mn0ÓãŠ@\Û˜¯~ýË<Û”cCÏÃ5µkK°FÉxícôN>ñü¹—bÑÛ†¨÷‘{vøþÕ»þ·Ý·½Ëž¨×>Xoßû¿ãüW¾`2\YpÐàŠ3µ.Ë]\qhpÅ!Ày0µ.ã]4¸âà< Ágj]&–»f»„ó/i®±ï¯\ùhÄ¥9XïÚ›^öÈ|NQo3Л¤Óæc·’“œÄ{“T`ÂÖÖjN¼ ~òS»3Öò®ÿ½¸öÝwýŠ[èb³fÊ]‚isƒ™WãÚæœyñ«Ï<ôL“Q†]7ÃÔ®-Á %#µ¯Œq¡è9ß½ÅG½gÎ]:âûУÙ}ÿØ»ì‰zayü™û›ÇìÿÈßþÓ¯>bJ\ApÐàŠ3µ.Ë]8hpÅ!Ày0µ.ã]4¸âà< Ágj]&–»–».úÇÇ÷ôïÆ±ðj^Óv_ÝV-ç¿vzß^7~ã{¾õ™§ÿAm ˜À–½I*0mn0v+I0ÉI¼±7I¦mm§û~ÿ7âì"øÀÁ¼;íØ»„)J³ÍtÑͺج™r—`ÚÜ`¦Ç²¶Yg¿úõ/?úÜ¥˜ò;O?a²]ÚÞÔµ=ؤdŒ§[¿'ïäó/\:Fo¢Þ-Ÿúñø6aønF½°ÜwäÍ̇^mJ\ApÐàŠ3µ.ã]8hpÅ!Ày0µ.ã]4¸âà< Ágj]&–»Æ».þôî _^Ív_׺—gÎ|©ù2þù¾ëÅç¿‚¦¶qL`˃Þ$˜67»•$˜ä$ÞØ›¤“·¶ÐcO}áÒA·Î¿ðáïFtó†.6k¦Ü%˜67ØÞW ²Ú<ûÄÙ&©Çû¤½½©k{0KÉ0Ǽô‹|ùȳ_yi÷sôÚæÆ0‰­¾vÑû£g¾ß#‚•G|ÇeEÔ Ks%ÜࣟùÇnÇë!Ày@ƒ+ÎÔºLŒw]à< Á‡çÁÔºLŒw]ÐàŠC€ó€Wœ©u™Xîï¬?ýããýìÿÙ¼vÙ+Þv-í+áþò¿ü¾SÏGVÛ,&°åAo’ L›ŒÝJLroìMR)\ÛæÑÇïý™÷|[œT\ÿ¾¿þÂù»³UKûã}?ÿèèn®ÐÅfÍ”»Óæ3=®µ‰8õÌ 'Ÿhç•Ì«âšÚµ%§¤¯§Z×Ĉž}ìL¼Ö­Å07†Ilõµ£Þ{>ñ£ñ âí¿ùwvß6V-«£ÞŸþ‡?i>å!x×Ǿïëç¿h’ÜxpÐàŠ3µ.ã]8hpÅ!Ày0µ.ã]4¸âà< Ágj]&–».ìwÖ×_ú£æ¬Û ¯Zÿ{‰ÿcÜ.Ÿxàç›Ç^÷kßþÄ¿‹²¶AL`˃Þ$˜67»•$˜ä$ÞØ›¤¹¶Ê݇ÞÝL'®}÷ËŽ=wxwžÑ½|ôž7Æíßøžo}ìÔcHo~ÐÅfÍ”»Óæ3=®Ô´é8ó•—p*npüÁ§ŸÚÉXhy½©k{0QI¦§ÌÑyÁ3=söô‹ym sc˜ÄVY»èøÝKo(éw“ÕQ/,ç¿vúí¿ùwš½ì{ÿwœzî3¦Ê„ç ®8Së21ÞuA€ó€WœSë21ÞuAƒ+Î\q¦Öeb¼ë„Ï<{OseŒ`ÿíßÿõ?yq÷µ,{ifÕÁµ7½ìßûâÚ¦0-z“T`ÚÜ`ìV’`’“xco’ LçÚ/½xþ_þöµ—&ï~Ù£Ç?»;ÃH.áß\͹º?÷ëW|ùߟC}s‚.6k¦Ü%˜67˜éqE ¥MÍé3/>säËh.ÁÓ;WÈ}êб'¼@QOr<õàŽCÇÃ/ÏžKa\tò÷Nž>ùžÅ07˜Ilõ5Eïðã›7”÷}òêÝ7ŒŽ¥3ê…åOÿß|àà?nöõ3ïyÅÝ_øÙ¢§â"Ày@ƒ+ÎÔºLŒw]à< Á‡çÁÔºLŒw]ÐàŠC€ó€Wœ©u™ﺰâ5þôß}è®}÷75¯T½ç½ŽÑk/÷ù@3±>|ðõS8— lyЛ¤Óæc·’“œÄ{“T`j×6xôñ{ù7¿¯™?ìûÀ+Ÿ9ó¥Ý¹EÆÒþjWÂE›5SîL›Ìô¸"ѦéÔ—¿Ò¾0®Hq'ŸûÄß»û1á eíÑ*©¨—Oú¥æm&¸þ–Ëîûâ/š<7 œ4¸âL­ËÄx×Î\qpL­ËÄx× ®88hpÅ™Z—‰ñ® [^tèKï¹þ}­ý•seŒôrì¹Ã?sñ54xã{¾õ®{ÿ¯Í^=ƒ lyЛ¤Óæc·’“œÄ{“T`‚ײxæè¯Ý¹û™GÑ»>þ÷œ.ÐþüÛ}pÐÅfÍ”»Óæ3=®ä³);ó•—ž;þüÊ÷D†9ù{'Ÿ{òlúd[‹mn0“Øê;ÿ'rúüéþÁ+âÛÁµï~Ù©¯<¾û>ѽ¬zaùâýVû_¹Á/|ðo|ñ‘_5‘®/8hpÅ™Z—‰ñ® œ4¸âà<˜Z—‰ñ® \qpÐàŠ3µ.ã]æ¼/>úþ·ÿË¿Ù~Qºþ}ýñgîß}Í·¼pþDûÂë~íÛ?wè×^8õr[L`˃Þ$˜67»•$˜ä$ÞØ›¤“½–êÄ3GÛçÛFÿü›Ÿ.Ð\ 7øÀݯ÷>]lÖL¹K0mn0ÓãŠ@8›…3/~õÔ3/<ûÄÙ/?úÜ…ÏÝÛ{I ‘„g}î‚ÇΜ:þÂóç^B­ËÄ67˜Ilõ=qêhSô‚ÄoÛKVÔ Ë×ÿäÅOú¥ö‰iÁµïþ¦ü›ÿß9ô2pÐàŠ3µ.ã]8hpÅ!Ày0µ.ã]4¸âà< Ágj]&Æ».BÞ×_ú£C_zÏ>õ£í“mƒŸyï·…W§Ásè®å¾#¸þ}½ýDÁ¯Ü~å§ï×3'þÝÍØò 7I¦Í Æn% &9‰7ö&©Àį…yì©/ÜñÙ7ýü¯_úGWô®ÿ½^§ÜÚ%Ìd~áCÿC³ÃwÜqÕÓçN¡Ä„.6k¦Ü%˜67˜éqE —ÍÝ ðÇ»¾ÒßL¢Ø¬1Ìa[e¿ûøÁæ¬Ûàîßý»oë–ܨ—ó_;Ýþ,ù¶w}ìû‚OÝ÷Ï‚C¿óñ§>šávw8ûØ@Ǧã_9û¸¿ßèøDÜéï.gŸðð©~6øø½¯׿zuûʶmÿü›ÃëÒî+Té%L¯?uè—pœrôÏ?ð]¿rû•·ßýÏîº÷ÿúôýïzä>'Ãý¡T÷GÅý£{$×cRÛ£Ý+µ=¾(÷ýþoüëÏ¿-øµ;ôw\uÝ-ߎù@ðößü;™×ÄX»„)ÍþÛ¿¿Ùó›ßù‘‡ãJA›5SîL›Ìô¸"ÅæŽlŽõ¦an SÙjj_ë6È/zaéõâòÂù¾ûŸ®ü‡®ˆH׿﯇W¡ðZ´ûªä¹„ö'øùöÿy."""ò®ÿ½C~dwºPhùÓÿð'íC(^ÿî—ÝñïÞêqȺج™r—`ÚÜ`¦Ç(6w ds¤¨7m sc˜ÐVÇ—N|áÆ]Õ¼ìÿÌ{¿-ó¬Ûfõšåñgîÿøçß¼ï¯l¾?áÕ&¼æ{îðîkPÝåÔW¿ûwÿ>nODDD¶Çµï~Ùû>yõ¡G?2àjùË=¿ÿÞö“¾é–oÿ×þÿÛûÿÛÎûÞÔ1Œð‚8îAÃå6LVçà&„‹BSóÃ4î@ቸ #bÌHŒ0)͹-•Úç$Æ-Q¶rm¹eJºQgPç–;qŒÌ©ŒÇÎ\sêªErs•8õD1Æn¿Ï~¯úä9Ïó¬g­µwÕ®ýåõâM±ö³ž/ŸçËÚg=ï³öÞû™+· 2_l­U8w ÞÜÜ*ü¸ QfŠ­»rƒl…©·ÚʹETØm—­¿üÿó—Þzà§–´ÛóË ™zÁ½¿ýó÷ïýé;ï½(}íÝO¿üæB-®7ÿø9½«¼{çwô3ÇÜ%ñÑßÿXñ|燯*¶·¾û[YÌ!„Ú}ù_ÿº÷8?øàýëáßáÛ‡ÚÊžœxî¿û?¾ý½ý÷7ÿ.³çæSæ‹­µ 管››[…w!ÊL±uWn­£0õV[¹1·ˆ Óíòôÿý‹oüùO-½ú‡¿1ß]Œ©ÅÏþá§Gß¿]~åÑç^û/þÕÿôü‚_·—ùbk­Â¹k¨ðææVáÇ]ˆ2SlÝ•dë(L½ÕVnÌ-¢Âz»XýÇ¿ÿèOþßøïþð¿N ÃzùÍE>‹†©°Šüä§÷Öwë™W~.ÛZ¿yëÚóÆ)}õß|ö?ùŽ×7Ñ‚úÎ¥è¿G«ª7'èÿ…–¦o] þôâõÒ7ÿKé…×ÿOÙ[whïà—¦~ƒ^ ¦ÀêòÑßÿøèû·Ó߯E!´¦úÌí¿ú‡¿ñg'ßêÞâS` øèïü¾úåýëÙ!„ЊëÙ/ÿ“¯ýæâæe`ê¬?ùéß½ïO¥£ïßö¯y „Z)ùG–îýíŸwoÜ—¦Àš©°f`꬘zk¦Àš©°f`꬘zk¦Àš©°f`꬘zk¦Àš©°f`꬘zk¦Àš©°f`꬘zk¦Àš©°f`꬘zk¦Àš©°f`êÀšñáGõþ½?ýÁï¼óÞ‹!„B«¬£ïßÖ}‹ô“Ÿþ]w+sA`êÀªó7ÿËûïÞù—ßÜùÌíúwþ7!„Bk*ÝÌè–æ­ïþÖ½¿ýóîFg^0õ`EyÿÞŸ¾ùÇÏ=ÿê/dwÃ!„B Ýä|ýè7uÃÓÝúLSVŽýå}þ÷9»ñMõìï~üåo|!„Bh-¤[—ìf&Õó¯þŸ|«»  ¦¬÷þöÏ_~s'»Ó•t7|ôÝO¿÷ ?ùñ×ÿÓÿÿm„B¡µÓÏ>|S73ßùÞ3_þÖ¯f·:Òçÿ—ô—ÔÝSV‚Ÿüôï^ýÃßÈîn_}ë×Þ;þ,FB!„6Lº½ù³ï?§[gö?–Þü¼üæÎ‡ýUw{ÔS®ž{ûçÙwç}ù[¿úáx5»ýE!„Ú0é†çkðÀÇ>sûãc¾hS®˜|ðÎ3¯ü\ÜȾüOþÅû¿Ýï"„Bm°î}ðÊ—¾ù+q;¤[£ïüðÕîV©L=¸JÞy޾ûéì!„BhKôÞñgÓOã¾ùÇÏu7L50õàÊøúÑoÆmëgnýüûw¿ÝÚ"„Bm•þâýßÖMQÜ }íÝOw·M˜zp5|ç‡¯Æ ëÞ«ÿ”oÐC!„’tSôù¯þbÜ&½{çwº›§ÁÔ€+àý{ߣ÷Å×ã÷mB!„Bº5J¿bïGùGÝ-T¦,›?ú«ÏÜþ¸oRŸÿÊ£ýõW³Y„B¡-×O~üuÝ&ù~I7Nó¿¼ßÝHƒ©KågÿðÓÏÿþ/ûõ™ýÝûà•ì!„BIóï/¾_ïùWA7QÝíÔ L=X*Gß¿í{SéϾÿ\vóŠB!„B?ú·/Ä“n¢ºÛ©˜z°<~ö?}öËÿÄ7¦_ÿÃÿ*»mE¡µÖñÑK©²³!4ŸÞý“é{§g^ù¹þþÇÝM¦,“·¾û[¾+}öw?ÎWé!„6IÇG/]{äá‡ðõB¢Ÿ}ø¦nœ|õæ?×ÝTaêÀÒøèï¿x{ôÝOg7¬¡UеG.µóÄcY6Ô§Ýw–¦Bèâôï=ã;(ÝJ}øÑ_ùÎ S–Ä›üœïGŸýÝÿìÃ7³»U„ЊèæS;)5ãàöÓYÔÖµóçõ0õB¨Ïõ}õµw?í;+L=XÏ¿ú ¾}ïø³Ù}*Bh¥¶ÔõO<šBƒÂÔC]†~ðÃÏù>ê3·?îŸÁÅÔ€eð}ì;Ñgö?Æcz­¸®âQÛR˜zsS!tÒíÓgný¼ï¦Þ¿÷§º¹ÂÔ€eðÎ{/ú6ôKßü•ì&!´jÂÔ[D˜z¡KÒ«oýšï¦¾~ô›º¹ÂÔ€e°wðK¾ ýÎ÷žÉîPB«&L½E„©‡º$ýÙ÷»¯'~þÕ_Ðͦ\:~ôW¾•>úë¯fw¨¡U¦Þ"ÂÔC]’~òã¯?³ÿ1ßPÝûÛ?ÇÔ€KçÏN¾åÐÏõ³ÛS„Ð jqSïôîk{ÏÝPqk÷Æãc~EwÿÅ'wžx,JÝ|jG•d:zû…¬”¤DeN öe‹z”Mm¥§dWüqªOY%½<>z S!tyúÒ7Å÷Tßù᫘zpé}ÿ¶o@¿ö;Ù½)Bhu}1So÷Æã6¶ÂíŠÚú|®½çn¸ˆþî<ñXÔP¢œiÁ“;·”_éÊï¶¢`êÙYGo¿àÌF9®æº¤stªíBF„e»¦BèÂõõ?ü¯|OõÎ{/bêÀ¥óÖwË7 oý›_ÏîMB+¨ë ˜z.{푇ÓgåtXùÜÞs7f­=´{ãñ4=¼6×v|ô’”V«—®V¦Õî¿ø¤ VãæTöìÞÊ£?˜º{ÕP-÷Q¨¡4ýàöÓN7˜z¡ ×;ßþ”奄öî§1õàÒÑ}§o@¾ûéìÞ!´‚ ÓªjŠ5¦Xj½Y7ŸÚñ©ìºÓ»¯Ù˜³Å–ž’"’ì=ËgÛ3ßM:>zɧTPÊœÄÔ˜+ËJÑÇjHá L=„Ð…ë;ß{Æ÷T_:üç˜zpé¼üæŽo@ÿìûÏe÷¦¡Ô|¦ÞÑÛ/4Jܹå³×|.\°j©8«R}§n>Uù\ãa½0õDù])º_ý¯O•ñXáQ L=„Ð…ë?üœï©>ÿû¿Œ©—ÎÞÁ/ùôý»_ÈîMB+¨pµªF[ŸâëꪰIáv¥_WmUK¥OÕe§ÚÞYZ0ûmjêܹ•ž²â¡Â²ûÑÇìù¾T˜z¡Ë“n¥|Oõü«¿€©—Žî;}úáx5»7E­ æ3õͬª7Ÿ©×—žª/žÁ²ñ `Ùý¨³ñ3}í"„ÐâÒ­¦,L=„ÖKs˜zñéZá(nWZm<ûVý$lßÇ]ãÓµJÏZ Es:NËÎmê¥}lvÑ.¦BèÂ…©KS¡õÒ¦^8eâÚì(Jý»Ôž‹ÄPßÏk„ï&Òš«º(S/í#¦BèJ„©KS¡õÒ"¦^ŸSÖP¸`ÙgZÏî½§_6=Õ绦Bh}…©KS¡õÒHSïäέ𭲆n?e÷_|Ò‰Go¿a”¿J©‡ÚNaêÀRÁÔCh½4ÒÔ»6ûp«G^}ÚñÉðÂ\­@öŒž¾[0^j_Ù1¦ÞÑÛ/¤§REð˜z¡ ¦,L=„ÖKcL=;\©/fVã—a«RU*«¶t ²{³Ÿ¹ÐÁÉ[YÎPøk*xz÷µìl[iÙì”ÕgêIÑGåÉN…"ÊN!„ЂÂÔ€¥‚©‡ÐziŒ©çŸ°H}±(UýÛ>Þ}M•Hg÷ÞÈNµÞY|bw¤.ÄÔë™ø¹^©‡ºpaêÀRÁÔCh½4ÆÔ³½•fˆß±}ŸN=¸ýtVgiŽÔι-•í3wo<^~ß"¦^ü¯¨ö1†N`ê!„.\˜z°T0õZ/ >þ]–!,-Õ}÷ôîk»7oÙ{îÆ$ìäέ4ÎÌbÓK×\šzñ0ݦžŸ+ôY¤ë”ò[ÎÐçl"„ÐÜÂÔ€¥‚©‡Ðéàü·hŵGÞ›}Ã]ªxDNd¶×ñìÛñºs³âás9=Ë/¥Ï¾ e«Jíf¥4T‘µ%JGO²·hÊîžÝ{C5ø¬ê)¹l|ÒFý¹ã(>écÈ!4F˜z°T0õZ…!5åÏj8½ûÚÎ…­(¥jÌI#-ے≼ %–?››>ܤզ?”íÜ~:Ë–ö.=¥ã©_ù‡B aêÀRÁÔCh]t|ôÒ$õý@íéÝ×ÎÇVjÕæ½þ‰G•sç‰Çt*õÈÂ8ˤ0TI4×þÙÜRqöìÞÙ)+2¤Šê Mw¢âqÙ©?‚B aêÀRÁÔCõɆ½ÖÿcéçauE¡­¦,L=„PU~FOd»eŠŸ¶ÀÔCm¹0õ`©`ê!„ªŠGðú>âj鬳aê!„¶\˜z°T0õBU4õÎpv¯ç;õBhK„©KS!T•¿POè ;•ÊÞßµGÎÒBhÛ„©KS!Ô§xXo÷ÆãÙäú'tÃÑk?͇BÛ L=Ø^NNNö¤;±Îv™±¿¿ß˜Ñ> p±të윳³³îò‘o)—¦B¨¡Ý_{äa[{:Hå>u‹BÖV˜zÇ¢{îîD.SÂúnBNOOºÅ9JiôÑ-ˆa0ךýýýk×®ù–Qè¸;±Îìî~ýzwbFû,ŒAW}wýO§«¢@uj5voÓçém¼ËqΘֻ¬WBÕë–ÚŒÕ‰í’ØÈ·”KS!4¨ã£—n?½÷ÜÐþ‹OòtB¥Ú S/ÛT픺s¢íS–Ywäëø$‹¶R;;;ÞZè¯qŒ^vYa4ÒnøÎÑ0îîîv§amÑ$Æ„vIkÎÙÙY¼••¶]û¬¹ÿ–1c-\¿Ý‰½¥<•ý31‰r<£B÷Bø¥Ð±z×eqóæÍ4C•YKAôohÖ˜zfóÞR.L=„B¡Åµ¦žH7¢ok"s;ÛÊrpp „ã×q—:KO·Ž]*LAÛo ÐnÉuãÑ<ÆœvIëÏÞÞž;U}kŸ~k±Èãmù¦ÞîîîÑÑ‘FIܼyÓ‰~s0ú%ͯ”®–áþìììÄÿ6žžª#1å)CœMÛR *˜6ç³]±«#¢]…`–€ºéþªã]`ê!„B-®m1õDl*Lãù»Ø/-gx±œœœ8ørh¼ßc§17±úFxqîïÎ×ùsßW‚†ËãÖ½ž‚JyN7éºhÛví³"Öù|Cºdü¶&–ó¦ÍeÿŽÄ¨– )ФãÿT}àW9= Õ9Ї«‹öààÀg…2\ù›Éz-§AÔ ÑUu«³S!„Bhqm©[‹ö>ÇÙÖÑÔ‹^úŒ^Š7{ì4æ&6çÕöâÄn|—ßOýþ–_œg¼ªÛ3Ø·h#ƒ¸yóf—zE¸§bŽËsÕó©7L=„B¡Åµu¦žnÇcwQ}8Â8Oã–}e³wRѽ€‰x?/ú܉­ø:.¿+$æe×`#wà±Ú–Ð%-ãÍÆ‹­tÊbT« I‰:ës̪;99Q†ö 6Š»Åvžå‘Ìqy®1ò:è’ 6ò-åÂÁÔC!„Z\ÛhêÅ=¢ï±gnܲ¯&±‘½“<±{ óè’ܨí–ßÕ²ˆk°‘;ð°Ú–Ð%-ãÍÆ©ÞH»×çĨV’£ŽõÙÎ(ÙS<ÞL®|a+G²ÿôŒy‹ÞÈ·” S!„Bhqm©§»ð³³³Ø`ômh#s÷zMˆ„8èùø-,HìèúÏ"¤‹sí–ß’þ€É®ÁFîÀÃô©.ÔöYhÓ÷ÿ"1ªÕ…¤«;-•fîûømƒv[&Þ¬®|a+G2Çå¹RŒ|‹ÞÈ·” S!„Bhqm£©§ãøzrQýÅŒ4sÚ†íîî*gŠRªOÿi¨ý•qÎØÛÌ~”Ö‰¢Ýè ªÁýR]ÒDÊ~©ª1¡F2íˆQJôHÕêe —N² ÙÔ¤gUóÎÎŽÓ³€#=eîN•¨`ß{Œ[éNÌvàN:[mZAê”+ΙR]«ªY§\³Ðqu M½ñËÕé*å̦Œ3Ë>yÔnK(t\½¸”¨³Ý¨Íæ%#m®Ju>fÊR4’å%Ðs ˆ³Å”)sÚeMªõ©>ʵ-”"Ü)µÒeMP‹Õ³é0ª¶;=Ë h^.¤jÇS²µ$\mF{úúFÒ\`´cˆQU]R?jÑ™Åßy7¦-õz0‰aL)/äx‹;<<ì’ÎI‡Ú(¥;W3õ²ÙÏ&®J¹ÔUCõÂì[s\_)ʬ:Ý¡ÜJ#v!o)" X\ÔZ]0õB!„×–šzB·ÔqÏ]~|–¹D{0çQ=Ê&"ETwhÞÃ8ƒðÞF7èÝëes‘9H+L÷T#‰^¨÷+*lD¥=†Ké¯jÈFC¸³Úœ+¤.©V¡70ÝébüU\Õvç΋kTÓ†DYí|êCEúÊj!iSñè@‰ê{IQT.eÒ‚}d}Wýî—w¼JÑߨ<›©£W]®eGœÞž8‘5”ÅVm+­0E™]ÊôeKÉš+QçT~YöTdS¤oT6ýÕqW졇JDEÒkÁ#–NP z¾ƒŠ¸!ýÕñlÜ7y]Öèe—;AÙúÎV§#¹LÙq#¬R×úϦR§L{úª#\H´ã‰QUý]R“4Œla2¦­˜Gw¼úž£cÅSþËjÌ»¤sÊ·wMMw®0õª—m;ÈXê*«¾‹¨¤,xQ×Wʤ·huÓ)*â—1t) Éù«¸ƒªA}™õø/írü×L=„B¡Åµ½¦žnú}s,Êûã,sF첂ºq›þê=·6Π¿¾ËÚ;éXñÄýºˆÿðŸŠvVƒPéΪMô+Û^jœ®=F—”#©¶º¤éhè¸K±ÏŒRÕñ µòæ\)ÊéYµóuªÁ`üj(2hp¡4Øg…&«+sþÑ<õ«ƒN Ò=v´¢Ê»¤1j¨Ü“ÇhŒ½t¹ú¡Ì"z¡¨ºÜC‰´”‰¶„rº-E8ë÷qÚ¢P†®ØlÁ;OdˆRA—µåqYU¢cýM§L‘ø¬H§ÌèRõ)—íRguÐ¥>HÄ|xx¨õRµ©3"ú–häÑA—tNZ¼Úº†´q6Ž´SAÔ¯…äˆå5 UÒx™t*ETÛW°ˆ¶ºöŒvbÌËÍŒio™¢x_¨ÁÜjÓØŒ™tˤh@»û&†½ºËU¢ÏŠ,ÃøÑ3ÑИÝã`äQ[u ÅûÚJ÷ÉååÓ®¼Í‚SÖ :ÕîrÕ}óFÔŽy°Gíñ\Hѵr1Œ¬¹/°*æÄ"ÑNb°¡>´ê´bdŒ¢ª^à&mKÇAZÆ;z"Þ:ªñ+Q!5U[Õt!Mý‡o‘·ñ˜Ö©×W›¨V£Ý%¤=šú–ÖjŸ¯¾j_†uS!„Bhqm»©'â]â²¾Ìq#® ]RAÜÍ‹r«àš«§Dºè’ÎÑ©*‡ïŒbŽFMùà@cƒaÔ3¤Ul«½e,ÌשA"¼¹«mõW»/Æ„­SΓ™­ãGÏD=j´Kêg0òvmQ¼ÑVÔP61)ÔŒÁ!:nA{Læ±1ñ´ó ÖÐÏÁâ®-Xs•Fsb‘h' õ-¤6¶ö\ƒQ=Õÿ†ÑV‰J©Góõ%f'sßlØÙpwž²ƪmÕV'½qÎ]£ìà´¶£êcÌjiDeý¬pLÖL=„BW¢k<:>z);‹Ð%I‹-]{ÙÙE„©÷ˆøÿü¾Ìq·Ý¸™ÖÆ,¶ å3Gí]Dc'3úîûSʽb¶QŒ~©Wq‘ÇÖ¢Œ¶Áà†$Úªvm°xõLêÔ QJ]Òƒ,²Qµû"Š e®Ò.*?z&Vݘñ‰vû"o×ÅmE å#*“BÍXpÊ´Çdî‹‚xÚ1ö¨=žƒÅ#²kQsµ×ñN5é)¤Fsb‘h' õ-¤1蟤ˆG¨ªö£^Ê 9 ÷¡ï11½ŒHtì<éÿø>ѽ~¥»ˆ"ì’”è³eñ ÒqgYåqªoZÛQõ1X­hôÈÄô©¶.霈ª¯Ëi†®Ìz‚©‡ºBí<ñXº»îÓ¦:>êþõO<º{ãñ,}urç–ú"í¿ødvª!õÝÿ˜Î=Ū![-Uí=w#+¸Òh{Ø5þÙ©eʳ¿F~vï yÿ.So>|\½ O /ïRú2ë~ÚÙtÐ%Õˆ{85uo3ûŠŒø˜’Èê~)ýþ¦¡Ilc[RFÛ J©ª.éA”î Õ® ¢žID™]­º¤Yd;'¢þj÷EÓ¯ÌV?zFM8ÿ˜M¯êtæ¾ÈÛµEñF[‘§ŒR¨ NY U¤×û‰²©ªITÇ$º3uÄã´cìQ_Óf°xDXv­mÛE»Õ¾úh4'‰vÑzÑ%ÍKú¯Ru .°­”¾OàêeŒ^üS¢ "œ˜¦¤Ä´V—S㌩qm²·q¥¸lß´¶£êc°ZÑ葉éSm]Ò9Õý.5©.Œ5S!tµ [çàöÓÇG/¥ZÜñYqÙV¸þ‰G³ôu”æÈ“5ÉÍ9zû—Zdеr\Éͧv¼rB Ƨ6ÕÔ‹ª³Ù©åËëYhZ³S+(­…Š©7'¾Q®Þ…§ÏÖù.¹/³n£M]R¨­¬!NMÝÛ(°Ùm|NæÚ´‰§0Dú…êqbc—RÛ’2ÚQJvIÒf°x0_§‰jûXd;'Ã?%S˶—kÆ`äíÚ¢x£­ÈSÆ?)ÔŒ§Lè2tlªAèXךJ騫cÝ™:bQ°/ÑŽy°G}M›ÁâaÙµôý6}á5úU¥ÑœX$ÚIDCê`—´Uµ¶‹m+¥œô³·"f0mÚÑöýïHÔY]N p‘©,ÛŽª1!5zdbúT[—tÎ|Q­#˜z¡«UÛ•¸þ‰GûN­…vo<ÞxŠêÚ왦'ËÒ×Qš#w§´Ïƒ RÙ©¨¤êÜÙ^_SÏÁ©Yº¥~yØWáñÕª`²ôÕ”ßy.6ZL½Ž¸ÃÚÀôeŽ»ùòF<%nÊKÇ­}¿>¸Xt;ö.úU~Ý^ƒ´IÑF©¾1Œ`ÊñƒÅƒù:5HTÛÀ"Û9õW»/Æ@ÉÔ²íåš1y»¶(Þh+ò”¨L 5㢦lwwW—X—:£=&í³¢¯SQ°iÇÜ>+Úã9X<"¬vÍ&‘P+º<Õ„ˆgÓT¶Úhƒvs F;žh¨o!M"FI”r±m¥ÄDÄcwºÜÔJº¶½<"ÑÏ÷õ ¯p~QY%úlÙ—˜š9ÞÆ§µUcVK£G&¦¯´ˆ*³¼7L=„ÐÕÊ[kQu%üÖ*óéÚìÙ¥õÿBÔ%ÞŸûņ(*©:w§w_Sëkêù¸¾sbêaêý#q§®—™µ·qž¾;u_åV¡½‹Ü ,Nö.ú¥ŽwI#ˆÇj&EÛØÌ¾¨NÖ`ñ`¾N áõU»ÈvNDýÕî‹ù†ÝŒ=«¥º\3#o×ÅmE e“BÍXdÊ"ìêÇEÛc2÷ˆEÁ¾€E#fÑ>+Úã9X|°kvŽ¢¡cÑ—¿M»¹Å£I4¤ŽtI Ðþ§äbÛJ9*~pV™~óü¡oÿÇ•_–ÿ‰¨ç¯.§Æ¸ÈÛøà´¶£êcÌjiôÈÄô•ýЍõo˜z¡«UÛÔ“±{®\˜zÒÕšz’2œÝ{#K\ùS¢˜z.L½…ðrã.9v2A™9nÄûîÔE¹#J‰ûõ©{›1hO¥Bcg%ª’1ý*‰hÅøg ¢­r3cÚ[¦ÁâÁ|$Âë `‘íœhw_¤ÃÞ÷a·>Æži/׌ÁÈÛµEñÆZŠÊ<“B͘{ÊâbïÏö˜Ì=bO_À¢/fÓ>+Úã9X¼Ý5;z¶Aµ†ÕDµ•ñ´›[0ÚñDCy 4j·} 7faR[S‰vžÌ<ëXù6û”¿FTXh%úlYÉ"ÝœÖvT}ŒY-™èW¹&£þÌHÝ<0õBW«AS/tvï åI§ÒÄÒ¾9½ûÚÁí§Õ¤ƒìl¦£·_pNgŽê šˆÌRUÖ´í¡z"¥Uߥaï¿ø¤^f$W¨³Ê‰.ÕW$“ke]p¯Ó)Íï³Îæ0Æ‚¤Ÿ”IÁ[QI:}r롈6MŒIOÕ·0RµWš'Ýõ¨ƒNT[™_ÒY[¢×?ñh¡Ãö±›KK¥Š Ru¥¥QEõ®Q¤Oó™znZ*'Ý ¥cžÊVÔ¨ÖÒ©9¢m SïâcG¦Ìœ>:Q}0GD%Õ;òö.bp'ÐÆû„r“R íWöø)ÙG EÔ¦^wICÄf¦ÚǾQ¼ÝM1w§ÚÄŽ«/€E¶s"êo|Ü,†hêGÒÆž‰†ªË5#"¯®|[¦Z[¯Î»¡:°jÃìcî)kçàbìrßøÇPˆ¾7¢¨¼[;rÑ×´,ÞèšË^¬aÑhN,í$¢¡¾…”âF—p{YNjk*ñ¯˜ÂÓLU›ð Ñ_½»ê ýO€3‹êrjôt‘·ñÁimGÕGT;÷܉ƚLŸÅ>;;ëR ¦þ˵‚`ê!„®VÞZ íÌÓtmÅÃø°´K·k`vo<î¼þú{Ó„2d6Äͧv´o—t°óÄcÊ£ãÃןMóXJTqUm’\§"ÔY)i¨iTÎ)Þ}- 5E•ô•JaG0>β)Å•¸ZuAN:®ö4UÔ 4>Ùè¹¶,Âð鄎•¢ Ñn Îà HÊìdó«ÚøPUû/>©³nKÇJ¬æ/T6&Ñß²“F~øú³Î”tÜø¬=çÑ_ŒþFU E%ÙHª_Õ<¼"³·”YŠØ,ÇŸ¦W'nüJsY»lʯj%Uåô4¿ŸôPë¯sZŠÁyböý2¤<®PaDb¬Š¬ãÑ£,*7-ÒJrþ2˜ª<>*}©ÆÜ7Y’Mé*5H#«•¢xš¸ ¶ÎÔÜIÆ­¶¨îNNN↻ü kÜîW}¢ôf½ú|Mº•šãÿáÓ-e¹K±Ñã åf šÊ–†§.»_eµ©‰©ƒ´”*ô®¯Ü´DŠ­ BÒK5›ÕêŽÙPóuªM|—ô jÅ”³:‰íÝxŠÐ‰ªGƒ’ {ºP•S/}6í¯™4zª*Zi¦Û¤£­†¢ï*«zŒFÌgcÒSâ¬(3¤£Z5A¢k"¢U=ªvpë‘«òIS–v9"Ï—šŽ¨ª‹9†7&:#2”S™¾S©¡Û [Ïf1›ö"L§¾lZD¿ªÅEÌfÙµ¨Y§Ô ]}%]ÖѤuvI ‹D;‰ð¹„&¢Kí!ÕA¹¤µ´Ü)ý­®É(Þ—aAbHEu Ä ¦Kí!j«V•^G帥gÕPZCûm<í›ÖvT}(³K‰¨Ù—|\æs¿¥˜ôêVµª­;1«ÙËlpÌWL=„ÐÕÊ[kqó©[¶™´3Ï2K'wny‹®l‘¨¶·—¼½/7í.žú/‘˜mûí4ECÇÉce‘Çrñ4$©‘ß² ’•аû,¶,Èh%.Û=¢úAÑTnQdq†Ÿ¢`ÒtIm•‰„¬’ö ¤Á§Ó§1qzµT¦¨DËF-_iyäÓgÐlx¥|YîT{aÄ”EËe³•æ¦ÓâV8nª*Pœiþ4sl‡”AÄd)§dølƒù:U2k-'Â}“ØÝ…,`hâÊgy”R]„ÕYž:zÝé3bYäzÖ†ÓïW4#«-æÝ~iÊü%ZBQ‰SäB¦,›G»YñH÷(e¤ÑvI’f0®¿køÁ¦ÃÔ˜½Ó]$#]Æ]ÒƒÄÑ`ñj×Ò B/[ÍfW Ÿjs1íº’I‰–«VŽúèœ]Ÿg8¥¯l5fÑhkl< Ù%DðVœ!#–Sß‚IoãÕ!JsvI2~oÑò–bü†¦SnEèX)sûΫ¦Bèjå­µH » +Áv‰2(§¶å™åd)]y2ËL*7óv ÍYa•^Iµ­F~Ëíf¥ú–ü˜U¹äV²ÄH}­§*àòÀžÞ}ͧRÇÊIæ IŽ]Z‰FÕRžÒ¼TÇʃ5×£qÖµUÇ!ST’eöc†iJ&[ÃÊÓ7õŽ¡½0¢ue.åSiï<éÕ:=¿¢|N­/·®†ÒDÉCŽ*»j\¤ívë™Úí¦Š‘ÑA&§g‘8=ux¿ã¥Å]U*§§Õz´u*R¦¬¥©›‡&×OU?rÄbػЧÏ`uÀÔChƒõƒ~NW÷×þ`g•/ð02J[§­£Ù£d*X}˜+¬–ƒŸ!Udv=ƒÎ…Š¸Î´¬å2'¢‘ß*”(’UeUÇÊEJob°õTñedñÌ£^z`ã”&¿¬Ž¹³e͵ÃhœumÕqÈ•ŒÉœÉ­T}aÉgÛ #Z³Ò$OzµÎêü6òKÊ©³Š3Mt‘,1T픋”Øn=S»ÝTŽáæS;1D™²ïÇÌž$õ",gmRµí1ÑŽ¦¬˜zÛ€g¹úaÔ½óï"ÄÔØT0õÚ`½÷ ÏìÌ×øÊZ{U#cŒ´Ã÷^˲J_­ët.uº†ÌŒÁ&HZ*Š”öŠTµ!\$KŒtÑ×z&ã§#m˜Æó€iœû/>Y¶ey²æÚa4κ¶ê8dŠJÆdNåGù\¶aS¶F»ƒ¥<˜Õ:«óÛÈ/¹õj‘,1äN©ïi¢‹”Øn=S»]p ²c?_ñ¸¨×¤ ÆqªIÕVG{AaêÀJ€©· ø1=L=ÀÔCh³õÑ_õÍwÿÅ*[{ÞZ‹ª'¢}ûõO<š~Ñò‡ïÎ=Âò³<:5f‡ïœƒÎEÔ™~3—UmkÐî± ’–Š&2ÏÅrg•!M¬Ú:‘.úZÏ´Ÿ|s™†7 £SNÑ_¥yÖ\;ŒÆY×6fú¢’¾Ì ¸ôììi*UJj®/†ö˜´Ò$OzµN³jKù%÷=+¢é+­øN½l@ÜJÙ…v뙜¹Ú®¤ô¨GÇ㫵\Äa븺'Uóž¥/"L=X l÷ˆI?C ëÅHSogöKʶa_"¦BÛ U¶ö¼µ¥¥"ÙiÊN$?wëßCPž¾Ïâõ9P©ªfYU®³ô>Ú饣dÙÉJ¹HÕ˜ð©¬GU['ÒEu`K…9uøú³:Hc¶¤Ä£Ù¯”ž¦åâesN¯B#H—*‡´TTRÍìà³S*’öÑ  ó‘ áŽYi’'½:¿>•Õ£È1¸ïÙYû•¢œ©8•ånºÀF´¥œ¹ªg!º6r`SÙ©TáÆf¤IÕ¶v>aêÀJ¦gm0vëDã7Uœ§ý½{°Ö`ê!´=ZMkÏ[kQÚ:’m‚ôTfÇH‡¯?ë´ÛDÉÏ= eHÓ}*5íU‰òù8eKí5­l™íb»A”žˆó—†£åÞe†×Ù.dfg8½ô&l÷ˆêÀVåxô·¬Í©ž 9Oé¶8½: ]ªÒRQI5³—AvJIã C3 räÂpbp¥Iär#†lÇzP†4Ýê›ýjw$Û^Ù–UÙM§ëo–^U_פl«î—áIÑSµRÍ Mª66M\P˜zpõìîîú­P\»v‡õ6˜øœµö÷÷ô2žÑÃÑØl0õÚ6­šµçݾ(mò”´ /÷áá&¤•ÄC|ú«ªtJòÞ^)™u¢ÄYS÷}çÜñIU«œ©¹Ù\áÑÛ/(Š8€Òkˆü{ÏÝpëÊéoëð”’‘\[ä”tàÄÒ­ˆQÊ¥ð:«ÈU¥œ.RvD}ô©Ì Ese„Aˆ³àîL©hºŒMmyÓSIE)R c6\|caÄTê¯êq¶¾•æÖ]a$Æü¦‰–Zq~eа¨få‰îô;uzÚºRæFüj"M—•ÎféUõeŽYNg!X÷Ku¬”¾Iw"ÒTã«uNÕé¥x!ÂÔ€+æZ ž×Û`ö÷÷¯_¿®YžýÛ÷xêwwwùÔ-Àƃ©‡ÐvjE¬=o¶v×™"Ý™÷fߎïDŒJÂ×ʧw_‹M~ ”ì!8+ F¨*åÌ6üªÐÎ…Q{@‘˜QC³Ð±Í—£™إκ“5¤z”YR6ÉÇi׬¬ïaHé@/#½Ï%ÉÔ÷°˜ÔçYis"k®oÒ ÕAôNƒ“æOçºTVI&§ Õ©Ìé°§3•ÅŸµ8ra(±ËqŽRÊ•8Ât~û¦) Âë›}KS¦Drn· ©o)êoÚ® z «Ræ´ûîN¨K-\WÅŸžŠ$s'S¹¿Ê“¥g¬6ëšÎ6º6I˜zp5œœœtéÍÀËØ0õÚf]¹µçgšåÌ'wn•‰e%¥¢”ýŸÜ{î†þ–gS¥9«î•upûiåI/å×K‰¡2ÿÙ½7"à¾R À¥>Ó!«$z§ƒìTi«‘Yé}£7¦¹r²RQù˜Á •MWåÌYÍJâTd³0ÒlÑLvÐôWõhZ=¿–Fµ’jsδÚ,æj‹JwÁ¾£¥+gœ*•e®ª¬!]äÊͤÌÊ6Æ€¬6B²Ú]/L=X*˜z¡Uþ „6Laêeéh„©KS!daí!´aêm°0õ`©`ê!„Raí!t©ÂÔÛ`aêÀRÁÔC•ÂÚCè’äßpÐß,m€0õ`©`ê!„ú„µ‡ÐêìÁ]ÕñEýè*ZaêÀRÁÔCµ…µ‡ÐEé’~t­ˆ0õ`©`ê!„Æk!„ÚÂÔ€¥²²¦ÞÑw?ýη?µ¸Þý“ù³ßÌ*·~òã¯g™Zµz.JŒO[ŒO¦oý7¾øúcÿ·—ÿ·~ßøo~ÿ±¿ÿßÈ"A¡í¦,•Õ4õî}ðŠ£ºýà‡ŸËê·Ž¾ûé,g[«VÏE‰ñi‹ñië¾½›E‚BÛ)L=ØLŽŽŽöfìïïwIp9h„=Ôó.  ÉÊ>©÷Þñg³G„æÓw¾÷Lãɦ£ÑÏ®Z=%Ƨ-Æ'Ó×ÿ‡ÿËÞ«ÿ¹ß4ž~åc·ÿûÇûâA¡m¦À~S°¿¿||܆8;;ÛÝݽvíÚC=¤¿bgg§;×Ã|ÓqrrfV ªNOO»=¨æ.wÂjÎþÁÁAßÞžŽ»Ô°‡Úc®ñØrVÖÔC­”î}ðÊ—¿õ«~»øÌ­ŸçÛŸúÉ¿žåA¡m¦Àòð¦WàݬšŽnb®]ë’.Òo÷^þ½<99érÃt<›ɽ½½¶µ¤³1.ÇF/«Où^¿~=ò¿:î³RäœÕÜ•¡ÎÂüǘ•Þå(Ðx¦¥–óF·Ìë.L=„P[Øy!4F˜zËC{NoŒ1õV M‡çå²M>¿éèèhggÇ1–ÇÜhHc„‡ñðð02ïîª‚z9›Šû”VœÕ¬Å§MS?K\¿~Ýé)á¦Íé ÝÜ•!…ɨž¦ñ;±JºÎc‘_jÎQ©¹. ÖL=„PŸ°óBh¼0õ`,Úyjï$º×0Øð÷ £Gøìì¬{½ª\jœ—Zy5çy¹lSÀžˆZQ‹]RBØ(Õ³0†ÃAkìààÀ9§#«jßéUcKUù2/M½¨°ú,^T» ¦žbp0Y¨º*ãM¬Ú‹ jüàóâ,íú½ZÔM±úÿ:ŒS!T ;!„¦ SÆâ½Üfïš.mtMuc.ƒ2tI+É¥Æy%ƒ é¸?+3º¤K m‰xÊL[÷. ¦>¦×%õprrâœâðð°K-pžlUD}Ï Ù¼ËL=µx¿±flö|/uŽ¡=Œ oÖAŽJD<“xI,çú½ZÖå_‡I`ê!„Raç¡ËÐÎ]{äakï¹ÙY„6C˜z0–Æ6.íÖÖbÛv©q®Ë ÌA|t±Ñ5So>Â6|:,>ìÜÎyóæMåIçKSã‚wBûw™© »|‚/püW¾òÝk¡ƒ.)!uëú7CÄ‚¯Ö“ˆõsåËãÁÔCYØyèRµÿâ“Ý¿¡˜zhC…©£³•…cú¬—çº Â„ÒèÚÙÙŽÞÜÄâi2ôèèÈÙD|#^šŽô¹ZÍ ¶ß U*{<-bÓA—T#kîJˆ…Ú·#CÛ±jwư‘oŒ˜z!ì<´]{äáûÿ†bê¡ ¦Œ"žÝÀÔ»$´“cú\9—çº Â|D×ú>~ #Ü6Fã»í”¿KMU*Û÷ñÛ*aÊÌÑè2ó1áxαÝ͘l0Ȧ¾1bê!´ÍÂÎC˦Úlm©wpp  ‰îS´Ýºy󦬨ßß×Ë |!ËíÏÓ³®¼;1Û :Å8Qõw¹gùã~Ý¿†éœ¢zŸåzY>x¢~u œ‡;^F$Š¾Ý‚?¸ª ¢*Ú«~åï;G)ü¾‡STJ#Üe¡üíÏ|ODWæ¥DU­^¥Ï’eP…݉éYÕƒìôƕҩn|g{`g²U¤OUóda÷Q®%¡âJLkg—õœòŠS¶ê ÎQùÜË#HÍ5t' ²‹Å(E >íe”9º¦È»Ô)ÌÝ_w³+sŽR®ärÈX|MêFµ‡Wœ³O͵ˊIŸ*ÿoñ»r4³R£Ô%hÙ æš…ê¶Í:7ã¯ß‘oq}4Òh8Eè옥[¾™èe_Fõ0 gNÿj‚©‡Ðv ;-_˜zh³µE¦^ÜëžX{H݈ §½T¶³ÙWn+uàâ· >+TCwb†Šë;+®ýL¤˜¨V;´6Ǧ§§h+¢tÕSöE)]¦s¼…ðYáý•kÈȺ#²ÈK¢/ €ëQýŽV”!ehìR ÕE"æ2Î@CêRú«T*ê1nëää¤1›Àît1*žîÒ]<ºDµÕ)0é‚écÖûn#mT›ê쪘á¥Ûž¡—}niJ¹–t!EFÆé̾Lœ_5èX­¤Å5zÎi&Unæ[Õ 6C“å¹ÓY¯¨´-¡—]Ö&ÊÖ˜E8fjRæëïj^Á|ª¢Ž¸ *ì’j„÷'²^Œ$íTv 6Ðvef¦ï+EÌccuÉ8hw$ÆJÝï’.”1ׯð¢ÒÙö[\ƒjCñΡ1t©’(’“®ùl<çxc\#0õÚ6aç¡«¦Úlm‹©§;rßëovÓ7åéñàÆ&Jé KJÐN/Ϊ9Uâ-k_µŽMhçã͆r*56áteËú{ƒò.?šp)Õ §ŽÕ¨+4ÚEtef(ƒˆ¹xF—µí¢Ý´Âë’Î ¡¬$NeÛfuÍéem"vÎêQ—4Cõ;‘¶ÏòQªRAj¾§2{Ÿéiµ1"A‹S/E£ÚœØŠjEß&9òè Kjù³ Õ¨£.Œ3f\dÓÍ)ƒ¤KR¹‰z&->ÒåÝ%%8$JQªº6ªDï„*Ì‚o0_Wùr;‰QJívI5bLÄøñOI--¡^¤+¹AôW(ÈêŽG5Lbdsƒk@hÍ8H×O‰Úu¶;ÛFóèVÔ\—”Ã>ø7H4¤"ªMÅU¹T•¼Ï ½ve¢EýÍÆ-‚Ô©´ìÔ7ÆõS¡ívºl½ýÂÞs7¬ƒÛOŸÜ¹•žÍL½Èœeˤ³ª*êÌÎJÇG/I:»ÿâ“N9½ûšŽûò‡”-jV~×jdnW‹¶VÛbêisèâr·éé®#6~ºÃî’$6Õý€î³}VÅEÚ¨7„Yµq¿®‘Þ£ûT›îé¹ìK<„’Õo”gµ…èRÏqCB]RBÚ£.i4}{*ãvU÷zÆáá¡‹”qŠèHV¡ÆÍ§ô·ÜfGi[1˜Õ^‹–ê¦4–ZiÍn.«Vyœ?ë¯i·%R[°:˜Â=R¶1;½¨°Ú}_å©Á8cµ´§/³Í`åb¾åÑ VÙ.éœxÐÀvI žåF¨j(Â3zkŒs#/‡ ŸÄh½/xÙDá$bôŒ¢¹b^–oã#‰!ÉÔÃ׋haÔ6²õùˆx4&]Ò9ó½Åõ‘6¤¿å€Å¤Tû£QýüuÜ¥T½ìåŒä’ÁÔCh„‡.[‡¯?{ý^{äáÝKöïîÿ‹™<—¦ÞéÝ×vžxÌŒŠD¶Ðþ‹OºNý•œS/U<òœÝ{#ªR¥¨þh](1ͺùÔŽ²I:ð±ó;QêËìæt¬.§yÚ S/¶åå¿Ñ]²HwM‚Q~g¨î¢¸(·¬:+º3â~]Íeÿï=‰2‡A[”¾À|V”ŽIœªÆ=ªÖ¬gÛDï²^w°{qN©>ï;êlóéU›@ ÍæùO¤F¯«c""åì’¢¸(\ýÊâ)¨E»-yª“p†ê”Ä´öu¿ì‚ŒSE”GT§¯]¼}ÖDžIË£AŒC¹¼cŠûâQÙ1þi Ì±{”Rí‹™¯¿+~9\ø$oÒ R—:ý³—³ÑËê°d„s(àªËÓFmMb¤=óÒƸ^„jîRkDmíl Ò¸~ãT_w²eÙ&íxõ¸1zƒ÷!š gåd-g$— ¦B›-ì<´Ü~Zÿ8^{äáxÀíìÞzyÿ_ÌÂÔ³å§te>zû…pëªõ鬪rŠ2G ‘Ír%ú«S;O<¦œª\Ç÷ë­åWëÎ)p™Ùõ¤éÑߪ]ˆ¶V[aêźÏ)ilŒn¬¡ºUHoýÇlâ~}p¾œÑÙ2ClA«Ï†´»<8 ¢wUs¡$ö6}mí÷|•{tpäöU´çQ´·RQ|ä°D„Ï.)¡Ý–iï µØ|êtÜçÓi­†TeLœ b W‹V>÷òhÐXÞ1Å}+d>4ÑS£¦«]ÞÈËá2&qäLE61~ÍWÑU¦÷´g£ÖßóÕýx£F¾=^61ÅaŒëETWBµ]jï×ozjÁéimÕ÷ØÆ"Œ¡h܇ÄZ*óDñö€¯˜zm°~ðÃÏùÇÎC—*ÛaÙ‡Rýt[iêéoúáÖ£·_˜ýÓšמ²I™kOÉ¥‰’M:‘Yr6ûÊüJQz|\×RÀeæðïÒDÉ5” Úfm…©7Êã7·M‚io ‹gŒ¿_ÌÙ,Æ¡º·iÇ<µG)aâmíý¦öØŠj0óE8ØV{À‹g´§ ÝV•”ëYëôAk8%jÓAÕí-gíA¬|pÌçX "a? µ8þ=d ðSÎÝ|ý]ñËá2&1l²vëÑ´P+]êØÚëjœ¡˜Ç—ecaG窗ޚ‚©‡ÐëGÿö…—¿ñIìØ+.pMêÿ–ïÀ}è‰à…"ìN\IcåÄõ"ªoeÁÈIYÁëwê[\ƒ õ]#G,Š—õÇHÎöÊ‚©‡BhÙöZÜÔk×p<ûEÚê'd¥I¦ÞéÝ×IöñÛò›òÂæSb)ŸJ@´åÂÔ«3÷½»,ž1þ~]:çø¾í²í˜§ö¨ÊQ훤.ê˃Û¡íyí`‹g´§`Žeº¢.>·O¡F£Z£ ‰óððPÓí:õW¥vwwU$Ö€Rº¬ ƒ•l}c–·?e™ Ñxãfø5X‘^óõW™]ªÑ£’(UÑf°xp“u¶[¹ØzaLy­®XZƒ£gÔ‘IŒü9—ÆÃbAßÿ+”Œœ”QïÜJ;Mw ²QT*ÛÁ`C}—@£xYŒäe,Ú«S!„Ð"²½u¦ÞéÝ×n>µ£t›h>PNýÍrN2õ$7_–߉éƒaêÜ~Ú®b©ÈŒ¦^¹ïÝÍ`ñŒñ÷ë±'IÝœ‘DÙê8´cžÚ£'''™9¢—ݹ1¥ß× ±jОGÑžšÁâí)¿ 42ÎCçmöâ³sðà8¨Âò9©1q†5°S<Ù´ÁÊ#äåÑfüò>ýhlÌ£¨öb>¢Ú´Îùúƒ¶Á†ú.tU4¦n\1’#çq-ÀÔC!´ˆìŽ]¬©çŸÄUþÌM»(SOÚ½ñ¸ò‡vžx,ûõ^)>¨[ÆŒP©Í7õDl~Æ?2xïÞÞ@NÝcŒ¿_œsì‘bª[µvÌS{4†³³³)µEb_4©­ˆPŒwoûö`A{j‹g´§`ü2‘Y[DvoÒp Ò˜…Á8U¤Zд¯ÁÊÍÍ|Ë;vàc.F»ØU—3¨ŽÌ|ý]ñËá2&qŽÖE{ptq)´³šAÕŸþ'D‰Š¸òô2×"i¯“pÓFމ*ŸÄÈߊˆ¿Ï­ŽeÐð§L{Á\ê[™´œæX„ƒ 5aŒjã>$†«Ì³œ‘\2˜z!„‘?µZ5Î2õd× S¯Ï¤»ïÔ“vo<>&`É1§ŸÉE¨O[aêi+¥Kâþu5ýÞ]T÷oqƒ^Þ»‹©{Œñ÷ëéÓMÚií‡#f…×%%´cžÚ£@AªS‡‡‡Ýë©v<}¨¡¯ (ûl[')±«ö+ý¢«êÔDñê2(‰ÚªS£ÑØõ±´¼mïu JªýoÇ9¸Tbªƒ68s/˜5>}ÖÆ¤Ùw}cb¢ïé¤läåp“8¾õ´#íÁñŒ¤uJã í[Kn±á!Žÿ²‰1«.dŒ^ÖÁ*.Q]0}h M÷zåt+eHó½Åõ1X¤1‰ƒ÷!é²,ï:b$Çüë°.`ê!„ZD~ªîþ?ŽOíd§vo<~rçV¼œjêe¾ÛñÑK®¡ôãlö4õR5sU®Y¾þlyJÌÑ6k+L½ƒäKŽªûs?Ž‘ÝFÇíu¹%Ð>0ÎV7`Sw ãw>c¶£¶{Ê­r¬n–Ú1§í>‘âjûÆ!:ž…éÕáÚ«Îl{£q)ªöQù³ ãéQî·# QšÆ®JŒa5¼4þ.©IÔ¦¡9êNŒÆ¬Nh¬‡²kí8£`õ¬§©Ú˜AˆyéöêòhЈY)¢:¶1ûƒ—­ˆ&ú2ǃ«esóõwÅ/‡ù:Õ ZW©.©ŸÈ,Êžš´³[MôýŸŠv)—4CE”XµÉL Ȥ7ØË :®˜Ë•C—KîõÈÌ&½G¾§5®_êÔ·¸> ™œ²ÎUQ]rQ¶ºH¦þë°`ê!„ZP~XOìÞxüxöóû/>y}ö»aêÙJ¥÷g«.uÙüC´"*ôWìÙbÓA|Ëž¥²N?»÷Fš–\ê-ª6'*ì½çndJsJªÐá¹õFe•R~bm³¶ÂÔñŸäB·Î±U8™ýhƒu£œ™z±ÅÒ©Ø(ªÒ©Ã󟪬î”ßgEù_î%j™[¾ ný…ò§Û»§eTêr´RÝá´7r"Šë ÝßßïËobTnê"¤öþGgÓ€Ó)Så]ꌰE|6-Õ™(¢SÑ/ͯ^ª¡Ø¢WÍ…I­Á)H—jv¢J)òjëî‘Ñq—:õQeUéPD×ÊPãŒnÆY£³:CZÎ…3ó-ѨJ©­.u†ûRÞ½¬H•¸D9¤"¼œë¼.u»¤&j4òGOµC‘¾wE)”Wêq)ý­.$¡®uI av«Ú.éJ‰©Ìâ‰agôººæ«¤WÊÈÙO§>vÏ—Ò'½ÅõÑhÈÄ¢ ]RBߨŠؾš£iKH9Ó7ƵS!„ÐâÚýÐDp푇wžx,,¶£·_°ïfâ7eCP¤E² UüäέðãôrÿÅ']CšSéjË5„£'"¿•SáY§w_Kƒ4JÉì?„¶ÅÔ¾¹7ºo6~©S¥õ¶‰ü¾Oï°³§ÿtŸ¶¥{îê=z>»¤&Æl0bo`›ð˪‘)û›Å¬ÌeÌiœ"ZŒ F•t‡¦œÚô*EØ T¢þêe—;Aãà æ~c3üRÑVK)1ò~Y 5¶a&ò;³þFzöðclàÍàÎ*ªå˜tftT;›Ú"¥+1†hNMhFÔŠPUjuÄD;ÎÔwV¢2‹È ºs=Oζ+7ó-*íÅŸÖ©Fgáë ŠŒ¹`…J9¿ÑEªQrUZ9ÑJ߀Ï×_%Fá"Â/«m-íróuªaÕÐ% Ýš_ú«ôCTM=¡<ê¦z¡RÊ£"½Œ<­P•(¿FLè êÔA—{H£Š>ºããŒ^—Ò‡rºˆSª}ýÆ)E2é-®¤ÝPµé,§Ë&ˆE£*b`õW/»¬iëÊ4Ь8˜z!„.D'wní¿øäÞs7ô7{’îìÞ~Æ-§úÒ%Uè§çÒôÈžZ¤Xa fé©ççþvo<îú-½ôCy¢|/í]ZB¡-2õDºy6zY½ó6åž32ë Óu{ݽ~¾ÛnÝâw9”ØîÇÏÎ(³Ã:ö>¡Ë‘0«5'Bsì=ŒšË6ö%g³ß u…]±s”Rî‹RNfÏEfõ²1eBf¥tÜ5[if;QDL‡¢ÄgKºÓRŽpÖehˆÊgLçTÝë‰h—«²÷C)YéÕµdãÌ–Jš![o1¤ÁÈA˜oydô-þîôlmxˆºÎQŠZ×6¾Ë7Vm1¦¶Mº‚ ™D£žF=å•Õ‡ºV ”"Ô_­½t^”_)ÕytJ_äºÖÜè œ£Uظܮ Okå ½?5š…(ÕxŸÏ˜Tjðúû-.c°¡ñ—€uH](³`ÄàÀŽ|c\#0õBm•öf_´—=޲¯×w¡†¶ËÔ3º3Ö ºÐA—ÔÄ™E÷z†î¤ËÄ+Áaˆñ»¦qs#G/Åͤâ]™yKgΚÐË2ñ²QÀ¦{Ý6‡z÷_܈M—:Ä`œ>+º×S?Î&.uš¼‚.u^ºZfL »+¶Y—ƒ›‹T~Ç~Ïo›4èš?gÌ(ÍwÕcÐ¥®*íÔ©9:”XóÒ%@ ¹”Þܺ¤‹`îɺ<ºP&þÛé^¯3˜z!„¶J¶íŽ|*0äOæbê¡9´¦Àfà=ó¤ 3À³;ý3•pyÜ<ÿ(÷¤éˆR‡Ia3ÀÔC!´Ucêñ haê¬+;³¯gÿi8€Íæ`âoeÀ¥NŽÿ”úÙù¯»`Ën˜z!„¶JþÕ‹ê³xþmëÉïð"4^˜zk‰ý Ì € ],þ™tX„øìí¤OÑzúpô¶L=„BÛ¦'»öÈÃ’Ò_Én>µ“eFh¤0õÖ€““mw㡼ãÙ·¶k÷‹së]ì7²ÁTü±˜ô)Úô]6L=„B[¨Ó»¯Ü~ÚŽžÅGnÑ‚ÂÔXŽg_mö ‰ñã¤Ú6w§àœøf½ëׯOú ¸(b xæ`ê!„B-.L=€5À¦^ "ô±··gã[wvvôrŽßÃ…Ih„5Îíyž¹ƒ6˜z!„B‹ S` ðçmƒ›7ov' Æéééþþþõë×}ÉðXëec;OhÌ5ò<# ƒ`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ`©`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ`©`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔƒepxx¸—°¿¿ß€åÒ]„çœu'VŒ££#GÈÛÅz¡wrrÒ¥n:ê¬{m´z»Ð¦Bè'?þz–‚Bhª0õ`ìîî^»ví¡s®_¿ÞXa´5=žÈöì`7˜n.dcfVÑÕ×]‡3Ô»îÜDT°30ιQÒuoú+vvvœ>›ŠyHË.i ]Éêc—ú Ýé)¨ªõr‚p茾éÖhxâ¼À´Þºs›‹VitYh|ºÐ¦Bèoêåo|òý»_ÈÒB¦, í«ÃMX Sïðð0ݤa-úµ|füûÌç},mλ銫KÛ“^^#ßÏ£±"º«œ]ÒŒÆuªl—tŽÓ«§w§ƒé;ÛÀ몯Tú `Õõ[>ñÞ[Јv¿ùc&QIßÊÙâ}£±® ÀÔCUM= k¡ù´÷ÜÐÙ½7ÓÑSoëð6lê^ôBˆðT£$vJ“ ˆ ¡a¤øÙŸM5€úˆ ݼl,¹MÓ°c&]S*%úž·J=©©K"‰íó}¼ØÊéh_¡~¤® fdœ³î^¤©§xT¤ñATuÍ+²ðO_7íkGs4u¸ÖŽxߘºþ·L=„PÃÔ³°öVAGo¿úA}R¶¬àŠëìÞÇG/IYúºKsq푇}C’ö®/m€0õ¶‹«Ý\ÅNxê~56º“ ˆ ¡m¤èlã;ã7’ ÞÁFצ®Õuá’®©¨vê’ˆï{æËïåÙöj¯° fdœþ²‚îE‚ƒþFºR /œÖ¾`Òg3Ûï~1à›ý ܘ¾©ë;ÁÔC šzÖ—¿õ«÷>x%+‹–¦³{oÜ|êü‹Gyøú'M>ÑÞs7²‚+.ìÈ7ÏáÚñÉj×úÒѺ So»ˆoˆ¿ð½èb'zéäέ,ÑÚ`SO=ªv­/­»0õE»ÝÇíÇDl,f¿éDQÝpfy„^VwGiC&{2"ËP~Š-»0]¾sªŸzÓÎÜŸ ôrp»~zzº»»Û8G)#?«•¢¶TÖ¥„CMÉA”1+›6¥ÙWqdÐ2¨¢¡vx)ê~wº–¡:éê‹JuÝ8G™•xxxØezm&•¡Ë:Ë\Ý^jˆî·:CÙ"OÖ¢ÎV¿KKƒ©Sݸ̬YMÿˆºÓ¸4ªŒ¿„‚œU|åŒÕ›­½1ËµŠªu×tÐ%M¤\‡e0Õu"ÒU]ÍSKyÑ)[uîŒ2¸ƒãWõ ZE®SMwIãP]PQM½Nç»B£ûó™/ÑSÕÓ%]ZQí|ïW˘QŠÚ]6amT·Äso)cÄDÖº6¬±kL¥nG[îKcSšŽa51ˆʶbê@5”ÆYd¨Ž[œmï`›¨N_T2ǵN«È1Û|¦±rª¤#Ó%cŽk'õ=ûL=W«l™3]ÕÂhT§¦ŽL†jVÓ®Ms¤¾t'¦ó8u´Eã mÝÏ–®â÷Ô·#I^—4/Zš\Ç£Fû@ƒf$#c9°.Ñ1õËÙ1áFUU¹ÞâìkÈCí åUÓîNT®ƒ.)!½³uU0õB šzÖÞr4ÒÔ;¸ý´òXé³{'wnEúîÇËtÕ¿óÄcJ9»÷†2è¥ÕxðôîkiNIõÜ|jǧú~Üê-»TT˜Êq×PFUúXÝQÍQdÒ/7º“æQŠ[´Ô\ù¥˜zÛ&L½ #îæËÍ€¶mé¦ÈO‚ˆ¾]GìÄÔÝxìĪ•·ÏšØ™ô割gb;TÚ&vDÕýRƒh±oo™Æ\nóLT2i»#&TCJ—Ú¬0Ýæ¥Ãå5P5bû¢zÔbZ›ê™µPº¤±ÞÂЩêØFYQNkÌx{HcÊ&±™öµñ‹ª'M·#,‰®MZ«éÜuIñô];U³@8CÃ( Y £´D#’¾kªjVÓQ‰è‹| 1“FÛ¤Wèø¾Dä:Èpz;’ôÂé’&¢  ^ö½wµÑu¡x&Ñ•l2r`¶ó´‡"j›{ÄR¼üÊËA 6c^b ŽÏ–Åß™EŒÆÈAÞr0õBbêY¯¾õk¼™\ª®ÕL½ýŸTzš"¾þl÷¯áƒß²w|ôRµ’£·_ˆtçÑ}«Y5Ü~:Ío)Q$5§—ªDE”Y)z¹{ãñ¨A]¡eoîôîk:Žü™T\§”Áæ—špfýM³IªMéBuHÊãÌB/ÕPV¤ªvw¤° •®³ L-ê¥ò”Qéì¬}L½m¦Þ…[…ª±’÷ýmpÔVæ‰SÕV{K3fgÖ[õÙ(Q}x*Ì—Fͱ_ªî¦´»,"æFÍö¤ÖcÄ„ ¦DTíý[ÕwMµQüªÁ¸¡c-’9œ©˜ÇI£mÒ+t|_"l¨Ñ ÒuÜe­1¸ðQ *k\•б¶4¯¯„‘«rß%ÕˆÚ”m>ïr<Ò¾x|V”ÿK!Ò8»¤sÆü+£1õ g;Y_Sþêó_yÔÁ_¬>ÿÕ_|ùŸ\ ½õo~ýoj-ôþÝ/¬‹²•¶ ÒeWÁ‚úÚì`í]’ªþ‘m¦4ÅræÌÔ“lT•&”M´p¬œxÜcJÊãü©9‰‘Òלupûé,¿åGü²R§w_s0 5M—"H),k·%Õx51cLž*ƒc1WŸÝ0Ñz£ï%1b"kýììÌõ TîýåY*X5àDô¥ás¥Œ™ÓÀÌ/ˆ1it!âÑA—tNœj@´^N_œšïZˆøËSfd„%F 6×8†¢\ZÕJ/×ö`÷k£1)SQ Z«Q¡¦Ö^ç¤Ñ6ÑG1¾Ýˆ¶œ)ÓŽ$F¾Ø9ÐŒï?øã3ËaiŒØXóí›ošæ#F²ÚPûlÄYÎlô´ñÎyúÞ S¡5Õ3ûKÞEôüWþYå"¬½Ë­+ýµ{e9%Ë)9óxSÏŽ•GÏ ³/M”vf_–Wúkª'm´¯9ËWVy˜wÅã6ût6{ø.Æ!û]×Ó×zª1ÝÑÈè8É­¤½–0õ¶M˜zF{«ÄžA4rz/Ê­ÅÜ{Ñ>k¢~h‹R’fèÊŒÛÚ z}D‹}#[)í“Gôj%1b¢lÝnݘý[ŒCm<Œ3¦/)1ªB­TéNuFÙF[¥5·C훾öØ"~EÒ%=ÈÈK¢`_ÍU¢§:PÁ’4CWæœ0¶JËÀ¥Ê5£ ]¤¯9á "ሤ1ò“P=iï²ïþkqê KÍÈU”¡– ÃÏ?¶#‰…§zº¤…±ÝïjÅ•?¯7r`GÎÝ|Ó4íµÝ>q–3ÛX3AŒÆÔ7œíd}M½ËÓ½^ÉÝZY½û'ÿ2}n•õra$­¬|E  Ñó_y”÷–‹•Í#ýµÓ$…™•唪N“Ôç²)gµªjúÉ[J¥ï–©¯9«jêùã´J,?6ŽXöåzn¥´äÚ­‡Æw§ªêP÷™w}éhÝ…©wa´· AìD#gcÓ8÷žD´Ïš¨_û“6;;ÿøB½ŒR]RAtª‘§J»Ë"24¶RÑwÑWOI»Ôéé©Z³ý>99‰ ÛàéKJºTîÏJ“ì³áQ¶ÑVZ—tŽ*ô©v¨Ñ£lGÎH#€8¥Hº¤aI쫹JôT¥Ú¤×Ž Ó9ë¦?B[æª'ЏÚ™‘Ý7)‹`;Ì´y†Âs)tI£¹Š2¢ûÕ…¡ÄìJÉh¬ÉEˆ‡ÅCq±¤;߃´)óMÓT›¦CˆÐèÅŠjC‘¡z6âT¶.éœ(Øx3‰ÑhäS¡5ÕÏ>|33yçÖWÿàÿì÷ Ôó_yô½ãÏf1£Åeó(³¨.êã·6ïúÒ³&ú>sZª¯9ËWV¹š«vJªöË­Œïl¦ñÝ©ªRŸy×—ŽÖ]˜zF{«ÄžA4r66sïIDû¬Ù‘Œ1[»èT{ûW2Rdhl¥¢ïb|׿+U%ÅR´o•Ó—”¹GUDÙF[‘GuIçŒÜÁöMßȱm§úú>2Â’(8iTûz:’(žÚÄŽ¤jÏÝ;±`¨}Dµåd5˜o´ÍÈU”qÎ1t¢±&$}.uäwÏ©ã“èJ6QëcF)æ®mãªQg#h£^«EG¨¿ C(NaWjŸ8•­K:' ŽF0õBï\èwêaç]ªleUõ‡2¤ªÓ$õù\6ïúÒ³&œ(©¾æ,;\Yå.Rí”ä~eºÈøÎfßëäÎ- ûîì—@Ü„ÈZï3ïúÒѺ SïÂho‚Ø3ˆFNm œ§±µ˜º'í³&êŸôù¯ØÌè K*ˆN5òTiwYD†ÆV*ú..êã·ãñóVcFiL_RæUemEžrÍDwÚ¡öMßȱm§úú>2Â’(ØUMkZsôtÒµ„¡£§øÙ·ÁÞMz,ÎôMÊ‚¤Îu—4‚‘£]eä*ʈîO]¦±&S•sÒ'‘ýFaFv'‚Éø©‰Qj,°ÈÓ~¶q¾iêC5¸]ý-g0Bª6Ô>q*[—tNl¬™XÉ<`ê!„.ÊÔûüW;ï²Uõ³úäÌã}.[}é™Å6ÞëkβÕUî"YbÈýÚyâ±4ÑEÆw6Óøî¤?«R·ŸV‘êP»k"«³/­»0õ.ŒöV!8I~Š´ñ™¦Ø—»Ü¹÷$¢}֌ٺ”Äf¦Qsl>§nÝÛ]‘!Ü’Ø-7",‰}­›ÌßII­™¨¾}rôe¤S3_¿LÌHc®Ãi*g-úÒ^*}Ó·øµ0¸¢FFXûj6êZ:ìÑөͯuºï}ƒÓ™A"ÔöªžJÌH:,ƒh©»Ô…¦Œœ©>Wnd7½Š&ð݉`F2~j¯‚ôi¾öÿ”¤ýÿ*U¢Qý­Q„4ÇÙˆSÙº¤s¢`ã_™±öºƒ©‡ZÜÔûüWñ?ü\V-º Ù<´¨¬ªÓ$õù\6¶úÒ3‹Í‰bЙêkβÕUî"Yb¨Ú/ßÙL#»ãOé*€ì·2ª!õ™w}éhÝ…©wa´· )‘³áÚÄÞ ÌÓn¨ôR;– šÞ©}Wcv¹‘§o‹ØG»Ë"bnÔ<Ÿq#&3ë}fµïqJz©Jtì 'eL_RÒ§î–cFæ[Šqª½ƒþ–§æ `pEŒ°$ öÕ,|­© Ýë¤Ô¤k'%D•7•‰î7òô¡".ÛXÕs>ã¤ç±AºþÇ÷%º?fé–ÕŽù¾â RÞïƒ\ÒÇoE¼göu³ýÏMŠ™sˆªïMÃÃ.ª=mŸmÄ9æ=!òL}ÃÙN0õB‹˜zØyK–Í£A‹Ê²Ÿ•=Ñée%6¶úÒ3‹-œ©Á_–ðçöÅìz²ÊÃb;¹s+M—¢ÝÌVs§2[-ÒûZìŽÇ?ûŽHÇÔÛraê]í­BÊà¾×›yç)mš8Uý¸S8–m8cw'ú,³)ª]V+]ÒƒŒÙ G%Õqë#FL4fÖTGÕ½N#Or„Çô%#ºÖ°ÆªŒ1S¢òrðcBÛíF å.x- ÆNÝcGÁÆÈøZK#ŸïÚI ÃB•»þFägUƒØT›kLJÊ©R¢{]#ÆMÁwI#³ûy…fD÷Ç oYmÜ ½ :OZ|6~×úÞÇD,€9†âÂIX5f/Q1x}Å45Fl$±ÆªÆ°‹êzP³8cjtªzM¥oVƒS!4Ÿ©‡w%šÃÔË2ŸÝ{£¯’I¦žäzJÓPJµ¶¯¸e‡+;¿E[Úg7Ÿº¿m)ksgç6õ¤1ÝqžÌOÔK% L½-¦Þ…ÑÞ*¤hw䜢ºSŠcõyŸØÒ”gµŸ‰0Ê=‰Hw}Ö[š§ognó"ó¢Tu;ªªÚ Æ#"Ou7c®l]Ò8ÒÉj̬'¥ì—7½eHaf•“88þ C ¥ÓçV„ VƒT*R†+­oXb‡\–i»]RèNÛ‚×Bœ­†'”î ÕUÑ öÕ,ܯ4ÃÜ×N5è¯éNô0§FU•”®«]pðý*PNéÌô*SGºÔ ®Ã•ß—è~caxyWCJý.©À×x–ÁíV³‰ÀúÞŸ—L¼SU׳£m Bï$c2·‰5_®jgEu=ÄWÏÆr*ãL-Îêh¨é¨|êÎv‚©‡šjêaç]¡l*•–VU~DN¾þ¬SNîܺ~þÃ¥ÏÕ÷›³}®œý5‘Zo§w_s‘?,ÙF<‚§DŸÍÊ‹`ÎáHö=+7þ±ÄRcºãV4°‘áxö…zNÏL½0û2ó®/­»0õ.†t3¯M{—ÚO¸!åV\› W¥¿Õqì'Eì”Sé*â=¼Né¯Oeø¬3„¢˜õ2š‹=¶Ð¦.u[tìm^yZJg£6í…Ô_ÕŸ>ÇäS#‰á1¼ŠD­„9’V^îÖ”Óg4UI;UÝŠh:‡]í¬‚wQîÓFuVèt ©N©B¥§{þ³³3' (Ow¢¿ˆIJK™XŠ"]AlÔEôB-j…Ä~[/£’ªO“[®¨Ák!Ê*C—ô 1ïå ·‰˜Ë¨L_ØéŽ¿vR"f1vºT0a_wJW_Ê¥¬NJUâ"¢¼Ž´#òr-µ‰…Ô7 âêñæÐ&íH_¨XQ5¤èi_ÀéÛQ—4ÃuŠª!‹Jë¤Kºj´Š"æl©D´c–P\}#6ž´ªìúÒ¼hèbvÒ³fðí(.(e+ßs|ýšôÚtÓ"þu¼rA`ê!„Æ›zØyW«ð¿Déj•:¹sËf“°3¥—·Ÿ“.ý¨©Í)gNÓÏ‚N/S*MèoæÐEÍ‘ÇM¤•§N™åSú{ôö ORæ ßP5§NYtJU<ÒûÁ(¿Ž%DwÂøóYgˆÀô7}D1LÕ,à¾t´îÂÔ»b{#²F±=ÐN@» í3…¶+Þrè¯^vY$Ý–*’žUTå¶$Ý ÔA¶ I{$œMøeßž3£cõQ›C…çSB›Ÿ2¶>Ò¥H«ír̈ •Îj$ïèñ±ÆVÙœ8fó™¢ytCFõ”dº’ÉP(ƒÂèRÏÉf!|Ñý--5á³f–·Ã/«}í±Q£êòlØŽa»¬Q—]VÜoìÕà iG”9 Ê”ù®…lvJC'då?ûiÌ*¨¨2Òvõ²+vNcîDßµDØ*2æQ¿¢r1kê>~©ðÊÑ3)%ª§+3C•x²4ºôÜ¢þj⺣‰šU¼K‡.„è©Ðñ k¯!U—»³"zYÒ®…”]¼]„,¤®ØŒô”V‚ªRß…M®ír¯éÓD+ZÍx\³#/«x«Q7»¤ÈF8ÆÜC#©ƒì j¯ülm(sy¦Ԩѱ›Žn*qüÎÖ‚©‡cê½üObç]­n?F’5Ʋßtmö(™òÛrÚ{îF˜V6×NÎŸà …¯·óÄcizÙ¨jSº›ÐAÕmTýªÇytÙ`åªMé.è²¥7WŽŒëotª¡Áîxô,ì u­¸õ¾® v­¯0õ.ßÖgŒÙÙê¦_;eö6@Œ,«mU¶µÐŽÂßá¥S‘h”âRêWº³ UUÝ +± O)í½JV¹Ž£;©[aœ>ãâBe«£äݦÎvùfèeu{ÖÆ™Dø5Ž!%¶<+¢l áò©®çéû²6¥ëlš_¸H_ß•³©õl®E»¬Ñ®ØÝI‹D„zYR.H1õZ¨ÎN:†#¹¤Ë:šjó]; j$»×Cd³`ô²:zJ/©NJ‰ý»r©¥ ®–>T**‰¨N±h̲*ï2M¡+<£¯Ñ]Éš)MŠP¸ËF/U¹F¸ËºJ” lj´ê² Ž_Õ Ê·ÕÿŠes+ª{ý q¶om” R]Pº›éu­¦è²zét¨‚©‡j›z/ã“ïßýBV!„P&L½•@Û3iK¬Ku¯Ï©&–8›*é^÷ãœb|x]Ã8;ÿ•Æîõtúº\âlbLWyדÑã£$º¤ÂÔ ÷§+6Ã)cˆ »× àzĤkaeé:3×¥ÝçÞ6p[b Ë>]f‹7.Éþ”ß±YkÒK[t©«MëôhÃÔék!ðJÞ+Üt¶òã¢è^CL=„PŸ©‡‡Bã…©°½”¦À•°{þ¹È y’ V ›¶ú»f=\˜z¡ÒÔÃÎC¡©ÂÔØ^0õ`E8¸¸_G…U#&÷úE|¡l ˜z¡ÔÔÃÎC¡ù„©°½`êÁêpŸÐ„U ¾iŽ™…L=„M=ì<„ZD˜zÛKl¶oÞ¼Ù%\<ϵ‘1­PS!ôƒ~;!„¦ÀöÏF±ß†U ¾YO ’/_ÛŽŽŽâÛô–ðã-°^`ê!„B-.L=€-eߊٞ_…Ufoo/l ½de®gggšµ›7oÆÿhqô S!„Bhqaêl#Úf_+Pbwàê8==Ýßß¿~ý:Ër9>>öĉÝÝÝ£££îÀƒ`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ`©`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ`©`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ Åñ''']Öí=Èþþ¾*éNÏ8;;sÍs ²]-ý^ŸqóæÍ.©u­«w:]sugäv¹dÌ,“ƒƒƒn¦÷ötÜ¥ÀÖƒ©‡B!´¸0õ —ÓÓÓëׯ?4ĵk×vvvŽŽŽºbggg»»»ÊæÌÆe^†“µ··×¥NGe]Iƒè‘í’zÓ÷>ŽÏ}½ÃÃ쳃¨]—mP5´¿¿ßå¸j4î¸þúÀÇcæ6L=„B¡Å…©ܼyÓŽŒÐ±ŸûûûaÕ½ìÊ$(§óØÐ9==uúÑÑÑÎÎŽ eszjê)ÃÁÁÁ¬µct©=”&¦• Fj= ¸ýL\êš©k ØÆ€¨*§Fš_)]-3Ò #øÕ1õL:5*µ:éi¸U˜Œ½Ÿê:€­S!„BhqaêÀ'''öbD隥fV™ÁgíuI áþÄÙ0õ2ëGœ.²ª¢’ASÏ.XØgzÙ¨ýÊ‹UO—tNÉ"T NÕqJw`ª¤K¢=5WEŒO6nZ*1òÙ)Ø6¶ÙÔ{ÿB¡ù„©ÄSuŽR³&ó¹ÂÌê{8+ «Ë–ã™>£ ³šî“ùbQÉ ±åla¶í³°#»×ç„iUžŠÇ ³Á§8°ñ¦žpÄ`ß—CÌE98¢1t°Ul§©÷ÞñgŸÿÊ£êõÑw?B!„šC˜z0Ì s”~ô ù=„xr­a9ù£©auÙ÷)­¶/æJÚÆÖÑÑ‘ò¨/ñ€›Ž3ë0ÅÁ—Oóµ)Ua;øÀ­µ©+¡údX~"]'°ml›©vÞý{î¯l÷âÜ2+?žÙöÅüH`ÛØòspÎ5>jS¯üÞ=G(TI—”y”¦|ŠÎ–-63ÂË$âéëfdÐ@uI°}l©—Ùyz™e@!„š[˜z0Ì s”šViž(Ø÷ñÛ’Ìã Ò&ú2¨l÷¢†‚~4oÌ'pONNª µM½jüƒÁÏbpµ«`ê¥@vIñ›!<°ñlƒ©‡‡B¡Ë¦ 3襦UšÇ» ÕÐø ëôÅümwaáù£¸bk©mêUÙS/¾B±12sŒl›mêaç!„Ð’uz÷µ›Oí\ÿÄ£Öþ‹OfÖEÓ´4aêÀ0ƒÎQxdBÇ]jâàˆëׯ·Ÿ¤k³ /f{1ý°mtjê—»]¸©§Sx7œše_¨×™0þÄÅú›°Flª©‡‡º Ü~:\žR{ÏÝ8½ûZVd«¤ñ¹öÈû7×þê&Sc’åY ­oGÎP¥£·_ÈN¡Ë¦ 3è5ÜœxXOèìÜ?°ˆ©çßgéÓ‚ñ9Щ_îvá¦^úeSQ ®vRñÙ`L`då1×:è’ ™GØ6ÏÔÃÎC]ª_Ö·O×yØî‰tó©½t¢Ž³"["ÌÎEЇ(^®‹Öº#ÇG/Ý_kk§®µ0õ`˜kMç(ýIÓò7Oã¬ÙÙÙIŸæÉ"f=Ç̼óYÑ*kêi(<>K6õ\j$˜zp±l’©‡‡ZŽìß]ÿÄ£iâÙ½7”â;«ý”ýŸT ª0K_q¹û·ŸÎÒ×N«ß-¾5†©w…ÂÔ€aÎÑÉÉÉ •svvÅJ™ô3¯‹˜AŽ?{H0õ"'™Œ šz*•Ò¥Nt储aRqežÄÈñ™jê©æ.¶ŒÍ0õ°óBËTÕÔ“Nï¾æSú›š$›JÇG/eé+.÷}íÂ.µúQ„5¦È¥µ3…7@˜z0L8G;;;vyÌõë×ÓS]îÂô1*«JºÓCÌmê;ïOmu¯"žòÊ٥ªuVIƒW£)1€ã‡"eÁ⋺ã`tÐ%`ê€XwS;!´|Ùô)M=É~\Ãp£Õ7•J)Úû÷”ëoê­~Gá‚k ]†0õ`˜pŽ2”.v¦|œöàà «mÐ 4s›zþÆ:ýí^'Œùa‡’M½,ø³³3Èšz“æ6‰õ5õ°óBW¥M½“;·ŽgÏReéÖÁí§gwgi*©ªô¹-·®0"ʼnežx9¨£·_h„í.ÇËÓ»¯5ê÷©¾³!eð˜ªRµ;2Uîiš22ž¢2³¸£±Æ²Ñ.+°ý».Ê.—jÙraêÀ0áݼyó8¡;=ðÅ̘åÔ\—{¢äà»× ~ˆÏŒÿ,ðÅšzÂÞ"¦lëhêaç!„®Vs›z{ÏÝÐ)IÙ|ýªFüà†+I¥³;O<–¾ íÞx<ÒS7Ç?á*©6ÃÚþ‹Oú¥püí<:óÕlªÄwË?4áž:]/Oï¾æ^8s­‰ñQæÌE XÒœ‘¾HGNîÜJCJ‹¸;Vš}QUîf6¹‡¯?›æ½ý‚ëL‡NR ’=ãtËQ¹QŸÍÆÖÒ 8tGÙï䪟R%:«eЫUºZIó£¦ sÎÑÑùD˜AOm>3èààÀEÔVŸã»vá¦Þéé©êÿ´cJta¥L½ÆÈÌ7°a¬—©‡‡Z¥~GªÓóïÔ«þ®í˜0DÎÎX#L"¥ìÍ~HW‰BzrW¢Vü2´ÿâ“.•Y9zéTƒÿUJÄŸåQº[t¢ÈLŸRÊ\†­|6bvCê¯äÌi´ eöKF<)*,V»NÔ_MÄetÄõĸ…"Î,=&Ŧ˜zÖ_æ—fÏiêTŒL:³ªG5xô”ÇáYdšß)!Ç©Hâ GtæpB-eˆÎÚõhè¥óë8Í,L=æ’œ£ÃÃCW+Ö›Ï ²Í¤¿Š¼Ê˜‡Ë2TÊE.ÊÔ[„ù¦F1Lâìì¬+ÙÄŸt‘‰§#Çlëbêaç!„VGáwdéašdé’Ý“ìÔÉ[÷oÅ4›Ž›ßéæz@–Þ(e#FEžS”G/ÃL¬æ‘œMéibŸ¨w>¥Úâ¬êL_Ú¨JC²X_zpÚPµ#7kfk¦FGܨþfé}“"¹]ýM]³ðÝ2+-Lát=HNŒxÍYY~+J…£gi ªµÙ|Tºú›qåe~$aêÀ0—dꉨyÐS;žî‹ÅïÛ6‚ÛßßwÊ©ü]j“ 0õ¢ÔHFV>fdæ=Øex}jàSŠ9³‡B —*ªÍü¯©_HGú*iįD*ÍJ§grbÙ©Læ,דÆ*#‘œ?ë—[™ÔY„©ÃÌ眜\¿~½ú³³}7q¦žÃn ¢w#m¦Ë3õì0ޝV(³«45Ša#?~+"ž>‡Tí ]l«lê}óÿýÏÛH}ç{Ïd5XJÏr¶µmõüèß¾ål‹zÚÚæz¾øzý!µÍSf‚½d»Gé¥$Ùq‘L®*µHÂiTUZ*RjEé*˜¥§êËãtýÍÒK5ð©2æ[éËà!ʬ®©÷¥—ɲ’¾I‘|Y•ÓÓøã‰¹öLI欲QÉCÕ~¹È¤Î"L=fnçèþ›oÓ¢ ‹g°f×ftÜ¥öO šGc¾ .åòL=8«VùMÕY›oj.xô²êÆs‘ã‡6’U6õ¤ÿáú¿þßïãŽPoý›_ÿ÷Á+YÙT:›åïÓ¦ÖóïÿvV6õPO[#ëùÙ‡of§6U6MR¿#¾ ­4A¤ðAtЧÈÜ0•$åtUYz£”-›´‰R}yœ^íT¦F>Õ°ÜJ_†êÀN ¸/½ÔàH–•ôMŠäà˪œžÆí¶gJj4g•ºH–r¿² ]dRg¦ 3Ÿst|îdõ•:;; ‹gðûì¢6¡ã.µŸp—3‡I'Æ<>6‡©7æs©ÂgúÐbÚëê0Î75—Gú;åœÆÐ­H´pU¬¸©gñµz¡•’M“ÌïßDizœ郄¹Sõ_úªj”²eSF•ª/ÓKg§T#Ÿjtß­ôeðhgžp_z©Á‘,+i̯ƒ/«rz´Ûž)©ÑœU6ê"YbÈýÊ*t‘IE˜z0@ê+ ~”5%-X5Ëâ¹ÁŸ¾ñ‹bðËïÒßÕmüJ† §IŒùnØ…âää¤Km’6ÑgêEÇ›zéÙ1c¸bZÓŽEk 2K€-d-L= k!´"²iRúN×ßìËãú~í¡ª0wªþ‹«*-•F)[6m«¨/ÓËž–jàS È¿1RÍ@f±M øB:â8ËJ>—ƒ/«*;u©¿XF"9Ö/·2©³SZœžžúñ±`ÐP RËIììììíí)ñàààæÍ›ñˆÙ£ððð0ò +¥;Wptt”fVüdz̢Oê- U>èë•ñ”dº’MS/›Õ0h_.LšnõBÁ»iï`kY#SÏÂÚC]¹ª&ˆd¿Cd•…Otpûé4½O®¿š9ªÊÜ™¾tIq*½mõåqzÙÓR|ªa5,§£·_¨žšð…t¤ÏÏêK—<•eUNÏâwbß(‡<&ÊÜ÷Ã#e£mǰŒ;UŽX£³Szñ£UUºCìíí]Ÿ9Vâþ;z‚RvvvÆøPÊæ2ªOÕÙ<*É13©fÑ.¨Vnúâi¶žNAÚJßÔ4"Y2îx7Ù3V*<¸ZÖÎÔ³°öBW(› U‡Èæ‘2då5Šì=w#3}œ¹ú+¨a9e–ßîÇ^úG©êæ„úò8½v¦¬ À§6P<ŽWvÙý*˜p_z©FGÂÏÊÜ4W^í ûUVåô,~wV§Ê':Ó鎫?e+UíÕ¬tÉ:åΖùc²t$aêÀ’8Nù©UXw4ÑÌ8”¬©©gaí!„®D6Mª¾†-‘¹!ñ0ÚÎ…e£ƒÝ«žÌ¡ “È®ÍéÝ×ÒGÿ¢u×£³ªÓõ(=«JrzéΤêË‘dé¥Âi*° $Jo+tó©û_ª£†Ò<:v`¥{Õp»#ez©FGâ±A øÙ½7œ¢:#øÌ‹ª2óNrœé´JšÐˆ?ºì&²Ê#›•'üоF_ÖéZŠiº*)3GºÊÒÃÔË:‹$L=X*kmêYX{¡¥étæ¯Ý·Ffì=wÃæN*»!"õï$e¶#t¾LjcYá¿çLa³«§$;2:pbêFeÑFzHñ§yRÇ'ŒHQíiÈÆ“s*ÅŸžr`By«*å0”YUsú«ã¬;iN“##ÒÎö¥—jtÄÒœÆYKyÂGÓÙè ¦¾ZU:àJÏz§—JŒ³>V=™ƒf1òH®§¯Q+*WI™•’®.+zeŽ©W…®ÁééòF¦,• 0õ,¬=„Ðtôö vCB¥KurçVœÍžŠ:½ûš¯âQi÷Æã¥]RµÊàle‡¯?»óÄc:{ó©°{”b;LrÊÙ½7ü2Tseœ§,[†R7³Ì}§²Éä¡óø¨;ÕÌ}šš^U£#!åq„ž­4çľªú<”-’¾a×â)×À`üÊ©<.蘣l¨±ˆ!KÎ" S–ÊÆ˜zÖB!„®D˜z°T6ÌÔ³°öB!´daêÀRÙHSÏÂÚC!„ÐÒ„©KeƒM= k!„BK¦,•7õ,¬=„B]ª0õ`©l‰©gaí!„Bè’„©Ke«L=+µö޾ûéì,B!„ÐÂÔ€¥²…¦žõÞñg_þÆ'ï}ðJ–ŽB!4‡0õ`©l­©‡B!tÂÔ€¥‚©‡B!´¸0õ`©`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ`©`ê!„B-.L=X*˜z!„B‹ S– ¦B!„ÐâÂÔ€¥‚©‡B!´¸0õ`©`ê!´:úÒ7Eãç¿ú‹?øáç²S!„V\˜z°T0õZùb´°öBh½„©KS¡ÕÑ›ïþ _!¬=„ZaêÀRÁÔCh¥tïƒW¾ü­_õUÂÚC¡Õ¦,L=„VPX{!´vÂÔ€¥‚©‡ÐÊ k!„ÖH˜z°T0õZqaí!„ÐZS– ¦Bk!¬=„ZqaêÀRÁÔCh„µ‡B++L=X*˜z­°öBh…©KS¡5ÖÞ¥êôîkÇG/ܹ•¥¯öž»q푇­'ËÎ"„.P˜z°T0õZkU­½½Wÿé{ÇŸÍr¢Iºþ‰Gzè¡k<œ¥¯£Ž^RGÔu*;…&éäÎ-a˜¤ÒîdzxåÕ·~ÍWzk¯O×’Ÿ4ͼ°L'³/Ds†›Oíèox4:{vï €×(1œì”Ž•¢³®MìÍœ—4Øyâ1Ïtøú³nZù%Ç \‰åšX+Ɖ!E¢†ÒSª'êÔAšùàöÓJ‘TDÕ:›Je†NZÃñÌ3rùPò‹·~y푇«pÙ¤8¸ýt¤½¤Ì©'âµ³›< .†ªŠDËmef–]û#‘nQö´—äô4³¤”^šz"눋—&NØ=i_t(ìjÓjZÐrºþ¦&NjöE¢äqSæl|Žfßx(²vÝÁ¾Ž¨ž4qäÜõ)æ(K—âÔÈéë [Š‹ÙR„e÷(KWßõ2Þ˜<:Î2XÕa”¢N çÑrUY‘ȯƒ4}c„©KS¡-Ö^U¶ðÒg‹$+¥ÍöDæ¹”r ¥-¨ôñ.O5½Ïj)5©Z)jΜšF©¯i»Nå)¥(=ÞHW‹ib_`’óg§;’&ŽŸ»ªÜVÙA©/Œ©éRßÛî©M=:|ýÙHÌ4&O_<ƒ¦^æ±Jgz*òë 7I˜z°T0õÚZaíe²’=R×ç­ÄƒTú[:©ªVÙ%)M%»*™ÃéY%ÕĪúrö™5NoÔÜhzö™e‘7®ÒÍqzÖåj¢åvf1Oêàø¹«ÊmeuZ>U†Ý^_ºÔw*|±tñ8±RhLž¾F«Ã(E0å´Ú"éh4òo†0õ`©l’©÷þÝ/ „¦êÿóýç¾ôÍ_öû@è¹/ÿg÷>x%»Ä6^×Î… •-9ÑxI\ÿÄ£}öÐÑù'FS»P •Ö‰dWEíVÓ³"ª¤L¬ªZ\RCJ/ͧ7jn4ÆM6 .Rº9NO»5”ã EÌé's§vpäÜUå¶Ê:%Ÿ*Ãî ¯/]ò°drz9b:)¥Æäé‹§oc¦Êi•jú8j;ÿS–ÊÆ˜z_ú毸#¡ ÑÿãËÿûì*ÛlÙz»6óÚ2Ù†¨~ÛšJùÁ1£ÌÕÏ6Ú݈Ožº­ª‘äæFºB®6K¬ªZ\ê3kœÞ¨¹Ñt7Y/\¤tsœžfî«Árl"­jj¥‘sWÊmUëô©2ì¾ðúÒ%‹ÖŒºYUúÉh½ì )4&O_<}Ãè:…²S’»ÖÖοÂÔ€¥²1¦Þw¾÷ÌËßø$Bh½ôû=û{×üžðÒ¿ú/²«l³e'ûì­e§£á†¨ÔîÇmaˆÒÊ>ë¶újs[#]¡Ò4éSµ¸ÔgÖ8½Qs£é0nŽüp±‹”nŽÓÓ.G å8HÕ˜§v048w¥ÜVµNŸ*Ãî ¯/]*‡¥!X£›Ò˜<}ñô cÌT9­’»^¶ÔοÂÔ€¥²1¦B袤wƒ÷ï~á'?þz–¾Ùº6û`c–hÅ—Äe.U¦ã£—ìb”žHúK¦>î3k쪌t…úš+U-.õ™5NoÔÜh:†+sH]¤tsœžv9†+õƒB¶_³˜«_\(õu0ScîJ)O_>5rúéÒøx$›eínŽÉ3u]§(§UrÒÑhçßaêÀRÁÔC!ûPU I:9ÿÊÿ4ƒ3ÓJjXH¶ovo<îç²³!gé Uí­ªªÅ¥¾€^æÙý©6ÝwJ)J/ݧg]vb5ŸRßÓľŽdÏHZSç.“³šÓ§²¾DzÙF£ã'W²YÖÎ<&Ϥa”&?c.²¡V%J, z3„©KS!„ú¼˜ˆÔÔP‘Òãhx4ö uJÚ­}=ŸåHJ{±ê …oRæW©™R-.µMœ2(š.ÝÕ¦ôr0^>íXÍe–P´›ÕãüYúñùówú‰’ú•¥H}CQʃYÍéS#§OŠFÓý°¢§em·ŸÎËfÇÞs7¬£Ù`DÁR~Ü©êtHg÷ÞH[‘âT–ž9_’BRåŠA˲â}éQm_zŸÔ#ÀÁí§«#PŽ¡Ó]©BU#œÍ¤†œ3æHMè¥+DiêÜ…\U(m(;ÕW¤Ï2ìTé¨xvVR©´þj%cò„t6‹§oõÒÞœOyöÅ™Ê=Òß,}ÝõþÝ/øžjïà—0õàÒùÒá?÷ èw¾÷LvoŠBè凘²D„ÖW©©—ÚN½wüYßS½üæ¦\:_?úM߀¾óíOe÷¦!„.J³oÛ¼G“Ð6 S/Ó»ò/}Oõµw?©—Î;ï½ØÝ€þÁÀw !„/bÑêÔ_ãXš¡u¦^¦7ßý¾§z뻿…©—Î{?úW¾ýÒ7%»7E!4·ìw\ÿÄ£{³ß•Ú_d†ÐÚÉÏŸ Aµ^}ë×|OuôýÛ˜zpé¼ïO}úÌþÇ~öá›Ùí)B¡ù1‰ û‰O„¤ýäGu°×ÿ‹ºÛ£ÏÜúyßSýè/ÿS–Á³_þ'¾åpBèu°¡?ñ‰tÒó£Æ[«øéÛg^ù¹ŸýÃO1õ`|íÝOû6”¯ÕC!„šCñ…z¯þáoèæ S–Áþò|ú™[?ŸÝ¡"„B¡A=ÿ•G}7õÞþ•n®0õ`üì~úÌ+?ç;Ñ÷ï~!»IE!„B ýÅû¿íû(ÝPýä§§›+L=X_þ׿î›Ñ/¾þXvŸŠB!„Òí“ï£tCå;+L=X÷þöÏ}3*ñs!„B#¥§¸‰Ò •ï¬0õ`yÄÃzŸÿê/fw«!„B¨*Ý8ù*Ó˜z°<Ò‡õÞ;þlvÊB!„2é–)nŸâ1=©KåÍ?~Îw¥ÏììÞ¯d·­!„B(ôáxõ3·~Þ÷Nº‰ên§f`êÀRùèï?ƒûüWý诿šÝ¼"„B!é'?þúÞ«ÿÔwMº}ÒMTw;5S–Í>xÇ·§Ò_ìg¾™ÝÂ"„B¡/}óWâ–éÏN¾ÕÝHƒ©WÀ»w~'nR_}ëײ[X„B¡-×›ïþ‹¸Yz뻿ÕÝB%`êÀÕðêþFܪ¾úÖ¯ñ¼B!„¤›¢¯ýÁNÜ&¥¿x›‚©WÃÏþá§_üÆ?‹Ö/¾þ߯‡B¡-×O~üuÝÅ Òçÿ—uËÔÝ<=¦\?ùéß½üæ?þGô³¿ûñ¿xÿ·³[[„B¡-ѽ^yþ+Æ­Ñ¿ñÏt³ä»¦L=¸bÞüãçâæõ™ý½óíOýäÇ_ÏîqB!„6XºùÑ-n„â¦èÕ?ü¾gô ¦\=ßùá«Ï¼òsqûìï~ü軟ÎnvB!„6O?ûðMÝö|æÖÏÇôîßén’úÁÔ€•à/þúøùW!½}þ+~ç{Ï|ø^Íî}B!„6@ýõWu«“~ÞVzöËÿäGùGÝíQL=X~ö?=úþíÏÜþxzk+}þ«¿øÎ·?uïƒW²[a„B¡µÓßüûß;úî§u{“ÝðèèÝ;¿ÓþÈm ¦¬?ùéß½õÝßJ?›JwÀ/ã“_þÖ¯¾óíO!„B­…t÷"•Fž¥ÛÝü4~£ ¦¬"ýýßyïÅÏÿþ/gw½!„B£½ƒ_Ò n{º )`êÀJóáGõ¾ú¥ÃžÝ#„B­©¾øvôýÛºÉénwæSÖ†{ûçïßûÓ|ðÎ;hB!´FÒ Œnct3ÓÝÖ,ÈúOÿ+oº Ð uIEND®B`‚arm-trusted-firmware-1.0-aw-6/docs/diagrams/rt-svc-descs-layout.png000066400000000000000000002301061322600646200252630ustar00rootroot00000000000000‰PNG  IHDR;?¼{eàsRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÿŽIDATx^ìý_ÌÇuß« š8Mà¨-ë71c‰Z í1a³©£ŽêSÇf§_j"uQ!júg·†°lâj4šÂ‚K8¼p`ƒ¾!ìraëÂû†Õ…¡è`àç ]äR¿7õVOŽföÏìîÌîÌîûƒ>Ï~fÏÌž=Ÿ×sfÎ9íå—_¾O/i@¤i@¤š5bÓK¤i@¤i f ÜWóà46i@¤i@¤{+¢Ò‚4 HÒ€4 HÒ@å±U~ƒ4l ”¤i@ØP"¶ •?¿ëy,2¿¿)gÖ3¶gŸ}voybÃé2åê“ÚÆ G¿*÷¾yó&Ž¥]½zr è‹ã÷ÄË´fÁG}Ç;•ïæÙ³gƒã8bÞ>vg è`³1`ä€9óØMš‰zS3i@¤m5 bÛVÿ©½ãë.ü¦†oRÖìè}á _ÿd  PšÃ†èÀ×Å‹S†èO ü=2á+ò‹z¾# $síûFèÁ… Äeš*ŒG:þxߪ¨o!æú Ž{'Y§ò=xqähFiñ ˜Õà¸ùÛp"ç†]‘ˆ-eÒª4 Hmi@ÄÖÆý"gà{‹b‰_Éþ‹[ÚÁ" àûžè×áw?! B†uD.¡ƒÇ¸Š§pœ3à·ˆ¥q½Ï»míÏÆìñÑ·[@l6nö2B娸埒;÷±ùSüüqÜ œŽÕÌ€¢¼ò;ÉŒW›¿:^Ža¹¿ñò‹§éÓ£©¯QJÒ€4 ¼¢[ÁcAúW2¿ãm± _öö}ïjøÊ'£$Gìð»Ý;•PIÂÄ;ϸûŠ4\‘ Ò“šÙ^´¾öéÄæc5lÁ‘ë‰Þ•Õéc#ûü„±ÅÇÍ9 ü>2 6² §gꙣ NLú6¦¾F) HÒ€4 bkhÌûJæ~vúçðï7Ñ{Ô0ä¢ói’Z‚T8ׄό*ȶ¹žž!| xÂ` % é‚aôµO'6¿^‰÷„Ônì#b%Ïò}à3úäìÅKF›åO%6ºô‚ñ{Çõn6Û¤9¬ÆÒ€4 4¡ùØš¸MázÙ¤¯d¸g¸p‰/uïg"qÓ/ƒNÒȱÑc‡1Zÿ2pD’)‡Ž."ÁH:Û¯Clæ† º³pà­Y§ò'¡0ðtz)û²åãN tOÕX¤i B ˆØ*¼)CšçcâpO_ÁþtÐ^ÛÝã@d4ñ›¹è|/|£ ȃ;ÆÀm–-oÐ’§ ‡××~!±Å«¢>BÓûØï#F }Æè …s…w@ùéÄFÔŽ3Œx>±µñ k”Ò€4 ,Ó€ˆm™þÖ:»“ØFÓñs«“5 ð¢¼ÿÆ;oR~1®ór¹s‹½p‹½ÁJÀ§ýy^²ïÈKC3bå@û…ĆÓý%sI7Ž<à ¯m#ã*$~yÑüŸÊO$¶`'œ¿Òà#îr³û8É»ÖV?Ò€4 H‹4 b[¤¾ÕN¾ã¹à˜‚Sä'ÛŸ,®q9Ò_…%Íç‰æ~¾Rë§øÈòPç˜QÌfäOa®–´ï[+Ú¹ ç—ìSŸx °ˆ «=`Wjãé»öDbC3Þeÿ²« Ûî@á!b[íÁTGÒ€4 ¬¦Ûjª^Ô¨"ð¨1e먛D‚¯p€Eœ××Ðôãc„f¼7p <…teŸlß7Œ£ÂYA{Šïq }çÀ|]Ñ@Wø(Hu†‘0œeÎM¹¯ü>b ºc²ßàåï87öaØÁxDl‹6, HÒ@•±Uy[4¨]k Å9ºD"¶%ÚÓ¹Ò€4 Ô©[÷%uTôlu¾F3ß&ö§N_£[Ü»˜ÝŒ{ÿ;_“„³0ïD®rÚ‚ï¶êo‘( HÒ€4 H‡×€ˆíðS@ ¤i@¤ê5 b«þi€Ò€4 HÒ€4px ˆØ?¤i@¤i@¨^"¶êo‘( HÒ€4 H‡×€ˆíðS@ ¤i@¤ê5 b«þi€Ò€4 HÒ€4px ˆØ?¤i@¤i@¨^"¶êo‘( HÒ€4 H‡×€ˆíðS@ ¤i@¤ê5 b«þi€Ò€4 HÒ€4px ˆØ?¤i@¤i@¨^"¶êo‘( HÒ€4 H‡×€ˆíðS@ ¤i@¤ê5 b«þi€Ò€4 HÒ€4px ˆØ?¤i@¤i@¨^"¶êo‘( HÒ€4 H‡×€ˆíðS@ ¤i@¤ê5 b«þi€Ò€4 HÒ€4px ˆØ?¤i@¤i@¨^"¶êoQ™>ÿüóŸÒ«€ Ø2wLR¥i@­ÛAoÿÿûÿžÿ'ï}ÿÅ}B?5•B±Rºli@¤’±•ÔnŲÿåêûÿþÿþR?5•ŠØ*žõš4 H k@ÄÖðÍ[2t[FP3Q"¶%sRçJÒ€4 h@ÄvÐé!b±têë²¥i@hS"¶6ïÛâQ‹ØDl‹'‘HÒ€4 ¬§Ûzº®ª'›ˆ­ª ©ÁHÒ€4 k@ÄvÐ"b±têë²¥i@hS"¶6ïÛâQ‹ØDl‹'‘HÒ€4 ¬§Ûzº®ª'›ˆ­ª ©ÁHÒ€4 hUTs C"6› i@¤†4 [C7+çPEl"¶œóI²¤i@ k@ÄVXÁµŠ±‰Øj›—4 HÒ@‡Dl"6ÛA§¾.[¤65 bkó¾-u‹Äö­;/~ç»ß/AZ¹dªJÕâ‰)Ò€4 Hݱtf´Hlo;ýöò©\tUBŽˆí “.[¤ò±•×q•=´Elð®×î»ï>[•³Iƒ’¤i@(®[q×ÙACÄJ{óƒ½ç}Ào[ÓI£’¤i@(­Û= ß¾};P´yá•—ÿô¥W^<œx÷îÝ«W¯^¾|ùÙgŸõ§@‚Âãþ„¯ q‰Iб=þ‘óW?óY,bŠØJÌÉ”¤i@hB"¶{ÔuòäI·ü‘3gÎàS ˜5áE\ó'^¼xž={–op¢ñÞó{Ù´Ábþô/`_éÙÓ±Ù†3[éY!ùÒ€4 HÕj@Ä–Dlà°abcÒ¼Ëí‰'ž0ž&¶€×™+"6E¬3ÓÔ‹4 HÒ@ ˆØÆ‰>3ó{uúØÐàúõëÁ-±³Dl‰x„䨩f?ÁYò±eyæ%D¤i E ˆØÆ‰ ˆvóæM[‰ k¦ÁÊ)§ÜltÎ[°m…™T§íëßü6bBùƒPÛ 3A]HÒ€4 4¡[±yüЉ-Þ Ç{–`µQb‹÷±±%fRÄ6슓­ÄLLi@¤&4 bK%6Äor•³oU4Æ,8Øàf%6ícK\3±5aS4Hi@¤±½¯i"7GgÐ×Faq¬(àÌ¢Aq:^$<¦ùÀ)D7{ùXQ›ˆ­Ä³-™Ò€4 H{Ò€ˆíÞÝ?QàüŸÁ4F€ÆÄ2Ãâ&£‚€6ÌôÁ¹BÔ³$m ,eƾÕÒ“¬ÅUѯ~íª+ZzbH¾4 HÒ@±Ý»/XÐ]³ï á¹N±•;[®ù)9Ò€4 HDl"6ÛA§¾.[¤65 bkó¾-µˆMĶxI€4 HÒÀz±­§ëªz±‰ØªšŒ4 HÒÀ°Dl!"6ÛA§¾.[¤65 bkó¾-µˆMĶxI€4 HÒÀz± éš…Añ²ðOAÚÿ²LAÈEã¸3‰ø”oëÝmדˆMĶÉÄS§Ò€4 Hó4 bëÕkL!Þ²<(^xsñâÅÎÂíÌ©æ ãt!hÈñB˜w ç%b±Í›9:K¤i` ˆØºÕðZÙg`/æ¼ J ø“™5רŽbóð‡Vù`ý{/b±­?ëÔ£4 HÒÀl ˆØºU>óìeµD‡‰e,knLl&‡½‚زäìqûEl"¶ÓF§HÒ€4 l¥[·æA]žØð'9Œµ§ü>6+HJüby®ÆÄ_ç²é:SAÄ&b[g¦©i@¤,±M&¶`›m\3‡öDl%¨¨f™ªR•Å*Iˆ4 HÒ@¬[÷¬àú¦}fq Ã«¢¶ÄÉf1±æ|¥Q­ŠÖŒ_3Æ&b“‘•¤i@(¤[·bË œB (?Æ{0ÝfAqw;ßã×Fc óÛãØE¡û:*V«¢3€lôÛèÄSi@¤y±õê©×à6ã¶ÃúÛü‹`ðÜi÷Ýw_XÀLlôá¡Í¼Û¶ü¬w¿û×ò'ßðSo|£~2j*…b—ßI¤i@ ˆØ†¦’q€ÏðÛá}€kø“Äfo¬q|¡1@ b™.d«×ã?þ¯Ÿ¼øÅ/E?5•B±[ÝSõ+ HÒ€4°c ˆØv|s‡.M«¢£Kœ3hUô “.[¤ò±•×q•=ˆØfÙè)"¶*'»% HÒÀ4 bÛÃ]œq "¶QüšÑ@Ä6c*êi@¤ ˆØR´´Ã6"¶@6zŠˆm‡Š.I¤:4 b«ã>¬> Û(~Íh b[}"«Ci@Ž¢ÛQîtp"¶@6zŠˆí “.[¤ò±•×q•=ˆØFñkF[•“]ƒ’¤i`±íá.θÛ =EÄ6c*êi@¤ ˆØR´´Ã6"¶QüšÑ@ĶÃGE—$ HÒ@±ÕqV…ˆmž"b[}"«Ci@Ž¢ÛQîtp"¶QüšÑ@ÄvÐÇI—- HÒ@y ˆØÊë¸ÊDl3€lô[•“]ƒ’¤i`±íá.膉ísŸÿª¶bÓ† Dl3¦¢N‘¤i@HÑ€ˆ-EK;lÓ±}õkßxóƒ}ü“Omd£]‹Øvø¨è’¤i@¨C"¶:îÃê£h‹Øà]®Ýwß}"¶ÕgŠ:”¤i@¨B"¶*nÃúƒhˆØÿÈyàÚï}ôIùØÖŸ'êQ¤i  ˆØ^~饗._¾ìï‡?rõ•—ÿôÙW^8Ÿxýúõ³gÏž9sæâÅ‹wïÞµ³ §ÄG($xKÌ•†ˆ ~µoÝy+’"¶3A2¥i@šÐ€ˆíåÛ·oŸšš-[ ÆÊ+SÄVhºJ¬4 HÒ€ˆíÕ9ÀmjLäás§®‚ ºð–ñ¸Ê{Î.ÀP Á{O~ÀA4ÆzéŒÉð†‰ÜüËP¯Ü±åe5J±•›±’, HÒÀÁ5 b+;V¨^0ïDl"¶y3GgIÒ€4 l¢Û&jß¾S›ˆmûY¨HÒ€4 $k@Ä–¬ª}5±‰Øö5£u5Ò€4 ì\"¶ßà¾Ë±‰Ø:õuÙÒ€4 ´©[›÷mñ¨El"¶Å“H¤i@ÖÓ€ˆm=]WÕ“ˆMÄVÕ„Ô`¤i@†5 bëÕ²£1ãòq IÛY†æéà‹ùlÖ8.„ÀX;aÃÙ)b±m8ýÔµ4 HÒÀT ˆØz5V#¨ù²q½);ĆäºHŸkGи“Ø‚TmSïY–ö"6[–‰$!Ò€4 Hëh@ÄÖ­ç xØ‹Ys‡‰Å J—B;‰ ^:4“­0m.St×1[êE¤j@ÄÖ}ÓÁgà-ûÌk˜ØÀy²bC=+|jåä·šsò±•À;ÛVóYýJÒ€4°{ ˆØºo1‹VÙgXÜÖæ_V¨ŠåAY`”k£}«¢"¶´TƒLÛî-¦.P¤­4 b›Ll}$6ˆƒŽk£"¶(jÍ1ˆØ¶2dêW¤Ýk@ÄÖ}‹(jŸÙbèèª(OáÚ¨ˆmMZª¡/Ûî-¦.P¤­4 bëÕ¼ùÌà-Ãû^x £>64ãÚ¨IˆûÐ>¶+ûDl[2õ+ HÒÀî5 bë½Å€* b@i>˜™§Í^„¹€Ï°6Šd}ùØ6'¶w½ë]ž^Ù5ÅîÞjè¥i@Ö×€ˆmHç@1 Œ/¼„/~ÃY®¡1üv–dý»Ž+šÝÁò±m2™Õ©4 HGЀˆíw¹ãEl"¶ƒN}]¶4 Hmj@ÄÖæ}[Vûø'Ÿ´á}ýÐ&b+=o%_¤Ãj@ÄvïÖcAtEÌò¤…¼ó Òs>1y_|VãÜÂ)öÞX`)‰-xùd"…¦fýÄöž÷}¸f>0zÚòºÄ²K±š®+ HÒ€4 b{͈‹̘"¶¡ gK¥”ƒâÒ],?¥~bƒS n6ƒ*xÚp$;cå(b[>3%A¤i S"¶ƒNŒÊ‰í«_ûV™ñÛˆêêg>+b;èdÕeKÒ€4 ¼ü²ˆí ³ ~b øŒ ‡X„¼^±¼Òäc;èã¤Ë–¤i ¼Dlåu\e"¶¼¬Fi ¶|äwª¼á”4 HÒ@Û±µ}ÿf¾~b VE:Z³2ÊüÃÿø'?þã?~åÊ•¿üË¿œ}kt¢4 HÒ€4k@ÄvÐYQ9±!‘øÌïck%òà·~ëñK—.8qâ™gž9èÜÒeKÒ€4 ЀˆmH©, Š—…âÒvø—eâò€@.Ç…ï§b ÜÙ‘•ü^A:ü‰|ýa%DÙ>¶ï}ï{çÏŸ?uêÔ­[·Ö¿¹êQ¤i`±õÞSÖ˜B6$¼eyP¼ðæâÅ‹…Û™SÍ#éBXMIÚ˜¡m«)U?±}îó_ÀÂ(\kð´!\n•‡pk÷ôùçŸôÑGyä¼ÙêF«_i@¤}h@ÄÖ}^§À^ÌyWµó™5רŽbüøü)Y2À͘‹õˆ=ð›ÏÍVÂ=–Efg¬(0ζsçνøâ‹3î”N‘¤i@ [÷4Ÿyö²Z¢ÃÄÆ²–57&6ßë™ÆË¦ëÌË&ˆ- E­)d »Ç7~øá'Ÿ|ò?øÁ:·X½HÒ€4 ìI"¶î» êòĆ?Éa¬=å÷±YAR‡ÃŒëžä°abóÕKןR"¶$7œ ¤O?ý4‚ð[Á¤ëÏyõ( HÒ@Ó±M&¶`›9ÉHl‡¤½b ÖOןC"¶õ‰w>6xÚàoƒ×mýû®¥i@Õ€ˆ­ûÆq}Ó>³8ÐáUQÛ”ÆfÄÂÛֻƋ±mElÔ?ö´agö·a¦5j;4li@¤55 bëÖ67™!P”ã=¿Y‰k£æu³> }ðÁš7Û÷%bÛ–Øx/CŠHRÄ“*˜t«AýJÒ€4ЊDl½wŠ©×à6ã¶c*5nk³Á.à3`’S¡ …fñ¹ëO[ ÄÆûŽœmp¶!²¸­?Ô£4 HÒ@± Ý&$ãŸá·5Âû×ð'‰ÍÞXãøH|º¹ñVž."¶zˆ·5”€z &]ùYPwÒ€4 4¡[·)ÿ Elµî1HQ“TÁ¤ù§»$JÒ€4оDlíßÃYW b«Øx'L:kFë$i@v®ÛÎopß剨ª%6Þ2“ž>}ZÁ¤}DuÙÒ€4 ¼V"¶ƒÎ[åÄÆyùÜsÏ!˜ô±Ç»sçÎAgª.[¤ià ˆØ:DlMgç—¾ô%dܽpá‚‚Iú¸ê²¥i@±vˆØ"6ÎÒk×®!(áSŸú”‚IûØêÂ¥iàÈí w_ÄÖ±a¦"˜Ä*“tâê²¥i@8ªDl½ó"¶‰“k£¨L VK:}uÙÒ€4 O"¶ãÝóW®øÃ>÷¯Ÿ¼øÅ/E?5•B±ëL)“""AÁ¤ëh[½HÒ€4°¹Dl›ß‚mðÎwþÚOþä~êoÔOF @¥PìšwTÁ¤kj[}IÒ€4°¡Dl*Ë®µ*Úîªh¶Mj& HÒÀ ±•Uò Õ æ]@åÄö­;/b1Þ5#ªò)É XÙ¥í†Ø8©L:ïáÒYÒ€4 ”Ѐˆ­„VY9±Õ° ê‰ K¢"¶M&ƒIárS…«Mô¯N¥i@ Dl õ[Àg1Ãe÷-¸3›6°­ ›Û°ÅMÁ¤5ºli@ØZ"¶­ïÀFý·Hl`8¬–.çªrþÓ§ÿó;Þqf¯–¸.„‘‚ÛRº×kÜèqT·Ò€4 Œk@Ä6®£]¶¨ŸØ‚UQ„ŽÖ¿* b{衇xà$6ÛkBZøØpuHÞ†n»|4tQÒ€4 Ô©[÷¥ø¨*'6¸ÁÀg>âFë'6®Š‚i˜Ø 5 öŠ5àQ”IÀþ¶jckŠ?Bê@¤u5 bëÕ7²£1ãòq IÛY†æéà‹ùlÖ8.„À¬ës|¬{ÓïõV?±é<€kÈÊVnA3‹ä`ê¬kàrÃbâ.·í#˜eI¦ªLºþ#¬¥iàh±õÞq@AÍ—%ˆëMÙùà0,ä!}®Aã€Ø˜ž—…Þ‘õ-(„°æä«ŸØ¾þÍoƒÒÀmÈëÜlxÿï~? W•ÒyVÆ}pè ·æ]^§/\”‚I×Qµz‘¤#k@ÄÖ}÷ƒâQ`/fÍ&63 ±q@lÈ—kH·U}*Ž­~bWÚàWc*Ýúq ŽÅ )ÜQØvíÚµýE\*˜ôÈ_$ºvi@XA"¶n%ƒÏÀ[ö À n3«X› ä’+Ä®p;»h‚ØÊ9à INÉîqçÎ .Àå† g;[LôÁ¤[Mlõ+ HÒÀ^5 bë¾³,ZeŸ±¸;‰Íï`cÉ)6cyP¥#­Ø¬ð¨m[z‰ØJ@[ ±ñ^nà”ÂbâéÓ§ñfOÉ2LŠÀ‹/}éKëOlõ( HÒÀ^5 b›Ll¾ê¨?™Ä†#ðÏqmtÀdžf\]¡è»|l%à¬Sf:±ÙMyî¹çàlÛ_B“>öØcàQ“îõËC×% H+k@ÄÖ­p®ZÚg¶}mx›íZãÚhç>6ÛåF'ÜVn6ùØJ`Ü bãÛkBð(‚InX ^Ù´©;i@v¦[ï 5ŸËœa‰ÄƵQ“`}`ãš­¢²|l%Èi+™³‰Ífˆ%ùÔ§>µ›„ XE¼vïíæŠvö5 Ë‘¤&4 bë½MXýQ±@i>˜€ÙÔü‹ÔðÖF‘ì#ÎÇÆLlnbן+ò±• ºåÄÆ™²±í,!"d±¹ ×µ¿8ÙõŸ_õ( HÔ€ˆmè¦Å€VÞ †÷€°àE1œÅGØ;{Às[y×8[ÍÄf“’ A:ûH‚ üm¨ q@k«K–¤i`‰DlK´×ð¹"¶&ˆ3 »ø-!v†5<í^:<ˆ &mý&jüÒ€4°¾Dlë뼊El g ‚ úr A,˜t ZÅ#­AHÒÀÞ5 bÛûî¹>[sÄfwÒ‚ÀñîizãZ &mýBš¾ ¼4 4¡[·)ÿ Elígöïs/?6ºa»[þ)²¢D“âB°Tª`Òµ®®¤i 1 ˆØ»a¹†+bkØl&XBÔ›ošxŽ€ „&ì©D®Vr¤i@±tˆØvClœÁ`µ+W®´žŽCccúdê²¥i@èÑ€ˆí SCĶ3b³yl Aà²j4óè[ôàoSeÒƒš']¶4 ti@ÄvÐy!bÛ+±qBc#?¶…Á冢¥c¢°"PäªÑñԲ貥i ˜DlÅT[·àw¿û׿M'N½å­úɨ¨Š­çÎ[BS§N!3H‹ûÃnZÁ¤õÌ(D6Ô€ˆmCåoÙõ‡>ôáßøà‡ÿàò§õ“QP)»å}íéûù矇³ .7¬6¶X”Ý‚I]ç­pJhHÒ€4МDlÍݲ<Öªè¾WE;g ‚`X£ A°3A °hÑY˜ç¹•i@8°Dl½ù"¶›Íõv‚:‘Ä܆EÞƒ>ººli@8ªDl½ó"¶#'}» A0r,òbsÐó °.»¼^zåU¾ŸÉ=\½zõìÙ³“O›{ /¼pæ•WÜ)Žð#´™+^çMЀˆm‚²öÔTÄ&b³ùl A°àØÐF1lÎÃò.‚IñfOϦ®¥ ANžŠ{¡ÇNÄVϬ±ÿ;±g²“Øìÿ'ÿÀÛÿX£Ä¶þ„±‰Ø&Í:ü·½bØå†½nõï³`ÒÄ%§IªPã]j€î¨©ÄFƒ…*ËŽ$! $Hñ=ÞŒ®´z Çî:/™^1ÿ¿Éç7W{½@’þ8ýj<5"¶z&¼ˆmœØè"¶ÿŠ:‰~²à¾r÷ŠØJàQ…2ÿËÕÿ®çñÎ>&A:4Ð[ý™5C × âILš}&ìOàñMe4Ð(±ñ_.ÿZa~ˆØDl˧‚Àåzî¹ç– ,'q¯'F«`ÒrJnZòüˆÄÆ³ì•ø /™õÛÇ?ù@ 6pÕÕÏ|öÞ&ŒÏ|6;cåxpbã„´„ §OŸ®–аž‹à ìoS0é3¢s [=wYÄöê½`ÊD"—7‧À¦ÛpXàͦ’ÿ òÿ ±|oM—BDl19×®üñÓvþ¶·~{^ÀÊ.MÄæMv¶UžDÁ¤õ|i$Õj€ÄÆÕÒ`\?­¶œWµ*=0ÛlÕ%¸B.ܤqD*÷±}ý›ß† ƒ?t¹eg¬¼Elñl´„ =öX ALŠ•\“Î3&û>‹Ë }¯\×>ÐÅp$i® ÈñšÙ°7ä z¨¡ [ waƒ1TNl`5¸Íˆ GDlL”|]~éK_Bj4lüÇöÿ Ù1Û§>õ)“æ»ç’$ H95 b˩͆dÕOlŸ‘á¼×-¯{,‹4ùØFš‚ €Ć “Ž^ˆHÒ€4°²Dl++¼–îš 6ŸÔ£ ÛþÇ?yã߈ïûj#%+™ABªÜZðÿ!˜þ68+Q—†! HÒ4 b;è4¨ŸØ¢šXýõ_”É#äye,YŽÔ6Ý™xT[Bø±ñá® &­mÎh<ÒÀa5 bºõÈ4ˆ •>¿Þõ lÇ%ÞqÃŦ¶ÝªY9±a|æÓy4+ W òì#XòþûïÇ?²íW^`C#è‚@iŽ$è· •InršÖsS4ià°±õÞzf£fB_C—Itíeù;|²i E›>,c~Ý §]ýÄFDûÎw¿zã’(ÂE³ì6+'¤o¾ø±ÝÜzÃ×?6¹Ã…³áݯ¶k( ŽI¸'¸õ¨Ë£pš*˜´Úi£IÑ€ˆ­÷Fƒ¨È[ÌËÂ#AB]2ãœ}†¶>bcRÛ(9Øjüýž÷}`´ýæ F#àLÂ×?×X?ÅŸª˜<„–±¥õ$Q0éA¾u™Ò@µ±ußš x”Ú0±Ñsf‹¡}ÄÆZo"¶ÀÂÂ(\k_üòWRoÞf”ØülÃBbàr{Ýë^4 ]«µ› ¸VUB &½m¢u* HGÖ€ˆ­ûî•@Y“€>6¬ú­lÆgôɱp…väpUĶ9`eÀ$bó3h‚u@äqµx… 3–me(™„š©a/ n ¼¤p‘*˜t«)¡~¥cj@Ä6™Ø‚}lV<ÔVQ½C.ØÇךñœˆ-;0m.p6±Ù,´x Nñ þùDPö•àâÚ<.RøG—PDóÛKW- M"¶î;ŽõMC+´`‘xºÍ‚Z¢v¾W<á{‹}l8Âêl\uÝ0\´þȃÍñkÆ–›ŸŽX$e¼–M¯`š©*!vÜ Üzâ$Žö¦ë•Ž£[÷½Ž÷±á‰„Ç`Ò€ÉXjA¦È7†÷Ã@ÊMDÛ =%/±ÙÝÇö)‹W`ê2Å+ A¶ÞÀíÀ}A‰Ö²Ë™,I–¤[ï€ þ0|LzK‰õ|“ xÑ´*: @Í5(Dl~ŽÂ—ƒ5AÆ+`INñ L`Ú!ȆðüØ€ &ÝëW¦®KØP"¶åo¸Õ¬è´Ðªè2ë;web³^A9,æže¼B=iÌŠNãX8.H0¼[ñ«‚IW¾éêN8ˆDl¹ÑáeŠØöDlþî2^i̯p̲ô–®Ç­b9LzP۪˖Ši@ÄVLµu ±í•ØlÞ1^eé-^aó¤+?p=n›„Á¤G“®|ëÕ4°? ˆØöwO“®HĶ{bóóÀâX–N¸­B¼à î.À®亦!@0)Q½Aä5u«¾¤k@Ķã›;ti"6[çüÀ‚0Ââ ™}ï¾Âõbuxý„ ˆê," 2ÞÔ é²¥i`ŠDlS´µ£¶"6ÛètF¼ï@3ŒW@nØÇ+ø„ ðUN®è Î6“æÒ§äH;Ö€ˆmÇ7wèÒÞñŽw ˆ–^Ù5ÅîrJÕ@l¯€-ü{MWŸ"ü^ØØ‡k\͹¨`ÒBO ÜdÆ%p üâ/ž*4I+bkèfåª|lò±Í›OŒW@š ,#Z¼Âþ‚-!Ö…×IbÁ¤ØD¸?}ΛlËÏ¿?ö‰»d®¬`âòùк© õ;8sü"¶æf«*U3'ÁâÓâx…mÉ9a]xÍ„ bn"\9bñ\¨T€ˆ­„¡ÛD¦ˆ Ϙˆ­RCSzX"¶FçhÄæg)ã°% Y3ö¯°rB¬8cg”¹æŽºÒ6gù"¶†n™"6Û&6¤ŠNEl%ŒÎ‘‰Í¦5RWX¼ËÒï&^aå„ pXbGâIwæ¹\ÓŠØJºMdŠØDlkšŽºú±•0:"¶`–³,=âX–~7ñ Lo"®„ZôÙF__¸-KwTô*¶.b+aè6‘)b±meF¶ïWÄVÂèˆØúf6ËÒ[¼ÞàÏÖ÷סàA·ÞJçÂ…Û¡ènµðÕíTŽˆØJºMdŠØDl¯š„Û·oÆÁ޼ðÊËúÒ+/ N¼{÷îÕ«W/_¾ì>;…'ú#¼‚Æ9 W(CÄVÂèˆØRæ*âàlƒËõà¦j}ÕQ¸Ò A¸,Ò `Ò”iÆ6"¶†n™"6Û«ÔuòäIoÀOväÌ™3x³2¼ˆkþÄ‹/âϳgÏò N4žÃ{žb/;‚6˜ˆøÓ¿€}é&i^K[ £#b›:áš‚ßÈâàIjwíÏ')Ç  &4ÇDl% Ý&2El"¶Tb‡  ”æ]nO<ñ„Ǿb xq’=šÝXÄVÂèˆØfOHÆ+°@;ã “dB\vïáM¡•_“¢‹Fµ4{žL=QÄVÂÐm"SÄ&bK"6úÌÌïÕécCƒëׯÖÄÎö±‰Ø6yþKt*b›ú…ÚÙžñ “´x…urØf¼ ±„ HzR¨>º€–°¾Ü¢~òj»Ošˆ­„¡ÛD¦ˆMÄ–Dl@´›7oÚÚhLlX3 VNi>àf£sn”Ø‚}l+Ø2ùØJ[Þ©kñ Ø"†ý[-Æ+`ÛÎ0xlt+”1ДÓî‚rÞi㥉ØJºMdŠØDl©Äæñ+&¶`C›_?«[¼-ˆu(aÎDl%ŒŽˆ­Ä\¥L¸©,^«ÍÅ+XB0D ´‚rÀ…®`R[ ã¶¹L›ˆm±!~“«œ}«¢1fÁÁ7Û(±iUts[k"¶rÄæ%c5ñ ÷ß?¶s5¯VTJ—$„Ã߯Þ:7¢þ^äcËeÜ6—#b±Ý38ñš&6óv pmÇŠÎ,¶§ãEÂã¾`œBt³—±õÙ‚¯óÛäüÛN¿¿¿uçÅÍMÆèDl+…³,½Å+`ÇXé¼h¹. Aàƒo,¯W P=@2VKs¶]9"¶Q«ÕJ›ˆíUC~2¢Àù?ƒ-hŒ‰ d†ùÄè„   3}°¢žEu1°”CúVTK›ÈúWE¿øå¯¼ùÁ‡ÀjÿäS€6¼¯ÚDl¥çí€|Ä+À· bš7¼¯?>–z±ÿŒ•XóÖò‚dD$(˜TÄÖ ŽSÄ&b{ÕþcAtEÌò¤…½ó ÒsÖ™ @Æäm|ñ=X}àûo,°”ļ|2‘B_õÛ{Þ÷àš=Æô´>ÕÛ6±š®“Äbqeé-^­¼~¬IãmÌ„  «ì AL*bÛÖ$fì]Ä&b mi\ü`ÔÚÆ lC.HÆ|2ÞÂsR?±Á©7›=ðð´áHÆç¿„([®ù™Kã°× ;ޯו•kœ”c Aàx˘äÈÁ¤"¶†n™"6[^{Û’´Ê‰í«_ûžOü6Ópõ3Ÿ±µ4Ãê+ãÀm¯‘Š2^.Ü üÌ›2átÁJê›QE‰Ø6¡«ŠØDl-Cc¢ê'¶€ÏÈpˆE(a rÉ”­‰ÇÀâ@E€˜jã²'Á…ƒ`îÐÄZ>H[.ã¶¹›ˆm¹AhU‚ˆ­„±5÷< :ñ ø>¨3^!{BĪ+PõÁ¤"¶†n™"6[sß/Ù\?±«¢ ÝÄR¤wúÿù÷ðC?ôCˆUDí ì·ö¼c;ã¡Ö¡²ÍÑÕY¼ƒ7k‹W°„ @Ìå@U“b¢Ö¼±où±¥›¯Ê[ŠØDlË B«*'6$òŸù}l E€Ï@iø~Å·¸õ1…q =*,Koñ ØýVÖ`ï–qs%ÁDÅÆ> [[ú–Ï[å–><›ˆmÄ ‚=­°úøï-ãå¢1²} ßG|îrÃ4UBåĆÇ8Hç?‘ï#ýñÞ¤åÀª¨0nê­¤=X ¦ŒWÙ`X pc APøp¹Ð‰‹åQln–(Ÿµí}±mb Kt*b± “‹/"§ Í º£5Ž0C[L]Ì©æ ãt!8h¯ò®õ]aýÄö¹Ï(\kð´!\n•‡ÀHMÝÇÖ‰q ¸å°*‡/|•ÿlûýwäÞ±‰Û`¯€?¢Òr}"o0K>`` 3c±uÁ¤"¶ð´‰L›ˆ­×`²t•á—U,J øóIl¾U'±¡M )Ùê'6fôÀl>7Û&ö"¥Ó©ÄÖ9ÿ@ 48NðeÃF0U¸åp“QãpwX_aó²ôLÞZ˜dÁ¤"¶ÃÕD›ˆ­×†³€}l•†‰Õ¨¬ÎALlÈ ‹p¼ÁEWŽÏø2*ª bkÂŽøAf!6aÜèì­ªâX–Þâ6\[´„ Òìa0˜WÔJ‘Öù bkΊö XÄ&bë}ÒATžØl¿Z¼*j»Üˆb¬Jç\Ll,?ŠãXr r+ ‰ØJ²rÄ–Žqà¸åð‹ï*|ãÖ³e~å¾~w¯€[ÜÙ0^#ÛÃ@ðÄlêÂz+6#<–(Ýj—’ˆ­„ÑY™Ø:§/¾­1©°F†ï*|ãbË<,0.$Êå0^˦Æ+,O‚¹úùÕo‘¨|ßLÄVÂÐm"SÄ&bëµ8ð>6+„¯Š2΀{à°6Ú¹Íw9 m†mštŠˆ­„ѩ؄q“„Òš`ñ Y€ïsýx…å A@~,±<\i…òEl% Ý&2El"¶^ëÁ gö1ƒF‰ ͸6C}mx´¡Øõ_"¶F§ZbKÇ8PÂðÝŒ¯:øWš^[ÿ±î‘eé¯%¯¯` AÀ^3‚àt[`z`Ø›GȦßY[ C·‰L›ˆmèÁoqq“øÅ¦Ü‚_šñ#îc3‰XÅ ²{04+¡Ì’nzò¶±•0:m[çŒU`~â»_u  ¬ˆa ãò>}%[¼ÖP³¦Ž ®³‚Àdžac>`ÀSûݤ½ˆ­„¡ÛD¦ˆMÄ6dC°¸ ê`á·Åu‚á|B5¾ç§¾þÄéö‘ï†ë­»aš[ £³bÆ­ 5¬9¡¯0;V`ÒÈ-!¸˜t.ÆŒ7L*b+aè6‘)b±M2S»j,b+atöJlé‡7°kgp#-Ì麫G.áb¯€xÆ+ÀÓ¹‚q›àä/â®M /h"˜TÄVÂÐm"SÄ&bK0¢;m"b+atElOìÀ×?Ð ;+Œ›jE¯€Ý„PÅ+ÝõÏ„ èkjB“Âå¶Úªî$eŠØJºMdŠØDl“žý]5±•0:"6a\v3añ ¨{t!¥ã,!:JgDlkíÓÓOÉ®¨N"¶†n™"6Û:F£Æ^Dl%ŒŽˆ-}®wzãà­gß²X„ófÒ"]z×í¶D>dÆ+€ÞŠÆ+@óèˆU“0Ã/H/î]=Á¤"¶†n™"6[»¦{éÈEl%ŒŽˆmá¼ÄÖ(€¾e± tÃ×?Ì´0.Ö*\Y¯ÀLi%â|Bä%Iá0 Œ‹¹S£Μ¾ÓçÛW¿öö¡Oæ·î¼øõo~{Í[ìKÄ&b+d%+b+a³Dl%¦¾0nX«,KÏxü.¯€.û.7üN †€‹.@ öV5]Lc“ˆísŸÿÂÛN¿ýÍ>8Ào¼ÿâ—¿b†â=ïûú4¸ú™ÏZƒàSüùøG΃ÆLÍÇ?ùÏbèÂÚÇÒìH”<ô‚68ø{}28Ž.ðÃֻI®ÈŸKÍÄdÙ9N\¸Ë‘zC×S-°ˆMÄVâû¥ ™"¶©ö"¥½ˆmµÙ߉qØædÁ—4B`…:÷—S|`ð´Y¼4áèʸ±Ì‚@Ï).4Ü#8JqG6ÌÜNl@%2?`5"š1 ‘¨a?h Œ0ø rÙ§ %bJŸÿ ´ÇÓÙ#þ$&N™¨@òw¾û}3GWþøiöâÙŸB „ãå¡Ç!ßw\ÆSÛ<þøãÿúÉ‹xlô“QP)»ÏÓìU ã € ¸ñ p@f é°„ H7º‹n«`Ò©ÄæÝWô-y›y§Œrˆ&}Ćãð5:Ýl² Æ0@lKº"ù^ÈIôÛùµÑQbcweš¼ÁyÈ‹9Ÿû8žNbÃqº0Óÿ%±‰ØšýZ<ðw¿û×ò'ßðSo|£~2j*…bß (®NŒƒ[ðïxàU3®'¿ž´¯$B:,^!%ž`X{+b±­`1*íBÄ–Îaé-El•N÷Ã:Æ1^»Í˜€mI¼BbBàÜ™X¨-L:‰ØìIçöy™íµ¢ç‰ÄàLÀ.ñÆ,.\ŽnØ‚:Ìð{ø:‰®/0Ÿ.ø=pž‡7@¶K!6¿^I×£-ÀŸÞ™Ç%TFð‚Õ>2ãzqz"›ˆm!oüT[:‡¥·±5þX¤?Æ8dÖ€7»Ä€ 4X¾Ú˜:š|í°¦iñ ,K?;^!%!„Ó…™’1dÞU¦[ç2¿ìع*:º£‹N©N.‰2R!Þ-×Ilq¶nÀI¶6šBlAzƒ»ð`lä0¿×­Ø§à¨™±‰Øæ=œ%b53ˆØöðl̺ð( ¬D·DÀpMcËÒ3^P5/^Á' vªË£ØT‡Ýu%²±¤[à:âãï×ç›g>oRè{‹ÃB;{éÜ+†ƒAi‰.º˜“¼w0¾:j&™.4?rJö9Mb¥ØbÉÃ&WÄ&b›e›wq’ˆmž"bÛÅÑí"öq .@•Å+à þœêA„; ë­Xu…ß®3RDˆÍm¬¼éÄF´ò×àñêÛÖi b®"Bõ-‰r™5ðìÇXrg¢ ŒÊN9‰k£Œuè#6  Ä»ÖxÜ·é£I륓ؘʮ3ÂCûØ Ð}ÙŒ“5¥Û(~Íh bkê!Øf°?Ür`x¨ôî®ÙWŽåK \n¬¯0µ,½%Á¹qBh—Ê6Ìapb:±D,æ€P‚[»Lñ±q]ÒÎ7uÎ*vaÞ¯Î%QrX€}}*séur×F=±ñO?f4Ðç dî_òV犭GUŽ$ègÅþEùØF§½ˆmTEûl b›d£§ˆØöù´”¿*8–@iX7a€‡@oø’«ã€\,KÏx >}Yçö%ŒÁ¤“ˆ 80û«U¯9GƒàË!à=§¤®@3€zÄï>ˆ4ó/8b## á7ÛÄ©Ý80s¡cœ^¾q|±ôGö„’Ñ€#ñ?SY]kUT«¢å-q­=4DléÁD£DUºˆ­ÖùÞä¸ZÁ8Æ+pÑ“ñ ‰>B&!ð!L:;ô·|*±•6’?["6[“v<Ë [!¶©9{f›ƒ,'ŠØ²LN Ð@'Æzà–Ã3 ÜW )g‰þ¯ÀÀ Æ+¤Äøâ€õP´÷ûØp!89³‹4ˆØ²X¶„ˆØDlKLSÛç¶Bl°ò±µ=Õ4úò€— n-à« |½m‹qØ”ÆxpB R☄=çAb©´oÕu BÄVleƒˆMÄVÞ”ÖÚCCÄ–åi_Gˆ|lµÎ÷#Ž«Œƒ‡Ìâ@“Ãñ AB£1„#þ@`ŸáOï+Ø b[Çô­Ð‹ˆMÄvD;Îk±•01"¶ã>Q\y'ÆÁƒ…uL8±À7ðÕ-,W5¬ ,t2^eéâ˜c³„ €9ŒGÀì ÞûÞ÷2J£såTÄVÂÐm"SÄ&bkÄʦˆ­„ѱ˜ªY\`€œXà p ߎ¥1Žeé-^¼çûÀ•û„ ,EŠ#\líýÈü†ÊC›ˆ­„¡ÛD¦ˆMÄVÜVÛˆ­„ѱU;á5°©XãàÕ/bãð>ŽWÏá#`UmhðþÁ?0\ã`\€WÄVÂÐm"SÄ&b›jÄöÓ^ÄVÂèˆØöó„èJº4Љqà$xæ°v –‚¯.%8´O»ŒW€¿Í₲ô–+ª¯ýëbßpzh›AlÈIÆ”l}™Æ`:Ò¬³’ÁÀ)A 2·A&’À!+[J"7¤4CK–`÷U˜ ­óÇr³ÅŸBš¥ŽC–µ¾" S©u&{ .ÁX¨´sHÃùí-b±×*‹ØDlÇýºò¬¢Ô€k€6 `‹î®…Çxö¨1^Ág-ùýßÿý×x¾:‹N˜Dl@–+°ý0ŠmË=Å™`; ðôI¾øßûzY~¬ûé‹+`$@LkÃOã º -X…^N_e*öË6qÒ%VÍ J>X¬µ)¨X:l“El"¶¬v«)a"6[SVƒmLy1Žñ ,KÏx…·¼å-}ÄFh£¾&AÍ*`9¦À焃,ßiåž<-õ9¨ˆ¼Eb1õNÅÊQ¾˜p ƒ4OÛ@G}ìÈ ªÖ#¯.èþ0kkRy‡Y °¯ ê$#,b±5f3WÄ6ÉX$6ÖªhÆ)*QûÓ@'ÆaÞ8 ¶¯ÁW7œ,—ñ gÏžÀ5~„˜†IÄF" VñàžWtú¢æùØâ³ ãé,oŠñ˜Ão±q-J£W ó¢ÇÊ€Ø: —`žB[®gYuEsi²19"¶D›ÔLÄÖØc áV „Ô@lؾtCl·£ `ZŽ0_ÉÅ}"å)-ôN!~q0&•yÄÆ®ƒšž}c¦m 4絈­±Ç@íUÃCÜè(´ý¿ówþÑ?úG‰ÄÐIÙVåýO1ˆÌ#6@NäN/V .!¼cc†G®8 ‰wúû¥Û p-Ø xƒ%`OltÎuº­G**R"¤RŽVEµ*Z«¹*?.ÛTKi/b+?sÕÃq5à1ÚF‰ uº~û·;Øüþý¾çÝûÕè‹òû·æûbø§¡[ß~86¶€V¶÷ÛθÁß‚'øÆÃ(ØN÷‹ª640p .3 ¶x 5Щ.þT¬èÔ‡Y>¶©ÛI{[ Mm#bÛÉã¡Ëxùå«W¯ž9sæ…^ 2øçåË—cÝt¶DcÿÂγëׯçòľ»~饗p.Úܽ{ןþË¿üËÃÄöÃ?üÃüà?ô¡%[ʪ(÷®yòàŸÞ}5#ò °3ðWÑéÕ.êÛªÈC†›“VEqzoAùFiŒ´ðzb£N†«?kU4—E±åÒdcrDlSi,¥½ˆ­±Ç@Ãí×à ßÄ·oßfþyòäIc8;µ³eÀa8§ƒ½|‡Êä‰"¶\–FÄ–K“ɱM¥±”ö"¶Æ w"±1­F°6Úéc ˆýÀO¿—­o'ß žK±À> %­†FQ>!=V8×"ñ›k|L±Aj!Öø­]fèœã–/¼× §û[dìûˆ½Ø§Öogü½zèÍØK°„Ú94³n,H÷aà½#ÆÛÔb#Õ¡%k'àO.ÔÚî:[ þ™bWÙõ¼J"¶tK‘ÞRÄvÐÇi—ÝÇa$'¿6šNlظvÏŸtõ*6‰ØÀjè—[ë~ú§z˜Õð)âIÑÅ$b3oNçÆ|pŒALßF7ò T¶ß¿1b‹? °ôÛ+0ÀƘßñÖ9OiÄÆÅÍ`}–ïÌcp«ç-(̇ŽÊŸeÐÀ¨™±a>‹Øöhk®IÄ6j f4±%L=5iC}`"9õ-np¨ ß»XâœAlFx请¾õ­І\n,T5•ØøÔƒ?€#Ã)6f؇ÑSØïh36Àð6äðð¦zÎ/V>6>2"¶6¬göQ¶Bl};mÓŸó5[ŠØ²OT ÜJž3~d;ÒÒ}l$6£=‹f „ùW£`JÀ¹d>dúè#6„|ï{ßã)óˆmM£¡¾5 ›ˆm+c¸}¿"¶D31©™ˆmû™­dÒÀ0‡‘œP«À\_ÑT'±üÐWð²•S5 Ø=øàƒýèG_ÿú×wBG%b›d»êo,b±e²m Ši…Øê·#~„"¶ ¹[ÃÄæ×F§úØúœsÃwѦ`µ‡zIqñåbVÃýÐЧš—#[[&t`´"6Ûqµˆ­„!±÷‰ÚÝ•r˜­Ž¶4Ý0ÆÓRéNŠ<`˜êßû{!¿ó;¿ƒ÷?û³?ûŽw¼Ã¶¯÷AÄVÂÐm"SÄ&bÛ•M¾ [ £#bKž€jX»R8Œk£d©ÑUQ:Éð²+O'¶ñ/þº@¶_|§_¹råÇ~ìÇpä+_ùÊÞð ÞûíkZ-aß¶•)b±Õn4ËOÄVÂúˆØÊÍXI^Y)ÄÆµQz¹†‰ -‰w>—[ ±!Âu pâ[ÞòhàÎ;§OŸ¾téXA 2ÀA”}î¹çbÉÇVÂÐm"SÄ&b[ÙVÔˆ­„ѱU4Å5”eH!6ôÀf1±ùÚSFu–׃C®RõøãŸ?þ~áXo Ì×Ú©S§ŒÌ¸ÆJ™ô½%¶Î¼¸ÞŒ Emg’Ø --²r Ó,R $òhw›2/9h ¦sÀ:piÕ˜#7è‘IIüO\Gk¹½±‰Ø–™´–ϱ-· ±[ËÏ„Æþ tÖw‹ŠâVjjÆÕBgñ¹}•àáEÃ~µÿñæ™g€eõGôGt­1Ëš½Øug}¶Éåcc–ÿŠóÜ2Ñüòœ,Í¬å’ Ê½ƒ‡‚68݌ÈóÐúÌ·AA¦´ FÎô¶ñEY3_瀕àýOh# FÅ?ƒÒ[ M®ˆMÄv\-b[h>:O±÷‰Ò•çЀìé§ŸF(Üig×®]ó®µIýä%6 ˆy’ðžœÌçÔW‹ÉNl`5: ÎLˉB¬oã{ hŒVˆ<­$TLlAu,Vµ"NùËáA;Bá8Bá6H &i60®Á<š^9Ëí­ˆMÄ6éÙßUcÛr "Û® ]ÌÖ¸qãb  úƒü€cÁµG}ôÂ… k-}¤y‰-XÇde§ zæ€a‰É†¬ü¼/Qjr|/Ć–¾úgLlq™©¸ U§äàmH¬ReÞY¿‹íÒ–Û[›ˆ-ýÁß[KÛr "bÛÛS¡ëÙHÈy /Ú¹sçüv4,‰ànݺµdPE‰ €ŒES@Ú€aárç@ñ+A^Žyér[ÌX}Þ»¾û ï$6¸ Í“—ÅØŠØDlKLAÛçŠØ²‘@ˆVEÛ~*4úÕ5€PPxÑG o¬sºÖv`ζÙã*Ml\‘$Qõ­Šb­“†‚5㹤ˆÆÇŸBTìóF†\å×.àOõ±q¡3ð~u³ÓTú '±ùÈàšwûe1¶"6Ûl;Ðü‰"¶,FDÄÖü“  ØHÀ20\k-‹kÍ®©4±yÐ!9ÅaÂà`î2Ò 9õùÏbbë‹$`˘ØÈˆüa¿~ZçY<Øé<‹Û3ò ní屉Ø6²Ut+b±U0 5„#jž3D}"¼pæ¯Çs¹ÖV#6Rš÷±¥øº€5æî⦱I>6zõ‚SbbC/hc?!œS}ltÔñ½Þ5üäÅ5ô"b±Ñ\òšElé†5½¥VEûDéÊ4Ð Êóài[¾k-Bi[ú>6¬‚™l…Ô¬Š÷cõícC/>‡_N%2z]í4h÷±YÄkºåLi)b±%ؘ6±¥Øˆ©mDl;}\tY4‡‚R(\kX…w 뤺y­ˆ¢ÄF4IŒís¡yb#ÿTç{éäª FFbë‹冼XQd`aýwª h/b±e·Í±e4%&JÄÖÌ ®¨ÎPPïZ –G3­±Yls}mÀ°p#¿ßòÏýû¶¬IBššüdYm3®…«Ÿž½páÜ«gdÙ¹ÝYß,±Ür{+b±e´ ‰±-· ±[c†[X ú§ú§¨^€¨s°‚kÍ.+/±YTƒ‚Íõ}‘>Ü’×|tBàˆo%†9€üÚh^b#´Yˆ+p>GI'±e_±‰Ø ›«ŠÅ‹ØDlOO ­y øPP”þÄ×-ëV¡B(^ÿý¿ÿwìZ+çZËNlŒÁô?qZµ¾º¢q0P_N#3 Ä>ª@šÙ1÷iÛüñxó\ßV¶«ˆ‘`

—íè“#Ûì ©w£ ôæÍ›ø®µðßøÆ7î¿ÿþ7¼á %v­Å:Ìåc+m:$T"6ÛnŒää i…ØRr>ê«5±Mžˆ:aGè ÅJ(œj¼Êçž{ ØÞùÎwâÛ·³¨|veˆØV³~¥;±‰Ø²Û‡f¶Bl\Œ(m rɱ5óh ¹5Ð \Ãb(`9ØNŸ>}çÎÛ·oßKHñ7´åÈk䉨r·ÍåˆØDlEmEÕÂ"¶Í-EúDlUOz ®ŒBAïÞ½ bC)w¸Ö®\¹ÂþyðòåËe†#b»W®`?"6Û £Ò.Dl%,šˆ­Òé®a•Ñ@gUPßv­á‹ö§ú§áZóÇéx+3(Ûq æZÄ&b[ÁbTÚ…ˆMÄVéÔÔ°ZÐ@_UP?vðÜÏýÜÏá‹6v§‰ØJØŸ}˱‰ØZ0eÆ(b+aÝäc+3[%µ" ôU †ˆ5PìZûó?ÿó>b³èѢצ}l% Ý&2El"¶¢¶¢já"¶FGÄVõ¤×à–i` *¨ŒP°â ÐÇáN àŒ‘-îcC62+-à Z%äúÛ 3™/ŽŽ6Vâ‰rÝ GXo ¿‘V7H¢æ»°®ýxØEüÓ9`“€,k,Å~}=´•‰öEß;G»ÐäŠØDlË XËg‹ØšÎÓEl-?ûúBAcׂ ÅÃŽÇ  ×¯_Ç·/~¯ ñ¼>6¤õ Ìà UšbÅ‚¸’ZØ{P$€EpYsq.ʇÉû.¬_?&BšDl¬@eýÝð§É•ÉZ þžÛ9Ú…&WÄ&b[ÁbTÚ…ˆm¡ù±U:³5¬Üp­ÙGp°Ú|ö5Ÿ¡-÷`Cy[[PR3È+鉭³Ú:lô·uBá±¥çBb±öÀÕ‡Ó=´¦Ã$±áeÀ*b+:¥ï+*]«ՀˆMÄVíäÔÀ*ÑÀh(¨»Öך}Ä\ˆ ùa=”«ÖYÅ6!6stΪN=[±9b}w[¦Lô±¥[g1P ƒŽ7VÇJ!6 Œ—à UÉÇVè±RlíbEl"¶Úç¨Æ·RBA9:´|ä‘Gl×Zçj 6:c@o( ¿Ú•mElä-[ð±‘x:Í‘‡ªìÄ6U6òDb£GÐ¯ŠØ Íp[!ÅÖ.VÄ&b«}Žj|[h 1”CC)wt‡ó,e¤Xº¥´ÌØf+bƒyáŠa§³jÅhüÂh"±ÅûØ:q(wÚ0)öíc3™¶‘—é×FElç°%b+¤ØÚÅŠØDlµÏQo] $†‚škíÑG=þ<oÝaNëmCb#rÑó4ìc 6™išAlðê1|Á~‚ðO çxH“ñO0ì™>ô\±M›¦É­ElɪÚWC›ˆm_3ZW³H‰¡ ÞµvëÖ­E]®rò¶Äfk£û^õˆIB±šÝ"¶BŠ­]¬ˆMÄVûÕøVÑ@b(h[®5Ó\^bcDwzëÁ`Ose;º¸6ŠOû²{‘ØF7U ¶s»›?wtÏY`ñú"C:)òÀ$sm”ζ>Çálëì˜Õ"¶UŒb}ˆØfŽ•­¾™®õj©n{ì1Ä &4EMôÃ5áZ+Dl¤¨€EÈd)“7ûˆ-Èî`"œÙ=g>­.Þãˆ%ÈJl$³ oc1£2ãuØ™ïc¹½±‰ØRÌÔ>ۈؖ[X‚ˆmŸOËî® ž.\~}éK_J¹8lVÖµsçÎU¾k-¾–¼>6<ò ' 8‰Åø§ßÝ×Fûˆ 2}]€ጞ932Â(NvM¤3R$]Å{ÎÐ2(Ÿ`2™Èƒõ à£oÌ×0•Ù™R˜9„åcKy²¦¶‘mªÆvÒ^Ä&bÛÉTÖeLÑ sâĉk×®%ž§Øa¡‰í«j–ØX¤%òMqW Â),£«¾*U”I,E+¡¬demðÞ¯ÏöU”òýÆF b³k 0kTfgÙ.ÈD§K¬®|lò±Ue[VŒˆm‰íè;W>¶U'±:›¨§Ÿ~ìˆaÅÏÑ]kˆ …On´q J[ ÓÑ)@–{V|öŽDl"¶:Ì£j…ØX5%=‘wv31I ˆm¹«>¦k«Ÿð«=ùä“éìÕ´kÍ4Ô4±M2>»o,b±M·|{9£bÃŒ}µ)Û^žý\BAOŸ>ƒ_|1ñªvàZ±Õf—GÄ&bK´`;lÖ ±-Î×” bÛá£Òì%Y(èsÏ=—~hŒ ¡îZ‹/S>¶5 `ѾDl"¶t;¶·–"¶ÆEĶ·ç¤Íë™ Ê«Äæ6”…C.ÝW¿zDl% Ý&2El"¶ú N©ŠØJ[©ù*¹i˜ JÁt­]¹r%­ŸfZ‰ØJºMdŠØDlÍØì±•0:"¶ìUÓ5054p­a5½¯VZŠØJºMdŠØDl­˜ü㱕0:"¶ü3U40#tß®5ÓY bC8¢×ƒŸ>{‚f–†Í·Áñ Ú>¥äX"ͿŢp$ ŽôeÍ힌Ͼb!¸–Î+ÊhfEl"¶[¸Ó&"¶Œ¦ÄD‰Øvú¸Ô{Y3BAíb¸km—®µ¢ÄƲT–ÉÖ§½ ¬ ‹>á'¶6<pU\B€Gì‡% <·±À@üJ)9ÀŠXã÷Ãfa˵ë¹ÍçõµªYÙ ¬ˆMÄV¯!.=2[vƒ"¶ÒóVòMóBAy:Ϋío×Z<=JøØb®b5 EPÿ¥ X!N„Ë:T¾¼ H ™2={±œ€ÕýÄ)ü3v³úØ‚z¦Œ!õqK¼ÛU°ì)M(ÇL€cúÌ Vi.K+b±×þ‹ØrÙ/GÄvÜ'jÅ+Ÿ j¨!È`RÊ/.sWë`%ð0_<ߘ¹`…+P]vÐ!)F(54ŒË˜&Z6VÁòDáºü¥a ø“Pˆ7Ñ©‰c˜ÔLÄ&bËl'b›d,‹ØzZêìPPïZÃbhb•ªUŒyebó>3"à?xƒ?½¡C‹5=Íæ‰K–ǯHŽ[[^`°+n@”¹ á™ëÜ–gbºK´¢}ÍDl"¶X¤™— b[h>:O±ÍœŽ:-AóBAéZ³«.GlÁB$W0=–]ÌÛ„7±û |,MzbE1š ¾UQ3Pð¥¥'%_«ºÞ#ˆÈ—hÆuXoYœ† †‘n¶á±‰ØÌäN›ˆØfŽEl;}\6¾¬Ù¡ ‡u­•&¶`§?—8ýú&I •¸éƒCmÓ>²µQOl”iÖ†Hd?&™K«>€€ïÓÃ?Ñ÷Ÿ›ê¬kúírðgL“vÐ¯Øæµ±"6ÛÆ†xÃîEly­ ¥‰Ø6œÒ»ìzI((‚zS28È®µx¬àcãòe€kD4lê"cáM°)Íoó·µÑ›!C¼÷ná¾1Æx\Ãà ñià„¡ë\ç¥ Ä•lšËÒŠØDl»4òI%bËeG¼[ÒäS£ , ¥x(<úè£çÏŸÇî·„÷Ù¤±ù?^ 4®¢;Šú}ižØ ‰÷±yWââiŸ¹ÃZg²ÊP þЙçGKQñ¿„š²;Õ‹ØDlû4R)W%b›j/RÚ‹ØRæžÚ k`a(¨¹Ö~øá[·n\Ûë‘Ë|]tA{ÂÈFv0 ®ìhjúbEmï›-!6)…®'¯—›öŒê8~Ô·.ÅŠöµ±‰ØŽkÍDlKlGß¹"¶ã>Q9®|a(¨\kk®ŠF€ÈÅd}až@‹?ˆ}TøˆÛÅL²åc³ p`A49£ÄÆ`ÕØd)Ö†í¡Oº\ ,,Üu Äu¡É±‰ØrXÙ6eˆØšÎÓElm> UŒza(¨\kwq­×Fã]_f+ü¯˜Ø: $Ä5‚û"F‘ÎÑG- T, ŠÙòna¤ï£ŒfVÄ&b«ÂRo2[FSb¢Dl›LæÖ;] Êˇî±Ç;ø®µu|l}Õ?yÜ~wZ«øÙYú“EBãq¡ñ§}uEͯÖçcëÅ:W<á±ëû(—¥±‰ØZ7õóÇß ±1¦}´âJ.£°PŽˆmþŒ<ä™ËCA©6ìWî5ß!µ8tÑ%|l ­„NŸ§›ˆí¸ö­bc¢ I¹…晃,g‰ØŽûDM¼òå¡ æZƒ_ 1¡ˆW˜8„C4±e±l5±‰Øa³:/²b«ÁR¤AÄvÜ'*ùʳ„‚z×2®%w~¸†"¶tóUyK›ˆípöË.XÄVÂ<‰ØŽûD%\y–PP¹Ö4ýWMDl% Ý&2El"¶IÏþ®‹ØJÛ®’¬“%T®µ©÷DÄVÂÐm"SÄ&b›úøï§½ˆ­„ѱíç Éw%YBA9œ¿üË¿¼té’v­¥ß[ C·‰L›ˆ-ýÁß[K[ £#bÛÛs²ìzr…‚r¨ zêÔ©+W®,Աα•0t›È±‰ØŽe¼üÕŠØJÛqŸ¨×^y®PPïZCAwˆ•†'i@ÄVÂÐm"SÄ&b›ôì缾ˆ­„ѱíê!™u1CAåZ›u^s’ˆ­„¡ÛD¦ˆMÄ¶Ü ´*AÄVÂèˆØZ}rŒ;c(¨\k9nÈ="¶†n™"6[.³Ðž[ £#bkïIÈ4⌡ @µkmùͱ•0t›È±‰Ø–„V%ˆØJ[«ÏÂqg µQ ¼¸¦]k nË«§ŠØJºMdŠØDlË B«Dl%ŒŽˆ­Õçaָ󆂚k HáD³¥“^£[ C·‰L›ˆí¸ÖMÄVÂèˆØòDå  \kÈâq5®p™"¶†n™"6Û £Ò.Dl%ŒŽˆ­ÒéžoXÙCAåZËws:$‰ØJºMdŠØDlEmEÕÂEl%ŒŽˆ­êI¿lpÙCAåZ[vC’α•0t›È±‰Ø’žù]6±•0:"¶]>,¸¨ì¡ TåBA©ì‡Ó®µõ§‡ˆ­ Ë™2H›ˆm}RK­[Ê“\O[-ó{â8®]»œÂ·{‰J`AlY{ì±Ç´kmâmÉÐ\ÄVy\8›ˆ-ƒEhT„ˆm¡ùè<]ÄÖÜã@××… °Zbð…|„…–.™£±•0t›È±‰ØFŸ÷Ý6±•0:"¶†ƒzä‘Gàú*Tp®5¤[+Ä‚ ©zÃ¡ŠØJºMdŠØDlZ’»±•0:"¶§uZ÷/¾ø"@ ב¿#íŒÉ­äZ›¬²2'ˆØJºMdŠØDleŒD REl%ŒŽˆ­ò¹wדO>yâÄ ,†ª\k…;O¬ˆ­„¡ÛD¦ˆMÄ6Ïìá,[ £#b«öÙ@H¾¼±¥ õ¦Ê +­pÝi×Z9 O•,b+aè6‘)b±M}ü÷Ó^ÄVÂèˆØê|B ¿¾¼ËEk‚Q¸VhW\Š­T"¶†n™"6[ý§ÔEl%ŒŽˆ­Ô|+·t((Ç×Ú©S§®\¹2w˜:¯”Dl% Ý&2El"¶Rf¢~¹"¶FGÄVÏÌ/ Ê+•k­ž;Þ9[ C·‰L›ˆ­rkSpx"¶FGÄVpÊ&‹^!T®µä»±qC[ C·‰L›ˆmck²a÷"¶FGĶá”F×+„‚Ú´kmÛÛÒ»ˆ­„¡ÛD¦ˆMÄ–òÈﳈ­„ѱmõ´¬ Ê«ClX (°ÕŪßt ˆØJºMdŠØDléþÞZŠØJÛ&ÏÉ ¡ v]/@6Émr¥êtªDl% Ý&2El"¶©ÿ~Ú‹ØJÛÊOÈ:¡ Þµ†%ªÅ¯¬·ãt'b+aè6‘)b±Çp…W*b+atDl«=Q넂ʵ¶Ú -Ô‘ˆ­„¡ÛD¦ˆMÄVÈJ4 VÄVÂèˆØV˜ú«…‚òZÐv­Éµ¶Â-Ñ…ˆ­„¡ÛD¦ˆMÄVÂD´!SÄVÂèˆØŠÎþ5CAy!¨7¥]kEïiiá ¶w¾ëÝpùÓúi]"6[isQ¯üVˆí;ßýþÇ?ù~—¬ì2El…füš¡ ¼Ðá£>zþüùr…­ éJb½þÕ¿úW<ðÿœzË[õÓº~ôGÿ¦æö}RÁ15Ð ±}õkßxóƒáwvº*!PÄVâiZ3Ô\k¨ëÖ­—#™kj@«¢% Ý&2åc“mMÓQW_­Û&¦av§"¶¼³|ÍPP¹ÖòÞ»J¤‰Øf[³ÚN±‰Ø*±* CÄV‰ØrMå•CAåZËuãj“#b+aè6‘)b±Õf^Öˆ­„ѱ-ŸÁ+‡‚rÀجvîÜ9íZ[~ûj“ b+aè6‘)b±Õf^Öˆ­„ѱ-™Á뇂r´Ø¯†]k7nÜX2x[§Dl% Ý&2El"¶:Ì£±•0:"¶yswýPPs­Á¯†˜PÀ⼑ë¬Ê5 b+aè6‘)b±Unm OÄVÂèˆØfLÙõCA½k ×fŒY§´¢[ C·‰L›ˆ­³“œ"¶FGÄ6i¦® *×Ú¤´ƒÆ"¶†n™"6Û,ÒÌK±•0:"¶Äé¸I((Çöì³Ïbך\k‰wªõf"¶†n™"6[ëæhþøEl%ŒŽˆmtFn ÊQa·ʃ>òÈ#Úµ6z›vÓ@ÄVÂÐm"SÄ&bÛ]š|!"¶FGÄ60· åàÕC…Ð+W®L~TtB˱•0t›È±‰ØZ6EËÆ.b+atDl³r«PPïZ;}úô;w–=4:»= ˆØJºMdŠØDlí \#±•0:"¶x~n *×Z.[Ñ´[ C·‰L›ˆ­i[´hð"¶FGÄæ'åV¡ r­-2 û:YÄVÂÐm"SÄ&bÛ—qšr5"¶FGÄfž-lðì±Ç¶ZˆD¿XÕ®µ)&aŸmEl% Ý&2El"¶}©”«±•0:"¶ CAmÚÔdðüóϧ<j³o ˆØJºMdŠØDlû6VCW'b+atŽLlÛ†‚r®Óµ†ˆu8î³­+w±•0t›È±‰ØŽkÛDl%ŒÎ1‰mÛPÐÀµ†,Ç}ªuå‘Dl% Ý&2El"¶ãZ8[ £s@bÛ6T®µãš°´+±•0t›È±‰ØÒú=¶j…ؾúµo¼ùÁ‡ð{1µÓCÛ¶¡ öP>ýôÓØµ&×Ú­T†k±M5bÕ¶±‰Ø2X„FE´Blßùî÷?þɧð»Z;âvbÛ°*¨ܰsîÑG}òÉ'µk­Q+´Â°ElMXΔAŠØDl+XŒJ»h…ØRžäzÚìžØjå…Rî(è~ëÖ­J0 « ˆØê1 G"b±ÕaT¶…ˆm¡ùè<}ÇÄVC((ºÖΟ?ÿƒü`‹GG}¶¤[ C·‰L›ˆ­%Ó“w¬"¶Fg—ÄVI(¨\ky-ÀA¤‰ØJºMdŠØDl±Z—)b+atöGl5„‚ʵv\;µøÊEl% Ý&2El"¶Åö Y"¶FgOÄVI((Ÿ0ìWÓ®µfÍ–±•0t›È±‰Ø¶4%Ûö-b+atöAl•„‚òÁf5lYÃÆ5íZÛÖb4Ú»ˆ­„¡ÛD¦ˆMÄÖ¨Ê0l[ £Ó:±Õ ê]k Í0ã%ⱕ0t›È±‰ØiÃ^¹h[ £Ó.±Áƒ…Äf'NœÀbh O…¹ÖZÃx4†F5 b+aè6‘)b±5j…2 [ÄVÂè´Hl½rå X Å2L¬"¸kM®µº<º [ C·‰L›ˆí¸æLÄVÂè4Gl "°Ú¥K—*Ù%|ä®5¹ÖŽk›²^¹ˆ­„¡ÛD¦ˆMÄ–Õ64%LÄVÂè4Dlðc¡'ð¨6BĆ$×ZS†¤öÁŠØJºMdŠØDlµ››r㱕0:MÛóÏ?ÿÈ#À…7å&Ø$Ép­ÁÏwúôé;wîL:Q¥a ˆØJºMdŠØDlÇ5w"¶F§rbC(è¹sçàÇzöÙgë™út­a/]=CÒHv£[ C·‰L›ˆm7viò…ˆØJj‰¡ ØÎãÆÉs¥Ø r­S­¿ª[ C·‰L›ˆí¸vMÄVÂèTHl>ïë™ñr­Õs/v<[ C·‰L›ˆmÇ–jäÒDl%ŒNmÄV[(¨MJ¬b/v­×­uå‰ÄöÅ/åãŸ|ê«_ûF`¾þÍoã ÿ Ÿ~ë΋Æ%H ±X´ì…®üñÓW?óÙ M0˜a{É3DA`< k†:/mø”aUà\èšUåˆØDlk™úú±í›Ø* åCJC„â ªrøÕ÷€jDy40Jl¿÷Ñ'ßüàCþaÆám§ßPð/´|ü#ç­þ >Å)ŸûüúÌK,§CH€PO,ˆ 6Zœ‹?Ém `¨ög§(œTzÏû>à¯Òbϱ£+q¼Ú8˜>žƒÀ@ç^¥}ª±‰Øò…¥´Bl´Pÿn–¯Ù2kð±U ê]k2Àzh‹ŒÆÜ¢†‰ pÜKöÈàpÄ Æ‡c?hŒF œbŸB ÈKŒI,0ö±A ±ÌŒr ™S Ý¡™±” ƒŒ…ßv$¶ißùî÷y.„ðSˆe¿Ó yQ±Ko±ÔK€ÃU^›ˆ­E”gÌ"¶ÙX6pâ¶ÄVg(¨\kyžXI™¥abƒ;-ö?Pø˜°‚Gž~)Äï“8kô#ï·¾ ã®ãîˆ;é,e½@~ g`µ§x‹Áž°GÚÔ8Ûè¿o´…ìRïÿ:ùsoÇ?ÔOF @¥Pìú¦ÎPP¹ÖÖŸ ê1ÐÀ0±Á‰P0'SL ÄÆ…Ôb£‹«sM°S ï—n?~ð&[€S}ˆ3¼(i#ï\‹ àÏ.–ºò=NÅ2žËëŠÝ‡£ÿBËÇ&ÛqíÛ{ÞóÞòÞ÷_üØ'ô“QP)»æ¬ª6”J@AíZ[s>¨¯IÄF/7iMbt‹ ˜p1'\§mJ:WE=¬pÝÓrÖ9@Oßv‘Qbãcï`ŒM¶^Ig›'­yĆ.@м ¼Á)ò ý±•-]W»jÙʪèè?^U5XyU´ÚPP>*2Ài×Ú® Gk3y áþ-b„ßPÅãÄ,þp˼¡R'±õ­– Rˆýxoœ§"ºµ Vr ‘öÑÌŽÛhŠ2‡ÿô4‰?gÑ“‹Ë £Ü&›|l­™Ÿ|㱕@½Õˆ­ÚPPs­¡ Š–VR`>ßs#Ii …ØÌ†|` ¾(û –ó:‰(Ó¹ð7¼*JD2²;†Aôy€8ÆšS÷±Ña6êc#TÙµ3þÀ<‘KˆÍtŽ‘sá5Þ´˜h›ˆ­1ë“q¸"¶F‰­æPPïZSfœ®% ÌÓÀhäA¼ê·©n;ëä®]v.Y ìsé™Ç+f,†|ÇS\h}[âÀ¬”FªóþEÏv¿Í#6Pf̲ˆlèÛùg†ZÄ&b›göp–ˆ­9b«9T®µ=…=^Ã0±ùif|éHË7l“El"¶ ,H%]ŠØš ¶ÊCA9™”ز¦]k•<Ú†×Àè>¶ æaÂŒCŠÍÇ0`¸æA߆­¾eJŽL Hbp«ï4pË Çx»Kƒp†A«bÉøˆk£ÖKEAíæ:?¢³ÐbØÆú0Ë"6Û½Gû…^8{ö¬Èý‘'^yùO¯¾òŠO¼{÷.Zž|åuæÌ™ëׯÛY8ÎSâ#è ƒWи„ ±ÕOl•‡‚rZb¿B1Ô³T2¥…%6nØb]Ñ8_ó¢ Ø _ïG«³ ÄéÁ¥õ|„?1Tåì6¸ÎÆhÉØ/ #é“@W"E—ï50ð‘Ë~‡*b±Ý³·oßcy»à€¥îý«áxëò+¯àDà„€Ì@`ø¸Æ?)BxнìûÂoÿz饗Ú©ÑÓEl5[å¡ œ]t­!&I×Fç›H›h …ØJ˜ÉÌ®›ˆ-‰Ø@W€*0-N'±ÁK¸âˆbÏ>ûl ±­oËDlÙ .ÏîQ((çª\kë?³êq†Dl% Ý&2El"¶$b¢Ælå´“Øè' PïâÅ‹"¶MïM:]Blõ‡‚ʵ6ƒtʶ±mb Kt*b±¥–)Ád\‰-^W5o m”Ø0ƒ}l\Z-ú’­„M™GlM„‚r6¢€v­}0%<¯Dl% Ý&2El"¶TbC»›7orm4&6V°ŽF¶b‹÷±åµYÒDl%ŒÎTbk"”óC½t銄j×Ú §ºÈ¥[ C·‰L›ˆm±¡)×FûVE¹eÍ¿€ktËFä2OérZ!6Æ%–œÛÄ‚ÄN"¶&BA9£àZ;uêÔ•+WÒ'˜ZJ5h@ÄV‰m\> ›ˆíU“/\hf_Àdô°ÅµÑ Ì“Íü)p­ìÀj¯à?EcÊaú¾ÕÒÆ® b³‚Ǭµ·ü™/-!‘Øšå 4×Ú;wJÏIÉ—²k@ÄVÚè­&_Ä&b{Õ>€¨€P -`fÀî1ǧqv¥±1ù Í,z”ˆfþ9îZcß$6že/åcƒ`­¦êñ¥ZV33:%¶VBA99åZ˸²6'6V—·<±AIM|îäŸÖŒ¯üN±Ä¶Ž:³²Á~2™-2À¡M(Xå¼¶|bá¶qù)"6Û_Y¬ir۰ɯož‚åN; ²¬QÉ (†7>7/Ndd"b‹Ÿg˜oÝhÚ–?öE% [+¡ r­­Œꮨ¶%6«ÈÄT±D· ¦B\mÝÛótþ°æ­9ôUJ°u‰¸–Yß v¾¼Û‹ØŠNËÙÂï›}¦NLÑÀ ¹pS†·©|U”E‘}.l_ž¹(u-ÞIl …‚rž`ô‘GÑ®µyO–ΪJÛ[\žËæÓJ©‚Ó%_”5¬‚$EúÕbcû Ì@b}÷%¶qù¹ò±ÉÇV•mYu0•­Œ÷äãHl˜–[¼bk(Ô&@ AX]u:ª3i Œ¶%¶N óõ æ$Ø?´üç6(êI1 ¶Î=Áí²µÑ”*òyÍf¢4›ˆ­Œ‘hAjýÄðYµvÄ›Ol …‚šk É; ÙÂÖ¥q lKlD+x°úJgÎ#6.kšå`“>5†ó–“¾·á:žÕZZ›ˆmüßk‹&ˆÍ'õhÈÇÖP(¨\k{}Àu]ÔÀ¶Ä¨â*$hƒûÕ‚ÈéÜÇfË ²`ËxÄ;ÕðÞºðzãÞ’ádI}ûØÀ‰Î°BÍDl"¶ãšµú‰-ø_00C…ŒÂB±ÿéÓÿù@qtÄ„¶2·°kM®µVn–Æ9U›M œ[†n`/c&›,àûï|÷û<ÑßCNŒ\>N 2=]Í#6ôŒ*`Í…¦rÆé"6[÷ã0Ï H(øC Pí ¨(…ã}ѱXHàA+3?ÕÍn_9±ÑTùÿ#›ˆý“§ÿë{ÞóÞÙ7eý¯]»¦]k뫽‰™óÈ,!ÿ´ŒEþ:[¢qð¹mä‰}/ë!üh§(ÇfMÐg%Äf€tóá¢SWE"§ó0óÈmmÁ`ûïw`ÅÓNѪhͧbEûëÀ¬–ÿ†#.ýiÅ ¬YE/T‹em+æû°„º«Í•ú‰6ˆÿkrI4Ž™šñZÑSFó±­vG;B±)ø/\¸ ]k£º:f˜2Ø=OløÓçª4µt¶dzK¾˜8 çÆÖ}KŸçÈðަ/|LrŒïÔ†ÄF«Ó•§´©ÄóE·œ9á̇ÇåNøÆ‚,H)‘ü™CDl5?ï"¶×ÜØ û'ÒÞ”%à?þŸ¼Nbc†6öùìÂdÑÒ5'JýÄf¶‰jóü)¨× ±!*ݱßnÍ)§¾ÚÒ@'‡uBRgË`™׎ÿrÁgµôP8 žë=|ƒ#±ã-²!±ƒbõÄÇÆVF3 v’ÛÔ‚åË€Àè¥Sv¶F­ˆí57ÆâQx¨ þA„³¤¸ÄÖIc 4û—qýZUMLF}0| 6mئ~b£kíüùóÈרÍÒ°×Ñ@Ÿç, ' &‘Øøo*N·$Á‰Ã×ÅsiŸybÀ¼óôm‰Ù×è¾²ü·øÓ– ûö±uu®-@Ä~îó_ð¶Ž;}}Ì?}f씵pVgÝx›ß]·‰Õ>6ÌpÛks¿o´ˆSÁ>6žÆ ôq/ZLl<`‡WçFÖ˜_dz—VˆmÓ0»ÓʉM®µ5±Öûêã° Žß$boyÒšDl¶ J!‰s[b£KÌêA‘“|Ü@_•*s¡áÜÎ-ÿ8¸Ù (×_î¬RÅÚ $¼Ä*Uq©«ÙvrÞ‰"6[hTûˆ-ÞÇÆ­ê¨!W'±Ù¥0:8ôæ;æ>¶•ƒDló¬ÆðYÕ›\k­óÓúãï#¶xYº{‚ ¶x",í "ºxù,뜲}ÍÔµ9±•°3Ç”)b±¥[ß&3#6Z1¬öùج'Æ7ÙŸÀ5é4OEm´ˆ­„Õ«“ؘN»ÖŠ>Pû>Àa$§¼‚…x×+øß/ÕÅ.:_Ö&P,#:W*:oˆ­„¡ÛD¦ˆMÄ>ã3ö±Ù^ ®Â”Ä»+<¢ØÌáMŸa*ý b+atj#6lVÖ5l\ƒ­ôŒ’üi`ØsƵQîßêc ˆ-ÝÇÆŽ`NSbx;Dl% Ý&2El"¶ÐÆÂ™5± ÎáÈÏg\ߌ‰)<Ø™!#Þ·²ò"¶F§*bƒS ¡Ø»¶ÕS¿Mk`˜ÃlmÛ9Ò‰ ÿ¯ÎÞÇF; ›É7£y=Dl%L܆2El"¶‹ÊeJ¦OãÇf h&øâ§>Cþ¤ëŒ`BË@¬—Æ÷kÚw[ ÓS ±Éµ¶æ£´×¾F9ÌÖFG[šŠè™³”“"˜J‰HxbÊÚ¨|l% Ý&2El"¶nc‹ÿKÄ;ï CÄVÂèÔ@lr­Í{"tV #qoÙè>6s’YGéÄæay:“}XZ¥¾Û'b+aè6‘)b±×J‹ØJm‰ Õ ž|òIíZ;îSõÊSˆ«  6|´bKxæ¦[œ>ð0—&†Ã¶Dl% Ý&2El"¶¬®)a"¶FgCb{î¹çúôÓO75 5Øz5Bl=×Fcbó»>ØG,?9/Û" â-"¶ód`׳ ïÎHlHEëb‚ÊQAþé«|â,$NcêÚ ð€8Ð&î"‰—´Ó9` ÄⲸaäqzÈî%‹±±‰Øê5—¥G&bËbD!›\k—.]:}úô;wJOÉ?Ž°Û DeuY‚?½˜Õ(hɱѵvåÊ•ãNe]¹4Я¼Ä1gÞ³l€ùœXÖ3öZÕ±Õ†783 ðÒ¡Äú6¾—Î2íp×f¬Bgéw?*´D{┿´#4k,´åK519H³{q={ZðÊYnoEl"¶ãš:Ûr KX“ØäZ;îÓ«+OÖ@^b Ö AZ,k5b{þùçåZÛÝC© ʯ¢Äk@ÆJ$6.wÆûÀ̪x ò¦Æ¼t¹ˆ-f¬>ï]߀ý…wÜ„æÉËblEl"¶ü¢‰"¶,Fd“}lXÕ®µV4s[ ”&6®H’¨úVE±ÖICfÜÄAãÀc‡O!*ö‡y#C®òk— ð'ŽúظÐx¿:‰ˆÙi*ý…“ØüÂ+pÍ»ý²[›ˆm[c²eï"¶,FdebClX qXÝrö¨oi  ”&6:$§8,ÀCl¿÷Ñ'I3lläÔç?‹‰­/’ s}Ó‘\Å~ý.´UÑNçYÜž‘þÅU× .u¡É±‰Ø±:†ùîwÿúϼéÄ©·¼U?5•B±n×=‘p­a%¡…äK¬4°? ”&6Rš÷±¥s |]ÀswqÓØ$½zÁ)± ½ ýt†pNõ±ÑQÇ ÷>6z×ð“×ЋˆMĶ?•zE¿õ[ÿÆ?ü—?­ŸŒ€J¡ØÔ{ÜN®µdU©¡4ð ”&¶ô}lX3Ù ©÷cõícC/>‡_N%2z]ídÊŒûØ,â5^SZŠØDlǵnZM±SÛ”ˆGI'±e_±‰ØÖ4uõ%b«–ØàZC5÷óçÏÿà?¨kÒh4ÒÀ X…Ð2&Ÿš‹Ø`.‚bqZµ¾º¢q0P_N#3 Ä>ª@šÙ1÷iÛüñxó\ßV¶«ˆ‘`

{¿rPÚÕ«Wq•—/_±•°‡¹r[i´cù"6Ûa,et¡ò±•0mS‰ ûÕàZÃÞµãND]ù‘4 b+av"SÄ&b;’±|íµŠØJ˜¹tb£k 1¡Ø¾vÜY¨+?˜Dl%ÌÎAdŠØDl³—îrEl%Ì\"±ÉµvÜïØW.b5;ÓaŒöe ©d“~ÓGˆ–"6Ûqͧˆm’±HlÑ¢úf"6Ûqh+Äf©&g<áëŸ2LlÏ=÷Ü©S§´kí¸OÝ᯼u[ ±±bAdA‚ H :á7“ô"W-K#øúî)ÄÆrRL½ëú,!ûÅ)ìר1(±0 “µâZ¨"¶BÏú}…äJl娟ØðO*ÿé´ßëØÔûˆí/ÿò/QôôéÓ/¾øbåCÓÊià ÄF—•¯:@là³ 1ͫ›¯.‘ØÒ7}a+oèhoy¤³ð¼olÄfUá<‚SÍiÐ^>6ùØÊ™¦Ú%×Ol0°f8JüӶЂħw]kW®\©}Nh|Ò@a „Ø`¸Þ 6®¢ÆÆ„u9­êhvbc]Ô¸_$Ý{)Ä9¬gï×FK˜k›ˆ­°}ªX|ýĆgÞ/ ÀruÚµìÔµD`@læZ»sçNÅsAC“VÒòè¢þÁJ½ÒMƺ¢° ‰«¢ 6ò–!ѱy, Œ_<ÍKlpÝ @>¢Ï,‘ØÐ’ÜiLEl…&¹VE )¶v±•[l)ðo\[Ä&×ZíÏ€Æw lEl€øœl¹s˜Ø‚ÿ(úÊDb‹#:iO\fžÃ0Rd³™†°D@[±z¶Dl…[»Øú‰Íïáà{Á‘%ΰBçš»ÖäZ«ý1Ðøö® ‰ÍïE›Ml¶3$‘ذ.Á0ûùú7¿›;ŽÇ/b[ÙØ¯5ë“éŽ~mTÄVèÁ±Rlíb› 6oDFýó… l’XÛc«i×Zí€Æw lKl¶6:Lln0X¿®šHlé‘«±Ö×¨Õ –‰mmTÄVèñ±Rlíbë'6ü èÿ;¤m?­ßøÿãŸüí¿ý·±Zûí×ø¤chàÂ… ?ö‰\¦€»ò¯þôþª s×F™GÃpÊ·!ôXL(¤1ÈÔGp¥2;µ0JWú"è*ã5ŽÊ ˆk£”Ü·Ô;û^(ò¬ˆív+ºÊʉFÐÿ¿Ø·çwöó_âÄÑ ºmºli`u îçŸþÓúú׿>#±Ñïd²ÂBbãÚ(¬Y±Q&Î"´Ô¸}ÍL1ôÊï<ã?±6˜Qº ,l,éʸ÷n’ÌØ,øð±•˜ò"¶Zm@fåÄF+æŸyXo¿JðÖr™"¶¦¾†x üÙŸýÙþè‚þþßÿûýÆ—?Ú&{¿ § ­ü†°˜Ø¸6:@l€-Ë: 2cÞxÕ’Ç)?ÎRIb³Oý›Î­lt¡ñZ`]­_Ï££2;ÿ‘fú_[‰çLÄVB« ȬŸØh ø?% bï'£ Î(JÄÖÀÔ×w­$©þùŸÿyºyþÚ_ûk?üÃ?ü//|4ã3Qp†Á:‰:AA*8™|î\v ;†SÌ›ÕÙVŽI(ñí‰qÁ¿©ÖTÄ @x\í€G¼-VÃÿ‡q-Aôè¨L^W “úé D}/´*ªUÑ]›®Á‹«ŸØ¸š`åÙÿc›m8N±÷‰Ò•o­,ƒ>ùä“?ôC?D\Ãë¯ÿõ¿þwÿîßÍ»*ZÂn Èìs­<Œº±‰Ø¶¶1Ûõß±ñßÙôè§ÍÍŠˆm»­ž­/}éKëoý-c5{óÿñ?nšØ6·iõ @Ä&b;®k…Øê±)#±÷‰Ò•o¤d=|×»Þ³üîïþ®ˆ-ÅvÕßFÄ&bÛÈÆTЭˆ­„…±U0µ5„i©ª±S­×î¿ÿþ¼ùØJ ÉLÔ€ˆMÄv Ó\ªˆ-ÑLLj&b;î¥+ßB ¶>\ÃñÇ{LÄ6É‚ÕÜXÄ&bÛÂÆÔѧˆ­„m±Õ1»5Šià©§žBLh'·×Dl% Ý&2El"¶Ù5ùØV°2"¶ã>Qºòí4ðoÿí¿í$¶gŸ}VĶ‚Ý[§ ›ˆm;³uÏò±•°2"¶­çµú?œþÇÿø¸öº×½ù>&[œÏ 9Ï‚tk´ÌC§ÞèÌO†öùÉykãO¡M2\è¢/[çG¸^ u^uܵÕÔòá 5éS²aA9yþ™~9"6Ûᬛ]°ˆ-ÝR¤·±÷‰Ò•o¤÷¿ÿýozÓ›þÆßø·:u #šDl¾˜ÕÀÁ W- KgåªHfF|<¨àN`1_6”Å,¥“nŽ˜x¼“Šâ€hVGo⫎»Žsü‚AÑi\•Ñý/0ýrDl"¶lLÝŠØÒ-EzK[S[C82÷·~ë·ÎŸ?oû=î±>šAlA¦nx†ˆ/Þ°Þ9 }ÆÄ† tú<±Ymxßî(_–jj‘ÐØFÙHbbëü((Ô§ïô®YÕ,û”õ ­äËsÅüJ'e¬¥aK+b±È´i[:xÍn)b;î¥+_]×®];{öì#<‚ÕOtgÒy¼á o 3!§îrb3·™çÒ q$ <~Dœ_Žô-c¿ WHù>…Ø–I™twÍú>â⬙¾á€ÉˆbÁµÐwèígçÅRuÞ$K+b±­ncªéP>¶IÆ"±±ˆ­š ®ì\·nÝBâ\,}¢(.‚Õ@i?øÁ.\¸€o÷ï}ï{Yˆµò‡ýFñG$6¸šß’½P£ Ž£Ä6Ü€ìÕÙfà#\6í«‘7!÷¨õѧ‰"¿ö3Ö[б‰ØvnÔ.OÄ–b#¦¶±÷‰Ò•¯¨çŸþôéÓpªÑ‘ÛÉ“'ñц€|?uðÂÇ€- ÞÄå<¢ ßûýõ$6|/”_õ3bã)£;î [è7†ð5æ…t6%B XLZ±=&6*!( Ï5e!‰fVÄ&b[ÑÆTÖ•ˆ-ÑLLj&b«lšk8;ÔœjX ýwÿîß!}®aÙ<`”æ¯y*±[ãA-?ŒK}>$#64ðk£Fl„OQ¶¶Hú! ’¨xÄÿtî ë³QX6Ll\9í 2]ôdzé‚UãNÇd¢±‰ØvhÎ/IÄ–h&&5±%N?5“æiî4x×þôOÿÐF ¸Ÿú©ŸúÍßüÍNS‰Íƒ±“ø ò\錢ø§µñÄFgˈ-F%0i~ÛÙ¨,Å.Í 6ðbpÕv¤ÓëÖçccpC§#mÆ6^¬ˆMÄ6Ïhìá,[ŠÉ›ÚF͇gC×P±}ôÑ?û³?Ãö5nSÃëÝï~7v°ÙŸÁØgž}"—÷¨qÇ}°Ré£ <±ÙÚ(÷ã ö!‹¬Mˆ ׋K2Ã&±“ظM­s¯ž_Sžj]El"¶Š-Sᡉئڋ”ö"¶ÂÓVâ­$ìøô§? hC1*ûØ~øa`YŸ^–›!—ÁV§Ÿ‰«Ÿ´±ÙÚ¨_$ÐÄÛ˘õƒÇ×'6âÚ¤UWŒ3&¶¾«ëÓOŠ]•ͦ÷}‡6¾ø3gÎ0^¯¼€b<­téÒ@) <ýôÓ 6¼ð†}`…ô§_y1»Gçk!±raq°/Ì“¶èRŠ‰Žº`G—¥Ø'áž'‚Ž-Â’Ø “ üñ…®¯á­f“VEÉ^} @UœÝƒ‹¡^Ž8-èK>6ùØJ—úåÊÇ–þ¿]zKùØêŸùa‹€/í±Ção?èíW~åWžyæ™+ZNlD.8ÒrRX‹˜Øè¨ó«¢ÞÛD˜ãf¸ šðïÍ ×é¨óÆŠn³¾XQÿ[Æ?£á¨P‹)¥»1øñ @lSÓ°Ù‰ØDl-Ú®MlX-z="¶DÛU3›ˆmê㿟öÍÛÕÏ|OìÇ?ùTÍ–EĶŸ'DW²–nܸqîÜ9ô†lØÇ$ZÃA,†~ô£MÏè![ÍFröØDl"¶µlR}ý´Elð®áq±Õ74"i`‘,—–>ƒZíkög[zFÛl*ªùD›ˆm‘­iú䆈í=ïûÀÛN¿ý‹_þÊ›|H>¶¦g/ x —(Nµ Ö;›ÑýçÑMW£VEk†°Ic±‰ØÒü½µlˆØÀj|°El{›…ºžkÀW BýPT ”§\kÿëý/PÝl=‰Ø&QQÍEl"¶Ùv ù"63""¶æ§.@xE 1,w"M.Þǵީ$ÎÈèáu,b«Â&MÄ&b;®ù±M2‰ypÜ'JW>EXëÄŠ'Έk½S ò®Õ,(aŠì×´±%Ú®ú›‰ØDl³í@ó'ÖIl_ýÚ7àH³ŸÀˆÈÇÖü´ÓH¯dëÀ‹šèÛ£† Ñ¿ø‹¿˜—ÑC>¶úñkÆEl"¶ãšÏ:‰ 1 Í~DlÇ ºòjÀ»Í<ºùËå¶¶¸ü •ÈÇ6ƒê ³Ö;/q£ØÁưƒ, ±mBW%:±‰Ø²Ø„&…´Hl%¬@^™ò±5ù0hÐ…5 Z\ëý£q +§·nÝÊ2([^·¡4›ˆ-‹MhRˆˆ­„é±5ù0hÐ…5`¹<ÐOg­wöÏPƒ3†)b+aè6‘)b±Í°;9EÄVÂèˆØvòxè2òi£¼ÎZïü;ÛjÀÅS4ËÕ¿ˆ­„¡ÛD¦ˆMÄ–Ë,´'GÄVÂèˆØÚ{4â’@ " ØC_­w~ÊÄl(r€5ÓŒ#±•0t›È±‰Ø2Z†ÆD‰ØJ[c†[RØ‹c.¼:k½ó#®„Φˆ­„¡ÛD¦ˆMÄ6Û4¢ˆ­„ѱ5ÿ`è2i Xí¬õn¾·‡~øÅ_ì‹HX2"[ C·‰L›ˆm‰)hû\[ £#bkû©Ðè3iÞ2D}Â(¯¯Ö;?åF7v°™C.Ó@îUĺø±O”xØ%se ˆØDl¹ÌB{rDl%̈­½'A#έ —G_­wvk ÖW`táèDl% Ý&2El"¶…Ö áÓEl%ŒŽˆ­áGBCϤ€½†Qì‘GA¹ª¾ŠUËG$b+aè6‘)b±-7­J±•0:"¶VŸ;“|.ˆì«õÎÞ¬*<ÖC‘87Ó^#FÄVÂÐm"SÄ&b+a"Ú)b+atDlmÌ~²Œ‚ð‚aÏVKp€oA ˇ)b+aè6‘)b±-7­J±•0:"¶VŸ{±ËÕ¥L Â| ëÌÈPlzCâÜf Ç%b+aè6‘)b±-´ Ÿ.b+atDl ?ú `M;Òà6£ŒZïl`µÞƒUÔCè>UÄVÂÐm"SÄ&bËnš(b+atDlÍ<h> ¹< x4³7®±2UöŒþÊDl% Ý&2El"¶|F«5I"¶FGÄÖÚs ñ.Õx «Ÿ>n`´”»m\óâ—Ž£ç|[ C·‰L›ˆ­•h@ìó7ÿÉ{ßÜ’úɨ¨ŠmàökˆÒ@& `ïv°™°ÑD¸ð«!àë§¶0ši Ýb>ö±ýôϼéíïø‡úi]"6[Q[Qµð_ÿõG:ùs­?õ*…b«¾ñœ4OÁêçp­wvkÕEËeôð×÷»¿û»o?ó«ÿ+“¨­4 b±å3]­IÒªh ǾVE[{4Þù@¤'ˆÍŸ?PëÍ,ßÇèÊéüa½öL­Š–0t›È±‰Ør™…öäˆØJ[{O‚FtÝœׂ A¸hç™V~4U[^ÕËÇVÂÐm"SÄ&bËkZ’&b+atDl-=ët Äp6\ë=XœÁ:=äc+aÜ6—)b±Ý{´_zé¥Ë—/û‡Ü¹úÊËŠp'¼:O¼~ýúÙ³gÏœ9sñâÅ»wïÚYÀSâ#ì+x§ÛÕñ3Dl% ˆm|æ©E³¸pá’߯.·á òq)Þ¸¼ê‘­„¡ÛD¦ˆMÄvÏ8ܾ}ûäÉ“ÞLø#À/LP¤«øD´Ä‹pöÄO@&Žbq<€B;¾Dl›˜€ìŠØò~ÝJZ=ˆCAGk½sðV9tµŒ^i"¶ìVn+"6[±¨Xf:‰ N5ßk8‘ž¶Qb[ß.ËÇVÂîˆØÖŸÉêq İ5Z룲¨Ò¸˜Õ ÃF"¶†n™"6[±ѸÐIÓIl€³x)Ó@MĶɾ~§"¶u¾†ÕËšˆsy ÷Ĭ™Ò0Žfk+tE"¶õÍ`¡El"¶Tb{á…ŒÉbbã§±Å1ÇÛ(±«¢ØÜVÈ~™XùØJ˜[éy+ù+k sé3q}ó™gžA ¦Hí¼+^>¶Vn+™"6[*±ÑµÆuϘØâpæã)"¶­ò•û±­ÿ•¬Ëi¤…L¹(îî»­õÎÆžÒr%.D>¶•m`¹îDl"¶ ÄFð‚Û¬oUÜX[K%¶¦jX¦|l%,‹ˆmý™¬ i;ÏD Õ¨¼ü”Zïlo¥–;·Ð8‡ÅŠØJºMdŠØDl¯>ìXÓÄʦ=ù àŸ¶¸ú‰üq¬(‚Cñâ)D::Þ(œ‡³¼eÁGLÒçŸ+mÝš ¶ßûè“o~ð!þ|ü“Omb&&u*b+=o%5 Ĺ<Ðõh­wÏç]³Ü¹«Üw$b›dÁjn,b±½úh¶@fØ! ~"®Y2ŽÀ=†ã˜71±!&gA$ܼygñOv@Ô#ÆáÅÜüˆÄÆãöòøXÈÌÕOlä<@ísŸÿÂW¿ö«Ÿù,Þàj6(›ˆ­Ðt•Ø•5`5@}¿éѧNb]ÕÑ„mE/MÄV¹ÍLžˆMÄöW¶‚ÛÔ˜ÈÃçN]tá-ãp•÷œ!\€¡‚÷žü`¹ÐGè¥3&Ã&ró/C½r¶¬rbûÖh5{žéoK¼7i)b+7c%y5 t¤Ôzç=غ­6ø #Û&–°D§"6[q3²Bõ‚y×P9±á®}ç»ß·'«¢"¶y÷ZgIéè$³”Zïì¡ E{¼·XÑôÞ³·±•€§MdŠØDlÙíC3ë'¶À(¼íôÛßó¾lb)Ò;•­™@íÒ¢à#où—¥UUÛ¹sçnܸf¾8ÕèYåˆØÒÍWå-El"¶r†¢vÉm÷´}ý›ß®Ü¦ˆØjŸ÷_¿:sy yJ­wJE`)*‡ò}úYE­r›™><›ˆ­¨­¨ZxCÄF\ó{ÚÒò•[þ§Oÿç_üÅSX Âjø&ùB«žs\Å€K °ïâHð‰?0ùOœ8#›_±ˆmeX®;›ˆms{²ÙZ!6,†×.ZÎd”ü'Oÿ×·¾õ—«H<ðL Ö˜ð_¾Ã—èô’jÓ@gÚŽ¾EÒÎÁ{§Zb” bËhß¶%b±­`1*í¢ b®á§þÅP3dñª(  †¯K—.Ýp°;p?à=ò]á8’ª O©tîjX¹5ЙË#±Ö;ÇâÓäúdl¹G:Yžˆm[ÌÊØ»ˆMÄÖñü3+spðc¦L ^Ì‚6¬Ce/«ˆˆf6/ ¼Ì ÅîdË4ñ„ú‰¸–ñ_ATâ>6|½Ò®]»†¯,EÞ`Œ^÷º×á 6nã ×Uã ào²šKã@ f]ÜnRi)Lc«Ž€ÂV8ïx•"¶ìÞ:]ˆØDl¡Í@ú\ ±ƒ±âL¹Á hŒiÈ&6_ÁJ&0éîšYsýà+'6ìZƒb±JnãϾcEáÒ¥áëß1\W½ÿþû¡|ÿq]i®Ð (ò¸Ê·ž:Ù­0£[ñ†³>ŒëT„Ïß–X$~5…ŠØÖÁ©z±‰ØB»³|¹V?j ÚÓyf [>64Ÿ±3à Óçâ”À?·šCG•Û¿ü$`‹V° KºHô±MºÑpWp]> ’]Árá7Þã×UëqiLº45ÞV}ÛÔk½sð>‹ÞcfBì¶×å{±-1hU+b±…†…N/;ÊZRÃÄFD3öЉ§³æšÁGù<+¨gµš¥«œØª²éƒ)AlSß©˜Qðºq]~8˜3øäl]>­«®ö4µØQ_RÜôZï¼j¿xš^Æj5‰ØÒÍWå-El"¶TbÃ\ ö±쬤ËR‘Ã|‘+NgÝR”…ºñàœc¹*¸ßXØt5+†ŽDl%ÌÓjÄÖ9UðlëªØ™dëªxª³uÕª\ kÎyõeèËå–7E]2À \TõÕRÎ]§ˆ­„¡ÛD¦ˆMÄ–JlV¸=8ÁˆµÞñ}Ùçc³UQn•‹­N_¡¼õ+b+at¶%¶¾¯@LK¬œÚº*"Um]¬8ŽZW] *é¥˦:É|Á¤H…Õô b+aè6‘)b±…vƒž0MÜÇf5®rÂÓøØa`=y±¾û`A¶´E±•0:u[ç\âº*Ò:à+ N8®«"‡Þ#î±… jH‚ZúY8š|`:î{|ÕéµÞy®/ZUFi"¶†n™"6[hµÀ[X äQ€3nŒîc3)Ü”>õ Ö…ùçÐŽ·>7^¡¯[ £Ó±uÎ+,lÒðMŒï¹Ç{ ô†œ#0”xƒ?qIÐ@명žÊÄöUgO¯õÎAbª ¹ öÀôâ¯0þ©]ˆØJºMdŠØDláã@N†2”Ë”¶|ìŠÅÝxÐv¹­c¸Ñ‹ˆ­„ÑÙ+±uNK–s`º|+çÀuU–sàºêjSZ këàXûîLËŒ›…Wº±~ QÖì^-¯‹ØJºMdŠØDlé6jo-El%ŒÎ¡ˆ­ó‘àº*Ë9p]ÕÊ9p]•ål5moÏU­×3°è‰ÛÛ4iàѦ+Lêhyc[ C·‰L›ˆm¹AhU‚ˆ­„ѱu>,çÀuU–s€+ΗsສÊ9²&B'Õzçð<¢ùô¹…¿P¬ˆ­„¡ÛD¦ˆMĶÐ4|ºˆ­„ѱMz$¬œ×UYΛäl]II´®:I¥ûÂ&Õz§d8Gqƒ,‚¸ÎŒ^ "¶†n™"6Ûrcت[ £#b[þ<ÀëcëªHüËuU_Îëªû±–÷¾? }¹¶oÝyñÊ?ýž÷}àñœÇo¾óÝïÕ¯~æ³homX96&8ˆâã±@ÊSì׿ùíN3…1`¨pЃï,ÇÜ7 G_¿÷Ñ'ßvúíÍ(9ý2Ñr¸Ó@ç^¥}–YÄ&b›ø½±£æ"6Û¦3ÖU}9®«â7¤ƒ—s€fU>°IµÞ9O‚*ïA¸hµsiÔǰxóƒáÈ‚¾ÿê×¾Aû€7˜Q<è€8lÀÓcc‚ƒˆÓ'0h ƒ`Y dŒóÁð,þà¸yç`@„¼d^;~pJÜ)Æ@ Å`<}—ÉS:;ÅGŸûübãà°M±‰Øªµ3Å&b±ŸduÀrØ ïË9p]•åà^Úýºê@.©µÞyƒ 5gôH÷±Áuð~5øÀ1žØ àxLƒ³è›GlÀN,‡Å,ˆ®qƒ´SÐÌãåÀ†­Ûxÿ˜ ÒÒÂAâc,p±ANÀ…dMۨɼo´…ìR"6Û.'vßEq]•å°ËÖUñ†ëª{*ç€ø¬÷•¦˜±šøäf¬¨n5Ù†}l~,¬â8]>t‰€EG±¦±Q&°,æ¡NîÄÞ¯Qb§B~¼ð iøñæ‘G ¨"X½GlñY‹÷­s0ò±ÉǶ•Ù¾ßw¾ó×~æM'N½å­úɨ¨ŠÝþîjÉÆq]Õ—sàº*öìs]µÚô°W p­oÌóÒ§j¡%[E¸h+õˆ4Ö¹ÛÌxe€Øè™+AlÆ‘ô¨yx⑘Ïâÿ?G‰m´eOÙc ¸óˆ]k>¾"›ˆ-Ù®ï®á‡>ôáßøà‡ÿàò§õ“QP)»»Ér¸ âº*²Äq]+€ø¶`9®«²œCa’.´©µÞyã«\´2'ˆ °Õ¹žèY!&6ÛûÅÅÄyĆ¥L"à—eéÊ¢·©Ó­ÅÝfÜ|60 døÒ:—üâl|±óˆ ZåÆ8Ž—¯ÈƒÄJ«¢‰ŠÚ[3­ŠjUtosºðõ°œ×UYÎáu¯¼ð†å¸®º­ói aÇðRiŸò‚¹A>¶Â*Ï ~˜ØF÷NÅä órÍ#6ÛéÏ7~SW°]¬“«,º“ÜÓ+Bl²0` ½_þ6Ï—óˆÝ1âÕЭ/LÁÆ&›|l,B£"Dl"¶F§nUÃö帮ÊrpËq]•åÖYWÈå¥M­õN=#˜µª[0<˜b£k8€Ä¶Àûñ¦c± t ‚¡ÿÌÇ®ö¹ pœžÂ˜½F‰m´9ù<_¢/°„ØLp(2˜c8\TÄ&bkÈòdªˆMÄ–yJIœÓëª,çÀuU_Îëªu$K $‘ž‰ýâ*0rkü™(dÛfÄ{ŒÌ&ˆtîcó¦ƒû÷ccÒ‡2Ã)-È©f¢¸ oÏïd¯Q ‹7Éñ*Ð;Îe8*C8ýxšj[ÐfSߥkL>6ÿiUt[{²Yï"6Ûf“ï¨ûr\WÅ—×U¾ ¶`9‡ëª`)é«1 sw Øúf æyé¶½Ûñ¢@‡8cS~JF‰ üD'œ·'Ì‘ÑéHˆÁÄ4ã3_Ä{ÿÑï6Hæ¹øM¸dŠ žn<:üâY:çxo0$¿dlœ:ð{±­ßáø›ˆ­9û“mÀ"6[¶É$A4ç@ ÀÁuU–sàº*Ë9ÀsÆxÕ\3j½óRàçÃz¨yûæ%Ý- •É"Gk€N¬T£ üxF5ïu#úp=%t†±õ ì[¦$™ßËŠ4°/ÐOçö¯8­Z§Å£4Šb/¶êÚÇ|Ä\j‰g?ìhà£Xc¾ß>Ë,b±M~þws‚ˆMĶ›É|œ áº*Ë9 G×UìÇ~ÌÖUƒr3j½S™A„Á¼,n5Ü—Qb3;@Gѳ°\BzïpG¡»”¤)2a¥¥ôÈ6ì7±½ˆMÄVƒIÙf "¶D31©™*Áo3›Ú+Œå¸®êË9<øàƒo|ãqmРoÙ4V^P34ð·µ¥ìtb›ô¤«ñú±‰ØÚ2>9G+b+aqDl9ç¨d j`Øï…}o'Ož¼yó&`'VTñÇr\WÆùÀö/³ÎvÔÕpEl% Ý&2El"¶LÊ6c±•0:"¶mfóñzŽØvÆr\Wºa¾ï¿ÿ~+çðÏÿù?ÿà?hå…Š6uVwH¹í"¶†n™"6[Ê#¿Ï6"¶FGĶϧ¥²«¥¨©µÞ¹®ŠÜ"¿ÿû¿]q¿ú«¿Šœ#ø‚ƽá oøð‡?Ìréëªõ(LÄVÂÐm"SÄ&b«Ç°¬=[ £#b[{¯?`œ^9Û–D ¨÷GôG¿üË¿ èa9®«Z9®«®SÎaö}±•0t›È±‰ØfÛæOl‘ØÄn¹¶71£ŠØš0ê¾8Ã@N4¯Ö;/:^iœÅ}Y9®«²œrÈá=ÀYΡ’…TÛ¨Õj¥ˆMÄV·y.9ºæˆ‰‘F«ok}Dl%ç¬d¿ŒŒHÃÖ§ˆyµÞ) €… ¿î9\¥4º¥áË9`]•åð'r]uF9‡»}eì¬Jˆéy·µNqïR®ü +\šˆMÄvÜˆ Þ5¦y±wÊþÊáÁ÷ ¨aI)­7á8¬.,–s€ËÍÖUYÎëªVÎaöº*V‡39ܶ9± o‘*ÖC’%ï òÍš¡ëÌCëK2 APñ‰ð„6¬»'FI(KùKùqÒàáü·+ðYÜ…ˆMÄvÜ/†ˆÆ%Mäc;î|=ü•³¨ü€€&xÍÓHAQ~³hF®«b´,çÀuU–sàº*Ë9Œ^ ù±®ÕÉ—Û L °² WAõw_j=(ÅBUV¡³)pÖ’5CƒºXàEVJÀؘò·³0z †´ùË"6Û¨MØmƒ†ˆ –ÂjØmn5†ÿ¹Ôªèn˜M/l´¦çìZLÀ9ô?­¼å¸®j叮дÀ8ˆPV¿ Šá×ì…ÆÍ€Û¶%¶¸ÐSP}´úgç¿©ü÷•V±³ú'k›²A@lôêÁÍæM¡˜˜RJU>¶­ìÁ}[u¬~·Õ@CÄfÖA>¶mçŒzßD£Á³k½órP,Hä/mjrrjáº*Ë9 pè î4°ÖCÄÿ ¸­6b#0Í#67ÆÑgFwšýxÇ›'°ÎÆ< 8*[¹ù¼\²ˆm¹›” b+ño¢|lM> z4—ÇìZï¼hìCÀ÷KaÉË”«äÞÐ@±ø‡ØIl·mKlØ€‹ñ€Ÿ¸0ÛœÄê ΂ی[ÖøC,³uUO`\¥.å)b«yò‹Øj¾;ÇV'±á¿F£ÎÍò±œ]Ÿ€Sp&a“ÙÀÐFÆ/+ޯ֙ѣ>ݼŒ´sÄf܆ô¿?ö‰ÿž%Ê´q³†„ß +4Šx<ø1¨êŒÀYžºg¶ŠQqÍÔ†ç ŒaÃ#gû¸_Û9—xáÙ›iC[…¶h!ÕIlpËûí®Á3/b[cf¨:4çV'ry`˜ØÚ…µÂÙãÝi~ÃÜK/½tûömÎ?ñ;%û× /¼ÐwbÐÒþ´ö<œÖŒ‰iáàWÃB*CP·õ±y ®b•w€ñ¿SFø¿¨D«h1X1 16‹ÇãØOó«aéÓ–SûˆŠÄfq 6ªÍ³“ˆØDl³m]ó'ÖIlÃÿ–‰ØšŸvº€d ÅdÍãÏdÙ¯6 ÜiAFË—/ã;ÒP‰ž9s&eŒS87ˆå‰}/ëú‰'ž¸ÇW¯ú®À±ª‹@Ú¾ÜlÛ[¼þˆJªI[7uU”ÈìZó~µÀßìK#uæ!‡L2™VE§>Gk¶—mMmWÔ—ˆ-»Óµ­¢)ÞòPFsy¤,˜+ NtÚÇa8Hîlyýúuó–§.^¼xòäIà‚‡6žè[z›wïá\¼¼£îÏÿüÏq¤“ ýð6$6U©ñ”6•Ø ŠÁžÇ‹{×p~¸`ù2 04³tnÁÖ·Îl %ìä<™ò±ÉÇÖ²Q_6vÛ<«1|–ˆmÙ¬ÔÙ÷4oÆzYΉP¸¦|âÙ8£G'‡Å䄱u¶Œ×1Áj—.8qàöÇç‚Õ0˜»wïOš ‰.´€®˜ÏÖ˜i±YBµÀÔ¸ƒ-`Ä€Øgê½tpûqœ([ÍfH>¶šïNÁ±µHl%+¯L[Á){ Ñ£¹< †%µÞ©ÅxÉ5Ž`èóœÅž­DbC¿\ß47[:±á\xép.~›œ›7oŽNŠm‰|ÆePþø%QC:ûÔÞÒunáÚhœ’q q`AL`ΖtÈq„¶€ËöñpdÛ­lò±ÉÇ6ú¼ï¶ˆ-/«Qšˆm·Ì*–’Y-é† `Âö|ߦ3£G‡ñ¸_M'6ºÊìÜIĆïFh3t½-ÛÍ‹5£ð;p€á£¸´Ž˜ ï;·ñ¬ÀˆáBSƒƒ ç RæB&rIJ`W\þå‡)aBdŠØDl£ÏûnˆØJ˜Ûn˜ò–²5 k—XRîáÈ”òì,0?Àa\‘ ‚úþôšC¿0Ê.@`x¼‚8 Á>6n†ݾfÖ@l%LÍeŠØDlåÍp­=ˆØJ˜<[­ó½öq¤€M£Å4—Ôz§ ☆¾XÄFr2lJ÷±u÷Ư³gÏvÞ3[ß§ñ)"¶†n™"6[ív¼ÜøDl%ŒŽˆ­ÜŒÝ·dÔ‰BÀÁð5.©õNÉXuEÀ/Úércãa3÷ØhËØÇf¼5uU”Ûà¸6Ú鄱•0k•ȱ‰Øöý-0tu"¶fHÄvÜ'jÁ•§ Øh1ø”þãÓ †QÏÉ ~ÁÑ–66$ò˜½çÚ°·3dµSò±•0t›È±‰ØR¬Ü>ÛˆØJÛ>Ÿ–’W•’Ë#%"atŒ1ó ïŠå0[e(@Ê>6x×ÐÒÒª¥ûØ‚uXD‰&îf±•0t›È±‰ØF­ÜnˆØJÛn˜2¶¯ùeʸŸ…µÞ)0¨gÀƒqQQßû(±Ùz(÷–d~ Z:±™?ÏF˜1*b+aè6‘)b±•1Ã-H±•0:"¶æ~-cD™)„mú4¶#[Xë2/]º„˜/´ÈU ±A Y*&6«dÀeSzׂºÃ5ÌÇík>Ÿ/„]ge±•0t›È±‰Øj±ÝëCÄVÂèˆØÖŸÉöPCž,wa­w G. aàÉ­šHl–q#ð±ãìV´õàÙEß‹±¨ôÌu¦ó@ÜÐÖYŸž×ž‹Øâ,eqš4N®F›ƒ”lL]‹Æ}9i}90cÕ™,-I€-’Õ…ÌÔkA²7ŒG:SÊ1áÜ@/¹,­ˆMÄÖ¨µÏ0l[.;âåˆØ2L͈H\èuƒ%ª*Î 'ÑEƒ|¥©àOß·ôBãŠU<2û^Ä»@x0N~º±±ËøŸ— â6V蓦¬Þ =2Ùz‚¸A_xª³ ÛüÅ…Dƒ!¡SÉJ2°A0x•ÕH°² ¾FšY-_ÚÒâ¦K¬®ˆMÄ–hñvØLĶÄvô+bÛá£Rà’Rry¤$ÔMZ§—î½ ‰nЍÛäò±Åµž€_DsqØâ"QÞV =øÊÀ5H0ØÂ›¸R»ï¥³è'Á˸0&¶ÎzVA©ƒ¾r¢ì݃©Õ!µawVGå‰ [‰ØDl-š ¶mfs;½&ÒÒòZïTIµÐ4ÚŽþ&´4±¤Œ±F‰>¶ ´¨·'Ff}F¦Ø<úØÐd_’®È_x'±±2}gQÔy¶WÄ&b›üüïæÛ<«1|–ˆm7H‰ ¹uëbë£.ßÞ0Ô"pd=g˜_›ˆm¦ØÁiïz×»ðè•]P즇.!¯€Jȯ1šË.¯õΑw®«¦D<ä½ðÍ¥•&6úÕ˜€ctU4ÀœÅðR íÜsûØèÒÃ@Íï'ë\ß$ŸáûñéBLx'±q·“®dváÁª(Ï2Ÿß 8ë¶Í&tÅ'æòÀäZ² "à ÈÍÛ¹HZ±Úò ­4±ùXabÃ.~M;éq'Æ/šôbù8Ì¥ÇFžùâi£8°KŸñžþÂã}lô v¢álÃ+b±å1 -J±Í6'ŠØZ|J91ê3K­w^K§/ N>ì+}±µÉ/JlL«aá£>¶8sŒ‰ÇJ0š±”õÒç óË©)‘±K‰i°³ˆ‰vá1±1M‰%ÉblEl"¶ÚÌËzã±e1"Ûz3¸‘žÝfYj½S%Ùq3âàÅ÷¥Ò]"søÜ¼ÄŸ×±&o®7ÞòK|OCÁìkÜvÆãLZæm? >*ô8J±ÌµaÎò©¹UŽÅ‚¨‚ÎXQ.øfÜÍ&b±•3µK±‰ØjŸ£íïÚµkȯ1zé˦)¢p€(ßróŒ(ý‰2S,ÏrU£’«AFbã¶zÿ$#Êtþ˜µ±61ï÷â>06Ürä§À á;Ž'h“¾*Ú)™”Æ5PUpá¶hÕPÓæWÄ&bËeÚ“#b›a2FO‘­½'¡Øˆ‘ËãÑGMþüyäiKi9Ú€‚WÐ,Wv·ÑÞ;×ð] bƒó>6Öí¬:Oþ:>¶ÑgR8ÏÀUÃÛ¼¼sn’ðr1¤Œ5 ¦ŽSÄ&b+a"Ú)b›j/RÚ‹ØÚ˜ýåG‰mþˆú öþwv›˜S7eÈXZEÀA¼cóŒô®ùñ_½zß¾(ñžrQ Ûäò±¥<þjST"6ÛBkÐðé"¶ÆEÄÖð#‘oèé¹¶|7Yˆí‰'žð§ÁÓ†o_8Û&Ëš~‚ˆ­„¡ÛD¦ˆMÄ6Ýìå [ £#bÛËó1ÿ:àâBTfJuxà°ç,%I[Êh:c êÌèï¾}áiK¹®…mDl% Ý&2El"¶…Ö áÓEl%ŒŽˆ­áG"ÓÐsy ·ô–£Cë‹-ÈØÅèÒpôîÝ»é§Ìn)b+aè6‘)b±Í¶ÍŸ(b+atDlÍ?Ë. } 2o4@g¿•dô4ŠÒÕ6±¡k[ C·‰L›ˆm™ynùl[ £#bkù™X:ötCÔ$öœåªï‰¥O¬ÃÒÒg—^ö”óá]Ã÷îÅ‹§œ´¨­ˆ­„¡ÛD¦ˆMĶÈ4}²ˆ­„ѱ5ýP,|z.ŒµÞ9àÎbéø¸äªÓÏ}á…ˆk너ÚÀš#¶8×Z KÈd¶‘:ZÒ…ˆMÄ–npöÖRĶÄvô+bÛÛs’v=^®¾SsÕz§üÎä ˆi@š aÚð‹·Bp(6®áµ2®áÂò[_*Ÿ¥–Éfƒ\kAVÛ8å,Rà2߬eÖeûéL„ëÇÃ.†ó÷Ɔ+Èè‹ùŒk£2yzœ81mï$#,b±7UÕvÐ"±¡ÆKÆš'“ŒEbc[µ¾ÜÀì K ùL,Z•8Ú>w]úvºÄŽ–4ƒw¸¶~‰ªMˆ à¶Jj•£‚²N¬U…ßÌš VÃé÷Âi?óÙIĆS`$AQÁOŸùb¿8…ý5š¿ÃÉRTà3TÊåËD+Ú×LÄ&b[bˆÚ>·9bƒ5ÁTGYh²Ÿ.bkû©˜>úIÛŲ‡  a£îÌ£;ýʲÁÈÐMpm+b£«Ìÿ{9@là³ 1íkU™¯.ÅÇ9é‹›„-…ì×—–ê+o–Óˆ £±e{fúÝ·Bê¢B ´El¬ ,b«p"|HIk;u’±Ö;å?÷ÜsØÁ÷UUFÄXðÉ¥›Í¿ZÌ ›²*JÿYÀ[ÄÆUÔø¿GÖw‡éãGÙ‰ G ;"A’äRˆ rÀ¦8ůjU´a±Rlíb"6˜X@Ø‘V ¯›M>¶Úç}Öñuº¸:{ÈXëÝä#ûnœ§·ã²^÷a 6Yç M4·éúûØHlä-C¢bóX˜#¿xš—Øàº0§V~>‘Ø0lr§­–°ÕZÅC b›k ?¯!b³¸%¬€ˆ­ñ‰¼Ùð'cf¬õÎ îë½ã6ÓQoEl0,ð9Ùrç0±õmö𠔉ÄGt:Ò8ž ¸ÁŒ¡‘"› È4§#ÐÖFKØj›ˆ­‹²Ñ"¶á½·y‘k¡4ùØ6šÎkw;iGZÆZï¼Î¾âîÙ;Z[­úÛØü^´ÙÄxš´*ŠÕL†Øý4ûÆñÄ›Øl+ûµf}2ý2±_±˜Ë÷DÊÇVH±µ‹±-„³ÎÓElµÏûã›”Ë#o­wÿܹs7nÜ.¥¯PUŽ+nXƶÄfk£ÃÄÖéãÞ5û(ÑÇ–y0°k}¥¯ŠÒÚÚ¨ˆ­Ð3#b+¤ØÚÅÖIlAúŸ€ŠJX¼Ü&b«}Þ/°ß?1ÕYÞZï{_ª^  ^‹¯ooòwå^+üéýUAæ®2†á”oC7•Å„BƒL}C8c°óQ £tغ¾ˆºÊx£2ƒP ®Rrö¸~­ŠÊǶ7ó”~=um„ýˆØÒo¨Z® p n³Ä¾²‡m‘†jñúÖIǹãfy‰~¯ “E×F0ÛIl”‰³m5n_ãA³Å¿óŒÿßÚ`Fé*0§`2Ò•O¥¾œ$3ž%ð•ˆë±‰Øvl©F.­Zbpz•ø¿M>¶ã>¯´ƒ‹+ñ¼I¡ ‰2ûiÙ#ÇS³ìý_†S†V~CXLl\ 6ÀEá7ÈŒ9xãUK§|klM³Oý›Î­lü÷˜×n³~=’dv¦;aú_ùØJ<Z-¡ÕdŠØò²¥iU´©?wˆé¹<ÐRW ÂÜ®ºÏëÛ‡}up¼åík7Ò²s8À#ä€NP N¦¸4 |c8żYm€} %ærC{bœw³¡kk* â <®vÀ#AA‚Àôa0Ì „k ¢GGeòºÔO_ êlÃ+›|l»±K“/¤EbƒYQ•ªÉwZ'äÐÀ•+WP`*QRöZïì·/[oÞB¥‰×ØJ³Ä6›9fœØç›!ªõSDl"¶VÌNþq¶Hlõ[ùØòÏÔ $NÊåñ–@(‡"D4VÆÔ±U ÎU‡Ð:±ÕoôV¡ˆMĶªí¨ª3[ C#b«j’g ª€À°‰-QZ‰*ì}™;püá‡N,BŸ8þ5±•0t›È±‰Øvf&\Žˆ­„ѱM˜‚-4Z ´Ç«K7´p[&ŒQÄVÂÐm"SÄ&b›ðä﬩ˆ­„ѱíé1™šËc*Þ%êª/°»åà`à å³™ˆ­„¡ÛD¦ˆMÄvL#vïªEl%ŒŽˆm7O±Ó?½Z9Ú#U[\š}¹B +³±œ˯ËG[›[ C·‰L›ˆ­6ó²ÞxDl%ŒŽˆm½\¸§©Φ¶Oþµk×U$n<©RVb_»l&b+aè6‘)b±íÒF%]”ˆ­„ѱ%M¾êMÊå«)T‚} KHöj Õß“™\Øx(Î4‹´dA¶6šæ]‹?b&ÛÎ|iÁA$có¥‚Ülƒa¦·»‡1¡.ƤU R¾­™nIÄ&b›ivpšˆ-ÅrMm#bÛÁ£Ñ—G£ïÒʹ»úüv…âvpïâKXؘýß «Wùš¡´',¾ÙYÁ…¥P*Ê[ž¸®Y òÙ;ò¹vq°³VA ±Yõ*JöãaU¦)§ZѾö"6Û.mTÒE‰ØrÙ/GÄ–4ù*n„kؾ–žË£D­wª{×°ƒ­SU¨pPbÃ\Å·eþÐV&¶Àª° Tà6ƒ_Šñ;hO’ïRë¬[‰RJ`ÙxóxuJ´xïKÎÓÈsY¡+QNöf"6Û|CÐú™"¶ìElM?3‚= ­NÄ1(£Ç¤9¶-±Á&Þ/áê$=mÁj&=g¾;Ú{ü¢—«³d']n4k£ÄÖY]ŠçõæÁ޶zËÚ\%,gŠL›ˆmÒ³¿«Æ"¶1µˆ­Ý‡d†·¬<õIîK¥Û®ÚK|[b \_æ ãæ0nóF†K¥p•ùµH_£(–Hl}rè¥%16V8µrÀôºá'X½j-§¶±‰ØJ›‹z勨¦Ú‹”ö"¶zgüàȦæò€°µÞ9Fœ8q¢seV=¦N°5‰-Þ:;ØèBó‹Œ>þÀ6·qé“k£ž®üé©oÛh ø ýZax`™gG®Øb=×¶¸uzûRLåŒ6"6ÛÔÇ?íEl3LÆè)"¶FŸ”ìDÀAúà ÕzçúVZH.}äGk¹±‘Õb/”ßÖ v¹±qÍ”ûú‡‰Í¶¾ñ÷±qø3üŒ QÏÇø}l>_™>GÍfb›ˆíhæë¯®WÄ–h&&5±µøDáK¯I#/Që¸uëB:ShÏܤ o®ñšÄæwåsy1XôÄR#°Ã3ÿ4#cĆ#¶6:¼*ŠŽøãCOcã9’kà®5;+n<ÉZNm,b±5g² XÄ6Õ^¤´±e› k š‘J­ÜÒä@e÷ÐѵTÕd?[›!—_7äö/c,¼!ÃYü'6HàÚ¨G1Ft.nÎØî–BlÄ2[ *b[ÿ‘¸oý.Õc øð‡Ïýë'/âÿ'ýdÔT ÅÖp5† LÍå™Es¡]ºt É{;G®Œ)74n³!±rw:ƒCqÜïu ˆÍ2·y?\gvÈñk”³}l_5^$,úàV­ŠÎ›“Kα-Ñ^Ãç¾ó¿ö“?ù†Ÿzãõ“QP)Ûð´8ÒÐïܹƒ„g“*©ÏHÿ‘®QŒXÖp05©oz§»o¹-±¹˜£3·©™+ 6sÔybÃAfкù ºþ\[¼Í~ðÒ+¶æo£Û-áBãØŒÒˆhø3þ(e ba­ŠjUt÷öª÷µ*ºÐ|tž®UÑVž¨¹<ÊÕz§ÒúöÆ)£Ç’Iµ±õ1s˜Á‘ϼ±ÝÕ¡Y mâOœÓUP¥ 8ècNûªT™œbÃ00A(Œƒ'È‚}q%ŒªÉ±‰Ø–˜‚¶Ï±•0."¶&ž 0ð;Ã&¶P­wŽaÀ‹6µÈ餋Ú}ãÕˆ­„=‘L¯›ˆm÷öJ>¶{Y¼Wû±5ñDͺœ ® 8ü~øa$ïˆOQFt5v¶±­fýJw$b±-´ Ÿ.[ û"b«ÿ‘ØÝß7xxãà“K/6:U Á§.\¸víÚTjo±•0t›È±‰ØŽkÙDl%ŒŽˆ­ò' ôš4È;Þ&ÉGMwtž2ðѤ.ŽÜXÄVÂÐm"SÄ&b;®)±•0:"¶šŸ($§ÅzèTWÙŒ%ÔIJHÛQ.Oï¤6ÝXÄVÂÐm"SÄ&b»g‹^zé¥Ë—/{«ä\}åå?E'¼:O¼~ýúÙ³gÏœ9sñâÅ»wïÚYÀSâ#ì+xKXL[ £#b+1W³Èœ‘Ëý–Þõ?àó+šø-‹J›"b+aè6‘)b±Ý³9·oß>yò¤·>þð Å#é*>-ñ"œ=ñÄ €£X Ðް/Û&& {§"¶:¿Å±©×MmÒðÊÕzç00*t&„ƒ#¾7P椫q¬[v+·•@›ˆ-‰Ø@T,³Ä§šoƒÆÀ5œHOÛ(±­ojåc+awDlëÏäÑçåQ+ZëcHòôÓO#aôÒÔ`T"¶†n™"6[±ѸÐIëÐIl€³x)Ó@MĶɾ~§"¶ÑoÐõÌØˆÈC9ö¢›x+Àâúwa«Elë›ÁB=ŠØDl©Äö /“ÅÄÆOc“dŽ·Qb VE±¹­´“­„Y±•ž·SåÏ«Ú>ï¬ô± »ýJ÷ž>䱕0t›È±‰ØR‰®5®{ÆÄï„3oO±mò„¯ß©ˆ­ªïø¹<0þ¶ü4 T­J·­ F;,Ô£ˆMÄ6Ø^p›õ­Š‚Û+fk©£Ä¶¾ù“­„Y±­?“ûzD.¬lNOÑZïÌpƒk¸S¯ñPíEl% Ý&2El"¶WmÖ4±²i†ŒAüÓÃW?‘¿#ŽEp(^æZC:Þ(œ‡³¼¡ÄGLÒçŸ+mU› 6”7Þªêð<“$b+=oå#÷,’™u†aHX'Bs€ÉæQf¢NŽÙLÄ6Ï”Ux–ˆMÄöªl̰üD\³d{ Ç1obbCL(΂H¸yó&ÎâŸì€¨GŒÃ‹¹?ø‰Çíåñ±­ŸØˆkŸûü¾úµo<þ‘óxÿõo~»B;â‡$b+4]'‰…Ÿ ¸65—º(Zë—0¼ä:Mw’ÔØ4 b«Üf¦OÄ&bû+ËÆmjLäás§®‚ ºð–ñ¸Ê{Î.ÀP Á{O~ÀA4ÆzéŒÉð†‰ÜüËP¯œå­ŸØ€hW?óY{žñçÇ?ùTúã½IK[¹›(y^./ZëƒÇØNœ8ÑYñŸÎÛu—¨–Ã6±mb Kt*b±·cE,}ýÄ<ó"¶%·û8çbïÖ§^oéZïÏ@úa˜›z9j/[ fÚV¦ˆMÄv\ËÖ ±}ç»ß·UÑoÝyq[“1Ú»|lÛ>Qóòb”®õN`kê.ôU5€¹mUÚzïò±Z­VˆØDl­›£ùão…ذÊàle«ß²ˆØæÏÈÅgή°Nxæ@Y÷áèÑÅŠ9´[ýf3q„"6ÛqmY+ÄÆ‡1€¶÷¼ï‰ÏöVÍþäéÿúÎwþZßF¥ãζòW>;ʲt­w^úð&¹u±üM¨±ÛVÆ0{¿"6[&f1µElxø…h«|aô?}ú?ÿìÏþì<€ ?¬sÍØPµÎÝßY/à Ž[ºÖ;»Æª+*¾÷q<Ù²³;RÏåˆØ²“ÓVEl"¶z ËÚ#©œØ°} 5Ïg_üòWðÄVžàÃVEñ5 ç vÁ¿îu¯Ão,Ø!—ýÚ÷øý!‹ö‡Íðk®V¾óÂ… ˆí»ÊèQtžŠØ¶¬ìýŠØDl¶‚Y9˜ƒƒ3eZðb´a*{YE„@4s°y±hÀƒä×-jÂ(¼rb«Á¡¸·~{v+W`¼ ;ÍáiÃŽxxYÙ¿nܸ15³ë ó¡Ñ. IìOÿ µÞ9¤aÚ ±¦jfgíElyM܆ÒDl"¶Ð:!}.ø‰…ØSq¦Üà4Æ4ä ›¯ˆ`%ÔÍ÷µB6?øÊ‰Ë Ð-|\À!htC{‘Òõpä¼AØÏtîܹû￟˦Õ&iåk{^.\ݼ¨Òjp¡)£Ç }N=EÄ–b¸šh#b±…?ÊòåZý¨BRhO?™}õvúØÐEØpésÑÒPÏÊÌOµG³Û×Ol0"X ±Áµ†ú•ï`£ÉKå²)üCX6ÅÆs-›Î˜ÉëWól ‡¯În¡«Ãž"bk‚ÆR)b±…vŒ£ì(kI ÍÖFcbãé¬y€fpãQ>KWáO|ä¯c[› ¶”Ǹª6éÄfwŽ„–M§NûÙ1ž+Ôzçµ`Ÿ–ÂûVÀ•ÑcêŸ×^ÄV•…\2›ˆ-•Ø0W‚}l;+iŲTôœù"W>œÎº¥(9 9æÆó•©V¨%ê¯VĶÄvô;ƒØüMñ˦ØMeSäâŸ÷Eµï³f;ÉÖ©õNåcù{ûnÄlá¾ïlö«±•0t›È±‰ØR‰Í ·'±Ña&ëó±Ùª(·ÊAŽmhÃ{îiËn­ŠØJ…ÄæïX n$p—Ml¨hSêgIE©j½sÃyC”Ñc5['b+aè6‘)b±…vƒž0MÜÇf5®ÂÓøØÀjøLl¼»¦›MÄVÂèd$6›š\6…K†Ñ¦xsähÓÙ¹< ÏÕJ­zòfL¬:»éHÄVÂÐm"SÄ&b íxËb6^Lº1ºÍ¤€ØÀa±áSÐ`]˜Žÿ‘÷¹ñ ™N[ £S‚Øü¯;mzÀeSì ÃUÏó5.ñÌM}‡÷ØÍ^Ò: µ‡Dl% Ý&2El"¶Ð¦!“៌¥ÓË6¢ùmg;O]ø“k£1±‘ùL,WHí 3ÀYDÂ:vVÄVÂè”&6?7lÙôÆeSðÜ:“g“^à¸ÂeÎ+#±N­wªwÞоŠï8蜑@nï S[ C·‰L›ˆ­Û"ž~]/Â~3y›½â#öQ,ñ ír[ÍDŠØJ5‰Í¦ p„˦X3å²)þÜ_’Þ%[ÐÖ,Ü9¼â©Œ«™8v$b+aè6‘)b±­l=*êNÄVÂèlBl~VqÙ€ÂeS|]í#Útv.~gãµÎ³7¼â9\`t­[ C·‰L›ˆíhæë¯®WÄVÂèlNl~BƒÕðunk}Ù‘غ7ïY]§Ö;Ç6ZÃ`µB ótµË³Dl% Ý&2El"¶]Ú¨¤‹±•0:UÛð²ißF«¤Ù³b£%«Õz§>† ¨XÕŠÚW¼Ãe»±•0t›È±‰ØÊ‹š¥‹ØJ:‰­sÙiÞà~ÃjcÍ˦Kê€Plµ«C0ô9dkÙò¬<6[ C·‰L›ˆmeëQQw"¶F§~b –MQV˦Xv¬-ÚtI.QWöGj Ã5g³_ZÓEl% Ý&2El"¶¦mÑ¢Á‹ØJ¶ˆÍ/›b¯£M‘™‚Ѧۮߡw]Z:ë©s}åœgÏ<ó BY‰õPeô˜z³´±•0t›È±‰Ø²Ø„&…ˆØJF‰ÍÏ`l·b´©-›n‚ÃE9‡9\<^«å7Ý-7ÊsMZF-b+aè6‘)b±5bu SÄVÂèì€ØâeSø‡¸l òX'Iï’|£¢²?LÃ5ÝGH³G½Dl% Ý&2El"¶ã·w¿û׿M'N½å­úɨ¨ŠÝ߬‚¿ ˦Xøã²)‚"Ë-›.ÉåÍ/I´;ãÆaïüy'.¡ÏãÑ)~÷w÷þŸŒÏ¸Dm¥›ˆí¸öíCúðo|ðÃpùÓúɨ¨ŠÝ÷¬Âš#÷sÙÁ˜ˆ6͸lŠkؾ6{ ÝjµÞíoPÂ)wöåì{"­suûØÇÞù®wg|Æ%j+ ˆØDlë{Ѫh ÇþÎVEG'. Ѧ~ÙŒ2zV_ƒ%¹< sIæ¶yc-9µd7Þ¼!é¬@Z-aè6‘)b±×¾‰ØJ£›=?¶lúÀpÙ%Û'ù–k_xú C0ê?ƒë,;C²Nɨ[ C·‰L›ˆ-£ehL”ˆ­„Ñ9,±ùÙÏeS,nbÙ¿S–M—g»]??í¨ÿl8C[cö¢ÙáŠØJºMdŠØDlÍڡű•0:"¶`bÂÓÆeSøÞmÚ¹l:J?Ãó}ýÝý¸.ÀèÀ¨VN·ØìV€ˆ­„¡ÛD¦ˆMĶ[;5za"¶FGÄÖ7ñjŒ6—MtðÃÎØ¾ë—M ‚X^'Êl½äD[ C·‰L›ˆí V«ã2[!¶¯óÛo;ývüÞÄFLíTÄ–òDùeÓŸÿùŸÿ•_ù•ÙѦ£ÙkSÆ3µÍ¨Ko4"ajj?["¶©F¬Úö"6Ûl;Ðü‰"¶†IÄ6éÁ€{ì—ù—?úÑrÙ”©ÔÒ£M—ï~›4Z6nb´A?l«U\˜q ‡:EÄVÂÐm"SÄ&b;”ízÍŶBl›˜†ÙŠØÒŸ¨ –@‡Õœ€n@"F›KCx³Ò{ÌÒÛ׆¶É¨²\Ú.…ˆØf[³ÚN±‰Øvi£’.JÄV‰ؒ&ßË/ƒÏJÙ·Ó ‹¤Œ6…Æo¼—M7ÙÚ?ZA='ÀjÍDl% Ý&2El"¶ÕìFu‰ØJ[ÊDŸ´š ‡¼V¶l fí.M¦ cj›” ¡ë'™zGk/b+aè6‘)b±Í|ýÕõŠØJ[Ê5k¸lŠ< oxÃ~ôGô_þË9ºlš2˜ô6£Ë›¸ýÒÇÌ–"¶†n™"6Û1ؽ«±•0:"¶Ñ'ja.ÈÇ^·§žz A,I/–MáuízIƒ”åÎá£Kz×¹³5 b+aè6‘)b±Í¶ÍŸ(b+atDlÃÆòJíAâ ¬TrÙᙌ6å²iöçs´€2zd×y"¶†n™"6[›Ð¤[ £#bxFëŒ>HõÞmٔѦpæ!{Ȩ̔£ ‰\@Ƥ˜2<µЀˆ­„¡ÛD¦ˆMÄv\['b+atDl}OVyä‘%YÊ&ÕzGwX6E¨mŠmsK–MS’ôŽnq;®¡ÙúÊEl% Ý&2El"¶­ÍÉvý‹ØJ[çŒÎ呸Œ&B딃eSpÙôĉ\6ŽÌë;0Hä(𜺉¨f%4 b+aè6‘)b±•0mȱ•0:"¶xöe° lv* - •òÔ­mzÿý÷'.›bƒ>/ô5eÀj³\"¶†n™"6ÛrƒÐª[ £#b‹Ÿ‡å@S¢Ö{°lŠjq´i k¦ ]«6b㱕0t›È±‰Øva“f]„ˆ­„ѱ“qù/8Æàå*·©ŸË¦.\à²)ÞØ²iJø§2zÌ2?ë$b+aè6‘)b±­g8jëIÄVÂèˆØüyÜì[6Í ÑžáhmÄ"¶†n™"6[kæ'ßxEl%ŒŽˆ 3k‹H„†ßKfë&µÞ9` ö´uŽß–M_ÿú×ÿÈüÈ'>ñ D,¹L[Z"¶†n™"6[isQ¯|[ £#bK‰¯}* ;úK— íFŠó IÚ>ùÉO¢%\‰ØôÆeÓ…:ª5˜¡[ C·‰L›ˆm†ØÉ) ÛW¿öM ÄŒNElóòÜÕhÒÚraŠo/¨ |¼Œ6E¨)£Mñç¤$½å.G’El3ìX§ˆØDlÇ5h­p j+Ðvpb¬ÀÕ´ð¡ZaºdXÏ­F:І˦p¹Áñ÷pA˦KnÇòsEluâ׌Q‰ØDlË B«Z!6<Ø­à†zdbËBZõÞK?l)Ù:Òã!p-¶lŠŒ!Z6-}û:å§Û¿ü•ßûè“o;ýöò)¼7˜¸òÇOãHço†öhƒÆ1…àøç>ÿ…à8ÎÅqä{ÿ3`î8ž¸—xœ8òõo~ÛZ~ç»ßz Æß9òøÂãkì»pÄð)´ Ý^ýÌg­‹ø’­£NÚ‰"6Û&6¤ŠN"¶ÿmuÊa‰-cfÿ¤ZïÙŸ"ôŽ€ƒáT½ó6ØA2X˦è‚˦ i³_þ^ŽâÍ>„ßü¼ç} Á|ÄÇËþôäáGߺób`yØÞÃñÙï½Xv„atr?õôC!Á%ðO´|ü#çÙ€+6x{‹²ñÇqÄ4c¸Ùwá 4^¨aꇗïkïù2El"¶½š©ñ뱕 ºc[–\˜²YöÀOýž)¹ß–û±OŽË¦Hó†eÓ+W®hÙtö-K9q˜Ø€,ÀGp‰ bgÉ£ÓhŒ%À”˜Ø.þx@lFo†A”ˆâPÙWðQçØÐ]ã½%€'6ès¶¡¯NžïºïÂ!§{òH d^£YÄ&bKyä÷ÙFÄ6j f48 ±åª"•¡YîQ ‚ :;‚û ²Œ!`µK—.1ÚT˦…nî0±u@ļSfˆtÒ)Š˜Ôðô3Ll\OŒ rðC^€Yc#¥±ß¾ÝÀÅKN!¶¾ ïì#±-Ÿä÷-! -j@Ä6ÈFO9±_° ¸³ð(Që}ÒRʃ¦8á&ujƒeSt¤eÓyšŒÏõ±8Õ÷Œ÷]_ð!Ѭ3’{à{ók££ÄÆ…NïKóÂéióãìFbl×GlXç%ÛÀ…s´d¼Lô%ÛÔy.b›ª±´±â׌‡"6ìÄÂêÊ,|$à¥0eô]M–)±·lø¬\+¿£cò)Ö^¹l Ʋér ítÇ F÷±qq­@0}«„}Ćã~ß[°diÜãOO!6ŒÊ³”G«˜r¸ŠêØÞÓGl¤º¾=s¸® ø ÀÄ 'Ïñ×Ò·aNÄ6õѱMÕØNÚ‹ØfÙè)‡"¶,¹b#óÙ_Ó½p*c`ô‡‡ÍŠØ¦ÎgÛTí¤½ˆm¿f48±Á÷˜Xþ0”[jL[J¶Þ,UíÇÓٌ˦*£Mµlš®ÌbóO:C‰»ûƒˆH’“_²ôk‹¶6šBl>ø€\åá)ˆfüôÏy<ê#6ޤsírxUtôÂã‰Kà}‰ØÒg2[ŠØ¦jl'íEl3€lô”ƒ[–\xRòŸ}Þ÷Ï¥ìr+:N/\˦“T=Llðuæ‹wwu®Š¢Y°tH—’Š€{($…ؼS2ƒEO-À£>b FëíÛ0± _xgèF_8BßFºØØ*VTÄ6éÙßUcÛ(~ÍhpbË•ä6¥TÑG.±jÊ.·¢ãn˦<ð—M‡óÉm5Î û&¶NëÜ·ì ÛäA£À€{,s›aJ§“ §{ ë„'2mT<6F›ZƒNZÂÁ,øhô©ÀÀÆ´)Á ¬|lS ùئjl'íEl3€lô”Ý[®(y©hó>{) »'"ëÇ ŒË¦@7.›b%WIz1a†‰âÁb(`?LigV‹©¨ÏAå[ÆÜÃõÄ€ØØ5{g$„-­‚Þ:.¹ôI*êäN^Ù‘Äf׈ƒAhBlÙˆmôÂ¹Ë ?èˆ×Õ·Ö,b›jÓDlS5¶“ö"¶QüšÑ`ßĆÝTHߨòg!Ær9³%q€b£L³ù6»ÈeS¤#F´)~<Útt ÍbÈR™c™Íl¡$;4 cÑ™Ô)ÍïQ#²øâ£uÔIcŒ–0áÁØü¹DCºÓ‚ŸÎËì[ÏzážÅP«qŠ» cÔÞjUT«¢3ìáNN±ˆ vLl€|ýVIOy<–WHée¸MJìg"Õ-L9 ð´1Úô°Ë¦£Äf9°&atŠ×}lYt"b±•3•µK±e1"[JLeʤϵ .¥¯¾6‰‘)T·dkžë—Mp\6]s[õ•Nl% ‚dfÔ€ˆMĶ•Ù¾_[FSb¢öJl)[¾Ræô¶µÞ9B8 ±Ók4±YJݪ”K®° .˦ø Äo¼ßq’^[ C·‰L›ˆ­BsºÒDl%ŒÎ.‰-c$ñϲ®ºä!Á*!tTBU=FG;»9È £±åz^U >—&“#b±S.1zϵ¤•q'Ü’G ŽŒ^T=|¹äb+<Š 3ÚôĉŒ6½/$ظ®7j@3hÉ}c±/j±Ù¢$g4˜ œÂP¹0x† —€ Q)åóª­/OlÄ»á@ [®)-bË¥ÉÆäˆØFMóŒíúØ2æòHwk­ðÌ$‚c¢n…ï¸ $ya´©-›¢ÈléëDl±£+6žÒ¸é=póˆÍ¼P8Ápø‹Œ~$ÃáÜcÿxaü)ˆÍSIí‹9àOl)4F^Üé°/0P¾VEµ*ZÚ\Ô+_Ä6ÈFOi”Øò&ਡÖ;¼Ä´½ðÃaßÕhâzæGÆeSøt¹lŠ0ÞBIz'Ûhè"Wý¶}Ò•‡¡> u}AäÃeÅmañΰØþ¹˜‹Ç`„aài¡ <=FU^)eú÷1±Á//¡C%ÕùX¾ ÒøbEl"¶M]¦!‹ØFñkFƒF‰-Ñ•2õÀ=ø­³ž"ja›ô…ÎJò,¼ÞFOç²)’ªpÙo&-›Žr^:±u õùŠ–¨%^RdúŒNø‹3<–tGÑ0h@äŠÃ6ͯøÛýmÁV?*ÄySüp£öVÄ&bkÔÊe¶ˆmÔ@ÌhÐ"±%VFOœs)e E-l–Xº ž€Ö…×»ƒÓúp¶qÙÜ™9ºlŠ–Ø7°1.Ø€¶AÍ?û>" ?yÅÐjƪh_¿¢°Ë͇…úUËÙÄ!ôê[èlïZ<’ V4p4rT>"AÄ–ëñÔ>¶\šlLŽˆmžÒ±á ^\s7c"·…CÂw?|6)ì±$ÏÂîtzv €Õ‚eÓØq‹6À¼P†¡/-K:±á馧Êg£µägt¶u:“˜³Æa±‘lÀL~‰ýZÂoyâqtÈÙâìT›ÑUxQ@]ÞK‡kñj±åz@Dl¹4Ù˜Û(~ÍhбáK¼’‚5)“ÒÏ,¥å m9,q£Û V}°eS¬™rÙ„M§hŒÄÆW§³m±}ÈmX Äoˆ5êKÿAºâ² Î5Vü˜Onà#z³Ø/|¿!òƒdc¿$Ú963¢êD:®ë°¼äx{_@lè--fÂöáÙ.‘ή.VNŠ±Õª¨VEk'El)6bj›†ˆ-o.Jj½óyNϬ–˜Y÷¸f¢²+ç²)pœË¦8OlζIÄf»¯ ñÛ³€}9úñâ7qzœÖßhà#z¹Ð€ý;·…ys„‘0¥-~®¸ÎŽpÐïÆë”Ï}/X'Å‘8á\h8Ä @&1×Ó!¥á£¾Q¥ÛX›ˆ­2ƒ´âpDlé–"½e+Ä–7> o¨é‡ƒÁyJàgÞá…ÃÖéS5ð?ÿçÿ p­ÓÙ6ƒØÒŸwµ\S"6ÛT+±Ÿö"¶¶¦ bËXUÅZ&&ìöóÌïëJàIí#6ïl±•0t›È±‰Øöeæ\ˆ­„Ñi‚Ø÷x%ΦŒuH{h†,_X,KÙ™—7BvùÈ%aª°km€ØlgÛÇ>ö±‹ûD‰‡]2WÖ€ˆMÄ6ÕJì§½ˆ­„¹©ŸØ]P‰½¶ÔÀµÑ|¸4¬™bå4ìõ fëk ØÄ†L¼È,c/ð#—ßûÞ÷ŠØJغõeŠØDlëÛ™Zz±•°8•[Þ[é)j×™ôéÞ¾Œƒ×¹´MzA íåË—_zé%öÎ?ñ;LgK4ö¯«W¯Þ½{78—'ö½Ø5~³A|.f`çG¾¥VEKºMdŠØDl›XÂ*:mˆØ†k ob;ú:­™Ø²gßÈ»ººð©H¯4…•S„ˆ.ìðyûöm^,ÿJlvÀX’Á[1Ûq9Õ_xçuQ`‹£&t ˆMÄ–òÈﳈm‰íè;·*bËîRÊmºüÑJÏÓ‘^—¾r †%Q®2aÇjÄÆík„¼Dí•&6€”1Ö(±ÑÇ”õÆÄȬÏÂô›'°Db ê»wJ¸"áÄFOÞhÔt;,b±%>õ;l&bK·é-ë!¶ìtUU­w>éרŒ3LØ0‡qm”»Ê¦›ùϦ®Šrû=|}N¸àJK¹„«¥ä›x#¿§À ·‹áMy@fê+6O+Ä6 %ß Ø YŠ>öÃqHfÄl17ÇNbó®»À ú g3?$ò\¼TšnKã–"6Û ;¶“SDlKlGå>¶ôbM‰³9{)ÒÄ~šMÊß›}3ßòñ×/a”ÃHNÈÖ1ÚÒ.y L"6F-0£[gÈj§JKhÌÞaø3€0œ !å ½mÏ'3 ;¥‚Â$ø³F#:=y}ÄÖG]¾½a¨E0ÄW½ÜÞŠØDlõ›ÍR#±-· ±„|lp†!8Û¶2N —ÓwÔ)£Ç¼™0Êa¶6JtÍîAÒ²µÔIÄæ]z8‘Ë£^Tß5–&6úÕ˜€ctU4°8‹á¥.øÃb p@Íï'ëó±A>N´Ÿ.ĺè$6.ãvšJ`¨]x°*ʳÌç—ËÒŠØDlóLÙαå²#^ÎæÄ†¹ˆå̘Ës=½úÓj¨ôá‡N) š=¹Éj׸yG£Ä†¤¸·l”ØâÕÌD›%cóu®è®ã²ìÀ«4±ùXabÃ.~M;éq'Æ/šôbù8Ì¥ÇFžùFWE'íãÒgg¼§¿ðx=ˆh8ÛðŠØDl›[ÅÍ b›m8Nܜز/ÿÕVëLúef¿Øì‰]½ãbàÈa1±a“E?ñ†®5´ "Ø…µd{{Ùâiß(pÍÖI7ñ±1­†íõ±Å™;`L<îPB3Ü÷Òç óË©)‘£Þ;kй˜hÓ”Á M®ˆMĶº¬¦CÛBóÑyú¶Ä–^©)qÂc‡V@[bûušÝ¸q!¢)}aüpÅå] Néwm@NÀ,ï9óÚ5ÚÚhÐ2( êòõ©x:»è{Ñžc´A¬Uëz •n^|N\[Äš`¼¹ÞxË/Aò=ͳ¯qÛ3i™_@´]ü€ø¨Ðã@(Å2׆m8ËKläEçV9?0®3V” ¾Ã“Œ°ˆMĶÓ:ç*Dl“ŒEbã ‰­„3©ªZïœå“êT¸ýnγªsh #±q[½ÿ ’e:Ì€X €uâý^ÜÆ[Žü8á œ`ÇñmF÷ÆÙî·Nɤ4®Ú¨‚ ·EÛÀN„š&ZTßLÄ&b[` ?UÄ6ÃdŒž²±•Ø\_—?4é–¾×mù¨$¡Z ä"¶ÑgR8ÏÀUÃÛ¼¼sn’ðr1¤Œ5 ¦ŽSÄ&b«ÖΘˆmª½Hi¿ ±•¨Ë^Bæò9=)­Z…Âå„©¨“ØRŒ‰Ú±‰Ø¦>þûi/b+a×'¶¹<°ñ µÕ+Üþ…Mu@É”‡Ë3›ÒRmö­[ C·‰L›ˆm߯jèêDl%ŒÎÊÄV(2 ¶ZïœÇ×®]ChEâ âÌ›â$±_5«M"¶†n™"6[mæe½ñˆØJ5‰ {ð±ð‡JMy'MzfÚ¼ýK›äö«0ÜšºR_^"¶†n™"6Ûq›ˆ­„ÑY“زçòÀÃP"‚!Ë3vþüypXЍIÁ¤)Õ¦i ˆØJºMdŠØDlMÛ¢Eƒo…Øú¢Ù71£®FlW®\¹téÒ¢\a­wŽ{×°ƒ-ñbëô&^Ͳk@Ä6jµZi b±e·Íl…ع𻠳²±¥§MŸŽÖzçà'•™Ââé‰'RªW¥kF-›Ö@ b›‘á‚ép‡Xœem’Ñ[xú¤¾¬qçuÁ\^ìŒîDl"¶¦mÑ¢Á·Bl3ì OYØ åÝ(±Æºh‚þß“'¥…K_<Í26 I×J‚^å5PŸ ]ZzËìĆÔÿV] N–‹\²¬ `?A:\+úùi;sêŽ.2 /ÕòtˆêJ5¶ùu‡Sï\pÍT”Ñ‹ØDléþÞZŠØ2šUšØ -\V»U’ÏlR¶¶½=Ïu_+Mñ…ïÝÎ’S…® ;±EP`€< ‹öƒO}‰ObÕ¶bÁ4‹Þ¢ n•uÑYHÔN·²WL·Kš„ÀÚP*ŠÄfbMÂäò†eÀdžŽR¶‹ù^‚5Y.ìeÝSL‡¯‹èMÌhfEl"¶Œv©1Q"¶Œ¦¤ô>¶B+&mê_y~Oºäš/de½Õßè ¶³gÏ®3ÔŒ>¶`I4ÞÇF6 V .øadÚXä»÷Æõ™£abKÙ+d@QóˆÍ€¬óºx-p鉨²Oòû²K”À&4 bk…ØJäòÀ-sšeòOÚZ‡èxã°¼›¥k )§leƒw ಮáZ2[ì4"мø ëLlƒ>nPáÍïW›Glñ¸@)ë¤ Mà:¬?˜Mlì¨óºFwàͳ½ò±ÉÇVÎ:Õ.YÄ6Ïj Ÿ•}U ìåÊž`lRѧõ§2.9½úÖ“O> ÛúƒTS5Pãz(^G˜zú¼ö¥‰­oI†XçHã²)Ïê[7ĉ€*RÝ€­ÏEÇ-k´Tƈ$ECÌ”¥Ï>˜½.Û¼¹šr–|l)ZÚa[ýÄV(—fsµÞù˜Mò)"£BD³íøš. Î6øKnÞ¼¹Â 6$6æÔˆ]nFBŒ ˆ3nøˆ„bë“o׸ñͼ­ÃŸ>ÿÈ Ûèu‰ØÊMl[9ÝV-YÄV9±a™ïÔ©S‰[ï'MµI[Ä&I^ÞW%N¸EU9‘8þc6CÝÕ²²e$6nÌò6€;\1Dx¹|É–`]’>0ÚI'œ-wçc㚬åûð¸Žp±¥\$ÇÛþš\­ŠjUô˜óÞU‹ØšÎÓs­Š–«UyŒIKœ•_ËqËk¯  qV,Œb…te$6ò§«ab3jñ{Ý€>ƒ.Ú0é.sa0ÿ­&6âOáé^¾'?o¯‚èÑ`+žÁb¼KÏ>" _zI eM·Ã"6Û £Ò.Dlé–"½e.b+”Ë£Ü2k–Y>µh|8%K×RN1œ¡V¾}×ÙÊ–—Ø€,ž·àÊ jRŶ)4É„ªÎö ò š‹¤)…•±LIùbòybgwXÅGÌ6â 6Ø{^ÅÀGô _x.^ðM·¥qK›ˆ­œ™ª]²ˆm‰íè;7 ±]ºtéÊd>Òv0*IDAT•+Ù'P9¿]®¡N"0eôÈ¥öÒrPÞàÞn­«WÙ³{àõÒK/•îòó[öŒ%¬P 2K(JÄ&b[ÁbTÚ…ˆ­„][NlåJ|V^%ýÚµk¨FŸø´€>Oœ8‘¾Ý-Q¬šÒC ¬®(ÖC‘V·P_ؼÄ£?Ö@|h «Ò¢L& Î;r›ˆm£Qc/"¶¼Ö„Ò[¡\˜å@0ËäžšSmÒv·,#”…@´–A;÷´-”<|zvbÃj`ÞíY% Ѷ2‘þm4QÜŒŠØDlEmEÕÂEl3LÆè)Kˆ ic‘¨¢D&ØI i7™µ“ü؇xReôØäN5×ivb5jPH"6[sö'Û€El%ÌÊlbƒ“ ¸V"—G¹,!¹æ"<‹È—.M=Òu¥–"¶†n™"6Ûq Ú?ûg|èäϽýÿ°ò,@üÌ›Nàwåãäð R(vê¬*P9ßàÚªé!Ÿ(®…öS5¬ö‡Õ€ˆmº*Ñ©ˆMÄvX;öò{ÞóÞòÞ÷_üØ'ô“QP);uV•ƒªú*‹ØØtMŠ'M«–{Õ€ˆ­½ÒZ`-!Ÿé;Ò&°J‚Zí\y‰ I+:E}æ3ÄHÆa’AZµÎ6È^Æ,¸yÔ:úñ°‹á$jFϲÁY’6k6*3E!¹,­ˆMĶsk5py"¶\vÄË™Jl“RZLš¬•×zçµLr.*£Ç¤  ÆÔ@^bë«Ýî‹°ð@mAé‚ ˆ;>µjü‚pËÎú ~<ìÂW|·÷}¶Î—Là‚’ £21€¸Šº­1ÃüŠØDlÇ5k"¶&cô”IÄvëÖ- Kº‡iÒd­¹Ö;/dj©©ë§“Ô¥Æ{ÕÀVÄT &¶¸<(3Ðú4"‰Ä†ŽF͠滈˞Z]‡áYBbà =|¿"¶B”*ÁRlíbEl‰vmR³tbÃ^{@U‰\˜yåVZsMkp*2t¤ÇÆN]?Í5NÉi]›ýUÞI6@lô“ùjî´9` {µ">óYþ™ØX„>¶o„0Ö°J!6^)~{ò±zpDl…[»XÛ$KlœHlåryÌð]m2S§2处m›\‘:­S[yËÖFˆ­¯^;)Í×e·ÐÅ«¢é>6Ƕ¹NËf¼•Hlt×ùŠ«"¶Bƒˆ­bk+bK„°IÍRˆmj>‹I3©òZï¼–©}§VˆŸ¤15Þ·¶"6Ø Œ9φ‰­¯ì•ßî–èc„ÁÕ¢8ž¾BR¶ Ëf2 !Ê¯ŠØ =V"¶—QµS¼~ý0¶Ælƒ<¼ð&>ñúõëgÏžEÕ<?¾{÷®É„ž¡à4.qïEl“P,±q ±MÚn?éÖÍë6i$çÚ>ãP%ªu lHlX%4'Ùlb³…ËDb#äùïú2;6ì<3Rd³™ÞÉç×FEl…Û˨IŒÅ^¿þð SÖ#é íƒÑ/Â*C&Žbq<€B;B!"¶D$ª¼Ù(±-ˆÙÄÒáÔ §S J‰mT›íEƒÿi˜ØúV'gøØWE±mnªl‰3qU”f™2 ˆ"¶BÏ‹ˆmœØ@T,»Ä§šoƒÆÀ5œHOÛ(±º»båc+ÃÄV4ŸíTZÊ¡GDZ àÛø{‡×)s±ŠšØ^ͤ@y‰ ìÕ¹[ßJ¹ƒk£ÜÖf8åÛôE{ æ:·áSÏ(]¯oÿ6¥YÄÃ¨Ì Ý ×F-!b+ô$ŠØÆ‰ ˆÆ…NÞƒNbœÅK™j"¶xT¡ÌbC.G}´ÐcC®â§¯ yø-eÄ ß9`gÎRâ:ƒÉ˜Ð +Ú0Е§›’û6çͶÛÊdžÇPÄ–Dl/¼ð‚1YLlü46jæx%¶`U›ÛJ›HùØfŽûˆ {çQ ³Pêµúk½s2O h" péçTòj /±ÐG@3ø!`ùÄiÍÖF¨pÆ<´£ç,ˆ  —ÜÂc×<Ë‹t…ñðSÿÓg²…Vê’‰ké2ã”Â\±-œ·}§‹Ø’ˆ®5®{ÆÄï„3oO±•À£ evâ7±w>=÷ØÔG½\(ÃÔ‘ ·ŸZ´èž¿¼—&iÕj ;±Y(3ÇY-èd ÊØ)¶*·i‘–øƒ÷tªùpN€”U&`@€÷A¸¼ØÜFäâ…p”™ØÌÇ6,³³׎åc+ñPˆØR‰à·Yߪ(¸-¸C¶–:Jl%ní°LùØJ_LlEsyà·²n8uœE½’ë?nêq+ ” 6£™Ämþé¦*È´lºÀ¸þØÆsUºü¾––ýZ–* UQ­Š¾jF°¦‰•M³) àŸ¶¸ú‰üq¬(‚Cñ2×ÐñF±à<œåm>bÒ>ÿ\i×±±`Köç¿„À˜Ø°w ;Ø ÝÍúk½ó±¾‰€ƒIZqº³›K刭„‘Ì ˆØDl¯šÀÈ ßà'âš%ãÜc8ŽybBqä@ÂÍ›7qÿdD=b^ÌýÁHl¿”¼»<—4 ɧ‡½Ð¥Ç«ð%JXT/SÄ&b{Õj1ókXÞ fâð/æò`µ åGg]QJg™„À>mc%狚T[ ûRŽØJG3äl3¶£)£GÞ[ iÔÀ†ÄF ÃÒOÞÚ€{€A,H¬-’ä|µPœøØbÖ‘¡Õ’h­ ÀkÒ[ÞeWP-aTM¦ˆMÄvï‘fò[Ö˜‡YŠ5;Ø>´ÄÔÁ§8Ñ>ê#¶ +›1œOÕæÀ÷¸ÒWÄV¸"¶Vj½sÒ΀ËK¨¥É߇j ¶Àgf®)¼ ÖLIK\y´µQ_t°ÅË©°fÞ6Jl} ò) ¿  Ê¡®¼0*b±Ý3Jp€ùD¸VZj€Ø˜78+6ph€\¸;->Jó)sã"¤%LgCÄ󔽨p \ƒÌBÄÖÖ/„Ê>÷Üsé“vÆjºpµ<¸V&¶`!’«¢°X%ö‡‹ŒÞ‘ØÀI†<]¢¥õ­ŠöUÖ˜ñe齃 Gä¯ì`ÃE‰ØDl÷¬™Õ ¥i0Ñß6Ll¨pà×F;}ltÂYåxÊïþÀ›­ÆûØ:=[3OcˆUQ€‘OðfG¸`êw¶Áåf›ÞJ˜Ó@¦ˆMÄöª»Ë‡gÚbèðª(í ­.$6P pm…ðf¾El%LL^bk¥Ö;'ö®aÛ$>PFIêRãØØˆ\Þ oÕ¶¬ÅqšÀúÏÌ^n9;ž…Ø8ïccL+z!ºyX±Í˜ O¹oáù;8 OÆ[þ} ±áò¹6ºØ€kë$õ±•5“™‘ØZ©õn3jFzŽG}ôÖ­[;°!º„j5°!±Á,p[wqÁ1vù­i±á,|Êefd,›‰f×ÒWEûê(°G0"cðÛo¼óÄÉ´*ºò̱ÝS8V6ÉL~×?Þ3C›½|>6ŸàlH)‚gÒw${+1'äc+n¹ˆ­¹l3Â#𻯡d–ÖÀ¶ÄFâbb4@DOÝZ1±ÑéD°æA[€%WŸ¤3ò éèÕ³ßf*yà?ê,ŸU´jŸÛ«Þ5p’O±†•ÊøÅÖñþ¶ÎolŒ•S¼Ãäâ}ÐQÜ>»]±•0+Yˆ­¡Z3¢Ú*šýé“ÀÕ4°±õy­xœ¿û"+í#¶ LÓ@Røðà]‹Ó³õÕ5Àð±GvJ¦³°ï£FÕdj›ˆm5»Q]G"¶Æe9±µˆ2çλqãÆ¤)>Ã'7I¾KÔÀjÄVžH¦×€ˆMÄv\³&b+a —[CµÞùð`#¶£Mzš‹tuj\•Dl% Ý&2El"¶ªl˪ƒ±•0: ‰mFúÙU'MÔ<‚8¸sçΤa4T1éêÔ¸* ˆØJºMdŠØDlUÙ–U#b+at–ÛŒrœ«Î˜®Îðuˆ×¤aïy@½Ig©±40O"¶†n™"6Û<#°‡³Dl%ŒÎlbk«Ö;DH<üðÃSÙ«­©{xÔ} "¶†n™"6Ûq™ˆ­„Ñ™Ml-rÌŒljmÝ:®uØÑ•‹ØJºMdŠØDl;²L/EÄVÂèÌ#¶'çeS›‘ewâ¼Vsià5±•0t›È±‰ØŽkÝDl%ŒÎ bkÑí„•Ð'N äsÒóÓ\\Ť«Sã:5 b+aè6‘)b±ÕidÖÕ;ßùk?ó¦§ÞòVýdÔT Ŧ߿Fó\ÌöœyéšTKi S"¶MèªD§"6Ûq­Ü‡>ôáßøà‡ÿàò§õ“QP)›8«1Ø [bûJšÍ+ß~éÒ¥+W®Tr Æq4 b+O›È±‰ØŽc¸Â+Õªh £3iUt†§ª†ùzúôéçž{nÒHf”±š$_¥> ˆØJºMdŠØDlÇ5t"¶F'ØæíÜß|¾^»víÂ… S‡1£ŒÕÔ.Ô^Ъh ›VL›ˆí¸VNÄVÂ%[sµÞùœÌÛu7oõ¸O¦®<«äc+aè6‘)b±eµ M ±•0:)Ä6¯²S “k^ÍÓ«¨5\¬Æ° ˆØJºMdŠØDlû0Js®BÄVÂè¤Û<î™s³žƒ½k`¯©"]üz™j_­Dl% Ý&2El"¶üvæ…^¸}ûv~¹¹%ŠØJQbk4'ü‚À5¬oNš†8 e¬°<é,5–2j@ÄVÂÐm"SÄ&b»gX'Ožô6Â9{öì™3gü§—_yÅ'Þ¼y-!Š¿Ÿxâ ; BxJ|„}¯ qFûe¢Dl%ŒÎ0±ÁMõÈ#L-ÄYâîO•9¯*ü³¦ŽMí¥ ˆØJºMdŠØDlãÄüÂD¹xñ¢…NbCV-4»zõ*›Ý½{'êáMav$æÅu쯈­„Ñ ¶k½s*ÎËÍ1ï¬u&¿z9ŽDl% Ý&2El"¶$bƒ· >0ËtÚIl1“½ôÒK8ëúõëèCĶɾ~§ÄÖb­w~¯Ïy£Ù掃2¹RÛúf°P"6[±ÑÌaÖIl€3ì` Œ C¹6*b+ô ×&¶ØîIÿ[ü޼uë 3L¹2zLÕ˜ÚÒ€ˆ­6#9{<"6[*±‘º¸6[ßʦqÞ0±a"ûØVˆ]ЪèlÃ1pb'±µXë_Ÿ³Cæ¹å }gKì‘5 b+aè6‘)b±M 6¸Ð¸6v­á#ü,#lp³ÉǶÉã½I§1±ÍË:[ÉW,¾íðš:eô˜ª1µ/§Û&–°D§"6Û=CAó&Ãû̼{Œ>3xÚâXQç–5¼°ƒol¸ÍÇ.x†SäAʳýñO>•Òló6±5Zë³÷Î;§NšÙг¦æ)÷…-É×€ˆms«˜k"6Û«Ö heaž8d¾±Ø=ÆÌ1±×pœ«™øï}ZÇ#9RCDl£Ïóã9ÿæmVCƒ€ØšÞ}íkØÄ6õû^=¦jLí‹j@ÄVƒaÌ2›ˆíU[TjÌ£F óaÁ4:ä:ó±Ô¼@›QÞûO-[ˆ ‘gÙËçr+dΚØÇöï~¸ý´HlM/Þ¸qåÛ§Î=d0AÊ\,O=Qí¥B±e¡¥„ˆØDl¯±Ü£ìú¢u±µ?‡@6;ÁD•¢qðŠÃN³›³ú‰íëßü6@ím§ßÞ¢­ÑZïœfX =qâÄ ðjÚ§˜ý“À4 b«¶²ŒAÄ&b«Á¤l3†&ˆíêg>‹G›ØÚò±µ[ësqxRá`›±ïm›@½C"¶,´Tƒ›ˆíF«ë*ë'6³Í[£µÞ9Mf§RSFãZ“Н\ÄVleƒˆMÄV±¥)<4[#AäÁ;ÞqÄVøî?/Ò%SQ*¾à°$Z˜¥[ C·‰L›ˆm– ØÅI"¶FçSO]yàÚ]¼víÚ… fLðyœ7£#" LÒ‚—ægÞtæþª~Z×ÀOÜÿ¤[¿ËÆ÷íòªtQ£±• 6øØ>ò‘ßU~ j€hˆ÷œ:¼gžy¦i·âÔëUû¶4€h0½v ì”mkâ•­ˆíU­"<›¾nÁ@g":\W*ˆ6e—qj0€÷ÛdŠØ [ôÆ•>oûÝìÀÒr"ÉÒ€4 ìR"¶{·ùÏ ¿‘2 ¹Ùx§-}Z&Ô‚AÕ?WàƒùÛ²k#\hÚ‰ØDl~jÍ.~:¯’U¡Y-±Ò€4 ìX"¶—ñ]e¼…÷`&#¶Nω /-°Æñ,ßÎ×H`ƒø ³òÒåÖW¢4û±‰ØlRÁO†¸¥¥°ŠÌmíîÛËþXI 4 Hå4 b»WTÊ×°bSö&Ð>ëJÁfl‡>6x×2×*ÇSNçAK™ në,*Ÿ}4Dl%Ъ̸|öWBà•+W.]º4Cò¼…Ôéi@¤ÛËA*üI×ë¸ûÝltƒY%P¿‚9°*ç\ßA­Šb©uĶHl³ýd³3·ÉìJÒ€4 ÌЀˆmˆØ‚rŸ¬oÄÆÕL®.'6à ½}Þu7ãŽ&ž"[ †k‘Øfg¾}ä‘Güƀĉ§fÒ€4 Hó4 b»·Lé#¼­o›ñND{.eöÝ€t%tF*Ì»»g‰ØDl˜³ËÕÏ>1ûL–@i@¢[Ç>6î*ÞÇfóÂLg‹ÇÛéØ!ç÷Õšˆ"6"€mF–£Ù'šÌ+ HÒÀ4 b»¼iprJ‰õ5ž¾ÄÇæÀXQìŸ+=ùDl"6D æ`ÆLCyT‹Ÿq¢N‘¤i@˜­Û=ÕaáÒ²¯ÙJ(9,x¡±íc3¥óôÙ>6œDã…:ûv¦Ÿ(b;8±Ý¹s¥¥f$æ˜]!}rª¥4 HÒ@¬Û_éÄRll5Q† '䕈íàÄ6;nÞ5øØòÎFI“¤i@Õ€ˆmTEûl b;2±Ý¸qãܹs3f62z ×î ÏÜŒ¾tŠ4 HÒ€×€ˆí óAÄvXbC­w`qsÆÔŸ dF_:E¤i@Ħ9ð²ˆí°ÄváÂ…k×®Íxnݺõè£Î8Q§HÒ€4 ,×€|lËuؤÛ1‰mI¡D*̨=Úäã¡AKÒ€4PŸDlõÝ“UF$b;&±Í¦.eôXå¹T'Ò€4 ôj@ÄvÐÉ!b; ±Í¦.„œ8qbÞÖ·ƒ>`ºli@rk@Ä–[£È±Ø–äQSFFk Sö¬ÛžïîÀµ‰ØŽFlHç¤3¦;P6eô˜¡:" HÒ@F ˆØ2*³%Qïz×»îÓ«€ Ø çj×"eî¼)£Ç<½é,i@òj@Ä–WŸÍH“í8>6¸Çp€²T3fç’ØÒÝéi@¤> ˆØ:7DlÇ!6”{GÑ÷y}vlé¼ît–4 HÒ€ˆMsà5±„Ø^|ñET8˜· mv1+=lÒ€4 HÙ5 [v•¶!PÄvb›½ M=Úx’5Ji@8ŒDl‡¹Õ¯½PÛˆíK_úˆmÞ_²–:¯G% HÒ€40 ÛA§‡ˆíÿßÞÙ¼ÖuœqØ@Ö)Ô.þ(úÒˆ4­õ36éB˜,ÙxSÐÂP¹u1ni% **^T‹,´«H7¢YÄ«æ.íFda´0dã…ùÜŸ}Ìéé¹ú¸wÞ™9óÎy„¶|æã<ï{ÅÜ3ïTol–E2*zŒô÷· Lc+88)§†±UolÚm u²°$ >->l8ZA€À…0¶ ÕyÆV·±©*Çòòr؆*zÔù™ç® ç06ç >ÆV·±©^®ªæ†e‡¥m؈´‚ `l"ªóŒ­bcÛÛÛ[__K\Ëf…°i@óÀØæ¡Tá5[­Æ¦M*{«ïYk9!`8š@€Àü0¶ùYUu%ÆV«±Y6 looollT•èÜ  Z`lµDrÁûÀت4¶étª  æÂ«Ë-‹sa#Ò €æ'€±ÍϪª+1¶*Ír ¨V×´ÆVU–s3€*"€±UÌEnc«ÏØ,Ï4ŽŽd{aÕ@É;®… @[ 8ïÍ0¶ÊŒÍxJAðñ£Þ?Ì€€›—HEž'ÆV™±­­­íïï‡eÉáááêêjX[ZA€@[ÎÅ‚±ÕdlFå²¼ýV\f3!@•ÀØ* ìE·…±UclÆ"j»»»*rQ¾ðÿ€ 00Œmà 5<ÆV±Ýù–H²½ÉdVn7lDZA€@Œ-Œ›ûV[Æv||¼´´¼ÇsssskkË}6s€F@cAO»EŒ­cÓŽ½Ä–ÄÆí¥aƒÒ €Â`laÜÜ·ÂØ*06ã©í–í¥î?Ü o06o‹4_ŒÍ»±_Aûꫯ´E4R6Ñ  $'€±%G\æ^Œí³Ï¿¸rõ𾧬è}>Üy$°y"nNu–ëL€@0¶*¸øMx1¶^•®ÏlÆ&]›N§‹‡ýE ããÔ°Ai@F› ×æ[ oËclÆš·–㽦;ó† àŸÆæ?†Aw€±956•äÐ+hÁ5o©èôq¡ á `lÃÇ``lNm}}}oo/8gŒû‚Ç¥!  `lF€^›clMï®é ¶àœ£¢G0:BœÆ6x†™ÆæÎØ´c@º&ë ÎË ÁƒÒ€¢ÀØ¢`ô× ÆæÎØŒ;¨èáïSÊŒ!t`l#MŒÍ—±w Ø×çFú9á¶!Cc+&y'‚±ù2¶7nh‘,8GŒësÁãÒ€bÀØb‘tÖÆæÈØõ Zp†œœ,-- —†€ ‘Ʀ§®06/Ʀšò­ãããàô¢¢G0:B(‡ÆVN,²Îcóbl÷_~'ÇÑÑ‘*îŸ@<. !@ .Œ-.O7½al.ŒÍî[ÆàÜ$4… P;Œ­öŸq› c3VP{üøñÊÊÊHSœÛ† PŒ­®xÎ}7[ùƶ¿¿¿¶¶6wHO¹PÏC-w-CÓ€âÀØâòtÓÆV¸±éͳÉdbÙà©ãGu©›Œd¢€ p.Œm¤ ‚±nlÆ žváéƒÛ† P*Œ­ÔÈ$ž—c{òôÙÝ{ô=…`EïóáÎ#µ‡Î~d»q‡©ýè€âÀØâòtÓ›cûìó/®\½¦ïÑí*E‡±ŒÍøþ™ñH+7IÌD!Œ‰Æ6¦hwîÕ‹±¥ðªt}F1¶ÝÝÝÛ·o[òRû´kÁÒm!@ 4[iÉ4Œ-…·ÙMËc:á@çJçý‰jðÐ4„ t0¶tl‹îc+ÓØ´»S{<-©³¼¼ Œ@À ŒÍI bOcKaloÿùÆ›ÆXi‡éd2±kŸq4‡ ¢`lE…#ßd0¶ÆÖ« N*z„q£ º `luÇ÷Ì»ÃØÊ46mÕÆ…‘&%· @gÀØFš[™ÆeŸéHsšÛ† P5Œ­êðž}sŽŒM¥tž+ºhnè‘袭¸€Æ@cC”O¹GGÆ–b1,QŸ–÷بè1Ò"· @`>Û|œª» cK!mcÛÚÚÚÜܬ.Ѹ!@ˆCc‹ÃÑ]/[QÆFEwŸ & @ 3Œ-3ðR†ÃØŠ2¶('Ç—’[Ì€ÀØ@õÐ%ÆVޱQÑÃÃ'†9B˜Æ6p†c+ÇØVWW‡ÊÆ… 06aŠ?IŒ­c£¢Güä¦G@5ÀØjŒê÷„±•`lªè¡’¹GGGsDŒK @`Ô0¶‘†c+Áض··766Fš‚Ü6 ,Bc[„VE×blƒ›*zhMß+J+n€RÀØR‘-¼_ŒmpcÓêšÖØ Ï¦@…ÀØ Dîi`lÛÞ]Ó›ÞcËxƃ Ÿ06Ÿq3ÏcÖØtâ»v‰šÃH€ 0ÛX"Ý»OŒm@c{üøñÊÊÊH3Û† [6ÿ0¶MÏCuÎÿ$â @ Œ-ë¢Fz÷Ý÷^ý;ß½|™? ©ÀžèÝÝ]"ZT20@(ŸÆV~Œ’ÌðÖ­[¿Ü¸ó·¿ÿƒ? ©Àž0m5˜L&TôH’Ót @ j[Õá=ûæx*:ÈSÑÍÍÍ­­­‘æ· @›žç¦[~cÓÒšبèáùsÃÜ! Fc ý°clùmmmmظ3: 8%€±9 œuÚ[fcÓæPmµ†ö€ 0VÛH#±e6¶åååét:Òlã¶!@ÀLc3#üÿ¾þúë/¿ü2r§ ºÃØr›Ž7Ð! ÂH—€ 0Ûs Öõë×»ïþäæÍ›ï¼óN÷ÿðòK?é5üôÓOu¥ºj¾ôÑGm+uÒ4™ýIÓIï«wqŠdÄØ²=R$0}BŒíc“~]ºtéÎ;mfœjl:wH—íìì4—}óÍ7jتžþÒ“°ö'³¾˜'1¶lƶ½½½±±‘'¬Œ@µÀØ.66­–i LNÖ$Á©Æ6ëdß~û­Z}òÉ'j‚±¥Ð£û|¸óH*ÜýeAEZur_€2ÀØ.6¶FÑÚ³SMr¦7ØzÁÓÃÐæÙ(ÆV ]¥˜Ò¬±iuMkl™?Õ @õÀØæ2¶Æºšg£³ÆvÖ“ÍÖóÎ76=Ní½Ç–aïOE3=êûÉAŠÆ6¯±i ­y6:klzkMÿ¥ï½(jMËl¬±¥p£2ûì­±i¨v‰õÙf\@¨‰Æö¼Q±nP»kfÝå±fÍL+m³{Eõóæ•5}é ¶æ/í{lò¶îÞ…®Ã±ó`÷º{ïÁ<— ~Mר¨èQÓ/Jî€Àà0¶WjÕnóÔ¿Ûµ±Ù屦rǬ±I×ôóæi¦þWï–QçúIkr¥5[0¶ 5ëÖ‡ëW®^»ð².hM=T2WOEÿ„3@¨ƒÆö"Ž*¥ÖÔQk„¬» ÷ Z³ wj=¶FÔºHÚZKÓß»ÿÛVk“±é=¶¦UûÕ­å–(Ï\¼Çöäé3éšø¸36*z$Ê[º… 0ZÛÿBß¼£Ö{ë_ŠÖZWsi÷'³[Ô‰VÔÚŶæ=¶¶¡þK«q½]¥º¸÷5»í4z‚–olÿü×$jo-¿íníäädiiIu=¢G!@`´0¶‘†Þ…±íüå¯zÖ©—Ø|­±QÑc¤*n€@J[Jº÷]¾±µï¥ù2¶>ø…Øô[ÁÁgj€ àÆæ/fQfŒ±¥Ø© o¼ñ=¢¤(@€@—Æ6Ò|ÀØRÛ¯û»Ë—/4¥¸m@HIcKI·à¾1¶Æ6{JUÁ)ÀÔ @ÀŒíU´´‹SEÛ*¸úis¶A÷«©Ù¦­£úa¦ÞÇ©_ÚøÙž"¯ ԰鳭מ£ÐŽÕ-—(›06Œ-QjÑ- ¤ €±½ ªBh*&]ëV_Sù´æxƒžH5Ôºe;ÔCïÔ„6Tò³nŸÍyVêVàÚ»ò³n16uÞ; !Eà16Œ-E^Ñ' $"€±=oD­áÛUó÷ö ƒúÆØô¿Ý•°S­9¡wÎU·:îìíáñ‰âÝv‹±al©sŒþ!@ "Œí¹´ºkZ­EclÍ¡ÝÓßO56u«G¢íÉñMغõx{C4¾˜¡|®¦áÈØR¨U¢>y-âï&º‚ .ŒíÅ#Ñî[húgsbÁìSÑÞI ÝãGÏz*ª~zÆÖÒWóvm¯ù¡~’á|ªf,Œ-…´alüz… D0¶pcÓjYûltQc“™õ–Óš¶Þ††DQÇØRèšúÄØÒe,=C9ŒíÅÊVwmΧ¢MÞ4GÈ7Çß•I³klÍêZOÎôV\o7CÒÔd-…´alI“–Î!Œ™Æö¼§JíB×ùï±µIÓ<ߨäj§š™~ž¡¨G;mŒ có/>;Û«ý¡M%¶Þ«iú¡Þië~éý³ëgͳÑ9MëmºRïõ}¶s– &J)Œ cK”Zt @)`l/¨J¡´Ä%gê¾øßÔKë~5kczÚ[$kŠ«­œµ‹gÍóÐîW»34ç#QMcÃØRüB¡O@HDcK¶ôn16Œ­ôe~€ Ð!€±406Œm¤©ÏmCðIcó7ó¬16ŒÍœDt@ù`lùX5Ɔ±•L€Î'€±4C06Œm¤©ÏmCðIcó7ó¬16ŒÍœDt@ù`lùX5Ɔ±•L€x*JœBcÃØø`@€€#¬±9 VÌ©bl[Ì|¢/@HLcK ¸Ôîïß¿‰¯¶Ô˜3/@pLà¿9u³ù/‚ IEND®B`‚arm-trusted-firmware-1.0-aw-6/docs/diagrams/sec-int-handling.png000066400000000000000000005650621322600646200245730ustar00rootroot00000000000000‰PNG  IHDR"ÇI!ó@sRGB®ÎégAMA± üa pHYs.#.#x¥?vÿ¥IDATx^ìý ´\õyçùÒ7“;Ý“¾iOÆa|¿‰¾“ÛÎÄ«q:ŽL¯Œ“!ñ²Éa1c{9‰=ÈWÎê´cÔɄƶ˜¶ÂbdÇÒ`‚G"Æ’ ¿™%H‚` ,˜Lˆ_·»ç>§žs=ç÷ìÚµ«j¿ü÷ÿj}ÖYçü÷®]»ªtvíýÕ®:'ý_¼ð /¼ð /¼ð /¼ð /¼ð2÷¥þÌôÜwŽ?øØíDDT£Çž¼wi#›ðÖ™ˆˆˆr½¢¾;úøþ¥_•&/5d&Y×÷üîÇn>ûÂOüôïüÑODD͹äOI¶·_¸ûžxæÁ¥­pGY=÷\)+³qÛë`%‰ˆˆ(c îÈ*ÁJQ Ù—_œ›¿üþ&òñŒ™éû?øÞ_þÌõ_øß»òŸÃêQ;äåA^ÚùO »ÈK‘Ü(Ó‰®öFvîû÷Fˆjqá'~úÆ=¿{ðÈ­K¿`s_¦ÎLßÿÁ÷n½ã²òºô{_õ±Oÿ Õâò~6³à’?ý¥ûþË¥ÍtcyíÙpíkà¦ÁGn\ ""¢üüá§Þ/ú ½¹‰‰'.}xûYDT~YÀ…Ÿøé=÷\¹ôË6ÇeºÌ$7ßwþ–—\ûÙ_ÿ«ûþϺñ»Ïíÿ¿þá05á‰Ç¿ [Ú=wècŸþØ‹Ý|vCšðàc·_~Óáæ„ìtî¾ýc÷}í¶‡Þû§¿CDDDÙ“}yé—Ù €ÑÜÞˆ,V7'.¹á ·Ü¹ùî#·ýͱ{ç»D4ÑO< ¿2Ÿ?pÝ–ï€_(±áÚ×üÕáÏ,ýâÍt©š™îø/á?±/¼ê§nü‹sð럀£ ""jÁwŸÛÇÁ\ûÙ_÷[fqí®óÜwŽ/m»ç¾<ýÜ£Wìø5¸‰+o~Ç—ï¾î‰¿}ö;‰ˆˆhPž~üqÙ%غó]°«PïÞˆ,J7!‡Çr|ä[Àñ3MåoÿîÙ=‡nÜú¹ßþÝŸêÅ.ùÓ_šùͰ•2Ó­w\æoï÷>¾êÖ½ÿû÷ÿþ^8æ!"¢ö=ýä—>±ãÍ+¶ÒWþó»}i >ÇEo‘¾òæw<öÈaØÅ$""¢“ÝÙIðû uíÈ.¼ŸfËŽw<ðÄp¨LDszäÙ'>yÛåû];Ë)wÜÃÒ¯â4— ™éû?øž/ÇçoyÉÍ·½ç¹g¾ 9DDÔ­£ÜìßI'¯ {]»´)Ÿé"W—…Ø?rãÂ7¼ö)‰ˆˆˆÌ×ïõ亂o䝯ï|xûY}ôv86&¢=ðÄ[?÷ÛöK'nþòû—~!+_Ê2ÓÓÏ=ê?_mãu?ûÄã_€""JÇ?rþ–—ØvûÆ=¿ûý|oi›^ù"W‘+ÚBÎß|ʾ¿ºö#‰ˆˆˆ }ùîëdçÁv$fÛ‘‹ÜÚBÎÛrÊçö_ÇÃDÔ¿>zûW½Ê~?vóÙßýÞ·—~3+\Æf¦§Ÿ{Ô¿Wâ;ÞÌ÷&"Jßcýù†k~ƶÞWìøµ¥Ízå‹ÿ0¦^}Ob"""¢©È΃ìBØîÄ {#Ÿøó5vu9ÜåILD-;ò­G6^ÿzû5¼äO©zi*ÎLßÿÁ÷üyL7ßö8Œ!"¢d=÷ÌW/¿áOlç9ÓÕÿÏá~ê üœo"""šìBÈŽ„íTLµ7ò…»ÿÈ®(ºü$&¢Nüíß=ûñÏžø€ÿ꽸83ùx|ÇÁÀ %îû¯ÿ#tÿ(©ÌfWÙºó]ß~êØe$"""ªHv$ü¡«¸7rðÈ­v•ÞüV9Ð…C_"jÓö¯\l¿’{qAfòWnç—σCÊÏžÝÛ6^ô>ïð¡Ý0Ù¼é0³€yR&wMVøôÕ§”Çf&êµïÿý½—\ºnÌÏßrÊÄ¿H*3اl^üÉ׳1ÑœdwBv*ªï<ñ̃¶7òüÉêGž}Žx‰¨}þœ¦*½3Óýÿ¥]ÿ;Þ -”¥=»·½pÆIîrúêÓ`³cû~æSW½´/™éØÑ½¶æ²ÚZ—äÑK¿’ÑDO?ù¥ ¯ú)ݤ_ø‰Ÿ~î;Ç—¶õá"“ì¯ÿû?~Õc†ÝD"""¢ÈN…ìZTÙùþ¾·áÚ×蜿ûñSù^9¢Düíß=kŸÓtþ–S{òÞ¥_Ú1—™Éÿbo¼îgù™ßƒ¥©<¸œ¾ú4™çÔU/Ý¿ïf˜”¦Ã‡vkQ’¯Û®¾ÌO’-613Q~Ž>r³ýí¹’Ó\í#™Îß|Ê×ï…D"""¢™É®…ýí¹’½‘û>¤óˆ}‡?ºDÔ¡žxÀþöÜå7½qé—vÌeEfÚsÏ•z59&yúÉ/Á± åmãEïÓÔ¢—SW½ôØÑ½0Y¿n­ÎãÉÒ.&—ÂwÆÉ Nef¢,í¹{i§íü-§<ýÜ£K[|w‘A;A}÷íƒ]C"""¢9ÉFùÞÈsß9n{#ŸÙ÷a8Ä%¢ÎýõÑÛõ7T }'ßøÆÝ¶ãa{#ßÿÁ÷쌇/ßÿgpLKDI9ò­G섦»]‹á²”™ìƒ9v~ù<82¡€räÿö¬U2“\kíš7Ë<º½È²äÂÔ"ã2UÉœvæÑŽíWX'’‹L-,_%tmõ2íuÕžÝÛtõ––²|Gƽ©P>r‘¹Gr¿džýûn–=HBq†’©²p½z¼iXlá<ò½¬ü%>ÊɆk~F7õw܃nüíÿ>xõi¸‡JDDDé )'q²Ë{#ܪ#\õ*8 %¢}ü³ïÒßÙq8r13ù~üàC7Âa ”£Ã‡v[€ˆŸ>13éGÉ<š-öN–±Ü#“ [ÆŽíWØjf’›Öùm\/SÕ¢cG÷ú«oÞô˜¡œ®ƒ\ä½#²òV¾ÆE»/þ°EÉÅžE=¹Èl¶µg÷6[ù¦j-Ò©rÑ‚‡K.°XY%Gc™LÕ”¦3ËýÌ”_>O7õv¦ºýü탸ÛJDDDI ɦd—öF®ÿÂïèÈÖÏý6ÍQ‚>à:ýÝpíkô·.‹™Éúñ…Wý“ÐpÄrdŸœ-8m§<3m[~Ϧ¢ÂIrÑÓy€Ý¨|³vt®ÍV^[ÊYáÒËÙcΨŠl} 'Yº’¯qQzâ#`)Ç—2™_å=HmÞô:îŽÛÊèM[³æ+©ÆœdóOã¨|èFÝÚŸ¿å”ïÿà{þÿîûÚm¸/KDDD] u&²Ëá÷Fähô÷®üç:²ïðçàh–ˆôȳOØûæàãüõ²˜™¬_¿k “Ðp–#r\Rž™ôZòµ0娩71ÁëAru™áù§îñS÷ìÞ¦Sååk"_Íä"Ë—59VúiDvsg/œ“„Ý‘’XWÒ–é3“ÐM.…™IuªÌ“”]]¾ñ…H?Ð]øÅêÌòÕFŒuÀ©” ¯ú)Ýàßÿð_ ýþßÿñ«pï–ˆˆˆÚrLÆdÇÃöF|ìvý^ŽZÿöïž…£Y"JÓ‡·Ÿ¥¿¹·Þq™¦%YÌL·½Nç8øõOÀ Ga9ò'ù,R’™¬V$qøÐnA.pа«Ë +•Œë ~}*òoÊÓ‹ü¸~ÝZ˜ÍØ™Gq=…#xìÌ£qÀþÑyFPÐlÅæÌL…E̳G8Ö1U¾&”¶&º~×Ò»ää%aç¾é÷òçïÆ]"""jN(/ƒò'Ÿ}·í|áî?Òï·ìxÇQ²n¹s³þæ^±ã×4-ùËbf²ÓŸxü á …†b\9²sd’û3nfa‘¢$Ù<±tX×hl}J–_N®h+ YfL*þmq…'=Ù rñWŸm eªg¦Â"æMœÓf˜ù¦Æ`3šÁ­{—þéõ_ø;•õÖ/}w‰ˆˆ¨F!µ ÙŽ/þíÜüå÷ë÷7|iÇQ²öþœþæ^ò§¿¤iÉ_Núþ¾§“ÅwŸÛŽjh(´ïÄŠaçìÈŪи™…EŠø~1c!&¶$]rá$5[ĉ֯[k«*ùVxÜÉJž-Á'œêl òkUÏLotâœö;݉Zy¨.wü¨nð¯Øñk»ùlýþËw_‡{ÃDDD4§WHÉŽ‡í\»ëßè÷·Ü¹Žc‰(Y‡ݯ¿¹~â§—Ú’»œôôsêäó·¼$çЀ””£µî™i‹7³Õ¹”ôû˜¤¸„Ö2“8vt¯-M.²2þl¶&r‘I…–&»•©øD¶´ÂkÙbe6˜¤Ê¯nüêé]ˆ–& ¨ƒšsÿK;v—üé/Ù;¦ùùßDDD5=… ÝsßÒ_ ’½ûO¯=‡n„ãX"JÖO< ¿¹b©-¹ËIö¡k®ù™päC2® ýiŸÆÍì+FIï°‚—`“ZÈLÊG4ÿ9M~%åûrv&TÅG ²G¸ðZ¶Øøˆ©ò«¿¸ ÿØ\“°þ´æ±Ç>«Ûü ?ñÓöŽé‡Þ‹;ÊDDDTEh(4Ñ7¾q·íl¸ö5úýÝGnƒãX¢ôí;pF†CsÅÓÏ=º”—–/'ýÕáÏè´}úWÂ ÈÆñ™IØÇZËE¾7³U ¹”ô½º\âlRk™IX£ñë3qM U|"[‡ÂkÙbã#¦Ê¯n&.‡ƒ¹§+O?ùe{I0O?þ8î4QFÎyû9«_»z*—_z¹_›`!‹õóLtà®ç¾ç\¹âªW¬òd9»vî‚™‰’º Må±GÛNÈùËý'€ƒØþÚ²uëVnêýÜêÕ¿~ΚënÚóS¹}ÊC7yüýäa‡Ì3­CG’ÅÊÕç÷Þ“â‚«–þdäÑÇ÷/å¥åËIw܃N»~ךp\D2®ë;2ÏŽíWÎlC.%½#µÌTø&¾’•,QñˆäVJ®e‹·2åW7~9…ŸkNµÂÄ“Ýæ{¸÷LDy9rÿ‘sßs®nÿõâk‘‘c ¥É'´á ~ î:°ð¦…¥i£Ë9o?Gý<%di¶pùF%#òÕßâ´ÑЍm¡•Ð<`WDÀlOiÑÍš|sÁ† â×ÏYóŠU'6w2×¢‰®»i» µÙ˜Á_ýБ‡Þ}i£‹Ì?O’§Õnn°™éýל¦¿¼>vûR^Z¾03Ñ’‰™É>[.ÚzâÌþ¯•¼åÊRQlId¦mW_¦Ëô÷¨pp"ÿLü£ož]«ÑÌ4î¯ãQ}°é$H·ùîIQŽV¿véÈgÕ+VÁ$uäþ#6d&eUHfƒI%öÞ¶W¯%—Ø’ddiÚ˜%êXè#T ØpÛG‡Ž<¤éA¾~f×.˜ªg¾Èå瘙f"©>€r¹`Cñß%¼øòM:d&%¼M}èø“0µ¢ënÚnËÑ 33513 ÿ1Fr)œÙ*FÉß)³ybŠj"3É͕߯¢tøÐn” üºrUÈ®UX&6¯ò«{6§ÿ *švœÄé6ßÃ]j"Ê‘Ð4.3‰#÷Ñ–TX|,BÍ–™Þ´“ÔÄþEÔ¶ÐD¨v°+"à¶Þ¸°tÖç–­[a’Ò<ÁÌ43;h\fšó 3“ÐT8u¢CG²§Ø_˜™˜™h¬*™É¸\ g¶5nQ–od†ø¾­†2“Ì_rn‘½iîì…3ü¸ÝÙ’`$wGø‘‰€ˆwÜn«ð~ÉŠéÔqË´«OÌLUVOìØ~ŒÐJØnzD·ùî^QŽ6\¸A·ÿå5GO/j"3û&[1¹ÈÌ0•¨=!…Ps`WDÀlïøS™`’Ù²u«ÌÀÌ4³*™IŸˆÂgA®¥W/yŽÆÑwɉ_?gÍç÷Þîß‚ÇÌÄÌDcUÉLÂxáÌß7g™£ðlšæ2Ó¸ [a8kÉVF.…•jÇö+亰dÿîÂÂ>¥t»_q=e~[Cù¦*›abfš¸z‡íÖ•‰-Œ ×ô”nó=ÜÏ&¢UÌL»vîZ>\Í–™Ž?z\nº°[)ÿ®:f&j[ÈÔØpÛ;šäRž0Þ¸°ðëç¬AªH[}K2“G¸ðã½gÎLû”«È2yHG>¿÷v]”\˜™˜™h,«?ß fAd\ò°:#3@õ°7Ř¢ªŸ¶g•°«ÈB:yþ©{ìŽ6»³r‘[”Gî‘;¢«ӣä"³ÉÌz­Í›>  Œwß÷;»!¹¢Ì)ì<2ùë_•·ÂùÕ“…ÛêÉZÒ’A¸Ö°a©é5Ýæ{¸ÏMD9ª˜™JÌ–™&ÚzÅÒ±™\ª¬8Ñ\Bõ –Á®ˆ€#ØÞ™çLª¨bfgžç>l‹™I03Q™çŸºÇŸ¶sꪗ–';Fæ„IFhYdíš7ËB»Œ\ä˜_ÀjÈE®è›×áC»- éE~„7¬Ò5Ñ‹|úêÓÖ¯[+ä[É’:c«/²„q+«ê/ãnK–¶4‡»ècåC’†!»–¿÷ö FŸNlÙºÕNŸ)'³ÉÌvE!Ëñו=7å3ظފÿüìÏìÚe7:îsµåŠ6Oõ;u˜™€Ü#]”\ä{˜:ÌLTFO±åùFMa-2ÇŽîµ”c y…«!óÛ ò=L~†qä¾ÈÂõê~e„ŒÈJN|wضѹKþŠòãÄó}vl¿®Ur÷•Ì`3˺ÙMìßw³ *{‚ä&lÐÈýÕ©%dMüÍé«\q°ËdF·ùîˆQŽÊ3ÓñGO|ÃZ™InWÖG{Óõ7ÁT¢„ÀA)€]G°½³ïÀAÝ”Ée¶O_Ú²u«~Fø+FŸ¤IE¾–¿ÉNn÷ 6³~£ù^ß;¦ïùZ] ŒÀ ò}ÉT¹èÕ«ü͵ÙîÔ8¶…™In]V=f¦z13UE&KºÍ÷pœˆrTž™Þ´ø×sÊKS™É–yÎÛÏID³ QƒR»"Ž`ûèîÏýÜêÕåÉüúèï£ÉÅË"ãºÕ–­[µ¼ø›ûÌ®]–cü'~jµ­a…ñ§kÉmÉMË72§Ý–\`±³Ý©v[~JViâ2í¦ ïàT˜™3Q 1yÓm¾‡{çD”£’Ìtäþ#2(“ÚÌLúYã²4¹éÂO'šZh”,ØpÛG‡–ÿØœ^äûwŸ»æ)dùãâË7Á$+5qQû–O2ŠmELÒ£—Â2b×Waôæä«¬§|•ùuÜVÒ/v¶;UNW@.13é2™™ÚÄÌDDTÌè6ßÃÝt"Ê‘ÏLò½gý¨éÌ$Ëßµs×¹ï9W«–\Îyû9Gî?³M'$ JìŠ8‚í©}þÜÊ÷‘½bÕªØD<‹S…íã3»vÙr`’ÝåO¦ÊUôMsFoH.…eÄÒIáš»º\à#±å†äåîë3ß©r¶rsò¨ëVÌLmbf""ò°¼ Šnó=Ü_'¢mXÎL%—¦3“Õ%»È¢x*Í(” êØpÛkï>w½Èã>|â©=¶(_vf+5¶¨93“¬3L³Ý©‰ìZã.ÌLmbf""RØ\H·ùî¸QŽ,3­zŪ½·íõÎyû9:I¾‡kyóg&;êÜ÷œ+ ±ê$ßl½b+ÌL4VhÔ;°+"à¶ïyè×ÏYY¤°ÎL .vÖÒî¬(ë8p¾R9»­93ÓÄ64ÛšÈûîs×ÉÚš-î3ªà*3S½˜™ˆhà0µ ™nó=Ü}'¢ùÌ“„Ÿ¦38p×[¦\Xšh‚*¨¿`WDÀlöþ ÜÒ6ntÒä?ÎiËÖ­ÖM<+2¾(ÙµfË4²X˜$dP§Ž«0åW73ß©‰Jîµ&$f¦613Ñ`ad!Ýæ{¸OD9*ÏLç¼ýo93)[¬¬?§‰ „BA€]G°9±smôâ?Û׊‰ßPJ‚K »Va±•Waʯnf¾S•Ükm[åÑŠ™©^ÌLD44ØVÈè6ßÃz"ÊQyfª¢¡Ì´kçÒ'ŒÈ…ŸÓD'„0A9]G°™ùüÞÛ-‘øÆaµBåûröÛ––rfšöNM4Û½6ÌLõbf"¢áÀªB@·ùîÙQŽ’ÍLBV©¡%S/…$Aù]G°ùy÷¹ëtC'k+V+¦ ³»Va™¸2åW73ß©‰f»×†™©^ÌLD4ØS¨nó=Ü¿'¢µ–™dùÓÞDs‹ú$”ÊìŠ8‚ÍOa˜ðƒ-œ×c×*,#¶2ã*LùÕÍÌwj¢Ù˜™Þ¸° 3T¿åsfŒ™‰ˆò†%…Jè6ßÃ}"ÊQÅÌtà®2Û`\T‰Arõ‰713 Z4°+"à¶wö8817fœêOûÏùÚ…«jéd\…)¿º7ÛšÈ[ž™Æu¢Š™Io¥ü>Úc%—‰F®˜™ˆ(WØPh"Ýæ{¸ÇOD9ª˜™Î}Ϲ2Oa.¿ôr™ÁßÄ®»ä¦Ë?tIæ×%Ëœ0‰²º ìŠ8‚íí>[¶n…q³ïÀAÝнbÕªCG²qK'ðGèÊÉÌz­òbì¶ ëÏÅ—oÒ©ã–iW¯ž™¦ºSÙbË3“Î6[f²§‰™i"f&"ÊÖªH·ùîúQŽ*f&->3ŸÍ¤óø›ÐÛ-¹Qûp™‡inBq ‚]G°½£™©äÜ¢-[·ê¶þ¶š}fÓ+Væ'ïó{o—ÙüÈgvøã ãÚV·LKSv†Ô¸ cWŸVf»SÙ ”d&{œãûõªd&]ó’ÕVÌL‚™‰ˆr‚Ý„¦¢Û|ˆ(G oZÐâ’â³õŠ¥½óÂ³Š´@Ée\f²`äg°¼uÎÛϱAÏVìÜ÷œ “(+!4ÐÁ®ˆ€#ØÞ±F3.úŒ›Aÿ¿N’ybݸøòM2C ¾ ÅÒ¡§;ÁÉDo\XÚÞÊU:þ¤Ë’ei~ªMòd\g˜øV¸™ïT ;ÏH.%™I–»0ñÊc¢«=ncg~É庛¶ÃÔ`f"¢<`1¡è6ßÃ#"Ê‘E"ùfïm{£ n°ybf’lêê×®öWTþê…™I.’ŽÜ䜷Ÿ£“Æ¥+ÊAH D°+"à¶w,úÈ"Ⱦ-p¾‰ÌNÀ‘Ë+V­’yd âÝ箳êC’,V§ê rz-¹ºŽË*ÁUà†dù6¿®˜-0†¤ënÚ®“äRx/Àlwª„/;²¹.u.Ivïô¦¬°=‰…W72§-J.òý0K3õ¶š™nó=< ¢¼\~éå«—ßïVñ™éÜ÷œk ©ÊÅ7£›®¿I®kW—odª°Aù«å ”"»"Ž`{ç£Ö \F[¸U?·zµ Ê7Œ?纛¶û«û‹,yÜ)?Ÿß{»Ï[v)¹­__þP'»ØÌ²´¥¡Ñ ÌigwÝ–ñ îÉlþºrÅ*Í®uñå›Ê ŽÌÿÆ…» ›YnËå^ËLú#˜˜™ÔlwʓՀ›®Â/A˜:‘¿ºÐg¶ {вÇÌDD}„}„j¡Û|ˆˆˆfjQ!ØpKD‰cf¢~ÛxÑûN_}šØ³{LÊÕïr€q„ê¢Û|ˆˆˆ¦:Q ØpKD‰cfÊÜóOݳñ¢÷MË/aó¦ÀTåç©èØÑ½²4M$J~„y¦uꪗžtÒIòÕFöìÞ«:¬FwÙ[¿n­_Ï™5q—aªšáÙ9|h·\ñì…3ü³,w\ÆaÎYa¡zé6ßÃC""¢ŠB> ªvEÁQ☙ò§ucôéc‹ù>Zš6ºÈþê;¶_qúêÓ–¦.2ÃÆé›Ë¶«/Ó’¯Zli2 f®hÏîmº¹6xøÐîµkÞ¬ãz‘›ˆ–¦.²2vuQ×]6þ¾Ã¤i5t—7oú@œ¡zf:vt¯ÿg&ßÈÕáFe áZS BMÐm¾‡Ç DDD…p@TìŠ8‚%¢Ä13 ¶«/[:Ö?é¤Â\â;Å©E)Ä„ýûn†©Ù øÖ°g÷6[ìl¥éì…3ôêñdŸ] WXnÝZ45ç]VþVä"‹‚¦ÕÜ]>vt¯¿Ë0µœ¿¢S²L¿VþÙŸ¦jŽnó=¨5ºÍ÷ðX‚ˆˆH…:@T ØpKD‰cf ;Î/ÏLãÌÙ\ä2®\øS]Jâ°kË›K‰yÚ<Èó,Ê´p—gÎLM“™0|P›t›ïáAQèD5‚]G°D”8f¦¡è*3Y¹w»vºSÉ<ÑÚå=wM·™ Ô²¨îr ™©ô)ÆäAíÓm¾‡‡DD4d¡ÕvEÁQ☙†b†”ãÍJªÜ®ÍSáT—%z•’’_fjá.7”™ü kc>cuE·ù`Ñ0…@ÔØpKD‰cf K91÷”|X™-”ø3• ?µZÙ<ëÆæMÐùýßÎåÍEVFn´¤|‰¤2S;w¹¡ÌdçaY,–ênó=<Ì "¢¡ €¨Q°+"à–ˆÇÌ4–rbhÐR^f %åáÃL[7tþò5)¿é³Gü®¼¹Ìv— Í¿¨vîò´OD‡í–ÕÖņ·ûaã Îé6ßà ""ˆpðOÔØpKD‰cf ;Ô_¿níþ}7=ÉEÆËËB:™éð¡Ý:sùéWþ¦å>êUv_Ê›ËümÈ̹¨Öîr™É–n¥@·ùuQöÂa?Q›`WDÀ,%Ž™i(,3»”—…ÙB‰ò=L5V"ª,|â'a+Óã.åÍe¶»\hÎEµv—kÏLë×­Õ®üÔ-L”Ýæ{xìADDy ÇüD-ƒ]G°D”8f¦¡°ÌtöÂ/zŸ™ô¹9KdN­ó̤wdâœþ¦×¯[ëï²¾}L.ò=\Ë“©:ÛTw¹Ðœ‹jí.×›™¶]}YÑÒ°kPRt›ïááå*íuvEÁQ☙†BS…\bhÐÒ”BfšX7¬\¬_·&ò›Ö[,o.³ÝåBó,ªÍ»\ý‰˜HV@ÿɹEaÑ é6ßÃ""ÊO8Î'êìŠ8‚%¢Ä13 EIfÒþ)/ ³…’òðaª× =+GÖáØÑ½0 ”ß´þá¶òæ2Oó,ªÍ»\ý‰('·.+¼r9˜3(MºÍ÷ðP„ˆˆrŽð‰:»"Ž`‰(qÌLC¡‡ýr) û÷Ý|øÐnôf %>|”ü%þŠuãØÑ½z/Î.ý$lUÞ\„ >ÿÔ=0襙Z¾Ëµd&¹ ]çå…`È ”é6ßÃ""ÊC8¶'JìŠ8‚%¢Ä13 …ùË¥ü|–qf%Un·âºÙçIo»ú2˜Ml.Í|—£™Õò]®%3éB䞎Ö+%N·ù–Qß…£z¢¤À®ˆ€#X"J3ÓPTL9ãT %ë×­=}õiþÄ(»Ý•kl›§<¦èlå+`ZËLñ.G3g¦–ïrÅÌtöÂãήÒÏù’fcê)Ýæ{xpBDD½é‰R»"Ž`‰(qÌLC¡ÁB.å™i\4©JôV|ã˜X.ô“¡ä"×-ùø¡=»·él%¹Ê«Þ\ÆE“™ïr4[fjÿ.WÉLú>¾Â;bws” ±_P/è6ßÃã""ê©p0O”&ØpKD‰cf ­!r)ÏLã¢I•Pb$䯮Ÿ<]rEûKj%iCœ½ü'ùËÏ2›‹F®Âu›ù.G³e¦öïr•̤ÏW¼º,VŠõ‹ã…’I£¼…ã”Ýæ{x”BDD½ã‰R»"Ž`‰(qÌLC¡ @.%™ÉNŸ‰‘¢J(±¢ä³ˆ…¹¾'ÎbJÉ;æl!å)Ê«Ø\Ö>ü¨ðNÍ|—£2S'w¹JfÒç+^]¯;º"– õüSN]õ2ã”Ýæ{x¬BDD=à‰Ò»"Ž`‰(qÌLƒà[OIfW„~æÎ¸©JCCœÁ®;:“eŤŠ1ÅjNIŠv’”\JšKÉ­Ïs—A•ENî²N7UŒ{¾¬£mÞôA¹éhÏîmúX®ˆiƒÒ¡Û|Xˆˆ¨¡;Q_À®ˆ€#X"J3Ó ìØ~…V¹ŒËLågÜh#7õØÑ½%%Åþ½\d6?®‹•©ûÇga³Áx =gG/… ÷ëSK¬]ó+” Ýæ{x CDDi ÇêD=»"Ž`‰(qÌL”:=F¾ÂxÆzr—±PPt›ïáa ¥&¥õìŠ8‚%¢Ä13QÒìc­«œ÷”‡>Üel” Ýæ{x0CDDéÇçD€]G°D”8f&JÚéËŸ„}ìè^˜”«äï2† ʉnó=<¤!"¢„#s¢lÀ®ˆ€#X"J3¥ëð¡Ý£ÓzN*ù¼§Ì$—±JPft›ïá u+“evEÁQ☙(]Ó~v¾ËØ#(KºÍ÷ðð†ˆˆ:ȉò»"Ž`‰(qÌL”®ž|vR½Ë#(WºÍ÷ð‡ˆˆ:ʼnr»"Ž`‰(qÌL”(û$ìõëÖ¤\¥z—±DPÆt›ïáqµ/‡e vEÁQ☙(Që×­=}õib8þä]Æ AyÓm¾‡‡:DDÔ¦pN”=ØpKD‰cf"¢B ht›ïáOëž~üñÝ·lÇž? êÛ¾úÇòþIU޽‰vEÁQ☙ˆ(Âú@¡Û|{Z·uç»`•ˆzäú]çÁ?i¢JÂ7ÑpÀ†TÀ,%Ž™‰ˆ¦Ýæ{xäӺܸ «ñOýÄøôKˆzäÂë~BþéþÉŸ¿þIM¹‰†ÆvB ÁQ☙ˆÈÃî@ƒ¢Û|Z§™éòÏ¿ìã_}%Qüoy©üÓef¢é„ãm¢²G°D”8f&:üàC7åê±Ç> %…Jè6ßÃC Ö13QO13%徯ÝF”²oëH-ÃñÝg¾ l'ÄÀlWxâ»ÜF”¬¿9v/ü£mÍ“+13 ݵŸýu}–‰rµ÷¯.…˜BãÀC'àP­}ÌLÔSÌLéàG¼QúþðSo€øÒ ‡êŽ€ÚNÈ<¬Q‚öþüÓ­ä¤q˜™†îcŸþyŠ÷/þýk‰rsþ•/’Þ·îý}ˆ)4Žnó=8Zk3õ3S:t3Â]JÓï]ýbù÷ùÁ«Oƒ‚“¨?­‘Àn'î>r›¬Éû¶¼žA¢DœwÅâÏç\ÿtç © f¦¡ÓÌÄC8ÊÒøôKäŸ73SuºÍ÷àh­}ÌLÔSÌLéàf„Rö±/¾Bþ}v˜™ ñ¤@½ÐÌ$óð %âŸZüÛ#ue&ÈFÓbf:f&Ê3Ó´t›ïÁÑZûx|H=ÅÌ”nF(e­e&H9)“Àp'˜™(qµd&¨E3cf:f&Ê3Ó´t›ïÁÑZûx|H=ÅÌ”nF(eMd&¨6½#€#áN03QâæÉL‰æÇÌ4tÌL”1f¦ié6߃£µöñøzŠ™)ÜŒPÊæÏLÐh2 €CâN03QâfÈLІjÄÌ4tÌL”1f¦ié6߃£µöñøzŠ™)ÜŒPÊfÈLeò#€cãN03Qâ¦ÊLP…jÇÌ4tÌL”1f¦ié6߃£µöñøzŠ™)ÜŒPÊ&f&H0C €#äN03Qâªd&ˆAÍaf:f&Ê3Ó´t›ïÁÑZûx|H=ÅÌ”nF(e13As y@*w‚™‰Wž™ 5™i蘙(cÌLÓÒm¾Gkíãñ!õ3S:¸¡”Yf‚Ô2dò€8`î3%n\f‚Ôf¦¡cf¢Œ13MK·ù­µÇ‡ÔSÌLéàf„RÆÌÉà°¹ÌL”¸˜™ ý´‰™i蘙(cÌLÓÒm¾Gkíãñ!õ3S:¸¡”13Eò€;lî3%Îg&ˆ>ícf:f&Ê3Ó´t›ïÁÑZûx|H=ÅÌ”nF(eÌL‘< Àçž®03Qâ,3Añé3ÓÐ13QƘ™¦¥Û|ŽÖÚÇãCê)f¦tp3B)cfŠäP|:ÁÌD‰ÓÌôf&J3eŒ™iZºÍ÷àh­}<>¤žbfJ7#”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷àh­}<>¤žbfJ7#”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷àh­}<>¤žbfJ7#”2f¦HŧÌL”8f&J3eŒ™i¥'Òm¾Gkíãñ!õ3S:¸¡”13Eò€(>`f¢Ä13QB˜™(cËLØŒf Û|ŽÖÚÇãCê)f¦tp3B)cfŠäP|:ÁÌD‰cf¢„03QÆòÍL˜‡ê¢Û|ŽÖÚÇãCê)f¦tp3B)cfŠäP|:ÁÌD‰cf¢„03QÆrÉLƒš£Û|ŽÖÚ—ÙñáE7žrÁ5?).¹…[ÝÌ13¥ƒ™‰RÆÌÉ øt‚™‰ÇÌD af¢Œõ63aýinó=8Zk_½Ç‡ÝxÊÉ/ùáŠ^ý ?⯠SÌPâ`f¢Ä13QB˜™(ce&l7=¢Û|ŽÖÚ—qfzÛù/Ô¥¾¥nœŠ™ Îfúèm/—ù |X’Ÿ$kUe’|ÿê_øYs˜ßÈceÁëŒßx_Ž~L•…È~ª¿óƒ'Ë-ÊíÆ•eÊ­Èó"óO¶I.pzÑËO.p×â¤w_ú"Ñ‹ŒÃ]xõ/üÌã/ºæ%7*O>8r‘ydDî—èEÆõ­ˆrÓrsK££‹L*)Grë2ƒkÙ:È×Ú?4™)ÌL”2f¦HŧÌL”8f&J3e¬•Ì„¥¦×t›ïÁÑZûZÎL'¿ä‡!yxue¦Kny™Fù Åg¢’•åS-ÇĵÏ#wMÖV[ŒL’Ùä{Y¸,A¿×kÁ Y2Uœ±ü¦9™SG”5)¿d»®ÑIòU®"_eiò,J:¹ÈÝÑIrëòÍy[^lwPaiJ[›,ÁŸñ¤ƒr•ÂК3S:˜™(eÌL‘< ŠO'˜™(qÌL”f&ÊXÙ Mt›ïÁÑZûÍLZ.Œ5˜ßȃÌdg{Áxs˜™ÒÁÌD)cfŠäP|:ÁÌD‰cf¢„03QÆ*d&ì,§Û|ŽÖÚ×Uf*¬Eå-FhèñSå*%‘EKŠ\.ºñ˜4NùÊëË“Kld®Ï·*¿ksf¦’÷©µ–™Êï`˜™Òñ‘›˜™(]ÌL‘< ŠO'˜™(qÌL”f&ÊXifÂÂBB·ù­µ¯“Ìk‘š˜*ôïâû?™¯åÝ—¾ÈFÌ%·¼¬$²Œc+_ø‡ùÏÛòb*—w쌞ø®:ëS…+3gf*\UÕZfz[r)Ì^rÅò¿Ó7-f¦$<³ˆ™‰RÆÌÉ øt‚™‰ÇÌD afj‡ÂÉŽ©™ñ÷´ð”ŠBðţnjÉLØVÈè6ßÃc¶Öu’™4pÄöa £0‹ÈTù§+Sýbu¤p~mRr)ŒPãØÊ.S”£‹nB—&ßÀÌsbfêØrcBf’ßkùg<•¸&¿Îò ¢SõwD.ú£üvø];ùÍÕñqdá…[¶ò+Ê­È øf¦HŧÌLúÒ<­¸¯"Û{ñµ‹Î /ëå·Án4Æaf¢„Ôu6ì»ÃTc³Mõ¿÷ÙGFî»la¼ ÊeÜ[Ndý4Çø.cË‘Û7OäæäFKþ1²µ­eU]fžB…t›ïá‘[ëêÍL…íuù×è¯ SKøÌ${?òûk»S:ƒ~#ËŸ*û®¼¶ÁlBnÑÏ·"·+ƒ£ß³ÅÕ°%è ^Åî‚ÎìÙ.`áúè$#óèvO/ò½müK–EmKR~£0.ྠػÕÙüSVf¦.¹Æ4„Ìd¿eúYɯ˜Ê76hsÚï”Òúd\Ùä%XÈüö›"ßûùeªM’ Ž-_®nãrñ¥¼âµ—ÈÌÉ øt‚™I~õ—T.ò;k¿¿úË+_mD¦êlrí€nšdfy­—IB¶9¶½’q?³Ùl’-_è^„N’ïáZÃÄÌD ©+3ùíŽ\ |„ìÇÈÔ¸ݽ«x÷åèhôX.^`mdmiŽ¢wˆ(× ÿk±9ºé‡Ù‰lmÇÝå©03MK·ù¼µ®‰7ÍuEw§Dl-»dùM1~°¹“Ŧp¯={ä˜Tf¦n¬ Lj ™I^vý¿g{=õ»v2 u–ké ìTØ ’ß÷1ôFå"óÀ$;Â”ëÆ“ K®hµK.²˜š+f¦HŧÌLò;«¿ž°­Ð_[ùê wéõÈEæŒ/¾ºÝ€…¨Âå YˆmOXš3%¤Þ̤[ý&îXÍïÜ Šn 7 …ìñw:¨m[å2nóª[ùê7Z]ùiŸëÂפ™13MK·ùµ.§ÌDƒÂÌÔ˜Ô@2øÙë)"÷¯Î%GwB§ÂB„í¾^ÛLLWåW”A»n¼Ñ,13Eò€(>`fÒ㸸­ÐßÙqãö›^R´…N z­ÂI¹ à»ç˜™(!õf&Ùu°ÿÂ*üo(› ÆBw­ ·’…4ùËeÜž–,J–Y²ñzjáÓÑ(]«iŸkÝý•‹½&̓™iZºÍ÷ð(®uÌLÔSÌLm uÉ $3Á ƒöz »z,ç_Ë÷"äÈMfŽg©ëÊ¥ðõÚv`ân@ùÅ»/}‘Î «OyÈ3S$€âÓ f&=Ž‹ÿ±=n¢G…ö›now\#óþ¯yù6Ê6)ã;ÌL”Ú3“…j¹Ä¨l³Áø@èvpÜV2’pô@?búDÙ¤Úæµð=)út´øõv§}®m·xÜÞçT˜™¦¥Û|äZÇÌD=ÅÌÔª–¼ì3“¼Åã+{=-œä³‘¾^Wß9Q¶ïQøz­»(r‰‹-¿¢²yÚÿO²ö13Eò€(>`fúèm/—­G<¦· ‘9e~{ƒKÉF©\ù6Jc–\¦=èÈ3%¤öÌ$ßÛF$þ¶WÉL—Üò2Ùû9cô¡¹²á¥ÖÝÒÛäÉÕåG¹®ÐÔmœ±Œë­È üw™Ü¢ Ê$™!nL\Wv§tQ¯}Ð&,ÍÈ r÷Çm% •lXu«ª«*ßÈ%~ú’>àå·¨K¥éý•¿pý'>ŒÂ_Q×\m$‚ÇMobtW˜™º¡Û|åZÇÌD=ÅÌԞЕ@ö™©½žÊ70 èëµ\¦úàmyíÖk¾^ëî‡\âHù•õP¾“f¦HŧÌLãè6dâo«ý^—DåË·mݪt9f&JH™IØ>„ÿï2³E²¥ˆy4@èrâ)”½íå²5ÑíŽ\t/J®b#rÑÁóÜß/‹îÖh£±‹\Ë,ditù2n³%W‘5´¶›–o ÷ÕôîÈT/a@ÜÓÛ•oôQ•K\O½/%›]}d9òÙ£'_å{˜³ðaô#rñ+©‹’õ·O»-Ya?..¨tï³:f¦ié6ßÃùÖ13QO13µ!¥BÌL0 螀\ä%¸ú‹oÉþ‰°[»åWT¹¿‚Rø9afŠäP|:ÁÌ4ŽíÃÃ8¸Ä½å¥äØ$*_¾mR&në²ÇÌD i(3ù÷ÕÛi/q6`ÉÃïyœ·åźq)¼Ö;—ÏÊ–-‹\]æÑolÐæ´AY Ì&?Ê7ÂÆåVdó'“„ŒË:Ø$¹Ä½™M'ùsˆÊ;½^eÜV²í¨Á¦S÷Àd õÇq‘ŽËÝq¥ë#_ýsdwÁîÙc¢ã«Gg!YlòO\•g *¤Àý¢fÆÌ4-Ýæ{xP×:f&ê)f¦Æ…œ43LþØO¾ñ{5%tB.…¯×ö‚/ô¢üŠÆV©–ý”13Eò€(>`fG[å+ŒGþÿòe+Qøþ‰¨|ù¶­È>IOÄÌD i(3 K¾VÄÙ̸ô lWÉ/Jéå"›¿X½Šßµ²…Èœp¶Ç#“à&l?)î¥éF-®’-m\™’+Âx »ƒð éݱ}ÁÂ%kŠwsz×dj\O{î⾦ý}׫ø}A™AF`µ…íÎÆ‡Nè$¹øEÍŒ™iZºÍ÷ð¸®uÌLÔSÌLÍ -©3LŠäåÞ^å"¯Ýß@§;r‰¯×2¢K“¯0I”\ѳõ‰»…™afŠäP|:ÁÌ4NÉï{dGr‘«Èá€ÿßîB%Ë—íƒ.J “ˆ™‰Ò\fòÿ9fgÓÄÙŒîvŒÛBÛ¾èul¤d’±ý­¸òé&Ùòã:˵DÌð¶4¹.L*¿ãÞwY”±õ'.é–·°æØ³S¸Q–…ŒV|¯u\Qj¸¿ºü¸Í[r)ü?{í‰Þ ˜™¦¥Û|íZÇÌD=ÅÌÔ ’Ê13Á¤Bò¢¬{)v‘WäÂWje3Ãëµ+ùZòñŠ@"—Šëß_ÌL‘< ŠO'˜™Æ±_yG~©í\.ò}ù¯ù¸åÛVN&U<1*oÌL”æ2“°_~/œMèy7…“”í”Àû¿tr)Ì%ž­L¢µ?¿§÷:®ªÝ»‰ÿ»8îq·dUòèÍ€™iZºÍ÷ðè®uÌLÔSÌL © f&˜TBö‘tçA/òb=îåÞf“oŒ¾ÄË¥$QÙË_èmQS­13Eò€(>`f§|ß¾a½Î}Æ®\dË0.Ùl~Sc7Zå|¨`f¢„4š™„ŒŒ6 KUbÜl«‡½•f(Ì+…d3îÖ”/D·bqÇ)¹!}4d0^Ϋ`²(?ÂÚÂzj w[O²'f(¹w ðq›Ø«/¿ f¦ié6ßÃc¼Ö13QO13Õ/ô£Š˜™`ÒD²ã¡/âz)\‚í'ÈΉæÉ²k!sÊuKÎãv0€­@-û)cfŠäP|:ÁÌ4Žþ¶Ž;è(!G+vH"YBa0²åËFæ—mˆlsä{9 W¦†‰™‰ÒtfÒ ¢›}_Uál²¥ÐÙ weĸtq<²%Äý•ò…è¦-®³'{TrOåê²³¥óË%ÞîZÉ 0^.¦}ßìÆÁÂ5NÅó³”Î,—¸’jÜ %#(|Ü졆qS}ùU03MK·ù济™‰zŠ™©f!UÇÌ“ª}6Ûôx,7qGbœŠW,Ù›Ê 3S$€âÓ f¦qô·ÕŽA¦eG‹r‘c˜*æ\þp03QBšÎLÂ*µl8ÆÍ6qghÜ ºÀ8ÙâþJùBtÓVx×d¯Kî”mûd¡?Ê%ÞLÕ9a|"» û1.î >ìãþGQ×ÄfŽÆÍPò0]gYŽ”kéÕaÜT_~ÌLÓÒm¾‡Gz­cf¢žbfªS(GSaf‚IÕÙÎ@ü_«‰;ãT¹¢í-Ľü03Eò€(>`fG÷ùçùmõç%À$1ÿò‚™‰Rof*üý¿èÆSlëðîK_$ßÄÄ0qghÜ ¶#2q/Ê–wkÊ¢+×Y6ˆ:éu¿ú£¾æ”ÜîZ>Jåôô%¹œ·åÅzrSŒýv/Þ6z¢ÜJÉ MÜÉ7Cɽ…›­d|É8%/ô²‡`;ãŽEóÃÌÉ øt‚™iûµ-|§‚±íÉGo{9L²£ƒÂí‰._.µdŒ™‰RWf²fQ²[pÑòçÉV&)[ˆ|£EI¶V:(W,\²]¥|Óæÿ.︌%—¸{s™Lò›6ËOr‘%Ë6Q"#òÕZŒûͨ\Ý®"³ÙxE>!ÅÜfì&Jæ1ö˜Èúë—ké Ü_Uþ0zöj!—øÄÙ.Y ’[”9eMt|†‡(bfš–nó=<ük]‚™Iþ­V¿&ò£üSŸØÄ)ÌL3 ‘h~ÌL~—C¾)96“I:›\tFF„¼"ë+~áÕeÄ–/³•ì€Å3F7©ä¦m\6’Uöa²ÁÌÉ øt‚™©ß«/ß{×MŠ\ä—]ްtS#Ê›¸‹É¥|ùÄÌD ©%3ÉÆÂ+9ˆ’íHù ï¾ôEZdSâX¸Ãa3˜ÂSläº0›°¸°Ir»0É/_WU·zr‘ïµ§è.”Ñ¥Éý ²EUTåŠúèÉWGöíl±Bîˆ|•xü†ò‡Ñ‹[|Æõ_‚>t:ƒ.J3“]±pùÕ13MK·ù¶.ͳ™l§Jþ•Úa’±-ü&ÊÌz?H¹bfšE(DµZf’ ”¾†zãÏäå^^‘uçAè¶K.v­˜ wi wÀ@ᬃl?ç|Ýï#f¦HŧÌL ðÐ@Œû-–-€#,mhFùQ~ýãK‹xL!¸•¨ˆ™‰R×ÙLµ³Â ã©‘-¬dß·w²©vËwDoÔïÂÊþ®ŒØsbfš–nó=<l]š™Iþ•꾄$%ÿŒe7(NÕAùê)WÌLS y¨.Ã|ÓÜ lg^š©QÌL‘< ŠO'˜™jd›“hfÌL”d3Ñü˜™¦¥Û|[×ÇÌ$Þ6:ǦÚéN~rÅÌ4ІjÄÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û|[×ÓÌ$N.}ƒ0e™©ªP…jÇÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û|[×ßÌDÇÌTIHBM`f¢”13Eò€(>`f¢Ä13QB˜™(cÌLÓÒm¾‡Ç„­Ë#3ÙÛå|P®üè§Úø;?xòë~õGeùvJTùœ2,Yœ·åÅúá¾2áçøú ™æÑqøÔ6™Í®¢â ‡HÆe­äÖe ?ÚÓ/Á¯¼|oW´A#+cK–oâ:'‚™i²ÐƒÂÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û| [×»ÌôîK_tVøô%ÿ§á*o;ÿ…2¢“ôÓÁeá6"ûÈð8çE7žâ甋Œkúèm/õ/üÈÒèè"“ õÈepiòèˆC²‘uä÷ ûÛ”—Üò2ùQ+d݄݄|oKPña‘5ô«¯" —q™G¾ÑÒÙZþóU03MbPs˜™(eÌL‘< ŠO'˜™(qÌL”f&Ê3Ó´t›ïá‘aëz—™dä䢿%wÉ-/³&“„N’¯²dùúº_ýѳ~ëÇdN,™óŒßx|óΞ¬3ËåÕ¿ð#¶ùÆ'!X”+Ž›$´éŒ›*ƒ2In#Ö­de|x²u‹ç4ù‡E“Ü#ËO2ègÖåÈZو܊œ)`f*JP£˜™(eÌL‘< ŠO'˜™(qÌL”f&Ê3Ó´t›ïáÁaëú•™ôôŸ“‹¢Œ(L'J[‰^×ZÌGo{¹üKósú“tf›AÇ®%kîÇ…^ nEÉ Mï¹Óeúu8ë·~¬pf}Xäâ›”±›¶zzÿXñ/ÐÙ,`)+eñ$²n132PÓ˜™(eÌL‘< ŠO'˜™(qÌL”f&Ê3Ó´t›ïáñaëÏL'/¿5LY1ù•NõéÄÈàhyØJ.ºñCãæô“üù>J\âµì”%Œ„ÞG›ú¶•ü¤g!Á}‘%ÈòaNUrßu’\â Ø[á줧3Š>­©dábf*P ˜™(eÌL‘< ŠO'˜™(qÌL”f&Ê3Ó´t›ïá!bëÒÏLg-ˆõë–?*H¾Âüª¤†X!šøC:§,*ž^$ë  ^#JNùÑó†äGß¹f'IÁ‰Ho;ÿ…2XX” •Üw$_aÜÓ›“K¼k¢ÊÚÇÌT  v03Qʘ™"y@ŸN03Q☙(!ÌL”1f¦ié6ßãÄÖõëMs2~rx››ÑR’™ª„’’9-3ÉjÀ$[ᘙ„®,S~Ô´¤'4ÁTYÂuGo¢ð¾—L2öñRïüàÉr_€>&r‘ïáŠbfB¡þ´†™‰RÆÌÉ øt‚™‰ÇÌD af¢Œ13MK·ù(¶.›%=ECI•pS2çÌ™ÉÞgçRÉ7ò£~À“ e‹Õ·°ÉµôÇqd~¹9a‘¨ð¾—<,Fïµ\dæñŽwˆ™i…~ÚÄÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û|[×»ÌtÉ-/;NN53Ùûælª¾cÎfÐ5·wÕÉ7òcáû×Ä;GöN®"ä5Zü¼™É¯Rú˜™NݧeÌL”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷ðp±u½ËL%JzJõŒR2çÌ™IÀºÉþØôFýTûè‰K2ƒž e`ù^É$£+ —x×’ÅÌ´(ŸN03Qʘ™"y@ŸN03Q☙(!ÌL”1f¦ié6ßÃÆÖ13’9çÉLöL—Üò2ÿŽ9¥KÖ©zêSá‡û…À$”I…÷½d’±·Ý13õIÈ=]af¢”13Eò€(>`f¢Ä13QB˜™(cÌLÓÒm¾‡Ç­cf%sΓ™ì˜Þvþ ásBÓ\d¶×þ ^ IBï`ág6é¤Âû^2ÉØ]³7î¥oè™)´ž13Qʘ™"y@ŸN03Q☙(!ÌL”1f¦ié6ßÃCÇÖ13’9çÉLBWïÕ¿ð#òMLE~ª?±›ˆ%ÈVá}×%—?’—Œ>t\f“¯½íå0UÈMÄ{Ý­Ag¦zºÅÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û|[—xf:¹B2J`\h<’‹ý­·qJæÔOæ–Küpn =%™ÉÞ˜&—¸}Cœ^Æ}øwa ’™e¤ä¾—Lòlä€s©´¯¥v¢Óp3S¨`f¢Ä13QB˜™(cÌLÓÒm¾‡­K33ùæRø)E‘̶t…“Nz÷¥/ò“.¸æ'5µÈ¥¼•”ÌùÑÛ^n“â¹H¾Ñž $,EŸò©ÊnEæ‘ïÏú­“›“ïÏÛòb«c²•’‡%²…È2å{%ßËH¼Ëhf ‰'ÌL”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷ð²u f¦“Gçæ˜è{Í<Ë"o;ÿ…0Iؽ8çªå7š]tã)0IØa\Œ;gJ§ŽK6:µä|(!וy,Ézæ‘ì=wña±IãÈ­Ëlº|¹È÷ò LìSbf }'ÌL”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷ð0²uižÍDå.¸æ'ý¤¤‹n<¥é›˜ßà2Sˆ;é`f¢”13Eò€(>`f¢Ä13QB˜™(cÌLÓÒm¾‡G’­cf¢žVf e')ÌL”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷ð`²uÌLÔSÊL!뤆™‰RÆÌÉ øt‚™‰ÇÌD af¢Œ13MK·ùO¶Ž™‰zj(™)413Qʘ™"y@ŸN03Q☙(!ÌL”1f¦ié6ßÃCÊÖ13QO "3… “&f&J3S$€âÓ f&J3%„™‰2ÆÌ4-Ýæ{xTÙ:f&ê©ü3S¨9Ébf¢”13Eò€(>`f¢Ä13QB˜™(cÌLÓÒm¾‡–­cf¢žÊ<3…”“2f&J3S$€âÓ f&J3%„™‰2ÆÌ4-Ýæ{xlÙ:f&꩜3Sè8‰cf¢”13Eò€(>`f¢Ä13QB˜™(cÌLÓÒm¾‡‡—­cf¢žÊ63…ˆ“>f&J3S$€âÓ f&J3%„™‰2ÆÌ4-Ýæ{x„Ù:f&ê©<3S(8½ÀÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û|2[ÇÌD=•af ù¦/˜™(eÌL‘< ŠO'˜™(qÌL”f&Ê3Ó´t›ïáqf똙¨§rËL¡Ýô3¥Œ™)’@ñé3%Ž™‰ÂÌDcfš–nó=<Ôl3õTV™)„›~af¢”13Eò€(>`f¢Ä13QB˜™(cÌLÓÒm¾‡G›­cf¢žÊ'3…jÓ;ÌL”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷ð€³uÌLÔS™d¦lúˆ™‰RÆÌÉ øt‚™‰ÇÌD af¢Œ13MK·ùs¶Ž™‰z*‡ÌzMO13Qʘ™"y@ŸN03Q☙(!ÌL”1f¦ié6ßÃÃÎÖ13QOõ>3…XÓ_ÌL”2f¦HŧÌL”8f&J3eŒ™iZºÍ÷ðȳuÌLÔSýÎL¡Ôô3¥Œ™)’@ñé3%Ž™‰ÂÌDcfš–nó=<øl3õT3SÈ4}ÇÌD)cfŠäP|:ÁÌD‰cf¢„03QƘ™¦¥Û|?[ÇÌD=Õ×ÌM˜™(eÌL‘< ŠO'˜™(qÌL”f&Ê3Ó´t›ïá!h똙¨§z™™B É3¥Œ™)’@ñé3%Ž™‰ÂÌDcfš–nó=< m3õTÿ2S¨3Ù`f¢”13Eò€(>`f¢Ä13QB43eŒ™©:xèˆ¶Ž™‰zªg™)¤™œhf"J3“Ž€âÓ ÍLD‰cf¢$|á«Ðg™(K¿÷ñU÷?° b ý_ÿðBðè <m3õTŸ2Sè2™¹õ˶mQš®ßu¤–!ƒG@ñéÄ‘o=bGÎDiºàªWÝûè~(>`f¢¡y CO?ùeù…ÚpÍÏÀxó 1PÞ0U§Û|G[ÇÌD=՛̢ Gƒµó‹Ë¿mù ãDuÑ=Šå¡é'µ‰™‰âKÛ:ÊLÐ ('؉æ¤Û|H[ÇÌD=ÕÌJ ‡ÁCÆÌDMÓ=òå¡Ñ'ªµŒ™‰†âKºÈLP%¨×° ÕN·ù”¶N3QO%™BI¡qàxà˜™¨i~+ª  P}r¡zP˘™h8 ¿tàû߆k~æÚÏþ:Œ7"õf ¦é6ßÃãÒÖýÇÛ>«DÔ#;öüü“NE()435ÍoEÊCsO.$j3 ô—!€`A}é§MºÍ÷ðДòÂgy BI¡BpèKŠ™‰š¦¯MDÊCsO.$j3 ô—!€rA‰ÃÜÓÝæ{xtJyá³ËÃb ‚#^ÌLÔ4}mò #Pšxr!vPW˜™(o`²EƒÒA'MºÍ÷ð0•òÂgy@BL¡Bp¸K35M_›©¾ú¥í¡•Ð 0¬§Û|i)/|–û-äx¹2(eÌLÔG}ÚÇÌ”0L'Tnó=<Ä¥¼ðYî™PXþ©yƒÎL!ˆPôµÉƒÜ@y˜öÉ…A)cf¢ÞÁâÓ f¦$a4¡ié6ßã\Ê Ÿå> ……0P+†˜™B¡Fék“¹ò0Õ“ ƒÇÌDý‚¹§+ÌLéÁbB3Ðm¾‡º”—ܸ `R a ¶ùÆþó7Ÿrà¾ÏÁx†Bþ vÀ®ˆ€â@yøøgßuÉ o€Áq bP☙¨_0÷t…™)%ØJhfºÍ÷ðX—ˆÚ ËÀa ª]Ô&ØPhh aPú˜™¨G°õtˆ™)JhºÍ÷ðp—ˆZ"ËÀa ªQèÔ Øhh aPú˜™¨G°õtˆ™)˜Hh~ºÍ÷ðˆ—ˆÚ"ËÀa ªEÈÔ-ØhP _P/03Q_`èé3S§0ŽP]t›ïáA/µ)t–!Ã4@4¿8(°+" ;Р@¿ ^`f¢^ÀÊÓ9f¦î`¡é6ßÃ^"jMè,C†u€h¡kPR`WD@w á€xA}ÁÌD½€•§sÌL]À&BµÓm¾‡Ç½DÔŽÐY† ÑlBΠ4Á®ˆ€ô@Ãñ‚ú‚™‰Ò‡‰'ÌL­Ã BMÐm¾‡‡¾DÔ‚ÐY† KÑ´BÅ ÄÁ®ˆ€ô@å‚z„™‰‡}'ÌL-ÂBÍÑm¾‡G¿DÔ´ÐY† {ÑTB¿ ^€]õÊ¥æ©ñ˜™(qØwÁÌÔì Ô(Ýæ{xLyù“?÷õ»ÎƒAêRè,C†É€Òpäû?tíê÷}ÆÓÊõ슨”‡k¿pÞGo~+ (”hI%˜™(ewÒÁÌÔ<, ÔÝæ{x Ly᳜–ÐY† «%cç/–í†|…ñ$„`A}¤¯MÊCù“ ƒºý¨"f&JÆt035 óµC·ùS^ø,§%¤–ÁÂv@)I43…TAý¥¯MÊCÉ“ ¥ƒÚÙhZÌL”,,;Iafj¶jnó=< ¦¼ðYNHH-Äí€Ò“\f ‘‚úN_›Ýæ{x0Ly᳜„P[† ¥*‰ÌÂåD_›f&JvœÄ13M‹%H·ù!S^ø,·-4—ÂÊ@}Sgf }Hèk“g%‚râŸ\¨$4(>`f¢`ÄI3Ó4°eP²t›ïáA2åå?õƒÔ”\+õÐû>'¯_¾û:ŸN( DÆï‡( ”“KnxÃû¯9M¿‡PB³ÖÓ!f&JFœô13U†!ƒR¦Û|“‰hf¡¹ †¦ÐˆìŠ ”%h%4¨ËÙePN¤ÊÔÎ/^,Û ùºøcDóÓ×&òeàÉï,=Ñ>£Ð8qÒÇÌDíÃdÓGÌL˰SP¯é6ßÃãgÊ ŸåF„ò2>FP®Nd¦Pˆj¡¯M ÊÀ“ÌL•AÁéf&jöšžbfÁHA}§Û|Ÿ)/|–ëÊËp@Œ \13QÓôµÉƒBAx’™©È7}ÁÌD-Ã^ÓSÌL'(ºÍ÷ðšòÂg¹f¡¼ ”ÊÖ³ÌLÔ8}mò PPßi@Ñ'×z EÐnz„™‰Ú„±¦¿Ÿ™0OPt›ïáQ4å…ÏrBy,”¥åÀÌDMÓ×&"õ6}r-©€pÓ/ÌLÔ&Œ5½õà°3¶ ʆnó=<¦¼ðY®M(/Ã1‚²ä35M_›<ˆÔk–QôɵɃj“°(ÄÌD­RÓ_‹©e¨™ «eF·ùKS^ø,×&Ä—ÀAù €™‰š¦¯Mt ê5+)úäÚdBÊI ¥BÌLÔˆ5ýµ\™™0IP~t›ïá±4å…Ïr=B|씟pü/˜™¨iúÚäA§ þò1EŸ\?B"d`Ešˆ™‰Ú¥¦¿–šËð2öÊ’nó=<œ¦¼ðY®Aˆ/=‚2Žü 35M_›¹08X¡õ´SÑ<˜™¨ikúkE|Lf AyÓm¾‡Õ”>Ës ýe°JP6¡þ8ÌLÔ4}mò VPOAXÑ'‡)Ÿ–a$š35 bMOA|HfÂAÙÓm¾‡ÇÕ”>˳ ýe0LP6Âq~ f&jš¾6yP+¨§ ­è“ ƒ¢O›0Õ…™‰±¦§ ¾,@fÂAC Û|­)/|–gúË@`›  „#ü‰˜™¨iúÚäA­ >‚¶"ôÉ…Á¡ ݧ5†êÅÌD‚^ÓSÐ_åž™°>Ð@è6ßãkÊË~ê i²Ð_†óe ÞWqào>'¯_ÞŒÕÅï‡(ÔGWÄ%7¼áýלƒƒÒO;0 5™‰š±¦§ ¿,af¢,é6ßãk" ýe0OPß…{¢tÀ®ˆ€`A½y…D¨?-ÀÔf&jôš>‚ørBÖ™ Ó ‡nó=<À&¸Ð_† õZ8¤'J ìŠhÔ;PXH„Ô4,Abf¢†@¯é)è/'ä›™°;Рè6ßÃcl¢! ýe0RP¯…ãy¢Á®ˆ€fA½……Bj6 03QC ×ôô—2ÍLhht›ïáa6Ñ…“=ŒÔ_áHž(Y°+" YP¿@a¡…¨ÌLÔè5}ý嘙°8Ðé6ßÃÃl¢Á &{Ø)¨¿ÂaË„“= Ô;ሽv;¿x±l7ä+ŒÕE_›<ˆÔZ€>¹0˜¥„j‡•§sÌLT#H6½¦Lÿ3” JÆ æè6ßãnÊ Ÿå B…É ê—p¬Þf&jš¾6y/¨ µDúäÂ`~Bª&ž03Q Úô„˜2=ÏLP1(A€Ú¡Û|º)/|–Ë„ “7lÔ/á@½9ÌLÔ4}mò _P/@m‰ôÉ…ÁÌ„$T/Œ;é`f¢º@²é1ô93AΠt`ôiŸnó=<ð¦¼ðY+T˜¼a³ ~ Gébf¢¦ék“ý‚z‚K¤O. f&„¡aÙI 3ÕªMï@‹™ ·™ º¥[O‡t›ïá±7å…Ïr±Paò†Í‚z$Ÿ·€™‰š¦¯Mô JÔ–BúäÂ`NBªfÔ03Q- Ùô´˜Éú™™ nP·0ñ¤@·ù~S^ø, !&c˜-¨GÂÁy;˜™¨iúÚäA ôAp)¤O. f#„¡aÓI3ÕªM¿@‹©¤‡™ u³Njt›ïáá7å…Ïrbò†å‚z!–·‰™‰š¦¯M$ J—qôÉ…Á<„0T# :ibf¢ùAµéÈ1•ô-3Aì –aÍI–nó=<§¼ðYF¡Âä ãõB8&o35M_›<¨”8h.ãè“ ƒym¨˜rRÆÌDóƒjÓ/cªbf¢j°ã$N·ù„S^ø,£b2†ñ‚z!·™‰š¦¯MT J4—qôÉ…Á „¹0Øw¡Í N/03Ñ< Úô ä˜éô$3A¡Fa²é#Ýæ{x(Nyá³¼$„˜Œa¿ ô…ƒðn13QÓôµÉƒA)ƒìRBŸ\ìµPˆæ‡ù¦/˜™hnúŠÌtú™ ‚PC°Ôôšnó=<§¼ðY^ZL®°_PâÂáw ˜™¨iúÚäAÈ dAv)§O. öW(DóÃvÓ#ÌL43¨6ýEfjÉg&H!Ôl4Ðm¾‡Gã”>Ë‹B‹É& J\8öN35M_›¹0˜¸P‹f†]&3ÌLT´›¾8Q…jÇÌÔC˜T(Òm¾‡Çê”—¡<Ë!Çd £%%H÷35M_›¹0˜¬P‹fƒ9&WÌL4䛾À0T¯Ž2Óÿ •ÃŒBåt›ïá;å%ÿg9ä˜,aÚ D„ƒç<03QÓôµÉƒºA‰€3-}ra0M¡Í[LƘ™¨´›¾À*T;f¦äa@¡*t›ïáA;å%ÿg9™ü`Ú D„#çl03QÓôµÉƒºA)€3}ra0M!Í[LƘ™¨䛾À*T;f¦´a=¡Št›ïáA;å%óg9™ü`Ú „cæÌ03QÓôµÉƒÀA)€3}ra0A¡ÍCLÞ˜™¨´›¾À$Ôf¦Ta7¡©è6ßÃãvÊKÎÏr(2ùÁºA)Ìùaf¢¦ék“ƒR-fúäÂ`jB-š V˜ì13Q È7½€=¨!ÌLéÁbB3Ðm¾‡‡î”—œŸåeòƒƒ:Ž–³ÄÌDMÓ×&uZÌlôÉ…ÁÔ„`4L0™ønf&òM_`j3Sb0—Ðlt›ïá¡;å%Ûg9™ü`à Î…Cå\13QÓôµÉƒÆAƒ3}ra0)!Í Ô™^ 9if&òM/` j3S20”Ð i"f&*ù¦/05‡™) XIhNºÍ÷ðžò’ç³¢Lf0pPçÂArÞ˜™¨iúÚäAã nA‹™™>¹0˜ŽŒfzM¿„xT3‚|Ó X‚ÅÌ”L$4?Ýæ{xOyù×þüÅŸ|= ö[ˆ2™ÁÀA GÈÙ»ûПɫÞ;¯‚q¢ºøý™ƒº9ff¯ýW½ ‚Ñ Bµé‹ÐŒfÀÌD… àô– F13u ûÕB·ùÃS^¾ýÔ3{,D™ü`ã …cãá8þø#0BT#Ø9¨[Pdfvìïž}ôÙ'`0¡Í ä›ô…Z43f&Š ßôf ¦13uËÕH·ùÆ¥,D™Ì`æ …c"ª ìŠÈÔ!È1Y Áh¡à¤,D¢ù13Q§05™©#˜E¨^ºÍ÷ð0ž(Y!Êd3u(Q`WD@é A‘ÉRhFÓ 'Y!Õ…™‰ä›^ÀÔf¦.`¡Úé6ßÃ#y¢4…(“ÌÔ¡pHLDõ‚]¥ƒ:E&?¡Í Ôœ…0T/f&PpÒ‡¨ÌLíÂB Ñm¾‡óDi ]&'˜9¨Cáx˜ˆj»"JuŠL–B3šV: U¨vÌLäAÁé @í`fj¦jŽnó=<˜'JPè2™ÁÒA] ÃDÔØ;¨+PdòšÑ´BÐIMèA af" Nú°þ´†™©-ØA¨QºÍ÷ðxž(5!ÊdKu% QC`WD@ì ®@”ÉLhFÓ M'5!5‡™‰ œ^ÀúÓf¦æa¡è6ßÃCz¢Ô„.“,Ô•pLDÍ]±ƒ:Q&?!M+dt„ Ô4f&2PpÒ‡é§MÌL ÃüAíÐm¾‡‡ô”—{þ@À`Ÿ„.“,Ô•p ì>-cfj †j“nó=<°§¼ôûY]&';¨áè—ÄÎ/^,Û f&j޾6yÐ;¨}ej¡O. v"d£i…¾Ó¹Ð}ZÖjf:vtïÚ5o>uÕK½ÓWŸ&ã0'ˆ×g/œ¡s>´ÛËm!å6oú€Ì¿ßÍ0m»ú²Ùn"aPpz»O˘™€ÉƒÚð½t›ïá=5cë[W½bU9›yõkWÛ |oã….¿ôr?¿8çíçØÔÂgùÀ]üü…öÞ¶®Õ¶Ðe*Z8sAw€ñ¤`ì ö…ã^2ÌLÔ4}mò yPû ËÔBŸ\ìDÈFS ‰§s!ú´¯½Ì´ßÍ§Ž¢ÒáC»udó¦È‘³\ªÄõëÖÊœ²™Ù;{á —ÅÚœÏ?uÌ&ƒОÝÛäê‹ëQmMÄŽíWèüÛ®¾ &õœôaôi3SÝBþ ù­LHUè6ßÃc{jÌM×ß4za9ië[÷޶לûžsep•ËLbõkWÇÁHfÙÎyû9Gî?"?¸ë€^ÑâÔ¸gùø£Çõºrë~e4‡É¸|WiUè2Õ­zåòú‡IéÀäA- ½ä13QÓôµÉƒäAíƒ.S }ra°}!M%$žÎ…âÓ‰ö2Óé«O;uÕKáÄ¥½OööªÄ=»·Éœ²רä3“Ðl$ ÷ƒ‘\WÏ“š63 -YÕçrEYÂÄ5l Dœ©îÎË6^tŒ7‹O'˜™júM+£Ùè6ßÃÃ{jÒ¸‚³ð¦(JÚž¬#ׂyŽÜDoåòK/—Kže R.Üã2R¸’­ ]ÈJ®zå蔫0)ý³™0yPËÂ/f&jš¾6y<¨eÐeê¢O. ¶/”£©„ÊÓ¡Ðz:ÔRf:|h·ì•ÆHtìèÞÓÝùM%öﻹp býºµpâRÅÌ$³Éuõûi³Ñœ™I«Y™ "Î,–ï3SS²ÎL¡˜P¡ÕB·ùÞS“Æe¦›®¿iáM ~D[ÏÄÌ$³íÚ¹ }?*y–Çe¦#÷YÌ4w€ñö„.i†Kü”¥B˜<¨eáp—"f&jš¾6yP=¨eÐeê¢O. ¶,d£©„ÐÓ¡zºÕRf*‰DMµ„Š™Ék93­]óæi×°1qf±vÍ[Fw§…Ì„¹§+ÌL5 õ„Æ I¨ ºÍ÷ðŸš4.3E3S¡9Ïfê^H3Q/Þaò –…c]*ÄÌDMÓ×&ªµ ÒL]ôÉ…Á–…rT]= •§sí½iN»Ì̘]˜™ÚýüS÷øÕIfÒ÷ß ý<òÛ¯Õи×ú9Srѩʯ­|/#vu;åJøÏ8—[—»/7§?êíÂjø,—ùý£.¶›ÑàË”µkÞ¢#£å<°ñ¢ól1îî,Í KN˜{ºÂÌT‡PR„ Ô4Ýæ{x„OMŠ™éø£Ç Ïš93íÚ¹K®(7¤?–<Ë…™ Ø9o?G¥leüÇ™Ë÷6³Ü´Ì£sêT8Eë¦ëoò3ÈT¹û6uéZ¯\µ¸JÏŒnú•‹?Šsßs®•šwI²æ‹wsy!k¾õã[íG›_ÿæq]àâ­ŒfeÐfÅê¸EÙüB®"knsΫµ)èÒ8ÌLÔ4}mò zP› ËÔHŸ\lS(GS ­§+!ñ¤ ½Ìd1bíš7OüÓrQaf’ [RWg3釚˭Ë};¶_a÷Ú¯Œ\KÇå«|¯¬—i'’ëê:§ êB?ŽJµdÉ 2U~”ïu[ ™tö­dD×vÛÕ—É÷22šy)ß臚Ÿê2“X¾é·¨=»·mÞôA™Gn³¹;l†ú`ëé3ÓÜBR!ÒO›t›ïÙA>µ`UÈL oZü !ûÑÌ–™víܵXjÜ߉+y–eár>3]~éår]ûQiÓ‘qý”qµkVþ5º­Wl•ÙdfýQ&éšÀ ‹Áhô£~ :ÜA]%Y…3ô³ÉõÍqr±Òtü›Çe\çÜúñ¦®SåmCú£’«èàâ G#rruñ¥Ig“q™*Ë—¯²|½!Xàl°zP›ÂQ.•`f¢¦ék“áƒÚi¦FúäÂ`›B9ª.´ž®„¾“ˆö2“Ð"—S§ÿôëýË™I®¨ti…Ë9½£Ì¤+)_…d5dÄŒk¨ h½;}IèmùO°Ò;(_mÎ^8ÃnÔ+Ñ ¥K°©¾à,®ÈLËAêeò ÊœZšüàÆ‹Î“‘æß4‡­§CÌLsa…D(>Ðm¾çò©i«F™éÜ÷œ»á B ¤5Uf:p×Å4ó¦]¸ŸTò,k@‘kéÊCF—,3è‹)ç£d³<ƒ~î8\wñl åîŽ.VÖÜF–’ÖÊÏö¶$täkGlPWÞÏfdN¨B g.ßP\ìbnPëWÀÚ“%ªÙ`õ 6…C\*ÇÌDMÓ×&µ ÒLôÉ…ÁÖ„r4•{ÚÊNRZÍLB{‡ìÉåTwÎÎDÚAä"WW_ÌL£‚3ap\fÒ5‡ÅÆ»£#P£Lá-7õDÁY\‘™tPnËгÎqÿÖ¹V2†žn13Í*ä• ¡§[ºÍ÷ìŸZ°j”™V¿vµÑa61Uf:çíçÈœºpùj§‰’gYo]ëÒa6qüÑãºpMK2§¯œÐ^…ËÓ~d¡Já}ýý¸¥å¬l4z|'Òµ­’™Ž|패­_<» Æu±¤tpqåÝàT°zP›Âñ-MÄÌDMÓ×&µÒL½ôÉ…Áv„l4•P|Ú²NjÚÎLjÛè‚d·L.£“bÚ}úꥄ¤6oú€]%¦}ïX‚™In=ú5…™éØÑ½2›«xšu|TÒ;(“lÄ“ñ¸F§¥Š™I£’gfjZ.™)D–a q'ºÍ÷옟Z ±f1Ž,Ôþ¦9m"vÅ’gùD=Y‘ï 3“°÷¸É ûŒ¥tQО<½ã2ƒÜw³â>ŽrŒŽ,®ÒÊLsbUWŽ,>’n6QI™3f¦wq¹È76X¸ØxëÓÂðA­ ·T35M_›23uŽ™iJ!¸ J¨9ÉÒm¾ç[5mbŽ1'âH˜4ñêú5½nɳ|¢ž„I…dN]ÿØÅ*f¦±3,½×1èèª.žEµrzJ*3aø Ö„ÃZªŽ™‰š¦¯M´jÔ™Úé“ ƒ-娺}ZjN²ºÌL¢¤åR`FíÄÛëĸÅÊlã"Na6*Q8¿ë28·«™ >\ÉÞ4ç é·¶…«a–×gÞÌäÇudtwNÌVL<)`fšFÈ.Ã:Nât›ïá?5i\m9rÿ‘ÅŠáFNÄ7(ܵøV¯±½fÄ_÷?\ûóòõ~ª9QOÂ$<þèq?²õŠ­²òr»òU¿ñSõ~.Jé úÑN–£Œ®ùâr\©1ôèÈâÝl 2Ság0 }ÓŒëb™™z/ÓÒTî>ôgòê°çΫ`œ¨.~?DAþ v@©ÝÆë_ÁU¯‚Á¦…r4•Ð}ÚRNÊZÊLGS…æ’Â7¾åR¼H*ºØ˜™Î^8c\Ä‘q¹ŠÜ ŒS8¿ë28·«™ æºX;½k½ƒãÖ¶p5Ìòú¬(JòÄA·œƒb횷ȸJ1<ÕûN"˜™* åeB¾é Ýæ{xÀOMÒÚ#ѹï9W&ù .«CfºüÒËeÎ#÷‘ïõ=nú½§g3é›Ñ¾ýÔ3ÂO5'êÉÊqý0#¿’Z—4m½b±ÚÀŠéߌ‹ŸÙdÊfpQFïu :zÚ‘J%é2Ság0 ÍO‹wÄ êbëÊLØ>¨ဖfpüñG`„¨F°+" P; ÐÔîØß=ûè³OÀ`ÓB9ª.tŸ6…Ž“¸ö2“ì„Á9GÕOÞËgÖ…@RÑ ™©pN#“ä*U‚—Òù!ô,œ+Y8¸íêËtÐÞ¨PeùÉ¿aP?ݯ›ÞÁq5ªðN]õ2™a´ÀÅ”sìèíú)ãUNqzþ©2"äZ6¸|w^&SuÄOöD03UúKöB¸éÝæ{xÌOM—™d2“~Ô!#6§,Gæv®Ä‰z²r\+•_I™ÓϦ3øÛÕ2%·ë¯%ß/}îÒ˜dUe!>ßÈ÷2Ûâ½v±F¯ ƒºþÓšŒf¦#_;b#2›Ì¼¸Ân6Üúñ­~P“ÂÁi3¶jG8š%¢Á®ˆ€üA-€:“‡PŽª ݧM!⤯ÕÌ$ùfÿès—öìÞvúêÓN]õÒ‰gkÞ,W—ùõêJ®«ÁÅ%—Ùdðì…3dÜèœòÕæ|þ©{t9ºp*+&#‡í¶Ù¢Í›> óûÛò£ êJÚ Î ƒBWRnQ®%«jo Óõ”©²V:I¾÷o¯³Ï´ò ó€E%Y¬[”9åGܱý K<2(#rY»æ-šä«®ÞèY³´H¯>º;ç-ß3ÌãN:˜™* &c¡×ô”nó=;槦]~éåòk.ÿ×víÜ¥Åd1£,Ïi©H¾n¸pƒÑs‚dPg“«/.nPÜu@Fdi'šÈòÒ Éuõ&Î}Ϲ¶2>çûÈýGt7]“]WOh’Ëb¸YÔ{!W”otUå{™3Î “dùqñû•HÆG >Ñtäi6’u³Ùt\ç”%È̲’‹kèÆ?@jyæw%øA]ùjóˆãß<®³ùñÂÁ‰°}P;¡,¥ vEjš<„xT]H?­ §ZÊLÇŽîÝ8 =âÔÑLòÍÚ5oÖSx&’9õºãØyRzâO ŸfäZ0ÕŒ+8BÛ–±ãz×`Ð׫ýûn–}(FÕfi\èc¥ÔÙ gÀ9V2¢Kq=Knqd©à¬]ó–SG'%É7z ’|¯W­Ìâ<š™t×ù—×gi9fùî,.Ä–07Œ;é`fš$„˜\…RÓkºÍ÷¬P£¶^±uuø#kÞbÅXžyáM 0Õ³S„„V*\5:JÈ2h3:p׿ÀÈnÂÖÄFàº>$]~éå2¢«!óÇÕÐAgX¼îÊ“†„f¦…3„Ö%!÷ÈŸšdäê:ƒÌ¼x[£œ¤k¥4<©ãß<~î{ΕA»J¼u´ëÊÌq°ziÂüA-DZD”,ØP@¨hòâQE!ý´&䛾èø#À©uÐqÊhf:½‘O\ªËNR˜™J…“¥Ðh2 Û|BQ{BÑÌd§2õæjA8ˆ%¢”Á®ˆ€B-€@“ª õ§¡Ýô3Ó @Ç™€™©3Óx!Çä'Ô™lè6ßÃ#¢v„:#2ÈL˜?¨á–ˆ»" 5 MB<ª(ÔŸv„pÓ/ÌLƒg‚=£]ï(3aÖI 3Ó¡Èd&t™Ìè6ßâ„:£ô“¡ú›™0P Âá+¥vEDjš „xTQ¨?íÕ¦w˜™RÎë×­•úSWþ¥¹¶`ÖI 3S‘erŠL–t›ïáñ?Q B Q«G7^ý#Rƒ„šŽ]‰¨`WD@¡¦A£É@èG…Ô‚lúˆ™i8 ãL`Ÿ®Ÿê­i®-ØtÄÌ„.“Ðb2¦Û|ÿ)/;öü€ÁŽ…:£üÇ~Ë÷05}X@¨iáÀ•êrüñG6ú­?r/ŒÕvEDjšæÜrçæ¾´›âQE!µ ôšžbfH9)æ“ f¦•BšÉC¨0ÙÓm¾‡ €ò’â³M°€PÓÂQ+ÕèÖ¯|X¶;¿x1ŒÕE_›<è Ô(h4Í9oË)òäÂ`B?ª(4 „^ÓSÌL'etÒÄÌä„:“Ð_B·ù&ÊKrÏr4yÀB ‡¬T¯_¼X¶ÌLÔ}mò ƒP£ Ñ4GŸ\¬]ˆG…Ô‚kú‹™i å¤ ƒŽ÷Øc·Þº÷÷ï8øG0Þ>f¦e!Ðd Ä—áÐm¾‡€ò’Ö³êL0‚P£Âñ*ÕŽ™‰š¦¯Mtj4šFé“ ƒµ ý¨¢Ð€šJM¯13 tœ”aͯûYý7¹ášŸé6613„@Ów!» þ~y(/i=Ë!Ðd#5*¬R˜™¨iúÚäA ¡æ@£i”>¹0X¯* ¨i!Óô3Ó@ÊIÖpÅgÎÒ“ªÃØÄÌ„¦ïBp&ÿû¥0P^z–C ÉFjT8R¥†03QÓôµÉƒBÍLÓ(}ra°^¡U2P£B£É3Ó@ÊI¦œè»ÏýõÍ·½÷ü-/Ñ™ª“Ø4øÌ2M…Ô2dþ7Ka  ¼$ô,‡F“ì Ôœp˜JÍaf¢¦ék“)„¦iúäÂ`B<ª(d ¦…F“f¦ìAÊI¦œqž{æŽÎcÓ°3S(5ý:ËÀùß)…-€ò’ʳM°ƒPsÂ1*5Š™‰š¦¯MÔjdš¦é“ ƒ5 ý¨¢M˜™ÆÚ³{ÛúukO_}ÚæM€I-•›–Õ€IS‚”“,ì8u›œ™B©é©PXHøß&…9€ò’ijM°ƒPsÂ*5™‰š¦¯MÔjdš¦é“ ƒu ñ¨¢êL6˜™Š½p†Õ¯_·vÿ¾›ŸêÙvõe§®zi‰½O¯{úêÓlP¾?|h·Ž›=»·Éòm±vÍ›Ýëç‘•›–qY YˆŸ4 H9)ÃŽSQalºðªÿ÷ž»7~ÿïÿf®ÑP3Sˆ5=ò )ÿ{¤°P^ä)~ñ+~xÕ+V™­Wlµ©î:°úµ«mÒ9o?Ç&Õ)4š ` ¡†„£Sj35ÍvB Ôjdšè“ ƒu ý¨ŠÒLN˜™ hcÚvõe0¾cû2®“öï»Ùœ¾ú4´Ì$täÔU/µ£åÈw%¹¢Î,‹²ÙŒÜ–L•U‚ñj å$ #δÚMƒÌL!ÖôQ+äùß …E€ò¢Ïò›d #—];wÁ bÕ+VÉ$6¦ê0…PC¡)µƒ™‰š¦¯Mjdšè“ ƒµý¨¢P‚šºLf˜™ÐžÝÛdzÜ D§®z©L…tìè^÷™iýºµ… Ù¼é2›‘•&=s h´šéÝsPs’…g6mƦe¦çŸ:´ߟ•tN·%Œœ(5‡ýÅþ};”ŸÍóOÝ+Ë9vô«0>NùíêTpb†PU¼cuŵܤ翵¸’F~7éð½a“ É 2 FUeÖ®yë©«^¶çóŸ‚q½-“€Íö¶÷cþ×G`Ù{ÛÞrÇ=W¡4é³¼kç.Ù¬zŪ#÷„žÐT8i.Ü ‹•-ÐhúS5$—Rk˜™¨iúÚäA¡&@©i>¹0X‹Ðª%¨9!Ê䇙 éÙF¾y…™IȵüG8i6Š™I¯ßF'tÒúuka\èÒ¦?¡ RN²°àÌ©ØÔ£Ì´g÷õ§¯~\].§®z™§ƒ/:_ç\»æ-:"ùÞò“ešmWX%W”¯ú]}¹ãLïì…_–›“¥Áx¡Ã‡þBWoÏîOÁ$µvÍ[u¹èê™mž÷/Î>ë—e»_zuÔö|þS2n‹õA&mþÈ›ä’TÉlB¦ÊÒ“0©.Ó~<öðW5< w¶]óa›GÉÊë÷s¾àÇèÌß|ýî@Pç¼ýœÅ;<º¬rï·:¸á p•¾Ð{±Ø>¤,Ù³¬Ïݸ³™Þ´ƒó;÷=çÊ-23Ñ,ÂA)µ‰™‰š¦¯Mj”šè“ ƒó ý¨¢ƒš¢L~˜™Ð¸¤Ê§šÂ̤§2Éü Ñ¼U8Un®äŠãAÍIœZhlú½¯ÒÃªÆØÔ¯7Ííß÷gru¹À9JÚ•,3 -&‹ãÄl+ Îb¬Y9vô«:¿œŠ,Á"L*¤ë —õë~&wF#®-®ì,bÿ¾ÚY|<ÒòóËl‹7|ÒI~6uìá¥{;Ž’«èMÈC-3ÃT`K+\ÛHnTf^ÿ¾ß´½³‹OÊÊyä²ãÓWÚ ÐòÍë_üü?‘‘üø­ýÐëo ¤³úµ«eNù ãúö«Ä3ÓñG IZ[˜™ô‰‹ïŒÛzÅV/ÌOsZõÊå‡:”šþÂB ¥Ô&f&jš¾6yD¨vPjÚ¡O. Î/ô£*B jN(2YbfB’ O813;º7¾Ó­03é{߯”¤ŸÁ$ˇÏú¦¼)3¤œda¾©×wŸûë[÷þ~±©wŸÍ¤A!¼nqÜg&ù^f[ K#KífÇö+—Ç—F”u¢Í›6À¤*ôÍ"Û®þ0Ldf @ò L2î.œè)Önà4"ñH–°¸7¢sî/zZÉ$M<²¨‰IééEz˜THç÷ —+ʈýhƒq™2›±¥ää?þC2çÏŸùOõ÷Ò€Ùpáâ)W13¹ÿȪW¬J<3éʶ$™$†ó¦?{–5'Ésç§Š…7-ÄAqÓõ7é›éô«Ì4ùÇ Wׯ:ó»;!nÕ+WŸœäYÐÁÅå¿rÕ™ î>`Så{*äZÇ¿y\fÐå›­e˜B¨!ሔZÆÌDMÓ×&šÕJM;ôÉ…Áù…„TEˆA 9&WÌL+>´[özK‚NÌL§¯>-¾Ã®03éuãÌJOY’Ká©Rñv'š“,Ì7Mh"6e“™6oÚ°g÷õöã¸Ì¤‘¢°Mì>%äZë×ý¦ÞèÙ ¿ SܺÌÿüS÷ê}9|è/`uâ.¸z"ô.@UÑ•‡AµçóŸ‚&µüN‘™ßû2iqµÝÇ9•[”™w|z9ê…€f2X¹Ñø¹Nëß÷›q™²Â°bò«ñâWü°Ì9sf—_zy'¿ÔHÇpNY*ñ®ýù‹?ùzùFû <,î:àgÁsßs®Ú¤lü¦ëoŠÿäáÕ®¤êtüÑãò½>ìz6™þ¸õã[å{e½fáÌÅS«ä’þ(ÿœ4!-þ»Zžçø7ˈ̦ÁKVFŸÖÅÕXž§eXC¨ áp”Úw÷¡?“W‡=w^ãDuÑ=šÕJM;6^ÿú ®z Î)ô£*B jHh1cfZA[ÏÄÌdiNß—^f‚”“,l7ª76½ì¥?)ÏH™ ¬ÌLKáfÏîOÉ ,ÁF<*—qÝg½¢\K?qiÜòÍÙ ¿¬)J?ÎIVÕO5å™ Æõa÷f7°üN‘™Î>kqU+._›‘¬¿,'®j!G¥ËHéݽ“ni¤üRÌŸ™Ì»XAXŒ£AM *žÿb“LRã¦ÚmY%±›GÉjOÙz… +WÌÏoŽÜ¤d†8IÔÈ’¬o?õŒÐïµû,Æå©š“ |ï_ÈÍ©øŽ6¡]N?"ªbfÒ;5ñ¥ŸþcY=YÚþ};aRô/ñ¿‘eþ‹Ÿÿ'ö{`YLúÎ)†„ž³jåY-r-:›¥(¡ÕÆ–¦3ø^£‰AnÔFt•d!r]™_FÜu@g“°Ù„ª =Ñ f2¿ Úü2›.Á—&¡ƒšÉä¦å.k‘»Ÿ,YgÿXÉ:Ë÷p… ÊlòËbà߃<ò£BOXN3úp->ª®×ˆ˜“üøâú,Œ[Bû0ˆPíÂQ(eÌvB dªÄšþ ©ŠÐƒš*Lö˜™V˜63‰³Θ*3­_·Öšú2ÔœdA¸éÀ¬±i1Çô43­_÷.-ñoÌ)‘q(Jòcôtᣥá¤qôƒ–¬•¿/OÈ$¡t•Vœ?µ_NÜ—cäGY‚F£s.Þ¨,!sê’#— d&_nEfïýœþà }»œ ŽÏL+’ÐÙgýŠÌvøÞ¿„q%wV1]‡‰)Ji·zñ+~ØÿF`#X¦YaÕèô"¥õañ˜åœP¶ŽNJ‚ì"#Âè Aöv­8ƒ†'™ÇFô ™Í¯ƒ–#÷¹D®U¸ª"Þ¦"_¸„Þ:Ì©‹õ«$ôÖ5{¥O×vñL¢ÑglÁT:ÜÍháM :|/óÈ?»Ö ËiFçH$?ÊàªW®òƒêÄ2WŽÀÚ‡A„jA‰(o~?DA¡zA¬é©Ðª=¨!¡Âd™i…2S¡ÂÌ$?ÆAciÆUv™ ÂM—ÆÅ&”I0óÈbŽéifÒÒa½c†VÌv¢ÑX¾i&3½0zƒ˜Ñ…~À“F(ÿ–ºõë?“èħ†»cñH–/¬³ÄwÆÙœ0>Ž.jÛ5Þ¿oÐIòMœ_¾ú¼¥xN.~ðìÑ_‹³e92Ãâã³ø#Æ uìá;ä*£yp’’åo¼h½•&ùºíšËaOø‚ÿ¡µúqÿ»€`™e&ùF8æ3ë¤Ë/½\¦ÊU`žŒ€\Qf°„¡–z„ë :—£È—¬ª,Ð/SG gŽãºX(J:¸GÜ`²ô±Ò&(k¹÷€xcﵫ3'ž7(?Ê`2ª]8þ$¢ìùýY„j±¦¿BBª"ô &„3ÌL+4š™Ö¯[[²ðµkÞ,SÏ^8ÆUåÌ5'YnºW›äÇ›–rL¦ošs§-!?ÆAO^=3é»Þ`~½•õë~Ó*m%~äÄÙOËiÆØ]Ð$×Õã[ÕtÎÂ…Ò» -IÅIrs2"Ÿ“”~.øè £Åõír;>}¥Íà2Ób-ÒoÀÆ‹ÖË<›?rŒ’Ùdf¹ìøôÃ$#·"÷âmÿîÇü¯€ÀL°LŽöerœo#ú«Âúpà®2IÅóz Oòô tòUnÔÈüº@;1J …_%WõDžp³)]¦ý¨wÊߊ‘AYˆ,ÜF «ƒ~¶”ÙazÇõ´& w¼p’‰io‰ 4úÈ,.Ç Úg0Åx¤ã~þ¸›­eØD¨váø“ˆ²»"ÊÕbMO…~TEèAMýe ˜™Vh43;ºW¯¾íêËü¸ÒI{voƒq•Wf²d“œI±éD‘É 3­_÷®Ñ›ÎlžÅ|S˜™ô/»-æ7è髸õoZÁlJf–KŒ8'îÂòˆf?¢´ïÈ¢`|½ÑŠ™ISQáü°†z]ùÑ“—oô+$!!ãKXnƒq¥7´ßNÿ/_a&XÛ( 7JÏHZUô&¬‰!Fg€ÌdìCÇåÖã* ™núDžp³)™Íϩˬ¸Ú…‹µÙž~üñ¯ûø¤Cð9£O:‡IJ«Ÿžñ4NñÓ½2МxWŽÇÏ`šŸ„|cƒ'p7g›0ˆPíÂÁ' ìŠ(#T#è5=R! 5!ô—`fZ¡®Ì¤'.Å÷Ç×,µvÍ›aÜ03µi|lºà»ÏÝ£Q&ƒÌ,ÂÌdUȚÇ–NÛ)|¿[!YÜ„Ð.#“àƒ½·]½ø.³Û¯ôƒÎ 213é'É L²AQR‚ -?†•2Ó¸Ak¸ñ¢õ`ýûß(W×ã)K{ª}ø·§W‘e¸Ð5 vùójE&p´ÝÈq>ŒsÎÛÏÑ(ó„Ž—œÍt¢G„I^yfòãºÀ©2S<›)®Uábm¶ÍŸ~«<žòõwüŒŸ!5Z‘ä2î±3žü==þèqyfý£!3Èl‹µHGžùÎño_8sÁ:‘Ì/3ȈþhN<_apñÔÇvëÇ·úÁÖ`¡Ú…#O"¿¢ ŒP] ÖôWHH…Ô„_†ƒ™ iÐ9|h7Œ‹Í›> “äRÒƒ„þù9™M¾Ê÷0UßwúêÓ¶]}Ùþ}7 )_¦,JÀ`5'MØt’U›²ËLKí¦03YHòŸŽd6oZ<ü‹Ùh}¿[á©Oº’0éì…Ñ繑EãÏEŠ™IhI‰3ë-B~R{>ÿ)¹ ?¢3ך™°ø¨ýûv–ÏàÃPEºÌÑ#°b\ßOgÛäÿµ+«àD “Îyû9'âÂȹ£?¾&ß,u•©ã¥t†Ø§À´™©ðc¹!3éˆÌ›T×ÅŽËL÷}í¶^½ôŠ›NlÚ±ç„ÑÊ’‹}þz¤…H=ÅL~Ôïý<¶œó¼rÕ⓸œi4W-Îpæâ ò@-þÝÀÑ$}ÐdfmRzn” êTuü›Çõ¼'¿Ì6a¡z…ÃNJÇñÇÙüé·>üȽ0NTÛ 1G¨.kZvË›oøÒœAHHU„$T»P^…™ i!Šç m»ú²ÓWŸfÆ}ˆ’I~¶cG÷ ;¶_!ãzCr‘oƽWNÉÊèl0@ÐI֜ċM¿ò¶ÿ×ÿäå’™Nä›ÂÌ$ô}s'>rÛ‘™eÒ¶«? ãã¬}М²¤ôVü­ë§8-ž¶c³-Çûð#è8…™ÉNh‚?ñ¦½fV2ãËaÕ̤ ‡[úâ6^´ÞZ˜˜™äæ Y~\¸æ$Xæá{ÿR–³øð.è¿ð_~Ç?{åÿø_ë÷>x±Ý(ýL™j#[ÝŸ–Û;úpá†ö´eï†7ƒð'ËLzzŽ/_Z1üJ]=?¢3é=ð·ÿ•Î9.3é_¾ûº¤bS|–õŒ#'EæÑ‡K¾‘aqÓõ7Ƀ¿8Ï+Gó„ÓŽdDß ·pæ|H“<_‹ËM•oŸ>7UÈUd\µ_š°‰P½Â1'%åÖ¯|X¶;¿x1ŒÕE_›<ˆ#Tè5-;oË)òäÂà BBš($¡Ú…ì24ÌLèì…3ä`ãEïƒñ&è{åäò;ýìÇ>ý+ãüo¿óÓ2Ï+ÿ‡ÿÆWz5ç£7ýÏ®yõºÍ?¡¿êíÿþ…êIf:vtßr‰™i9ߌœÈ.+Çú ]ä$=•©0?Òl´˜HÂ$¡…H¦Z„ÒõY<ÛHçYÙkt•F•äÄà‰»à…½Íøóߺ·p!zª”_ˆ…ªê™InHÆ…ÜÊhd±ãìß·S­ìDãÎëWdNydôÝyâçÏü§â?þC/~Åë¿sFìer„㚟¬éhWò ¢°OÉ2¸ –GvíÜ%W´ŠgI oZðgÐhfò×ÒÁÅ̱²ÙùSZ²ÜuÀ²—Ì)“ +˜e/¡wB•®¤ïY6s¦›ÊŸåÚ„LÓkØD¨^ဓR³ó‹Ëvƒ™‰š£¯MĪ ôš–é“ ƒÓ ©ŠP…j²ËÐ03¡mW_&‡§‡OjÈ¿øß{%uÿö²“õÑŽþÅÏÿ™ç—ßñÏ`œ:÷Üt ô †Ì“™žêÐÚ5o‘«ËåôÕ¯9|è nê‰Ä#vl¿òÔQ.‘¯ñ³öïÛ¡©âì…_ÞxÑùB¾‘9ÍÊ9Ç9vô«º¹Ä¿(gË—‹,YfÖ†%¹•Å÷빂óü·îÕ¤S·]óaßñiwÜßnS:Ineôv³¥Á÷묥û¥¡JçÔyäælP¾YÎFK4`ÉE–pìá¯úI²br£²œÍ¹HnTæÔ¡yǾCOw’KüT&!W—…Èl0nônÊ×­—’¯zXš¬ÞJá¥<3ÝtýMšcäë÷iÜzÞ\ôŒž­£ó˜äG_^4ñÈeõkW[Ò$ƒòUÆå«ðq fÐy|uÒyF ^\²\W~Ôº>FOر¥ÉWíJ²žºX²e)]¬6&˜Ç™Íî—ôéJ¥›JžåÚ„LÓw+šÕ+mR‚˜™¨iúÚäA¡Z@¯iŸ>¹08­& I¨v¡¹ Ç·–}€™):}õirTPþF¶º>´ûe/ûÊͽæ5ÿÃÇÿøß}fçÅoyë/ž·þm>t£ÚwÇÇea#}vS?m÷î;ü'ŸÜõÎ5ïÑkþçéÅ›æöì¾^ë‰Yž´¢ò˜íù§î…Ķ«?¼~Ýb+‘õ‘¯‹çï„yÆ‘ëúåÃ'=ùI:F|¾Ùóùâ©0=È_Ë‹m×|xíš·ž>z£œö&±f7'?Úa’¯‘Åšsìá;6^´þì³~E–,7aŸ‚4ŽÌ '©ç¿uŸŸzøÞ¿”G^–æ£ÑZ-ݨ|Ýü‘‹b–Òy€žÍ$þ§·ü?tûÉ`ħ¥BzâÑ+ʸ\|ŸÔò2ÜäòÑû¤„Lòg$™aáM‹o•:÷=çúë*ÍL2uë[Ï}â¸Ì ç™wÐyl†’u2¿ ÊüB¾‰ÍÈ®(,ùÁqkÒml*y–k2M¯a¡…CMJ35M_›<è#T è5íÓ'§R¡ Õ+”—\YQ*ÄÌT`ÿ¾›O}äöŽíWÀ¤&èÍÉÑ‘^ügïÙ½íôÕ§ÉÔøYQ+Áç¥ ?ö¨'Nô¯wœè;3Ð÷¾þ¹V=•iv'ªM¬:5Ò“ªF 'ÕB·ù&ƒ„Yf‚ñ^è*65þ,‡LÓk˜E¨Fá8“’ÅÌDMÓ×&úÕ’MûôÉ…Á©„„4Q¨Bµ 9&'Ð’J03;vtïÚ5oÖØÔÎç4íÙ½mó¦Ø_¸“Õ[—Õˆ"@ÐIä›^€4sÂÀ3“°w´ù? ÷üS‹u4ÎT§>-Á|“8¬6µÓGk¤Û|«AÂz™Tû±©Ùg9dš¾Ã2B5 Ç™”,f&jš¾6yÐGh~Ðk:¡O. N%T¤‰BªWè2y€„T3S æ¤ òM_@š9¡ç™)Ôœ™è™5r‘o6Ž>ªÉ>¶©Pá»ðÊ`ÄIöš&l»fñ“ƒFº'ÕE·ù†ƒ„m}Vw¯3“j365û,‡LÓk˜E¨Fá “RÆÌDMÓ×& ÍzM'ôÉ…ÁêBBš(T¡Ú…@ÓkPަÂÌ”:i‚|Ó fVèsf 5gþsšâ§zÏ;N²°Ô4çìц+ùðïùé6ßÃp0ýdîU+ÿÒ\µ›|–C¦é5Ì"T£p„I‰cf¢¦ék“‰„æɦúäÂ`u¡"MªP½B¦é/hF3`fê;¨9i‚|ÓPgVèmf 5§³¼®¦œ4a£iÔóߺO?DÆë¥Û|ÛAªôó¼M¥I4›|–C©é5,#T—pxIécf¢¦ék“‰„潦+úäÂ`E!!MªP½B©é#HEó`fê;:i‚|Ó PgP?3S¨9iš“ ¬3ÙÐm¾‡í€ºÐ\ljêY™¦×°ŒP]±%õ35M_›<¨$4'H6]Ñ'+ i¢†ê’M¿@$š3SßAÐI䛾€@ƒ˜™5'AØe2£Û|óu§‰ØÔÔ³JMa¡º„Kê f&jš¾6yPIhNlº¢O. VR! Õ(T›fªõ)YΞ»ÿ@þaÀüå° Œì¾ýcço>ælÚæO¿õÛO=k¢¦ZŸÔ–S—{ÙÉÿ÷ÿæÿ¶´±hþòÏþÙ?»dã%pÇ…RÓkØG¨á’ú…™‰šæ_Ý„š$›é“ ƒ…„4QC5 ù&}ЃÂÌÔ_tÒ'}+ZR‰·½åÌ¥ƒ­/[þ胮yµþVVñ±O¿a´¶˜u¾ÿ÷_›j9u¹ü†_‚5Y4Ê:2 f.±¸œ•UÈt²œºÈ“UÈLµ>%˹öÖ·ÃÌaDÙºó]0[ ~÷ã§>ýøã°&jªõIm9uyïý÷ÿÝOüWK‹V.ÿúuÿîø¢Pjú ãÕ"ORïÜ}èÏd›³çΫ`œ¨.þÕMA(¡y@µéÐÆë_ÁU¯‚Á‰BEš(´¡…ˆ“8ˆAÍafê/: ‚‚Ó +ZRBÖIJè;iÀ:3ºÍ÷0"P{äðŸüù»íizûûNýÑû¡ó¶¼ÞoÛ¹¡âÌJMa¡Z„ƒIꩇ¹Fˆjd¯nB Í ’M·}ö‰‡¾õ – i¢†j"NÊ 5™©§ è¤ Nú Ðd d¤`ÜIf—¡Ñm¾‡ºI¾—‘ýº}ÒI'uœ™B©é5ì#4¿p$IDTÈ^ã ´šT›Þ i¢Ð†ê:NÊ µ€™©§ è$ N/@£iÄ­{/¸ÿOÂ`3BÖI ö`s Ýæ{+:uª00é$f¦za¡ù…ÃH"¢qì•Î@+¡™AµéP‘Ê…6T£rÒõ§5ÌL=M'APpÒ¦Ï=s§üBm¼î_Áx3BÙIöÎam,Ýæ{+:u¤$0©î3S(5ý…}„j#‰ˆÆ±×;­„fÕ¦_BEš(´¡º„š“&H?mbfê#: ‚‚Ó Ðhñô“_‘_¨ÅOh“êÊN:0ñtSËé6ß;Ѩ “bfªöš_8†$"*a¯zZ ͪMT.´¡… “ è>-cfê#h: ‚‚“>h4Mi+3…²“L<ÝÂÈBºÍ÷NtjWÅÀ¤:ÎL¡Ôôöš_8€$"*g¯}r ͪMï„T.´¡º„ “(>`fê: ‚‚Ó išÒJf e'Xyº………„nó= Ôš©“bfªöš_8z$"šÈ^ äš T›~ i¢‡jšNj ÷t…™©w é$ Nú Ó4hЙ +O‡°­Ñm¾g!ƒZ0C`R]f¦kú  Í):MðíEö:h —Ðl ÜôK¨HåBªKÈ:IÖÓ!f¦Þ¦“(8éƒFÓ¬æ3Sˆ;‰ÀÐÓ! +äé6ßó-ƒš3s`RÌLóÃDBóƒ£GÊÅñÇÙºó]?r/Œ-u¢9Ù«¡\B3€j“‚]û¯úôW.†ÁB¡"MòP-BÖI „žn13õ 4AÄIdšf5œ™BÜI†ž®`R¡H·ùžoÔ„9“ê,3…XÓ_˜HhNpäI¹õ+–ÕÎ/^ ã4¡ ÕÎ^ š„›œ·åyra°P¨HåBªK(;é€ÊÓ9f¦~¦“(8éƒLÓ¸&3Sˆ;‰ÀÖÓ Œ)4Žnó=ÈT£Z“bfš&š”RpûžÛW½rUþZ»nÙµpæÌ #:õàÝa’ZýÚÕë޻?dË2³ SnÅÏíüâŲÉ:ãM¯ñ×ÝzåV˜rP;ì•Ñ@1¡@¸I>¹0X(„¤r!Õ"”D@ßI3S¿@ÖI DœôA©iÜà2æžN`I¡ºÍ÷ gP-j Lª›Ìtz&™  Í S©Èí{n—_"¹lºl“|/V¿vµü¸î½ëôÇ5ïX#?®r™ië•[eDÆ-Åyž|ìIùÑ/Ç/ JÞ¢|µ9åZzuKW…43ÉW™_— ‹z)´žÙë£bB3€p“}ra0 ©\ÈCu }'wÒÁÌÔ#Ðt'qiÚÐXf }'˜{:…Êé6߃œAsª=0)f¦y`%¡yÀ+qû(3­yÇÑè³áýüˆ%¤‡¾þ|o?=¹ÉÄ判„F"™ß>ùØ“º÷,3íºeW\ìTâú÷ZÏîNˆ;é°WIÅ„¦á&úäÂ`BR¹‡júN  ì$…™©G é¤"Nú Ô´¡™ÌúN 0÷´ U¡Û|rÍ쉿}¸‰À¤˜™f†•„æDZ4†f&ùj#1mºl“5 ù^¦Æô³ýSÛáÌ£¸qðîƒ2(B“Ì##q™vJ”¯`že&½ó„¹õœ2SÒw'¤œ”Ùk¥hBÓ‚p“}ra„Š4Q(Dµ‰§suRÃÌÔÐt'qPjZÒ@f }'X|Ú‡õ„*Òm¾9ƒfvåÍïЇ´ÞÀ¤˜™f†•„懵TÊ7&Q˜‡lžqI(*\ŽÐräÇK–©“Æ“º2Ó¸S´z*Å»òM_è˥ф¦í&úä ©\ÈCµ‰§sÐtÄÌÔÐtR'qPjÚ3ˆÌ„ŧ}˜N¨:Ýæ{3hf÷Ü{ëŽ=P{`RÌL³ÁJBó€ã[šÒ¸<¤ôíir™øIÛ噩ÊÙL¢ðì'S’™üÇËÔ'{rÍ;ÖèrCÛ?µÝæ”ïuUu Æfz]™M'ù•‘ïuPÈr[6›Ü¯¸úv6¡'ù™m™Uíîˆuï]g³U¹;m½¦§ü~ˆ‚hBSp“}ra„T.¢Z„ÊÓ-:ibfê È:©Ž“8(5í©;3…ÄÓ9,>íÃnBSÑm¾9ƒÒÄÌ4¬$48Ö¥éi¤ðXÅ(™G.Ç>DÉV·Ì#ƒ2¿x2ó¸Û*?›ÉÞs·é²M²pùºõÊ­ºV~΃w”«ËˆoŒÍ W‘I2›þ¸pæ‚.Óf°«ëòeUõVtm54­{ï:ý€*ù^¯®Sáú%À Ü´¬ƒ,GnW?ÖJ.Vš&Þ…F“¿¢ ›ÐT ܤCŸ\ôBE*òP-BåéÔœd13õ4Ô@ÄI”šV}÷¹{Îßò’ËoøEŸIH<ÃâÓ2,&4Ýæ{3(MÌL3ÀPB3ƒƒ^šIaà:\ä›ÂóŒD\Γ˟êíϾ2.ʚ £Ê3“ЛÓà¢#}vݲËf2¯.4 ù³ŸŽN°‚™u™öéT}ý!¹iKQºòÕVCæ”%û©…E ueä¶|6’[ÑA_îäGXÃ…4“¿¢ ›ÐT Ý¤CŸ\ôBH* Q-Bè餜”13õdÔ@ÇIÄš¶=ñø_>÷Ì08“Pyº…ѧe˜Kh6ºÍ÷ gPš˜™¦…¡„æG¿4“ÂÀÉ ÚVä"W±“}Œ.gáÌ™S¬{ï:mИ„LÕ…À¸Ò[)\ŸŠ™ÉŸydƒ°@]7?"Æ}È‘ŒÈ|ëÑHWFo1ÞqU¸>…ƒú@Ååè­û»Y¸Úu 9&W~?DA7¡©@»I‡>¹0hBE*òP-BèétœÄ13¥šNj â$JM…ÊÓ-Œ>-ÃVB3Óm¾9ƒÒÄÌ4- %438 ¦YŽqd6mòÕg¡Ë‘¯jÝ{×mºl“?ãÆh=‘y`\éò ×§bf*\1X \7^}ë•[uÅd ž®’J…W7…«a ×§pP¨øPÄ™Ë×gv¡ÂdÏï‡(è&T´›¤è“ ƒ&„¤r¡Í/„žAÄI3Sú ë¤:Nâ ÖôT¨<ÝÂèÓ&¬$4'Ýæ{3(MÌLSÁPB3ƒƒašCaà(aÙE®èÇ«/Gë \ÝèÂáŒ$ÕtfÒ“q¹JTýì!™9®†Ñ©°>…ƒº>0(tf{Ëž(_Ÿé„ò2(~?DA:¡ê Ý$EŸ\4!$• ‘h~¡õt"Nú˜™ÒY'5ÐqR±¦¿BèévŸ6a"¡ùé6߃œAibfš ¶š Ó| G¹íŸÚ.WYµòãª/Gë‰ÌãBû‘\â›òD;™©pÅ@áÕMáj˜Âõ)ÔõA¡3Û‡=‰òõ©$—aòû! Ò Uí&)úä  ©\(Dó ¡§CPpz™)qÐtR'qkz*„ža÷iöª…nó=È”&f¦ê°•ÐlàØ˜æV8&Z5:çÈ—”êËÑz"óøX7úKj…“DÓ™ÉÞ4ãQáÕMáj˜Âõ)Ô Eœ¹|}Æ ‘…ü~ˆ‚tBÕA¾IŠ>¹0¨BH*"ÑüBëé 䛾`fJdÔ@ÇIÄšž ¡§[˜~Zƒq„ê¢Û|r¥‰™©"l%438N¦¹³pæ‚s–‰]£|9žÖ™Æõ¸e’ÿCoÞ݇þL^öÜyU-™)ÎiT®ð#¥<™'Þº)\ S¸>…ƒú@Á Ð•‡ÏŠ*¹EÚ ¿¢ PEÐnR³ñú×_pÕ«`P…T"¢ù…ÖÓh7=ÂÌ”8È:IŽ“8è5=BO‡0ý´³ÕK·ùä J3SEØJh6p´LuÐÀQògÑV…OûÖ³~ ?†’B…§,=ôõ‡t þ½`ÑÃÜ+_wݲK挡G— «aÅ´ËØ u%¹Sq¶j»,äÉÇž´¹ºW£ WÃèÝ÷Þ¦Ë6Áú(ùQei~Pï; Ž»;(T°+" žPEÐnRóè³O<ô­G`P„T.D¢ù…ÜÓ 7ýÂÌ”2È:©Ž“2ˆ5=BO‡°þ´›ÕN·ùä J3SØJh6pÀLu¸}ùó¼å«Ï(F‹‰LÝzåV™YÈ7ò£ðŸdË)<õÉ“[Ñ9å«.pÃû7¬yÇ]fá'G2¿,A.þŒ[²D…ƒB ŽŽ¯{ï:™GÓŒÜ)_¾Ê¸Ì&€|†¹®í¸[4vuy¬dùòUæÔõGÏVR¾Ñ¹®,\Èãf³ ›îÎ’ShØPO¨"È7}BR¹‰ærO' Úô3SÊ ë¤RNÊ ×t鎃ôàCÛa°‚z:„õ§D¨ ºÍ÷ gPš˜™ªÀ\B3°fªž¤cÎ\ˆgÁìºe׺÷®ÓÔ¢ä{«êàÝm!¢¼4ÉT?³’Ž;÷'ZóŽ5þºö;¿dYç8ÝGsŒqÇå{±û SáÎÆÕ.¹E£¼,\¾êúË# WñžÆ#ãÖÇÜÐPh"ØPO¨"È7}BR‰‰æŠOû Ùô3S² é¤:NÊ ×té¹gî”_¨×ý+Ÿ$„žaýiÖjˆnó=È”&f¦‰0—ÐlVQ f&ˆz“…tBÕÁ®ˆ€zBU@»é‹’Ê…H4§P|:ɦ˜™’Y'5rRɦKO?ùù…ÚpÍ«a|’Ðzº‚õ§˜B¨9ºÍ÷ gPš˜™Êa+¡ÙÀQ4Ñ0L™B4¡iÁ®ˆ€€BU@¾é‹’J„H4¿P|Ú½¦§˜™’Y')ÐqR½¦c3e¦Ðzº‚õ§ØA¨QºÍ÷ gPš˜™Êa.¡À4Ñ`¬}XøäÌZ Í vEªòM_„–T"D¢9…âÓ>ˆ5ýÅÌ”&È:©”“2H6›>3…ÖÓ¬?íÀBMÓm¾9ƒÒÄÌTs ͧ‰†duùŸÞ ‰„æ»" Mí¦/BH*:ÑœBôi”š^cfJd¤@ÇI$›î13M µ@·ùä J3S ,&48®& ÿ±ßþsÁ…8Bu] …&‚|Ó!$•‘hN!ú´ 2Mß13¥ ÊNR å¤ ’M÷¦ÌL¡õtP 0P;t›ïAΠ413ƒ¹„fૉžýîñÇÙºó]?r/ŒEh"T;ØÐPh"È7iÚµÿªOåbû1„¤r¡Í)tŸ6A£É3S‚ ë¤RN² Ù$ašÌZOW05 õI·ùä J3S!Ì%48À&zö»·~åÃòê°ó‹ÃxþB ¡†øý …&²v“²ó¶œ"O®ýBR‰‰æÒO› Ñd€™)Au’)'ePm’п̄ ¨iX=¨eºÍ÷ gPš˜™ a1¡iÁ16ÑÈÎ/^,¯ÃÊL¡ƒP£ü~ˆ‚†Bå,Ü$NŸ\û1´¤!Í)tŸ6A É3Sj ë¤RN² Ù¤¢rf ¹§Ø€š†ÉƒÚ§Û|r¥‰™)ÂbB3€#m¢‘ae¦P@¨~?DAF¡rn§O®~BR¹Ð‰æÒOk Îdƒ™)5u’)'ePmRQ-3…ÜÓ l@MÃÞAÐm¾9ƒÒÄÌa1¡iÁÁ6Ѳ¡d¦Ð>¨5~?DAF¡rÖq§O®~BR‰‰æÒO› Îdƒ™)5Pv’)'YPmқ̄ ¨i;¨+ºÍ÷ gPš˜™šo9™g¦<¨}~?DAF¡rÖq§O®~ZR‰Ð‰æÒOk Íä„™))uR5'YPmR!3…âÓ Ì@ÂÒAÒm¾9ƒÒÄÌäa1¡À7‘“mf ±ƒºâ÷Cd*a'}úäÊ7!$• h!ý´ºLf˜™’Y')r’Õ&-ýÈL˜…™ƒº¥Û|r¥‰™ÉÃbBÓ‚co¢•êÍL»nÙµpæÂê×®ï>X2Ø 9¨[~?DAI¡¾ã$NŸ\ù&„¤¡Í)ÔŸv@”É3SR ì$jN² Ú¤eRf ŧ}˜…ƒ:§Û|r¥‰™É`1¡iÁá7åeõkW¯zå*%ßûI g.øI%q§ö³™¶j»Ü¨lUnßs» nºl“ŒÀ`ýBà øý%…JøŽ“8}rå›Ð’J„N4PZQ&?ÌL逬“H9É‚j“œï>wÏù[^rù ¿ã#¡ø´3P£0pP t›ïAΠ413Œ&48§­~íjùý]õÊU0.Î\ÐIO>ö$LòjÏL"f¦qƒµ iƒÒá÷C”*á;NâôÉ !©DèDs õ§Pd²ÄÌ”(;Iš“,7)zâñ¿|î™;ap$DŸöa jÖ J„nó=È”&f&…Ñ„¦Çᔣuï]'¿¿p*“Úðþ ã&yMd&_-e¦5(5~?DAI¡q ã$NŸÜÐ’J„N4PÚ9&WÌL進“H9É‚jÓ/¡ø´KPs0mP:t›ïAΠ413)Œ&48§L•´¤ü3SÈ”&¿¢ ¦Ð8Ðq§OnhI%B*šG@퀓+f¦D@ÙI ÔœdA¸é‘P|Ú‡%¨9Ø5()ºÍ÷ gPš˜™Fš S¾š™BÈ ”ùý1…ÆŽ“8}rCK't¢y„úÓh1ë>3ýçïþûc~ûá#O}ýè“÷=vàáGïz„¨5|äÉû~òkûá£Ï?väÏCjAˆ>-ÃÔŒ”Ýæ{3(MÌLMh*p@NY›!3íºeךw¬Yµüá/þÉþü™ÿÔ2ÓÁ»Ú¤Û÷ÜþäcOÚ̲¨íŸÚnË12(“dýÜqý>¥ÂA!ëi×ëÞ»Î&Å•±6—o eP²`WD@L¡q ã$NŸÜ“Æ ©h!µBLÞ:ËLÿ鹞ìÁ'ï? ÇüD{âÐÃ÷Í#ßÿ6Ä †„èÓ>ŒA Á¢A Òm¾9ƒÒǞ݄¦âà){Óf&ý\ð5ïX£?nÿÔöÿä edãG~Óæyò±'W’ЦË6ÉÕåëÖ+·Ê72"ã6›Ò[± ù^FäR%3iòz¥5å—f+³ýOc–Ì Ë_¼_!gPš`WD@L¡BqÒ§OnÈI…B'šG@퀓·2Ów?xü>ž²D=ðøÁG¾óø‘†êµ²ø´cPC0gPšt›ïAΠ4 <3a4¡©,œÓ@håYõÊUò Т™Iæ„‘ÿé—^+³½ëßží-*Y²Ü³ë–]6ÛC_H…(sbfÚzåVñ§/ íàÝmDWF¾ÞþÅÛ5[È][LQ+[µì¾ýÁ®ˆ€žB… â¤oãõ¯¿àªW…¢T(¤¢y„Ô¨0Ùk53}ïéÆœ¾ôð£wyôνóë‹î¸ÿÑ;þ†¨2ù3«;¿6úWwøÑ;¿ñèò° €>qèáï}ëÈÊ6T—•ŧ}ƒ‚-ƒ’¥Û|r¥‰™‰fäŽÕi 6L™™"™SfƒÖ£egÓe›â Ìo#zb\Wèœ3Sálx+ß^Y¼•P:¨!Љæ»"z ‚ˆ“¾o>ûÄÑo=ŠR¡ŠæPÓ Á AK™é?=÷ÀS_ÇÀôÍ»Ž>zç‹ÇùX ˆª åh^òòÅœ+ÿ¹>ùµ‡ë~]ˆ>-ÃÔ ”2Ýæ{3(MCÎLØMh*îXB#ÑꢖT2É+œMË΄´<5ÊÆË3“ %#žÖ1•––¶|*ÕbPs`WD@O¡BqÒZÒ8¡Í#4 @‚‚62Ówð›ûW±?z×C£ãyèD3ð…¨^_{ô·Vþ»}äï¾y$Ô¢éÜqð|hûèû•ѧ}؃š€ƒ§Û|r¥‰™‰fáŽçi8fËLï>(S×¼cLÕú³-•I™)ž ¤ ¯3Ë7ò£\dæÈ¿'N~\¼"3Ó û´ vEôŠ à¤/´¤!Í#4 ¦AˆÆ3Ó·®8Pÿæ]=²x¶”¢Ù@ªß#w|bÓ3Gþ/ßYQŽª{î™;åjãuÿ ‹Oû°5¥O·ùä JÓ`3vªÎÌÓ L›™Þ}PFVþ Û®[vݾçvù&ζTvªe&ÿiMªðê…™Im†E¡ˆ¥¥13U•§s°+" ©P'}¡%•©hf¡5 âËp4˜™þów¯|£ÜãÏ]‚L@4¬BM‘º‹Ÿ ¶ôùø}ÿàyLHU<ýäWäjÃ5¯ÆèÓ2ìAMÀ~A½ Û|r¥‰™‰¦ãÒi`¦ÊLö>5ùÆ —P؉t0f&?¢ ¯™ ?><´³´4f¦ñ ë¤vE$Š â¤/´¤qB*šGÈ@Mƒø2Me¦<ÿÀãO–/~ÒÍâá:4¢y¬,AûšÿÀ¦cùOÏaEš(‰Ì„=¨!Ø/¨t›ïAΠ4 33a:¡ê–ãi€¦ÊL:ŸØ=ÏÙLú9JòÕF¥qƒ:²õÊ­MÀÒÊ039Ðq»"’ EqZR‰ŠfPÓ ¼ J#™é¿|çðÊ¿(÷PDóƒ ÔŠ»ŽØ?ìÇ>òŸ§|÷\÷™ cPC0^P_è6߃œAibf¢)¸ÃxJßñÇ08ÂH¤Æe&_…nßs»¶X‚–Å}f’dD–àãÑšw¬©˜™l ŸüÛ'- Ü¿ø¶¾]¾ËFN¬ÌòÈ0A»éØT(‚Ž“¸Ð’J„Z4³šåePÉLÏqéÎo„:@T‹Ð€Zò€ýó~òkCH*7ŒÌ„å‚zD·ùä JÓ3¦ªÈÃS/Ü÷õÛÎß|ÊM_øýZbÓ“=©íF¾Ê÷0UëŒL²·ÈéûÔdpÍ;Ölxÿ†uï]·pæ‚¥"[‚-vñs¸——V8(ìVdi²LùQ¨ƒþ´)ëY'þ,Ý(ØÕu•d}tQÖVžü[w»Ëƒ±¦¿`WD@R!'}¡%RÑIÏKÚwûžÿ׿ø‰ŸýÙiKð×µTä¡4ɺ@™G?ÜfÖ9õsÇ œ—¤qêÄÜyLo×MÊ4š ØNˆªB"Nâ¬"ýÅëþl߇íÇ"!Í,d FAs š3Ó÷¾õà7÷/~“ï•£…ôÓ2ùç½\š¾óøß’Æ;ÒefÂÔlÔ;ºÍ÷ gPš˜™¨wœO}a™IÕxfÓÌnýʇeMv~ñboJ¨*$ ËdÆÿ›WPU@ÇIœU¤ó¶œ"O®ýX$Ô¢™…Ô(h.Tgfú/ß9ì>öûáÑÑ8¤¢Z¬,>±OÿÛ¿~¤Úžë.3aj ê#Ýæ{3(MƒÊL˜N¨"8t§ž€Ì¤ºM;¿x±¬CK™)䕃“+ÿ¯]AU!'qV‘ôɵƒŠf2P£ ¸ S™É¿]î‘;¾ÒQ]°øtäk‹9uôþÙ‡&¾un1÷ä›™°VPOé6߃œAibf¢Éàèz¢03©®bSK™)–Á‚3þß¹‚ªBDœÄù¤O®Y)Ô¢™…Ô¨-ƒU[fú/ß9ü·m§2ñ#™¨9Ðzºµô!MßÜ?ñ„¦ÅÜÓMfÂ$Ô¬ÔSºÍ÷ gPš†“™0PEpOýQ’™Tû±©ñÌ:Ë0Ayÿ/\AX!:Nâ|HÒ'׬jÑlB jÔ–Áª-3}û¨}T ß.Gò•'w.ÕÕo=PrBÓRñé 3aj¦ ê/Ýæ{3(MÌLTŽá©W&f&Õflj63…Ú2(P[ËÿÛVVÈƒŽ“8’ôÉõ#N¨E3 %¨9Z†¬žÌôƒç°Oþ~ôŽÃ¡ Õ%Tžî^ú—×#ÿ¿g„À¤–¢OŽ™ ;õšnó=È”¦d&¬'TÆS¯TÌLªØÔTf ÍeP ³ œÿW­ ¬'eÐ’ôÉ…Áe¡Í&” FAj²z2Óó=¸|¤ýpèD5‚Ä“û,ðo-<¡éDôi;3aªF ê;Ýæ{3(MÌL4ÉSßL•™TÓ±©‘̲Ë@@^!åÿ=++d ã$Z’>¹08jÑÌB jt–«'3=yÿÒaö£w>ºQ]°ï¤âÎ¥šŽx¤¤1‰V3&¡Úa¡  è6߃œAiBfÂzBUÀ‘<õÐ ™I5›jÎL¡¼ Tþ_²‚¶B:Nâ 'é“ ƒ#¡Í,Ä †@d¡2ÓþÎa{ÇÿÀ5)ôT|Mÿý‹ï»,3}÷¹çoyÉå7üŒ7«P½0OPH·ùä J3ƒãyê¡™3“j"6Õ™™BÉÄÇÿVÐVÈ@ÇIYhIÍg¦ƒš‘…jÈLŒï˜£@ÙIˉ÷Í=|t\cRO<~ÛsÏ܃õÃ*T/ˆ” ìGé6߃œAiÊ>3a=¡*àxžúiÎ̤êMõd¦`ò…Êù½ Ú H9) -i\f µhf!5 ‰2Ó·X~ÇÜ]GB ª –Ä< ¿ÇïóÏêO;° ÕŠukÑÌt›ïAΠ4å™°žPpHO½UKfRuŦ2S¨0¹‚zBù· Ú )è8‰ 9©áÌbPs °¨!3=fcîί‡4@TÈ:©9ñ¾¹ÿüN“À*T/Ô ÌCuÑm¾9ƒÒÄÌDŽê©·jÌLjþØ4Wf !&KMhZþ_¬‚¼B :NÊBKZ¤O. b-šYˆA ¼BjÞÌô_¾s⯹¶! ÕÂTÝõ°þ",b¼€ŸXyÅè8‰ëmI«>ñÀ/߸õ’ÞAŒF£zPE ­§lfúþwW3Ó‹O-ª:`ŒtEÿºÿÎŸŠ”™0 ùÄT»O`|Ì—°Y˜zQá¼rúƒéÀ€bR‘ÂÔßÌĉ·l™©$(#Æ#ø¹%PX Ž“²Þ´né{'¿óÊóbDÕ¢‘©T+F*›™^ñ;üÔºóë€1婚“¬§Nð¿…s‹/` «_BŒw˜{bác¾„ÙÂÔ‹ 75‚Å Ô›'L3øÊL201ËL#ƒ&b¼ƒŸ^…ÅH9)!)ŸªE£Q=¨"VŒT63½öÂêSëS¾£1婚“,ú'Ðý·pöx^fzòÈ¿?¾ø, «_DŒ_zââc¾„ÙÂÔˆ 7õ‚ Å $ ‚iŒò™I&f™iPCLEàg˜@a1RNÊTNêG£Ñ¨T¨*xÌLÇU 0¦$•rRV 3õ)úõ‰û/…ñ²0 yMÄø‚}'|Ì—°\˜Qá¦F0 ˜TD0ÍP&3õ LÌ2SqALÕà'™@a1ÐqR¦ZR?ªFõ Š@U1À2“I™J9)+™Î.ï£PS÷¾ÆKÁ0äÄS–¤ð1_ÂraêB…›zÁ†bò©‚`c´Ì”˜˜e¦" ˜0àç™@d1rR¦rR?*Fõ *@R1še&“,Õq%3aò úˆ)ƒNšø˜/a¼0u¡ÂM`C1©‚`cØÌT$01ËLù |˜à§š@d1rR¦rR?*F%!ï §˜L–™L²TÇI\Ó2T32L9)ãc¾„ñÂÔ‚ 7õ‚ ÅäSùÀ4IñÌT<01ËLý@ò0áÁÏ6Èb å$Kµ¤~T-JBU€žb2Yf2ÉR'qá3†! ”˜Ñ`ÄIó%ì¦T¸©l(&Ÿj¦aŠd¦a³Ì¤Aì0±ÀO8Èb æ$Kå¤~T0JBÞAL1ýXf2iR'}3†! •˜`¾© >æKØ/L-¨vÓÏî'ïù³ƒ÷Ã`\˜QL>ÕLÃäg¦Ñ³Ì$Aæ0qÁÏ9ÈÒrrR¦rRÇßÿàþOw¯«`4•„ª1Åôc™É¤IEœôYf2nê…ùö “>nr\ÇE#†bò©p`š§_f*˜˜e&ä~Ú t––ƒ”“,Y”2]·å"ºs±L%!ï ¤˜–™L‚TÁ©…™ ÃGMLq˜lêˆù& “>Õnr¬ÞËj<Ì(&‡ª¦‘tf*˜˜e&H&ð3O ³´ÔœdATÒøÎÅZ42U…¼ƒ’brXf2 R§š™ ›˜‚0ÖÔó%L&q*Üä[½—Õx˜QL>U L#ÉÌä+0±6g&ˆ&5îgÞÎÒrPs’QIã;kÑhTò2ŠÉg™©!~ö?ã¼ûï‚¥µ‚ùfç}³ò«»áC“0¡¹¥þËL؆|tbŠÀLSw|Ì—°b˜Ä©v“oõ^VãQ`F19T20MÅ™Éo`bíÌL3Lšøw“¥Í å¤ ¢’Æw.£Ñ¨*äd“¯™éãx“ŒýÊûÇß'§‘½Ûwœf£oýò¦Ë/þÂ[aQ­¨|ÓE÷/uÅ3qßúy€Eþ…ÉL؆<‚€bòa i>æKX1LÊT¸hõ^VãáaF19T/0 öò‹Ï{L¬…™ Z†I–{â@ji3H9É‚¢”‰ï\ F#PIÈ;h(f zœÍôå;ïûÙ7þL7t.3·Ý˜›VóÓyFÇ_~#3ÓÎûf»wþp™‰ð÷Ä2Ó ÐPLL3MÂÇ| C†I™j7­ÞËj<<,)&‡êÆŒ U™ *†Iœ{â@ji3¨9É‚¢”‰ï\lF#PUÈ;h(f Ú¼hîá­ÆÐ½ädn Ÿ™ºÆ[¢þ™Iµ›5#g&þÉiHfÂ6ä d“»LÃð1_Âa’¥ÂM«÷² 3ŠÉ¡b1£iIf‚~ajÁ=q µ´ÔœdAQÊÄw.6£¨*ä43PÍ2gºÜð¡kaãi;ïÛã-a™I³Ì4dÓ™Fâc¾„-Ã$Kµ›"Vïe5–“CÅcFÓøÌåÂÔˆ{â@ji3¨9i‚œÔ߹،†¥’wPL5ËL3·ÝÁ%…>zx/Ì!–™è˯mfRáFhFfºpþðõ[Þ¸ùKï„ñB0ù1ÅdÂÓT|Ì—°e˜d©vSÄ꽬ÆCÂŒbr¨R`ÌÈœ™ Y˜ÚqBH-­5'Y“úá;³Ñ°TòŠ)¢f™iç}ÛÝ[Ag¾“e&úò-3IIe&òíç8»¼Ã6ä Ä£aˆi6>æKØ2LšT»)hõ^Vã!aI1ý¨L`LÌLP+LM¹!Ô–Ö‚š“,ÈIýð‹ÙhXª ùõÄT¿ÌtlÏAŽ)tÑï^$3}ùÎûnøÐµï~Ç»h2]é÷FNÿÛh©ãÆiþûÇßGëºÎ%§ÑZn&]§94Yßo„–ÊùýЗC[æþà•¿“óÎS3}å>3˜Ãß%½{r•Ì „öñ·ˆ®Ð¦`s!Ýí¬öþ¾ñë‹d¦C?Nëò½CiæÞíÐuZ+Ì4"ÌC^@O1V˜Æãc¾„9äIµ›‚Vïe5 –“CecÊh^f‚TaêË=q ¶´ÔœdANêcõŽîiFÃRUÈ;¨'¦ úe&ºþñþ¹_NÓönßé¢ÃûÇßG¸ËÐGÝnèVx2O Ú¬¡ ’^ù;¼ºð.¹÷¹ ëÐ…fÒŽñRéÐÃ{y ­BàV4žÐo©slÏAÚ2oŠ.´V7èôÌá¤E0.¿XºÒÍCëKÝN«ÓÌw¿ã]îS}§¨ïÛ·?3õI7Bd3gÞ4_è:Ì÷¯ºÌ„yÈH*FÂþÒ|Ì—0g˜©vSÜ꽬ƃÁ’búQÀ˜’š”™ R˜ºsB¨-­5'M*'õSƒÌéÄWËÌä>¥Ë ½§áÀ4‰¹;¼ü}rÜ—̳„xúÈ«ÓdºE¾•n¹Xvèá½<“ÑvèúÇÿð&Z…>ò8]hE^DWh]w_Å»Õ ÝŠ4çØžƒ¾vR¤:¹ˆ.Påïì€ûZúͧK掹ïÙyß,'^¥;5âäd¦ÏL}’ÑnâC?î¶‹ü«Sf‚ªbÌ.mÃÇ| ‹†Ij7CY½—ÕxXRL?*S^2´ ÓîAˆµ¥ æ$Kå¤LHÄwîz3–ªB~A71C©kf"î,$Ù;ô4æN´é–ˆžEäƒWþ/Õçõðé-fïöp+œ3èòeõVDn‘<͇¹íÃÖh#t‹™{Ë[ë&˜!i. éù4B‹xßè ,åï<|-îîÈ| oŠ.9ßœî¢õj³ó¾Ù½Û‘Ÿò4™Ä~öŒ3Þ~¿¥>U‘™0ùmÅ .íÄÇ| £†Ij7CÙxÏ%ÃÀ’búQuÀ/êž™ L˜&‡"‚K;AÍI“ÊIýt:Ñ'øå·^²ž†¥Â_ÐMÌPjœ™ÜYHtqï®§±w¿ã]yV›ÌyŬ-­ÅÇ| £†IŠj7Ãzåô ÃÀ˜búQuÀ/ê›™ I˜æ‡"‚K;AÐI“ÊIýt:ÑÒ÷N}ç•ãëÙh(ª ùÑÄ «Æ™‰¸âÂJæ4’AH¿ ýBŒÆ[p{"ålÄõ—(™É}å©I|æ×Þí;ÝéNò¤*~9Ô"šÜÙJÿ›æµ2'ˆ}VáF藙ܗùžM„¶LK»ß|\ä™÷Ì„yÈ È+†`ji3>æKØ5LRT»© ,)¦•Œñ¥Ž™ b„i*x(B ¸´4©œ”I5£¨0äD3¬zg&7N~Q[¿iÜ2º­¡gÜé7ADŠžq·@óaœäl¤`f¢¥4“¸Ó²2o(g2¹$_xH×Ý®ê ¾¿ûÇïà£h÷:ûÔÿ¦s&ˆ›PáFè—™èÓÌq‡¶LK»_.ò¬XfzúèÝK'‚Á ˜‡¼€¼b0²>æKØ5LRT¾© Œ)¦•Œñeîáše&(¦Áà¡àÒBPs’¥ŠR&ÕŒF ÂGPLÌj–™ô;û¸Ód¸}ð´Æd¦Ïtÿ­Hè ãùt&“œ}è‡7(÷®»“•èŠ^*›+‘™Vß;©;®ÂÐŒÌtþÕ§èÔ'î¿Æ3`!ò"KËaa1„ùv “ÕnêKŠéGuc¼y­N™ „iò•~™‰.ýÞÉÛmÆE¤è×x *£täl¤_fâvF«ÀËÓHÎ å,êÇ}÷èéÓw¿ã]°:,¥OåRæÞ›)s)q¹Š·³¦SgÄ>÷V›^3S÷«õqG|óq‘gIg&ˆ,-‡mÅ8|Ì—0m˜D¨vSSL?ÐŒñe-ߤŸ™ =˜ö€‡"šK AÐI“*J™T3jCA.1£iBf".Öð¥ß™AtÑgâ>¤CDŠžqMä\”³‘~™‰·¦÷‡äÜP΢¼}ä?Þ'ß𛸓ª8HeîqÑ]Œð‹ïèÒûýïÔ^±»Ï½Õ¦W¿ÌäÆi;rÜq;ãþùÊLXˆ¼€ÎÒZXU àc¾„uÃ$B固À˜b2A0ÆqRÎLLÛÀCÍ¥… è$Hå¤~T3– CA+1#kHf"þ¦ ´"äinÇ\gËoêÌdc—m`;L«ÎჇéǯ‡qŒ)¦HÆxÑ›r’ÍLPL ÁCÍ¥m è¤Iå¤~T6–jCA+1#kNfrg$ÑEg&Â[  ´$šÌ"ó<·V¿¼âðFº9ñF2¹:ûì¶vlÏA7H{N#n‘wrå/yëæžž¥îUu™K9Mî3q­§·@­Ö·–Éä2Swz¹ï!-:ôðãnœnŽ6[pû$š™ µ´ö“‰ù’ "¦"×~¸óŸ .Þ°o÷>iü=ã4>vÙ˜›yæÔšFƒùió§6w6ø¦ ®+ñ]fîšqÓØî'ïù³ƒ÷Ã`y´ÿ¼0Ž1Åd‚4`Œªæ¤™™ 7˜v‚‡"²KÛ@ÐI“ÊI™z‚Ñc‡?ÿàþÍ08˜jCA+1#«Gfâ¼B¿™~ñÞ Cê—l˜ËIôѽtkæ¶;Ü–ÝLÇ­B}b‘äJ ]h›r‘ÜHogYO3tÈ徚@×oøÐµ´‡t¾t…Á ݉NtEõÛCæ–æo––òLÚC×òÜw¾@N3½ß·-ëÉF‘ß÷ÍÂR÷=¡¥t¿Wô‘fºEÝ/­g-ÏÊg&,D^@mi!,)&ó%×8LEævtžém¸xŒsT’™‰Ð§4yê¦)È7-¥9pîÒÕ¸ºs+ªû\ÇEËË<›i~÷<ííV#A0Æ UsHj™ Bƒi3x(B »´ ©œÔOO0ºnËEtçÂà* y¡Ä”QƒÌôñµsRœ~'qµ!™™‰Ûsðýãï£ ôKŽg²Ì“¤ôí˜Ãø±%—TôFÜ«öè«€E„1·«¼·ô)¿œMޜۚÞ·¨~¹á›n)ŒkôEñžÈïð/þÂ[!½q—é³Ï½í¦ ¦ÝŒÜíºosfr+ºùþ¥˜™ ¸´f“ù’l¦ «'þ¨ÌD®ýðµ—ÄH‘Ì4·cNOXY*3­Þ˽ƒá}°Ì4ÔcÊSA‡%•™ 2˜–sBÈ.mM'A*'õÓÓŒøÎ…ÁTòB‰)£6/šókïö;ïÛN2«JRx?a0}¼Ûý÷\5OvÞ7 ç:íÝþˆ>û©%3¢ò ¸´63ó%Ù8Lr2“V$3er¯¤ƒñÕ{¹w° ^½0ñ Þùžªb$¨Æ”§‚Ž“Hf‚¾` qBÈ.­A'M*'eÂfÄw.  Ú/PILI-ÍL&*hšÁ2SZ0 ˜"ø˜/Aæ0Þef¦ÃO>sêŒa#g¦ñ+:ïô¤W\½—ÅÈჇiò†î»†óGÚC·ˆF÷NO<“ÐúÔ½û¸|ÑÜä‡'i苘%'À˜2DÊÉ”Bf‚¸` sB(/­A'Mª(eÂfÄw. æQmÈ#¨$¦$ËL&<hš¡LfÂBT4—¶Ázb âc¾™Ãx—™™èÓN#l´ÌÄoÌ”ùÆá«÷òÚ§´3œ‡Î¼x†>=qì÷ ÃË °5þäŸ<ÅÕ‰\xõÂüîy.Mô‘®³å—{"KËA#0¦ ‘“ú‰ž™ ,ã¸!”—V “ •“úÁlÄw. æQmÈH$¦<ËL&<hšaäÌ„…¨ˆ‘¨$(/í¹ÄŒ†ùROé0à"#3Ùü©Í—¹‰Î7£e&‰G×¢Õ{¹{7NsèŠ-‰ß¶‰æÓ®Êqæ2“Œ)–™ú‚R`ÌhTHÊg™É$Ë=q ¾´©œÔÊF–™Í2“ I¥™&)™È·Ÿàìò¾ÕO1•ñ¥%°•˜‘ñ1_ê)¦™™ ­å›±þ™‰¶#’«B0mõ^î^ÏÙ¸væÅ3¼AZ ËLC€R`ÌhTEÈ2“I–{â@|ih: R9)“jF]|çÂ`6Õ†|8b|±ÌdBRi¦IŠe¦‰J‚øÒJL|Ì—°wßr2ÓÜŽ¹Î¹Bt}-ßô+A4MŸ©f&~Ñܵ¾Ö-ÍA{B»A“iZ–æd¦ÉOÊÁ¶ƒR`ÌhTB*Â2“I–{â@|ih: RE)“ÊF]|çÂ`6•‡|8b|±Ìd‚Q]¦a†ÍL‰ÊƒþÒXILI|Ì—dõ0UÈÉLcÝW«É|Ó/3_1î2ÓæOmÖ/dsg3ÁkßVïåîuZ«³'ƒr‘ZŽw n1'3Á`ÛA,0fªd™É$Ë=q ¾´4©¢”Ie£.¾sa0›ÊC^@1Yf2Á¨.Ó0‘3ô—6ÀDbÊãc¾áÃx7·£óLOg¦ß>AƒE2'$7“®Ð§pÖ'׆œÕ{yíSNQÐŒh]¹"-¥ig^<ß>x˜>…[\mgoÚ “ ÿ%;\~q™G-º¥m±À˜¨xTœe&“,÷ ÄøÒt¤rR&ÕŒÖð ƒTòʈñÈ2“ CE™æ*3a$* úK`1^ð1_‚öa¼ã—ªm¸¸“iœ™ÏÍè¢DãºhüŠqwx¦ÌL ¾iÃö¶Ó§‡¦9<áı<ÇY½—×>åÄ“i-þCrtnš'ðOî¶ï}tÓøid~÷¼ +<“7N_E¿Ð=¶ûÌé“0Ø@Ð Œ–*GC±Ìd’å„8Ð_ZšN‚TQʤ²Ñ¾sa0ƒÊC¾@1Yf2a¨(Ó<Å3F¢ò Á4Æã ó%h"Ư«?põXïtîÄ¢ÃÃ"àÞ éı´lèždDè:œ äl¼ç"GævÌw_‚Ç+N‰Î5sW'~1ºÎƒòKà“žä4"OYšß=O#¼ešæÆ?;xÿ¿ÙÖy\rÇW~5 ôc†¥²Ñ°,3™dÉÇ! úKK@ÓI*J™T6ZsãÖK®Ûr fPyÈ È"Æ/ËL& eš'Zf‚ÓxXFŒG|Ì— ‹˜ÐÖOE^:õÁò0©à¡+Gí† ½À˜a©f4ËL&YîAˆý¥% é¤Få¤~T6ZóWŽ;}‘ÊC¾@1~Yf2¨"ÓH3F¢ò Â4fãó%¬&$•oj“Ê ˜èS˜Ð@ ŒŠ F£±Ìd’å„8Ð_ÚšN‚TNʤ²Ñ°TòšˆñÎ2“ @™F*–™ž>z÷Ò©‡T*T˜fÃ&b¼ãc¾„áĤ N-`R鯉@20f(ªÌ2“I–{â@‚ih: RE)“ÊFÃR…È h"Æ;ËL&Ud©@f:î)úõ‰û/Uµh4Paš ƒˆ©ó% &$Upj«J––&ÕÀ˜âT**Ã2“I–{â@‚ih: RE)“ÊFCQyÈh"Æ;ËL¦j*ÇToç}³?ûÆŸqÞýŽwÁ„JÈLgWöÑ?¨©{ߢ‚Ñh Ä4ÖS>æK>L0*ßÔ&¥Õ‰@50¦8Õ‰J²Ìd’å„8`ÚšNjTNʤ²Ñ°Tò‚ˆ©B2Ó»ßñ®_ü…·v“.*¯Ò·›Ê1¡¼ü}ôh†.tÏ¢J ÌL?ô›™ Ä4¦S>æKØ>L0ªàÔV¡í‰A80¦ ‰Ê³Ìd’å„8`Ú²NjTQʤ²Ñ°T!ò‚ˆ©B2ÓϾñgè—}„q/*Ýx‹©ÐÞíÐ}J—&f&1 †ÄTŠù¶†Ê7µ€Ie¦UŒ)H"/,3™d¹!$˜Æƒ¦“ U”2©l4•‡¼€b*b™iUÿøÞtÇ®ýò÷Áx›`‹é~O&»ß\T¾[“ÈLÝ0f †ü²Ìd’å„8Pa²NjTQʤ²‘rÝ–‹èÎ…ÁU*y)ÄTÇ2SU¾|ç}ô«”.–™ñ=iSf…ÈGf‚ÓHØ>L0|Ì—°€˜TÁ©Î꽬ƇÅ%ÅS_ŒHU!ï,3™dñï *LãAÖI*J™T9RøÎ…ÁUªy)ÄT§™‰_ÎÆ>þ‡7ÁRç3S·Ò„_ü…·’÷¿®Óȱ=ap[&°q~s%ÇÓfiûï~Ç»hðÐÃ{ݸC7JûÐ *oxOs2÷Ÿ6øÁ+‡w›&èm~ùÎûäFÜEã¼"áµò÷™¦¹¿¦'§uß,iu&é·2pOhpmk=æØžC´T|O&î÷¤g2éÞÐ$ï0]Ù»ý˜hM£É´ íI÷Ûøxã2ä˜FÂðaBâc¾„ÄTMœJ­ÞËj|X˜€‚`L>•„ª`™É$‹›HPa²NjTQÒT6ÊÂw. ®R…¨<è ¦RõÈL¼òw¸Ð¥› pÂg¦nuAá†]ûîw¼ËͧOa2ÈÙøÇÿð&áE4‡FönßéFøBãÐhäõnbæ¶;x2s¦¡ë4»M7A_TwËÎû¶Ó ¡ ê}¦q¹Ï™` |OÖ'ïÝþo>ÒŠîÞ„mJ´ˆ&Ð4^…>Òuw‹°ýªdf¦ÞNd™i¬&0>æKALÕTÁ©Ô꽬Ƌ³À4cò©TËL&Yü;E‚ ÓlÐtR£ŠR&•²ð ƒªyÄTª6/š;ôð^®Ýdгhæ¶;:-á oøÌÔ­nÐO403‘œ^DwÞ·>¾ü}tåËwÞÇÛ×kíݾ“&ÐÎðÒ^ù;ô©CKÝLžCÛ”¡êãx¯HWÜ ã˜B¾õwwÏ“rч6îfê}¦™¼Ãô©›FƒÝU3¾Kî{"ç;nSnû´Kt]æ$ºîÌÞíì¼oö3SŸt‹èSGž©D×y Ý/uæð Ýtxgè㡇wƒn^äÆ+Tyf‚"Ó<˜ÓÊ}:rfr{’¹¢;Á rÒÀÌä´$âê•Ü…¹üøOýÈG?»úrmïL&zî †9}ò†»Þ “sT½óß;çÎÏ*bfÇïÁØ(ÛÜÐuþìpÛùìö_‡-°ºoçö/¼¶àÐ"˜œ#µíÐ7¡gu‘‡nÿâÛëJE¶ó+Wþ­ÕØA.?ú£?zà‰ÐŒðSJ Ä4dÔ¨¢¤©lÔß¹0yȈ ¦jMÈL9¨¸~'¼}špH½3wNm˜™rnѽàÖu77ð+ußù=­|f‚¼Åh÷xi÷«[13÷©î-â¢Ì÷óv7Ôý†¬Ovô*‚Ì„¨Ã2S,&">æKØALuT<*Ž3Óu[~^¢Rº¡¿ñ·þûÿׇÿ—ëïèü)br÷W¯:ñCP[LOD0&‡*DqÁs~°ãñ[è_=}„qc|áß,„˜fƒ¬“U”2õf£þøÎ…AÈC¾@1ÞíÕ„ÌäÞ›‰.ï~Ç»à  ‚úmœÐ -ê¶\”“iò ÎÞí;y)mœf—™`ò㎔³Ïm‡7è53­ç¤îþ¯‡˜™ÉÝ"ÍÔÄþ¬Îw§MÑR7(ñ*°U)™.œ?|ý–7nþÒ;a|è2 ƒ¥ÃDÄÇ| Sˆ©ŽŠGÅ…ÏLtst£gNŸÜþõYlÊÁ˜~Tå‰ žðk–™LÕøwŠ!¦Á ë¤F¥L½Ù¨?¾saòDŒЕ@2¹áC×òR¾Ðý*¶|9§AZÔ­¸('Óä·”6›£ûZ°õµrãNœ}–òw’Vï·‘Ü=YµZwÝõ³³Xf¢ ]Éáæó—I—ä2v¢uß>þÀÙ•}08t™&ÁÌaââc¾„)ÄTGÅ£âbe&î)›²AJ0¦z"‚gû™,3™ªño ZLƒAÖI*J™z³Q|ç "/ ˜2 'õÓÌD=¼÷ýãïã9|¡™ù/“r6Î-£[7pQN¦É/8ni÷†pi?uÈL«ÍE¬»b f¦î½€‹2ñ—I—e¦áA—il&:>æK˜BLET9J”ÌôöþvYU,6õ€Ž`L?*ôÄÏósXf2Uãß#´˜ƒ¬“•“2õ6£\|çö ªBTT3¨H5'3±Cïý ø›útE¿¡R¦œsË  0Nr2M~ÁqKó¿P—ÌTòl&X+™tinf‚.Ó$8L ø˜/a 1Qåh()d&f±i¤c2©Ö <ÉÏg™ÉTƒHÐb ÊNRTQÊ$šÑ |çö ªHTä3ˆGÅ5-3±CïuâýâÿçÈÙ8oªÛ>pQN¦É/8ò½™`QŽºd&—“º_Ýzˆ©.3%÷àX‹Fi¦1°n˜Dð1_Âbª ²Ñ°ÒÉL¬í± R‚1™T뉞ád™ÉTwHÐb ÊNRTQÊ$šÑ |çö ªHTtSd£a533‘Cïj~ÎdnÝö‹Šd¦~/‹ã[ÌÜl?Õe&x(–³‡}öd5¸|fꓼr’ËLÝïÉú¸Ã»M—îû¸ãR¶Ïó»1—ö«]UñŸ™ Í4¦ “>æKDLT6Vj™‰µ76AM0FS­'xz_„e&S5þ­!A‹i*È:©QE)“hFƒð»>¢ QyNLŒFSûÌ´wûNÉüÿ™óûÉ™Lƒ´(³¶ÉLývàýãïã z]¦Ç½g&wR•žén+s#niï[­¯þp´â¡‡wƒd`÷q}ª›½p)nÕïÕyÌ}‡ûÝœg–™ Á®a’ÂÇ| ƒˆ©‚ÊFÃJ33±ÖÅ&¨ ÆhªõÄÏí Ús`+ý[~ô‰Í0nŒ/üûB‚ÓTuR£Š’¶žŠ¸që%×m¹h}DE¢ò  ˜ ¬~™ ª×rÜÙL™JËÜ8ãdCý†â´q^”™Šx›t鞛ӡ½r3iknì$ͧ¥¥ðÆR.î ü¢rö¸}Áˆnˆw€Æé£wÜžôžÕ©-;ï›å3Ï0r7çÎW:ôðã2¹=‡Õig£™Û¶Èñ~óéS÷%й¨*ž3Ô™ÆÀ®a’ÂÇ| ƒˆñN5£¤œ™X[bÔc4Õzb'öCyæ¹=¯Ÿ} ñÅ=q Ç4d¤¨¢”i=!ñWŽ;}t}DE¢ò ¡˜ЉJªMfrA‡.3·ÝáÆåIC®æp¦áA73G¿Ú¾+#úåo|Ú]膎í9Ki>/¥-ÐBWº5duÂg¦nå t‘søS8e‰¶OKyrækÜœü}.ÑÅí}”7×{Ê®E_Q7fuRËg¦>É7Më®÷¡ÿ÷du‚«TrO#´}73g>]¡oѱ=‡x}tU«B–™èaRÃÇ| ›ˆñN5£¤Ÿ™Xócc€j=±À³zc’â„8cš ÊNRTQÊ´ž†¦ ÑcóûÉ“G`¼¸ï]øÁ# ߘßON.¯È¤Ì3‹Kqw  ˆDåÕ#3½ûïúÙnep\¬áwûæA îŠ :9r6þñ?¼ Ñm¹aѧѦhœö‡wéuÒÓ—ï¼w€çÐ…®ÓZ­øÔ'y¦’ÞgsÀ{ÿ6Ÿ+SôÅò°%Ïfâuy_é÷ßL}Op2Ÿ¸äæÐ…®Ó íÝþÌd;ï›åŸ7Ùm“é#oÁ­R‰b™éé£w/z¨3Í€EÃ$ˆù6ã— F£©KfbMŒªõÄOéI{â@Ži*(;Õ¹qjªˆ¥3Ën••ï_8zbñÖÍÓ§¦]lß¼kL§6iíÛôÄ¥L½…èʉ‰‹7l oƒE=6¿ÿ²±1ÂÛ¡9¹¼òùýŽ,@a©Ýâ{ÆÇéÖy`i" ùR§Í ´ó¾ílà+ÅB:ôð^Þ+Ñ÷\ï$íL¿Ýv™‰'ìÝþÈÎûfI¿=ü8χqÀsNc™Û¤O î’2ÓùsOÑ?¨OÜ)Œ÷‚:Ó ˜3Lšø˜/a1~©`4šze&ÖÀØMÁ rOð|Þ˜¹!ä˜FrA'./ôñmcc$óSº|}ß¼[åšk'iü=ããܘhÏq¥éΙm°Þ¯õäáìJ@u¢S›hk´/âÉ# t»®ì\66F×yƒtÝ–0èévÌL†üjTf2Á@fÂàÒB e¦³+ûèÔÔ½oñ^h[†Ió%Ì"Æ/ŒFSÇÌÄš› (T̓&÷ Ä"ÓH.èÀõÇU¤§¦è×úÛÆÆÜºN#nÂ5×vþº÷­›§´›WsÿôIDATݹK„爚~ÀgîtÂÐZæKXFŒ/*•ÑŒÌÄΜ>ùÈŸ}úè±Ý0ž4È Æ8*÷DÏáI<!PdI&žÀ23“óÍÃG:ÏúÞð†çæ\`R:µ¨df:º¸tëô4m„ЕÏÏή®Õ›ˆœyçÌ6XÊ+^Ü}o&ö½nëaÍírÁE~²»Yúèæ€GôZ@ÎùÜ̶k&;/9¤ë0-<(A•²Ìd†¶ó¾íîϺuÿ*ŸÊ.­²Ú˜,3i˜0Lúø˜/a1¾¨TTF“2Sý@V0ÆQ¹' x_Þ¹å3;¿åôKÇaÜ_à¡"Ó~çÌ6’ó—æø½ÆiÂçgg¯™ì¼19Í9º¸ÄKi÷–.—uÿÒmó{~ð¹µw(—¹Gþñì,]§ù/šã݃ÜäN.¯ÐÈ7æ÷ó ç4ñII<;ëF¸(É ê—h›¼5¸ÝÀ `™É”¤²K«¬7&ËLû…Iýpæác¾„qÄx¡:QI–™¢²` S¹' xêîËŽÇo¡ß–™LuäãQ¦y ì603‘'qg ]Üy=Ú4&ÂÉFf&>óˆ;/m[tøÎ]¹°úªº',¸TD¸Af¢OiƒîÜ%F#rð{Ãg&˜ÌµˆOƒbÏ,vÞȦ=´VÐøÓÌ9„{YÄÌ( ËL¦$U^ZÅ[f‚FSw6L=ý¨ >æKØGŒª•d™)ˆ Æ0U|ƒçíYf2U“CD™æ²X‘ÌÄá$ÄóׯW³'ºpmaïpn—›#ñËoõM3]6bú-Àûͤ§¥üé÷†ÏL×LNêÁËÆÆ`^"÷µýáOõZrœ>ÂxP‚±ÌdÊPÙ¥m,3e€Øa‚é F£ác¾„}Ä”§"Qy–™â€²` SÅ'k Šɼ‰0 ý„d™É”¡²K«ô4&2rf‚LSk>LÕz"Qy|Ì—0‘˜òT$*Ï2SŒ!ªø„ÏØ½³Ìdª&‡0ˆ2 e'¼a3¹sf†V¡K÷MÁW³÷ÚŽÉÇwîúZ¢1‘~™‰Fh‘öÂò Íá¼RQfºfròóû596E2o"è>Yf2e¨òÒ*–™2@1Uè C~ñ1_ÂDbÊS‘¨<ËL@\0†¨â<]¯‚e&S5ù8„A—i(;á™ÈÅkïlí²÷”Ñ2mÍå$öXÿÌäF4.,e&˜xŽ|G'–yUƒèže&32•]Z-3A¦©5¨!ƯžT>æK˜HLIªya™)è Æ¨âæKXILIªya™)4è Æ¨âÁ³ôJYf2U“Ct™†¸Þ•WwN·¹xÃçœÄoøý¶±±Î,»ÆtëæÎûv¿g|\f£õ0$sð»ráWvÏ÷¡èüMº ?8º¸D#×LN®nMä$@4Ó•&Z…æð4î,Ï,.ÑIˆ7geêÌDø«£Á‡ævñÈçf¶Ñ­È??GKyß4ͤµøl&ýÖàU€ÖQÙÌôýïç§Ö/ZfjU^Z£Ý ¯¿¸èº’väÙ{_zéѵOe©©/è#¦$L?!ñ1_ÂPbÊPyÈËLAA_0FEŸÀà)zÕ,3™ªÉÇ! ºL“@Ù ï®ít¾\yõÄ7q‹\Qº¸{>}ä Cè:M–ÍèšÞí¼pfE.ÍÄw.×"Ú&¯K[&wÎlã—ÈÑåʉ ~{ovÍä¤ÛF#4ÎåÀ‘n=t‘Iè“Ó«_]܉E¡ qi¢ ß.¡ÉrÂ7æ÷󺼔v€F\«º4A艫lfúá÷V3Ó©§^P%Â4˜*/íuiÍ‹O-ñ¿…ïwÑE¥\²ÔÔT3,>Qð1_ÂPbÊPyÈËLAAb0-§¢O`ðü<ËL¦jòqƒ4Ó$®éÄòõ}óÒÒ™e·È»DÛ7ÏoÒDèÊÚkèÖ›ÑcûöKrQ¶ =™‰<8·kãÔ&wšÒ Ë+›ˆ›ÃŽ..Ñ"žL×ySËÉå÷à}ÊãŽ,ÈñaZúÉéiºi°´Ïu÷ÍM +$skA剮lfú¯çŸ_ËL'U‰0 ¦âK{¨À´ê©øÂÏ.ª¢”I–šú‚VbF€­'">æKJÌÈTòÈ2S8LË©è<9Ã2“©š| Í4‰k:©‘©?ŠS™©$È.­‰'e3Ó_~ÿ9‘™èI8ÄÓH½Ù¥U -Ikÿþëë“2A¬©)È%f(˜xRÀÇ| [‰™jCYf *ƒi3}ƒgæÁXf2U“C¤™&¸“U”2©xTœ×ÌÙ¥U ï$¢lf"§¯žÄqêÉgU0¤âK{@ZZsòÀ³ü¯àÅC'ÿò% bM}A71aÜIó%l%fdª yd™)¨ ¦åT÷ ž–‡d™ÉTM>afšâN:TQÒT9*®Û†øÎu©¨ (/íq'2Ó«'Vß’æÔªG˜FRñ¥%T]Vÿäâò1z®QIƒXSSNL=M'A|Ì—°•˜Ñ¨0ä—e¦@ 2˜6SÝ'$xNØž[é·Ã£Ol†qc|‘C¤™&¸“•4Šë¶¡·^rÝ–‹\**âKK@ÙIЇÌôƒe{ðVQñ¥=0-­sïÿýŸ^^TQ ÈRS_POÌ@tÒÄÇ| s‰ C~Yf *ƒi3Õ}B‚'äQ<óÜž×ϾƒÆøE¤™Æ€²“•4Šë¶¡ïœ9~ìôQ—ŠFñ¥= ì$ÅCfúËï?÷Ò!ÎL'O°×Í5žŠ/í¡êÒšc«?ÿOüoÿ¢’½¦Ž  ˜|˜rRÆÇ| s‰ªBÞYf Bƒi-Õ}B‚gãÆ4<!PgÊN:TQʤâQq*•ñ¥% ë¤ÆCf"ß{~íusOÙëæOÅ—–À´$­þ½Å3GOª¨<{ïK/ÍõV›ÚŒbúÁˆ“>>æKXLÌTòÎ2Så 4˜ÖRÝ'$x*nLSÁCu¦1 î¤C%M•£âT'* úK@ÓIŸÌôýïº×ÍÙß›k¶ÞòÒ*˜–„§Vßÿü©EÕ•zœ?wþA}âþKU¸©()&曺àc¾„ÅÄŒ@U!ï,3UZƒi-•~‚çáÆ4<!PgâN:TTÒT<*Nu¢2 ¿´4ùÉLùýç^þóµ¿7g'45™Š/-]I¢øîOþKO|ÅÜâÙ•yú5uï[zÃM@L1™°ÝÔó%,&fX* UÁ2Sµ 4˜ÖRé'xnL³ÁCu¦1 î¤CE%MÅ£âT**LãAÍI–ŸÌD^qõ/mutž™Cž0 Ð[^ZÒÒºõwezýÅEÕ•€e¦ÆÃjS;|Ì—0š˜a©$TËLÕ‚Ö`ÚI¥ŸàI¸1ÍEÔ™f€²“U”2©xTœJEe@…i<¨9Éò–™þòûÏ}÷ˆ;¡iQ Ó*¾´¦%aíT¦—ÿüä_^€¨:™¦æ™ ’Š‘°×Ôó%Œ&fX* UÁ2S… 5˜vRÝ'$xnLãÁC¦ î¤C%M•£âT'*LãAÊI™·ÌD.œ‘ïÐdr®yTi HKkNxÖýÀ9•‰Ô93AU1Æšúâc¾„ÑÄ Eõ ŠXfªäÓBªû„O¿ix(B Ð4Ät¨¨¤©xTœJEe@…i6è8‰ó™™È+ “×a§0õ¥âKK¨º´æ˜{çïW¾5øÌ1ËLƒ™¦îø˜/a71CQ=¨"–™ª¹Á´“J?ÁÀsïDœ[>³ãñ[N¿tÆñŠ4Íq'**i*'"ÑÇzìðçåȰ ÄøràÈÂ7æ÷Ÿ\^ñˆ â¤Ïsfú¯çŸéÐZf¢'á'êP+LMõÆ—öÀº´êŧ–øçüÅC'ø*D%m5ÖÔ63A[1 Mð1_Ânb†¢zPE,3Urƒi!•~‚'Þéxô‰ÍôÛaÇã·À¸1¾ÈÇ! M3@ÜI„*J™T<*¨7]·å"ºsa°81]66Fs6Nm‚ñˆ â¤Ïsf"?X^éÜ‹ö&MÍ¡úK¨º´Š~°×~ÈÿÓË‹**õ^SÏÌmŬ3ÁÇ| »‰)NÅ êXfªäÓB*ýϺ“²ãñ[è·ƒe&Sù8„A iè;‰PEISñHÙ8µéÖÍÓ0ØÑÛ‰øÎ…Áâ ÄxT23ÑŠŸœž†Á2 àÔ‚ÿÌDzþê\§4Ñ3vh¦^zãK{@]bkoûMÎ-Ñ3sˆJÚz²±ÌÔ=]¦aø˜/a:1Å©TËL•€â`ÚF¥Ÿ`à)wj,3™ªÉÇ! M@ÜI‡ŠJšŠGÊÅ6¼ml ;z;ß¹0X´J¾h޾üËÆÆ`pdoꢒÌDÎ_}Ié¼¼¨ó¤Ê…©‘ÞøÒ˜s¯•#Ëߦ§åP”´ždSÃÌ…¥åzŠL#ñ1_Âtb R%¨R–™üƒâ`ZHÕŸ0àùv‚,3™ªÉÇ! M@ÜI‡ŠJšŠG½ž<¼@ªÎLÐbÒqàHçË·ÌTUfúËï?·òìúòÎû4°¿=W_ª¿´Aocêþ]¹õw¸?sôäÿïûP”2õT›ºe&ˆ,-‡E¦‘ø˜/a=1©T)ËLþAq0m£êOðd;M–™LÕä㦠î¤à['oÝ<½qjŠÜ93#ÓÒƒssí¬ráG—Þñ¯~ìò+þ&¸¥n¹ušög}œ'˜‡ÄŠ<ò¹™mü)]áðÌâÒ'×6KWèS¹ôäò /"îl&}+n„®ðˆó üò˼€ÚMT•™Øk/¬¿¼¨ãÀóª_˜ô©þÒ=™éyù“üê‰þòä¤~zÂe¦zÂÓ`|Ì—°ž˜‚T ª”e&Ï 8˜¶Qõ'x²&ËL¦jòqƒFÓx¢»sfæâ ®¼zâóÛg¯¹v’_õvôÄ"g&ºââÑ gVè:]!4B—S›\czÏø8­È3é £ù´èΙm¼ Íÿüì,]ÿñŸüžytq‰×¢Ë•/,¯pKzòȂۭâá óÌâ’Ë:'—W.£+¤»¥7Ð"×kÝ4-¥üÜ̶ONOó|„9¼ú7æ÷óÜ ]—·"W§-óû:ÑRºÂôná¦^ªÍLäûß=þâúßž#/œ:ðœ &eª¿´Áz`zNžÄD^qQµ¤~d²é¨Uf‚ÔÒZbšùÖS„Ê@U³ÌäDÓ**ýÏ´“e™ÉTM>aÐh*O\÷oŸ¥_ëpí¤;}éÖÍÓ4òžñq7B¸­¼mlìΙm•\{âOÙcûöÓ M“ƒkçʉ Zztqé÷oû©Ÿ¾ø¯tVïžÜDWhécóû]Kr«tnQ ×b¾1ß¹9Z—öÖ[ô¹™m4HyNÒ47rry…oôggÝ áTä2£™„¹mºöäæÞš&GÕ¦v*ÏL俜{þôáž'êÝwk²×ÐÕ…J0mÐ Lò˜ÈË~ò‡gUKÊ!«MG}2¤–Ö Óx|Ì—0 ˜"Tªše&Ÿ :˜¶Qõ' xš2ËLUXyyeÓÍ›òÑž<}Û4,"»ÞµphÁmÐ)¾åÌÍjtCrûUC4š€Ð×Ûº'õ|kíÜ%•Ü MÞÙþô4Ê®ìž:$GÞxý7 ™{xÚ# n„\39 ÓH¿ÌDƒð 8½MËL,Df"ùýÎ è^ê9­‰-vOn¢'ö6L"zãK+<×ù±ì=ƒéÅC'_;¹Tì͘7çϤPŸ¸ÿROÔ–vÂÓ|Ì—0 ˜"Tªše&Ÿ :˜VQõ' xŽ8ËLÙtóêKu6¼iÃê‹mºèSß¿w?ÏÜõð.çA˜F·Ý½Ím“Ü2ð§nBæ§´5¹ñ*ÈÇ! MÝAå‰ëëûæén½xú‹Jí›—#âÑÚ´ýn$;3uó;›‰?å;—¯“;»guV\!´}ZKŽ(2¼c0øÐÜ.Úšw'=¹ 9ãôóNƒ:3éÕifzÉLlê(Pfbÿí?=n‘žÀ¯?{wº§,ž:p¼ëYcyò¹S¾ÓñÔ"œ»ä¼zâ…ÿöŸ!!áfÕ‘gï}é¥9L Ô–ÂøÒ|Ì—0 ˜T À2“7L«¨ú<ÁNŸe¦êp÷чËLdú¶Îkšh¾qƒt™ýâ¬'E¶Ì×i#¼ˆéSyWuN±ÌTž¬<ÑÝ85EwëÅâ­””î¹Kž3“ËF|çòuÆ7qtq‰?½uzºs‹bƒ(ÃkÁ ô£ONwþudÖšC‹d*²ÌT^ÐÌÄþëùçÏ_Ê:³É˜„¼xèä÷Ž¿ð‡xT„›àÒBX^Z…ù63j@Xfòºƒi€€g×µ`™©:ztÇÙõpç¼ ™™tb¼ú˜9ž¿eš#7¨obéÙ%úÔ2SyzââÌô¶±±ÇöÍk/œY™™®ì¾ÒͽnŽ6âN}r ÈÞ1äÜCn@|ÓµÈLÐkj*Bfr~ø½ãçám›Œ‰ëå?táÌ¢*GC‘á¦^ ¹´ f—¶ác¾„ Å ¤P–™ü€è`ZE à©u]XfªN¿DdcâOi¦ÎL´næx‘-O\51ù‘I9®7EsÜéNÕ‘CdšºƒÐ—ËL.'õÃ¥'ùÎLv_éÖY·{6îÎlr ÊÞ1äÜãÆù¦õ4Bƒ´H¾¿RÄ̱¦¾bf&çÿzíùï÷øk/œ ËÇ––¿Þ ¦½Ž½ðÚ Käûß]ü/ç ÂM@si .íÄÇ| ŠÉ§P–™ü€î`ÚC 0à©u]XfªNN 3S?ýn"ù8„A¦©;=q¹÷f‚¨¤qgé‰Gý3SÏ̵B403Þà“GÞ3>ÞùSw½K tÂ;ƒ™àS's¼|fÒ3 ‚XS_Id¦<Ÿ†ã‰ùN’NTƒÑh ÝÔ”—öÀÚÒZ|Ì—0£˜|*…a™Éè¦=Tý žW׈e¦êè´ëá]ãWŒ»O~ ˆß>I¯R|ËŽe¦Š@åI·’;gf +Áw–õxÔÅëzÌLü§ßøÌ=8· –B”a¼cÏ,.ÉAÞÎ&&Üïêçf¶¹¢§‘X™ JM­Yf"Ðz"‚Êô¨0ä£@¸©(/í©¥Íø˜/aF1ùT Ã2“L{¨<©®—=¶Òo‡GŸØ ã¦<ƒ&®šÈ =™ ˆß;‰,Zã¤ø–ËLÄ“÷.à®+=87÷¶î»Æ´’U”ò¯¼z‚®=±äÞ_‰›¿&ŽÜ¸õ’ë¶\Ä×£‹K¼º›&A—a<ãÔ&7òùý4Hd{âÈ%_Ζ9pf’$|+º=õätE[††•JM­Yf"Ðz"‚ÊôD¨0ä£Ñ@»© (/í¥åø˜/aF19Tý Æ2SYÐL{¨<£®×Ͼöä_l?·|ÆMyƒ81þ¦Ý€¶Ý½V§‘]ïrƒNñ-;–™*‰'×\;Éq„>2qé…3ËW^Ý9QŽ.o{òðÂÊ÷ð™9Ø9óh-3Ý9³ÇySôéÊÚŸãñk&'iäè‹O:±Ç%$‡¶Fsx-]†ñféã{ÆÇ7Nm¢ÓõËÆÆ þZJ‹Íé7[oðggiääòʺïMNšÏïâƒÍír[ø\ï—çOõ™¦î,3h=±@å‰úN"TòƒÑ ÝÔÄ—–ÀÈbø˜/aI19Tý Æ2SYLK¨<6Fâ4ù‘Éý{÷3.G0p¢ 7#B×'®š€iNñ-;|ùs*E”šZƒ¾ÆÜ¡­›gýkî8ýú9XÄV¾áè‰Å;gf6NMÑGºî{lß~ç…3+œ“2Ù“‡6Nm’©èÉ# ÍïwܸƤÆ5çäòÊCs»èF‰LOûäô´|Ûo‡ÖuÜ9H7”3ÈhEº‰‚‰@£iËLrO,Py¢ƒ¾“†üÂf4h7Ž<{ïK/ÍÁ`l_Z ‹!|Ì—°¤˜~Tú É2S)LK¨<6Fâï ”z ñ4‘*N*¾eÇ2SE ï„ñ•':o©FnÜzIfl‚¨”e=! G¥¢.Þ°aãÚû7IfÎL0X/ÐhÀ2´žˆ òÄ}'* y„Áh4oÐùséÔ'î¿ÆcƒþÒxØVŒÃÇ| cŠéG¥Ÿ,3•õÁ´„ @Àsic€ŽAýè4ûÅY¡K΋æŠlÙ±ÌTè;Á<ñí?ñÀ/ó÷SÇ&•€ŠGÅ©Z”oc÷um0È Í8uÏLhšÁ2´žˆ ôÄ}'ª y„ÁhÐn2œ]™§PS÷¾Æ£‚ÓxVŒÄÇ| cŠéG¥Ÿ,3•õÁ´ @Àic´2™‰Œ_1Nƒ´9È,3%ÂeX2c“ŠJšŠG©T”iãÔ¦·½°¼rëô4ýÔÑG˜À Î°Gh•úf&¨3a™ ZO,Py¢ƒ¾“†<Â`4È7ÒËL`«Š|Ì—0¦˜Lªûf™itPL¨<‹6&S¿ÄBnÿÞýn$³ízx ÒeÛÝÛä8)¾eÇ2S úıéáw|w@lRý¨ •Š2mìþ ¸‹»ïäíþ,€:Ãäûp_39 KkêLcXf‚Ü Tž¸ ï$Bµ!0òM6ËLQaR1ó%ì)&“ê>YfÓªU žBÓO¿4}[癉ð Mz¼ø–ËLU€Ü×0±Iõ£‚T-ÊôàÚ[wwþ\ZÊ Î0÷žßLþ¹·Z€4Ó$-ÏLÐz"‚Ðô¨0ä6£@¾É–Xf‚ ÓlØSL&>æKØSL&Õ}³Ì4"¨¦ T žBÓφîÛxC Zyye¬ûWá–ž]rƒœ‡tZ8´À÷/¾egÛÝ«”¶ ‹ªEÄšú‚Г‚b±Iõ£‚T-šf€4Ó$–™¡'.H<)PaÈ# F#€|ÓWJ™ *L³aL1ýð1_žb4}³Ì4"¦ñT ž?7Àëg_{ô‰Íç–ÏÀ¸)cå啉«V_û³áMÆ.s¸ÑG7yú¶i¤ ­hò#“nmv¨-;ò&hæìgaB¥à¡XS_xRÀ!)76©xTœªEÒ¡{ž8ö ö¦ Ë4Œe¦@å‰ úN"Tò›Ñ àôe™),)&ó%L*FSÑ'<ËL£€aO àÉs3ì9°•~;<úÄf7%íß»?Ÿ›¹phAޝ¼¼â1·>íÇ­èÀ„À'4ÉÇ! bM}AâIÁZKêè›T<*H¥"@7qÝ–‹`0šf€.Ó0–™R¡'.è;)PaÈ# F#€|“'™Ì!¦Á0£˜||Ì—0©MEŸð,3„i<Õ€ªÏœcÇã·ÐoúãÆø"‡0ˆ55}'231›¶|÷õ×0!¡jà›€ÁLh¢Ló´93Aë‰BO\xR ÚGØŒF'e¦°°¡˜ø˜/aR1@Ÿ(,3 „i<Õ€ªO››Ä2“©š| ×ÔôD@cr<Ä&U‹o3A£iˆ2Íc™):¨a2Öœ<÷ÊÁ»[8uHîƒDûóµwÌ>qK¾¯tѦ ô8§ºÛáiùÚÎÈîzø÷>öÿ½„ïë·üìõ·ÿ¯ÿúÆ=6ö¶ñ?7ôñçÇž…‚S ÐbÌ2S\zâ‚ēՆ|Á`4(8…œ?wþA}âþKa<(2̓ÅÄŒ€ù¶ã¨Ög¦7¾ù¯ýÜ[ÿztCts~þï|vû¯å›þeŒ>]gNŸ¼åWÿkt ÷\âe;7ÜõæoþÅ—±Jt?{ŽöæWíú;.ú³C÷Þ0ÚŸ{ßÌÏñÈŸ†-0ÚNñïÙ±÷Øv|y`î:Ø6ì×uÿÎk ±Î×õ†øºôvÜÓòÛ¿øn˜ýк^?ûÚ¿Ù¶úp¿ÚyØ‚3Ô×åk;¾lÜz ì†3Ôþ¤¶_®ßrQvA;?ÜþÐv^õ5Y—œ™¯ýL.Nf»v޾2N|ï¤Ü gæÑNx-îø+ÏCb±¶ãË›þqç±A°Ë;åW¡à¤BL³µ33Aë‰BO\x¢SmÈ#lF#€ˆSÔ‘gï}é¥9 ¢LÃ`.1£ác¾„mÅ8ªõDô{¿ó{«»^~î­? ?-u²…jCäÄw]ÇE09‡¯íüÉî)ìÌwOÞp×›arý²íÏÆ{VÿÓ¸ˆ~_×ù³ç†Ê MÍL ×›‡œ¡ò"lG>3ßòÿ7˜\5znÿ'{¦ä>H÷&So9Û¡E4ajÛ?¹ößÿ]ú(×Òn'°œýùú7·Àä¾¶“óªÃ=¶Âä¶ýc«; òÐO&çxtßfXÝ9üíGar?ô?á2ëìîÑOÏþz`_Ýÿi¹Ò©CpâR&> èkî€*ä|ëÔ!w®Ð@¾¶3²?þÆÇþ;ð~æïþËÿÄåïù±+~÷' ¢!ÿìío‡ˆ“>1Íf™)"¨½7&"Ujj Ѝ6µ‰'–ذ‰YfÊñ¥=,3Å­'"H<)PyÈlF#€Ž3´oàìÊ< VÒLc`1ñ1_ÂÈbTÊI¦–6ƒaIe Já“|c¢P¦à¡jS;xR˜]/˜˜e¦_Ú£m™ ZO,zâ‚ÄjCa3tœ¡]8äú-oÜü¥wÂx5 Î4fãó%Œ,FÕœdaji-ˆ¦‘Tª>Õ7&0ÕeЍ6µ‰'9‰F $å³ÌÔ”—V±Ì„žˆ ñ¤@µ!_°:ÎÐήÌÓ?¨©{ßã€:Ó ØDŒw|Ì—0²´œJ9)ÃÚÒZÐ#L#©T)|ÎoL*Ç4<!PmêúN r/Å–”Ã2S?P^ZÅ2SÐz"‚Ä“•‡|Áf4,è8£°ÌTS>æKØYZN¥œdaji-ˆ¦‘Tª>ó7&bš Š7õ‰'¹É2“7P^ZÅ2SÐz"‚ÄjCa6tœQ„ÊLhkˆ©ó%ì,-§jN²°¶´ôÓHªUŸüS)Õ_ZŠ7õ‰'®ãƒÖ”Ã2S&È.mӪ̭'=qAå‰Nµ!_° :Έ‚d&4Í€5ÄT„ùv–6S)'Y˜ZÚ z„iU‚ªƒ À˜ê¨òÒ*ðP„@¸©=±LCR>ËL™ »´e¦ð ôD‰'*ù‚ÙhXrFd™i$˜BLuø˜/aji3Us’…©¥¿ÃG%0ØÐ#Ló¨T) mõúÙ×}bó¹å30nËL4—²Ì´žˆ ñD§Ú/ØŒF)gDÕg&4 €ÄTŠù¦–6S5'YX[ú»þŽ‹ 6$ Ó<ªUs@‹í9°•~;<úÄf7¥¨ÔÒfòqƒpS/P|¢øÊ·Ð·qæÑkŽL CR>ËL4—²Ì´žˆ òD§ò/ØŒ†)gt–™†„ÄTù¦–6S5'M˜Zrñ½ ƒ =Â4*AÕÁ"Ðn;ï<_¥0nF¤"‹áßM„›zâŠJ†¤|–™—v²Ì„ž¸ òD§ò/˜†)gtg&h4u‡ÄÀÇ| SKk©š“,¬-¹ø^†Á†€$aF• ê`h=ËLÞ¨¼bÿn’ ÜÔ$ž¨¨¤aHÊg™ @pi§öd&È=±@è‰Otª ù‚ÍhXrJ±Ì4 , &>æKX[ZKÕœdamÉÅ÷2 6$ Ó<*UÓ@ëYfò@…#ñï& ÚM@âIŠJ+Ò@–™$¨-­e™)0h=Aå‰Nå!_0 RN)Uf&h4u‡ùÄÁÇ| kKk©š“&¬-ƒð½ ƒMIÂ4Œ*AÕÁ:`,3•¡zŠÉÄ¿›$h75‰'ª+¬HYf’ ¶´–e¦À õD•':•‡¼Àf4¨9¥Xf*Û‡ †ùÖ–vR5'YX[á{›ª„iU‚ªƒÀtYf…*)&ÿn’ ÝÔ$žèTTÒ°" d™ÉÔÒf–™B‚Ð$žèTò›Ñ° å”UYf‚LSk>LH|Ì—0¸´“ª9ÉÂÚ2ßË0X{P%LèT,¦Ë2ÓpTC1ñï& ÚM@å‰NE% +Ò@–™H-m̹֒'h=Aå‰Nå!_0 jNY–™Áêaãc¾„Á¥TÍIÖ–ø^†ÁÚƒ*ašD• ê`,0k,3¥ê‰)ˆ7IÐnj*Ot**iX‘²Ìä@ji3ËL!Aë‰*Ot*yÍhXr<8î ýƒúÄý—Âx9Pjj «‡ Œù—R5'YX[ à{ë ª„iƒ*‚½À–™ QéÄÇ¿›$h7u‰'**LHEXfbÐYZÎ2SHÐz"‚Ê—ÊC¾`6Ô?ž>z÷Ò©0X”šúÂäaÂãc¾„Í¥…TÍIÖ–bø^†Ázƒ*ašDÅ ê`20‚e¦T41ÃâßM䛺€Ä“Õ•&¤",31è,-g™)=Aå‰Nå!_0 jNš ÔÔöó%l.-¤‚Nš°¶Ã÷2 Ö„ ÓªU«ée™©/•KÌhøw“ù¦. ñD§¢’† ©ˆövËLYŒe¦` õD•':•‡¼Àf4,¨9É‚XSS;L,|Ì—°¹´ª9ÉÂÚR ßË0Xc&L“¨T F±Ì”A…Sÿn’ ßÔTžèTTÒ0!a™‰@d1mÈL{bÖTž¸Tò³Ñ° æ¤ bM}aì0±ð1_ÂìÒ6ªæ¤ kKa|/Ã`A˜0¡bPu0Å2S•HLyü»I‚|SPy¢SQIÄT„e&(,†Xf ZO,Py¢SyÈ lFš“,ˆ55…¥ÃDÄÇ| ³KÛ¨ “&¬-…ñ½ ƒuaÂ4‰ŠAÁ‚`²XfZ¥âˆñ…7Ioê*Ot**ìGYf‚Âbˆe¦0 õD•':Uˆ¼Àl4,¨9i‚XSS˜9L\|Ì—0»´Šª9ÉÂàRØÆ{.!0XW&Lc¨TŒ¦=¶Òo‡GŸØ ãí¢ÊˆñH>aojO TWØ ¹`™ ‹!–™Â€ÖTž¸Tò³Ñ° è¤ zMaã0Ññ1_ÂòÒ*ªæ¤ kË0ž}~þÄwÁ`]A›0Í bPu°#˜>^?ûÚ“±ýÜòo ÕDŒwðP„@Á©H<Ñ©¨¤©„TDë3äß™ ÷Ä­'"=q©<ä6£aAÍIôššÂÆa¢ãc¾„å¥UTÐIÖ–v‚6aCÅ Š`J0FS5ÄTŠ(8µ•':•4•аÌd²Xf ZO,Py¢S…È ÌF ãÙ·?pve‡½¦Ž0p˜ð1_ÂòÒªæ$ ƒK;A›0Í bPE°&£©bªEœZ€ÊŠJšJHE´;3A[1Že¦ õD•'.•‡|Ál4,:>]8äú-oÜü¥wÂø ×ÔÖ ÜÉL|Ì—0¾´‡ª9iÂÚÒNÐ&Lc¨T ÆH*‚˜ªÁC§ òD§¢Pý¨ ËL&‹e¦ õD¡'.•‡¼Àf4,:ž]™§PS÷¾ƇÉ¦Ž y˜JaKÊÁÇ| ãK{¨ “& .ímÂ4ƒŠAÁ¦`Œ¤ ˆ Š(8µ•':Õ•€êGE\huf‚°b$ËL@ë‰*OtªyÙhXt<ó‘™ ×ÔDãÆ£âø˜/a|i Us’…Á¥ O˜P1¨"ØŒqTû0ÁÀC'}x¢SQIS ©ËL¦fg&È=±@î‰*O\*ù‚Ùh(tü³Ì¤‚ˆñƒÑhø˜/ai UsÒ„µ¥ O˜fP=¨"XŒ!ªz˜Àࡈ“>¨<Ñ©¨¤©„T„e&Ó‡e¦ªAë‰BO\*yÙhXtü+™ ÙÔÄSF¢òø˜/ai tÒ„Á¥ O˜P1¨"Œ!*y˜ðࡈ“>¨<Ñ©¨¤©„TD‹3T,3U ZODzâR…È ÌF¦ã_ë3T3lCñ1_ÂþÒªæ¤ kËH}”À`@ž0Í zP0.˜Â^?ûÚ£Ol>·|ÆkOÅ <!qÒ•':•€êGYf2}Xfª´žX òÄ¥ò/˜†A§íÎLÐJ̰ yÇÇ| L¨ “& .#¹þŽ‹ Ö ä ÓªUƒ)lÏ­ôÛáÑ'6Ãx½©Òa"’CDœôAå‰Nu% úQÝÆd™Édjpf‚Ü äžX ôÄ¥ò˜†A§å2T›z\b†‚1¨:|Ì—0Á´ :iÂà2¾—a°N P˜ºS1¨"˜Ì0v<~ 7è#Œ×•j&:þÝ$AÄITžèTW*!ÑâÌIÅh–™*­'"=q©Bäf£aAÓ©„e&3$Ì@Uãc¾„ ¦ñTÍIÖ–Qñ½ ƒµ…Â4€êAUÀÊ`†Ô¨Ì¤‡Iÿn’ â¤*O\**i*!a™Éôg™©RÐzbÊ—ÊC¾`6 ª”ÈLPmêÒ‰ëO0|Ì—°Â4ž :iÂà2*¾—a°6 P˜ºS=¨"Ìš“™TÝ0‰àßMDœÄAå‰NE%M%¤"Úš™ §˜L–™*¹'=q©<äf£aAÓ©J+3“»O`|Ì—°Â4ž :iÂà2*¾—a° P˜P=¨ Ìðš™T×0IáßMtœÄAå‰NE% úQkÉ2“ÉÔÔ̹'È=±@è‰K"/0 ‚N…FÍLnê2Šé‹O|Ì—°Â4ž :iÂæ2*¾—a° P˜ºS=¨ ØÌHjŸ™TÔ0©áßMtœÄAå‰Nu% R–™L.ËLÕÖ„ž¸T!òËÑP éT¨}™ JŠÉ„­'">æKXašMÕœ4ap)ïe¬(¦Tªæ3’g&•3Lšøw“'qPy¢S] ¨„TD[3ÄÓe¦ê@ë‰*O\*yÙhXÐt*4Rf‚pS#SŒ†•':>æKbšM4as)ïe¬(¦îTª3ªºf&Õ2L²øw“'qPy¢S] ¨„T„e&“Ë2Su ÷Ä¡'.Uˆ¼Àl4h:Õ:î ýƒúÄý—Âx.h75IÅHØwÁÇ| CL³© “&l.%ð½ ƒ5‘ÂÔJBUÀè`FUË̤B†Iÿn’ ã$*O\**i*!ÑÊÌ%Åä°ÌTÈ=±@è‰K"/° šNåž>z÷Ò©0Ø„›ªb,;Iác¾„!¦ÁTÍI—rø^†ÁÔA¡0u§zP0:˜j–™TÂ0éãßMtœÄAè‰KE% úQ¢1Yf2™™™ ÷D­'"=©<äf£¡@ÓI´›º€°b6ñ1_ÂÓ`*è¤ ›K9|/Ã`ê R˜ZS=¨ ØL9uÊLª_˜ZàßMtœ”Aå‰Nu% R–™Ì –™*­'=q©Bä–£¡@ÓI ´›¼b4ñ1_ÂÓ`*è¤ ›K9|/Ã`Ò R˜ºSI¨ ˜L9µÉL*^˜ºàßM¤œ”Aå‰Nu% R­ÌLQL>ËLÜ „ž¸T!òËÑP ë¤ÚM]@^1˜rRÆÇ| [LS©š“&l.¥ñ½ ƒIƒHajMõ *`z0¥Õ 3©laê…7IrR•':Õ•€JHEXf2ƒXfªäžX ôD¤ò˜†M'Aoê"KËaÇIó%Ì1M¥‚Nš°¹”Æ÷2 & :…©5•„ª€”–zfRÍÂÔÿn’ å¤ *O\**i*!a™É Ҽ̹' h=Aë‰H"/° šNj ÝÔD–6ÂS |Ì—0Ç4• :iÂæRÚõw\D`0])L­©T Ƈ=¶Òo‡GŸØ ãIPÁÂÔ‘|Â å¤ BO\**i*! ÔÛ˜H243e¦*@ë‰BO\ª•‡ÙhXuRù¦ ³´曺àc¾„9¦‘TÍI6ŽÛM`0]Ð)L­©$äãÉëg_Ûs`ë¹å30Ÿª¦¦à¡”“2=q©¨TB*Â2“)À2S ÷Ä¡'"Uˆ¼Àl4h:©|SZÚ ÃM½ð1_Â"ÓH*è¤ ›KÛ@¤0µ¦’P°A˜SÂÔ<!rR¡'.Õ•€JHEXf2XfªäžX õD¤ ‘XކY'œoàìÊ< *ojjK;aµ©>æKXdI4aviè¦ÖTò3„i0)LÝÁC)'YPy¢S] ¨„TDû2S„e¦*@î‰BO\ª•‡ÙhXu¹pþÈõ[Þ¸ùKï„ñ^oê‚KÛ`¯©)>æKXdIasi!覾Tª–ÓTªP˜€‡"jN² òD§ºP ©ËL¦€†e&È=Q@î‰BODªyÙh(uÂ9»2Oÿ ¦î} Œ÷‚|S Ð\ÚcM}ñ1_Â"Ó<*è¤ ›KÛ@§0µ¦’wX"LS©~Åx‘µMîìJw²ÞºÌU*©¢þ¬4Å¡’wØ#Ló¨$ašŠ¨9ɂЗêJ@%¤"Tc" ÎLNLq–™ü‚Ü „žˆT!òËÑP ë5(3AÁI”—öÀ:Ó|Ì—°Ë4ŒÊ=>x¸ÓoÞð†}»÷ÉñÇNlè¦"Y^8]6&5^Q&¡éOMó­Ì혣OÛMÜR‰sÌ”:[Šn”ÆÏLs_››ºyjù¥e'üuYfŠ@%¡*`’0xýìk{l=·|ÆCP=Â4<!Ps’¡'.Õ•€JHE¨ÆD,3­I™ ŠO{bÖ‘*D^`9 ” ,35¦™&ác¾„]¦aDÍIÈL^½0ùáIZ$Ë ŸmT$3M|`BҺܮ¿ã""—:œ“tfšÛ1Gã‰g¦©›;ߟ̖d/š‹F%!ï0I˜jì9°•~;<úÄf¯œŠ¦©äã5'MPy¢S] ¨„4 LÌ2“Ñ,3ù¹'h=©BTf£¡@Ö -73AÁIÄ—6À(Ó<|Ì—°Ë4Œ¨9)è—™d‚™)“ìG|/Ë¥N¿ÌDÒÅŸíe9)!* y‡IÂTfÇã·Ðqƒ>ÂxµT‰0 Æ¿›$:i‚Ê—ŠJšªH©ÀÄšš™ ›˜¡Xfò rOz"R…È ,GC²še¦:Ã"ÓH|Ì—°Ë4‰H9‰ÈÉL Lfâ[áÍñ½,—:9™É™þÔ4MpxP¾9ߊ#«ä„#t×:ÅÔÍSlîksôéⳋn„®»id~Ï<“™ts–_ZæWÒ19ŸÑF¦o›æ¥t¶I«»uùµxnfîž‘3M6U…¼Ã*a*!3© aš7ItÒ¡'.•€JHE¨ÀÄ,3Í2“_P|¢€Ö‘*D^`9 ”Ðúg&(8éƒÓx˜cšŠù¦™&)':3MÝ4¥_õFhœfŽ™hk´¢Û&ßËn©¤3ÓÜŽ¹ñ+ÆÝ§<ÂûL—éOMóàâ±E¤[‘ÕŽÖ¥qÚ ­Å»AŸº¥„n‘Fh;3wÍðéHS¢ÍܽúÆç\vè:Ïçí¸—f¿0ëÆéŠsäà‘Åg'®Z»ÝµÍ2Ú& ÒÒ–§o›æ-È[ç9´.]è¶x>ß ]:ß1Ó •„¼Ã*aª:3©a7ItÒ¡'.Õ•€JHE¨ÀÄ,3Í2“G{bÖ‘*Dåa6 ”,3Õ¶˜ãc¾„i¦IDßIg —™Î¼x†FƲZÒ™éÈÁ#.ô¸A¾—ݧmœnBNžøÀ­î>eó»WOš'.ш+YŒÃ<}‰GàS™¥V7Û=w‰ñ.M\5Axdù¥e¤náÁÌÍÑf;·+Ffîž¡É2ÑfùÖg¿0뉻-·¼.]:ç^‰™¦‡ªBÞa˜0U —™T}0-Á¿›$:i‚ЗêJ@%¤"T`bÌLM̰“™ øD¹'h=©HT–£¡@Ù‰ )™ *L³aˆi6>æK˜f£·ï$‚ÓwFŸvÊZyq†ÊLœ‡xË´¢L9|/»O%N*nOÜ`™¹«“ZÜÎL~xvŒ't:Žä×ÇñužeжÓ\ :„Ï'‚S‡Ÿ]=yJ©‚™‰W‡N4ù‘έw¾1È›•»ä§o›–ƒfJBÞa›0 ”™Tz0íÁ¿›$:i‚ЗêJ@%¤T]r,3Í2“G{¢€Ð‘*D^`9 ”úd&ˆ8‰ƒ ÓlXaùÖ™ÆP‰'Ü;fîšÙ·{™}`–F Ù°¡2Ó‘ƒGæwÏOjz¼ûJ4Ú&Ý/â{ÙÍ”¸žL~x’Öe4Ò 4j&áÁÑdÚ2ÍY~qY.åÛ•'F¾-·WŒ£Rçk\ æKXgš¡7»FÉÌ4~Åxçm†Ô¸#×å{Y.uVëIáÌDóù¥sz¯\E‚qg5èȵ¢+?3Éq)ž™äˆÃ{%ß³)s³úÖÍ*U…¼ÃBa‚¨03©Ü`Ú‰7IÐt¡'.Õ•€JHE¨ºäXfjU”25#3Añ‰rOz"R…¨<,GCqM'AÐqR9¦‘0»´ ó% 4ÍÐwÒÁ]ƒ3Ózpéž(Ôé b¤_fšÛ1Gã=½F)™™uÞrnbüŠq~o~¦ÉOÊ¥ý6åð„éOM¯B°èÊÏLòM¸õˆC;ßùf®}:?ü{3Yf*JU!¿°P˜PªÊLª5˜ÖâßM4Aè‰Ku% Ò@*-I ËLXUŒ£ZRËL¾@ñ‰ZOD*•‡åh(PvÒ'qPdš›K ñ1_Â@Ó ªï$bCŸÌ4~Åx§wˆ‘~™‰ÿ¨_Ÿß=O×õ9D«Y¤}ø^–K9MšþTçÍŒdfšZnùÅeþ*f˜uúí-¿?ɘÐíG‘'qf‚?ôFèÉⳋn„w^¾[“Óa„&ÏÜ=#ù/ÍeþQ9ËL…¨*äF J%™I…Ófü»I‚¦“ =q©®TEH¥%É2Só©Š4e&/ ÷Ä­'"‰ÊÃrT”¤@ÇI™æÁàÒN|Ì—0Ð4€Š;‰8|ð0=l¢ d&®E2âÌÚICnø-ºÝLZ‘æÐ§2 ñ;(¹ù^vK%Z‘fBfZ~q™Ö¥Eî ˜xƒ.¹¸]ÞÚÄ&xÅ#Ðu¹ÿnw¥Åg§nž¢AY83ÑàòKËnpâªî¹ë-JüÆÞ4“ÿ*}:û…Y^Ä7$So¶³3k#´”¦™®Í¡™P”2 $!ï0R˜€üg&ULËñï& šN‚ ôD¤¢’¦*Ò@*-I–™šLõ£L¯*–™¼€Ü ´žXT!òãQqPvÒ'qekKkñ1_ÂFÓªï¤`nÇ× ºÐ‰³]qEfòÃmøÂ5„¹ž¶xl‘W'ãWŒó9G|}ùÅežÃ÷2_whéD÷]–xk¼Œ>•7á¦Ñ·.'0ºÐ4—Ÿ8–ñ _¡i¼ÈM íw×[CŸr$r\f"“™¤Oi#|]NcrkÛ:waù¥enRt¡¥pž”Û,¡+4ÎZ¢q^—–ºh%3_£×Rª y‡Âä93©Ä` ÿn’ é$ZOD**•ŠPiIjRfÂÈÒr*'HK’e&/ ÷D­'"UˆÊÃr4ˆ;逎“2ˆ2 ƒ©¥Íø˜/a£i•xRpæÅ3ûvïsæå\ëê4Qdò¹™dñØ"LÝ4Efîšqg!±ë︈È&·–IOË\×õ,6·cŽvcúSÓòË‘h•ήÞ<‰‡qf¢´úômÓteæî8áH¢¥<ÙÐfyJ›ûÚͧ-ËU¹®›9h y‡Â„µçÀVúíðè›a|ª/CäãM'AÐz"R] ¨„T„JK’e¦REI‚¢”©™ ŠOP|¢€Ö‘ŠDåa9*ÊN: ã¤ ¢LÃ`gi9>æKØh@%žA|©ÎÑc» FÁBp™ ÆMZTòS… ëõ³¯í9°õÜòšŠ Æ0x(B é¤BO\ª+•R] XfjÕ•hI9,3yÅ' h=©HTÆ£â î¤RNÊ Ë4 v––ãc¾„¦îTÐIf—¶f!XfªU…üÂTajJ•cx(B ë¤BO\ª+U‘R] 4&3ami!Õ•¨HYf*rO,ÐzbQ…¨<,GC¸ß+¯ì9î J9É‚(Ó0Y ó%Ì4u§šN‚0»´ ‹^ü®O–™’¦ª_˜*LM©¬`ŒEdÔ@è‰Ku% *Ò@ª+ËL ¡Òƒ~Te¦ò ÷D­'"‰ÊÃrT&žè.œ?rý–7nþÒ;UÍIt™&ÁÂbó%Ì4u§šN‚°¼´ 4 aö ³ÖÞDÞÜ$D…!¿°V˜:RMÁEdÔ@è‰Ku% *Ò@ª+ËLM êr4ËLåAñ‰ZOD*•‡ñ¨8¬<Ñ]™§PS÷¾EÕœ4A—iÌ+†ñ1_ÂLSk*è$³KÛ@³¦nî¼5¸KMTò k…©#ŒÑ࡬“=©¨TB*Bu%`™©öT`"†U÷ÌÅ' (>Q@ë‰E¢ò° +Ot–™Ò€mÅ8|Ì—°ÔÔšj: ÂìÒ*Ð,Lí¨0ä S;ª&“ ŠÈ:©Ö‘êJ@%¤"TWÍÈLX^ZBÕ%Áh4–™J‚Ü äžXT$*ËÑP°òDW«Ìi¦10¬‰ù–šZSM'AX^Zš…©U…üÂ`ajG¥cú‡"²Nj õD¤ºP i •4ËLu¥Z42ËL%Aî‰ZOD*•‡å¨8L<)°ÌVø˜/a©©5ÕtRƒÙ¥m [˜zQaÈ/l¦^TG0&<!u’¡'.Õ•€ªH©¨¤Yfª%˜¤¢2,3•Å' h=©HT–£¡`âIÁÙ•ýôª™ êL3`Riµÿ’ù–šúRM'A˜]ªwôØnƒq@³0õ¢ª_Ø,ÚmÿÞýŽ_yyÅ/Z‹€›F`‘#çÀÖ^?ûÚž[Ï-Ÿ‘ƒl×ûƯß𦠄>]Ý¥ÇXxz*ÃÒsKr‚\D“å"&'$W‡‹ˆ\h©Þy¶rz%g ò«[pƒŽ[” ¾°T’Ó2å̤»Ã-Y¿/9“{òû·ýÔûÿõß&ºo¾—{ú´ÿðhñ̲»¡¯gY:³ÌÝÆ]nÂ7E䯩©‹7lxÛØØ\;ù­‹°TR] ¨Š4ŠJZ2&˜Æ«201ËL%Añ‰ZO,*•‡åh(˜xR`™)ÕYÚCµ¤|Ì—0ÖÔ—j: ÂòR½ë︈À`-L½¨0ä— m6qÕĆ7m»lŒ¸?¼8~Å8/Ýõð.§AwkM7oâ9t™üÈ$,%4V×7äbÓž[é·Ã£Olv«0Ú=šI—ž]âw[¼AÞ”þtìò1מ^o'TÑ á9ôqúöiž°é:»Ç+Òiâ·' ‘•Ó+t+n#´M¹ˆ¶Ã‹è2ùÑI·Ð.ÑZÆÙ®»hÿy#´AXê¾ úè¾4Ø+‰6µížmnuG~7h]ÚL`9[&<¾­4É/_N£}ߨâf¿8Ëw%}ä+¼åœØä„üÆG~â§/þ+¼3oØ ¹A—~~ëêõ=§ën<ljE^k¨,E¾:7÷¶±ÕûWîáÁ§¦¸û\)öŠ®»üäpB"´AÞ&}¼û,L#wÎÌðÌœ\¥ºPi •4ËL5S}c"µÎLP|¢€âäžXT$*ËQqØwQ“̦Tyi<Õ âc¾„±¦¾TÓI–—êñ½ ƒq@¶05¢ª_®b´Ÿýâü#Î:4îFh)ðeÛÝÛܸÄOòé’Ù˜\*r#´M^ÅÝôŽÇo¡ã}tsݬH6ýQ'3]>æòÇê¦z‹MàOž^  r>]¡OiŽ ¼YšéF–ž[âi4XüÔÞ™ÌÄ‹t’øé²kç.XÄèËä tÑsø«˜ýâ,ŒóM˯wÛ=Ûø¶è£tôw£½eBß.ww Ñ7GûÏ¡Š&Ë™ÑÎÓZò;I«ë[ü»‰½ÿ_ÿmšL(A÷oŸ¥Á‹Ef".ÓÈÁ~¸ït·=tf"´ ¯ ч»’ËLÄí•qxÑ­›§ÝÈWçæx¯îœ™qƒÝ-ÍÜQQ ¨„T„ŠJše¦: Ò˜ˆe¦2 ÷D­'"‰JÂr4ì;iX²ÌƒJ0M¥šÑø˜/a¬©)t„Ù%¾—a0Ȧ^TòKf‹Öš¾­sâŒCôt]g&NEî,'i×ûh­B7ݼ –Òö3Wä„”Ÿ™x›=/¯[+ ²°è¾ÐùÖr‡ (2ÜAd¡Õi º²rz…7žß†$Ž)]XÎ"F;I7Ç™¬ß-ºý¤2ÙÈ¥:µô»iï·øndê·e.ArOhNæmñ×K·5ðUoMÖû¦oðï&çÇòGh¾.A¿uõd¦§¦hæÀÌÄç"ýÚøø\Ûù™ÏÜx܃ô¹E4.3“Û+7ÂøÖé#Œß93Cã´‘ÌÐÑnÓÒÌ¥ºP i U”2Õ=3aˆi°P‰Xf*ŠOÐzbQ‘¨<,GC¾“ˆZd&h4  rLèTTó%ì55¥šN‚°¼AwñåWüÍ©›¦œ¹snéò‹ËrÑô§¦Ý"Ï [˜QUȯõfÑnýÂÐìg§o›vŸrfÚõp§€÷â5g⪠ÚÔø§©°5šL«Ðxæû:Ñä•—WøºÎL´ ­Ø© k# 6u_ÒåÚá›}aâ·'Æß;Þo)›¾}Z¶§~aÅEï§_v!9‹ÝÍé·'Œ—Ò}Ä_—{qœ\ª¿Ø~7íN;‚Eùû å|Q4èÎ ãOi&Íw#oÄÝeùrö n¸!¬_fÚøÈSSr¤`fúµññû·ÏòuNE~3Ó­›§¿:7ç>ÍÌLß:±H«“Ì÷Zâ-_yõŒÚ¸ÞS] ¨Š4*J™,3ÕCo`"†ü²ÌTŸ( ÷Ä¢"QyXŽŠƒ¸“ˆNıÌœŠ2¡ ‘|Ì—°×Ô”j: ÂòÝÅ¿zÕÿÄO]è2ñ‰å—å„éOuÎÒ…æÈåd S/* ùµž-Ú3¼$MãÌ4}Û4‡$Y ýCÞv÷¶ÌhÅ'LuŠ€̤3¯K›]éMmt[a¼4óMˆ¤~ñ‚ãˆï''»ä,bt+œr¾"ÞOšævL†^ªW̹éÌŽÖﻡ ü¢Þašã„OD¢›+òâD·oÅ_ÉÈ܃Ö/3i3“TEf™™‰OeʬE„—ÒöaœÐÍõ[¤ºPi U”2Yfª‡€‰Xf*ŠO{bQ‘¨<ŒGÅAßID'â$Ÿ™ ÑÔJ3  Â_|Ì—°×Ô”j:©Áò ßËS7uÓ3XÊøéÌ]30^ÒÜŽ9ºÝNÕ‚lajDU!¿\Å0ÜqèÒï—g¦M7or/Ž“Ki#ÑçÜ(X²ˆÎL´©õuE,Ðhh¦n+¬à»ÿô +“í<3ÏŒ#™r²K~‘ÙvÏ6ºuN'¼Ï™oðÄûÉá Nô¾Eè¯4ç¦9ñÐE¾f­ßwCÓ[¦/!ó†hfÒ|'î¤*89«žœ¹©ü»ÉÑ™é«ss·lžvŸ:Ñ3ÓýÛgåyL,33ѧ4˜y¾¡ÐRºd¾nŽn—èÓ TWª" ¤ŠR¦Zg&l1M¶1‘úf&(>áAî‰rO,*•„åh(ÐwÑé8–™R¦îTªó%ì5u¤šN‚ ÁÃ÷òâ±E~&0¿{&ZD`° fÒ™i}ƒ½±@ã[Ñm…ñ[€Óú˜™?X¿°²ú%ô_äœEdü½ãîUcîì·ÔáýäÌ~±ó~Õtq¯þã¥ú[‘sÓ¼ ¬Åƒ™;ô–'?:™¹"Í¡™ýÚÐPßg—ÆhkúýÎûáßMŽÎLoëþQ6÷©=3Ñíƒû”ef&^WOf|Ê]2O•Ò·ËTWª" ¤ŠR&ËL© Þ˜ˆe¦‘Aî‰ZO,*•‡å¨8ˆ;‰Xí8ig&È4µ¦M}©T)>æK˜lêH5A‚ †ïeºÂOô»/9x„Ƨnš‚ñòøE=ó{,3Õ– C~¹„aþWCú›Ùƒdfšè¾¸{×p>¿‰«S²™‰Ð"®!t¡+Û²^@—VøeýÊH&¾!Ú]«ß¬’§óÈãÉú]±y?ÝFø¼'Ú¸\ª¿4¡ßMó*°Âw#oY~½ýVô˜™}¯xºÐ7Þâ=ÿnr83qZbü)D%3ýÁµ“t»Dÿ9æöJzÏL**•ŠPE)“e¦¤ÅhLÄ2ÓÈ øD¹'‰ÊÃxTôD¬¦œóçÑ?¨OÜ©I ”šúR¥¦¦T €ù&›:RM'A`‚á{™®L~¸ûb“ËÆäR§§‹Çaœð«ÞØ‘ƒG`)£q7‡¸wwšß=ÏÏ:è9ðÔÍSlù¥žÐÍÜ=ãu¶/ÑL·ˆ×êÜP÷ÓéÛ¦åLS!†ÄÏQ>3ÑÍ9ô©.Gn¯ä` 2“ÊIýXfJW¤ÆD,3 ŠO{bQ‘¨$,GC¾“‚žšóäÂÇ—þ# &JM­©^S;ªþÃÇ| “Mí¨ “ eÂã{™®Ìïî<¢¥çr)¡‘ñ+ÆaгJZ4ý©é™»fø ‹)uƧ«‰LÐÆù:]èúì³¼:}JW×’f¿ÐùÃL42}ÛôÌݫۧ'ÉëãÜ…©›;Úé2¿gž®Ó|·A9ÍTE…!¿\¿0™ø]–èž>Ê—ÅÉÌDxή‡wñu÷¾NôÏDNc<9‘ÌÄø½–è½Ã…n%Ó·OÜ È :9‹èv¡|ñ~ê(Ãû)7B×yÏWN¯ðR½ç97Í«ÀZæKXmjG5A ‰ïe¾ÎÏ䟓;Ò}Åœ~óozJI“å)Nz]îJòUx輚 ófLÝOùy©~ÑÝè?ýg?ûóÿøMòä&.M“™t#„·0qÕ(Úí Ê9¦** yäâ…ɱï~þwGÿ:ä ¸TDWøßˆ{óo¶Z…4ý­ÈÙ+>m ¾ðœïÆôíÓòŠßM4‡fÒ|'™©kXüíÒ/3tøw“£3S?9™‰-žY†Aâ73eÊÌLô©tnÝÜù×MÛ‡qf™‰nÎ2ÓQ±Ì4(>Q@î‰EE¢ò0}'tÒ±¦¦T¸© Õz"âc¾„Õ¦vTÓI«0Qð½Ì׹ѣ·”®CN"ü\NqšêþÙ8ZÄŸNªóøØ}š‰·ã2ÓÁ…oùã_æýù½û“_Ùñï×£F?-™ûÚœYÝ“»g܈ D…!\Ë0Òþ½ûõ_—ã¨Dÿ4`Dö#þgBø“s0Ч4(·&ÑR·=™©Š÷ þ‡Ü/3eŽëä‘V†’³ÛýÑÂ+æ˜na„÷So„'÷ûVä쯋r¾4('çl™vIž[Dsh¦üž;|.Ræ7Aã× ÉÙÆ¿ œ~™é«ss¿6>.Gúe&Z7s $VfÊIôuÑÒ~ç:Yf¢›+Ÿ™°Ë4‰hL–™†Ñ'<(>Q@î‰EE¢’° O è$bM}©|S *ôÄÅÇ| «M½¨¦“ ˆ/ñ½ì>åç0‚ºïðM×åëàÏ¡§©€iÏé÷nM¯2¿g^¦ÿósÿ÷·¼ãoüÜÿÜsÖãùS7OÁˆ~Ù©– C~qÈ0€þq¹¿çl»»s: ýCp#:3é9„ÿí@fâSŸhܽ…“Ã'àÐÆùÓõÌ´V‡o"3=p.цŒ»†ÜxNXJÎng.âó2_,6}ûÚ™eb÷Soß½8]ô·¢ß^ÑÓRï÷ÝàÓŽŠœÍ¤Ï«êw[îT¦œ×»I´Ì»‰¿|ýµ;üÁé—™~ëꉋ7l#ý2Ó\; 3N6á3áÕi)Œ/Y¦Eä['a˼]Õ•$•ŠP9©ËLɉݘˆe¦Ñ@ñ‰rO,ª•„å¨8è;‰€¦“ ˆ55¥òMúTâIó% 7õ¢šN‚ ¾vý÷)?ùä7Tšø@çµ!n‘ÃOfîš™ß=¯ñÞÎÀÌtñ?þk´õ2þIÛxÏ%ºÿŽ?Û½—VìÜ.¤ ËLéPaÈ#×5  Ä…Æ=WV!™}Êïîð¿˜Fh„Æõ ñ|7¸çÀVú7ûè¾Í. ðé9º_h|É,5œK m¬œ^á¯]¾D‹³ º‘ÑðÎdîvf‘áÁÌ8Â;Où¥ñ`æöiçë­eîϧEz~¿ïß)r~¿¯—gÊrÄiî º!Úɼû2ñnÓÖä ·*ݰ$þ½À~÷ßþdffZ\k1rð·®îì9d¦Ì™láÄ"'›-33°h ·îÀÌtåÚ^Áø3“ˆi#°ž¯ó“£oWu% Ò@ª%å°Ì”–±Ì4(>áAë‰EE¢ò0}'t±¦¦TÁIœŠ;éàc¾„á¦^TÓIÄ—ÀŽÛMܧòÅnô\"³ñW”2ñ“Rý‚;çà‘ïÿsÿŒq`:öÜ…îÛxÓŠtÑo±ÄÛœ¾mF,3¥Â_®kÀÿîèãäG&7ݼ‰Œ_1Οº9+/¯L\Õ­—É—ÈmwwbA¿i´AZ*oˆÿ¡ÑÅe¦×Ͼ¶çÀÖs+g\àš–ºÒž7E3õé0®ÔÐRÚ £ë´3²kЊ4È3'?:©ß&© >ÿˆ.zg¸§Ð"úèÎr;?þÞqx["ZÝ-u«Ð޹X£¿XÂ_d#¹WôåÓHWh›„¶¦¿XùÝ +ï?]ÜöÝ–iÿÝ·—¿Ã4HóÝ6g¿Øù[Ÿ<èæÐuBëf~-ýкÝÛ\¿QúŠh;´AÝË$÷ ä÷oû©Ÿ¿ü¯óFþàÚɧ¦ŸDƒ²(Ý¿}–é#;nÐÍüêÜo‡–v6Ý]ÊÛ¿eó´›–cñÌ2'-ºÐF2ߨ›É½¢ë°ôΙ'W^=áv‰>Õï#.ñ*rDu% *Ò@ª%å°Ì”4©cf‚âŸ( ÷Ä¢"QIXކ‰'Ðt½¦ŽTÄIœ*;Iác¾„á¦^TÓI Ä—èÜ[wÏ>Ðyš!ÿ–œ³š{ÄŸÓà­š¤ƒGzÞƒijóoq`rèvi]ùLr\F%ÞËLA©0ä‘+F[zviÛÝÛ¸.ÑO>}¤ë4(çìzx‡!&9+/¯È9™Óh³4N·Â¸7ÁùMø„š±ÜÌDs8480,<½0}û4-¢M‘‰ßž OaOpä‹ÂŠ[9½"7"o¤[‘#p:ìo V‘óOåHß4¡­å¸i·Ÿ¹eà¶ ãŒöa´÷ü¦iuîe„®Àw/“{òù‰Ë¯ø›„Œ&«,ÒÜL—™´‚™IoAF ¦-Y† ß:±xëæé+»/¤Goëó¦àÎ×»ï3e™©dfÂ:Ó É4&b™iP|¢€Ü‹êD%a9*úN è¬z啽çÏ‚ÁH ×Ô‘Š8)SM'A|Ì—0ÜÔˆj: ‚“®9ô‘žÇÂ"Ö/!­þ•·îu~_'U~ñÚ»†ó è–Î,}ßüSS42dc"ª" ¤BR>ËLñÅÉL˜–$ËLÂâäžXT'* ãQqxRMgU2™ ’M© “ qÒÇÇ| ÛM]¨¦“ WdF¦îz󎽷¼úÊ+=s _˜ZPmÈ#Ì&MªhKÏ-mê¾÷ø{Ça‘1Ź!ôD@îñKþõº[7O¿mlìÊ«'qƒŽêJ@U¤THÊg™)² £’V»ÌÑ'<(>Q@î‰Eu¢’0‰'uVYfòDÔ¨|S|Ì—0ßÔ…j: ê)/0801è&}* y„-äI…cªã„8ÐwR­'"Õ•€ªH©”Ï2SL¡æ¤~,3 ŠO{¢P‘¨<ŒGAßI4uid&H6µ£šNjT»©>æK˜oêB5Ô`y‰äÙççO|ç Ž h`"Ð/L-¨6äæ “ Þðú«¯=yxû¹•30nŒ/îAˆ‰'Ðz"R] ¨Š4 Iùê•™0ÓÔ]¸Æ„!)Ÿe¦aAñ rO,*•„ñ¨8H<)€¬³Î2Siªé¤F…›zác¾„ù¦.TÖI Æ—H6Þs Á¡ ˜ô “>†<œa¤Àž§¶Ò¿÷G÷m†qc|áß)—…S‡žØ]Äó¯<ïzöçKó0¿jß:uÚ“süÅRÆ_ ãœôÝ×ÏÍÚú•'n)â±ÃŸÇ´´æÅsg~jËWöÝRÜÿóC?ÿ¶ñ7ß÷Ñ¿}ÕgX¿9ù·¯øÝŸÊåïù1ËL«Ê„ ©ËLÂèäžXT'* ãQqxRYge¦ÒTÖI‡J6uÄÇ| óM-¨¦“ Œ/‘ð½ ƒ ˜$ Äù³çŽ>»»ˆg«7\UèÕåWŽ>·» ºQ¹®tæ»'yÎ3Ïí fù»§0 ¬9ýÒñßRM†ÕçŽï‡É9h—`ug¨íørè[ÁnttŸó?óüž-ÿñ£ïljÛ?¹ößÿ]úèF¤=Omu±Àvòåd,ÚU˜Àý\»áøÉŸzÃH—wþʯB?*KM­¥Ú˜ˆe¦¡@ñ‰rO*•‡ñ¨8H<ÑAÓé‘@f‚jS/ªì¤Cõššâc¾„§TÓI –—Òš}èíÿüí#øûoþ«‹øýOþ=þ ™¼ãïý›mÿdúKï§RUøÓýw`é:ö-u?´=òħa ÎPÛy`î:XÑþÐ3@˜À̎߃=a´?tÁäôMèÙ‚ÈCôL&ç¸ý‹ï–ëJCmÇú&`CY3Ô÷Ç×vn¸ëͰºåç'{º™`¨×o¹¨_þˆ²_hú½Npæk¿“sÐ÷ÙËv|e_|e/:nÐ׃äÌ÷/ìYøò§g½ -]õòëçd]ržØ “G³y3^súõs‡Ø·N¢½…ùý<°ûcz;œ™¾óÊóîd¥>°å»¯¿‰½øÚ8Yi ÿ0wÓÿñïþ…s]a¿ñ‘ŸøÕ«þÖ 7Žà›qúQAXjê«òS™° Å2ÓP øDÅ' ‰JÂrT$ž@Öéa™©UvÒ¡bM}ñ1_‚S *ë¤"Qyoÿç·Evù[?ñßô³ø£Àý;¯éÉkÎ|÷$=sƒÉ9þd÷l?{îßÞ7“sôÛŸX™©_ö"´«ô̼ žïOoú“=S09ÇŸ~óXÝ¡§Á09€'žþ<6”5‡¾õŸÑSDöY?]‡Ÿy&çÈÙN”³™2ήZË'O}æù=Îxäúy£rСÉnE°üÊ)˜œãôËÇauçÜʘ@¿¦Ã`rŽ~-ÆHòÈÆ ¥ZO,ܘúÊ4˜z륡@ÓÉÇw. V KM}¥Ý˜H½2DŸð øDÅ' Õ‰JÂxT$ž@Öé;3A¸©w¡JM­ñ1_‚S *ë¤"Qyœ™þÕäß¹nËO@7ô¦ü×~÷þÿüáÿ‡‡¯ùóo}íè±Ý¨—hwâÄ¡õöa‚Q…È,&5ꙿ³£{² }„qc|á_.$ž@î‰Eu% *Ò@ª ²N>¾sa°Rkê+íÆD,3 ŠOx{bQ¨$ŒGÅA≲²Ì4*w¡2MÝñ1_‚“>Õt‘¨<ÎL×…ý#/t£'¾sèî¯^Å?*ƒßž ú…IŸjCaÔ0IQOû%ËL¦jükE‚Ä´žˆTWª" ¤ÊÑP ëäã;+…±¦¦*<• kÑÈ,3 ¢Ox{¢P‘¨<ŒGAâId53A¸©w¡Mð1_ˆ“>ÕtRƒñŇX™‰o½hl‚„aÒ§Ú/5LRÔs~`™ÉT¡HPy¢ƒÖ‘êJ@U¤T9 d||çÂ`¥°×ÔTò‰Xf*ŠOP|¢P‘¨$ŒGÅAâI”d™i$ªï¤@šfàc¾„'}*ë¤ã‹q3ƒØô'»§Îœ>)'`Â0‰SmÈ#ì&)ê9?°ÌdªÆ¿J$¨<ÑAë‰Hu% *R>•†Y'ß¹0XŒ55U‡ÆD,3Å' (>Q¨NTÆ£â ñDY'Ãùs‡èÔ'î¿Æ«á¦FT߉N¥™&ác¾„'}*뤦§¼x’Bfb26]ÇEÛ¿þ±ÕØ äOµ!_0j˜¤¨'üše&S5þ%"Aå‰ZODª+Iª" ¤²ÑP ë Äw. V{MMU’™0•g™©8(>áAî‰Eu¢’0•':(;Ùž\¸ãøÒ„ÁêA»© •x¢S]¦aø˜/aÄIœj:©‘EÆ£t2ˈMß=‰äLµ!°k˜t¨gû™,3™ªñ¯ *OtÐz"RiIRi UކYg ¾sa°:Økê¨&‰Ô(3Aô ¢Ox{¢P‘¨$,GÅA≲NR ÝÔˆªáAñ‰Bu¢’0•':(;IvSªòÄ¥ŠLýÒø˜/aÇIœÊ:©ãKš™‰Ylª%Õ†|Á´a¡žçç°ÌdªÆ¿2$¨<ÑAî‰Eu% *Ò@ª ÊÎ@|çÂ`E0ÙÔQ}±ÌTŸ( øD¡:QIŠƒÊ”¤@¾©UyâÂ@SGX”2ñ1_ÂŽ“8•uR Æ—”3Sǹ 'NXlªÕ†<ºa¡žçç°ÌdªÆ¿,$¨<ÑAî‰Eu% *Ò@ª ÊÎ@|çÂ`E0ÙÔŽÿS™0 ùe™© (>Q@ñ‰Bu¢’0‰':È:I|S*ôD„½¦.0!ÁÇ| ;NÊTÓI ÆÒÏLÌbS=¨6ä ¦ “õ$?Ÿe&S5þ5!Aå‰ ZODª+U‘ò©l4,(;ñ ƒÁjS;µjLÄ2SAP|ƒÜ…ŠD%a<**OtPv’ù¦Tè‰ÛMâ0 ‹ù¦œ”©¬“Œ/þ$™ atcÓý;¯á0‹MÉQmÈ#¬&êþ@{žÚJÿxÝ·Æñ…AHzâ‚Ö‘êJ’ªH©l4È:Eܸõ’ë¶\ƒUÀdS;žOeÂ$TËLAô ŠOª•„ñ¨8¨<ÑAÙI䛺P­'Œ8ÉÂZ42>æK˜rR¦²Nj°¿øS¯ÌÄ^~ñy‹M)RmȬ&êþ@¯¿úÚ£û6Ÿ[9ãÆøâ„8zâ‚Ö‘JK’ªH©r4(;E<}bϾcÁ`°ÚÔNÝ©Kf‚èDŸð øD¡:QIŠƒÊ”¤@¾©ÕzbÁ”“&ìD%ñ1_”“2•u’‚ñÅ«:f&f±)-ª y„uä@=½7&îAˆ¡'.h=©´$©Š4*GC²“¬6õRÃÆD,3Å' (>Q¨NTÆ£‚ òDeg€W^Ù{þÜ!¬ œô©Ö ÖœÔ`ò…ù¦œd©¬“Œ/^¥›™ bôa±)ª ù‚uä@=·7&îAˆ¡'.h=±¨®TEH•£¡@ÙI †›z±ÌT%è>Añ rO*•„ñ¨8¨<ÑAÙÉsáüÂõ[Þ¸ùKï„ñj@Á©•{¢À¦“ C~ñ1_š“,•uRƒýÅ«ºg&&cÓ_ùMXj*§ÚG8Ltꉽ1épB=qAî‰Eu% *Ò@ª ÊN:°ÚÔK=±ÌTDŸð øD¡:QIŠƒÊ”ήì§PS÷¾Æ«'}*÷DY'؃*ÂÇ| kN²TÖI ö¯š‘™ØË/>¿cï-„qS9Õ†|ÁÀaR žØ“x(B ôĹ'Õ•€ªH©r4ˆ;éÀpS/Þ2f ªYf*¢OxP|¢P¨$ŒGAå‰ÊÎ3œô©ÜÆ` ªó%¬9ÉRY')_|K43AÅ0‰SyÈ ¦Ó·MoºyÓ@»ÞÕ™¿öd~é¹¥éÛ§7ýÑ&F×÷?¾ß-•‹œ];w-<½àæ0„i„6¥gD«Èl»g›Üˆ\”³q¹ç´o°”ÀNän¢ƒ‡"BO\{bQ] ¨Š”Oe£¡@ÙI †›©mc"µÈL}ƒèŸ(T'* ûQAPy¢ƒ¸3€e¦þTñ‰O\Ø€àc¾„5'M*ë¤û‹o–™LYª y$kˆ©ÈØecô¯’.t…e~ºéæMî™üäG'7¼iÃø{ǹ³Œ]¾:Ç—];w¹AºÂhþtö‹³nSKÏ-MüöDæLúHw3óÑÎÐ|ڭ»Ç[p¶Ý³éBÓܸD;#笜^ ¼eÚCþÂéFyrñý4Uƒ‡"BO\{bQ]IRi Uކe')ØnjÄOf†e¦ øDÅ'<‰JÂxTTž¸ ì *3AÁIŸÊ=Q`å‰ëO0|Ì—0è¤IeÔ`ñÍ2“)Kµ!_ †˜ŠpHš¾mš?Ý¿w?}Ú 4k&®êd WR&?:Ù™û´{bOƺQ NhZÝŽ˜æŠ’áAñ‰Bu¢’0¡'.ˆ;ƒYfêCŸð0ôÄ‚Ý'0>æKtÒ¤²Nj°¿øf™É”¢ÚG.s˜J]Öi4îS™–žíœããJ ]×f×Î]´„žÕíˆi¯¿úÚ/ú¿Ñøø{Çå8MƒÕY‘ÒÄ7­çð™Gr„æ0š¿ížmr£E|V”þéËï·'4Ù2S:à¡Ö´žˆTZ’TEH•£¡@Ü)號~úÄô ÛMÔùT&b™i ˆ>áAñ‰Bu¢’0•':ˆ;ƒYfÊ¢ŠOxØzbÁèó% :iRY')_*bf‚aR¦Ú/®q˜ªM\51ù‘I÷©ÎLdâ·'øô¥ÌxÄ eÎÜóÔÖ·þ?þ†§OiPg&NHtɬB,'Á¹1ñ)KйßÝ}Ô_ ïaæn,<½ _^gb‡"ZODÐzbQ] ¨Š4*GC¸SÐ[/¹nËE0è¶›º¨yc"–™‚èŸ(T'* ûQAPy₲SHÌ'qªø„‡­' Ì=±ð1_ “ •uRƒý¥–™L)*ù"‡ )#3‰çðîn»²Þ[ÊÌL;¿åò+þ¦爣3ëž|¤«ã^7°õЦh¿ì™øí š¹Û\ ô*&AðP„@ë‰rO,ª+U‘Rå¨8(;Åñ ƒ~a¾© ËLA@÷ ¢OxP|¢P¨ ŒGÅAè‰ âN!–™}Ã܆ž¸ø˜/aÓIÊ:©ÁþRËLftª ù²8Lpù™‰p÷¡ ™UÈé—™~þò¿Nã´9NÓh0sƒüVP9‰Ç½o7m3¿4qf¢+üÖÝpj-¢‘ÌÝæ}€}6i‚‡"ZOD{bQ] ¨Š”O•£¡@Ù)Žï\ôÛM]Ô¿1‘ô3DŸÀ øDÅ'<Õ‰JÂxT„ž¸ îR}f‚ˆ“8}ÃâVžèø˜/aÓIÊ:©ÁþRä2„ “2•‡|Y&8ÌLêiüþî»kóœÉNÂR'³×lŸÛôã?ù#4® ff&~Mlð+Ýx¿¸/“ËL<_f#Z‹eî6Í„ù&YðP„@ë‰rO,ª+’ò©r4ˆ;Åñ ƒa¾© ™ £Ox–™òAñ ŠOª•„ñ¨ ¨Q¨NTö£‚ ôÄq§(ËL‚Š>a÷ ãN:ø˜/aÓIÊ:©ÁþR ËLfD*ù"“‡ o=3©'ð`Û=Û¸¿ÐE'î5tá Ãþá?ú¿zÕÿ´ãñ[`2-¢™e2£É¼)ºp6’h'Ývh)Íá@Æo½´ðô]·ÌTwðP„@ë‰rO,ª+Iª" ¤ÊÑP îÇw. z„ù¦q*±Ì”¢OxP|¢P¨ ŒGÅAè‰ âNQg&è8‰SÝ'$ì>Á`ÖI ó%Ì:©QY'5Ø_ª‘Vf‚aR¦ò/P=L`Å3ã D¨0®×ÐÂgÇã·Ðo‡ê2Y9½Â ‰.ðš>™™ä»zó›ó¸e¦º“C´žˆ ÷Ä¢Ò’¤*Ò@ª âNq|ç /˜oꢉXfÊÑ'<(>á©NTÆ£‚ òD}§(ËLkT÷ ÓO0ØtÄÇ| ³NjTÖI &˜jXf2£PmÈH&¼a3qo$;Qf¯!3q36ñðZºÉ¾Ñ];wÑ÷^Q™»=Ú>˜(äã­'h=±¨®TEH•£â î …ï\ôóM-4åT&b™)DŸð ú„§:QIØ ‚ÊÄ!œ?wˆþA}âþKaÜè8‰Sé'L?Á`ÐIó%Ì:©QY')Ø_*c™ÉŒBå!_ y˜ðFÈL„“ ¿ùÊL¼(ç½Æ3¹??'· ™Éý ;9˜¹ÛÓ·OëA“&ù8„Aî‰rO,ª+U‘ò©r4ˆ;Cá;}Á‚S e3¶žˆÏL}ƒâŸ(T'* ûQAz₾3œGæ7~ûø`Ðè8)Sé'$¬?`ÊIó%Ì:IQY'5Ø_*c™É Mµ!_ w˜(ò3Ó®»dKrƺ/+“åÍKfr/msïÕ­Ñfþu9Þ&¿XAf¢E4.â]œ2wÛͤý‘ãŒVÏÜ…| ÷Ĺ'Õ•€ IùT9 ġ𠃾`ÁI_ƒ±Ì”¢OxP|¢P¨ ŒGÅAè‰ úN" å$KuŸ0€'q|Ì—°ì$EeÔ`©LB™ Z†I–ÊC¾@ï0QdvgS÷=¶uôÑMÇKfâz•¶ˆGŒÃŒë™¼ý»MÆß;NãôÆi]šœ¿‡&$ù8„Aî‰rO,ª+’ò©r4ˆ;Cá;}Áˆ“>ËLA÷ ¢OxP|¢P©¨ ŒGAå‰ âN" å¤L¥Ÿ`0€'}|Ì—°ì$EeÔ`‚©Œe&34•‡¼€Øabqo´$㋳©û†Üc—­œ^qƒüš2H0<½&33q¢‹ÌLîÏØ |¹O“g$~7%¨?:3-=·mK¾5¸ä^…'oˆ¾ |ë–™Ò!‡0È=±@î‰Eu% BR>Uކqg(|ç Xpj¡A‰XfÊÑ'<(>á©NTö£‚ ôÄ}'r’¥ÒO0€À‚S |Ì—°ì$Ee¤`©’e&3•‡|Øa¢˜¾}šc ]Æ.›ýâ,<‡wè#M`t*ÜÎø{ÇÝkÍtf¢E\jèÂÛ¤L®˜ƒnšo‹Ww[€ôÃïÄDšŸYÐ}½¼©Ìiô)ŸÓ$oˆ?¥¯WÎ4ÉÇ! rO,{bQ]IRi UŽŠƒ¸3,¾saÐ ,8é+u*&žXfÊÑ'<ˆ>á©NTö£‚ ôÄ}'rR¦êO€ª†í¦Fø˜/aÙI‡Ê:©ÁþR¥T2´ “,•‡¼€Øaâè¾dLê—chÑ®î›4º¢_CG+Êí¸SŸtf¢Er&Ëy'¦~h­m÷lã]¢ë°”¸y*–Ôo·%š3}û4ßÝ"Mƒ &.ù8„Aî‰rO,*-Iª" ¤âQqw†Åw. z'}Í:•‰XfÊÑ'0(>Q¨NTÆ£â ôD}'r’¥êO0˜*…á¦^ø˜/aÜI‡Ê:©ÁS%ËLf*ù‚½ÃD¡ž±{·ç©­ôÛáÑ}›aÜ_äã¹'È=Q¨®TEʧÊÑP î ëÆ­—\·å"ô#Nâw*I93Aô ¢OxP|¢P©¨ ŒGAè‰ úN" æ$KÕŸ00U «Míð1_¸“•uRƒ ¦J–™ÌTò{‡ O=]¯Â믾öè¾ÍçVÎÀ¸1¾ÀC¹'(>Q¨®THʧÊÑP î ëé{ö{ËÈ“>ËLaA÷ ¢OxP|ÂS¨$ìGAè‰ úN å$KÕŸ00U “Mñ1_¸“•u’‚ý¥b–™ÌTò{‡ O=W7¦¦à¡ÜäžXTW*$åSåh(Ðw'qMlLÄ2S?}ƒèžêD%a?*BODÐwFtveÿ…ó 0XÔœd©f Ja¯©)>æKw¡²Nj°¿T,‰Ì-äIå!_0y˜ðÔsucj Š(>Q@î‰Eu% BR>Uކ}'Øqg™)8è>Aô ¢Oxª•ñ¨8h=AßÅ…ó ×oyãæ/½ÆK€š“&€ÂÀTŒ5õÅÇ| ûN"TÖIMO©že&S”ÊC^`ï0á©'êÆÔ<!P|¢€Ü‹êJ@…¤|ª úN"°ã$®‰‰Xfê¢O`P|¢P©¨ ŒGAè‰ úÎ(ήì§PS÷¾ÆG5'Y*€%¨:XjjùöD¨¬“šžþR=ËL¦•‡|ÁäaSÏÒ©5x(B øD¹'Õ•$U‘Rå¨8ˆ;‰Àˆ“¸†žÊD’ÍL}ƒîŸ(T**ûQAz"‚¾3¢Vf&€ÀTÌ4uÇÇ| ûN"TÖIJO| "~f‚œaÒ¤ò/X=L`êYº1µEŸ( ÷Ä¢Ò’¤*Ò@*}'Øq×ÐÆD,3e‚èŸðT'* ûQAÐz"‚¾3"¯™ jN²T cPE°Ñ4ó%ì;‰Pe')ëñ%ËL¦•‡¼ÀäaSOÑ©;x(B øD¹'•–$U‘ò©r4è;‰ÀŽ“²æžÊD,3e‚èDŸðT'*ãQqÐz"‚Ä3¢öe&€ÀT 4ÍÀÇ| ûN TÖIÍz| Å2“Lå!_°z˜ÔóscŠ(>Q@î‰Bu% BR>Uކ}'˜rR6zf¦“ ËL™ ú„Ñ'<•ŠÊÀxT„ž¸ ñŒÈ2Så0UëLcð1_ÂÄ“•uR³_B±ÌdSyÈ ¬&0õü<€×_}íÉÃÛÏ­œqc|‡"ŠOP|¢P] ¨”O•£¡@ßÁ3/>ýô‰=0X¦œ”5·1ËL™ úÅ' •ŠÊÀ~T„žˆ ïŒÎ_f‚š“&Õ€ÀTL3MÂÇ| O TÖIÊzy (rf‚œa¤ò/X=LHêÉy{žÚJ¿Ý·ÆñE>aP|¢€â…êJ@…¤|ª úÎnÜzÉu[.‚Á2°ã¤¬Ñ§2ËL™ ûÅ'<Õ‰JÂ~T´žˆ ñŒÎ2Sµ°U»LÃð1_ÂÄ“Uv’âÒOH–™Ì*ù‚áĤžœ‡±ãñ[è·}„ñ‘-<½°ÿñýdà i ù8„Añ rO,ª+’ò©rTôÑð ƒe`ÊIY£±Ì” ºO`}ÂS¨ ŒGÅAë‰ÏèL0êiyAÛîÙ¶áMèß/}¤ërÑìgy]¦oŸ–‹€÷³™ß´,J+§Wô i ù8„Aô rO,*-Iª" ¤âQqÐwFÃw. –)'Y#¾bSNÊ,3i}ƒèžJEe`?*ZODxJiMfR ¨j˜„¼ÃÓT|Ì—°òD§²NRdú É2“É£ò>LHêiyqãï§¿c—Á8™üèd¿ER™‰Ï]‚¢d™©µäãÑ'<È=±¨´$©Š4ŠGÅAß ß¹082L9)kú©LÄ2“Ñ'0(>Q¨TTö£‚ õD‰§™ ‚NšTª&!ï°Å4ó%¬<Ñ©²“™~B²Ìdò¨B䆌zN>”M´©_KÊY$Yf2U“CDŸð ÷Ä¢Ò’¤*R>Uކ‰g4|çÂàÈ0å$kÄS™¦œ”YfÒ ûÅ'<Õ‰JÂ~T´žˆ ò”Ҏ̤2PÕ° ù…!¦Ùø˜/aå‰N•¤Èô’e&Ó—ÊC¾`û0Á¨çäC±ÌdÒ'‡0ˆ>áAî‰Bu% BR>Uކ‰g4|çÂàȰæ$«‰XfÒ ûÑ'<Õ‰ÊÀxT„žˆ ñ”e™É?¬B~a…i<>æKXy¢Se')2ý„-3AÑ0 RyÈ &õ„|X£e¦¥ç–¦oŸ¦ 䃓ãôÛÁe¦•Ó+áAñ‰Bu% BR>UŽŠƒ¾32¾sapdXs’e™©•™ ¢Ox}ÂS©¨ ìGAë‰OYçÏ¢PŸ¸ÿR/ ‚N‚TªV!¿0Á´ó%¬‚MCf¦];w¿w|Û6L~t’&púñŸüy6¯H—ýï§ë4™ ]h]7-<½@á ºù<¹Hf¢Oiœ¶°ížmÓ·OÓuB;é&ôÛ™Ì/Ù¤ Šˆ>áAñ‰Bu% BR>Šƒ¾32¾sapdXsÒ4â+æ0â¤Ï2€èDŸðT**ûQAÐz"‚ÊãÁ#ó¿}ü 0X4©T) C~a‚i>æKzâRe')~B²Ìd²©<ä¶Œz6>®0™Í%sgÙz~úïÿšöÁÉž~Dkñº¿=Á#ÛîÙF#tYxzÁM#Aô ŠOxª•„ý¨ h=±@âI4Ô¨ T)¬B~ai >æKzâRe')~B²Ìd²©B䶆z*>w²×@ãch>¼Üì_¾ÿ—hÚUÿû¯ÊAWvô \Û“>ʼnoz`f¢íÓ¼oEòˆ¼•…§ v™”ÁCÑ'0È=±¨®$©Š4ŠGÅAâß¹08¬9ÉjÇ©LÄ2€îDŸðT'*ãQAÐz"‚Ä4©T¬B~a|i>æKzâRe')~B²Ìd2¨<ä¶Œz*>šaÏfÒ®úß•¦]þK?/¹ìÈs”Ü m6gDŽÌLÜÂä›1‘~·5ÊÔ<!Ð}ƒÜ‹JK’ªH©xT$ž‘ñ ƒ£Áš“¦Ö¼bŽXfÐ}ƒèžJEe`?*ZODPy¢ƒ¦“U‚*…aÈ#,/­ÂÇ| COD*ë$ºO`–™LUˆ¼ÀöaÂPÏÃGV&3-=·´ÿñý|6Ó?üGÿ@.ÊìD:q9‚E2W‡ÌDWèSºÐd‰§És—hF`k¦Fà¡îäžXTZ’TEʧÊÑP ñŒŒï\ 4µ¦1ËLºO`}ÂS©¨ ìGAë‰*OtuR£JPu0 y„Ù¥mø˜/aë‰H•¤@÷ Ì2“É  ‘˜?LêIx#d¦Ù/Îò»€sÖá÷f*“™tÊ\=33Ñ ]Ñäkâ2·fjŠè>Aî‰E¥%I…¤|ª ÏÈøÎ…Á`ÍI–e¦î¥…™ ¢Ox}ÂS©¨ ìGAë‰OtÐtR£JP¥° ù‚Í¥…ø˜/aë‰H•¤@÷ Ì2“A*yùÄ¡ž„—1lfâ·Cšüè¤ù½ßÿ—4òóÿøgÝÉ,;<¨3¼ÙÉ\½_frúÉÜš©x(B û¹' Õ•€ IùT9*O7n½äº-Áà°æ¤i”WÌa»©ËLDŸÀ ø„§:Q ‚ÖTžè ë¤F• ê`òƒK;ñ1_ÂÖ‘*;Iî˜e&ƒT!òó‡ @=/i¨Ì”ùŽÝ7o¼‘/½ôŸÊÁ̲Ã23ñˆŒV ŠR¿AøfÞ™;cjŠè>Añ‰Bu% BR>ŠƒÄSƾc=vøó08 :ijÓ©LÄ2“Ý'0ˆ>á©TTö£‚ õD•':È:IQ%¨:؆<ÂàÒN|Ì—°õD¤ÊN: ú„g™É UˆÊÃüa‚8·ræ™ç÷À“ð2†ÊL<Uhü½ãz ™e‡ef¢MÑœ‘´kç.¤ËÀÌÄ7 ÏŽÌ~qV~š¹3¦Fà¡îŸ(TW*$åSñ¨8H<)À “ QNe"Ønj$µÌÝ'0è>Aô O¥¢2°­'H<>]Ùáü Y'5*UÛ/X[Z‹ù¶žXTÙI DŸð,3™ªyùÄpþ§_>N‡âÏnÿu_±)31~}œ\Äg3mÜæpÄ-ð ,J™ƒ´ŽG.ÑMÐ.ñLxkp™\¢mò.-<½@›¢™ú½™`gLÈÇ! ºO`P|¢P] ¨”OÅ£â ñ¤›N‚ZöŠ9b™I‚îDŸðT**ûQA{bÊãÍ…ó ×oyãæ/½Æ¬“U‚ªƒmÈL-mÆÇ| sO,ªì$¢Ox–™LUˆ¼ÀbªÖ}¾Í™‰•M|2_à¥M´‰³]äéBœlhÛv϶ýkñÍmÁm–&¸‹ä |3&Úð8áWä¹[á™+§W¸yÑ…Éü«ÓÚ‚«`¤ßíšq?ótŸÀ øD¡º’¤*Ò@*‰': :ijÙ©LÄ2“Ý'0ˆ>á©TTö£" õD•Ç›³+ûéÔÔ½oñA ì$EÅ ê`ò;KËñ1_ÂÜ‹*;Ièže&ÓC¢ò°€˜ºÏ·efbŸÝþë‹KO»'äCÙßû×Ù .Úµsצ?Ú´ížmn¦¹O‰;«(s-=·4}û4mÓs½’3ݺdåô :¼K´Ø2‘+ꥦàgž@÷ rO,*-Iª"åSåh(Py¢Ã “ öÊD,39}ƒè˜êDe`?*ZODPy¼)3AÖIŠAÁ<ä v––ãc¾„¹'UvÒÅ' ËLf*D^`1U[{¾­3»ûÁ«FŽMÆ$~Ú ¤Ÿ ÷Ä¢Ò’¤BR>UŽŠƒÄ“l: jß©LÄ2“Ñ'0ˆ>á©TTö£‚ õÄ•ǧÆe&ƒ*‚mÈŒ,†ùæžXTÜIŸ(,3™uªyÄTmíùv¿ÌÄ,6™F‚Ÿsé'$È=±¨´$©”OÅ£â ñ¤›N‚Úw*±Ìä@÷ ¢Ox*•ý¨ È=±@åñÉ2Óˆ0y…Å>æK˜{¢Pe')P|¢°ÌdÖ©BTS5ñ|;?31‹M¦aà'œ@ú rOª+’ò©xT$ž`ÓIM+_1G’ÊLÐ}ƒîDŸðT**ûQA{bÊãÓð™ ²NRT ªæ!/0¯ÆÇ| ‹Oªì$ŠO–™Ì*Uˆ¼Àbª&žoÉL,dlzæù=¯¿ú ã ülH?!Añ‰Bu% BR>ŠƒÄSÒwÎöôQ 6µòsÄ2“Ý'0ˆ>á©T42ŒGAë‰*g–™F…È Ì+†ñ1_Ââ…*;Iâ…e&³J¢ò°€˜ªõ>ß.ž™X€Ø´ç©­tCîÛ ãÆø"¤¤Ÿ øD¡ºP!)ŸŠGÅAå)鯭—\·å" 6µòT&b™ÉîDŸÀT**ûQA{bÊãÙ™ ²NRT ªæ!/°­‡ùŸ(TÙIäžX,3™Uˆ¼ÀbªÖû|{ØÌÄî~𪓧ŽÂ¦|Ùñø-tôÆñEþ03H?!Añ‰Bu% BR>ŠƒÊSß¹08l: ²ÌÔîÌÑ'<è>©TTö£‚ ÷Ä¡Ç3ËLCÃBT†#ñ1_Ââž*;IÜ‹e&Ó¡ ‘AL¥Ôóí“§ŽÂa¹¸û¹æôËÇaƒåYf2U“?Æ ÒOHP|¢P]IR)Ÿ*GCÊSß¹08l:©ikc"–™DŸÀ ú„§RQØ ‚Ü „Ïš’™T ª"/0¬‰ùFŸðTÙI äžX,3™UˆÊÃbª¦žo?óü8,Ë{l²Ìdª&€¤Ÿ øD¡Ò’¤BR>UŽŠƒÄSß¹08Ì:©±Ìd™)*ˆ>á©TTö£" õĕǿa2”¤¨T,DåaU1€ùFŸðTÙI äžX,3ÈC¾`1•RO¶IùÌÄ<Æ&ËL¦jòG—Aú ŠO*-I*$åSñ¨8H<åñ ƒÅaÓIe&ËLQAô O¥¢‘a?*rO,zü³Ì4,DåaR1ó%Œ>ᩲ“h=…ÏLoÿûÝ›ö³Û=Çö¯lÇÞ[¢ûÓýw}vw ^=ó ¶!T!ò;ˆ©Žz¦Í|e&æ%6Yf2U“?´ ÒOHP|¢PiIR!)ŸŠGÅAå)ï\,›NjZܘH:™ ºO`Ð}ƒè˜JEe`?*rO,zükDfR=¨ XˆÊÞb2ñ1_Â螊;é€ÖQàÌôlùiø915rÃ]o† K'D>~Kt_ÿæ–gžÛßó{έœ'ÛÄofb%c}Óh#ôÆñEþ¸2H?Á@î‰Bu% BR>ŠƒÊSß¹0XfÔXfêÞ¿–™"‚î˜JEe`?*rO,zü³ÌTF¢ò°§˜L|Ì—0ú¦ÊNR õDÄ™é_Mþë¶üttC?ñwÿ‡_û gë€Gžø4œXÅs×AÝˆå†»Þ ÿ¾Œ‰èÞ¯}èÒËž!/?sÑϼðü ÐŒð³J þÅ' Õ•€ IùT<**Oy|çÂ`q˜uR3\fÂLSw–™DŸÀ ú„§RQØ ‚ÜTžJœ?wˆþA}âþKa\²“Õƒª€…¨<Œ)¦>æKØ}Se')Ðz"ú•wþÊês¸€{o¦„¨»åxuù•£Ïí.O·ñíëßÜâN)Šhû×?A0–À!òßÍüÚOþ½ÿaõßsÀË=wÞMÁ?«êO02÷Ä¢ºP!)ŸŠGÅAå)ï\,³NRºÉ2±Ì DŸðT*Æ£‚ ÷Ä¡§*Ìoüöñ/À q'* U#QIXRL>æKØ}Se')Ðz"šÛ1÷+ïü•·ÿó·ëï¿ù¯,衯<„±ÃÄ¢ZRyøÎA¦:ê9¶TÅ‹æî~ðªÅ¥§wíÜõ†7¼áçÞú×áU±Õ¹ü=?f™É?±êO0P|¢P]IRi ŠƒÊSß¹0XfÔ´ûsÄ2îDŸðT-ö£‚ ÷Ä¡'.ˆ;‰P=¨ ‰ÊÃ’brð1_Âî˜*;é€ÐSS|/Ã`6è&ªy)ÄTG=Ç–üf&L¼eËL&YðsK þÅ' •–$U‘ò©rTT/øÎ…Á‚0뤦ݧ2ËLºO`}S©¨ ìGAî‰BODwÒ¡’P0•„Åäãc¾„Ý'0wÒ¦žø^†Ál6L:T!*;ˆ©Žz‚ |e&˜˜e&Ò_ÿaqðÓK þÅ' •–$’ò©xTT/øÎ…Á‚0ë$¥õ¯˜#–™tŸÀ û¦RQØ ‚Ü„ž¸ î¤C%!ï0•„ Å ÄÇ| »OHªì$+L=ñ½ ƒÙ m˜t¨HT¦Sõl”ÏL:01ËL¦:†?ÃêO0P|¢PiIR!)ŸŠGÅAåñ‚ï\,ËNRZÿŠ9’Hf‚îtŸÀ û¦RQØŠ€Ü „ž¸ î$B%¡*`'* Šˆù¦ŸTÙI V˜zâ{³AÚ0‰P…È L!¦"êɹV&3ÝÿÈ5'O… :–™Œ/‰ÊƒŸdõ'(>Q¨´$©”OÅ£â òxÁw. „e')­?•‰Xf"Ð}B‚èžJE#Ã~TäžX ôDq'* y‡‘¨$ (¦>æK˜~BRe')Xaêéú;."0˜Ò†I‡*Dåa 1ÕQO×µÑ2Óý\súåã°)`™É”aÈ/øy&P‚â…JK’ IùT<**×m¹ˆî\,ËN:ìs]–™ ûÑ'SñÌT<01ËL¦ h@ÀÏ6ú DŸðTW*$åSñ¨8=qaÙIŠÊÔe™ ºO`Ð}S©¨ ìGE@î‰BOµÎ®ì¿p~×@ÜI‡ªBÞa'*Ó‰)Žù¦Ÿ`TÙI V˜Æƒºa¡ Qy˜BLEÔ3ù~Šd¦a³Ìdr@÷ ~ ԟ0 øD¡º’¤*Ò@*•':,;I±ÌÔe™ ºO`Ð}S©¨ LHE@î‰ZO….œ_¸~Ë7é0¾âN"Tò;QI˜NLq|Ì—°þ£ÊNR°Â4¤ “‰ÊÃb*¢žÕ÷““™®ßrÑöÇ>6B`b–™Œ¹'øQ'€Â€â…JK’ªHùT<**OtXvÒa¯˜[“Bf‚îtŸÀ û¦RÑȰ¹'h=:»²ŸþAMÝû_}'ª y‡¨ ì&f(|Ì—°þ£ÊNR0Ä4¤ “Uˆ¼Àbª žÛçÈÌL˜–_9“‡b™ÉHzâ‚x( (>Q¨´$©”OÅ£â òD‡q'v*ÓËLÐ}B‚螪E#Ã~Täž( ôT+73AÜI„JBÞa'*£‰ó%¬?Á¨²“¬0uÃ$B¢ò°†˜Š¨gø9 3y LÌ2“!Ðw!æ 0 øD¡Ò’¤BR>ŠƒÊ–¤XfZc™ ÒOH}S©¨ ìGAñ‰ZOµ,3eÀTTF3,>æKXÂPe')Xaê†I„ŠDåa 1UPÏóó¹Ìä101ËLmY'5îAˆ( (>Q¨´$©”OÅ£â ôÄ…e'ÝÆT83a—i˜–g&è>A÷ L¥¢2°¹'h=ղ̄°•ÅÄŒ€ù 0TÙI V˜fƒ´a¡ ‘DLÔþ|Ï<¿Ç{`b–™Ú ‚Nšà¡Ÿ(TZ’THʧâQqz⸓;•I°ÌtŸÀT**R{bÖS­ºe&U…¼ÃTT3>æK€ÂPe')bêìåSÏìuÃ$B¢ò°†˜*¨çü-¿rÊ{`b–™ÚRNÊ࡟(TZ’THʧâQqz|ùΙãÏž> ƒaÜI‡e&Á2SDÐ}S©hdØ ‚Ü„žÊõÏLÐw¡ª_؉ÊÀ\bFÃÇ| Pªì¤+LÍm¼çƒ= n˜D¨HTSõÌ?"ËLí'}ðP„@ ŠOxª+’ò©xTTnÜzÉu[.‚Á0î¤Ã^1'XfŠºO`ª ûQAP|¢€ÖS¹Ze&U…¼ÃTTæ3>æK€ÂPq'XajŽïeìuÃ$BE¢’°†˜*¨'ÿqYfjŒ;é°WÌõjsf‚îtŸÀT**RP|¢¡'úd&U…üÂTT†3’ó%l@¨²“ 15Ç÷2 ®ƒºa¡"QIDLTˆÎ2SÃ@©©5÷ ÄŸ(TZ’THʧâQqz<â;óaÜI‡e¦^–™bî˜JE#Ã~TŸ(dè Ä2Ó*LE#ƒVbŠX-J™ø˜/a @•t`…©?¾—apÔ “‰Êà b¼SE –™š2Mݹ!4  øD¡Ò’¤BR>ŠƒÐãß¹0˜ãN"ìsŠe¦X û¦jÑȰÅ' zÉÊLÐw¡Â_X‹FÅd–”ƒù6 TÜIV˜úã{WAÝ0‰P‘¨©Z42ìGE@î‰ÂUž j’™Tò SÑÈ ¦€ ©>æKØ€Pq'bêïe\uÃ$BE¢ò°‰¿TH„e¦ºƒ4Ó$îAˆ ((>Q¨´$©”OÅ£‚ òøÅw. æÀ¸“{Åœb™) ˆ>©TT&¤" øDá*OP–™:° ªŠaXކÂÇ| PÕTÙI †˜úã{WAÝ0)P…¨©TT&¤" øDá*Oh²çÚ'î#x¢SUÈ/LE#ƒ¶b6£ð1_ T5Uv’‚!¦þø^†ÁU8L T$*›ˆñK‚tXfª)(2ä„8Ѐ€âžêJ@…¤|ª¡Ç/¾sa0öDXfÊ73A÷ ÒOHÐ}S©hdØ ‚â…«þÐzF„Ä3:†úÅZÔRËzbêK<æç˜†fâN=bf!îe,n@à˜HÔ³ˆôËÄ‚ª(3MÌ:H'! D¦+åLHjfâQ9„ž~Å‹Åì;5Ð3æPfº3S‹Zc?*â3 ´ž¡òŒÎ„¡±µ†à²n†úù9f ¡™¸S†˜Yˆ{‹8¤&uÇ,"=2± 6ÊLõC|Yé$$Ar€èãϤ¥œ IÍL<*‡ÐÓ¯¸s±¸ûN%ôP¦”™ü!ú83©¨ &¤(>£@ë O LêkQ;h.k…Ihñ˜Ÿc”);õ`…™‹ÓÏ=)À"ë†ÔÀ¢î˜E¤_&ÔF™©r(/k§"ÐÐP|FaÒR΄¤f&•Cëé×i{O ;‹‹°ïTB™ie&è>ÎL*jý¨ŠÏ({Æ‚Ä3:†zÄZÔÊËú`H<æçX‚eâN=bæâÖÛÿ<À"‡ÔÀD¢î˜E¤_¦ÔF™©Zh.k§"2ÐÐP|FaÒR΄¤f&BèéÝ w]ñ—_û$aß©„2ÓÊLþÐ}œ™ZÔûQ!h=#BåiC=b-jåeM° *ós,Aƒ2q§ 1ó†À!50‘¨;fé‘ Rfª‚Ëz©H€ 44ŸQ˜´”3!©™éG…zÆÅ¾S5&ãÉ”™ü¡û83µ¨5ö£Bˆ>þÐz¼òàóÏÜcO LêƒQ;è/³Çä ós,Aƒ2q§ 1ó†À!£3…¨;fé—iRfªjËÚ©H€ 44ŸQ˜´”3!©™éG…zÆÅÄSe¦R]JFÌLè>žÐ}œ¡û83µ¨5ö£(>£`÷ñôìñ¯Ÿ¾÷ç|æçLâ C=b-j fö€|Äc~Ž%hP&îÔƒ!fÆ8¤&uÇ,"=2í NÊLUAgYs8 ††â3 “–r&$50ñ¨Bϸ˜xj°ö™ i)§ÌäÝÇ™©E­1!•@ñÓ§cßþRøµçã?f*ÏèLêƒQ;¨03Æôã)ós,AÃ1e§ 1ó†À!50‘¨;–é‘)uRfª"‹àT$@Š?Ó•À´¤&•CèûN%Ö83!*YÊLþÐ}<™TÔûQ!ì>ÎÖ13±µƒ3cì>Îâ1?Ç4wêÁ3oR‰:b‘™‚P-e¦ ¯H„S‘hhˆ>þLWÓ’˜xT­gDì;5Pcj¤Ìä ÝÇ™©E­±BôñÇîã¬ÖÌdÚPŒÚA‹™+Fñ˜Ÿc މ;õ`ˆ™7‰DݱŒHLG¨–2ÓèÐV$Á©H€ 44D¦+åLHjfâQ9´ž1ñÔ`-3ZRe&gè>ÎL-jý¨¢?vgÊL­ ÅÌsÏXâ1?Ç4wêÁ3oh2:‰ºc‘¾˜ŽP3e¦q!¬H§"2ÐÐ}ü™´”3!©™‰GåÐzFÄÄSƒõËLIÍ”™œ¡û83µ¨5ö£(>£`÷qVef2a¨G Fí ÈÌ[ψâ1?Ç4wêÁ3#ß:ro°½‚À!50‘¨#–é‘I 5SfªŠNEd ¡!úø3i)gBR3 !ô á¾ÇÝýÈ7°¸+&ž”f&Æš)BB*±†™ ÝǺ3S‹ZcB*â3 vgÊL«C‘™†žqÅc~Ž1h8&îTb;ÁÌÑï}ì¥Áö ‡ŒÎD¢îXF¤G¦&ÔL™iè)²+œŠÈ@CCôñgÒR΄¤f¦BèÂÛÎéi{OÂ⮘xF·NeB?*¤Ìä ÝÇ“IE]0!•@ññÇèão½2ƒQ;ˆ23ÃÊ3ºxÌÏ1 ÄÄzl'˜9Š{y{CFg"Qw,#Ò*§Ìä1EI'! 2РP|FaÒR΄¤f¦BèBܹX´˜xj°6™ ñ¨ÜX™ éǺ3¤O&µÆ~TÑÇ£¿ú2“iC=b0jQff˜xjù9ö ˜¸Sí3Gq/o¯ qÈèL$êˆeDzdšBå”™œ¡¤Hƒt’  Åg&-åLHjfúQ!´ž!Ä‹E‹‰§ë‘™PŽV¢Ìä ÝÇ™©E­±BôñÇèão2ƒQ;è2³Á¸SxÌϱ ÄÄzl'˜9Š{y{CFg:QG,#ÒÓê§Ìä Eš¥“%hP(>£0i)gBRÊ¡õ !î\,ZL<5XƒfB6Z•2“'tg¦µÆ~TÅgŒ>þŽ}ûËá”2S¤™Ù`Ù©J<æç؃bâN=¶Ì޼õ.‡ŒÎD¢îG¤/&+ÔO™ÉŠ”H'! JРP|ü™®¦%50ñ¨ZÏâÎÅ¢ÅÄ3º5x(šQ ÊLžÐ}œ™ZÔR ,>£¨,3™6Ô#6£PgæY§6ñ˜Ÿcˆ‰;õHEf–â^ÞzCFg"QG,#ÒS&A™Éê‰J'! JР}ü™®¦%50ñ¨ZÏâÎÅ¢ÅÊ3º¹g&£v”™<¡û83µ¨5&¤ˆ>þX|F±.™‰Á¨Ô™y`Ó©P<æç؃†`ÊN=RŽ™«¸—·ÞEãÑ™NÔãˆôÅÄ…IPfÒ‰”K'! JР}ü™®”3!©™‰GåÐz†w.-VžÑÍús¨E­)3yB÷ñdRQLH%}ü±øŒB™©Í 0èÔ)ósLBC0q§)ÇÌUÜË[ï¢qȸL$êŽqDzaâÂT(3 ÝDV’NB” A!úø3i)gBR3 !ô $î\,O æ›™ŠºX·Ì„îã éÇ“IE­±BôñÇâ3†‡jÊL¦ õ…Á¨4š©cÍ©V<æç˜„†`âN=RŽ™«¸—·ÞEæq™HÔãˆôÅô…©Pf¢‰¬*„$(AƒBôñgÒR΄¤f¦BëHܹX&žÑÍ÷sèD)3yBúñdjQkìG%P|Fâ3оsùzÓ×÷f¹g,&õ…Á¨4š©cÊ©Y<æç˜„†`âN=RŽ™«¸—7ÞFãÑ™NÔãˆôÅ$†©PfЉ´NB” A!úø3i)gBR3Ó ¡õ $î\,+Ïèfš™‰º%3!ýxB÷ñ„îãÌÔ¢Ö˜J øøCî BϸLê ›Q È4“ÆŽS¹xÌÏ1 ÁÄzäEf–â^ÞxCFg:QGŒ#Ò “&D™iÈ%ÒN: IP‚…èãϤ¥œ IÍL?*„Ö3¸s±¬<£›é3扺SfrƒîãÌÔ¢Ö˜J úøCî BψLê ƒQ È4“ƈS¿xÌÏ1 ÁÄJä9f®â^ÞxCÆe"Qwì#Ò S&D™©wh%ÒZ: IP‚…èãϤ¥œ IÍL?*„Ö3¸s±¬<£›cfB!ê…2“tg¦µÆ„TÑÇrÏ(zÆeòP_ØŒZ@©™.œIˆÇü“PïLÜ©Gžcæ*îå·‘9d\&uÄ8"½0•aZ”™ú…P"]¤“%hPˆ>þLZÊ™ÔÀÄ£rh=‰;‹ÀÊ3:æ¤E˜rª…<Ôe&7è>žL*jý¨¢?ŸQ ôŒË䡾°­ ¥fº˜o¦"ós¬B½3q§yŽ™«¸—Ù8dt¦uÄ>"½0¡aZ”™ú‚D"Ý¥“%hPˆ>þLZÊ™–ÔÀÄ£rh=‰;‹9&žÑÍІz¤ÌäéÇ“©E­±•@ññ‡Ü3„ž™6Ô6£k&ŠífBâ1?Ç*Ô;wê"3K§Ÿ{RÀÆ!ã2‘¨;öé…É Ó¢ÌÔ ôéNE” á øŒÂ¤¥œiI L<*‡Ü3Óöžv.s¬<£›Ý3æÐ†z¤ÌäéÇ“©E­1!•@ôñ‡Ü3´ž™<Ô6£U!ÖLÛÍ„Äc~ŽU¨w&îÔEf–Ütþõ·~‚™CÆe"Qwì#ÒÉ “£ÌÔ ôéNEÄ á øø3] LKj`âQ!´žáüå×>yÅ—ÎÁbŽ•gtóÊLCýZ«Ì„îã éÇ“©E­1!•@ôñ‡Ü3 „žq™<Ô 6£k&ŠáfZâ1?Ç*Ô;wê"3gÈ2.‰:b‘^˜Ü09ÊLÝ!ŽH_p*  ÑÇŸéJ9’š™~T­gD¬<£cNZ„A§B¨B½SfòîãÌÔ¢Ö˜J úøCñÅvå9þämÏ?so¾â΢^°µ€^3E¬6“ù9V¡Þ™¸S †˜yCæq™NÔûˆtgrÃ)3u„2"=©H€4D&-åLHjfúQ!´ž±òŒk^/Ì„*Ô;ÿÌ„ôã éǺ3S‹ZcB*èãÅg[‰çÙãwœ¾÷ç|æçÒŠ;“‡úÂf´*ôš)b²™¢xÌϱ õËÄz0Ä̇ŒËD¢î˜H¤;S¦H™© déNEÄ á úø3i)gBR3Ó ¡õŒˆ¡g\3zƒД™| ûx2©¨5ö£Bˆ>Î{ƲUyŽ}ûËáÔžÿXZqgòP/ØŒZ@²™öš‰ŠÇüÃP¿LÜ©[ÌŒ!sȸL$êˆ}Dza¢Ã)3µ†&"½Ã©H€4D&-åLHjfúQ!´ž1ôŒk.™ =h ÊL>~<™ZÔûQ DÈ=£Ø®<ÊL ÙLcÍtÅc~Ža¨_&îÔƒ-fÆ9d\¦uÄ>"Ý™è0QÊLí ˆÈp*  ÑÇŸIK9’š™~T­g,¬<£SfZ…2“¤O¦µÆ„TÑÇŠÏ(¶+ÏØ™Éä¡^°µ€j39Œ5Óù9†¡~™¸S¶˜Cæ™HÔ‰tgºÃD)3µ€"Á©H€4D&-åLHjfúQ!äž±°òŒŽ9ifª  G™ÉÒ'S‹ZcB*èãÅgÛ¡G™i7H6“ÃR3iñ˜Ÿcê—‰;•`ˆ™7”‘‰DÝ1‘HG¦;L—2ÓªBd88 ƒ†ƒèãϤ¥œ I L<*‡Ü3Vžqé¡L+RfòôãÉÔ¢Ö˜J úøCñÅvèQfÚ ªÍ´0ÓL]<æç†zdâN=bæëñGŒ2‰:b"‘îLz˜.e¦• ƒÈ p*  ÑÇŸIK9Ó’˜xT¹g8;rßㇰ˜0ôŒk™ %hPë“™Ð}<¡û83µ¨5&¤ˆ>Î{F±#ôŒš™Lê›Q 7ÂF3ñ˜Ÿcꑉ;õ@‹™±ßûØKÆ‹éD1‘Hw¦>L—2S9DNEÄ á úø3i)gZR ¡õ êì‹_ý¶ó_ŠÅ„¡g\ÓÏLÈ@CSfr€îãÌÔ¢vØJ úøCñÅŽÖ£Ìd ÜLÍ<Äc~Žm¨G&îÔ-fÆâ^fìQ˜HÔ‰tdêä)3Bé$$A ¢?“–r¦%50ý¨ZÏ âÎÅbÂÐ3.e¦9g&¤OH?žÐ}<™ZÔR D(>£ØÑz”™ ´› a ™‡xÌϱ õÈÄz ÅÌXÜËì2 ‰:b"‘îL€˜4e¦Èâ#„$ˆAÃAôqfº˜–ÔÀô£Bh=ƒŠ;‹ CψԘV§ÌäéÇ“©E­1!•@ôñ‡â3Š­g¼ÌdòP/ØŒV…p3!¬3³ù9¶¡™¸S´˜ÙzR™©&¦uÄD"™1uÊLK¡}ˆ›t’  ÑÇŸéJ9’š™~T­gPqçb1bè—2Óê”™ ýx2µ¨5&¤ˆ>þP|ü¡õ(3ÚÍT0ÍÌI<æç؆zdâN%ØbfL™©*¦uÄJ"™1uÊLÍ>ÄS: IЃ‚èãϤ¥œ IÍL?*„Ü3¨¸s±1ôŒkâ™ ȇ2“¤O¦µÆ„TÑÇŠÏ(Ðz”™rh7SÁ.33ñ˜Ÿcꋉ;õ`‹™1e¦z˜HÔ+‰td2ÄÔ)35@õgé$$A¢?“–r&$53ý¨rÏ âÎÅbÄÐ3.e¦Õ)3 ÝÇ™©E­1!•@÷q†â3 ´žye&f£U!ßL»ÌÌÄc~Žy¨/&îÔƒ-fÆ”™êa"QGL$Ò‘É3 ÌÔÕCœ¥“=h ˆ>þLZÊ™ÔÌô£BÈ=ƒŠ;‹Cϸ˜“vŸS Ô7ÊLCC÷qfjQ;ìG%}ü¡øŒ­g¬Ìd Q/˜V…|3 Œ2óù9桾˜¸S¶˜Sfª‡éD±’HG&CÌ€2Ó"Hâ/„$èAAôñgÒR΄¤&•CîTܹXŒzF¤‡2µ²&™ éǺ3ŒÚaB*èãÅÇZÏe¦o&Ef–â1?Ç<ÔwêÁ3W›u#îåíØ!c1¨#VéÂdˆyPfÚz‡Œ"„$èAAôñgÒRδ¤&•CîTܹXŒØzF4åÌ„ôãI™ihè>žL-j ©¢?Dh=[.?ðOoúú^,Ì¢î˜V…‚3 ,2³ù9桾˜¸S昹ڬq/oÇ…‰D±’HG¦D̃2“…Ø!cI'! zÐ@}ü™´”3-©‰G…Ðz†w.#¶ž)3µ¢Ì44¤O¦µÆ„TÑÇŠÏ(ÐzÆb Q/˜V…‚S?昹ŠÇüóP_LÜ©[ÌŒmޏ—·{‡ŒÂt¢ŽXI¤##æA™ P:dDé$$A¢?“–r¦%50ý¨ZÏÐâÎÅbÀÐ3®¢ÌľStgž™ éÇÒ'¤O¦µÆ„TÝÇŠÏ({Æb Q/˜V‚‚S?¶˜‹ÇüóP_Lß©[ÌŒmޏ—·{‡ŒÂt¢ŽXI¤ #fC™)‡Ì!ãJ'! zÐ@}ü™´”3-©éG…{†w.†žq±(튉§è>Δ™††ôãÉÔ¢Ö˜J û8Cññ‡Ö3"Sˆºc6Z"NýØbf,ósÌC½0q§l13¶8â^Þî2 Ó‰:b(‘.L˜ e¦2‡Œ+„$èAAôñgÒR䤦BîZܹX zF4ÙgÌ!úøSfÒ'S‹Úa?*èãÑÇZψL$êŽÙh%(8õcˆ™·xÌϱõÂÄz°ÅÌÕ‰À÷rzWF`"QG¬$ґ鳡̔ qÈèÒIH‚4Dg¦+åLHjfúQ!䞡ŋŀ­gDÊLm)3 ÝÇ™ Fí0!•@ôñ‡èã­g,¦õ‚åh%ˆ8•c…™½xÌϱõÂÄz0ÇÌÕ‰Æqú¹'é]éD±’H¦G̉2S„À!5À©H€4tg&-åLHjfúQ!äž¡¶÷¤°s±°õŒhš™ ÅgÊLƒB÷ñdjQkLH%}œ¡øŒ¹g,¦uÇl´*tœÊ±ÂÌ^<æçXˆzaâN%ØbfìDã8póù×üDzWF`:QG %Ò…Is¢Ì nH%p*  ÑÇŸIK9’š™~T¹ghùµO^ñ¥s°°õŒhš¯ÿâ3ŠuÈLH?ž~<™ZÔR tg(>£@DÝ1­§rL0ë ós,D½0}§l13†Ò!#2¨ VéÈT‰9QfBÚzàT$@¢?“–r&$53ý¨rÏXØzFÄ¢´+Vžq!÷ŒE™iPH?žL-j ©º3h=;ò¶çŸ¹‹Ã0…¨,G+AÇ©Ì:ˆÇü Q/Lß©[ÌŒ¡tÈXL'ꈕDº0Ubf”™6¤8 „†€èãϤ¥œ IÍL?*„Ü3 †žés(3 éÇ“©E­1!•@÷q†èã¹gÛóÏÜ{úÞ|øOÿ[¬Ã¢î˜V…ŽS3ö—5ù9¢^˜¾S ¶˜C챘NÔC‰taªÄ̬yfBתàT$@¢?“–r&$50ñ¨rÏXØzF¤ÌÔ2Ó ~<™ZÔÒRˆ>þ}ü!÷l;öí/‡P{>þcX†‰DÝ1­§fŒ/ë#ós,DÝ™¸S¶˜¹Bé™NÔC‰´fªÄü¬sfBÔÚàT$@¢?“–r¦%50ý¨rÏXØzF4ÁfBë‘2Ó ~<™ZÔR Dg(>£@îÙ¦Ì4Œ/ë#ósŒDÝ™¸Sæ×\yÍž³ö4‹[>ñðùâþàéFÉoüÂ^¸µŽÒ1˜Ü`Qv0¨ †鄉ùYÛÌ„¢!©H€$4D&-åLKj`úQ!äž±°õŒH™©·Ì„ôã éÇÒ'ŒÚaB*îã ÅÇZÏŽ™É¢î˜V‚ŽS3–—µù9F¢îLÜ©DJ3θë×ýÆë¯^a^ùŠWæ^ôÃ/ ‹á¿iã=gí‰[†Åk®¼&­[á6Ã6Á©ÿäÔp­pkñZ7~Á¯û„>¨JÓB¦uÄP"]˜61?ÊLR-œŠHBC@ôñgÒR䤦Bî [ψX”vÅÐ3"„žq)3 ÝÇ“©E­1!•@÷q†èã¹ge¦ê1»¬›xÌÏ1ugúN%i<Ý~ëíáW¯0 ([à®b*Êc»Ùsâ!N» ·¶yå+^™/ƘµqkˆƒÙ53íyûž¼ïùÊú2¨#†iÍ„‰YZÏÌ„œ!u©H€$4D&-åLKj`úQ!äž±°õŒe‚/Ì„Ð3.e¦á ýx2µ¨5&¤è>Î}ü!÷ì ÌT=f—uù9F¢îLß©D^düm™™)8õŸœŠÌ—´43…km?KnÓvÌʺÏãÒ»ýÚõIsáŽmô¯‹kÊt¢ŽØJ¤5Ó&fi 3Z†T §"’Ð}ü™´”3-©éG…{ÎLWÊ™ÔÌô£BÈ=ξøÕo;ÿ¥ù [ψ¦öÂL¨<£SfÒ'S‹ZcBZ ÑÇ¢?Ÿ”™êÆæ²†â1?ÇHÔ‘‰;õ@‘qÖ™ ufºæÊkÂÃÊKGÜËùJôÀÝ|à}Øóö=Á…ç]˜ÖŸ8úD\Œ®¹êš¸ž/†wÃzþnòº×n=q/]º¾O 3¨#†iÍ䉹Rf’j¥“Ihè>ÎLZÊ™ÔÌô£Byîñwn¾ÂÖ3"e¦n”™†ƒôãÉÔ¢v˜J ú8Cññ‡ÜCÊLcpYOñ˜Ÿc'êÈÄz Ê8³™iÏY{^÷¯Kï&­3S¼bÞŒ‚¸—ó• lîÏë^ûºË>}Ù©oÚxÖ^¸îw?/©(L¾ø÷} ¬„-ãí‡õT”âÁ/þÂ/Æûo0 ›¥ Ö‹éD±•Hk&OÌÕZe&T ©\: I„†€îã̤¥œ IÍL?*”çqçæ+l=#bQÚ[ÏXxj Ì4¤O&µÃ„TÝÇ¢?äšjfb6Z jNµ\ÖS<æç؉:2q§(2þ^´33=ñð±Å¤ ’XjVÊL—]|Yl:á ÄŽ¸—ó•Ë>}Y¸ýSßtjZ‰ éáÓJLHùJ,Sx%¦°ä+aƒpÅÏ+[\S¦uÄV"­™B1Wë“™0¤~é$$Aº3“–r&$53ý¨Pž{|Ä›¯°õŒˆEiWÌ=cAâ©2Óp~<™`ÔR tgˆ>þ{È%3™HÔËÑJPsêÄÚ²¶â1?ÇNÔ‘é;•@—ñ3Sì2ÑVŽ1[®”™~ñ~1ÝòÖ+‚ïŒq/ç+áöÃÆéaJQ¼Kùb¼é±K·¿óqRA¼V¾¢Ì´Ít¢.J¤5S(flM2ú…LB: I„†€îã̤¥œ I L<*”·7qçæ+l=c™Ôë£ïTB™i8H?nL-j ©º3D(>¤ÌT%¦–uù9v¢ŽLß©DžfFñ¢ÍtáG/¼ñ 7—]|YX鞙⭅ãµÂmâGq/§wcB âÝ˯{û­·‡Å ¼n¯ÁÅ òe¦-¦uÄV"­™H1cÊLR­t’ õÑÇŸIK9Ó’˜~T(o=nâÎÍW˜{Æ2©fBß©„2Ó@~<™ZÔR tgˆ>Î{v±~™ A§NL-ë,ósìD™¾S Ô['{m¦SÿÉ©ÏJ˶‰VÊL¹×ý_,)ˆ{9½»çí{â6á£äâÝÃËu§×cZôúJá"|8e¦-¦uÄV"­™H1cë™/d*ÒIH‚*Ô;D&-åLKj`úQ¡¼õ¸‰;7_aî‹2Sg>™ éÇê¤O¦µÆ„TÝÇ¢?äž]L23±­A§Bì,k.ósìD™¾S ±ãä™i‘W¶ÍL­Eq/§wcf âÆ7ZO}"mÅ;“¿SN™i!Ó‰:b+‘vL¤˜·Ùg&” ™t’  õÑÇŸIK9Ó’˜~T(o=nâÎÍW˜{Æ2Ì„¸Se¦ ýx2µ¨5&¤¥Ð}œ!úøCîÙÅð™ÉD¢îXŽV‚¦S!v–5ù9v¢.LÜ©rŒ¿î™éš+¯ÙõÑO¹­ëfOp‹{9½›2SZipáy†-ã=¿ìÓ|qñ@™i!Ó‰º`+‘ÖL§˜7e&©V: IP…z‡èãϤ¥œiI L?*”·7qç¦wÙzFÄ¢´+ŸQ îÔcÞ™ éÇÒ'S‹ÚaB*îã ÑÇŠÏî.ùËß½á+ç`±?&uÇrTA§BŒ,ù9¦¢.LÜ©ZÌ(e¦ ?ºñÜò•E™éÔr*¶´–f¦˜Ð†vuÍUׄÍn¿õöðF¼ ^5<‹¸©òÛŸ9“Šº`+‘ÖL§˜·yg&d ™–t’  õÑÇŸIK9Ó’ìŒGåRëñwnz—­g,zýï>(3 éÇ“ Fí0!•@÷q†èãÅg&uÄr´4 1²H<æç˜Šº0}§h1£xÑ‚ÌÿT\¾²(3…Í6%´ùv¸4¼ûÀ]¤K£øQ®¹êšÔ;â^Nïqûgãòüi¹E ÛùŠ2ÓÓ‰:b+‘vL§˜½g&4 ™œt’  õÑÇŸIK9Ó’˜~T(µOqç¦w™{Æ¢gÌõA™i H?žL0j‡ ©º3DgÈ=c1¨#–£• éÔ†…E‚xÌÏ1uaúN%ÐbüÝ~ëíáW¯0ÈLáÝ­R“-†wÖÈLøƒWãÎ3Sþn_/×÷r¾›Qø(©"]sÕ5á¦òŠ„wƒx¯pãqñÆÛ.ßò»Xôòásf:QGÌ%ÒŽI³§Ì$ÕJ'! ªPï}ü™´”3-©éG…Rëñwnz—¹g,ÊL}PfÒS‹ZcB*îã ÝÇrÏ(L$êŽå¨šN…XX$ˆÇüSQ¦ïT"o1þ®¹r#â„_½ÂÄ|“Ä"Þˆ[>ñð1… åâbÚò²‹/‹‹á¿á*AÜ̾VwÜËX ›¥«ãŠ19ŋң¢>ð¾ÄíÃÄlôÄÑ'Âq%lû­·Ç-ƒ Ï»0®Ç[¶›š?Ó‰º`+‘ÖLª˜½¹f& ™¢t’  õÑÇŸIK‰ IÍL?*”Z§¸sÓ»Ì=c™HfBÖ©2Ó@PܘZÔR tOˆ>þP|Fa"QG,G+AÓ© óŠDñ˜Ÿc*êÂôJÄ43–'~âÆ/ÜØ`£ÑœØA¾e°ñÂIW^³ç¬=Axƒ±cSÜËX ¸û Ï»pÏÛ÷„ÿæ/ºôÄÑ'n4x.| ´ÄÅ|¢.lo9_Ì=tøŽãÇžÄâ|˜TÔ[‰´cRÅ:˜efB­‰J'! ªPï}œ™´”3!©™éG…Rëñwnz—¹g,,J»bôñ‡¬Se¦! ýx2µ¨5&¤¥Ð}œ!úøCñ…éD±­Y§6Ì+Åc~Ž©¨ Ów*‘§™9CìØtú¹'XÑý÷<ïÏ^¾ñ>±ÿ¸h&L'ꈹDÚ1µb(3IµòóU¨wè>ÎLZÊ™ÔÌô£)ô8;mïIaç¦w™{ÆÂ¢´+FÈ:µQfÒ'S‹ZcEZ ÝÇ¢?ŸQ˜NÔËQ94Ú°­Hù9¦¢ÖLÜ©sÌ\¡wl:póù×üG‘Spú¹'Ur¯úg:QGÌ%ÒŽ©ë`~™ ©B¦+„$¨B½C÷qfÒR΄¤¦J¡ÇÙ_~í“W|éœô.sÏ(ôŒ¹ž(3 éÇ“©Eí0!•@÷q†èã ¹g&uÇxTY§6l+’Äc~޵¨5w*Á3cèÕ@`ºôÚþø£‡±Í|˜NÔ[‰´cjÅš˜YfB§IK'! ªPïÐ}œ™´”3-©éG…RèsÏX”™zâ™~<¡þ¸Aúñd‚Q;LH%Ð}œ¡û8Cñiòìñ;°Ò‰:b9Z ²NUV$ù9Ö¢ÖLß©[Ì\!vÔa½SdRQÌ%ÒŽ kB™Iª•NBT¡Þ¡û83i)gZRÓ ¡øŒ‚¹g,ÊL=QfÒ'ŒÚaB*îã ÝÇŠÏBÏ?sï[Ï{ÑWþ2Öû`:QG,Gåujð"¹xÌϱµfúN%˜cæ ±clë˜"“Šº`.‘vL°XsÊLˆ2ué$$Aêº3“–r¦%50ý¨ŠÏ(˜{Æ2…Ì„ S§g&¤OH?žL0j‡ ©º'D(> ûö—Ã?¨=ÿ1¬÷Át¢ŽÊ!ëT…UE ós¬E­™¾S 昹BìÏú¦Àt¢Ž˜K¤,Ö‡2“T+„$¨B½C÷qfÒR䤦BñsÏXX”vÅîã A§NÊLC@úqcjQkLH%~ÎP|š¬AfBÖ© “Šìt4ˆÇükQk¦ïT‚9f®Ð;|)0m1¨ æiÇ4‹õ1Ì„þLZÊ™–ÔÀô£B©û8;ûâW¿íü—†7˜{ÆR}fBÊ©™2Sï~<™`ÔR tOˆ>þ}š(3Ùe}°"-ù9£vLß©sÌ\¡wdâ^Æbk LML'ꂹDZ0ÍbÝL=3!LȜğ#9„¡~!úø3i)1!©™éG%òîã,îÜðsÏXX”,vgH95SfêÒ'ŒÚaB*ôã ÑÇŠÏÊL#A|™=Æ£rñ˜Ÿc0jÇôJ0ÇÌzG&îe,¶ À´œIE]°˜H &[¬›Ig&T ™™øÓ$‡0Ô/Dg&-åLHjfR‰¼û8‹;7¼ÁÜ3F%‹ÝÇRN͆ÎLH?žPÜ ýx2Á¨&¤H?žÐ}œ¡ø,1ÌÄrTe§*¨03Æl´ªxÌÏ1µcúN%˜cæ ½#÷2W¢ÀTʤ¢.XL¤S.Ö2“T+þLÉ! õ ÝÇ™IK9’˜~T(ï>ÎâÎ o0÷ŒBϘëÕ\3Ò'¤7¦µÆ„´º3tg(>K(3!f®ŒÚ‰ÇüƒQ;¦ïT‚9f®Ð;2q/c±Ó L'êˆÅDVe²ÅšnfB’ù‰?YrCýB÷qfÒRδ¤¦Ê»³¸sÃ,>£Pfê•2SïPܘZÔ+ÒRè>ÎÐ}œ¡ø,1@f2¨#Æ£rˆ;õ@Ž™%Ö¢Öâ1?Ç`Ô‚‰;õ`Ž™¬k®¼æ5?÷šŸyÕϬêï¿ø`±Äëßù‚ørêþ—ÿâÂûWŸù‡ºô—ùÚ7?ÏìrÂ¥×þslÜÀáv®¼îÝØ¸AŸ·cBRtåW¸}Û'SNøü¿>7˜Ðí¸ù|lÜ`ÇíìÌnYñvv^=Yév>Ã9¸z>6nÐúvþ—óÿïÿøÍïG~ü?ü‘ÿ}ü'ÿÙ¿¯Ì$%ÒIH‚0Ô/tg&-åLKj`úQ¡¼û8‹;7¼Áâ3 e¦^)3õõÇ©Eí0!•@÷q†îã Ñg e&wÈ1óÃNÔQ<æçØŒZ0q§(5“öšŸ{MøåÍmþ“¿÷¿yó‡N|“|xû»e‘ ¯ümT˜è»?vú¹'aãCßÎñcO®t;áuÜBÔævL` 6ngï ·óþ?9y;£ìô{ç¿7¨ívþåÿ®ž„‹°qƒ·³3[¬|;;¯ž¬t;á‹€«'áK‡t¼“_÷ŸnýÃöš+>{îçJÐ#d–ð] õ+>þLZÊ™–ÔÀô£By÷qwnxƒÅgÊL½RfêÒ'ŒÚaB*îã ÑÇŠÏrµg&–£rˆ;õ@”™F¢îâ1?ÇfÔ‚é;•@©™´ŸyÕÏ„_Þþ‡Sÿ÷§íýAáýƒWþǯ×ÖšþçþŸÿä/Þòµ;ÿâwaWß}ü1„˜ä¡Ãw`ã·ó­‡ïÅÆ V¸{š|÷‰Ç˜’o½ß¼çÀ®žxôÈvFÙé‘£‡°qƒ ÝN¸7Øq;;ËÅùæ½ …qõd¥Ûyä[‡põÄív®ù«O|îªËÿbÿ_¬äìýÎÿëM/üë%n¾áfÜÉ• FÈ\¥“a¨_è>ÎLZÊ™–ÔÀô£By÷qwnxƒÅg,J»'Dœú)3õ éÇ“ Fí0!•@úñ„îã Åg9e&_ˆ2sÂ<Ô—xÌϱµ`úN%Pj&-f¦Óöþ ^ e á…>è­_ÿówêÕñ[å÷>öÒÿõKç?ö$‚‹l0ý¨‹íV"í˜x!+¹ò‹ïÿäñî1Bæ*þXÉ! õ ÝÇ™IK9Ó’˜~T(ï>ÎâÎ o°øŒ‚QÉbúñ„ˆS?e¦~!ýx2Á¨&¤H?žÐ}œ¡ø¹ä/÷†¯œƒÅ¶L'êˆñ¨úN%ffƒm¨Gñ˜Ÿc3jÁôJ ÔLÚX™)6Ŧ%L'êˆÑDVeâ…¬d¬Ì„!3 ä†ú…îã̤¥œiI vÆ£ry÷qw.sÏ(ôŒ¹¾)3õ éÇ“ Fí0!-…îã ÝÇ¢?Ó‰:b<*„¸S ¤™y`ê]<æçØŒZ0}§(5“6nfŠ›2¨ iÁô Y‰2“ -þ(É! õ ÝÇ™IK9Ó’˜~TéÇSܹ,>£¨;3¡àL‚2S¿~<™`Ô+ÒRè>ÎÐ}œ!úø3¨ Æ£rè;•@ ™&¡!Äc~ŽÍ¨Ów*R3i5d¦H±i&uÁb"«2ñBV5JfB†y‹?DrCýB÷qfÒR䤦Búñw.‹Ï(”™ú¦ÌÔ/¤7¦µÆŠ´º3tgˆ>þL*ê‚ñ¨úN%Ðh¦Ž=h ñ˜Ÿc3Z•‰;õ@©™´z2S¤Ø´ƒIE]0šÈªL¿U)3ÉÐâÂP}ü™´”3-©éG%Ð}œÅËâ3 e¦¾ š™~<¡þ¸AýqcjQk¬HK¡ûxBôq†â3 “Šº`<*‡¾S4š©c N<æç˜VeâN%i¦®¶Ì)6m1©¨ FY•é²*ÿÌ„!³päІz„èãϤ¥Ä„¤f&!•@÷qw.‹Ï(X”,¦O(8“0ËÌ„ôã õÇ©Eí0!•@úñ„îã ÅÇŸéD1Bß©2ͤ± *ósÌF«2}§È4SWgfŠÖ=6™NÔ£‰¬Ê$ YÕço8'üsVf’áÄ9´¡!ú83i)gBR3“J û8;mïIaç²øŒ‚QÉbúqƒ|3ÊLýBýqc‚Q;LH%~<¡û8Côñg:QŒGåÐwj€L3iÌ@C‹Çü³ÑªLß©2ÍÔÕœ™¢õM¦uÁb"«2ýBZxâ±#^õÛ‡|ëA€uNB´¡¡û83i)gBR3“J û8û‹ÛÎÿì ïfññ§gÌ @™©_¨?nL0j‡ ©Ò'tgˆ>þL*ê‚ñ¨O Pj&ŠÈG<æç˜VeúN%i¦®þÌ­cl2©¨ FY•IR?Yé$$Aêº3“–r&$50ý¨ºÏ(}ü)3 @™©GH?žL0j‡ ©Ò'tgˆ>¥ž=~VÚ2©¨ Æ£Bè;•@¯™"Ö7ñ˜Ÿc6Z•é;•@¦™º©d¦h½b“IE]0šÈªLÂÊ¡>ÈšH'! ÚPÐ}œ™´”3-©éG…P|FÁèã¯âÌ„v3!ÊL=Búñd‚Q;LHK¡û8C÷ñ„âSêùgî}ëy/ºàÊ_ÆúêL'êˆý¨úN Ðk¦ˆéÇS<æç˜VeúN%i¦nZ™)Z‹Ød:QGŒ&²“0¤~¨²&ÒIH‚6Ô#tg&-åLKj`úQ!,>£Pf€2S~<™`Ô+ÒRè>Î~þcX_éD]0•Câ©’Íä°û8‹Çü³ÑªLß©2ÍÔM13E3M¦uÄn"+1 C*‡ô ë#„$hC=B÷qfÒR䤦BôñÇâ3Šå™‰õÇ ÚÍ„(3õéÇ©E­±"-…îã ÝÇ¢O)e¦!ÙL»³xÌÏ1­Êô ÑÌÀt3S4ÛØd:QŒ&²*S1¤fè²VÒIH‚6Ô#tg&-åLKj`úQ!D,>£`T²XÜ ÝLˆ2SPܘZÔ+ÒRH?žÐ}œ!ú”šWfBâ©’Íä0úø‹Çü³ÑJLß©Í L=3EylúÄþ7âÒI2©¨ FY• R3tY+é$$Aêº3“–r¦%50ý¨¢?ŸQ0*Y¬?>n¦E™©G¨?nL-j‡ ©Ò'tgˆ>¥”™†j3-,>£ˆÇüËÑJLß©Í Ì#3E·~ýÏÏýÓ_¾þà'°>I&uÁh"+1C*‡î k§"ÚPÐ}œ™´”3-©éG…}ü±øøÓ 3 C™©G¨?nL0j‡ ©Ò'tgˆ>¥zÊL¦uÁxT‰gt¨6ÓÂÜ3–xÌϱ­ÄôJ ÑÌÀœ2Ó¬˜TÔ»‰¬ÄT éâð‘o`¥_ˆ²np*  õÝÇ™IK9Ó’˜~TÑÇÙѧ?|ì»3e¦aÌ/3!ýxBýqc‚Q;LH%~<¡ûxBôYÁŒ2O n&„­gDñ˜Ÿc9Z‰é;•@£™e¦™NÔ£‰¬Ê„ iíàW„Ÿn9ë=Btu“Ÿ‡DhC=B÷qfÒR䤦•@ôñwöů~Ûù/e÷q¦Ì4Œá2ê¤O¨?nL0j‡ ©Ò'¤Oˆ>+Pf ÂÍ„0ôŒ+ós,G+1}§h43 ÌT#“Šº`4‘•˜Š!]\ùÅw‡Ÿá¿Xï Šƒ¬¡ü<$Bêº3“–r¦%50 ©¢¿¸sÙ}œÕúgæPm&G™©G¨?nL0j‡ i)tgH?ž}V Ì4´›©`å]<æçXŽVbúN%Ðhf@™©F&uÁn"+1!CºPf’¡åç!ÚPÐ}œ™´”3-©IH%}üÅËîãL™iÊL}Aúñd‚Q;¬HK¡ûxB÷q†è³‚ê2ãQ9TžÑ!ßLO â1?Çr´Ówj€@3ÊL52©¨ vY‰ ÒÅ ™ ¹AÖS~¡ õÝÇ™IK‰ IÍLB*èã/î\vgŒJT›ÉQfê ÒS‹ZcEZ éǺ3DŸô‘™L*ê‚ñ¨Ïèo¦‚‰§ñ˜Ÿc9Z‰I<5@ ™e¦™TÔ»‰¬Ä´ éB™I†–Ÿ‡DhC}AôñgêRbBRÓ !úø‹;—ÝÇ£’ÅäÕfr”™ú‚úãÆÔ¢ÖX‘–Búñ„îã ÝgÊLÃ@¾™öJÄc~Žåh%&ñÔf”™ªc:QŒ&²2¤£á2Zƒ¬­ü<$Bê ¢?S—Ó’˜~TÑÇ_ܹì>žj}ýo$›)Rfê êS‹ÚaB*ôã ÝÇ¢Ïj”™†‚S?ÆzÄc~Žå¨œé;•@ ™e¦ê˜TÔ»‰¬Ä´ éH™I†–Ÿ‡DÈC}AôqfÒR䤦Bôñw.Ó'e¦Á(3õõÇ Fí0!•@úñ„ôã Ñg5ÊL@Á©ËNUâ1?ÇxTÎôJ Ð̃2SuL*ê‚ÝDVbZ†t4PfBhu–Ÿ‡DÈC}A÷qfÒR䤦Bôñw.Ó'½þ÷`”™ú‚úãÆ£v˜J ýxBúñ„賚º2ãQ!TžÑ!âÔe§*ñ˜Ÿc<*gúN%hæA™©:&uÁn"+19C:Rf’¡åç!òP_Ð}œ™´”3-©éG…}üÅËôãI™i0ÊL}Aýqc‚Q;LH%~Ü û8CôYÙ%ù»7|å,3©¨ ö£B¨<£CÄ©³Nmâ1?ÇxTÎôJ Ð̃2SuL*ê‚ÝDÊ™–!Ý ‘™PdÍåç!òP_Ð}œ™´”3-©ÁÎxTÑÇ_ܹL?žªÌLè55³Ì„ôã õÇ Fí0!-…ôã ÝǺ3“Šº`?*„Ê3.DœÊ±éT(ósŒGåLß©Í<(3UǤ¢ÖØMd%&gHwÊL2´ü<$Bê º3“–r¦%50ý¨¢¿¸s™~<1*Yl@Ðk&J™©/¨?nL0j‡i)¤Oè>ÎÐ}œ™TÔûQ!„žq¡ãTŽM§Bñ˜Ÿc<*gúN PgfC™©.&uÁn"+19Cºë=3!1ˆäç!òP_Ð}œ™´”3-©éG…}üÅËôã‰QÉbr€^3QÊL}Aýqc‚Q;¬HK!ýxB÷ñ„èãϤ¢Ö ¡òŒ §r :uŠÇüãQ9“xj€:3ÊLu1©¨ vY‰)Ò2“ -?‰‡ú‚îã̤¥œiI L?*„èã/î\¦OŒJôš‰(3¡þ¸AúqƒôãÉ£vX‘–Búñ„ôã ÑÇŸ©E­±Bè:NÍXsªù9Æ£r&ñÔuf6”™êbRQì&RÎä éE¿™ }A$ÈÏC"䡾 û83i)gZRÓJ øŒ"î\¦7Ë_˜)`r€^3QÊL½@úqcjQ;LH%~þ•,6 ¡¡ÔLš2S/Pܘ`Ô+ÒRH?ž~ÎLZJLHj`úQ!DŒ>þ•,f ¡¡ÔLš2S/Pܘ`Ô+ÒRH?ž~<¡û´¡ÌÔ:±àLB<æçØ ™¾S¤™9QfªˆIE]0H95¤*È "9œŠÈC}A÷qfêRbZRÓ !úøcôq¶ü…™f ¡¡ÔLš2S/Pܘ`Ô+ÒRH?ž~<¡û´QEfb<*„Ð3"Ôœ:1ßLE<æçØ ™ÄS¤™9QfªˆIE­±›H95¤6È "9œŠÈC}A÷qfêRbZRÓ !úøc÷q¦×ÿ˜2SwH?žL0j‡i)¤OH?žÐ}ÚPfê‚N…Øn&$ósìG…Lâ©ÒÌœ(3Õ¤¢.˜N¤œ‰R4À©H€<ÔtO&-åLKj`úQ!Dì>Δ™6§Ì„úãéÇ“ Fí°"-…ôã éǺOÊL}@Ó©ÛÍ„Äc~Žý¨„é;•@š™e¦Z˜TÔÓ‰”3]CúuøÈ7°²4À©H€<Ô¤O&-åLKj`úQ!DÇžýÞ·žzüð±#;ê›ú22ÍÔ)3u‡ôãÆÔ¢v˜J ýxBúñ„îÓFÛÌdRQìG…ÐzF„¦S†›i‰ÇüR Ów*43'ÊLµ0©¨ ¦)gº†ôèàW„Ÿn9ëåÐD ?‰‡zîã̤¥œiI L?*„èã,¶žw]üê·ÿÒíôãI™i`ÊLÝ¡þ¸1Á¨&¤H?nÐ}<¡û´4ÙÌ„Ð3"4 1ÜLK<æç˜J˜¾S ¤™9Qfª…IE]0H!5¤_W~ñÝá§Cø/Ö !(ˆXùyH„BÔ tg&-åLKj`úQ D±õÄ»~<1*YÌ@CC¦™º!2êÔ7¨?nL0j‡ ©ê¤Oè>-Ÿ™Ø ¡õŒM§6¬6“ù9&¤¦ïTifN”™jaRQ¬'RÈt é—2“ -?‰Pˆzîã̤¥œiI LB*èã/¶ž¸s·Ó'F%‹hhÈ4S§ÌÔêŒÚaBZ éÇÒ'tŸ–”™:CÖ© «ÍäÄc~Ž ©„é;•@š™e¦*˜NÔÓ‰”3]CúÕ%3¡&ˆì*?‰Pˆzîã̤¥œiI LB*èã/¶ž¸s·Ó'F%‹hPh43 ÌÔêŒÚaEZ éÇÒ'tŸ–”™ºAÓ© “ÍÅc~Ž ©„é;•@š™e¦*˜TÔÓ‰”3iCú¥Ì$CËÏC"¢^ û83i)gZR“J úø‹­'îÜíôãF/Ì4ÎLZÊ™–ÔÀ$¤ˆ>þbî‰;w»þ¸aT²X‚…@3ÊL!ý¸1µ¨&¤¨?n~<¡û83µ¨5ö£h=cAÖ© KͤÅc~Ži)Ów*.33ÊLã3©¨ ¦)dÒ† A™I†–Ÿ‡D(D½@÷qfÒRδ¤EL?*„èã/枸s·ëF%‹%hP4ó ÌÔêŒÚaB*úãéǺ3S‹ZcB*Ü3”z0ÓL]<æçX‘–2}§è23£Ì4>“Šº`=‘B&mÈZd&D‘fùyH„BÔ tg&-%¦%50ý¨¢³”{âÎMïúaT²X‚…@3³ÉL¨?nPܘ`ÔR Ô7H?žÐ}<™TÔûQ!äž± îÔƒ™fêâ1?ÇŠ´”é;•@—™e¦ñ™TÔë‰2uC† Ì$CËÏC"¢^ û83u)1-©éG…Ð}œ¥Üwnz×£0 f”™:Býqc‚Q;LHK!ýxBúñ„ôãÉÔ¢ÖØ !÷Œq§l4Ñ=߸þà—¯n6H㢠¿Êo다[Nâ1?ÇŠ´”é;•@—™e¦ñ™TÔë‰2uC†°jfBAY*?‰PˆzîãÌԥĴ¤¦B÷q–rOܹé]'ú3s.”™:Býqc‚Q;¬HK!ýxBúñ„ôãÉÔ¢ÖØ !÷Œq§l4ÑÙ¿ÿÖ¿è…á—ð0á\\|ÕOÿ7q˧ÝsÊ/±eØ&ÜNºÍ¨ü–Ó 6À»¶4Åc~Ži)Ówj€(3?ÊLã3©¨5¦)g‡ áó7œ~:(3Épòó…¨è>žLZÊ™–ÔÀô£Bè>ÎRñ9mïIaç¦wèÏ̹è=3¡þ¸AýqƒúãÆ£vX‘–Búñ„ôãÝÇ™©E­±•@î âN=všÜÙ¿ÿÖðKø‹_ôB¬ŸñÏÞÖS ŠbôÉ£Ò'?þ‡qñ·~ó×ÒbTxËñêávâ»ñZéÒƒ_¾:n Ì4ÊLã3µ¨5¦)dê† ä‰ÇŽ\xÕo>ò ¬/‚‚ ²NE¢^ ýx2i)gZRÓ ¡û8KÅç/n;ÿ³7¼;½ëD™É…2SG¨?nL0j‡i)¤O¨?nÐ}œ™ZÔR äž± îTbGƒ_¾:üncP‘™Â»aã<3Ÿüø†Å0x]á-‡·Où¥“ÓEÈLÁ¹zgXQfš e¦‘™TÔë‰2uCj€| R§" Q/~<™´”3-©éG…Ð}œ±û8Sfr¡ÌÔêŒÚaEZ éÇ Ò'tg¦µÆ„T¹gˆ;õØQg !]ñÙ?>÷CïÌWvÍLA¸zXÇÆ…·6ȯh3Ó#‡¿¶é?3™¾S D™ùQf™IE]°žH!8¤È"%p* õéÇ“IK9Ó’˜~TÑÇ»3e&ÊL¡þ¸1Á¨V¤¥PÜ ýxB÷éäùgîÝóñÛwõo`}“ŠZc?*„â3 ÄJìH3VC ²š3ÖWºåÄf¦Eâ1?ÇÔÌôJ ÊÌ2ÓÈL*ê‚õD ™À!5@>)S‘…¨H?žLZÊ™–ÔÀ$¤ˆ>þØ}œ1*Y,AƒB™ e¦ŽPܘ`ÔR Ô7H?ž~:9öí/‡P{>þcX_ÀÔ¢ÖØ ¡øŒ}§¬3°k :÷Cïun¥[N”™fO™iL&uÁ€"%LãA)3ÉÐòó‘¨;tg&-åLKZÄô£Bè>Îòèwn¾28e¦þ +2S¨?nL0j‡i)Ô7H?ž~º"3!0]~àÔãO~eÇ6LH%P|FÄ3:™ 1(,"÷욙Қ®øìçë+Ýr¢Ì4{ÊLc2©¨5Ö)d‡ jifB2YU~!u‡îã̤¥œÉI‹˜~TÝÇY}âÎÍWǨd1 ÕfZ•,e¦.Pܘ`Ô+ÒR¨?n~£@å‹Lƒ‰l :píeaQ ›…Ed¦ æ'´¡•n99㟽a×kYñÛ)ÇÔÀôJ ÈÌ’2Ó˜L-jõD ™Ì!ƒRf’¡åç!"Qwè>ÎLZÊ™œ´ˆéG…Ð}œåÑ'îÜ|epŒJcÐpn&EiWýf&Ô7¨?nPܘ`ÔR Ô7H?ž~ºê+3•¦€ý¨Š?$žÑ1Ç4¸ç×ÇBôâÍ?—üÖoþš-Jç~èa%L¸J¸bZb9 ®/Zé–“+>ûÇñÒ0áÃáRˆßT9¶¤¦ïTEf–”™ÆdjQk¬'RÂ4š2“ -?‰‰ºC÷qfÒRbZRÓ ¡û8Ë£OܹùÊà•€%hPh7Sœ´ˆ2S¨?nL3j ©ê¤7è>=èž™VLûQ ŸQ òŒŽ9¦Á¹zgÞ€¬ôÂÞO»¥‰ÒMÅqçæ+ÃÒëw†–Ô@™© Ô&µÃ„´Ò'Ô7H?=h—™Z¦ˆ ©ŠÏ(PyÆÅ3cñÛ,Ç–ÔÀô°ÈÌ’2ÓˆL*ê‚EJ˜Ì!CSf’¡åç!"Qwè>ÎL]JLKj`úQ Dy÷‰;7_–2S7IÍêÊL÷̽Ï}çPpüÈ}O=ô@õœ°Ã«z¨ýðƒÏÛðoŸAêÒO?.¾æ:pë{°hlE¢N)bB*âã•gtl13¿ÙrlI Lâ©‹Ì,)3Ȥ¢ÖXO¤É2´†Ì„X ÒN~!u‡îãÌԥĴ¤&!•@ôñ—wŸ¸só•a)3u€Š´ÔÈ™éß>sïߣ@åC̼Åo¼[R“xjÀ"3KÊL#2µ¨5)a2‡8Pf’¡åç!"QwH?žLZÊ™–ÔÀ$¤ˆ>þòîwn¾2,e¦¶Jxg¦ï?}ï±C" À÷<0ʸŽÜÒ”)ùÚágE6ZÐÐ6Ó/Çt]SÄ„TÅg=ãbˆ™·øí—cKj`O XdfI™iD¦µÆ€"%Læ‹2JHkùyH„HÔÒ'“–r¦%50 ©¢¿¼ûÄ›¯ K™©ô£B~™éß>sïS>øðAæ€ÍXpÿ‘›ï>ró]GnúætÜ9m7OÅ]ËÝrÏ‘›ï=rËæ[ëðcwþÞ·Ê1 §ÿÀ1!•@ññ‡Ê3.V˜Ù‹ß„9¶¤&ñÔ€Ef–”™ÆbRQ (RbgæÊL2´ü<$B$êéÇ“IK9Ó’˜„TÑǺOܹX£’Å4tœÊ¡rÊLO½ï(ÓÍn¤›§•–r&ÜL kNµLTjr÷®½é‰;ÿí_#!-Å4˜þi?)bB*èã¡g\¬0³¿slI Lâ©‹Ì,)3Ť¢.P¤ÄÎÌ!>>Ã9ᧃ2“ '?‰‰ºCúñdÒRδ¤&!•@÷q†îsÚÞ“ÂÎÅ―€1h8è85C<*7xfú»gîýνx–ÜCGnºÛT›É1áfZXsª…TènĦ£·­ú‚MìA½Û-0ݶy‘©E­1!•@ôñ‡Ð3.V˜9úV.~CæØ’˜ÄS™YRf‹IE]0 ÈR;‡¸yâ±#{?û+‡|#_D&é§""QwH?žLZÊ™–ÔÀ$¤è>ÎÐ}öß²÷Òë÷`q@ìJÀ4¤œš!•63}ÿé{ûzþ:¹éÓk&Ê„›iaÍ©úÑ ß|Ï‘—pJß~‡ŸþZRƒIÈú—g~Ëj=¯ùÿ4þãò´çã?vü©¯˜®´á¦¯ï=}ï °ý"›·óU“‡6Üôõ?ê|;}禯¤üvú²y¾¶kcºýžO¾õ¼aûEö|ü¿>þÔíùÕ“;ï»´üvÎ:ÿ%G¿õW¸…h¥ÛéËï}ì¥÷º•iiÓ]÷Ü.Åö‹lÜÎ}·"EwÝ;Âíôå̾økßø<Цûï;X~Zßί½õ?û÷ÿƒoëã2ÊLèD]0 H‰¬qÈè DºÀ¸‘¨;¤O&-åLKj`R tgì>ÎØ•€1h8H9ÕB9ZÉ€™é¹c‡¾õ•íßð¾åÍÀX3];«Íä°æT‹ñhu÷¦oÂà»÷þ»gQ”vÅ®ÿÇúû[¿iµšSÞø÷â?.Oo=ïE‹2Ó _Ùx|¡ÍÛÙ=3Ýð•`ã»ÝÎVâYévúîÏÑoýeºyÖ¹éëÁÆ 6ogaÂÆ Nßû‚^n§/§Ÿ{Ò¢ÌôÕ;®—bûE–_ýÆÕCQX÷¿5ä¡•îO»Ûùíwþçÿ»ÿä³uˆq™3N=ƒÙeݘZÔŠ”0¥CF„L RäéÝá\€HÔÒ'“–r¦%5ØÙ ¡û8c÷qÆ®ŒAÃAÍ©ÊÑJ†ÊLÏ}çÐÎWû¾ßdš©3áfB˜rj†fÔÆæÃš¶U÷Ä]‡MT²Ø• f¦³/ÿ!<—¤Ü|þ‡Î¼àã?±Ó>ò_žýç'ýÑ—¸Mò?žõ_„÷º×þ|Z\Ó’ äÅg)ñÔ€qgâv<9n‘ø ™CQZÈ´žJ Ô̇x2µ¨5)aJ‡Œ…í@dS”v…S‘‘¨;¤O&-åLKj`R tgì>žôgæV„l´ªA2Óßßñ8¦#á—|6š0ífB˜rjÆfÔÖÝgO {ê¡Ã¦+»tÏLQalRfr‡F3ilI â·bŽ9iÓw*Á(3?âÉÔ¢ÖP¤„‰2¦0!©NED¢ŽÐ}œ™´”3-©IH%Ð}œ1ýxª&3¡æT ÙhUýg¦¿{fçë1Ý<ƒWûÞ•i7”S3Ô¢n²×æQt%`W‚¾2S´46)3¹C©™.†¤fñ›0Çœ´ˆé;5`‘™%„qcRQ (RÂÄ ›‚HdúQ!œŠèD¡û83i)gZR“J û8cúñ¤Ì´ 4£úÏLß¾;{Ñå9üE¹EL»™¦œj™NÔYzLÓÃ?÷]¤¥»ô›™¢†Ø¤Ìä±fŠ˜JÄo¿sÒ"&ñÔ€Ef–Ð>ÄIE]0 ÈR¦tȈdÍ™l´*œŠèD¡û83i)gZR“J û8cúñ¤Ì´ 4£zÎLÇܷݘn¾Ï¤™91ífBXsªÅHÔ‡»Óë4=òµ†—gW‚!2S´klZÌ„Ð3"ôš)b?*¿ñrÌI‹˜ÄS™YBû7&uÁ†"K™Ò!cabuf‚Q;8 Љ:B÷qfÒRδ¤EL?*„îãŒéÇ“2S1£vzÌL÷~ÿé{·_öûæL—™Ón&„5§Z(D=¹åž­ïÒ[?uø!˜‚EiWÃe¦±éwÞõ_üûÿÁ¿7pfBôñ‡Ö3"$›ia9ZIü–Ë1'-bO Xdf ícEÇ=`QŠ˜TÔŠ”0±C<=ñØ‘ô6Cƒ¬'“ŠºÀ©H€NÔº3“–r&'-búQ!tgH??ýÔ·žz‹CQf*†`ÔNŸ™éÉÒÓåÚÌè2s²³ÚLkNµL!êÍ¡ø½úðÁÃßÿ4¦€QÉ:3Eylúíwþçÿß3^ùü3‡˜“vÅ„TÑÇZψn&„ÙhUñ›-Çœ´ˆI<5`‘™%´½sß+ßý©WcQŠ˜ZÔŠ”È’‡8;xÇá§Ã[Îï27Ⱥ1‘¨»ü<$B'êÝÇ™IK9““1ý¨º3¤Ÿw]üê·ÿR,…Q ƒ†ƒ¦SÔ¢ÖzËLÿæÉ­ßÛ7Ü4Ë?-—3áfZXsª…6Ô«O{òÁÃÕf¦è>ÿCoÄ“2“  õ.þlÊ¡u„îãÌԥĴ¤¦•@ôñ‡ôw.‡Â®ŒAAÓ© RQýd¦çŸº7þƾaÎ].1áfZXsª…0Ô³ôWç¾sèpý™)|¸×½ö¸ýî‹Þûéÿ[ü‡Ù›˜J û8CëòÍ$°µ¿µrÌI‹˜ÄSF™ùAøX]ÜËX”"¦µÆ†"K™ð!ž”™Ö©B½‹?›rèD¡û83u)1-©IH%}œ±û(3Õ©¨‹~2ÓSÝ]_‡2&ÜL kNµ†ú¶•G>ˆ?9Ǩd•™bEZ›˜J û8Cë òÍ$0u¿©rÌI‹˜ÄSF™ùAøX]ÜËX”åL*ê‚ E–2áC<)3­/Óƒ6åЉ:B÷qfêRbZR“J û8c÷ñÌLzýï2HE]ô“™ûúÖËܬÁ«2E&ÜL kNµP…pâšž}|J™)jŠMLHK!úøCî Ný؉:ŠßN9æ¤]™¾S F™ùAûX]ÜËX”åL*ê‚ E–2áC<¥ÌÄ!3fJРâϦ:QGè>ÎL]JLKj`R tgL?ÊL•A'ꨇÌô·ÇógÌÝiŠÌ,í¬6Ó”S3S…zwËñ[÷ØŽçÍ1*Y5d¦h÷ØÄŠ´¢?äž± âTŽ‘¨»ø”cQÚ•é;•`”™´ÕŽŒEYΤ¢.ØPd)>Ä“2ÓÚ1hhñgS¨#tg¦.%¦%50 ©º3¦e¦Ê uÔCfúë‡ï‹¿¨¯Í3æÓn&„)§Z& âžøÝ{ô¶ÃÍLbÓ _9Ç„¤fˆ>ÎÐzÆ‚ˆS9¢^Äo¡‹Ò®Lß©£Ìü }¬.îe,Êr&µÆ€"%LøOÊLëÅ4 ñgS¨#tO&-åLKj°³B÷qÆô£ÌTt¢ŽzÈLOܹõ:ʯtÃ3W¦ÝLkNµÐƒsâysÏ›pfŠòØôà‘ý¦%5@÷q†Ü3tœš1õ%~óäX”veúN Xdf ícuq/cQ–3µ¨5YÊTq3ÓU׿‡=BfÆÔ7ñgS¨#¤O&-åLKj`R tgL?ÊL5A$ꮇÌôðÁÍÆtËáÃ7ÝerÌ\™v3!¬9Õ2=h 'ž7wüHic êÌLÑí÷\tàà{LHj†îã ¹g,H9ÕbêQ<æçX”veO Xdf ícuq/cQ–3µ¨56YÊTq¦Ì´Lúñ6åЉ:BúñdÒRδ¤&!•@÷qÆô£ÌTD¢îºf¦ûÌÖsŽ6°Å̘i7šS-ÓƒrËÖßI|òÁÃóÈL&!•@÷q†Ü3 ¤œš± õ(ós,J»2‰§,2³„ö±º¸—±(Ë™ZÔŠ,eª‡8Sfš?Ó}œÅŸM9t¢Ž~<™´”3-©IH%Ð}œ1ýT”™ƒ‚²S¢^tÍLÏ?•^ÿû!ÓbfÌ´› aÍ©–éAC9¿‡¿³õ*à,J»RfêŠÏ(rªÅ0Ô¯xÌϱ(íÊ$ž°ÈÌÚÇêâ^Æ¢,gjQkl(²”©âL™iæLôñ6åЉ:BúñdÒRδ¤&!•@÷qÆôã›™LZʱ q§(D½èš™žûÎÖ¯èëôúßi7šS-Ä ál¥Ò'î<¼®™ ÑÇrÏXPsêÄ*Ô»xÌϱ(íÊ$ž°ÈÌÂG+q/cQ–3µ¨56YÊTq¦Ì4g¦øŒ"þlÊ¡u„ôãɤ¥œiI LB*îãŒéG™©(D½èš™þæ‘­ÌtäæL‹™1Ón&„5§ZˆAƒ¹e뉟|í°2Ó{Æ‚ S!&¡!Äc~ŽEiW&ñÔ€Qf~>Z‰{‹²„IE]°¡ÈR¦zˆ3e¦Ù2¹g,ñgS¨#¤O&-åLKj`R tgL?ÊLu@êK×ÌtüÈ}'2Óý¦Å̘i7šS-Óƒ†rwü~øàá9d&&¤è>Î{F S'&¡!Äc~ŽEiW&ñÔ€Qf~Ð>Z‰{‹²„IE]°¡H3“<Äßço8'7”™æÆ´žÅŸM9t¢Ž~<™´”3-©IH%Ð}œ1ý<û½Óöžv.Á®ìAAß©òP_ºf¦§Úzùä¸a‹™1Ón&„5§ZˆAÃÙÊL2ÓP|F S!ö Äc~ŽEiW&ñÔ€Qf~Ð>Z¹òºwX”%L*ê‚Eš™ä!þžxìÈÞÏþÊ‘‡¿ÉN!e*Ïèp* u„ôãɤ¥œiI LB*îãŒéçÙïí¿eï¥×ïÁâ Ø•€=h è;•@ê‹2S;¦ÝLkNµƒ†£Ì„îã Ågh:µa N<æçX”veO eæíCܘTÔŠ,e’‡øc¤I3‰§8 Љ:BúñdÒRδ¤&!•@÷qÆôã‰] ؃‚¾S´¡)3µ`ÂÍ´°æT 1h8ÊLè>ž{F¦S!Æ áÄc~ŽEiW&ñÔ€Qf~Ð>Ä©E­±¡ÈR&yˆ?v ™4“xj€S‘¨#¤O&-åLKj`R tgL?n¾§Ì´ÚP”™Z0áfZXsª…4œ<31'-¢ÌÔŸQ éÔ†%hPñ˜ŸcQ²Lß©£Ìü }ˆS‹ZcC‘¥Lòì2]¦ïT§":QGH?žLZÊ™–´ˆéG…Ð}œ±þ¸©#3¡ïTm¨GÊL-˜p3!L9ÕB Ôšg&tg(>£@Ö© 3ÐÐâ1?Ǩd™¾S F™ùAû7¦µÆ†"K™ä!þ˜*d¢LÜ©NEt¢Ž~<™´”39iÓ ¡ûxbúñ¤Ì´ÚP”™Z0ífBXsª…4(e¦¡øŒe§*Ì@C‹Çü£’eúN%eæíCܘZÔŠ,e’‡8cª‰2e§*8 Љ:BúñdÒRÎä¤EL?*„ôã‰éÇ“2ÓCýRfjÁ´› aÍ©JР”™F„âãY§*l@â1?Ǩd™¾S™YBû7¦µÆ†"ÍLò¬2E&ëÔ§":QGH?žLZÊ™œ´ˆéG…~<1ýxRfZa¨_ÊL-˜v3!¬9ÕB ÔŒ2R tgˆ>þPvªÂä ósŒJ–I<5`‘™%´ñaRQÌ(ÒÌ$ñÇ`!“cšN…p* u„ôãɤ¥œÉI‹˜~TÝÇÓ§%™‰=h H<5@ê—2S ¦ÝLkNµP‚¥Ì4ŸQ ìÔƒÈG<æç•,“xjÀ"3KÈ­?öd€EibRQÌ(ÒÌ$ñSÅ·x;[È„˜ S'œŠèD] û83i)grÒ"&!•@÷qÆô³éñ§ŸúÖSc±ÊL»Aê2S ¦Ý lÿ¾Ë’ë.½—®†5g|û/º,¹ëºƒ'ÖQ‚hÿEšÃ¥+Rf ŠÏ(wêÁä#ósŒJ–I<5`‘™%äVÞ¹ï•ïþÔ«±(ML*ê‚Eš™ä!Îbª8ø+ÂO‡ën¹`;^È$˜šS­ü<$B*êÝÇ™IK9““1 ©º3¦ŸMïºøÕo;ÿ¥Xì»° •gt¨B½?3íßwirÝ¥ûqit×[óÍ‚°‚m™v3°“öç_ø‚úÍyùË~—®&ë;5¸î²«Ãg?µ0gþî©'.B ¢ükÞÀ¥+Rf Š?”z°þ¸‰Çü£’eO Xdæí£­¸—±(ML*j E–2ÕCœÅZqÕõï Çðßí~!õ3)§fñgS©¨ tg&-%¦%50 ©º3¦ŸMqçb±ìJÀ4TžÑ¡ õnäÌtðs×å•á…/ø¡°‚m‚Kþh6»ð}çbG¦Ý /|âç>³Ìù»§ÆÏ®<3û/úÓXš”™¶1!-…îã ÑÇâN%˜~<Åc~ŽQÉ2‰§Œ2óƒöÑVÜËX”&¦µÆ†"K™ê!Îb°Pfš$“rj6劺@÷qfêRbZR“J û8cúÙw.ûÇ®ìAC@⩪PïªxÒÜÉ?ûóasÂÛ¸4‰¥i£)˜‹|™vã"&•Yf¦ý]¶¹óWËL2±"-…îã ÑÇúN%˜~<Åc~ŽQÉ2‰§Œ2óƒöÑVÜËX”&¦µÆ†"K™ê!Îb°PfšÓq*6劺@÷qfêRbZR“J û8cúÙw.ûÇ®LBC@â’Pÿž«#3ù†ºÑNÌ¢G*½þ×3\þ‹uw¦Ý¸Pf²^þ²Ÿ×RfÚÆŠ´º3Dè;5`÷qù9F%Ë$ž0ÊÌÚG[q/cQš˜ZÔŠ43ÉCüÅf¡Ì41&âÔ/þlÊ!uîãÌԥĴ¤&!•@÷qÆô³)î\,ö] ˜„†€Ê3:V¡=·¥¢Ì”ž·YR¸M7 ÿź;Ón\(3YÊLÄŠ´º'è;•`÷qù9F%Ë$ž0ÊÌÚG[q/cQš˜ZÔ3Š43ÉCœ¥l¡Ì4%¦àLBüÙ”C*êÝÇ™©K‰iI LB*îãŒégSܹXì»0 •gtlC}9јêÊLá¿éÙs»¶$e¦ðé+3å”™v`B*ôã ÑÇúN }üÅc~ŽQ Lß©£Ìü }´÷2¥‰©E­1£H3S=ÄY*ÊLSb Î$ÄŸM9¤¢.Ð}œ™º”˜–ÔÀ$¤è>Θ~6ŋŞ}O™iÌCÝe)ª+3¥º~án¯®Ì>}e¦œ2ÓLH%~þxFÇâ3ŠxÌϱ+é;•`”™ä¶â^Æ¢,dRQÌ(ÒÌTq–â…2Ó4˜v3!ñgS©¨ tg¦.%¦%50 ©º3ÖŸMqçb±gÊL#QG&0EÕe¦»ÜúÂÍž¯Þœ™öï»ô囯îtòÏþü;Î8ë’?Ú‹FX ëØ8|”°Mú@áºAz7NX [^wéþøÒãa6rÆMßüàž÷†7¢¸æÂ÷í=rÓáƒÚ‹6_³|G –)š„ Î|éáÝ­+üÀìZšâmn~.¼ÂIw ¼±#uh@ñÒ‹N´žàºË®N…+^øþ½ù¥ñ…mÂÛAºÏa%ß27µãë–]=N\Œ–f¦øÂU^ÿëÿÓ%¹èoy{þåÚ¼)^eÊL£@ôq†ÄSŸQÄc~Ž] Lß©‹Ì,!´÷2e!“ŠZcC‘¥LõOy¿PfšÓn&$þlÊ!uîãÌԥĴ¤&!•@÷qÆú³)î\,öL™É`'êȦ¨ºÌ¼ãŒ³6âÉC ™éºK÷Ç„±Ñ;²õKN< Ï–¦ u˜œÂ-ïßwiü(abfŠbÀ ÛÄ-cTŠiЇ âEá¿1èœù†SãEaq+ñœ°ßVUA3JŸøÉ›Ú^ÂíØ«,’>:·ßÌ:ñ¦Âl| ­'‰—¢@…wãUÞñ–³òõ3wëÙÒlÝÞ²ñÅ 7²ÿ¢Ëâ-¼›6kÎLñ!Ká¿w]w[¾ž¾ø›7µ½¾ºµÍLè>ÎÐ}œ!ñÔ€Ågñ˜ŸcW“xjÀ"3KÈmŽŒEYÈÔ¢ÖØPd)>ÄSÞ/”™&À„›i‰?›rHE] û83u)1-©IH%Ð}œ±þlŠ;‹=Sf2؉º0u)©131O`Ñn–¤G»ÜuàV\”b„½b¼Á0›dû¹uá*aÅf¦0á»ÌÃMØ2^´y•Ëò‹Ò#nð褔™ì£–â­…ÿb=ˆ1-pðs_ÜeûͦsÉG6ÒÛö:Ñz¢ƒû7®h×ãö»f©ôűϞK…«ï¿è²|=ÿ ™)e¬K>rQ¾Å{µyS¼hÊLþ}ü!ñŒŽ¹g,ñ˜ŸcW“xjÀ"3KÈmŽŒEYÈÔ¢ÖØP¤™©â,OÊLµ3ÕfrâϦRQè>žLZÊ™–ÔÀ$¤è>ÎX6ŋŞ-ÉLìAAè;Q&-å*ÍLéQH/Ì^ Ün]wéþ¸ñÆjv^¤K7bÄ΋RfÚõй”K6㓪ͦԒì“ãÒCŠÂ¸hÿ¾ËФ¢ø6ï*/ŠI%l€õEÒMüÜ·7›N¸Ÿa1=’+¯?Á;Þ²ñˆª¹gÇb<Ä)J—n|w^´ãë¶ó¢\CfŠŸõÆ$[Lš/-¦ÌäÑÇ*Ïè˜{Æù9v%0‰§,2³„üÑVÜËX”…L-jEš™ê!ÎòŠ¡ÌT;Sm&'þlÊ!uôãɤ¥œiI LB*îãŒõgSܹXìY™ ¡g\LE­™®•f¦ = iã4‹7Këa6Ÿ°¶ã¢(ÅüõºtÅ]_&<×PRK²Ù(Å2›™é13¥§àm§±Í¦n'|I㣖¥(JáöÃ:^<Õ¢ë.»:_R$Ú¸Û;/JŸne¦ýýi\ß X© mÓK€ïÀŠ´Ò'D¨<ãbëQ<æçØ•À$ž°ÈÌÚGq/cQ2µ¨5fifª‡8Ë+†2SÕL²™¢ø³)‡TÔÒ'“–r¦%50 ©º3ÖŸMqçb±gÊL;±µfºÔ›™ìkïºY"Hþ4·Ü¢ RfZtÅ$å’q’†Ì”ž7JfJÏ›Ûìt›‹›¯ÌVâc‹âÇÚ¸Á¹'¶'û̸x;÷jçz²hƒíOgç:,ÊLáÝl=U¡mÊL;°"-…ôã ÑÇ*ÏèØzFù9v%0‰§Œ2óƒöÑAÜËX”…L-jEš™ê!ž2>Ã9ḡÌT#Ók&*þlÊ!uôãɤ¥œiI LB*îã‰éç„Óöžv.{Æ®LBC@èkQ;&*Yõf¦´f³­Ì33…mÂ¥'ÿìχcM˜]?P¼tóKÁ‹áÝ>ñŒ¹wâóæÒ»AÌ:ö%–â‡Î·„Elßë Ì´ÔòÌÄ„TéǺ3Tžq1ôŒ+ósìJ`O eæí£ƒ+¯{w€EYÈÔ¢Ö˜Q¤™ â -ãÛ?¼÷³¿räáob]ÆgzÍDáT$@*êéÇ“IK9Ó’˜„TéÇÓÏ ûoÙ{éõ{°Ø3v%`BψX‹Z3Qɪ(3íúI±S„ ÛÌ,3…ÅTgÂçÞÍW°q/ ÷ë Òóæ¶^küÄ3æwÒ '…K7>ô‰ú“ĽëEÑ¢ ¶¿n;×A™i)e¦^!ôŒ‹¡g\ñ˜ŸcW“xjÀ(3?hâÆÔ¢Ö˜Q¤™ â‰-CêdbÍtáT$@*êéÇ“IK9Ó’˜„TéÇÓ'v%`ZψX‹Ú1EiWe¦Í€Â‹ò×¾™GfJ7ˆ?6×ðÂb¸(l€õéys› oÇ3æ¢íKO<ŸîDèÙ!n¶q¯ÌEÑ¢ ¶?ë Ì´”2S¯zÆÅÐ3®xÌϱ+I<5`”™´qcjQkÌ(ÒÌ„ñÄœ!2¥fÒp* uôãɤ¥œiI LB*ôã‰éÇ»0 ­gD F혢´«Ú3Sð«'^ <¶ ›™Òö¢h;‚ì\+3¥g«]wéÕùzÐof òÌŸ1¼ùgòâbø2†7v}­îø¡Ãìßùgé¢ôjâ÷mçEÛ}ç:,ÊLïxËÛãúË_öi1§Ì´ i)tOˆ>ÎPyÆÅÊ3ºxÌϱ+I<5`”™´qcjQkÌ(ÒÌ„ñÄ¢!2¥fÒp* uôãɤ¥œiI LB*ôã‰éÇ»0 ­gD F-˜œ´È2ÓÁÏ]—2GÛ’>¸ç=ñ¢Í׺ÞqQ®no¬Ì”ÝŸíŨá5\«ALZa ·¸”|pÏ{·.½hãRûâßQ yïxËY¸(H7>.Úþtv®Ã¢ÌtÝeŸë›·ªÐ¶ø5Yti1e&gè>ÎzÆÅÊ3ºxÌϱ+I<5`”™´ñaRQkl(²” â†9C*d2ÍÔáT$@*êéÇ“IK9Ó’˜„TéÇÓ'v%`Zψ،Z09i‘ d¦ õ 063)7ÜuàV\”®ûÁ=ïYtÑ(™ÉÞZþ ÁƒŸû".]t­f×]ºñT¸0ñKxyïô@¤xiþ|º\¸ÖÆMÄ}d.M‰²„Z53¨`Û (Þ½0›÷m{=Hñkóöw\´"e&gè>ÎzFÄÄ3šç·Åc~Ž] Lâ©£Ìü ˆS‹ZcC‘f&|ˆ' ©É4S‡S‘©¨ ¤O&-åLKj`R ¤OL?žØ•€Ihh=ca0jÁ´¤Ud¦øˆ›†ÌÄ`f×Ì”‚ÑF§ÈÖ÷ï»4e”|=JôÙõ6sé£Û–”bÇFÙyQzî‡ùdë±Ë„ ¤ÅpõpW>PüD6’ÊÎõ¥â·®»³ïé#îzi²}Ÿw> )=”éÄ‘vØþtv{¶]’2SØ (½nxc󥸹M”jQ˜pSùãŒ.|ßÞt#/Ùç¯çÞÎ NØ2¿(®‡ …̓ýû.K ‹é•›ÂGL1+LxÛ>Ö©AúÊl48“xÒ¥-Ì\šK¥)ÜÎ%Ù·ÿ¢Ëš¯ûŽ·ìøº]wÙÕØ ëé æoy;2Pþ¹Ç/T°ù¹l½6S˜ðîu—}>¿Ö*”™œ¡û8Cë‘é>nL]Jâ1?Ç®&ñÔ€Qf~?ć©E­1£H3>Ä£†ÔÆ4šÀ©H€TÔÒ'“–r&'-búQ!¤OL?n¾7~fBë›ÑªLHj6rfºîÒý/ÙçìSÛ’×ÿúo† šSÔ¯n¾Žu“6 ìÇ Â"6 ÂÕ±Ùf´ÚÈ7×]ºÑGv½(oãÒü¿Ã] ¤û™žU>»´}ºµðI¥Åh#²œ¸©¥ÒýÄ3æ¢Xy‚]_ü>¸ç½ùÝÂ=ÙõfÖñf“OÇl˜/ÔO¤G-%gþî©a=~Ä|ƒxgÂJ°yû;®UL™Éº'„ž™ôãÆ¤¥\<æçØ•À$ž0ÊÌò‡ø0µ¨5fif‡xbÔª˜@38 Šº@úñdÒRÎä¤EL?*„ôã‰õÇ2S†ÙhU&$5«âIs“ˆ3%&ñT È2“3¤Oh=#2õljJV<æçØ•À$ž0ÊÌòGïÿôÉew¦µÆŒ"ÍLøOìýÜíw]~:Üð•Oa]F`Í<äç!RQH?žLZÊ™œ´ˆéG%Ð}œ±þœðŸ9ù_|ü'°Ø'e¦ ³ÑJLEZJ™iU¦ÝLƒNЀL?31!•@úqƒîã ­gD¦ Í¥]Åc~Ž] Lâ©£Ìü t÷2ew¦µÆŒ"ÍLø7Œ›®ºþ=á¸þ‹uñfêÌlÄŸM9¤¢.~<™´”39i“J û8cý9!î\,öI™éf£U™Š´”2ÓªL»™:¡9Pfò„îã ­g,¦ Íä¤Eâ1?Ç®&ñÔ€QffÐ>º‰{‹²;S‹ZcF‘f¦}ˆvMÊLµ0uf6âϦRQH?žLZÊ™œ´ˆIH%Ð}œ±þœw.û´$31 ¹g,ÌF«2i)e¦U™v3! :uBr Ìä ÝÇrÏXL”iI â1?Ç®”3}§Œ2óƒöÑMÜËX”Ý™ZÔ3Š43íCܰklRfª‚I3s6劺@úñdÒRÎä¤ELB*îãŒõ焸s±Ø'e¦˜VbR e¦U™v3! :uBr°†™ éǺ'´ž±˜ 4(’šÅc~Ži)gO eæí£›¸—±(»3µ¨5fifÚ‡¸aÚØ¤ÌT“fæ$þlÊ!uôãɤ¥œÉI‹˜„TÝÇëÏ qçb±OÊL'°­Ä$¤ÊL«2íf*Xsª…ä@™ÉÒ'äž±˜4S‘–ŠÇüÓRÎ$ž0ÊÌÚG7q/cQvgjQkÌ(ÒÀ„ñÄ´±I™i|¦ËÌLüÙ”C*êéÇ“IK9““1 ©º3ÖŸâÎÅbŸ”™N`9Z‰IH%”™VeòÍT°æT È2“'¤OÈ=c11h &!•ˆÇüÓRÎ$ž0ÊÌÚG7q/cQvgjQk,)ÒÀ„qôq‚2ÓøL—™™ø³)‡TÔÒ'“–Ó’˜„TÝÇëÏ qçb±OìJÀ$4äž±°•3ý¨2ÓªL¾™ Öœj¡9Pfò„ôã ¹g& Äô£Bñ˜ŸcZÊ™ÄSF™ùAûè&îe,Ê.L*ê‚%E˜ö!n˜6NPf™‰2ó6劺@úñdêRbZR“J û8cý9!î\,ö‰] ˜„†€Ü3 –£•˜~TH™i%¦ÝLkNµÐ€(3yBúñ„â3 Óƒ†`âQ¹xÌÏ1-åLâ©£Ìü t÷2e&µÆŒ"ÍLû7¬'(3ÌD™ù‰?›rHE] ýx2u)1-©IH%Ð}œ±þœw.ûÄ®LBC@ñËÑJL?*¤Ì´Ón&„5§Zh@”™Ü û8Cñ…IB½3åh%ñ˜ŸcZÊ™ÄSF™ùAþè&îe,Ê.L-jEš™ö!nX7NPf“)2³6劺@úñdêRbZR“J û8cý9!î\,ö‰] ˜„†€â3 –£r&•SfZ‰i7šS-4 ÊLnÐ}ÎXNˆ;‹}bWV¡Þ!÷Œ…ñ¨œ‰Gå”™VbÚÍ„°æT ÈÁÄ3R Ô7H?žP|FaªP¿L3j!ósLK9“xjÀ(3?ÈÝĽŒEÙ…©E­1£H3Ó>ÄGF™i4&ÇÌUüÙ”C*j ÝÇ™©K‰iI LB*îãŒõ焸s±Ø'v%`êrÏX ™r´e¦•˜v3!¬9ÕBr ÌäéÇŠÏ(Lê—iF-Äc~Ži)gO eæù£›¸—±(»0µ¨5fifò‡ø`àÈ(3ô˜‹?›r¨E­¡û83u)1-©IH%Ð}<1ýdâÎÅbŸØ•€U¨wÈ=£`<*gÊÑJ”™VbÚÍ„°æT ÈÁºe&¤OH?žP|ü™*Ô/ŒÚ‰ÇüÓRÎ$ž0ÊÌòG7q/cQvajQkÌ(ÒÀ´qÃÆ‘Qf‡i136åP‹ZC÷qfêRbZR“J ýxbúÉÄ‹Å>±+«PïP|FÁxTΔ£•(3­Ä´› aÍ©e&7H?ž}ü™0Ô#S‹Z‹ÇüÓRÎ$ž0ÊÌòG7—aO€EÙ…©E­±¤HÓ>Ä GæÈÃßüÐe¿tç½×a]†eZÌŒáT$@-j ÝÇ™©K‰iI LB*ôã‰é'séõ{þøš7b±OìJÀ*Ô;ŸQ0•3åh%ÊL+1ífBtê„äC™É ÒŸQ˜6Ô#S‹Z‹ÇüÓRÎ$ž0ÊÌò‡ø0µ¨5–i`Ú‡¸aãq™3o8 P‹ZC÷qfêRbZR“J ýxbúqó=e¦ ŒG…L6Z•2ÓJL»™:!ùPfòôã Åg¦ õŤ¢.â1?Ç´”3‰§Œ2óƒü!>L-j%E˜ö!n˜9d\&ÄÌNEÔ¢ÖÐ}œ™º”˜–ÔÀ$¤H?žXÜ(3mb?*d²Ñª”™VbÚÍ„0èÔ ȇ2“¤O(>þLê‘IE]Äc~Ži)gO eæùC|˜ZÔKŠ40íCÜ0sȈL…™=œŠ¨E­¡û83u)1-©IH%~<±þ¸QfÚÄ~TÈd£U)3­Ä´› aЩe&H?ž}ü™6ÔÓ‰:ŠÇüÓRÎ$ž0ÊÌò‡ø0µ¨5–i`Ú‡ø`æq™ 3{8 P‹ZC÷qfêRbZR“J ýxbýq³$31 ÅgìG…L6ZU÷Ìô€2Ó40èÔ ȇ2“¤Oˆ>þLê‹éDÅc~Ži)gO eæùC˜TÔ3Š43ùC|0sȸL…™=œŠ¨E­¡û83u)1-©IH%~<±þ¸QfB9*gšQ ÊL+1ífBtê„äC™ÉÒ'D&õÂD¢îâ1?Ç´”3‰§Œ2óƒ"L-jEš™ü!>˜9dD&Á¬œŠ¨E­¡ûx2i)gZR“J ýxbýq£Ì„xTÎ4£”™VbÚÍ„0èÔ ȇ2“¤Oˆ>ÎLꋉDÝÅc~Ži)gO efùC|˜ZÔ3Š43ùC|°tȈL‚Y8 P‹ZCúñdÒRδ¤&!•@úñÄúãF™ ñ¨œiF-(3­Ä´› aЩe&H?n}ü™<Ô Sˆzù9¦¥œI<5`—™äñajQkÌ(ÒÌäñÁÒ!#2 fàT$@-j éÇ“IK9Ó’˜„TéÇëe&Ä£r¦µ°Ž™éWñ¿üe?ü³?~þÂüP”6N>¸ç=aãxi¸bØø’?ÚÇ”sÂ÷¼7l6KÛ¯ÿõß¼ëÀÁ¸Áu—^£ðnºn¯…´ô¢pOÒ} ‹?÷Å´}¸åôy…m.ùÈ>SvvxÇ[Î ··o„û|pÿ±M’o·ÎüÝS±Ù*€|(3ù@ýqƒèãÏ¢^˜BÔ‹xÌÏ1-%¦ïÔ€Qf~?:{ÿ§O°(djQkÌ(ÒÌäñÁÒ±Óíw]~:Üð•Oa]úgúËšÈÏC"Ô¢Ö~<™´”3-©IH%~<±þdþà3'ÿ‹ÿ{3vfBñûQ ŒÚYÇÌtÝ¥û_ÿë¿~ióÂÍ¢ôÁ=ï oÄ•0q1wòÏþ|XùË~ügœuÉíûÕ_üÇqËp;)è$a³´ñþ}—ù†SãJ˜ðnÚìƒ{Þ›>h¾„‘®ÞÀEé£Ç‹âç‚ûKS¸áíhë²ø ß¿×Ä û/º,~Ðpûá¾ÅRÞ × oÛãmÆ/ùȾp7âJø/6^)g&&¤¨?nPÜ úø3…¨;“‡úù9Ö¥Ä$ž0ÊÌòGgq/cQÈÔ¢Ö˜Q¤i↱c§«®O8n„ÿb]úgúËšˆ?›r¨E­!ýx2i)gZR“J ýxbýÉÄ‹ÅÞ(3¡2Á¨õ}Ò\L*/|ÁÅóÁ=ïÙ¿ïÒXp6B‰ÙòäÇ=mçž3ßpjX sáûöæë)Hå‹A¼ä¤Œ°\òGûâEö¦‚tÂEáÂメâ#¤âµÂz¼(ÜN¸èà羘>ÖÆ 2îÜypÿãmâ±H©4á1Mqãp›ùblOA¾¸" ÊL>PÜ ú83…¨&õ%ós¬K‰I<5`”™äÎâ^Æ¢©E­±¤HÓ>ÄK‡¡ÌäÇô—56åP‹ZCúñdÒRδ¤&!•@úñÄú“‰;‹½aWV¡Þ¡øŒ‚ ©„ Fí¬{f óÂüÐþ}—æë¡äÄ»g¾áŸÆm~îºTy¢°.Ú¨6fñÌ7œš/ñ±KÈI©UÙÌVâE¸ý(~”0¡'[¿îÒ«ãz^ñD ÿÝYv6l×±ë—|d«våEiÿE[÷-¼‘£°Ù®·_ ÈÇZe&¤7H?žÐ}œ™BÔiC=ŠÇüëRbO eæù£³¸—±(djQk,)ÒÀäñÁÒa(391ñe}ÄŸM9Ô¢Ö~<™´”3-©IH%~<±þdâÎÅboØ•€U¨w(>þØ ™`ÔŽ2Ó|pÏ{pQ.¦™ÍdÞ͉ͪ(… Òk!¥Êƒ‡>-Ò13å…‰cÚ²qÒ§ŒþØ ™`ÔŽž4¦ÄK£ýû.ݨ)Nú§›+Û5'H/ð”Tyìš¬Ž™i׋Òçµc}3â¤;ŒÌtæïž¸æÑIÁö žXIY*,.z¥§¶€|(39@úñ„îãÌD¢îLêQ<æçX—“xjÀ(3?ÈŽŒE!S‹ZcI‘&ˆÆC™É‰‰/ë#þlÊ¡µ†ôãɤ¥œiI LB*ôã‰õ'w.{î¬B½CôñÇ~TÂÔ¢Ö”™øjß¹øŒ¹0'ÿìχ·Ï|é¹øD³0áítÞqÆÖ#}„±ñâÙ©õáŠqKŸÌ´('Å«„yý¯ÿfØâÇ “_+½ÒS˜ðuXúìŠ!ùPfr€ôãÑÇ™)DÝ™0Ô¯xÌϱ.%&ñÔ€Qf~?:‹{‹B¦µÆ’" LþŒ†2“S^ÖJüÙ”C-j éÇ“IK9Ó’˜„TéÇëO&î\,ö†] X…z‡èã ©„©E­)3e¦°qƒwœqVÞtâkŠÇ+† oç*W[f o4¸î²«ók¥?-'l`ÿ Ýê€|(39@ýqƒîãÌD¢îLêW<æçX—“xjÀ(3?ÈŽŒE!S‹ZcI‘&ˆöC™Éƒ)/k%þlÊ¡µ†ôãɤ¥œiI LB*ôã‰õ'w.{î¬B½CôñÇ„TÂÔ¢Ö”™Š2ÓæÓâÂJn–9ó Û >œmIUe¦«d‹%îßøvù§¹ñ¢Tf³U ùPfr€úãÝÇ™‰D™*ÔŸG¢xÌϱ.%&ñÔ€Qf~?:‹{‹B¦µÆ’" Lþì†2“S^ÖJüÙ”C-j éÇ“IK9Ó’˜„´º3ÖŸLܹXì »° õÑÇR S‹ZSf*ÊLáÍ•,Ü”‰`.ÞÓO}fÂz¡ƒû¿˜?·®[iBò¡ÌäõÇ º3Ó‰:bêÅV`RfšäÎâ^Æ¢©E­±¤H“?Ä{‡¡Ì48“]ÖMüÙ”C-j éÇ“IK9Ó’1 ©º3ÖŸLܹXì »° õÑÇR S‹ZSfjÊLÜóžp²ù¢E›+Y¸)v׃©ãàéu•d¦ôBK]^b)Üf*MxzÝ*€|(39@ýqƒîãÌt¢ŽXˆºÛј‚xÌϱ.%&ñÔ€Qf~?:‹{‹B¦µÆ’" Lþì»QfœÉ.ë&þlÊ¡µ†ôãɤ¥œÉI‹˜„TÝÇëO&î\,ö†] X…z‡èã i)“ŠºPfjÊL×]º£šlo–…›U\òGûâ휹óEšRfÂzpáûöÆ‹2Ó;Þ²õ²å¿ú‹ÿ8__Õ¢¿d·  ÊLPÜ ûx2‘¨#¢Ž˜¢xÌϱ.%&ñÔ€Qf~?:‹{‹B¦µÆ’" Lì»QfœÉ.ë&þlÊ¡µ†ôãɤ¥œÉI‹˜„TÝÇëO&î\,ö†] X…z‡è㌠©„IE](35e¦ nDŠ>¸ç½iæÄ»gn¾Óæ 9mo¤‡&áFÂÕãúÆͲõ }Ü][R¿™)ˆ7þ»k! ŸcþòÞáÞnÜ~¶A”n¿í£™PÜ(39@ýqƒôãÉt¢ŽØ‰º`]Jâ1?Ǻ”˜ÄSF™ùAþè,îe, ™ZÔKŠ40D°wìF™iX¦¹¬¡ø³)‡ZÔÒ'“–r&'-bR tg¬?™¸s±Øv%`êº3&¤&u±î™)Ìþ}—â¢\z R˜ü1G×]zu|®2SX±õ'®¿ð?tðs_Ì×û±ï„I*|Äp éï¸íÚ’âE­gñE;>ÖfÇ9ùg~ã#íöä¸TˆÂó¢¶Œ×Êã—Î>ô)n¹q‡w®Cýq£ÌäõÇ Ò'Ó‰:b*ji)ù9Ö¥Ä$ž0ÊÌòGgq/cQÈÔ¢v˜Q¤™) â€Éc7ÊLÃ2Íe ÅŸM9Ô¢Ö~<™´”39i“J û8cýÉÄ‹ÅÞ°+«PïÐ}œ1!•0©¨‹5ÍLï8cëibaNþÙŸ¿îÒýØ ÷Á=ï‰í&Lx#Šïn¾fÓvâ‰9)ÌË_öãáCìßwÙ%´/Ö¨0¥&Û8JO4 “nJ¸©»ŒÛüÜÆw‹ëapòÏ+l¶]šnÞñbäáîÙå7›îI|;oLAÌLa—.\´ÿ¢ËÂcc Oís2ÓÐ~Ü û83¨ ¦¢ÖØ• ós¬K‰I<5`”™äÎâ^Æ¢ì`jQkÌ(ÒÀäñÁä±e¦a™æ²†âϦjQkH?žLZÊ™œ´ˆIH%Ð}œ±þdâÎÅboØ•€U¨wè>ΘJ˜TÔÅ:f¦îyÏË_ö㹓7ž³ÆÍr?wݯnþåþ$¼kŸwÝ¥WŸù†Sà æ[.Ú8 WI[n6¯«ãz\‰÷0=Ö)ÜT\IÂJ¼èƒ{Þ»è¢ë.»m|ʬ<[]Jw&löú_ÿ̓û¿ˆÍ.|ÿÞ°.M[6l¼ Ô7ÊLCCýqƒîã̤¢.X‹ÚaT²â1?Ǻ”˜ÄSF™ùAéìò/ì °(;˜ZÔKŠ40ùC|0yìæÈÃßüÐe¿tç½×a]úašË©H€ZÔÒ'“–r&'-bR tg¬?™K¯ßóÇ×¼‹½aWV¡Þ¡û8cB*aRQëû¤¹Õmôš©bЩêe¦¡¡þ¸A÷ñd:QG Fí0*Yñ˜Ÿc]JLâ©£Ìü €ˆS‹ZcI‘&ˆ&qf‚Ëz©H€ZÔÒ'“–r&'-bR tg¬?>¾§Ì´"Ó‰:Rf*gÚÍ„0èÔ õÇÍd3ÒR¨?nPÜ ýx2¨ Ö¢vX”vù9Ö¥Ä$ž0ÊÌ ˆ80µ¨5–i`ò‡ø`õg&¸¬'œŠ¨E­!ýx2i)grÒ"&!•@÷qÆäcìÌ„èãi)Ó‰:Rf*gÚÍ„0èÔ õÇ2ÓÐPÜ ýx2©¨ £˜“‰ÇüëRbO eæD˜ZÔKŠ40ùC|°zˆ3\ÖNEÔ¢Ö~<™´”39i“J û8cò¡Ì´*Ó‰:Rf*gÚÍ„0èÔ õÇ2ÓÐPÜ ýx2©¨ 6£U±%5ˆÇüëRbO efùC|˜ZÔKŠ40ùC0yˆ?\ÖNEÔ¢Ö~<™´”39i“J û8cò±$3± õÑÇ+ÒR¦u¤ÌTδ› aЩêe¦¡¡þ¸AúñdRQÌF«bKjù9Ö¥Ä$žÑ1ÊÌò‡ø0µ¨5–i` ˆ8`òg¦¶¬-œŠ¨E­!ýx2i)grÒ"&!•@÷ñÄúãF™iU¦u¤ÌTδ› aЩêe¦¡¡þ¸AúñdRQklF«bHjù9Ö¥ÄTžÑ1ÊÌò‡ø0µ¨5–i` ˆ8`õg¦¶¬-œŠ¨E­!ýx2i)grÒ"&!•@úñÄúãf½3R Ó‰:Rf*gÚÍ„0èÔ õÇ2ÓÐPÜ ý¸1©¨ f£U1$5‹ÇüëRb*ÏèeæùC|˜ZÔKŠ40D°zˆ3S[ÖNEÔ¢Ö~<™´”39i“J ýxbýq£Ì´*Ó‰:Rf*gÚÍ„0èÔ õÇ2ÓÐPÜ þ¸1©¨ f£•°"-ù9Ö¥ÄTžÑ1ÊÌò‡ø0µ¨5–i` ˆ8`õg¦¶¬-œŠ¨E­!ýx2i)grÒ"&!•@úñÄúãF™i%&u§ÌTδ› aЩêe¦¡¡þø@úñdRQkÌF«bEZ*ós¬K‰©<£c”™ä>¼ÿÓ'X”L-j%E˜"X=¸ý®kÂO‡¾ò)¬K'&µ¬³ü<$B-j éÇ“IK9““1 ©Ò'ÖŸþà3'ÿ‹ÿû¡Ì´‰ºSf*gÚÍ„0èÔ õÇ2ÓЀ| ýx2µ¨5f£•0!•ˆÇüëRb*Ïèeæù£q/cQv0µ¨5–i` ˆ8`øXàªëߎá¿X—NLjYgñgSµ¨5¤O&-åLNZÄ$¤H?žXvŠ;‹ýPfZ‰‰DÝ)3•3ífBtê„úãF™ih@>~<™ZÔËÑJ˜JÄc~Žu)1•gtŒ2óƒüч¸—±(;˜ZÔKŠ40D0|, Ì4“ZÖYüÙ”C-j éÇ“IK‰iI LB*ôã‰õg§¸s±Øe¦•˜HÔ2S9Ón&„A§N¨?n”™…úãéÇ“©E­±•c?*ù9Ö¥ÄTžÑ1ÊÌòGâ^Æ¢ì`jQk,)ÒÀqÀð±€2Ó LjYgñgSµ¨5¤O¦.%¦%50 ©Ò'ÖŸâÎÅb?”™Vb"QwÊLåL»™:¡þ¸Qfê¤O¦µÆxTŽý¨P<æçX—SyFÇ(3?È}ˆ{‹²ƒ©E­±¤HS@ÄÃÇÊLƒ0©eÅŸM9Ô¢Ö~<™º”˜–ÔÀ$¤H?žXvŠ;‹ýPfZ‰‰DÝõ—™n¹ßt™™1ífBtê„úãF™iP¨?n~ܘTÔËQ9Æ£rñ˜Ÿc]ŠLâ©£Ìü ô!îe,ʦµÆ’" L  (3õÏt–56åP‹ZCúñdêRbZR“J ýxbýÙ)î\,öC™i%&u×53ýõÃ÷øýÓefÆ´› aЩê“Ã7ß¿‡ùš2ÓPÜ þ¸1µ¨5Æ£rŒGåâ1?ÇÀ™ÄSF™ùAþèCÜËX”L-j%E˜"CcøXL™©¦³¬¹ø³)‡ZÔÒ'S—Ó’˜„TéÇëÏNqçb±ÊL+1‘¨»®™éÙÇ·2Ó÷SfêŸé,k.þlÊ¡µ†ôãÉԥĴ¤&!•@úñÄú³SܹXì»° õÝÇ+ÒR¦õ¢‡ÌôØ×ÚÊL7ÝcÒÌœ˜|3¬9Õ2ÈÇ-[ßÀÏ>ΖÔ@™©êÔ7&µÃxTˆÙhUñ˜Ÿc`ŠLâ©£Ìü ô!îe,Ê6S‹ZcI‘¦€ˆ†Å”™zf"‹ÄŸM9Ô¢Ö~<™º”˜–ÔÀ$¤H?žXvŠ;‹ý`WV¡Þ!ýxbEZÊ¢^ô™žzhëÁ Gnž÷›3ùf*XsªeÐðÒŸ™{øàá¿{–-©2S1ÔH?žL0j‡ý¨³Ñªâ1?ÇÀ™ÄSF™ùAéCÜËX”m¦µÆ’" Ll‹)3õÌD‰?›r¨E­!ýx2u)1-©IH%~<±þìw.ûÁ®¬B½CúñÄŠ´”)D½è!3e¯~x³k ÎÌÆÎv3!¬9ÕbòpËýñ[÷‰»#$5Sf*†äéÇ©E­±b6ZU<æç˜"“xjÀ(3?( }ˆ{‹²ÍÔ¢ÖXR¤) â€íc1e¦ž™È"ñgSµ¨5¤O¦.%¦%50 ©Ò'ÖŸâÎÅb?Ø•€U¨wH?žX‘–2…¨=d¦à‘¯¥çÍÝmêÌl˜|3¬9Õ2 ÈÁ‰gÌýÍ£ IÍ&˜™PÜ ù@ýqcjQkìG%ØŒZˆÇüSdO eæ¤q/cQ¶™ZÔKŠ40D°},¦ÌÔ3Y$þlÊ¡µ†ôãÉԥĴ¤&!•@úñÄú³SܹXì»° õéÇ+ÒR¦õ¢ŸÌôÝûÜÊL·Ìøys&ßLkNµLXzÆ\ðý¿aHj6~fbEZ õÇ Ô7¦µÃ~TˆÍ¨…xÌÏ10E&ñÔ€Qf~P@úð‰ýo¼øšÓ°(ÛL-j%E˜"Ø>{àÁÛÞyÑ+o¿ë¬KK&²NEÔ¢Ö~<™º”˜–ÔÀ$¤H?žXvúĵ§ÿáå¿‚Å~°+«Pï~<±"-e Q/úÉLÏ}gûys‡ošëß›3ùf*XsªÅ 4¸cî‰;£"-¥ÌT ÈêŒÚa?*ÄfÔB<æç˜"“xjÀ(3?( âÀÔ¢ÖXR¤) â€íCܘÈ"8 P‹ZCúñdêRbZR“J ýxbýqî¬B½CúñÄŠ´”)D½è'3Oܹõ䣇oyКy0ùf*Xsªe2а¶ÊôÜ1V¤¥”™Š!ù@ýqc‚Q;ìG…ØŒZˆÇüSdO eæD˜ZÔKŠ40D°}ˆSX$À©H€ZÔÒ'S—Ó’˜„TéÇëv%`êº3V¤f&õ¥·ÌôožÌ_|–¯ÐdòÍT°æT hX=tóÛõÛ÷¬üP¦@™©Ô7&µÃ~T‚Á¨xÌÏ10E&ñÔ€Qf~P@Ä©E­±¤HS@Äó‡ø0…EœŠ¨E­!ýx2u)1-©IH%~<±þ¸aW†¡~¡û8cHjfòP_:f¦­Æ}ûî­ßÛgú€&“o¦‚5§Z,ACº7~¯ÿæI&¤ÊLÅ€| þ¸1Á¨&¤ FíÄc~Ž)2‰§Œ2óƒ"L-j%E˜"˜?ć),àT$@-j éÇ“©K‰iI LB*ôã‰õÇ »0 õ ÝÇCR3“‡úÒgfúÛã‡>¸õ«ûÆß‰g¦™:“o¦‚5§Z(Aù;ý¹ïÞßæ¡L2S1 ¨?nL0j‡ ©ƒQ;ñ˜Ÿc`ŠLâ©£Ìü €ˆS‹ZcI‘¦€ÈÐØ>Ä),àT$@-j éÇ“©K‰iI LB*ôã‰õÇ »0 õ ÝÇCR3“‡úÒgf ž| ýɹï}ÃR3i&ßLkNµƒ²Ý˜>¸ò˜K”™Š!ù@ýqc‚Q;LH%ŒÚ‰ÇüSdO eæD˜ZÔKŠ40D†Æö!nLa‘§"jQkH?žL]JLKj`R ¤O¬?nØ•€a¨_è>Î’š™<Ô—ž3Óß=sïãߨú>˜×_3ùf*Xsê„4˜].xöñÊ)3CòúãÆ£ØJ°µù9¦È$ž0ÊÌ ˆ80µ¨5–i`"ˆ íCܘÂ"NEÔ¢Ö~<™º”˜–ÔÀ$¤H?žXܰ+ÃP¿Ð}œ1$53y¨/E™éÃúÿ4)bf þöø¡o}eë×ø‡l”ôš‰ÚÙn&„A§N¦ á–ûSczêðCÿî9e&@>P|˜`ÔR Ö¢vž}úžxÌÏ{ôQ6¦À$ž0ÊÌ ˆ80µ¨5–i`"ˆ íCܘÂ"O{§"Á½Ý‹`ÔÒ'S—Ó’˜„TéÇëv%`êº3†¤f&õ%e¦=¸•—NÌÜùÐ_ÅËÎþÄËM`ŠØ˜¢çŽå/ÒôÐ\ÓdòÍT0èÔÉ$¡ÞecÚüër*3 õÇ ŒÚaB*Á`ÔÎcO|)óßzÞœ¾÷¤øöCÞÁƘÄSF™ùAéÇ.ý¥‹²ÍÔ¢ÖXR¤‰ 24¶Fs2ûÁ® CýB÷qÆÔÌ䡾ĹÁ±ãG¶òÒ‰ùǾ{(^ö־Ȧˆ)ù›GîK¿Òo¸énSm&Ç䛩`Щ“©B}º{㯞øn|ìŽÃ÷llLÊLCCýqƒäãv˜J0µsè¡+ã1ÿìOþôž}?ßþÆ]_`c Lâ©£Ìü €ô!îe,Ê6S‹ZcI‘&‚ÈÐØ>]uý{Âq#üë²2SX$¸óÐuñgS89çÒß¾þÎ?G0jéÇ“©K‰iI LB*ôã‰õg§¸s±Øv%`êº3†¤f&õâá'Ž;7ØjKÙüÀ³Ï=•.~þoî0)`]Ê=}ô¾ì1MÁÔÿöœÉ7SÁ S'„¡Þ¾ùžôšßÁãß8üoŸII™ih¨?n€|˜`ÔR £vnºã£ñ€ÿáËO âÛ×ßú 6¦À$ž0ÊÌ Hâ^Æ¢l3µ¨5–i`"ˆ ù£‘2SoLa‘à†¯~*þl §"|îuñíÏ<Á¨¤O¦.%¦%50 ©Ò'ÖŸâÎÅb?Ø•€a¨_è>Î’šíÌC}¹ûèmqçžuÁnµ¥l~ üï­çýHÜâ±G¯5)`Z‚çŽå¯Ótxã%7O÷aM&ßLƒN˜‡úpwþbLÁwïÏǤÌäõÇ ŒÚaBZе¨µko:;ð/¾öÍA|ûê/þ+6¦À$ž0ÊÌ Hâ^Æ¢l3µ¨5–i`"ˆ ù£‘2SoLa‘àó7ž6…S‘˯{|û3_܃`ÔÒ'S—Ó’˜„TéÇëÏNqçb±ìJÀ0Ô/tg IÍL!êÅÁC×ÄûÞ?ù¹˜–òÙÈLgò§ã·ß}iL»’õ·Ç=öõíÇ’lz`#0âÔÏ䛩`Щ QGw¹yçÓ6o9üô·˜"ö£BÊLePÜ ù0Á¨V¤¥X‹Z»ø/~'ð¯üÒ;ƒøöEŸûÿ±1&ñÔ€Qf~P@ú÷2e›©E­±¤HAdhÌ”™zc ‹Ÿ¸úñgS8¹öÖ?Œoï½âµFí ýx2u)1-©IH%~<±þìw.ûÁ® CýB÷qÆÔÌ¢^|þÖ½qç~äŠ_‹i)ŸÌ”þ틯yiL£Ò®þî™{¿{ÿö+ãl¹ùþ©½`“É7SÁ S't¢Öî>ró¡üYrÁ£·~îêRÂ~TH™© ê &µÃŠ´kQkg]ðâÿ·þ*ý ˆßûØKÙ˜“xjÀ(3?( }ˆ{‹²ÍÔ¢ÖXR¤‰ 24æFÊL½1…E‚ß;ÿ¥ñgS89tôÆøöi{OúÖ_?‰fÔÒ'S—Ó’˜„TéÇëÏNqçb±ìJÀ0Ô/tg IÍL!êîøsÏ}àO)îÜ«oz_LKùld¦Ûï¿:nqÖùÿ•iL‹Rƒóä¡'îÂÚ¢ŽÜ|ÏfAÖ©ÍÎv3! :uB-ZÍæ 0ݺ|ë+‹Ä”°Rf*ƒúãȇ Fí°"-ÅZÔNzýïÓ÷žôü÷Ÿ Ò›ÛåUÀMâ©£Ìü €ô!îb,Ê6S‹ZcI‘&‚ÈИ?)3õÆI¯ÿÏFÂo£é%\¾tÏçÑŒZ@úñdêRbZR“J ýxbýÙ)îY,öƒ] †ú…îã‰i)‰º{üøãé—ˆ£OܱY–vÌFfÊÓ8ôÀ%]2SôÜwìsè¶=|˃oüÕù6Rû¤"·<°ùÝb%wÂÑÛ?uø!óJLûQ!e¦2¨?>Pܘ`ÔR £v®¼áއú >÷ºø3 ½îæg¿ð/•™ª€Ò‡¸‹±(ÛL-j%E˜"Ccþh¤ÌÔYäÏ®û_â¦t6’ž[sáç߈fÔÒ'S—Ó’˜„TéÇëÏNqÏb±ìJÀ0Ô/¤O¬HK™HÔݯo½Šÿž}?ÿc62S˜ô›Æ•ןÖ=3Eß{âбCæ¯.Ò—Ç¿qø¯~p矓kÀ~T(f&çQf*ƒúãÆ4£˜J0µ³çãÿu<ÔßtçgâÁ?¼Wþåÿ„2SP@úw1e›©E­±¤HAdhÌ”™zc"‹„SŽøƒ)¤çÖ¼íü—¢µ€ôãÉԥĴ¤&!•@úñÄú³SܳXì»0 õ éÇ+ÒR&utü¹çοzëÅ^/¿þíñ_1f+3¥ß4Î:ÿ¿zþoîè%3%Ï}çГ<øÈ×>¾I¤Ð·ï9ü7>øý¿AEZŠý¨Ð~ç×·Ú×üGÿÑøñó߯ÌTõÇiF-0!•`0jáÁ‡·þDðìsOŃx#-ÞuÏ ÊLãCéÃÖN7ë²ÅÔ¢ÖXR¤‰ 24æFÊL½1‘eÍÝûÀ—ãO¥L'ÎFòçÖ\çŸ#­ éÇ“©K‰iI LB*ôãiGú1ânÅb?Ø•€a¨_H?žX‘–Ú‰º;úäÃÛO†;zcüWŒÙÊLáyÚôÀ­ïì73åþÍ“‡žûΡg¿ï©‡¨ÒƒSuxUMÂß<úàsÇ6<3®û‘‹©¨ V¤¥€| ù@ýqcšQ LHK1µóÞOÿL<ȧǨÇIf}÷§^­Ì4>>Äý‹EÙfjQk,)ÒÀDóG#e¦Þ˜Î²æÞsñÿ#þTÂÙȾk^×ϾøÕÈF«BúñdêRbZR“J ýxbýÙ)îV,öƒ] †ú…ô㉩™‰DÝ}æÀÛân=ë‚Ýúlf+3…IKòô½/8þÝ/”™ŠÉ}c¸¿Ï­ê1 þø@ýqcšQ ¬HK!ù@òúãÆ4£X‘–b0jáö{/ŽGø/ÔÞMÝrûŸ)3 ¤qçbQ¶™ZÔKŠ40D†ÆüÑH™©7¦³¬³ƒß¼"þH p6rìø‘ô ‡«n>åh%H?žL]JLKj`R ¤O¬?;Å}ŠÅ~°+ÃP¿~<1$53‘¨£»Þ÷ipÛ=¶õØÌvfzþûÏuÁÆ+\þ…¢ÌäÈ4£X‘–BòäõÇiF-°"-…äÈêÓŒZ`EZŠÍhUÏ?ñ‡÷‹¯}óÖA?›ôÒ›ïØ÷SO}û»ÊLcBéCܹX”m¦µÆ’" L‘¡14RfêI-këé§Ž¿ó¢WÆI»ž\~ýÛã¥o;ÿ¥ßúë'Ê!ýx2u)1-©IH%~<±þì÷)ûÁ® CýBúñÄÔÌt¢Ž>råÿ'îÓ÷þÉÏmýÓÝm¶3S˜_=/^çô½/8öÄ•™¼˜fÔ+ÒR@>€| þ¸1ͨV¤¥€| ù@ýqcšQ ¬HK1­êÚ›Î>ql?éø3oñ³ ‹éÿB¼ú‹ÿJ™iL( }ˆ{‹²ÍÔ¢ÖXRdS@ÄóG#e¦~˜Ô²Î>ã9ñçQÉÙÈŸ}é_!•CúñdêRbZR“J ýxbýÙ)îP,öƒ] †ú…ôã‰!©™éD]ÜqdûµÕn¿ÿê­º»ÍŽÌæ½òsñjgâåÏ?¨ÌäÂ4£X‘–BòäõÇiF-°"-…äÈêÓŒZ`EZŠÙh%>|Íé{_ì‹þD˜ô!ž~îI[¯nO eæ¤qÏbQ¶™ZÔcŠ,b ˆ8`i¤ÌÔ“ZÖÖ½|9%¤†³‘ô ‡àK÷|ý¨Ò'S—Ó’˜„TéÇëÏNqob±ìJÀ0Ô/¤O IÍL*jí¡oß÷{ç¿4îP¼¶šf¦;ú«xÍ+_ñß+3¹0ͨV¤¥€| ù@ýqcšQ ¬HK!ù@òúãÆ4£X‘–b9*wìØÁ³.øñ~Ö?šþ¤‹ãÏ<žž7ý{{éÑÃ÷ ïT‚Qf~P@úð‰ýo¼øšÓ°(ÛL-j1E1D°€4zàÁÛÞyÑ+o¿ë¬ËjLmYO>ºýÛióÙÈóßnϾŸŒ[žùÑßûؽHH%~<™º”˜–ÔÀ$¤H?žXvúĵ§ÿáå¿‚Å~°+ÃP¿~<1$53µ¨o?sü]ŸÞzýþÓ÷ž„×V³ÃÌæê›Þ¯\yýi&ù@ýqƒäÃ4£X‘–BòäõÇiF-°"-…äÈêÓŒZ`EZŠñ¨Ðóß{(ýu¹ðóàÁGnåLØ ý?ïþÔ«ŸúÎw‘xjÀ(3?( âÀÔ¢ÖSdS@Ä ˆ80Áe =ýÔñô×åJÎFûî¡t6òû½òð“¡"-…ôãÉԥĴ¤&!•@úñÄúã†] †ú…ôã‰!©™ FíœõïÄ•AÃ+§Ù%3…Iß:¸éö™äõÇ ÓŒZ`EZ ÈÔ7¦µÀŠ´ ¨?nL3ji)ö£Ïï¡}Wo½D_Pòó LØ,]åÂ+»ÂÒÄ(3?( âÀÔ¢ÖSdS@Ä ˆ80ÍeÝ<ýÔñ?þÜj¿†¹ýþ«ÓU>tù/¯ôràè>ÎL]JLKj`R ¤O¬?nØ•€a¨_H?ž’š™`ÔŸݸñ4ê¨áI¯ùìž™žÿþséEš6në o2hh¨?n€|˜fÔ+ÒR@>€| þ¸1ͨV¤¥€| ù@ýña‚Q;¬HK1!-uü©¯ŸsÉk¶áe?â¤i Þÿé“{ä!„žq1ÊÌ ˆ80µ¨5ÆYÄqÀ"LvY+ß~âá÷ÿÉÉé¤b¥³‘koýÃtų/~uù³çÐ}œ™º”˜–ÔÀ$¤H?žXܰ+ÃP¿~<1$53Íh%ß~æxþ8¦\ñk[ÿD—Íî™)̱ãGÞzÞ¤[¼àŠÿþÙã·™4Ô7@>L3ji) @>PܘfÔ+ÒR@>€| ù0Á¨V¤¥X‘š}äÀžÿ×éè]þó M¸Jºú¿ü㟸ï¾[ÑzFÄ(33ÈâÃÔ¢ÖSdS@Ä ˆ80åe}<ðÐmá"N´8ÉŸ^ó¶ó_ú•oDQÚº3S—Ó’˜„TéÇëv%`êÒ'†¤f¦•{øÉ‡Óë1ïý“Ÿkxa5ÌÂÌæØñ#ùcšÎþÄËÝozÐ@PÜ ù0ͨV¤¥€| ù@ýqcšQ ¬HK!ù@òäãvX‘–bHjpÓMW.¸äÀ™Ïÿ¹­czñ„«„+¦9ýÜ“®¿õÈ=ca—™äñajQkŒ)²ˆ) â€D˜ø²&nøê§Òë+íÎFÂä°>mïIŸ?x>¢’…îãÌԥĴ¤&!•@úñÄúãã{Í™‰U¨wH?ž’š™xTèk^—^¹?øðå§”7¦0M™)L8"ì»æõéÖƒ‹¯yݱ'®7U¨w¨?n€|˜fÔ+ÒR@>€| þ¸1ͨV¤¥€| ù@òa‚Q;¬HK±%íêÁ‡¯ùðgÿ»t¬§w7|}ßÖ¡¼Õ„«ççˆïþÔ«¿q×}ü±ËÌ ò‡ø0µ¨5ÆYÄqÀ"L™½{øò‡.û¥tòÐýlä¶{þ,?ùW—ýRóÚÐ}œ™º”˜–ÔÀ$¤H?ž€|(32ýh©»Þö‘+·_à5Xé¯q–d¦8ùßž Nßû‚Ë¿ð¦ŸC‡úãȇiF-°"-…äÈêÓŒZ`EZ È &µÃŠ´‹;vð‚+5?J¿õ¼9tôÆ­#x‡ 7’?{:8÷OyÜçбËÌ ò‡ø0µ¨5ÆYÄqÀ"L…™±G½ïc¾ãWÓ¾ÎF|ôàYüh~Ë{¯xí¢WkB÷qfêRbZR“J ýxbò¡ÌTÈT¤?ùðǯycþoíô½'Ýtçg¶þ)®2E™)ÌýUþºà­}Ñ%ùúÛï¾Ð¢^ þ¸AòašQ ¬HK!ù@òúãÆ4£X‘–Bòäȇ Fí°"-Å®=ûô=7ÝñÑüÏÉEû®yýñgß:vwžpSxLkpîŸþòõ·~b”Wg—™äñajQkŒ)²ˆ) â€D˜3?O{ü†¯~*ÿsr‘ÃÙÈÞ+^û¿~í÷ç°2S€ôã‰ȇ2S!Ó’¬o?sü_ãÒ_óÆü‘ƒÁ‡/?åèwlý#\qJ3SœÛîù³=û~2ÿØÁé{_°oÿÿû¶o|äЗÿî—M0jõÇ ÓŒZ`EZ ÈÔ7¦µÀŠ´ @>L0j‡i©í´ôàÃ×zèÊß—??.éòàyÂÍæ¯ ž|ðÒ_ü‹?ü»¾ðÐCw  „]ff?ć©E­1¦È"¦€ˆq`¢Ì<ÜûÀ—ïij\{ÈL˜ç¿ÿÜ¡£7ŠˆHF?+™ðS w[DDDfCg#"S7DT²ÓfÒh4F£Ñh4F£Ñ¬á(3i4F£Ñh4F£Ñhze&F£Ñh4F£Ñh4M£Ì¤Ñh4F£Ñh4F£éa”™4F£Ñh4F£Ñh4=Œ2“F£Ñh4F£Ñh4¦‡QfÒh4F£Ñh4F£Ñô0ÊLF£Ñh4F£Ñh4šF™I£Ñh4F£Ñh4FÓÃ(3i4F£Ñh4F£Ñhze&F£Ñh4F£Ñh4M£Ì¤Ñh4F£Ñh4F£éa”™4F£Ñh4F£Ñh4=Œ2“F£Ñh4F£Ñh4¦‡QfÒh4F£Ñh4F£Ñô0ÊLF£Ñh4F£Ñh4šF™I£Ñh4F£Ñh4FÓÃ(3i4F£Ñh4F£Ñhze&F£Ñh4F£Ñh4M£Ì¤Ñh4F£Ñh4F£éa”™4F£Ñh4F£Ñh4=Œ2“F£Ñh4F£Ñh4¦‡QfÒh4F£Ñh4F£Ñô0ÊLF£Ñh4F£Ñh4šF™I£Ñh4F£Ñh4FÓÃ(3i4F£Ñ´œ£OÜqèè7|}ßÕ7½ï’g~øòSDDDD&aß5¯'0ÁýU8Ÿyö¹§¶Îoº2“F£Ñh4ÍjNÅ.¿þí{öýä›ÿðÿ """2¾ü”_=ïØñ#[g<­F™I£Ñh4¦h½ñâkß|Ö?Šs2‘99û“?}í­ØîñMÊLF£Ñh4Kæ±ïºàs¯ÃXôáK&¸äš_¹úºß9ð¥7ºûý""""•»ýë¿N]‚ þìäp&sö¾—á 'xëy?rà«ç=ÿýç¶Î‡ÊF™I£Ñh4fáæñ‹¯}3κN?÷ïï»òÝtðŸ?ûø%ÿîÉ«DDDD¦î±ÃçøÒ›ßû©—ã´gϾŸ¼íž?Û:1*e&F£Ñh4šÝ熯ï;}ïIù™Ö‡/ý™Û¿þû8-™ã~êÀ—Þ|ÖÇ~$?zïŸü\ák6)3i4F£Ñì2—_ÿögWŸzùß|ÎÃDDDDféÙÇ/¹úºß9ýÜ¿ŸÎ…ÞzÞ:zãÖyÒâQfÒh4F£Ù1Ï>÷Ô‡/?%Tõ±¹éà?ǹ—ˆˆˆÈìôS—\ó+é¤(8ðÕóâùÒ¢QfÒh4F£ÙžÇ¾{hϾŸLçRç|ú§Â N¹DDDDÖÇí_ÿýüaM—8së´i·QfÒh4F£ÙšãÏ<ž7¦}Wþ£ç]Ž3-‘usôþ½{þø%ééòëß¾uòdF™I£Ñh4fcžÿþsùså|éÍ8ÁY[Ï>~ɇ/ý™t¦tÃ×÷mBíe&F£Ñh4š¹äÀ™éÌIIDDDž?vù9Ÿþ©x²túÞ“v}Epe&F£Ñh4šwà«ç¥ÆtÉ5¿‚“* Ž?ú©ôì¹³.øÑcÇlKe&F£Ñh4ë>GŸ¸ãô½'Ŧ_ú3z=&‘E<ô¡ôŠàç\ú·N§NŒ2“F£Ñh4šuŸ >÷ºxª´ç_¢¿+'"""Ò춯¾=ž;·ßõÖÕæ(3i4F£Yë9úÄÛçI_ÿ}œE‰ˆLÚo:åU¯xIò[¯} 6iç‚?;9ž>½÷O~në¤js”™4F£Ñ¬õ„s£x’Ζpþ$"58÷}o8ûí¯µ°™ì*|õNù…ŸúóªW¼ˆˆ´süÑO¥§Îøêy[çUÊLF£ÑhÖyn¿ÿêxz½/ΟD¤W|ú¬W½â%[™ds^üÃ?¨Ì´’Tš”™D¤G—_ûñ$ê¬ ~ôùï?O®”™4F£Ñ¬ï|øòSâéѾ+ÿΜD¤*/þጡ$¼qðÀp©4;ûí¯_=e&éÑñG?õÖ¾0žJÝtçgâÉ•2“F£Ñh4š5ãÏ<OŒ‚ÇŸ3'©Êo½ö51”¼ø‡ÉRÊL"2+¿°õwT>růÅó+e&F£Ñh4k:7Ýù™xbtö¾—áœIDj“B‰2S ÊL"2}(žM¾÷¤ø¼9e&F£Ñh4k:|nëÿ»ò ¯Ã9“ˆÔF™© e&ÎYû‘xBuûýW‡ó+e&F£Ñh4ë8Ïÿ¹Ó÷žÏŠ<ô!œ0‰Hm”™ºPf‘á\rͯĪ‹¯}s8ÅRfÒh4F³Ž“þÆÜYûœ-‰H…úÊL÷Üúу>„7pÑ"Ü}Q¼JÞÆ¥ÍVúpqc,¶ø¸ö+3‰Èpîüæ»â9Õ[Ïû‘pŠ¥Ì¤Ñh4fçÀWÏ‹§Dús"“Ð=3…[×7'¼±YîÜ÷½áU¯xI¼Vú¯uÊ/ü®~¸ƒ>n'nVÂúÓG/û­×¾&-†7ÂGYÚª>yÞiélj·ã»ÊL"Ò»ç]Ï©‚gŸ{J™I£Ñh4Í:Ε_zg<Ò 3‰LB—ÌSNŒ,Ÿ<ï´ø0Ÿô§ë•—”f–1ý¸ê]i1Lx;BfZõÃ=r÷EéÒ0qû˜‡¢­ 6?÷§^†«'á–ãfáÖÂ]·sÆ›N‰‹qìGéî­}a<­z컇”™4F£Ñ¬ã\|í›ãùÐ/½§J"R¡Ö™é‘»/Š¥Æ–”`~뵯YtQx¥š³ë#¡Ú}¸ ^+ü÷“çþ¶‰Ïw òeïO”îU¸:. +ñ¢0ÊL"2„³÷½,žV:z£2“F£Ñh4šuœ_~J<ºí«oÇ©’ˆT¨uf:å~*^ñÀUïÂE) …ÿ¦¦Ó°¥j³ë=iñá¢xQ›ŠÒÍîÚ‰Òg×€¤¥Ì$"Cøð¥?O«nºó3ÊLF£ÑhÖqÎþäOÇó¡Cw¿§J"R¡v™éÀUïj¾Vê/ùC“šCRªEaî|Åîv.J·¹k*:÷}oˆ—îzË麶mEé«§Ì$"CØwå?ЧU×Þú‡ÊLF£ÑhÖqNß{R<:öð>œ*‰H…Úe¦ôt³EóIäýei”IY™©Ý‡‹šSQø@ñRûé7G±H™IDuùµ¿O«®¾é}ÊLF£ÑhÖqâÉ2“ÈT´ËL¯j|¥`×›m™Ú}¸hÑmF ™)½äSCBZú‰ˆtqõu¿£Ì¤Ñh4f­G™IdZMƒÔn‹¤ ÒµšŸûvÏ­M—â%–ò[[$m_1¿îª™)µ-e&‹2“F£Ñh4šue&‘i阙ÎxÓ)ášízEûjÜaËx‘M6­?\~]e&™e&F£Ñh4ë>ÊL"Ó’B‰í, šÛMƒ¼ËäY ·“nÓ¾ˆRë4_W™IDj¦Ì¤Ñh4fÝG™IdZ 3Óo:åU¯xÉ=·~4¾›Ú}PÒRéåºÃ„·Ãÿ7þ{ŧÏÂöA——®«Ì$"“£Ì¤Ñh4fÝG™IdZ 3SŒ5©Ô¤v®ž¶)ôÉóN WÕ+^„7¢ðö¹ï{¶Lº|¸tÝU3Ó)¿ðS‹.J”™DdPÊLF£ÑhÖ}”™D¦¥$3=r÷E1Ö¤R“̪yå“ç®õ[¯} Ö›µþpAëÌ”eð’äIÉ_£iM™I£Ñh4ͺ2“È´”d¦sß÷†¸MzÒ\¬EaµҢ…ç¸Å\ÕPmi÷á¢p•xÝU3SúËwav}ÕÓG/K7®Ì$"CPfÒh4F³î£Ì$2-ù+%á¢äU›¯R„ òÂòôÑËò‹‚°o9O?)WíúLÍZ|¸(]qÕÌÄO<^j¯.Íï.éN™I£Ñh4ͺ2“È´ä%Ü}Ñ¢uŧϊëaÂEg¿ýµ| :ãM§Äþ‚'Ç¥Ì. 7\®a›]ëÔâÃù#’v}í§ô8©0öqRø aãøÃM…û¸ê]éR\WD¤;e&F£Ñh4ë>ÊL"SqÏ­M )΋O¼ wnë²ÝJÊ'7_Ì{ëâÖÏ6O4‹OšÛÚbñ„mÎxÓ)¸n°ê‡;pÕ»RD ¶Ai †ÃJ¾AÜfëâ“ÖÁ† sÊ/ü”½ºˆHÊLF£ÑhÖ}”™D¦â·^ûšøœB§üÂOá‚Gî¾èŒ7.}qV¦ÂÊ¢W_ºçÖÆ²·Œf×±Ù(XéÃ…;œî|’²ÞÀE‘}LÓ«Þn*}¸ðvX‰…;ãuwý‰ˆ´¦Ì¤Ñh4fÝG™IDœ²ù7ãâC¹û¢ø´$xQx#¿¢ˆÈRfÒh4F³î£Ì$"‹¼jó)lá¿XÏéÕŽDDe&F£Ñh4ë>ÊL"²«ô"G»>.ФÌ$"¢Ì¤Ñh4fÝG™IDvuöÛ_«Ì$"²e&F£Ñh4ë>ÊL"²«”™â 3-Rþ '‘ÙSfÒh4F³î£Ì$"»zäî‹âÔÂ,úÃÿ®zWܦùõ›DDÖ„2“F£Ñh4šue&Yäà¤ÒÞ8ãM§œýö×Fáíøáa½ùáN""ëC™I£Ñh4ͺ2“ˆ4ûäy§ò ?õªW¼äÅ?üƒ¹°rÆ›Nyäî‹°½ˆÈÚRfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""""½PfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""""½PfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""""½PfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""""½PfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""""½PfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""""½PfÒh4F³î£Ì$"""Ò e&F£Ñh4ë>ÊL""2Ч^vðÀ¢{ný(.Nø~Kß{áû—v¡Ì¤Ñh4fÝG™IDF”ÿ²× ßߥç¾ï /þáüÍyÕ+^‚KËá»e\Kúeÿ-cƒªüÖk_“¾÷Î~ûkqiÊLF£ÑhÖ}”™DdDyho@\Óïïõ8å~*~¦XŸ¨ŸÎÓG/‹;ºuf ·ð[¯}Mü> ï@.­ãг?ÍðÅǺ³üßr˜3Þt 6¨ÍŸ>+ÞUe&F£Ñh4š>G™IDÆuàªw-úe/\qkfzÕ+^>»ÙvŸN¼V—G3 :F¨Ù|‘­øo¤ã°éßrøšã¢:Å/2“F£Ñh4MŸ£Ì$"ã:xàñWÓ]Ù ‹½ÿè)|váWÙE4 ¿¿ê/ýq(}Yôé4b!êXIâ,jIa}ÑE“¾táþ/zZ¸4|ú5”æË _ÕÞï­2“F£Ñh4šue&×Ò_Mï‚ÓÍLç¾ï áSëØP¦®ù‹ QÇ/Q¼‘E-éŒ72éÌkÈ¢ÌTe¦@™I£Ñh4ͺ2“ˆŒkr¿š®$>ckÍ3SóÁ!3MÚ#w_¤Ì4e&F£Ñh4šþG™IDÆUþ«éÓG/ Ûä\õ®xQ¾xîûÞ®…ÍÎxÓ)¯zÅK‚S~á§>yÞiØ ®·Œ‡Œk?ÜHúéãù½Â‡¾âÓgÅßcÃÓ6A¸z¼V¼W‹žîôÈÝ…mÒ Û¿úïU¼ôÑÓ§ÖÃJï*ÿ¼¢üÒxðyá*ÍŸNÃ!n®. ÿïæw>|ô¸¸T¼‘ð!°n…ÛÏïF×ñIÙ¯[ø¶‰OO‹Â6éSH°Ëðu âÇÛ‰{3\%~ÝvÝ>ܰqøÔ„ÍâÕ£pi¼Ïá ¾ëu£p·ãÁ¢oþxƒáÒ ®„[Ž× +a¦-›µËLù= oä_Õø}•K—Ú‹°ËÂ$Üùx³‹¾—âwf¸.Ö»PfÒh4F³î£Ì$"ãZô«iü-1_ Â6qã0á7Òô‹ejáWJüò6 ëá¦Âo³AØ ¾›o…KÃáCÇ_³7>̉>Vøe5®Ø»×ã–Qøñ.ʼn·Å«§Ï%¿V’îLØ,|‰Â‡o‡Ãùfá—çt?ã–áÖâãbx#ßÞ ·¿&qc|õâ§Œ _ŠôAÓ^ØõÓYúEâGÿ½çÖÚ;¿k°â„í±îúKøãÆqûÔPòO*Ý·(~UÃzøjäû.î²°eþýÞÍã`úèaËð©…-ÃQXŒÛ§ïêpÅü¢´e6ÀÞ×ÊŶɿùÃÃg‘oïy¸(Þlü£›^pãV¸Ù•¶Ò= _™øÕïæßäéW˜°Yúâén‡É÷r¸ñΧý6ï†íÓ6Q¼zù½-¡Ì¤Ñh4fÝG™IDƵèWÓðûgø%0_‰Ò¯ø¥1l®’¯ñ—ððß|q×ß-¯Øüëæá¢ü7ðxõüfý^[¶w`ÑztÊæUì¥áS ë¸3á÷ð°Æ~ôx¯Â½ 7•¾,ñ·ÉßÕ#'ž–…/T×Ãà«÷îù¢O'¬ìºÅKà Ò]M{9/ Òä‹ñ˸kDØuûØ#ð™¦/N¾o9¿z\ÁçwAø²ä‹q?†ë†KÃE©£Ån·Oÿ@òo†\¼{‹¾'±Oã>Â'Ä/x¼WA¼Wá#Æ·Ûï*ÝÕ]¿æV¼‡ù÷gúˆá«”Ýç ÞBþM’Ú\þåJŸ]Z‰âÇ*¼·…”™4F£Ñ¬û(3‰È¸Ò¯¦áW¾ðKcý³¿Fñ·÷°YZ ¿g†ÓoìQú}ëñ÷yÜxü}¿pÆÇ×俨Ç;¶èWúü.5¯Gávv½tÑG‰Ÿ8îy?JXϵâí,úè¹]ïgøôã͆ÿæ_„ ~mó@,útv½ñ$^&/ AùÒ„7’x öˤœ‘>…˜“ò`ů9ÒOVòÅxkHTñ«&@Sú†÷0-F©§äß±i{ìÜ$ÜN¸ŸfÜá¦òÅ ~švûôQ°£ÿÿí½ß‹í×y晿Ø@0Ç‚›$ú›niÔÅ\ôM4M ƒ2 Ì't0 í1.ÑR,2%©ÛV#QVÛ43ÕÄIp£“vˆQ!Œ'݇rð…(ÚaèyÎ~V=ýÖúõý±wUíχ‡ÍÞk½k­wýØû|ß÷|÷.&h@kô(uR]óL-9¸¶ZÆÒîr,áf³€8ëìÄV—bI9ÍdŒ1Ƙ]Çi&˲nW M"Þ£ogÆcQ“¼‘$KR@L”Á|µ²ÓUµâRúSŽÕ*§ÐOYÛqFžgé Ž#óXÞ=ªz»“wô'«ÂÚ–»SÔw£UË3Ðj•‰À%žˆÎ£Ï3cJSæ:£‡r•”ÉÒ™ªKD•>èÀ—'Vû‡“}™d¡8÷lš·œ¤µŠ…%;uƒ£GɸµæQô°ÌëU³ÀUcîNÌ(i¿Êµå¬ñ i<ÆÛñršÉcŒ1»ŽÓL–eÝ®Z¡)Â,ÔŒR@ŽV0«fC¢ ¥<Ž’5ÕȶªV\Z b;åú)k™«:Óº…£Œ÷ª”zŽ ,”`eT(‰á=UÔw£UËÞ0PV^;ÉŒ¹Ñå²HÊda.U÷tÌpl²ª(mYŠ1$[ÒˆÕ´*ØÀ²ŒKÙC™ªh•SœBVË&-gè@¶2l2Þ«ªh¬Å<[|cNwúÄþÌ—7ŒT§õÝhÕ²·1›±“Ò Õ¹éâÑ;\O<âfµ}ÕZ‰£ôSUÜ/øjŸ0FU\¾=ÄÑãî«I,”4©˜7dŒ®’XZ£GõÇ’¥–¨T‘§ÄS›ì ©Å~2E{¼„ñ ·“ä4“1Æcv§™,k‹õ“¿Æ7ø[ßÙ[Û÷øøÐ´£Ä2CA![IŠR­>ÙCéI«œbTœÕ²IË™ê”Ùd¼WUe·táe|ûAl_í³:¨ïF«–½µÖ!;iÅQ@¼KRm?ÉÒŸ`&øjŸåþöí!Žw_Mb¡T›” 88zTܨIÝR\¥AßyÌrœÚøcÀ>½$§™Œ1ƳëðbršÉ²¶OŸþüÝoþé?×Û|=“MãCÓLLvdÁg«Fü©2êc¢ÓV\Êbv _N1*ÎjÙ¤åLÕ6ïUUÙ #HKÇ=’KxR½E¨:¨ïF«–½µÖ!;i,ñ;q8Hlïî¡èègCúÌÔϰÀ TÅ­ìÛC½Ú$JÕ…e“rGê‹å…«\dY–÷ĵ”¹®²[™ êÔ:*W{y9ÍdŒ1Ƙ]Gñ§ÓL–µ­Â»û­ïìé;nɦ~h !,«x¯ÍùGoœ¼}ŸÍË»QÆÿ¼[gLtÊ>ˬVk,¦0Z>0*ÎjåLüÑJk•M–£—«Ôòª%FÝp€)§˜vaÆ…ª¾AÕé@ýEh9ÉÞÆl ÄNZÆG/=[Va (d*­åóP Ÿ ~ m"ždUt U1‹Ç½¨ÚSt>Û}öSM¿V׊^•Sèx[JÆåQ„¸¡ê‡V-«Òâ`/¸/å[^û5Æ[hªcä4“1ÆcvEžN3YÖvkm“MýДqcV…ð…Šü[yÄØÕrêâÑ;zÎA¸fjå#¯–å ­Q›•S¬ÍZ)T.á…ÊÑ«r[Þ¶¤•Ä“¬(/ï"¡ªÓQykZNö[eb'!Ê*j"Ja0ë$©¼š¯‘úç'ž4H¾L…°Œ˜í/}(÷—âܳÚ΂TgD¯JûŽ·¥d\u•» ©ÑC<Ê`PlϱqÕ†#÷K¢qkaçÉi&cŒ1Æì:Š9f²¬]Ð&›ú¡)ÂŬ ö«Auyê62-‚nÑIŒÿpf…x޶1õ€—4‹‰ö†ò2ôeb()ÅÙ¡mV^ŽÊ³TÄÑËкÕOKZ1t˜}-N@0‰”3¤ÄØ—9Axi™Ù@ˆZe{ôÏB6²^™0Œ‡óKÊZÁ€±qF‰6P¶&è“Ë2ØKÌ¡ mV±ÃÒhp¸Ö"Èž¢óÐxçËNªÂbÒ>ö¬ýíûÓ½ÿx)W%””f1cEá0Ó ‚?eމRÏxÄs`®ª„3¯xV£ª.±sIË‚'±fjR*3n)kßMÏ«L‚0ëÛ` éŒúÄÊdG(ó±v9ÍdŒ1Ƙ]G¦ÓL–µ›Z‡dÓ a9o¬ÈÊK´„A éÙ–y‡¨‘£—bÃ~盢ً°&éß ULÐ;Û·—x2™`š¤ñ‡ÿ¶ÄEsÈñF?ÎzÆŠ-#§™Œ1Ƴë(¶tšÉ²vY;’l²¬[×Ã)¿vdmœœf2ÆcÌ®£¨Ò!¥eYN6YÖuËi¦í–ÓLƘëåäää0ptt”*6Ì"ÍgÁééiªX°•S6kK:g—\\\¤ 3Å“&-Ë¢œl²¬ë“ÓLÛ-§™nš³³³,@ˆQÏÏÏ“ÅN<œHàeª¸Jªž Âì½½½ôÂì6ûûûwîÜá?$àîÝ»©b“ÁñŽ“Â»8U,ØÊ)ß0­¦1¤. Æü¦Žº$ÓÛ“ÂKGmÁúø¶Y(’tiYV”“M–u:\üZ<èÿ޵µ¡ršéæ899Q0€”ð%Àóyô;Cñ”=,“!BÀ†æèݦ¢é LBs’ŠÌ&sqq¡Ã¿59žRNêðjš NyãyòõΛÉbhõfPz8õã—b}Ð }§6·ÊÑÑQrËi¦¹(†tiYV)'›,k…šô·Û¬M”ÓL7Äþþ>D/ú~Íùù9¢SE;ÕXt 1"B̃##æ’ÊQàFŒ¸–‰šâ@x’J§Ÿ—ïĬ8êÜÓÙç| Qæ¢L3þ”7îë­ ÏSÑu¢µøüÄÇæãϲŧ áKÀÑÑQ´GIêeÁ¼ß““VÔr €OÈ,;_Ýß›ç†7hûPôèÐѲ¬–œl²,Ë#§™ný?3¢T@HÀð`v¬2æÿ±û£(Q›T4„^1î³»ðvùN:èˆéµ-ûÞåHœfÊÀJ²öšùÊÑž§¢ëDk‹Ï·T´@«Z®›šD—ùøÕ”«µÊ^|„¦ÒÛã†7hûPÜè Ñ²¬¾œl²,ËêËi¦›€Wÿx,„0\©F2cP¼ :Fg”Nä6ÈÙÙ³Th‹ÎêÌèJ\\\À%’ŠVŠâCÇcãÑ]oó*¶’k>ûœ¯!˜ 'U=¨ý)_÷!_9É×›ú…i®mù1¸ªeÕññ1«âûš‡3>~µ¿ÕZï$Õ}R·g ü±6EŒk.~òÓ7¿òæïÈ·etøúoýýß}#ëŸúø£?úòŸ<‘Ù·ËV?(¿ù~V%ŒˆuÈ<¡¦Îk%ýÜÿãÏ·úYᩯUùƒ~þê¯_Ìz n¥Ÿê½ÿÛ¿/cY–•ä4Óµ£P‰³³3´"™A4èQ:‘[4D€',‰_iaÉ¢èÑñØxtÌæT±Ùç| ÑAÒùlå”o ®->OÒëK´ªÕO¢JïkÚÎÇQçƒQûÛÚÁÓÓS€ýÚÝR7 çü±6ÅŠk•fzôã—_8ú¬|[R­4ÁŸÿç2˾~ô·²(”g–}­ªŸUéû¿”yBMõgUý`_²¨ÕžŠñZ•?ˆ=²¨ÛêgUú?ÿýÝÌ˲¬•ÓL×N?( æ} (”ý£5ÊH'KÎ?øo˜ÝÕMâxlK&M–l¾ž( Ù¥¢ÀVNùÆàÚ–ŸWýOÞ^¤÷ußX´>µ¿ԇɭï²?Ö–D±¢¿übYÖ ¾ÿðKº7 OZ¹E˲¬Ý”ÓL×NŒsZßÚXÌ 0FccXaW×Düe_ÇcãrwÐÁ¸õh|…hM0»TØÊ)ßgggÕ·gÿ†?»–^\5žññ;æÌ£çA››Ažøcm¼‚œf²,«#'˜,˲å4Óµ¿UQ~d% ¨Hl~š‰1Š ‡²“½½½X‹áXŽuF Áþþ~5ª„jé!`W‘ò¦ôƒÞØ-YõïñÉ7³–o,ïÌ,!(WÉô’ÌÏÌÃ¥Š±XÅBÐZ7þ~ »c¾.¤ƒ{–d Ÿ±P¬jiâM„R›UŸG./jÇüiÅlÒNJ{)§L®û Ô¢­ú!ì9’–Œx´ØCö!7RõÂ@½ÍØß1hUÑg*jƒi f|übFl‹'©¨n Ú€ò-L²72Ðz–›«ƒ!p–R]-Í„³ ›Ç«¿ zJ3²]è¡ÿqG³Ù§t}àÅä4“eYU9ÁdY–5RN3Ý¸ÔæÕ?ÓN¥ŸfÂE?"”LŠÜú,ÙÕÅÅ\ÕŠ•`:ˆ[X Û €L¯h›…7~R]›lÑ3A[ŒÔ V5]Rõ-––WgŠÑUBXprbU¹Ñè6ëM´ÆÂXAmìa°¶(—¢îEãl:âää„ö ˜a€Vx¢d[áI¶×“¦ÜO@ÄÇ,€N…@a² µh˜Š\ë!Za<¢-ýÄé£\¤6 ´ø$;{Ìý¥º¹û;­ê Û$º¯Ré84ël#꿊6–}b£S]@–Þòܵ Ëà¨!7¨úq×™ÐÁžýq7õ”®¼‚œf²,+“L–eY“ä4ÓMEYl°<*R×µì#Æ-PËæˆRÑ\VÒâ«~'Œ…¢VL/±È˜;ˆ‘b¤Ô`âaÚ¨9b‰H¦ ÔUïiŽYÿD3 ÃK„^h¢ø0î…fŠZŒcxŠÖP’Lq Aæ*©¶qU5ú|<í«ë–5§:§«‘òŽŒ-šÓtÈæ¨Âˆ¬­zcÝ‹ðgÎÐV á* ÄåÅLa 3NUj ZS@CÀ>]¢*÷TÄ)§¢@ÜŽTt¹7é%ñW Èm­Ø˜#ØÈ8Jr ÛÊO¼¸¿¬è$5˜‹zÙÕ2¿Z«ê‚ø–ÄóTÚ&.EÕ^§hƒ"ÚˆÒ%mzF-@oX¼Ô;`ARƒ«h³£.Ÿ«'MƒÎ8¥ë/† §™,Ë’œ`²V®‡§_•²*ËÚ9ÍtCÄ n€kq\»§º¥Á}ê·ˆ`0 è75rë°’®4£V'ˆ d€çYܨÕn5G9 ²åŠ j¢ zKEõPÆŠòíqœw5-ª¸q¦ x Q˜^/ÀKÚW=ï¯[6ÖAqóE ÈË£Å,RÑâÁÙºÅ躜× ­Ê’_¨ME8e|åî“O¤?÷™¬Ö²¶FN3݈ t±Nðrd´ÓGñ*@Ÿ‘TºÕi¦2TŽ Riµ2ˆWCTïsQøTþ/}ô-k W1bv?Aࡤ úž£µ­uSój0 ¢ó©èí,lRÑÔ ¦M¥ùVžUx‹A«>÷§¬ZPMi¾å¤Ï㱸njÞ+n_4ª LES<Z7X¦¢qpRÕnã‚TSEIéV¦Î|û>÷Wlp³ÔùÔC>¾çIKÝŽh²«´dp 3>~å3Za\·¶úMuAZè£ SÑ%üØ“:{+Õ]‚Z”·RTlUÞè:§b%wó>Š× ^ AN3YÖÎÊ &ëftøâ=üËè4“µÅršé`´Ã+o‚ ñòÿÿqQ^%UP˜:*.å/..x•_†+Ô²y+ÌÏJºÒŒZ(¶iÍ‹³Õë×Í¢ IÇÃAß"ƒ3Íè{>Ø›wÆR bpMú 6Ÿ´n‘Κ .HÇ+ùS éIßçþ”}\ÖÄ—ï¹JgA²`Þ %¨5»>#?~‰|Î@€ÚjB§@[v’¥>éØÙâ'äãTs1r=gŠr¶ªnPçT î]§íà¶ö½Z+x19ÍdY;('˜¬›”ÓLÖÖËi¦[ãôêß Ê"]Ö—”ëѸ¬åŒ÷C»%#·ÈJºÒŒZ,Ûôkú‡%žW¡È:QUÍÉàL3úžöÆæ±ƒìUÚYL0Ma°ù¤u‹tÖdpA:^©ÛŽ?}ŸûSômpAZ›X® Píu|i®:Y08‘h Öº¡ÿñ+dƒ'˜µ¨GÝfë74)<^’ãÅO˜µn“dSQ…¬ÍúòUx^… ë\USOé‹!Èi&ËÚ)9Ádݼœf²¶^N3Ý2ñÿÕcð  ¤¼XÆe-""«Òë+‰ÜÈJºÒŒZ,Û F>ê–c¬.Ù—nP¶-ß"ƒ3Íè{>Ø›÷ÇÒ™ÿÚYL0Ma°ùÈuÃa€7 ì᪼åš .HÇ+õÜñ§ïs§s0èÛà‚ÈÃrâ¶JBáqRº¤3èO Ng$¨µnãi}ü ùÜšÔ<ªß›ã7×tëü¡M¼aŠ…­[¨úÔ9oš&ªð¼ÏÔ»¾Wk/† §™,kGä“u[ršÉÚz9Ítûè2=^ýãR~qI_¡ü%Å`Þ¥ü #·•tÕ‰ˆÖób›~-ì¿Ã¤¶ƒ3Íè{>Ø›÷ÇÒ™ÿÚYL0Ma°yÝ...ËX9\®Éà‚ 9 Ð[*º¤µ´êØt:ƒ¾õ;‰ó¶›ø“ó@¹Q(ãN·Ö.Ëi¦ÛGá˜w!®øÌëadävrrË,jÍXI؉ˆÈ’±Í`ä£þ;¿ËÓbRÌ68ÓŒ¾çƒ½±y, ±>_šÃ¼äyY+‡Ë5\ŽWê¶Qô÷ºÓ9ô­ß9èL(3l%lNOOuLõæ>ýáú“ƒÓ‰j­Û$ú¿ò¹5©Ùh1ukJâŒâMg,á=PO$ڃ꡵q¢i^ÇÇ]ß«µ‚CÓL–µÅr‚ɺn¿úüÏ}:zéÙÓ÷ìß{šÿÞ}ò Ù^¦™.½ÚÓ œ¼}_–²§ÍÁs{x¾÷ÌS´Ä“h†á0 «ž~Už¨óÌž¢‡h{´’ÃhÅD eÌ>Qg‡—1‰fYÓL·þgÌ»Wüú= P©##7Fý!VjF­N–Œm#Eã3ÂËAß"ƒ3Íè{>Ø›wÆRp ²!´³3Ö 6o­[Œ·«³n9 ¤ã•ºíÜõÓßëþ”}ëw:'è62xŽB¥6&¡~ªÃõ' §3 RÑô?~åskR³9¸ü[rÌ÷ñsÙÊhtÞâÄ—ºÝ©¤¿Aóv­w}¯Ö ^ AN3YÖVê¯þúE'˜¬ëÖÉÛ÷ñOÞÏ}&¦f”‹Q‰ÒL((ZB2Ž}²dù¼d9ïNBŸ(¼xôž³<³?zéY¢óxËF¡J¨ãWŸGyæ« ,k—å4ÓµƒâØ,y!®øtzè|çbdä†Úþ`%A fÔêdÉØ¦_ –™Å o‘Á™fô=g° Z½±yg¬Ž?Z“±(lÞZ7ä­[-:k2¸¼¯äOg¾-ŸIʃ¾õ;‰4‡«ðHX5þpýÉ‚ÁéŒDµÖ-²äǯ|nMj6JoqðOðÍZ¢“ttDû¾ý B!kËu›´¤ƒÛÚ÷j­àÅä4“emŸ~òñ×øw‚ɺV1›søâ½Xxöá+(ß¿÷´J”$Ê,«ù£Å÷ï2ËóÞ`NªüÎ˳dÒOY?4޾A2>~õùXNã¬ðôý4ÎXÖŽËi¦k‡Wá/#t®þG¢@çRžß¹¨Ž2&ÌзKúÑÂ2‹\“%cÕ¶~]A hý±s……dзÈàL3ä9v3â÷¤RÑUúËÙ–­v¶¬Ã`óÖºõ׳ÿ¥§Áåíx¥¥@ÛêFë6+Põ­?åAßúÝäý)ÕC2›Îp ?Y08‘h ÖºE8èì_ùÜšÔ2h=ñ ƒçåò U<ýÛÐúÔ™éµ~Üõ½Z+x19ÍdYÛ§Oþîßû¢LÖµŠ7û€Á„ ÓLY: Ò½EYyULúdi#•·ÒOÕ4S«“XÎÙ¡\%R«k—å4ӵëp\j·~ÒHÑlç»9}t è\ÊÓ“2˜1¢NE \;dLWƒt""²dl£ÚΚkˆêŠ,;ú)#ØAß"ƒ3ÍPçü®M!¨æÕêM­„ Ê€V ØTÎ>Ê´Ö³µn*/—¨”{=¸¼¯bì]='h¢åªîuÊ×wÈ•ÿrš‰ƒÂrÞǯ|nMj44G©n×$•6€Á¢¿úõÏÛàLgÜõ½Z+œf²,˲–ÑÁs‹XiD’è°‘fzxúÕÅ¿™Y)«*ÕJî°¼ì¡jßï$–ëN+ôœ‰ÆÙ-QÖŽËi¦k'^¾—¡¯ÝQ‹Ç¡;QÜZ—òˆahP"äd5jÞ2 ˜ ‚ Ðÿ¿÷ƒ ÒÊÉ êZ±(ºÃ^`ôŸù1y‡òØÏÙÙ{À(å‚kè2T¢™t›JÛ(4Šë°D(Ǹñ8±*C¾áIyµ,UÏ•¼Xí †®ª yÞòM‡0=¦0ÁTz¹_0VÃXKRß+tÎZO‡j^=‡ýίïÇ„|À GII²GÜýl8¢Ã³TtmSk:#‰›2ø–Ñ x2ããWSnMjb³å@ëV‘·Õ ÂdY Êu‹µX«ØÃÈ»©§t qšÉ²,ËZFüÆÜëL3}øÊñ«Ï£9Tf‚(–—=Tíésëvüi'Š–ýTåŸg²¢œfºvç\p#êÃÕ6.Ö<+„¨^¾D‘Áp%™Ajy‰RH„M"±9ž§f—ÀÌ ̈–ÍY;>Æ@¸…V©ý"zɰè0F,¿åÁ ˆ +x˜*.Aà”MŠ/aœ,ÀçÒ ð%ŒË]Ë|ëÏ:›)ÎC5ÔŒÀ@€…; 8kËuªx®–H‹–-B$.ìã!/ÜÜì”bÜTqIÝb[<‡‡,?¨ÕâIœ2žÇå-$ó §4Ub0&xΡÑDU™Ïý)ú–-ÈÔC‡n›ê”«dÃeyŠ%÷w<±Pz’‘mߤß8eÀ_-Z4ø™Š®oiú3Í6(;NÙy«~Ô`¬¸‰xNøÍËUZò”®N3Y–eYËèúÒLç½±ùé0 ž¯*ͤ/úÅŒo\ÊrOœ]VhY-9ÍtíàÊ—ڸŽ—ì„%ã#½´e'ãA€‘/ÀËT1šÔò’ñ=¤]É$뫤êÆpq SÑUÊEƾĸ«jÚqÄd· e\õ …©ú*­™V#Þ 2ÏqÀx§ªTH²ÞP¢&‹ú+Q%ºŒÿÙPM0»~ô ª§4.Ëàºe»€'pU1mÖœSÆcz}6U¯@ªÄ)ƒ¸Jš…l+ŸûSô-›‰G.]%púÖç ý»E‚ýgèh-¿¿#I- âÄ3fü²¶D³^ X|vÛzß/ÇSHE5h“!W[ç­œËòwÑ2]¥³Y·ŽÓL–eYÖ2º¦4žW3DÕB•L3Aú®³WœEyk’ÓLÖ$9Ít£ fÀ•½H¥æö@X5r/h³*7CËój¡@˜÷ø’ËŒF<åÝ f4Yy{ÃãíþøósÜ,~UŸ^Þo(˜ÝÀIàa¸•õ¼yt~H*55Ò­ÍÇÝÍà4“eY–µŒ®é·™˜ßAç*¡Zi#–O3íß{C½ô,ª¨êO˜ŸeAN3³C0¹€ÇôÚl#Ç—ß´Ò _%ÃíNxžJÙaœf²,˲–‘¾€†'YU¦Ã)i¦jÚèü£7Zi£ª½Ê3ûƒçöP~ñèXXUvcz°vJN3³C8Í´ p—û_³0X\-8ÍdÌcœf²,˲–S9YâÏ÷žy*ÞŽÔJ3¾ÿ`qiVI3ew3ñ'¥”~*“A,ÏìQL±¼sI*2ëÁáá!÷eoo/­š³³3ôÿk¼Lu'''™ñÝ»w71)Ÿ±¤œ  gDð2™š­Ãi&˲,˲¬•Èi&cL‡:´^O¹5wïÞME×Ãþþ>"©¢†Œñ$mÇÇÇL*aUñ<•.ÊQ©ù½°Å8ÍdY–eY–µ9Íd¶–Åw^\\¤×f"ƒi&}U*½^W®ÕÏ[Y„K3a^ˆà$tîQ:>>¦Ù ¯ÆJÐÝ[­%e¦Éi¦-Æi&˲,˲¬•Èi&³(âE@žŠÌD...°z$]Ew¯¬yZáZý¼•E8==å¾¥¢ëAi&¦`@çkz2^óóPó¢óñ>¦?RœfÚbœf²,˲,ËZ‰œf2Û "px’ŠÌªÑ7‰Ö<­p­~nÊ"̃™£;wî(o Z‰ƒM\ åÑ:ÎäfëpšÉ²,˲,k%ršÉl' þfº>ÆDæëÀµú¹)‹0L SÃÏÏÏõžj¥Zh 6n)ä9è8vv¶qS3ãqšÉ²,¼ýý `Y–µ¼œf2[ÈÅÅ…‚§™®‰““®0XçØûZýÜ”E˜ &¥Ùžžò9¨þx4NE‚<­{µÌÖã4“eYôGøxë;{þ°,ËZFN3­5ççççîÞ½{'€—{{{úMã©ô3Á¹³C·«'mjçMâjƒVç-⢱yª(¹D}²ÌÚò%º*g72ÍT.¼Âù¯¾M:Gg•%µK¦‡Ð GW©h"ó6wÌ{?{§à%ËEf}8 «T±¥ÿÞÏ€{è¤.`£³™vVI”ë ª+3ÒOsyÑ'@ÿèxžìŠ“6©sÂ&賦ۜ@I2¢úîÈ¿Dƒ +6á\ÎÏϵ&è6"3®"7ð„Žé  çò´>s´tL–­f×güv6‡{“6wä{?{§”›Þÿp˜ôÞ`=éž6K£”>lŠ-XZÖÎ*¦™('›,˲fÈi¦5ô¼šÏB„%,WB 4LE„¬ÕPÍà%£SEJ±[„‚,D-zƒ1ƒE¿™o²Ïæ"¯``2•^¢(ÝrÖx‚á€dc¡ÚÈsµåXZär1Ùm6(@ˆBTÁ öç,˜o* h.ë¼Ñ™˜,WR½Á’%‚–ê6ë!;IE]´Ù>Ê[Ma¼ŸqµU0„¦€'©tÁøÎ‰ÜÎÊ·W7´…Þ™Wdü oÙDn£-K@¶e¥q†3k(Ç@VEd€pt15¬ž` Ti ö%µ™ˆÞ„¥º!´àÙÄû›«•ùÞ×êáI*ºŠü¯§Ú1ï} 3–íˆÜÆìRѶ ¨Ò!¥eí¬Ê4åd“eYÖ$9Í´Ž àu|5œPH“^/h… B1F5Ts<1:eUìVÁ$ú1a€„Âô:Üþ€~RQ@ažTt‰‚™Å w²O‘èϨµ è0Óë§SVq8”à ]"WËØ NEWé”hõ8îÈU–00.WfÐO¶,¢Ú#PMa và-mÊþÑ'«:KT"‡±z©è’yKÔBg ÎŽ[2Ÿ«ÆBi‹ªcšQuÔ3Wï©T±µÚ…ñS+ÁÒ©ŸËwtƼÍñÞ×@Õ&@ûR]Õâ è¿÷õ£cXTÐ*eË›ŽâI“–µ³j¥™('›,k†Ž^zöî“OPû÷ž,·¶CN3­#¼èeÜpex $Ô$+ ª šÃ,‹¥e¡IŒIò2A-H/Bl™E†D!q†a"¬Ù÷•ˆfTòà‚t`Ï¥Kë'4‹j®D‰6­í¦ltk)úcÙ´"RTW ³fo­égS ƒ~âpbeZ©®~óÁÎu𘊮¢ªï‘*Z¸Š.™·D-`ÌÞâì”"1gT5&qð<•^EëPz®žA5K¥ƒ].È$0º"ð b­›½¹eü{/Ù¤5Gõ™5$ª…Kƒï}g–DŸê[vC“"I‡‘–µ³ê§™('›ÖA{Ï<¥ EK°ÉZ­¹.½søâ=èôýYÕF ó:zéY^9`_Ë­íÓLk.ëù~kÅ-UúP´SF€@ÍÇ„ 1ä«![µÔdAf ˜ªµ#cªÖ‚tÏ#Ã~Õ²¯v¸AÝò°?QDZf$Uð*½B§b|0ÆÏZ´jóÁÎuJkÍQÞ7(é¬Ã¼%j¡3ÍN>cúzç¶ŒÁà8@}–6êÃU³T«5zÓ¶¼¬&»çmî¼÷þàQNX¦¢€j[® ¥[îñmÛ1ØPC:€´¬Õ˜4ådÓ­kï™§øÑÁs{ÌÎPxyçsŸyüÔç>“5Ys=<ý*g„YdU[ nJ™Nj•[›.§™ÖŽyñR?ÀŠšÊ 6Ä/5c)Dz»]VS™Q†Ú‚1Íûk Ôa¼cp‚Uçu“=8qÐYéÏÈtˆ÷Ñ mvfZŒñ³CÑ;\ó'¡ÓdÞµÐÈf§»x€Ò-c E¨f‰&Uõ\=E ³ h[eð–.ô©9’òF*Í Æ©è*UÇ:ÞvlÕwfÐU18V­íØP=:t´¬Õø4õî¿÷ÉOßÌ:±nF‡/Þã?FO¿šU¼}ÿñ?Rk™f:zéYx~ñè¬Úî4ÓÝ'ŸÀÔÊtR«ÜÚt9Í´v(h]âW !/!BHEñc(\¢Jª.† uÔ¶ês¿¶&ÃK±ži&fUª>C(‡ªI¨MW+Ô*·6]N3­º‚Ç“T4µj…ŠvªQÁ`óÈ`È'u‘ÝÒ¢¶¨JEWA9 ª>÷kÁÕÁp–É&­@“>ñV¼T«T4µjÍë&7º?–h}±/QXÞ!2šhh‚yUㆌô“œá(b§Ð'ƪ‹6ع ÐaŸl}:Àõ™Š®2u‰Zè Tg‡>Y‹±ð²c,g:OÍAÖƒª8PIgA²ucÞDß™êãö‰›‹—j•ŠF0¸éê¶:µ~mD–˜ž÷É‚‚F§™,kg5#ÍD9Ùtóê§™Nß°ž÷ñ;b­4ÓËi¦]“ÓLk.ÜdNŒ@ÔªB(*#@0Ø<2ò‰Á¸¨Ã`۾ϓfÔa¹ú!˜r«_ õÜš`•ÁyÝäF÷Çú‚U쇅 u›XÞf‚æt€´Ò42ëûy´ø!p˜-üz`,þ⻚WMµ­Î fOØgçðLZ¢:Uçõ÷È\ê÷ר9ÈzPúIEWé,¦ŒÂ’ñ_ÕJ•‚xkؼÍÅèl…'©hƒ›®n«‹Ü¯Œ·Ü2.:ÍdY;«Ùi&Êɦ›T?Í´¼Î?z#ë/njņUããWŸïû|öá+ý!Ô9,³ª¨¬¶ê7éˆ#Bè'«’äX˦•Nj•[›.§™Ö]â·b‰*ƒA?šW †|½ÑrÒ\È`۾ϓfÔQ%"UöFb¦iüjdÈÃI‹38¯›ÜèþX«¥cÜoïšÁùù9&"7@u1Çø)áR–ùê/Ú`ç2˜ý͵xÂ>«óŒ\¢:­Ùé­!0ATËÎÁÓX`…_š[ XÆêT8isu¢&y;8Gu[]ä~mD–x“¦¢Ý@¢ÓL–µ³Z2ÍD9Ùt3j¥™Î>|%ûÒÙÞ3OÝùÜg¨X¾ïi•ÇNT®Îõ³âONÞ¾/ã¨Ó÷p¬»‹¯ìÑb~'ë$ µ”µÙŒ( Ên)vrôÒ³™Y/Ï?zƒ.-:~œÍŸlBÛ¸D슃¢·Ò¦ú7þ04YnmºœfZ;¶MŠ@C…CÕpq|C>¡/› Z–ÜXL5’““­aœŽþh¨®m‹-ØèþXM–mW’y¹¸¸Ø? SÞ¥2è§–¥úµ²þ¢ v.ƒUE€®Ø§Ö³ÏàµÐhÍ.æ_p¤ù¼4–M'±Øù¸e™º 3Ðâ>V ™÷Þœcÿ ök#óÜÛ"nbš >#<^¹~ñ³ofYÖv Ç^KÊɦëV+ÍtçsŸ)¿.·ïiX¢*+×ÔÏ:Qùéûî>ùÄÞ3O¡Ïƒç.ÿk­èâJ¨RW±ó‹GïÄð/¥Òž%RÙùÉÛ÷ñ…˜šÌ(MÆxÄK ÁBPÍ•b[Øch–`)X"‡Ñ^¢U,AÕã1‚ä4Ó®Éi¦µC±D+ ª2B(ª†‹ã#0ò Y‚©?á¡uh…:}Ÿ'Íh$§áoxÅéhmÇGï@ÜÜî•Ac<žŸŸ/~ìÑlª[ŠËnû~j[ç´ÁEPóÎW‡§ås•εÐèl±œ¥±¡ã°¾˜VÚÈ ¬v*ºÊ¼xç¢aÿý«)Äc ÂI›+o[Ó©28Ǫ‡¢_™çÞ àpãÒLÿwßó;«¯¼ù;_ÿÖïn„Þýà÷pñ½úÑß>ˆiÇuÖ§?7{_̺ʎ֒r²éú¤ŒFLÊ0SSæ8h|§H¡í¢Jf‡)<*Ï) ¡óÞ ½. Õyg8*³§Ð'[eÇ\X,—=z‹])ýÔú^[³?ÙJ²V§<5Ô*·6]øG„ƒN3­ ñî˜ê½UúÑ£zR ÇG `0ä‹(Ÿúý‹UÅTSÇ===E‡­¤˜¦—QÑ{ËU’}k 6Z«1æ¦$­Cz<?k·[¹€ÎéûÙiZß–ƒ‹‡iËÎÑÏŽGŸŽÏó–¨…Î@õ8 n¨(ã"´fª•,ý<Š3¦aó~[¹g7osç½÷5Çê" TíQµ6ÝËþ²^dÒ‰Ýn\š ö[ßÙûz‘ÎX^ðÊohY,Ëš-'›®CJ3ݹüƳ`…i¦ýâ^!–Wó/e®äìêo$u†£ØyVË›†ª‰Úg7(i”,¦ôSktI7OeåÞA[}'ÏË®ZKÝJ'µÊ­M—ÓLëˆâV؃ˆ=ûî‰n(#E ?@5\€Á/¢¯êÀ¸:4bŒ^ÎT1UYEPNƒªÏqÜT4ŽÛújW2ë3&wZ>:D«,0ÓZs\óÖp­åŠè¦!¶jM¹Ú‚j|«SN#‚ªŸjXu MX ª‹ÖïÄø¿eÃlE'¤Ïèøüx¦/Q êqñ·ÀAÕX‹P=T<Šƒš·r…š`ÖÿìÍE?lÕr¸|ïk‰@é§:Õ–Á˜Ýt`âS“økŽBÿ6Ó&êÑ_Ž÷¶¬³>øÞu»Ðšëßþ‡¢œãšë…£Ïê-¼ž‚“ØýìÜZËHi¦ãWŸg¾O˜³Xaš)»UGåÙ,ëD ¨R‰Á€Z2>Š”ª÷ÈdĬJë®qqq¡Îñ$F8p/Y[þ—>f¡V©è*šQ5º‹NÊ#b‚ýШpªÏrDtË*×hñËV›²Ñhg$à €òk>T3&È~ì¡ê<'^uµïg\ÒèO lÔ¼zrÆ,‚@Ÿqkðœ‡ö©hóME—Ì[¢ZœÁýâ,H5Í„X Júª'gð(vÒ¯cÐU}È÷æm® 6¶ê|bÀ½² \ÂKkªUm«g##s.¥ŠÅ½N<~ÕµÚh :ÍdY;«Wý¥9È ¦k’ÒL1iÂ/¯­0ÍÔ*Cœ}øÊ¢Jz+Sg8ªTMªWçÅ&“&›‰n8Íd-#§™Ö…Uô„ÏØ$»#BcÂOX³,7¤ðȾEŒ¸"–Á¡ˆF}º„/Ëä°–”!îŸ[ ÒbÀ‰h ÆÏQ‚rt›L¯ÒŽ%ÕÀlÊF#°,7ýk8ð؉î) †Y*šûþskðD®V'5ègL‘  å´¡A<1@F.‚C„f€/ÇDþ¢ÿîP¿DUâ@·åÜ#0ÖÐ1•^%¬jæ «¾ ÅlAªïš>Úb€®0V¾áÏÙyË=0osÑ Hjs9VuZ@"{8€Z¹Â,6é½O`ÃÎÉã‘ð%vë“L·Å„N3YÖÎjµi&'˜®ULg€,i²÷ÌSGÅß_kå>:™¦ZZå1é£NbaUá¨rÐ~çÕE`“I“ÍD7F¦~Nßpð܌ъBÛrôV:©UnmºœfZ_;áR^—õϱd¹ƒjeŸ³D1 ›d´â"ÄÉâ*ƒñÿÐ,éÁK–É ø¶èõ Ñ¥‘>cî´ŒÃu~?…`ÙÕ?–ô#XyžÚ\îB?>ß NÕÞIAOl:K'iÖJº ‚†ÙZ”`.uô3;ŸÑ@ÛJÊ Ž\š¡6Ù-,Q2&æ™3$îãì%ʨžê¼†¦YçAï¯äÖ¼¬~€Á£X]ªÇ“©uÉ­,i¹'æmîŒ÷>9Y/Ò=šUxÎB°–sÁ3TÛnT7« 6E†N3YÖÎjUi&'˜n@Õ KK4.sÌ Ó%­ò˜ôQ'ÕLPTg8ª´ß¹æÕ›M&M6ÝLý &‰öžyŠ_]Dak©[é¤V¹µérši@ EÒë.ˆ…hœEÕ›q =©èšÑ‚¤×S`C2~é4"HEãHm6p£µ­éu›E„;áK[-âA©tˆA?Y ³ôz ãfàZ·iÞÝÉ­¹«}­$ÏLÝ£ÔlbÃÔfô6Ñ8[:îøu¬'‡k¸Y+Dñ¡ÓL–µ³Z>ÍäÓ‰é 0˜4øGÙ&e^˜ji•Ǥϵ~i®ß¹þx\,ä(“&›‰nôS?úãzÙ;ÍdQN3cnˆÃÅW“ö‹_œ1Ƙ[GQ¢ÓL–µ³Z&ÍôÚ{_øÉÇ_Ë:´®O“ÒL­ K'óÂJ«ùÄéûXˆ'x‰òøÃI̪ f¨RW­A•NÊeú©¼…J+“¥“Ô6٪䧌1GŽxòö}¼ä÷ à'Z©! %Nµ#Ë­M—ÓLƘÕsttt7üÍuþQ­•ü*“1Æ\Šf²¬Õø4“L·«ãWŸgzâñåeH…t¤ä ì)fsØOìäìÃW˜+a9³*ÐÅ£w˜gay6h柣Ÿ˜c‚ÐmÍxgSkPêáéWÙáÞ3OÁmOø2šAhHK€™Sƒbÿx¢\XK1úÃ>ñfAÉ,¬GǺiñ—½Snm‡œf2Ƭþ ÓÝ»wñ„÷1=þ÷cKÿ@•1f Pôè4“eí¬Æ¤™œ`Z.R-QÙʪ:yûþÞ3OÝ}ò‰ƒçö”ýA ^²–½ô¬ºå§ï?ÈÊËo±¡ýCû÷žn¥rPŽÚ̦5hÔñ«Ï³!§Pí?ëD·zé¿ZqÅð˜¥Õ(ÐtÈ%eòˆâè­uk•[Û!§™Œ1«‡i¦ˆùÛ³Î(†tšÉ²vVý4Ó[ßÙûû¿ûFÖIJ,Ë*å4“1fõÞ ¥ cŒYKI:ÍdY;«Všé­ïìù“Á²,k¼œf2ÆcÌ®£xÒÁ¤eí¬Ê4“L–eY3ä4“1ÆcvE•)-kgÓLN0Y–eÍ–ÓLÆcŒÙu[:°´¬ÓLN0Y–e-)§™Œ1ƳëðbrxiY;+¼ýý `Y–µ¼œf2ÆcÌ®ã4“eY–eYÖJä4“1Æcv§™,˲,˲V"§™Œ1Ƴë8ÍdY–eY–µ9ÍdŒ1Ƙ]Çi&˲,˲¬•Èi&cŒ1Æì:N3Y–eY–e­DN3cŒ1f×qšÉ²,˲,k%rši­9;;;:::\pqq‘JÍõÀu>LEÛÂÉÉIšÛªTa6o¢1׊ÓL–eY–eY+‘ÓLk BÊ»wïþÚ‚; ú¹óóóããã€^‚’ÁŒ ’u`Lžåôô4Y_‚¸w4ûûûàœë¬5ÇŒRÅæƒ‰kjG+U˜ÍaË6ŸSI-¹œf²,˲,ËZ‰œfZGO2’ÜÛÛ;==M¥ `3ÆŸx$lNðòìì,Ye¹h”·ªfd˜¬¡ñ¢ÑcØ„àeu¸Ûs¡ŸƒÉ#8¯õߦt 6N‰Ë©óZlòcêß.ËlâZq~~®‰ŒÇ/56~Œü+ŠÌ\œf²,˲,ËZ‰œfZ;Víïï§¢6ˆ1hŒ0ϼ±üôô4Fqev@µEY¡˜aeFý` T•Ã!Èa+°VɈl)ÊIU9::¢ýFó:-S'ÅMN3Ý:³7q ÑgÀsœ® ¼ õæÅ!LÍL`›Îíã4“eY–eYÖJä4Ózq~~®>¦%¢/ÝU”qzzJ›[*´ë„mŒë2”~‚“©è*Ê‘Åán 8Og0N‡ .¬ˆ+œŠ6œÙ)’j6sáѺ•ƒ]˜·‰ë–&\I€y¥¢¾·æm8}œö7ò‹·¦~8ÍdY–eY–µ9Í´^(èêÿ6žfXb` {6ìD/Ì(e=³«²<Â;€n7ŽÕï×ÀÄ`,¹\j¥~6š1[oÆÀƒÇôú™½‰zÿn\š ÀìVVûÁ6qeün½1œf²,˲,ËZ‰œfZ#W T 5-ÏÏϳ¨RÑf?zA«ì֌ņ€_ÌI/nýâ/Êq¾DkuppŠ6™Ù ÿ>½fo¢Þëð#ߘü–bz±øÝzó8ÍdY–eY–µ9Í´FŒ+›ÍøëBJL ’5hëKsëÌÈh6cË"=®+A?\=õ´æmâÉÉ [ML3í ú ö»õÆpšÉ²,˲,k%ršiÐoN÷ó8ñwsgüGüëN>Séö 2lýÔÚ2/š]òç™°JØ ¬š‹øU>=…¡™rðA…`ŒÿG(5¸%€ÓA‡É´KÇ« X¢s™ ”Œqxüô«d6/«o8AIª[”i\~ŸT$»Kªi_l7Ê“g ªg cU›0Ú² «‘l@é3Ìðѱò7>z¦W“Þ˜ðžGâ,2¼LÌ3B-'HhÜú\-O¶£\¾ë ÍRÅe Aµ9Ð.˜±+Zڤ׋«s­ãT=‡ÿ±M,¨Å‚¤Š­Ài&˲,˲¬•Èi¦5WíŒ+úW tgܘ€¸"5^0ã{€W©Ù"Rݬ_ƒÆLéù¤h‹ÃVhžŠÆ£t¬•¢YöÊ#ØT}¹³è$½ÀŒMª`,„G<Ç|Aìô{ˆT½ÊÀ(¬…·N>¤¢îy«š¬Jž'»K&ù_6ß\œf²,˲,ËZ‰œfZ#tY0 ÕPhûy7dU¸H 3Ðp™€A z˜D Ʀ‚æt{üdFd+0~tå3Ÿ¼i«1!v“~²!lÏOOOñœmAT ílœÇMGW©tò ”‹ É– K‡Ñ6½"NÏOþ2*®:€ç²ÏÓdQU½U‡µ œˆo±T´Æ;¢Z–D’é­@V®Ó,-ЬAVµ òª\ ŽØš&ÜVÛª '‚Ç2!ޱØ0[áøÎME ”úÉzÃsùPÞ¤ƒ ½Å¾Ãl±äãVfÃÑ@‡ƒ²DÄ#­~ª‹dMýÈù¬ŠÈô ·a 3ú*µå[lCÙÙ4Ó'?}óƒï}ñ?ûfVnY–eY–5ON3­ºp/#–.úi–'“P'/Ç„Ž12! œRõÐUêb4h’OGnWûj8~t±å’b­Xª±™†Ã“2öÓ®áI* è÷wªµ@· ZtUxL¯LU«ZÀ˜áIœ¾^t@«Qýî§R9x’Ѝº­(dmÕù~­Pš <ØzV•=ÜÊ& ¬9mª·¨è`÷'> y•½1™gDygšñÝ”} 11ÐO*ºD­ª=sP4L¯¨°ìM™©²·xN@¹¤j ÊÏ%­vg@ß,¦ŠRQ ³€ úÇ,µZ–ƒÒù eÓLŸüôÍw?ø½Ž>ûø*ð?ýˬֲ,˲,kžœfZ#tÕÞ‰cûT4 …Á=þZÓÅÅ…x’©ÿ¡~œL¢¼+a<³#¢‘›A<†•¬f7@¿CÕVÃB8ÏÚêÖë`´2†ñþˆT4ŽŽÏ¬ªúp*ƯèL?ëJñskè~Ý™@!k«÷k Sl9Eï·²‰$ú\æSˆ:™ú>j¡ñ$ƒåýi¶V/ÑCu¦ýÆQyüYf§“V}GkÑ@ù¨ªêíB@ÎÀ2]XÕ_¾Y²@åìtÎA™#jÛ÷pƒàÅ´ i¦˜`‚ÞúΞïf²,˲,kUršiPLÒŠ‰.îËÈd*ˆ©ÊœQ+"Š h‘ÎÄØlÝÐÚNuR [qÚT´nÕ]î§À¯ÜzeUÊ*12p-‘W¥ÏªÊÒ%óß›–±õVÚtf:ë úµDéV¶Qï»hp[›HZ)›ˆÜž:z y…'èS¨Ï“iÐR\¼'«ú:kßGÖBý·Î¤\- TÕÊÂk7a™¥öFntÇlÌq‚Ï-›xΫiÇÙGqmáÅ´Ýi¦2Áäߢ²,˲,kµrši]PüZq QØÓ &hD}¼lÝÎA R›­ úÖ‘ŸRÑ8f7l¡¥®v¨áªg “àòÍ ;^Å“³üõ§‘e'ý'ßÊùÎ^gЯ%ºµ&Õ½¸­M$ò¹“hÖè¹OB^• Å”Öà4ãýD'''Ì›´¦0cõƯ[+›ÙY+%õ?ÒÕŽÙ˜Íê8 ªV󋹿ðbÚÖ´‹L–eY–eÝŒœfZ:—ûŠj:Áà ²œÑøÈAÁéÜ]r‹hjð6cvÃÚ¾j‡®z:ŸºílÜì°°ãJT ð£ŒÉQVéO_h@Ç’wµ€r¹ú©ÿ²!è×õ'Xí’hÚÜÞ&tŽ:>%hZwèL¢3(oÆ3MyÅÞ:Éî1+Ñ^4©¢)àyjv «ð˜^ÄYv3ÔÈ¤U%: žóÙGqmáÅ´}É'˜,˲n^§ï?Ø{æ©;Ÿû …ç™Á¦èü£7öï=­‰@™e•rši]ˆñL+$úÞ ®þgÇóUЛ"P~¤BÅ*`%ñçj‘{ºÊì†KeÜßßÇ¢+õªÊ z:ߘrvX8èU<6ö˜òŒÃÙHh@ÇRó-—kpF¬-‚~-QÿX™>1'‚—j•Š ®i :G]s­~&Ñ…#?…bJ±ó#ncV8ç‹&}Ê[¨8;<¦×5Z+0r£;f(iUEZ žó‘n¼‚¶)ã“eY×§˜C)µïéóÞȚ쎎_}ÿD<·‡E8yû>äî“Od6¡‡§_…óØë³_0 ¼ÌlÖV8„pxs|-§™Ö…ññ›.îÁJ"½HüÏíIÁƒþByCœŸDj6‹V(5Èì†æ¡€çXtÒïPµÕù¢µ0KE—p,ÐÙ5œI; ú^‘ãÚÏuu¾ÑVeÌ@@ë:–šo¹\ýÔÙôkÉȉdÜî&Ê z2‰æ&M­Å˜AÇgÔUçógÌ G4_tžŠ¦@—úm[+0r£;f#'Ûr`pî#=Ü x1mG"Æ &˲n@ãùoÁñ«Ï?<ý*uøâ½;Ÿû ñˆò¬É.èôýœ¾J°P^n0 H㗞ݠ¬ÍÝ'ŸÈ6º19Í´.Œßôî`ü Gãé|ը•1QGœïHúËÒ§J 2¯¡¼ò¦UU;ÔpÕÉjÑÊ­Q·ÅŸö½Šàpên;2)Ó4r ­èXj¾årÍ^gЯ%ê ’ŠFp»›(ƒÎQ×ÜÁuinX t¥ÞZ1sÌ GÆìuúÓo+Ÿ³ó‘Ý19Ù–ƒsŸ}×^ A›žŽq‚ɲ¬Óá‹÷øoÁÃÓ¯ÆrÞƒò˜¡˜¡£—ž½ûäxÌÊ×\̾<·—•oœxOÖ:߇Õ?!ºá.+·n@N3­ºÜoÅ$ÞpÔù’Ù Ø`ç­è¢…ò c¢Ž¯Ž¤¿,}´bS£Y5ŸÑStWͰ¨¶êIÿ t?uÛÙµÙaaß«ùjÒñ§dä@ñ÷ò;i¬ÎìÔYgЯ%êÒy»ÝM”Aùå/1ûáÅȅ‰‚AëÛpÜhýþ7@·ÕïlNúŒñ¤õÏdή³VñÃ<ëäFwÌ4ÙŽ žóÙGqmáÅ´¹I'˜,˺aµÒLÐÁs韡e’DÌ×`”¬|ÍÅ›h6ÎíRÜÄuN3mè Ù9Í´F´â’1ñAÄ›Ø!Ú‚ô¢†î–Š#A,щ?ÁÁˆ?ˆW“HÍf¡µíG³%ã7…hõZ‹€rT=é‡BÖÆ­! ùÊ*1;,œº Þs7þ¶—ñÉrÌ7¤J›þ@Õ·€èì‚ÐÐý÷ZÆín¢|îô<õ=>ˆ¼ª¾ͪžÓ%m±nƬz8f…3äáøD³`ÛÎX³4r£;fc&Û9êƒç|¤‡/† MLÍd ¦×ÞûÂßÿÝ72˲¬•«“fB «–Ilh¾†wrmAîƒë¿Îi¦­ÉèmŸœfZ#p5÷ hÅâ8ü½§~ðÃ>c‡,At‘^Tƒ†­xƒÀž ÑC*Z´¶S}¿)¤zÅ›ªžô‡ã.€r#bZ§uƒ6hjXØò ƒb­,ÒÔ¥ã›ì eZãR—ªªúöQª¢ÚygD¼­¦ó‹ÔÙ77³‰­÷þà­@@ÌȹTQ‡7¦î¸)O? c.«ÝéS]Î}p´þ‚WWLž´Îs'm×ÿ$³1“ÕQ/ó¡ƒç|¤‡/† ÍJ3• ¦G?~9³±,˺&-“f:ÿèãWŸG-Tý §“·ï³‡ƒçöЛ„ª‹Gïè%žÇV*?ûð•²céî*8€çt`ÐfüL¡ ÓLÑm”ÓçÓ÷ 7<ÒNÒòž¯¸>¨ÅËÌbçôP…lUv¨òjWUq"wŸ|‚A(„Ïñ¥4¸)Ñ«ñ «%bsô£ªÎ ð„«].…D*;0'Ë¥Ó¤ÔªÚÄ¢œfZ#ÆD\"†Ù­8Va@ r8JTÄ l#…-ßÝá±£Þ"“ÖVÄTE+PÌè‡^ ê@Õ“þpýÀOm[C÷ :´¼âdÑsz}¶ªºÚ¢5PIÌÈTó&ÚˆêQ×!/kqìåFÕùx*ZÑ{´i­Ó:Ù¯©ÕõmbË ›êáÔšÃ,-MD‡«ƒâ d€ý³¡­o- ŽD\"l1íA+¹Æ})?÷PØo(ƒò iÜjÏBç¼:ý3Q}Ä”\¹PýOÐzáÅ´)i&'˜,˺u!Òæ¿Ší%D欪æžÛãæàÉÞ3OÁ ÏOÞ¾/Vaú@ðA­.½ÃoQxÊeÏr´bàÉ  @á`‚&kBØ?|F,¡ÏrDo!­l =6zàü“v,xÎ<†ÎÊQ¢NªŠÞF°øG/=«Þâ¾—¤f/,œgCQŽ¶Ñ˜Î 0Ëyéž)æ×05´RF¯´·(§™Ö†+ zÑ_‚BMp¡˜b*Ä]1.1ÐRÔÐÆ´ž¨·Æô{bDFæ,¯ÆZ·b*x'%¸V¬­†OB³žGÅÅGC8€G>A-UU q¢>cìoªXWã\`\:{à ÏÙ[ÜDìZî¢ãUœ :DÿDG‚SIæ|¶8U´Ôˆ‡À+ŽŽG¼L¦WÁÜiCð\ I¬­®³Ò1„ ñÆÉbAœ àËjrdë@ð|™MhË~Hì6Y,@Ÿ2ÀJ>^ÐÅÛf,Äódºðœ}ôŒ—%©zaZ†ÜÈÖ”››%L!Õ-€ásÌ:Ù2OK°hÉî*2xŽcÃõ„?Úeôœ¬ ª'h â:€2‘`,t(ôÞ)d»›ì¤eCWmãàÅ´Îi&'˜,ËZ+µÒLÕ0>«ÊÊ´gé–9 ªUÛJ.ÈÛ8 žï…¿Ð_µØgévU·Õ¾ÉÅûn4œÖ'K^(³Ó.V˜åÙ|Ñaµ\i©1Éz›õiÐr[sŸº°Ì(eÆXXÆýj GqÐÌLœ­²•TŽ,b9ã|cúI…–ä4Ó1&ð(AhûxÅOPP…(þG:ì`°6™^BûV‰@‚U¢Ï,–»EGÑÏAúÑj5ÁT4l%š°-ˆáÉã/Qyz}L„µ­É@°ÿ4ðÕ¡•Y4} Ë;$»«hP«,dÏ„%w l’1¦×ìül‹Y aj³h…]ã;U*$ƒëŒ®ª÷ø °t%­wÉ:ÇsMgÆ& :Ãæm««¤mMv ð²Ì5ÌëùØõ‰tÚ² ´zÎvs,÷³Îr»nJÙ¤ó¹Gc<ò/ ž?Ið$z("0`m»–}"Wo­aªn RõÆÂ‹!h=ÓLN0Y–µ†Rî;"p<¢„ ùé›ÝÏßûbÖ…~¾ü'OdÆ]w?ŸþüÝÃ×+3î1OÖuý|åÍßÁËÌ`+Å0 ’‡u3ð.³HR+2gW¨…ý0¾UÛJŽpˆ²<ªeSu¯¥ŽÛô­LXH¶Ìße>0ãS:Öʵʫj­d§“–ÿ“¶ZXUk8ª:hkRrsÙ¼8ÊøÉZÓLk¢…%ËGfytëÇàMÆ“‘¥™ÌšÃ‹!hÍÓLƒrš©/§™å4S_N3E1ŒŠÀñ„±w5ŒG-íaSŠU1˜ga+ŒoÕ¶òÕ¤C¦– Ë1bV^UÇmúV­‚´>Uù¿ïÆ&¥cê*®g§¼ªÖJv:iÍÎ\XŽ[NªTk8ª:(›”ž@šWv ›ŒŸ¬9Í´^(¯q4â'͵³~©ÈcFãÍ‚CÐz~i^½õ=9‰çëé§eY;%†ñ Fàº%¤¼g'†ñx^U´ï‡ñ­Z&)Zj~AjÙ°#fåUuܦoÕ*ÓGmË€>€¸JlR:¦®²%m•WÕZÉN'­¹Óù‘ ËqǬvg©¡ê lRzi^Y‡l2~²ä4Ózq|ùÛ´w§ü<“¹/˜iÞ7æŒ1;ŽÓL›…28뜾q²É²¬µÃxEàJd¿3ÝIOTÕã[µ½Ì#ÐÛj~AjÙ°#fåUuܦoÕ*¨•æ ª>°IéXk©[åUµV²ÓIkît~äÂrÜrR¥ZÃQÕAÙ¤ôÒ¼²ºb“ñ“µ §™Ößд\\\(Dô1S9;;ã'¹ÓL›‚r7럸q²É²¬5ÃxEàÇ‹?—âƒôG¾FFæ}cÖ–÷L1IÑÊhTó Rˆå1+¯ªã6}kÍHëSýñ¦õùm&ù™¥c ÖÜ'-l맸Kµ†£ªƒ²Ié ¤ñ²_¯g“rÅú£ï¸œfZ;.þÊÏâ„;Ót;œ‡?æí_e2ÆÌŸäü þÉí@Y›MIÙ8ÙdYÖ­‹aüã銜 P½1$K?µÄNZƬ-ó­òjÒ!Sˆåp>+¯ª“} oÕ*Šm«NV—Ži£Ò±V:©U^½í8SN¤Uι°J÷”i¬Lô°uBªƒvrXý¿4W®Xk²ä4Ó:rvv¦4Ç;wù§ÖÍõEXy¦ùð¤ú'ê1¦OLU<÷M‘ëò5›•¬q²É²¬[ÃxPFàú›ôY°øsòàäíû±œUÙŸ¨c¡š€ªµÇ¯>Ïà?âÐeyT˦š i©“} ÏÕ›•( ”ÝP£õÌ2/,/k¥“ZåUÑÛêŠqŽY~‡iPÎ}ê²ÿª}ü}nzX6§ªƒj%^z6–C´tžåÙÊ«¼´· §™Ö—ÓÓÓýýý;—øÿï›´Ðwîìííù&&cÌc”Ä ¤»Zöï= 3ÄùwŸ|BѾjÑ–ýÀ ô ½©J) øUI-Í4Ëþ”ÒË[lT•%>2Ñ<ÊÑÊËÉZÓLÆcŒÙu”£ÙÜ“M–eݤ–ÄÛeäìÃW‡+Ô?ÿè %)Jªf zËî‰ýÈe(bÆ!zË%¸×²Q* ¼šS£˜æH¦Wg'± ž«ªj1M >/ïšÑL äÊñRåjØ*/ßâÚ‡lۉq:]…š ç-lô–À&&†¨Ì Nª3(…¡a ¡ âs4‰6\Byê%dš:mQN3cŒ1f×QvfÓS3N6Y–u3BÀŸ)3€Î>|¥U‹*Äð‡/ÞÃc5Á$!¤§ÙùÕ¿[G•µ(ÁKªà_ndåQ-›¬¼ã-šdƱ¶SU Ó9~õyL ÊR$R\^HŽM-¯*ZBÕ£‡ÙíExÉ&*T'Ôø…‹Ðñ¶zB²Î«þ³!§P=]ÙŠA,ïo´9ÍdŒ1Ƙ]Gy™íHÊ8ÙdY–eYÖmÉi&cŒ1Æì:ÊÈlS:ÆÉ&˲,˲n^N3cŒ1f×Q.fû1N6Y–eY–u“ršÉcŒ1»Ž²0Ûš‚q²É²,˲¬›‘ÓLÆcŒÙu”Ùîä‹“M–eY–e]·œf2ÆcÌ®£ÌË.¤]ÊdÓ/~öÍÌÆ²,˲,kžœf2ÆcÌ®£œËîÜÝ“M|ï‹Y­eY–eYÖ<9ÍdŒ1Ƙ]‡CЮ}‰ óŵ ïf²,˲,kUršÉ“s~~þ0pvv–*ÖøF'Ók³fpw@zm̺²³i&˲,˲¬ÕÊi&cLÎÞÞÞ¯îÞ½›*¦£4I¥Ks~~¾¿¿çÎäâ¯ýÚ ;_7¸td S~ÇÇǧ§§éEöOp®:–ÆÜ.N3Y–eY–e­DN33™££#ÄÌ%·(ÓqzzŠ1A0#Í„æYˆ dù\Ãññ1{ÆãÁÁó/¬BÉlØ€‡©h4‡‡‡©ñ"³–J¯m9??Ç1ÃÊ£!—NLíêúÀL™‘ìøÃÝá\è?Fª3fpšÉ²,˲,k%ršÉ˜90•À° „¾¸¸HuÛÂÁÁf—ŠFpxx¨•ÁtrºO⊧ACöP]ólSà ‰.¥¢ÃC%>ÊS NNNªMD6”¤– àX¼# –J„ ¶êÏŽŽ˜©‰}NÚ”•'c1›~ 4¡½3Mf qšÉ²,˲,k%ršÉ˜™ ´fÌ Æ'6MpRFC¹›²ÕÅÅ…jïܹs~~ž*¦ÀÔF«¹Y«å•’Vh˜Š.‰®¦¢åMÊ< Ž«ÀÈ, ‰ Ëdœ·•¬áÝ|ɉã'¨U=99IEƬN3Y–eY–e­DN33“˜pšI0ÐJžž²OpppJG#—Z¦?öööÒëK”Ý(çÂ[„Ê\’Æê¤™G¬æYXÕªm¡sÕš£îiê;v`û´¿š?Á££#6™t¨Œ¹œf²,˲,ËZ‰œf2f&N3Ua¢s£Ò3 jÛZp”7Ñ+PÊ̦חŒL3ñ«…+O3¡mën/ejÀM<ÞºÇ8¸7o‚jµ†?gnv§™,˲,˲V"§™Œ™‰ÓLUÎZ®üÕ$ÑÉøôAÏlx§÷AUµ¶?hµ•¦_íPœŸŸÃò´ö£æhÈ&ea°s¢PÅnAÇlåìíííïïÇ7AíÅÔe1æZqšÉ²,˲,k%ršÉ˜™ÜV´c(Ï25ÔG¹‰ÎOUÆ|ß >Ã,½ôÓLhR¦<4ý~š©Ãì4S­úoÝñt”©Ãyäý_`µçʘ%qšÉ²,˲,k%ršÉ˜™¬$ÍÄ?Á†x›àyy_ bø’,™’J¯’êc†賃e*ZšøM«ÎÐUø¥-PþôÒ ˜ÛŽŸ‹¦¿ni¦eÖaµÌ›`L“¥"cÖ§™,k­ôñGä7£eYÖ†Êi&cf²dšéììL?>ý8ås÷®‚ö,}ppõoçgi¦ÌÏQ’êŒN\GšI)’©·2¸Á¶3²6j;~.ý4Óéé) :ß Zá·ÀIc·x¼õß6š7A½qª kÌmá4“e­ÞúÎßxâ·¤eYÖÆÉi&cf²LšIÉ‚»wïÆï=éF,rþ@[+86ÙBS‡#ʳŒOÍôQŽi^‡ó’#²íø¡5ýꂳÃþ¾/ãpí#ËŸ9ï³··ŸÇ“å1«Ì› fÁV ¿€ÆÜ$¼‚ÓZÖ­ëëßú]½%!'›,˲6KN33“e¢e„ñh…(½¼†U ‹óy/€A**`Ø_Þ(4c8°Â4Óéé©î¥šsQRcj†hšãçÒI3)£×ßw9¼|š‰?4Î1…÷1É™‘ŒñyÞã'f2ëƒZG³–uëúÉÇ_ûòŸ<¡w%åd“eYÖ¦Èi&cf2;ͤüEö½6ÒºÃèøø˜åÑSÑUäO–ƒ˜7PÃñ©™Èéâke{{{Ê) Ÿx/ÕT–ÉM`h¶?M Ud¤'2CW©h"hˆ]Óˆxs“Q•õ¹› Œ\@cn…²Žc-kMôý‡_r²É²,kå4“13QZLŠ–û1¶º…Y–”QÃì;q„_IÛ+~hiöpʳܕfŠiQfç\úéƒ)°íø¹Dÿ1t$•y"Ëå§,P‚-®€›göÕpM&b PëÖ²ÖJN6Y–emœœf2f&JЀñ‰˜ÖIE ³nû¿ŸÍVYܾÌpʳÌK3]\\ CrttÄ/ÍŒˆÂd7Ž%¿iµLš©\:ÝÖ÷DÏN3=^»ØÖìWÞ«gà†™=ÁåWƘ•£ðÕ±«e­¡œl²,ËÚ 9ÍdÌLü3TxžJ‡P†‘6bì*­ üôò'`Š.a·ee™áð’åóÒL%ð_cáɤ/ÐÍ[m±Ú4àDúž´v”jÕoAÞ$³'x+cÌ’(puÔjYk+'›,˲6BN33“y‰%/‚í>eŽB¶ÍîZb¥ümìe†SÛU¥™ ±Ûòû}æ­¶Xyš µèªÿSÜši¶°K3M3~ |…Ìžà5­Œ1Ë Õñªe­¹œl²,ËZs9ÍdÌL–L3ÍËݰyÌÑð.§V6„ö3†[ÒÕúö\Õáë–fÃ5%SÎÎÎØ-¸ÝšfOðšVƘeP°êHÕ²6BN6Y–e­­œf2f&㨽¸¸àó%s7J1ÄÜ7Õˆ}™á–tµ…ºãFãW»Ê:§™0©7%©çñÓA“Iô}&0£cŒ#³s}(LuŒjY$'›¬ñzxúU)«²,kµršÉ˜™ŒL|0[¡pš/"m–LE~EŽ¿Ýêm™áÔvµi¦y £µú ð øSÍÉaí~ Wcê Ï˜ŽœIÇg1f‚Uf74æúP€êèÔ²6NN6]ŸÎ>|åðÅ{PV¾qÂDî>ù/?î|î3Y­5UXϘ¶sæÎÊä4“13™.aF@á´Z!ÒžôØB¿êÍïÍñkt­/O-3|fÛ©I>ÇÇÇìLº‹G¹‰Îj·˜‘—Ñô1n*ªÁo,V»“Lá(SWX=ÿ}+ 4‰ìÇ¿ªŒ™`•e¶Ò˜kB¡©ãRËÚPU“M¯½÷…G?~9³´ÆkÿÞÓü'ûôýYÕ&Š™&§™–×ÑKÏby6ÎÉÅ£w2k—å4“13Qt¢eFÔ1WŒ}tt”Ц ûzð¨[™:)$ÔÎ>³á¤$ÈÞÞì;ù#u ÇRÑ84‘µJ3ñ¹«ÝÊáN†ŽÅæØ&¼D·éuÙ{ºZÆL°Ê2[iÌ5¡ Ôi&ËÚh9Ù´Z)•°ïé¬juøâ=ÌÅi¦•èôý<{Ï<•UY–ÓLÆÌdLšIwîÄ{Câo`ë7›2ö¤êOú)‰ÙÃÍK31ƒÐq‰‰0;71#·¢AÇÏedš©3_9Üš©2†ñf4Ž‹òVêP‡ªïØ 08Áj˜½qðUdjŸÆ,‰ÂQ§™,k ädÓJtüêóøÇz›îrši…zxúÕÇs¸\Åw*÷žy û²;_¾ÃL1ß-ÎÐ9ÍdÌL”†Õ4ÓÅÅ…²Ñàìì Q4Ëa}; /Ùª“©‰ß;ý¯žÍN„A*Æ:99IE£ËoüMꓨç µÅ“T4—¥ßDKTº„gh9Œ5/ Ôgk‰äØíÞÊ„ý¥ sVKâÊdGwÌ¢sM(ušÉ²¶FN6-)Fþ'oßç?Íg¾’lœœfZ¡V›f¦ «ÝI3½ô,æ{÷É'²ò­‘ÓLÆÌ!¦ÀÁÁ¢âJ”ÚY*Ë¡+¢&ƒq»,÷Fü:ÏŒáâa–ùßA}â ÖAyô ¬ zß¡?è6#›>^¦Š6p/›H‰nx™Z^¢ÉX²IDÓx™š]M_ÂFiÁóósx®V­_ãºV°›Xo€ùÂ=Ö&ë0`ôŠ.QˆkbÌ  Ôi&ËÚ29Ù4Oç½ÈŸ¦žÛ‹›(§™V¨¦™xØÐÕø«gN3cþ'GGGYŒ=H{ë6¢ VïÊP#»;©Å¤áÊ âe™Šª‚¶è36Çs½Ä“Ùé¥uÐ*"ÞÉAavM3­¶ê'Õ´CÖœ¨>|Žu¹é«%æ€úô·Xw´a.©è§™Ì-¢àÓi&ËÚJ9Ù4UÏí!òGüç{Ï<…šûÙ™Ó÷  Âf M”}8zéY¡Òrså4“1“¹¸¸@<<‰Ô²àìì Q7"jÒÉ}dÀ’MÒëqŒ®:Áñ¾49>>N#-@Iª›zà¿@ez¢ÃÂ÷ ©ºfšŒFƒK¤ÒÑdÍÉùù9ª¸tëÙù­÷€ÞRŽÀD¸ÕñRC³rv:ÍdY[¬ï?üÒWÞü½ß)'›ªBŒ ™ÏT?¾»Ì:•bš5¢kOÿÔ§›SÎ>|]±ÄDªd ¦NЃ‚p¼D'-« cqØã9[á%;¡Ð%ÞÁ¸±Oe@óËmtH¯d}@-Ë1(Za¹øË"Š®- bŸxRM4hh4SÓh†ÕãF˜©œ“ey¹tý½ë´Ìúœ´}ð9VÉ’’WBo\c,ÙàpÆi ‹ –pÁÇØ`¹Ø?ȦÆ7 %ÅôËÑ9†`ŸêÄ~¸é©âꔳá6ZN3c6ƒ³³³ôq<%ÍdÖ ÝUwt«¿-eL†N§™,këõƒþ¡“M}.þˆ˜nÙ@äÌÀ8ÞÄ!1ÆF€]"ŒçKv²Ì”£ÿ˜ÃRb Ý2t§%ÝÀ£,)yóxžÓ+”Ü]ÜÃBøÆ¶1w@}ø ÊŒQ K&P¢Œ%(‰C_Œ–«Q1æ2 G x½lÅÕ̘dé'åàI,grdù¦ ª9XÈ ȼesÌ1Rœ85, š+kÀ´Q+=²ü‚|P2‚b?¥t sªúÜÉ×Tû¹wUi¬²ùÔíë¸ qe²® Î([FÎÄe‡‡ÑlŒMkÙ[ÇX}–÷ı<ó¿ÕÏÖÈi&cÌÆÐÿ¾•YŽ/ŽÝ;hÖ ™N3YÖNÉɦªcgy~(KjP#f¦Ê~£0¦´ åήþQ5¶L d‡R‡—w3eå-ß ö\¦¨þЬÊò -ªåÊUeë)vò5Õ‰,“ìÐXåâ¨jÌöuÊ!­p–­ƒªÎ™Ñ›êrA­¶>Y•ílÇ~;ä4“1f“Ð M·ò3ØfIô9oŸY7^:ÍdY;('›¢˜ÚˆÉ H‰€¬b~ f.k£ºÇŒ “å*.‹ÌUb>B —2I‘©šÊªÝRô¹Õ3תeÀ¶Y*>”ù…ªoX™²Rþ%¦B'! ÷®”ÆÊúTUév˽V9¤ÆÔFÁg”g£°°t)jŒMu¹ ¶ÅãÈr¨º‰ûíÓLƘMB·Ãܹsçár¿)nnýyăƒƒTdÌÚ ÀrÓÓLŸüô;÷E\ÞY–5Uÿ×·Ÿùß¿ñy}Po}÷ÉÞe[/À™øxùí0ˆ4e+aÁo?Á@%Ls”7ª<œ’§`'YaU´Ÿþ€˜nhõÜš‹– Ç&qby5Q:LÑ·¸#ƒÁ(YùȽ+¥±Ê>YUºÝr¯Ui…Ñ[KÑž+Vº5ÆÝVmØ#Ë!M!ήc¿Â'*?Bf2ÆlÇÇÇú}ŸýýýÓÓSç›Ö–Å_{ü÷òx¶Ì9&³ž(¤Üô4Ó׿õ»š‹eY3ô\Q²S79òD¿ˆ310΢zéôý{áOhÁ¸Lð¶#Ø`–ày5ożC9V5ßʪh9²[Š3jõܺºblR檾õל¾Å®'‚Q²rhÌÞ•ÒXeŸ¬*Ýn¹×*‡ªËÒW¬:MiŒMk¹Ø6®y¿â@œ]Ç~;ä4“1fó8???88¸³ }p;Ó´–hƒðdÿìì,U³flM<ùñG¤[3,Ëš-ÝÙôüÉ¿øÙ7³7Ú‹¿ÁT½¥…?`Ê›¤óðã«©½óûPÕ±˜w™§¨†ñUÑrd·nõܺšJ`“2¿Põ=”Sô U28‘hœipï2i¬²OV•´Ük•CÕeéˆ+Ö™&4Ʀµ\l[n_«ªN¡c¿§(/«œf2Ælççç¼_&½6kwÇÙ%³þðbòo3Y–µËB0Ü éõc@ûÅO)ebþ”?ŒJ|ï™§Zaö¤<o’üÕÊYtÒœrYNièj²¬º\ô¡œxÕ7-—îÿ’äs64-ýay™7ÉÔÙ»Lr ì“UÙ\T²õ<ûð•j9¤.«ªbú¦?Íñ6åQgy¹}­rˆÉ»l5pø[öÛ!§™Œ1Ƴë8ÍdY–žú2Uæ‹Gï \/“ ­¤† Lg´r“òãó_ðf#»¥ØsY.µ†Ž3åô¡\äªo4o.ƒ}¶øô'[y-Q,Ÿºw™´h¥%«²¹¨´Ö¹ìjüæRL÷ôoSn)Ë[öPÕŒŽÂr‰¶FN3cŒ1f×qšÉ²,kð ÆÒ@÷ 1qpðÜžl(†Öerb'0èÄØLBÁ K‚´òôÈ1 ŽÅé´bûÖ-3ÊqT'Bé^•ÌU–—‹)û¬¼å—«ì‡å­•öp /Ys+3ö.J{Qæk¦nÄA±*Q[mîÉÛ÷U ¡´ÊFg?ýœÔšMMضµ¨½xôN,×ÑÊN是 n´œf2ÆcÌ®ã4“eY;.¦@*S(dŒ ”Pâ Þ—ÔʰP °Ë‡Ä@v»S«íùe>h{øâ=à9Ó%ÊdiŽÁá`Ë3±[<*%Á†èìÃWdF¡U-ªÉ”Gh\]aL|ÑÍãZ­ANÊrÆÞEiqJcÍ¥µžåÖ« ŽÜÆK¸Ís¨ÍU-„'(„YìDk¥¶¥ÆØ@Ø…Å€Í8"¦‰áð„…1ýqyž¨êôý ­dIÅ‹Õ`ÿ¥ÙæÊi&cŒ1Æì:/¼üë¼úû¿ûFv©dY–µõbT•ÝÌ‚—™“ ˆ–ñ$«‚²ø?Š6”ê3’ºÊœTª‹Bol¸öGïx³<™Ÿš`Ö­†Ë¦Ìù¶”u¡$› œiùК2…†™ÔIIЙlâÐ,™±wR6_ô£¥nÍ%k3–Kl(·ãê]f…¹1SƒVñeÔ¤½»V•ng¢Ÿƒ•+[–‹GïTW‰i&<òåx?i™nÞúÎ/«NÿúU§™Œ1Ƴ‹|ýÝt=ôý‡_Ê.•,˲¬Š÷ƒÜzFòV¨,Íd}ý[¿Ë˪¿:{Ïi&cŒ1Æì"o}ðû¼úà{_Ì.•,˲¬UébñOå¦,k£å4S¦Ã׋—U?ú §™Œ1Ƴ‹|û/ÿ5¯‡Þýà÷²K%˲,kíß{Z_‘ãïïøV&kËä4S¦?xå7xYõóOþ«ÓLÆcŒÙEþü‡¯ózèµ÷¾]*Y–eYËH8ðx›þœ–eA¼Gg¿^·;úÅϾÉk*èÓ_ýÒi&cŒ1Æì"?ú ^½pôÙOþnvÁdY–eÍÖÞ3O!g¾eN˲ήþA<ÏþÞêû¿Äkª/¿þÛ¸ÄršÉcŒ1;Êý×~“WE?úÛÙ“eY–µŒ¶õÏiY–Uêõoÿ3^P}û/ÿ5®¯œf2ÆcÌŽ¢_ë;{Ù“eY–eY–5¨Oþî GŸåÕÇþ×WN3cŒ1fGùÁ¿Ë«¢ûüùìšÉ²,˲,ËÔþö¯¦þàÕÏóúÊi&cŒ1Æì(Ÿþê—/¼üë¼6úÁÿ0»l²,˲,˲úzí½/ðRê­~Ÿ×WN3cŒ1fwyýOÿ¯¾òæïd—M–eY–eYVG~ü2¯£ ýÿ/®œf2ÆcÌîòèþF—G¾¡É²,˲,k¼t+ÓWþÝ?N—VN3cŒ1fÇy÷Ï^äÒý?þü§?7»~²,˲,˲Jýà‡È+(èÑ?üMº®ršÉcŒ1;Î'ÿýgú…¦Ó¿üýìʲ,˲,Ë*õ•7‡—O¯ýÇ‘.ª8ÍdŒ1Ƙ]çÛù¯yôÂÑgòñײ«(˲,˲,+êÝ~/];½üëñV&à4“1ÆcvOõËû¯ý&¯–¾ü'O|òÓ7³k)˲,˲,‹úþÃ/ñª z÷Ï^L—S—8ÍdŒ1Æó?>~ôúêÜ¿yû)ÿH“eY–eYV©Ÿ|üµŽ>›.™¾õO?ýÕ/ÓµÔ%N3cŒ1Æ<æÏø:¯™ ×¿ýϲ‹*˲,˲¬×ÏÿÛë÷ÿøó¼XºÿÚoþü“ÿš®¢N3cŒ1Æ$ôWç ×ÞûÂ/~öÍìêʲ,˲,k7õ“¿¦Ó /ÿúO~ú0]?]Åi&cŒ1Ƙħ¿úå×ßÝS¦éðõßúù{=»Æ²,˲,ËÚ5ýù~Aß•ƒþêì½tñTà4“1ÆcÌÿäÓ_ýòµÿø/tõ¯üÆÇýQv¥eY–eY–µ;Òß•ƒ^xù×;9&à4“1ÆcLÎw¿ÿ’.§ ×ÞûÂßÿÝ7²K.˲,˲¬íÖ~ø‡‡¯ÿ–®ˆî¿ö›­ïÊ §™Œ1Æc*üàÇßÕßž£¾ù§ÿü“Ÿ¾™]~Y–eY–emŸ~òñ×¾þ­ßBÿæ[ÿô“ÿþ³tÔÆi&cŒ1Ƙ:þáoâO5A/}öÝ~^Ù¥˜eY–eYÖè?ûæ_ýõ‹¯½÷…+×?/ÿú»öâ§¿úeºBêâ4“1ÆcLüø»‡Çÿ(^lA÷ÿøóo}gï?üÃìâ̲,˲,kãôÉOßüóÿüB–]¢^ÿÓõóOþkº*ÓLÆcŒ1Ã|ÿGÿþþk¿™]xI‡¯ÿÖ׿õ»ÿö?ü“ïþ§iY–eY–µæzí½/àÒ%ûZ\¦¯¿»÷èþ&] Æi&cŒ1ƘQ|ú«_~ÿGÿþõ?ýWÙo6Y–eY–em¾üúoóôü©ïN3cŒ1ÆLãÓ_ýò?þî[üþ¼úùìÊ̲,˲,kõ•÷¿ûý—fܾt…ÿñ?þ¸¶·­ QÇ¥IEND®B`‚arm-trusted-firmware-1.0-aw-6/docs/firmware-design.md000066400000000000000000002037401322600646200225470ustar00rootroot00000000000000ARM Trusted Firmware Design =========================== Contents : 1. Introduction 2. Cold boot 3. EL3 runtime services framework 4. Power State Coordination Interface 5. Secure-EL1 Payloads and Dispatchers 6. Crash Reporting in BL3-1 7. CPU specific operations framework 8. Memory layout of BL images 9. Firmware Image Package (FIP) 10. Code Structure 11. References 1. Introduction ---------------- The ARM Trusted Firmware implements a subset of the Trusted Board Boot Requirements (TBBR) Platform Design Document (PDD) [1] for ARM reference platforms. The TBB sequence starts when the platform is powered on and runs up to the stage where it hands-off control to firmware running in the normal world in DRAM. This is the cold boot path. The ARM Trusted Firmware also implements the Power State Coordination Interface ([PSCI]) PDD [2] as a runtime service. PSCI is the interface from normal world software to firmware implementing power management use-cases (for example, secondary CPU boot, hotplug and idle). Normal world software can access ARM Trusted Firmware runtime services via the ARM SMC (Secure Monitor Call) instruction. The SMC instruction must be used as mandated by the [SMC Calling Convention PDD][SMCCC] [3]. The ARM Trusted Firmware implements a framework for configuring and managing interrupts generated in either security state. The details of the interrupt management framework and its design can be found in [ARM Trusted Firmware Interrupt Management Design guide][INTRG] [4]. 2. Cold boot ------------- The cold boot path starts when the platform is physically turned on. One of the CPUs released from reset is chosen as the primary CPU, and the remaining CPUs are considered secondary CPUs. The primary CPU is chosen through platform-specific means. The cold boot path is mainly executed by the primary CPU, other than essential CPU initialization executed by all CPUs. The secondary CPUs are kept in a safe platform-specific state until the primary CPU has performed enough initialization to boot them. The cold boot path in this implementation of the ARM Trusted Firmware is divided into five steps (in order of execution): * Boot Loader stage 1 (BL1) _AP Trusted ROM_ * Boot Loader stage 2 (BL2) _Trusted Boot Firmware_ * Boot Loader stage 3-1 (BL3-1) _EL3 Runtime Firmware_ * Boot Loader stage 3-2 (BL3-2) _Secure-EL1 Payload_ (optional) * Boot Loader stage 3-3 (BL3-3) _Non-trusted Firmware_ ARM development platforms (Fixed Virtual Platforms (FVPs) and Juno) implement a combination of the following types of memory regions. Each bootloader stage uses one or more of these memory regions. * Regions accessible from both non-secure and secure states. For example, non-trusted SRAM, ROM and DRAM. * Regions accessible from only the secure state. For example, trusted SRAM and ROM. The FVPs also implement the trusted DRAM which is statically configured. Additionally, the Base FVPs and Juno development platform configure the TrustZone Controller (TZC) to create a region in the DRAM which is accessible only from the secure state. The sections below provide the following details: * initialization and execution of the first three stages during cold boot * specification of the BL3-1 entrypoint requirements for use by alternative Trusted Boot Firmware in place of the provided BL1 and BL2 * changes in BL3-1 behavior when using the `RESET_TO_BL31` option which allows BL3-1 to run without BL1 and BL2 ### BL1 This stage begins execution from the platform's reset vector at EL3. The reset address is platform dependent but it is usually located in a Trusted ROM area. The BL1 data section is copied to trusted SRAM at runtime. On the ARM FVP port, BL1 code starts execution from the reset vector at address `0x00000000` (trusted ROM). The BL1 data section is copied to the start of trusted SRAM at address `0x04000000`. On the Juno ARM development platform port, BL1 code starts execution at `0x0BEC0000` (FLASH). The BL1 data section is copied to trusted SRAM at address `0x04001000. The functionality implemented by this stage is as follows. #### Determination of boot path Whenever a CPU is released from reset, BL1 needs to distinguish between a warm boot and a cold boot. This is done using platform-specific mechanisms (see the `platform_get_entrypoint()` function in the [Porting Guide]). In the case of a warm boot, a CPU is expected to continue execution from a seperate entrypoint. In the case of a cold boot, the secondary CPUs are placed in a safe platform-specific state (see the `plat_secondary_cold_boot_setup()` function in the [Porting Guide]) while the primary CPU executes the remaining cold boot path as described in the following sections. #### Architectural initialization BL1 performs minimal architectural initialization as follows. * Exception vectors BL1 sets up simple exception vectors for both synchronous and asynchronous exceptions. The default behavior upon receiving an exception is to populate a status code in the general purpose register `X0` and call the `plat_report_exception()` function (see the [Porting Guide]). The status code is one of: 0x0 : Synchronous exception from Current EL with SP_EL0 0x1 : IRQ exception from Current EL with SP_EL0 0x2 : FIQ exception from Current EL with SP_EL0 0x3 : System Error exception from Current EL with SP_EL0 0x4 : Synchronous exception from Current EL with SP_ELx 0x5 : IRQ exception from Current EL with SP_ELx 0x6 : FIQ exception from Current EL with SP_ELx 0x7 : System Error exception from Current EL with SP_ELx 0x8 : Synchronous exception from Lower EL using aarch64 0x9 : IRQ exception from Lower EL using aarch64 0xa : FIQ exception from Lower EL using aarch64 0xb : System Error exception from Lower EL using aarch64 0xc : Synchronous exception from Lower EL using aarch32 0xd : IRQ exception from Lower EL using aarch32 0xe : FIQ exception from Lower EL using aarch32 0xf : System Error exception from Lower EL using aarch32 The `plat_report_exception()` implementation on the ARM FVP port programs the Versatile Express System LED register in the following format to indicate the occurence of an unexpected exception: SYS_LED[0] - Security state (Secure=0/Non-Secure=1) SYS_LED[2:1] - Exception Level (EL3=0x3, EL2=0x2, EL1=0x1, EL0=0x0) SYS_LED[7:3] - Exception Class (Sync/Async & origin). This is the value of the status code A write to the LED register reflects in the System LEDs (S6LED0..7) in the CLCD window of the FVP. BL1 does not expect to receive any exceptions other than the SMC exception. For the latter, BL1 installs a simple stub. The stub expects to receive only a single type of SMC (determined by its function ID in the general purpose register `X0`). This SMC is raised by BL2 to make BL1 pass control to BL3-1 (loaded by BL2) at EL3. Any other SMC leads to an assertion failure. * CPU initialization BL1 calls the `reset_handler()` function which in turn calls the CPU specific reset handler function (see the section: "CPU specific operations framework"). * MMU setup BL1 sets up EL3 memory translation by creating page tables to cover the first 4GB of physical address space. This covers all the memories and peripherals needed by BL1. * Control register setup - `SCTLR_EL3`. Instruction cache is enabled by setting the `SCTLR_EL3.I` bit. Alignment and stack alignment checking is enabled by setting the `SCTLR_EL3.A` and `SCTLR_EL3.SA` bits. Exception endianness is set to little-endian by clearing the `SCTLR_EL3.EE` bit. - `SCR_EL3`. The register width of the next lower exception level is set to AArch64 by setting the `SCR.RW` bit. - `CPTR_EL3`. Accesses to the `CPACR_EL1` register from EL1 or EL2, or the `CPTR_EL2` register from EL2 are configured to not trap to EL3 by clearing the `CPTR_EL3.TCPAC` bit. Access to the trace functionality is configured not to trap to EL3 by clearing the `CPTR_EL3.TTA` bit. Instructions that access the registers associated with Floating Point and Advanced SIMD execution are configured to not trap to EL3 by clearing the `CPTR_EL3.TFP` bit. #### Platform initialization BL1 enables issuing of snoop and DVM (Distributed Virtual Memory) requests from the CCI-400 slave interface corresponding to the cluster that includes the primary CPU. BL1 also initializes UART0 (PL011 console), which enables access to the `printf` family of functions in BL1. #### BL2 image load and execution BL1 execution continues as follows: 1. BL1 determines the amount of free trusted SRAM memory available by calculating the extent of its own data section, which also resides in trusted SRAM. BL1 loads a BL2 raw binary image from platform storage, at a platform-specific base address. If the BL2 image file is not present or if there is not enough free trusted SRAM the following error message is printed: "Failed to load boot loader stage 2 (BL2) firmware." If the load is successful, BL1 updates the limits of the remaining free trusted SRAM. It also populates information about the amount of trusted SRAM used by the BL2 image. The exact load location of the image is provided as a base address in the platform header. Further description of the memory layout can be found later in this document. 2. BL1 prints the following string from the primary CPU to indicate successful execution of the BL1 stage: "Booting trusted firmware boot loader stage 1" 3. BL1 passes control to the BL2 image at Secure EL1, starting from its load address. 4. BL1 also passes information about the amount of trusted SRAM used and available for use. This information is populated at a platform-specific memory address. ### BL2 BL1 loads and passes control to BL2 at Secure-EL1. BL2 is linked against and loaded at a platform-specific base address (more information can be found later in this document). The functionality implemented by BL2 is as follows. #### Architectural initialization BL2 performs minimal architectural initialization required for subsequent stages of the ARM Trusted Firmware and normal world software. It sets up Secure EL1 memory translation by creating page tables to address the first 4GB of the physical address space in a similar way to BL1. EL1 and EL0 are given access to Floating Point & Advanced SIMD registers by clearing the `CPACR.FPEN` bits. #### Platform initialization BL2 copies the information regarding the trusted SRAM populated by BL1 using a platform-specific mechanism. It calculates the limits of DRAM (main memory) to determine whether there is enough space to load the BL3-3 image. A platform defined base address is used to specify the load address for the BL3-1 image. It also defines the extents of memory available for use by the BL3-2 image. BL2 also initializes UART0 (PL011 console), which enables access to the `printf` family of functions in BL2. Platform security is initialized to allow access to controlled components. The storage abstraction layer is initialized which is used to load further bootloader images. #### BL3-0 (System Control Processor Firmware) image load Some systems have a separate System Control Processor (SCP) for power, clock, reset and system control. BL2 loads the optional BL3-0 image from platform storage into a platform-specific region of secure memory. The subsequent handling of BL3-0 is platform specific. For example, on the Juno ARM development platform port the image is transferred into SCP memory using the SCPI protocol after being loaded in the trusted SRAM memory at address `0x04009000`. The SCP executes BL3-0 and signals to the Application Processor (AP) for BL2 execution to continue. #### BL3-1 (EL3 Runtime Firmware) image load BL2 loads the BL3-1 image from platform storage into a platform-specific address in trusted SRAM. If there is not enough memory to load the image or image is missing it leads to an assertion failure. If the BL3-1 image loads successfully, BL2 updates the amount of trusted SRAM used and available for use by BL3-1. This information is populated at a platform-specific memory address. #### BL3-2 (Secure-EL1 Payload) image load BL2 loads the optional BL3-2 image from platform storage into a platform- specific region of secure memory. The image executes in the secure world. BL2 relies on BL3-1 to pass control to the BL3-2 image, if present. Hence, BL2 populates a platform-specific area of memory with the entrypoint/load-address of the BL3-2 image. The value of the Saved Processor Status Register (`SPSR`) for entry into BL3-2 is not determined by BL2, it is initialized by the Secure-EL1 Payload Dispatcher (see later) within BL3-1, which is responsible for managing interaction with BL3-2. This information is passed to BL3-1. #### BL3-3 (Non-trusted Firmware) image load BL2 loads the BL3-3 image (e.g. UEFI or other test or boot software) from platform storage into non-secure memory as defined by the platform. BL2 relies on BL3-1 to pass control to BL3-3 once secure state initialization is complete. Hence, BL2 populates a platform-specific area of memory with the entrypoint and Saved Program Status Register (`SPSR`) of the normal world software image. The entrypoint is the load address of the BL3-3 image. The `SPSR` is determined as specified in Section 5.13 of the [PSCI PDD] [PSCI]. This information is passed to BL3-1. #### BL3-1 (EL3 Runtime Firmware) execution BL2 execution continues as follows: 1. BL2 passes control back to BL1 by raising an SMC, providing BL1 with the BL3-1 entrypoint. The exception is handled by the SMC exception handler installed by BL1. 2. BL1 turns off the MMU and flushes the caches. It clears the `SCTLR_EL3.M/I/C` bits, flushes the data cache to the point of coherency and invalidates the TLBs. 3. BL1 passes control to BL3-1 at the specified entrypoint at EL3. ### BL3-1 The image for this stage is loaded by BL2 and BL1 passes control to BL3-1 at EL3. BL3-1 executes solely in trusted SRAM. BL3-1 is linked against and loaded at a platform-specific base address (more information can be found later in this document). The functionality implemented by BL3-1 is as follows. #### Architectural initialization Currently, BL3-1 performs a similar architectural initialization to BL1 as far as system register settings are concerned. Since BL1 code resides in ROM, architectural initialization in BL3-1 allows override of any previous initialization done by BL1. BL3-1 creates page tables to address the first 4GB of physical address space and initializes the MMU accordingly. It initializes a buffer of frequently used pointers, called per-CPU pointer cache, in memory for faster access. Currently the per-CPU pointer cache contains only the pointer to crash stack. It then replaces the exception vectors populated by BL1 with its own. BL3-1 exception vectors implement more elaborate support for handling SMCs since this is the only mechanism to access the runtime services implemented by BL3-1 (PSCI for example). BL3-1 checks each SMC for validity as specified by the [SMC calling convention PDD][SMCCC] before passing control to the required SMC handler routine. BL3-1 programs the `CNTFRQ_EL0` register with the clock frequency of the system counter, which is provided by the platform. #### Platform initialization BL3-1 performs detailed platform initialization, which enables normal world software to function correctly. It also retrieves entrypoint information for the BL3-3 image loaded by BL2 from the platform defined memory address populated by BL2. BL3-1 also initializes UART0 (PL011 console), which enables access to the `printf` family of functions in BL3-1. It enables the system level implementation of the generic timer through the memory mapped interface. * GICv2 initialization: - Enable group0 interrupts in the GIC CPU interface. - Configure group0 interrupts to be asserted as FIQs. - Disable the legacy interrupt bypass mechanism. - Configure the priority mask register to allow interrupts of all priorities to be signaled to the CPU interface. - Mark SGIs 8-15, the secure physical timer interrupt (#29) and the trusted watchdog interrupt (#56) as group0 (secure). - Target the trusted watchdog interrupt to CPU0. - Enable these group0 interrupts in the GIC distributor. - Configure all other interrupts as group1 (non-secure). - Enable signaling of group0 interrupts in the GIC distributor. * GICv3 initialization: If a GICv3 implementation is available in the platform, BL3-1 initializes the GICv3 in GICv2 emulation mode with settings as described for GICv2 above. * Power management initialization: BL3-1 implements a state machine to track CPU and cluster state. The state can be one of `OFF`, `ON_PENDING`, `SUSPEND` or `ON`. All secondary CPUs are initially in the `OFF` state. The cluster that the primary CPU belongs to is `ON`; any other cluster is `OFF`. BL3-1 initializes the data structures that implement the state machine, including the locks that protect them. BL3-1 accesses the state of a CPU or cluster immediately after reset and before the MMU is enabled in the warm boot path. It is not currently possible to use 'exclusive' based spinlocks, therefore BL3-1 uses locks based on Lamport's Bakery algorithm instead. BL3-1 allocates these locks in device memory. They are accessible irrespective of MMU state. * Runtime services initialization: The runtime service framework and its initialization is described in the "EL3 runtime services framework" section below. Details about the PSCI service are provided in the "Power State Coordination Interface" section below. * BL3-2 (Secure-EL1 Payload) image initialization If a BL3-2 image is present then there must be a matching Secure-EL1 Payload Dispatcher (SPD) service (see later for details). During initialization that service must register a function to carry out initialization of BL3-2 once the runtime services are fully initialized. BL3-1 invokes such a registered function to initialize BL3-2 before running BL3-3. Details on BL3-2 initialization and the SPD's role are described in the "Secure-EL1 Payloads and Dispatchers" section below. * BL3-3 (Non-trusted Firmware) execution BL3-1 initializes the EL2 or EL1 processor context for normal-world cold boot, ensuring that no secure state information finds its way into the non-secure execution state. BL3-1 uses the entrypoint information provided by BL2 to jump to the Non-trusted firmware image (BL3-3) at the highest available Exception Level (EL2 if available, otherwise EL1). ### Using alternative Trusted Boot Firmware in place of BL1 and BL2 Some platforms have existing implementations of Trusted Boot Firmware that would like to use ARM Trusted Firmware BL3-1 for the EL3 Runtime Firmware. To enable this firmware architecture it is important to provide a fully documented and stable interface between the Trusted Boot Firmware and BL3-1. Future changes to the BL3-1 interface will be done in a backwards compatible way, and this enables these firmware components to be independently enhanced/ updated to develop and exploit new functionality. #### Required CPU state when calling `bl31_entrypoint()` during cold boot This function must only be called by the primary CPU, if this is called by any other CPU the firmware will abort. On entry to this function the calling primary CPU must be executing in AArch64 EL3, little-endian data access, and all interrupt sources masked: PSTATE.EL = 3 PSTATE.RW = 1 PSTATE.DAIF = 0xf CTLR_EL3.EE = 0 X0 and X1 can be used to pass information from the Trusted Boot Firmware to the platform code in BL3-1: X0 : Reserved for common Trusted Firmware information X1 : Platform specific information BL3-1 zero-init sections (e.g. `.bss`) should not contain valid data on entry, these will be zero filled prior to invoking platform setup code. ##### Use of the X0 and X1 parameters The parameters are platform specific and passed from `bl31_entrypoint()` to `bl31_early_platform_setup()`. The value of these parameters is never directly used by the common BL3-1 code. The convention is that `X0` conveys information regarding the BL3-1, BL3-2 and BL3-3 images from the Trusted Boot firmware and `X1` can be used for other platform specific purpose. This convention allows platforms which use ARM Trusted Firmware's BL1 and BL2 images to transfer additional platform specific information from Secure Boot without conflicting with future evolution of the Trusted Firmware using `X0` to pass a `bl31_params` structure. BL3-1 common and SPD initialization code depends on image and entrypoint information about BL3-3 and BL3-2, which is provided via BL3-1 platform APIs. This information is required until the start of execution of BL3-3. This information can be provided in a platform defined manner, e.g. compiled into the platform code in BL3-1, or provided in a platform defined memory location by the Trusted Boot firmware, or passed from the Trusted Boot Firmware via the Cold boot Initialization parameters. This data may need to be cleaned out of the CPU caches if it is provided by an earlier boot stage and then accessed by BL3-1 platform code before the caches are enabled. ARM Trusted Firmware's BL2 implementation passes a `bl31_params` structure in `X0` and the FVP port interprets this in the BL3-1 platform code. ##### MMU, Data caches & Coherency BL3-1 does not depend on the enabled state of the MMU, data caches or interconnect coherency on entry to `bl31_entrypoint()`. If these are disabled on entry, these should be enabled during `bl31_plat_arch_setup()`. ##### Data structures used in the BL3-1 cold boot interface These structures are designed to support compatibility and independent evolution of the structures and the firmware images. For example, a version of BL3-1 that can interpret the BL3-x image information from different versions of BL2, a platform that uses an extended entry_point_info structure to convey additional register information to BL3-1, or a ELF image loader that can convey more details about the firmware images. To support these scenarios the structures are versioned and sized, which enables BL3-1 to detect which information is present and respond appropriately. The `param_header` is defined to capture this information: typedef struct param_header { uint8_t type; /* type of the structure */ uint8_t version; /* version of this structure */ uint16_t size; /* size of this structure in bytes */ uint32_t attr; /* attributes: unused bits SBZ */ } param_header_t; The structures using this format are `entry_point_info`, `image_info` and `bl31_params`. The code that allocates and populates these structures must set the header fields appropriately, and the `SET_PARA_HEAD()` a macro is defined to simplify this action. #### Required CPU state for BL3-1 Warm boot initialization When requesting a CPU power-on, or suspending a running CPU, ARM Trusted Firmware provides the platform power management code with a Warm boot initialization entry-point, to be invoked by the CPU immediately after the reset handler. On entry to the Warm boot initialization function the calling CPU must be in AArch64 EL3, little-endian data access and all interrupt sources masked: PSTATE.EL = 3 PSTATE.RW = 1 PSTATE.DAIF = 0xf SCTLR_EL3.EE = 0 The PSCI implementation will initialize the processor state and ensure that the platform power management code is then invoked as required to initialize all necessary system, cluster and CPU resources. ### Using BL3-1 as the CPU reset vector On some platforms the runtime firmware (BL3-x images) for the application processors are loaded by trusted firmware running on a secure system processor on the SoC, rather than by BL1 and BL2 running on the primary application processor. For this type of SoC it is desirable for the application processor to always reset to BL3-1 which eliminates the need for BL1 and BL2. ARM Trusted Firmware provides a build-time option `RESET_TO_BL31` that includes some additional logic in the BL3-1 entrypoint to support this use case. In this configuration, the platform's Trusted Boot Firmware must ensure that BL3-1 is loaded to its runtime address, which must match the CPU's RVBAR reset vector address, before the application processor is powered on. Additionally, platform software is responsible for loading the other BL3-x images required and providing entry point information for them to BL3-1. Loading these images might be done by the Trusted Boot Firmware or by platform code in BL3-1. The ARM FVP port supports the `RESET_TO_BL31` configuration, in which case the `bl31.bin` image must be loaded to its run address in Trusted SRAM and all CPU reset vectors be changed from the default `0x0` to this run address. See the [User Guide] for details of running the FVP models in this way. This configuration requires some additions and changes in the BL3-1 functionality: #### Determination of boot path In this configuration, BL3-1 uses the same reset framework and code as the one described for BL1 above. On a warm boot a CPU is directed to the PSCI implementation via a platform defined mechanism. On a cold boot, the platform must place any secondary CPUs into a safe state while the primary CPU executes a modified BL3-1 initialization, as described below. #### Architectural initialization As the first image to execute in this configuration BL3-1 must ensure that interconnect coherency is enabled (if required) before enabling the MMU. #### Platform initialization In this configuration, when the CPU resets to BL3-1 there are no parameters that can be passed in registers by previous boot stages. Instead, the platform code in BL3-1 needs to know, or be able to determine, the location of the BL3-2 (if required) and BL3-3 images and provide this information in response to the `bl31_plat_get_next_image_ep_info()` function. As the first image to execute in this configuration BL3-1 must also ensure that any security initialisation, for example programming a TrustZone address space controller, is carried out during early platform initialisation. 3. EL3 runtime services framework ---------------------------------- Software executing in the non-secure state and in the secure state at exception levels lower than EL3 will request runtime services using the Secure Monitor Call (SMC) instruction. These requests will follow the convention described in the SMC Calling Convention PDD ([SMCCC]). The [SMCCC] assigns function identifiers to each SMC request and describes how arguments are passed and returned. The EL3 runtime services framework enables the development of services by different providers that can be easily integrated into final product firmware. The following sections describe the framework which facilitates the registration, initialization and use of runtime services in EL3 Runtime Firmware (BL3-1). The design of the runtime services depends heavily on the concepts and definitions described in the [SMCCC], in particular SMC Function IDs, Owning Entity Numbers (OEN), Fast and Standard calls, and the SMC32 and SMC64 calling conventions. Please refer to that document for more detailed explanation of these terms. The following runtime services are expected to be implemented first. They have not all been instantiated in the current implementation. 1. Standard service calls This service is for management of the entire system. The Power State Coordination Interface ([PSCI]) is the first set of standard service calls defined by ARM (see PSCI section later). NOTE: Currently this service is called PSCI since there are no other defined standard service calls. 2. Secure-EL1 Payload Dispatcher service If a system runs a Trusted OS or other Secure-EL1 Payload (SP) then it also requires a _Secure Monitor_ at EL3 to switch the EL1 processor context between the normal world (EL1/EL2) and trusted world (Secure-EL1). The Secure Monitor will make these world switches in response to SMCs. The [SMCCC] provides for such SMCs with the Trusted OS Call and Trusted Application Call OEN ranges. The interface between the EL3 Runtime Firmware and the Secure-EL1 Payload is not defined by the [SMCCC] or any other standard. As a result, each Secure-EL1 Payload requires a specific Secure Monitor that runs as a runtime service - within ARM Trusted Firmware this service is referred to as the Secure-EL1 Payload Dispatcher (SPD). ARM Trusted Firmware provides a Test Secure-EL1 Payload (TSP) and its associated Dispatcher (TSPD). Details of SPD design and TSP/TSPD operation are described in the "Secure-EL1 Payloads and Dispatchers" section below. 3. CPU implementation service This service will provide an interface to CPU implementation specific services for a given platform e.g. access to processor errata workarounds. This service is currently unimplemented. Additional services for ARM Architecture, SiP and OEM calls can be implemented. Each implemented service handles a range of SMC function identifiers as described in the [SMCCC]. ### Registration A runtime service is registered using the `DECLARE_RT_SVC()` macro, specifying the name of the service, the range of OENs covered, the type of service and initialization and call handler functions. This macro instantiates a `const struct rt_svc_desc` for the service with these details (see `runtime_svc.h`). This structure is allocated in a special ELF section `rt_svc_descs`, enabling the framework to find all service descriptors included into BL3-1. The specific service for a SMC Function is selected based on the OEN and call type of the Function ID, and the framework uses that information in the service descriptor to identify the handler for the SMC Call. The service descriptors do not include information to identify the precise set of SMC function identifiers supported by this service implementation, the security state from which such calls are valid nor the capability to support 64-bit and/or 32-bit callers (using SMC32 or SMC64). Responding appropriately to these aspects of a SMC call is the responsibility of the service implementation, the framework is focused on integration of services from different providers and minimizing the time taken by the framework before the service handler is invoked. Details of the parameters, requirements and behavior of the initialization and call handling functions are provided in the following sections. ### Initialization `runtime_svc_init()` in `runtime_svc.c` initializes the runtime services framework running on the primary CPU during cold boot as part of the BL3-1 initialization. This happens prior to initializing a Trusted OS and running Normal world boot firmware that might in turn use these services. Initialization involves validating each of the declared runtime service descriptors, calling the service initialization function and populating the index used for runtime lookup of the service. The BL3-1 linker script collects all of the declared service descriptors into a single array and defines symbols that allow the framework to locate and traverse the array, and determine its size. The framework does basic validation of each descriptor to halt firmware initialization if service declaration errors are detected. The framework does not check descriptors for the following error conditions, and may behave in an unpredictable manner under such scenarios: 1. Overlapping OEN ranges 2. Multiple descriptors for the same range of OENs and `call_type` 3. Incorrect range of owning entity numbers for a given `call_type` Once validated, the service `init()` callback is invoked. This function carries out any essential EL3 initialization before servicing requests. The `init()` function is only invoked on the primary CPU during cold boot. If the service uses per-CPU data this must either be initialized for all CPUs during this call, or be done lazily when a CPU first issues an SMC call to that service. If `init()` returns anything other than `0`, this is treated as an initialization error and the service is ignored: this does not cause the firmware to halt. The OEN and call type fields present in the SMC Function ID cover a total of 128 distinct services, but in practice a single descriptor can cover a range of OENs, e.g. SMCs to call a Trusted OS function. To optimize the lookup of a service handler, the framework uses an array of 128 indices that map every distinct OEN/call-type combination either to one of the declared services or to indicate the service is not handled. This `rt_svc_descs_indices[]` array is populated for all of the OENs covered by a service after the service `init()` function has reported success. So a service that fails to initialize will never have it's `handle()` function invoked. The following figure shows how the `rt_svc_descs_indices[]` index maps the SMC Function ID call type and OEN onto a specific service handler in the `rt_svc_descs[]` array. ![Image 1](diagrams/rt-svc-descs-layout.png?raw=true) ### Handling an SMC When the EL3 runtime services framework receives a Secure Monitor Call, the SMC Function ID is passed in W0 from the lower exception level (as per the [SMCCC]). If the calling register width is AArch32, it is invalid to invoke an SMC Function which indicates the SMC64 calling convention: such calls are ignored and return the Unknown SMC Function Identifier result code `0xFFFFFFFF` in R0/X0. Bit[31] (fast/standard call) and bits[29:24] (owning entity number) of the SMC Function ID are combined to index into the `rt_svc_descs_indices[]` array. The resulting value might indicate a service that has no handler, in this case the framework will also report an Unknown SMC Function ID. Otherwise, the value is used as a further index into the `rt_svc_descs[]` array to locate the required service and handler. The service's `handle()` callback is provided with five of the SMC parameters directly, the others are saved into memory for retrieval (if needed) by the handler. The handler is also provided with an opaque `handle` for use with the supporting library for parameter retrieval, setting return values and context manipulation; and with `flags` indicating the security state of the caller. The framework finally sets up the execution stack for the handler, and invokes the services `handle()` function. On return from the handler the result registers are populated in X0-X3 before restoring the stack and CPU state and returning from the original SMC. 4. Power State Coordination Interface -------------------------------------- TODO: Provide design walkthrough of PSCI implementation. The complete PSCI API is not yet implemented. The following functions are currently implemented: - `PSCI_VERSION` - `CPU_OFF` - `CPU_ON` - `CPU_SUSPEND` - `AFFINITY_INFO` - `SYSTEM_OFF` - `SYSTEM_RESET` The `CPU_ON`, `CPU_OFF` and `CPU_SUSPEND` functions implement the warm boot path in ARM Trusted Firmware. `CPU_ON` and `CPU_OFF` have undergone testing on all the supported FVPs. `CPU_SUSPEND` & `AFFINITY_INFO` have undergone testing only on the AEM v8 Base FVP. Support for `AFFINITY_INFO` is still experimental. Support for `CPU_SUSPEND` is stable for entry into power down states. Standby states are currently not supported. `PSCI_VERSION` is present but completely untested in this version of the software. The following unsupported functions return with a error code as documented in the [Power State Coordination Interface PDD] [PSCI]. - `MIGRATE` : -1 (NOT_SUPPORTED) - `MIGRATE_INFO_TYPE` : 2 (Trusted OS is either not present or does not require migration) - `MIGRATE_INFO_UP_CPU` : 0 (Return value is UNDEFINED) 5. Secure-EL1 Payloads and Dispatchers --------------------------------------- On a production system that includes a Trusted OS running in Secure-EL1/EL0, the Trusted OS is coupled with a companion runtime service in the BL3-1 firmware. This service is responsible for the initialisation of the Trusted OS and all communications with it. The Trusted OS is the BL3-2 stage of the boot flow in ARM Trusted Firmware. The firmware will attempt to locate, load and execute a BL3-2 image. ARM Trusted Firmware uses a more general term for the BL3-2 software that runs at Secure-EL1 - the _Secure-EL1 Payload_ - as it is not always a Trusted OS. The ARM Trusted Firmware provides a Test Secure-EL1 Payload (TSP) and a Test Secure-EL1 Payload Dispatcher (TSPD) service as an example of how a Trusted OS is supported on a production system using the Runtime Services Framework. On such a system, the Test BL3-2 image and service are replaced by the Trusted OS and its dispatcher service. The TSP runs in Secure-EL1. It is designed to demonstrate synchronous communication with the normal-world software running in EL1/EL2. Communication is initiated by the normal-world software * either directly through a Fast SMC (as defined in the [SMCCC]) * or indirectly through a [PSCI] SMC. The [PSCI] implementation in turn informs the TSPD about the requested power management operation. This allows the TSP to prepare for or respond to the power state change The TSPD service is responsible for. * Initializing the TSP * Routing requests and responses between the secure and the non-secure states during the two types of communications just described ### Initializing a BL3-2 Image The Secure-EL1 Payload Dispatcher (SPD) service is responsible for initializing the BL3-2 image. It needs access to the information passed by BL2 to BL3-1 to do so. This is provided by: entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t); which returns a reference to the `entry_point_info` structure corresponding to the image which will be run in the specified security state. The SPD uses this API to get entry point information for the SECURE image, BL3-2. In the absence of a BL3-2 image, BL3-1 passes control to the normal world bootloader image (BL3-3). When the BL3-2 image is present, it is typical that the SPD wants control to be passed to BL3-2 first and then later to BL3-3. To do this the SPD has to register a BL3-2 initialization function during initialization of the SPD service. The BL3-2 initialization function has this prototype: int32_t init(); and is registered using the `bl31_register_bl32_init()` function. Trusted Firmware supports two approaches for the SPD to pass control to BL3-2 before returning through EL3 and running the non-trusted firmware (BL3-3): 1. In the BL3-2 setup function, use `bl31_set_next_image_type()` to request that the exit from `bl31_main()` is to the BL3-2 entrypoint in Secure-EL1. BL3-1 will exit to BL3-2 using the asynchronous method by calling bl31_prepare_next_image_entry() and el3_exit(). When the BL3-2 has completed initialization at Secure-EL1, it returns to BL3-1 by issuing an SMC, using a Function ID allocated to the SPD. On receipt of this SMC, the SPD service handler should switch the CPU context from trusted to normal world and use the `bl31_set_next_image_type()` and `bl31_prepare_next_image_entry()` functions to set up the initial return to the normal world firmware BL3-3. On return from the handler the framework will exit to EL2 and run BL3-3. 2. The BL3-2 setup function registers a initialization function using `bl31_register_bl32_init()` which provides a SPD-defined mechanism to invoke a 'world-switch synchronous call' to Secure-EL1 to run the BL3-2 entrypoint. NOTE: The Test SPD service included with the Trusted Firmware provides one implementation of such a mechanism. On completion BL3-2 returns control to BL3-1 via a SMC, and on receipt the SPD service handler invokes the synchronous call return mechanism to return to the BL3-2 initialization function. On return from this function, `bl31_main()` will set up the return to the normal world firmware BL3-3 and continue the boot process in the normal world. 6. Crash Reporting in BL3-1 ---------------------------- The BL3-1 implements a scheme for reporting the processor state when an unhandled exception is encountered. The reporting mechanism attempts to preserve all the register contents and report it via the default serial output. The general purpose registers, EL3, Secure EL1 and some EL2 state registers are reported. A dedicated per-CPU crash stack is maintained by BL3-1 and this is retrieved via the per-CPU pointer cache. The implementation attempts to minimise the memory required for this feature. The file `crash_reporting.S` contains the implementation for crash reporting. The sample crash output is shown below. x0 :0x000000004F00007C x1 :0x0000000007FFFFFF x2 :0x0000000004014D50 x3 :0x0000000000000000 x4 :0x0000000088007998 x5 :0x00000000001343AC x6 :0x0000000000000016 x7 :0x00000000000B8A38 x8 :0x00000000001343AC x9 :0x00000000000101A8 x10 :0x0000000000000002 x11 :0x000000000000011C x12 :0x00000000FEFDC644 x13 :0x00000000FED93FFC x14 :0x0000000000247950 x15 :0x00000000000007A2 x16 :0x00000000000007A4 x17 :0x0000000000247950 x18 :0x0000000000000000 x19 :0x00000000FFFFFFFF x20 :0x0000000004014D50 x21 :0x000000000400A38C x22 :0x0000000000247950 x23 :0x0000000000000010 x24 :0x0000000000000024 x25 :0x00000000FEFDC868 x26 :0x00000000FEFDC86A x27 :0x00000000019EDEDC x28 :0x000000000A7CFDAA x29 :0x0000000004010780 x30 :0x000000000400F004 scr_el3 :0x0000000000000D3D sctlr_el3 :0x0000000000C8181F cptr_el3 :0x0000000000000000 tcr_el3 :0x0000000080803520 daif :0x00000000000003C0 mair_el3 :0x00000000000004FF spsr_el3 :0x00000000800003CC elr_el3 :0x000000000400C0CC ttbr0_el3 :0x00000000040172A0 esr_el3 :0x0000000096000210 sp_el3 :0x0000000004014D50 far_el3 :0x000000004F00007C spsr_el1 :0x0000000000000000 elr_el1 :0x0000000000000000 spsr_abt :0x0000000000000000 spsr_und :0x0000000000000000 spsr_irq :0x0000000000000000 spsr_fiq :0x0000000000000000 sctlr_el1 :0x0000000030C81807 actlr_el1 :0x0000000000000000 cpacr_el1 :0x0000000000300000 csselr_el1 :0x0000000000000002 sp_el1 :0x0000000004028800 esr_el1 :0x0000000000000000 ttbr0_el1 :0x000000000402C200 ttbr1_el1 :0x0000000000000000 mair_el1 :0x00000000000004FF amair_el1 :0x0000000000000000 tcr_el1 :0x0000000000003520 tpidr_el1 :0x0000000000000000 tpidr_el0 :0x0000000000000000 tpidrro_el0 :0x0000000000000000 dacr32_el2 :0x0000000000000000 ifsr32_el2 :0x0000000000000000 par_el1 :0x0000000000000000 far_el1 :0x0000000000000000 afsr0_el1 :0x0000000000000000 afsr1_el1 :0x0000000000000000 contextidr_el1 :0x0000000000000000 vbar_el1 :0x0000000004027000 cntp_ctl_el0 :0x0000000000000000 cntp_cval_el0 :0x0000000000000000 cntv_ctl_el0 :0x0000000000000000 cntv_cval_el0 :0x0000000000000000 cntkctl_el1 :0x0000000000000000 fpexc32_el2 :0x0000000004000700 sp_el0 :0x0000000004010780 7. CPU specific operations framework ----------------------------- Certain aspects of the ARMv8 architecture are implementation defined, that is, certain behaviours are not architecturally defined, but must be defined and documented by individual processor implementations. The ARM Trusted Firmware implements a framework which categorises the common implementation defined behaviours and allows a processor to export its implementation of that behaviour. The categories are: 1. Processor specific reset sequence. 2. Processor specific power down sequences. 3. Processor specific register dumping as a part of crash reporting. Each of the above categories fulfils a different requirement. 1. allows any processor specific initialization before the caches and MMU are turned on, like implementation of errata workarounds, entry into the intra-cluster coherency domain etc. 2. allows each processor to implement the power down sequence mandated in its Technical Reference Manual (TRM). 3. allows a processor to provide additional information to the developer in the event of a crash, for example Cortex-A53 has registers which can expose the data cache contents. Please note that only 2. is mandated by the TRM. The CPU specific operations framework scales to accommodate a large number of different CPUs during power down and reset handling. The platform can specify the CPU errata workarounds to be applied for each CPU type during reset handling by defining CPU errata compile time macros. Details on these macros can be found in the [cpu-errata-workarounds.md][ERRW] file. The CPU specific operations framework depends on the `cpu_ops` structure which needs to be exported for each type of CPU in the platform. It is defined in `include/lib/cpus/aarch64/cpu_macros.S` and has the following fields : `midr`, `reset_func()`, `core_pwr_dwn()`, `cluster_pwr_dwn()` and `cpu_reg_dump()`. The CPU specific files in `lib/cpus` export a `cpu_ops` data structure with suitable handlers for that CPU. For example, `lib/cpus/cortex_a53.S` exports the `cpu_ops` for Cortex-A53 CPU. According to the platform configuration, these CPU specific files must must be included in the build by the platform makefile. The generic CPU specific operations framework code exists in `lib/cpus/aarch64/cpu_helpers.S`. ### CPU specific Reset Handling After a reset, the state of the CPU when it calls generic reset handler is: MMU turned off, both instruction and data caches turned off and not part of any coherency domain. The BL entrypoint code first invokes the `plat_reset_handler()` to allow the platform to perform any system initialization required and any system errata wrokarounds that needs to be applied. The `get_cpu_ops_ptr()` reads the current CPU midr, finds the matching `cpu_ops` entry in the `cpu_ops` array and returns it. Note that only the part number and implementator fields in midr are used to find the matching `cpu_ops` entry. The `reset_func()` in the returned `cpu_ops` is then invoked which executes the required reset handling for that CPU and also any errata workarounds enabled by the platform. ### CPU specific power down sequence During the BL3-1 initialization sequence, the pointer to the matching `cpu_ops` entry is stored in per-CPU data by `init_cpu_ops()` so that it can be quickly retrieved during power down sequences. The PSCI service, upon receiving a power down request, determines the highest affinity level at which to execute power down sequence for a particular CPU and invokes the corresponding 'prepare' power down handler in the CPU specific operations framework. For example, when a CPU executes a power down for affinity level 0, the `prepare_core_pwr_dwn()` retrieves the `cpu_ops` pointer from the per-CPU data and the corresponding `core_pwr_dwn()` is invoked. Similarly when a CPU executes power down at affinity level 1, the `prepare_cluster_pwr_dwn()` retrieves the `cpu_ops` pointer and the corresponding `cluster_pwr_dwn()` is invoked. At runtime the platform hooks for power down are invoked by the PSCI service to perform platform specific operations during a power down sequence, for example turning off CCI coherency during a cluster power down. ### CPU specific register reporting during crash If the crash reporting is enabled in BL3-1, when a crash occurs, the crash reporting framework calls `do_cpu_reg_dump` which retrieves the matching `cpu_ops` using `get_cpu_ops_ptr()` function. The `cpu_reg_dump()` in `cpu_ops` is invoked, which then returns the CPU specific register values to be reported and a pointer to the ASCII list of register names in a format expected by the crash reporting framework. 8. Memory layout of BL images ----------------------------- Each bootloader image can be divided in 2 parts: * the static contents of the image. These are data actually stored in the binary on the disk. In the ELF terminology, they are called `PROGBITS` sections; * the run-time contents of the image. These are data that don't occupy any space in the binary on the disk. The ELF binary just contains some metadata indicating where these data will be stored at run-time and the corresponding sections need to be allocated and initialized at run-time. In the ELF terminology, they are called `NOBITS` sections. All PROGBITS sections are grouped together at the beginning of the image, followed by all NOBITS sections. This is true for all Trusted Firmware images and it is governed by the linker scripts. This ensures that the raw binary images are as small as possible. If a NOBITS section would sneak in between PROGBITS sections then the resulting binary file would contain a bunch of zero bytes at the location of this NOBITS section, making the image unnecessarily bigger. Smaller images allow faster loading from the FIP to the main memory. ### Linker scripts and symbols Each bootloader stage image layout is described by its own linker script. The linker scripts export some symbols into the program symbol table. Their values correspond to particular addresses. The trusted firmware code can refer to these symbols to figure out the image memory layout. Linker symbols follow the following naming convention in the trusted firmware. * `__

_START__` Start address of a given section named `
`. * `__
_END__` End address of a given section named `
`. If there is an alignment constraint on the section's end address then `__
_END__` corresponds to the end address of the section's actual contents, rounded up to the right boundary. Refer to the value of `__
_UNALIGNED_END__` to know the actual end address of the section's contents. * `__
_UNALIGNED_END__` End address of a given section named `
` without any padding or rounding up due to some alignment constraint. * `__
_SIZE__` Size (in bytes) of a given section named `
`. If there is an alignment constraint on the section's end address then `__
_SIZE__` corresponds to the size of the section's actual contents, rounded up to the right boundary. In other words, `__
_SIZE__ = __
_END__ - _
_START__`. Refer to the value of `__
_UNALIGNED_SIZE__` to know the actual size of the section's contents. * `__
_UNALIGNED_SIZE__` Size (in bytes) of a given section named `
` without any padding or rounding up due to some alignment constraint. In other words, `__
_UNALIGNED_SIZE__ = __
_UNALIGNED_END__ - __
_START__`. Some of the linker symbols are mandatory as the trusted firmware code relies on them to be defined. They are listed in the following subsections. Some of them must be provided for each bootloader stage and some are specific to a given bootloader stage. The linker scripts define some extra, optional symbols. They are not actually used by any code but they help in understanding the bootloader images' memory layout as they are easy to spot in the link map files. #### Common linker symbols Early setup code needs to know the extents of the BSS section to zero-initialise it before executing any C code. The following linker symbols are defined for this purpose: * `__BSS_START__` This address must be aligned on a 16-byte boundary. * `__BSS_SIZE__` Similarly, the coherent memory section must be zero-initialised. Also, the MMU setup code needs to know the extents of this section to set the right memory attributes for it. The following linker symbols are defined for this purpose: * `__COHERENT_RAM_START__` This address must be aligned on a page-size boundary. * `__COHERENT_RAM_END__` This address must be aligned on a page-size boundary. * `__COHERENT_RAM_UNALIGNED_SIZE__` #### BL1's linker symbols BL1's early setup code needs to know the extents of the .data section to relocate it from ROM to RAM before executing any C code. The following linker symbols are defined for this purpose: * `__DATA_ROM_START__` This address must be aligned on a 16-byte boundary. * `__DATA_RAM_START__` This address must be aligned on a 16-byte boundary. * `__DATA_SIZE__` BL1's platform setup code needs to know the extents of its read-write data region to figure out its memory layout. The following linker symbols are defined for this purpose: * `__BL1_RAM_START__` This is the start address of BL1 RW data. * `__BL1_RAM_END__` This is the end address of BL1 RW data. #### BL2's, BL3-1's and TSP's linker symbols BL2, BL3-1 and TSP need to know the extents of their read-only section to set the right memory attributes for this memory region in their MMU setup code. The following linker symbols are defined for this purpose: * `__RO_START__` * `__RO_END__` ### How to choose the right base addresses for each bootloader stage image There is currently no support for dynamic image loading in the Trusted Firmware. This means that all bootloader images need to be linked against their ultimate runtime locations and the base addresses of each image must be chosen carefully such that images don't overlap each other in an undesired way. As the code grows, the base addresses might need adjustments to cope with the new memory layout. The memory layout is completely specific to the platform and so there is no general recipe for choosing the right base addresses for each bootloader image. However, there are tools to aid in understanding the memory layout. These are the link map files: `build///bl/bl.map`, with `` being the stage bootloader. They provide a detailed view of the memory usage of each image. Among other useful information, they provide the end address of each image. * `bl1.map` link map file provides `__BL1_RAM_END__` address. * `bl2.map` link map file provides `__BL2_END__` address. * `bl31.map` link map file provides `__BL31_END__` address. * `bl32.map` link map file provides `__BL32_END__` address. For each bootloader image, the platform code must provide its start address as well as a limit address that it must not overstep. The latter is used in the linker scripts to check that the image doesn't grow past that address. If that happens, the linker will issue a message similar to the following: aarch64-none-elf-ld: BLx has exceeded its limit. Additionally, if the platform memory layout implies some image overlaying like on FVP, BL3-1 and TSP need to know the limit address that their PROGBITS sections must not overstep. The platform code must provide those. #### Memory layout on ARM FVPs The following list describes the memory layout on the FVP: * A 4KB page of shared memory is used to store the entrypoint mailboxes and the parameters passed between bootloaders. The shared memory can be allocated either at the top of Trusted SRAM or at the base of Trusted DRAM at build time. When allocated in Trusted SRAM, the amount of Trusted SRAM available to load the bootloader images will be reduced by the size of the shared memory. * BL1 is originally sitting in the Trusted ROM at address `0x0`. Its read-write data are relocated at the top of the Trusted SRAM at runtime. If the shared memory is allocated in Trusted SRAM, the BL1 read-write data is relocated just below the shared memory. * BL3-1 is loaded at the top of the Trusted SRAM, such that its NOBITS sections will overwrite BL1 R/W data. * BL2 is loaded below BL3-1. * The TSP is loaded as the BL3-2 image at the base of either the Trusted SRAM or Trusted DRAM. When loaded into Trusted SRAM, its NOBITS sections are allowed to overlay BL2. When loaded into Trusted DRAM, an offset corresponding to the size of the shared memory is applied to avoid overlap. This memory layout is designed to give the BL3-2 image as much memory as possible when it is loaded into Trusted SRAM. Depending on the location of the shared memory page and the TSP, it will result in different memory maps, illustrated by the following diagrams. **Shared data & TSP in Trusted SRAM (default option):** Trusted SRAM 0x04040000 +----------+ | Shared | 0x0403F000 +----------+ loaded by BL2 ------------------ | BL1 (rw) | <<<<<<<<<<<<< | BL3-1 NOBITS | |----------| <<<<<<<<<<<<< |----------------| | | <<<<<<<<<<<<< | BL3-1 PROGBITS | |----------| ------------------ | BL2 | <<<<<<<<<<<<< | BL3-2 NOBITS | |----------| <<<<<<<<<<<<< |----------------| | | <<<<<<<<<<<<< | BL3-2 PROGBITS | 0x04000000 +----------+ ------------------ Trusted ROM 0x04000000 +----------+ | BL1 (ro) | 0x00000000 +----------+ **Shared data & TSP in Trusted DRAM:** Trusted DRAM 0x08000000 +----------+ | | | BL3-2 | | | 0x06001000 |----------| | Shared | 0x06000000 +----------+ Trusted SRAM 0x04040000 +----------+ loaded by BL2 ------------------ | BL1 (rw) | <<<<<<<<<<<<< | BL3-1 NOBITS | |----------| <<<<<<<<<<<<< |----------------| | | <<<<<<<<<<<<< | BL3-1 PROGBITS | |----------| ------------------ | BL2 | |----------| | | 0x04000000 +----------+ Trusted ROM 0x04000000 +----------+ | BL1 (ro) | 0x00000000 +----------+ **Shared data in Trusted DRAM, TSP in Trusted SRAM:** Trusted DRAM 0x08000000 +----------+ | | | | | | 0x06001000 |----------| | Shared | 0x06000000 +----------+ Trusted SRAM 0x04040000 +----------+ loaded by BL2 ------------------ | BL1 (rw) | <<<<<<<<<<<<< | BL3-1 NOBITS | |----------| <<<<<<<<<<<<< |----------------| | | <<<<<<<<<<<<< | BL3-1 PROGBITS | |----------| ------------------ | BL2 | <<<<<<<<<<<<< | BL3-2 NOBITS | |----------| <<<<<<<<<<<<< |----------------| | | <<<<<<<<<<<<< | BL3-2 PROGBITS | 0x04000000 +----------+ ------------------ Trusted ROM 0x04000000 +----------+ | BL1 (ro) | 0x00000000 +----------+ Loading the TSP image in Trusted DRAM doesn't change the memory layout of the other boot loader images in Trusted SRAM. #### Memory layout on Juno ARM development platform Flash0 0x0C000000 +----------+ : : 0x0BED0000 |----------| | BL1 (ro) | 0x0BEC0000 |----------| : : | Bypass | 0x08000000 +----------+ Trusted SRAM 0x04040000 +----------+ | BL2 | BL3-1 is loaded 0x04033000 |----------| after BL3-0 has | BL3-2 | been sent to SCP 0x04023000 |----------| ------------------ | BL3-0 | <<<<<<<<<<<<< | BL3-1 | 0x04009000 |----------| ------------------ | BL1 (rw) | 0x04001000 |----------| | MHU | 0x04000000 +----------+ The Message Handling Unit (MHU) page contains the entrypoint mailboxes and a shared memory area. This shared memory is used as a communication channel between the AP and the SCP. BL1 code starts at `0x0BEC0000`. The BL1 data section is copied to trusted SRAM at `0x04001000`, right after the MHU page. Entrypoint mailboxes are stored in the first 128 bytes of the MHU page. 9. Firmware Image Package (FIP) --------------------------------- Using a Firmware Image Package (FIP) allows for packing bootloader images (and potentially other payloads) into a single archive that can be loaded by the ARM Trusted Firmware from non-volatile platform storage. A driver to load images from a FIP has been added to the storage layer and allows a package to be read from supported platform storage. A tool to create Firmware Image Packages is also provided and described below. ### Firmware Image Package layout The FIP layout consists of a table of contents (ToC) followed by payload data. The ToC itself has a header followed by one or more table entries. The ToC is terminated by an end marker entry. All ToC entries describe some payload data that has been appended to the end of the binary package. With the information provided in the ToC entry the corresponding payload data can be retrieved. ------------------ | ToC Header | |----------------| | ToC Entry 0 | |----------------| | ToC Entry 1 | |----------------| | ToC End Marker | |----------------| | | | Data 0 | | | |----------------| | | | Data 1 | | | ------------------ The ToC header and entry formats are described in the header file `include/firmware_image_package.h`. This file is used by both the tool and the ARM Trusted firmware. The ToC header has the following fields: `name`: The name of the ToC. This is currently used to validate the header. `serial_number`: A non-zero number provided by the creation tool `flags`: Flags associated with this data. None are yet defined. A ToC entry has the following fields: `uuid`: All files are referred to by a pre-defined Universally Unique IDentifier [UUID] . The UUIDs are defined in `include/firmware_image_package`. The platform translates the requested image name into the corresponding UUID when accessing the package. `offset_address`: The offset address at which the corresponding payload data can be found. The offset is calculated from the ToC base address. `size`: The size of the corresponding payload data in bytes. `flags`: Flags associated with this entry. Non are yet defined. ### Firmware Image Package creation tool The FIP creation tool can be used to pack specified images into a binary package that can be loaded by the ARM Trusted Firmware from platform storage. The tool currently only supports packing bootloader images. Additional image definitions can be added to the tool as required. The tool can be found in `tools/fip_create`. ### Loading from a Firmware Image Package (FIP) The Firmware Image Package (FIP) driver can load images from a binary package on non-volatile platform storage. For the FVPs this is currently NOR FLASH. Bootloader images are loaded according to the platform policy as specified in `plat//plat_io_storage.c`. For the FVPs this means the platform will attempt to load images from a Firmware Image Package located at the start of NOR FLASH0. Currently the FVP's policy only allows loading of a known set of images. The platform policy can be modified to allow additional images. 10. Code Structure ------------------- Trusted Firmware code is logically divided between the three boot loader stages mentioned in the previous sections. The code is also divided into the following categories (present as directories in the source code): * **Architecture specific.** This could be AArch32 or AArch64. * **Platform specific.** Choice of architecture specific code depends upon the platform. * **Common code.** This is platform and architecture agnostic code. * **Library code.** This code comprises of functionality commonly used by all other code. * **Stage specific.** Code specific to a boot stage. * **Drivers.** * **Services.** EL3 runtime services, e.g. PSCI or SPD. Specific SPD services reside in the `services/spd` directory (e.g. `services/spd/tspd`). Each boot loader stage uses code from one or more of the above mentioned categories. Based upon the above, the code layout looks like this: Directory Used by BL1? Used by BL2? Used by BL3-1? bl1 Yes No No bl2 No Yes No bl31 No No Yes arch Yes Yes Yes plat Yes Yes Yes drivers Yes No Yes common Yes Yes Yes lib Yes Yes Yes services No No Yes The build system provides a non configurable build option IMAGE_BLx for each boot loader stage (where x = BL stage). e.g. for BL1 , IMAGE_BL1 will be defined by the build system. This enables the Trusted Firmware to compile certain code only for specific boot loader stages All assembler files have the `.S` extension. The linker source files for each boot stage have the extension `.ld.S`. These are processed by GCC to create the linker scripts which have the extension `.ld`. FDTs provide a description of the hardware platform and are used by the Linux kernel at boot time. These can be found in the `fdts` directory. 11. References --------------- 1. Trusted Board Boot Requirements CLIENT PDD (ARM DEN 0006B-5). Available under NDA through your ARM account representative. 2. [Power State Coordination Interface PDD (ARM DEN 0022B.b)][PSCI]. 3. [SMC Calling Convention PDD (ARM DEN 0028A)][SMCCC]. 4. [ARM Trusted Firmware Interrupt Management Design guide][INTRG]. - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ [PSCI]: http://infocenter.arm.com/help/topic/com.arm.doc.den0022b/index.html "Power State Coordination Interface PDD (ARM DEN 0022B.b)" [SMCCC]: http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html "SMC Calling Convention PDD (ARM DEN 0028A)" [UUID]: https://tools.ietf.org/rfc/rfc4122.txt "A Universally Unique IDentifier (UUID) URN Namespace" [User Guide]: ./user-guide.md [Porting Guide]: ./porting-guide.md [INTRG]: ./interrupt-framework-design.md [ERRW]: ./cpu-errata-workarounds.md arm-trusted-firmware-1.0-aw-6/docs/interrupt-framework-design.md000066400000000000000000001226421322600646200247630ustar00rootroot00000000000000ARM Trusted Firmware Interrupt Management Design guide ====================================================== Contents : 1. Introduction * Assumptions * Concepts - Interrupt Types - Routing Model - Valid Routing Models + Secure-EL1 Interrupts + Non-secure Interrupts - Mapping of Interrupt Type to Signal 2. Interrupt Management * Software Components * Interrupt Registration - EL3 Runtime Firmware - Secure Payload Dispatcher + Test Secure Payload Dispatcher behavior - Secure Payload + Secure Payload IHF design w.r.t Secure-EL1 interrupts + Secure Payload IHF design w.r.t Non-secure interrupts + Test Secure Payload behavior * Interrupt Handling - EL3 Runtime Firmware - Secure Payload Dispatcher + Interrupt Entry + Interrupt Exit + Test Secure Payload Dispatcher behavior - Secure Payload + Test Secure Payload behavior 1. Introduction ---------------- This document describes the design of the Interrupt management framework in ARM Trusted Firmware. This section briefly describes the requirements from this framework. It also briefly explains some concepts and assumptions. They will help in understanding the implementation of the framework explained in subsequent sections. This framework is responsible for managing interrupts routed to EL3. It also allows EL3 software to configure the interrupt routing behavior. Its main objective is to implement the following two requirements. 1. It should be possible to route interrupts meant to be handled by secure software (Secure interrupts) to EL3, when execution is in non-secure state (normal world). The framework should then take care of handing control of the interrupt to either software in EL3 or Secure-EL1 depending upon the software configuration and the GIC implementation. This requirement ensures that secure interrupts are under the control of the secure software with respect to their delivery and handling without the possibility of intervention from non-secure software. 2. It should be possible to route interrupts meant to be handled by non-secure software (Non-secure interrupts) to the last executed exception level in the normal world when the execution is in secure world at exception levels lower than EL3. This could be done with or without the knowledge of software executing in Secure-EL1/Secure-EL0. The choice of approach should be governed by the secure software. This requirement ensures that non-secure software is able to execute in tandem with the secure software without overriding it. ### 1.1 Assumptions The framework makes the following assumptions to simplify its implementation. 1. All secure interrupts are handled in Secure-EL1. They can be delivered to Secure-EL1 via EL3 but they cannot be handled in EL3. It will be possible to extend the framework to handle secure interrupts in EL3 in the future. 2. Interrupt exceptions (`PSTATE.I` and `F` bits) are masked during execution in EL3. ### 1.2 Concepts #### 1.2.1 Interrupt types The framework categorises an interrupt to be one of the following depending upon the exception level(s) it is handled in. 1. Secure EL1 interrupt. This type of interrupt can be routed to EL3 or Secure-EL1 depending upon the security state of the current execution context. It is always handled in Secure-EL1. 2. Non-secure interrupt. This type of interrupt can be routed to EL3, Secure-EL1, Non-secure EL1 or EL2 depending upon the security state of the current execution context. It is always handled in either Non-secure EL1 or EL2. 3. EL3 interrupt. This type of interrupt can be routed to EL3 or Secure-EL1 depending upon the security state of the current execution context. It is always handled in EL3. In the current implementation of the framework, all secure interrupts are treated as Secure EL1 interrupts. It will be possible for EL3 software to configure a secure interrupt as an EL3 interrupt in future implementations. The following constants define the various interrupt types in the framework implementation. #define INTR_TYPE_S_EL1 0 #define INTR_TYPE_EL3 1 #define INTR_TYPE_NS 2 #### 1.2.2 Routing model A type of interrupt can be either generated as an FIQ or an IRQ. The target exception level of an interrupt type is configured through the FIQ and IRQ bits in the Secure Configuration Register at EL3 (`SCR_EL3.FIQ` and `SCR_EL3.IRQ` bits). When `SCR_EL3.FIQ`=1, FIQs are routed to EL3. Otherwise they are routed to the First Exception Level (FEL) capable of handling interrupts. When `SCR_EL3.IRQ`=1, IRQs are routed to EL3. Otherwise they are routed to the FEL. This register is configured independently by EL3 software for each security state prior to entry into a lower exception level in that security state. A routing model for a type of interrupt (generated as FIQ or IRQ) is defined as its target exception level for each security state. It is represented by a single bit for each security state. A value of `0` means that the interrupt should be routed to the FEL. A value of `1` means that the interrupt should be routed to EL3. A routing model is applicable only when execution is not in EL3. The default routing model for an interrupt type is to route it to the FEL in either security state. #### 1.2.3 Valid routing models The framework considers certain routing models for each type of interrupt to be incorrect as they conflict with the requirements mentioned in Section 1. The following sub-sections describe all the possible routing models and specify which ones are valid or invalid. Only the Secure-EL1 and Non-secure interrupt types are considered as EL3 interrupts are currently unsupported (See 1.1). The terminology used in the following sub-sections is explained below. 1. __CSS__. Current Security State. `0` when secure and `1` when non-secure 2. __TEL3__. Target Exception Level 3. `0` when targeted to the FEL. `1` when targeted to EL3. ##### 1.2.3.1 Secure-EL1 interrupts 1. __CSS=0, TEL3=0__. Interrupt is routed to the FEL when execution is in secure state. This is a valid routing model as secure software is in control of handling secure interrupts. 2. __CSS=0, TEL3=1__. Interrupt is routed to EL3 when execution is in secure state. This is a valid routing model as secure software in EL3 can handover the interrupt to Secure-EL1 for handling. 3. __CSS=1, TEL3=0__. Interrupt is routed to the FEL when execution is in non-secure state. This is an invalid routing model as a secure interrupt is not visible to the secure software which violates the motivation behind the ARM Security Extensions. 4. __CSS=1, TEL3=1__. Interrupt is routed to EL3 when execution is in non-secure state. This is a valid routing model as secure software in EL3 can handover the interrupt to Secure-EL1 for handling. ##### 1.2.3.2 Non-secure interrupts 1. __CSS=0, TEL3=0__. Interrupt is routed to the FEL when execution is in secure state. This allows the secure software to trap non-secure interrupts, perform its bookeeping and hand the interrupt to the non-secure software through EL3. This is a valid routing model as secure software is in control of how its execution is pre-empted by non-secure interrupts. 2. __CSS=0, TEL3=1__. Interrupt is routed to EL3 when execution is in secure state. This is a valid routing model as secure software in EL3 can save the state of software in Secure-EL1/Secure-EL0 before handing the interrupt to non-secure software. This model requires additional coordination between Secure-EL1 and EL3 software to ensure that the former's state is correctly saved by the latter. 3. __CSS=1, TEL3=0__. Interrupt is routed to FEL when execution is in non-secure state. This is an valid routing model as a non-secure interrupt is handled by non-secure software. 4. __CSS=1, TEL3=1__. Interrupt is routed to EL3 when execution is in non-secure state. This is an invalid routing model as there is no valid reason to route the interrupt to EL3 software and then hand it back to non-secure software for handling. #### 1.2.4 Mapping of interrupt type to signal The framework is meant to work with any interrupt controller implemented by a platform. A interrupt controller could generate a type of interrupt as either an FIQ or IRQ signal to the CPU depending upon the current security state.The mapping between the type and signal is known only to the platform. The framework uses this information to determine whether the IRQ or the FIQ bit should be programmed in `SCR_EL3` while applying the routing model for a type of interrupt. The platform provides this information through the `plat_interrupt_type_to_line()` API (described in the [Porting Guide]). For example, on the FVP port when the platform uses an ARM GICv2 interrupt controller, Secure-EL1 interrupts are signalled through the FIQ signal while Non-secure interrupts are signalled through the IRQ signal. This applies when execution is in either security state. 2. Interrupt management ----------------------- The following sections describe how interrupts are managed by the interrupt handling framework. This entails: 1. Providing an interface to allow registration of a handler and specification of the routing model for a type of interrupt. 2. Implementing support to hand control of an interrupt type to its registered handler when the interrupt is generated. Both aspects of interrupt management involve various components in the secure software stack spanning from EL3 to Secure-EL1. These components are described in the section 2.1. The framework stores information associated with each type of interrupt in the following data structure. ``` typedef struct intr_type_desc { interrupt_type_handler_t handler; uint32_t flags; uint32_t scr_el3[2]; } intr_type_desc_t; ``` The `flags` field stores the routing model for the interrupt type in bits[1:0]. Bit[0] stores the routing model when execution is in the secure state. Bit[1] stores the routing model when execution is in the non-secure state. As mentioned in Section 1.2.2, a value of `0` implies that the interrupt should be targeted to the FEL. A value of `1` implies that it should be targeted to EL3. The remaining bits are reserved and SBZ. The helper macro `set_interrupt_rm_flag()` should be used to set the bits in the `flags` parameter. The `scr_el3[2]` field also stores the routing model but as a mapping of the model in the `flags` field to the corresponding bit in the `SCR_EL3` for each security state. The framework also depends upon the platform port to configure the interrupt controller to distinguish between secure and non-secure interrupts. The platform is expected to be aware of the secure devices present in the system and their associated interrupt numbers. It should configure the interrupt controller to enable the secure interrupts, ensure that their priority is always higher than the non-secure interrupts and target them to the primary CPU. It should also export the interface described in the [Porting Guide] to enable handling of interrupts. In the remainder of this document, for the sake of simplicity it is assumed that the FIQ signal is used to generate Secure-EL1 interrupts and the IRQ signal is used to generate non-secure interrupts in either security state. ### 2.1 Software components Roles and responsibilities for interrupt management are sub-divided between the following components of software running in EL3 and Secure-EL1. Each component is briefly described below. 1. EL3 Runtime Firmware. This component is common to all ports of the ARM Trusted Firmware. 2. Secure Payload Dispatcher (SPD) service. This service interfaces with the Secure Payload (SP) software which runs in exception levels lower than EL3 i.e. Secure-EL1/Secure-EL0. It is responsible for switching execution between software running in secure and non-secure states at exception levels lower than EL3. A switch is triggered by a Secure Monitor Call from either state. It uses the APIs exported by the Context management library to implement this functionality. Switching execution between the two security states is a requirement for interrupt management as well. This results in a significant dependency on the SPD service. ARM Trusted firmware implements an example Test Secure Payload Dispatcher (TSPD) service. An SPD service plugs into the EL3 runtime firmware and could be common to some ports of the ARM Trusted Firmware. 3. Secure Payload (SP). On a production system, the Secure Payload corresponds to a Secure OS which runs in Secure-EL1/Secure-EL0. It interfaces with the SPD service to manage communication with non-secure software. ARM Trusted Firmware implements an example secure payload called Test Secure Payload (TSP) which runs only in Secure-EL1. A Secure payload implementation could be common to some ports of the ARM Trusted Firmware just like the SPD service. ### 2.2 Interrupt registration This section describes in detail the role of each software component (see 2.1) during the registration of a handler for an interrupt type. #### 2.2.1 EL3 runtime firmware This component declares the following prototype for a handler of an interrupt type. typedef uint64_t (*interrupt_type_handler_t)(uint32_t id, uint32_t flags, void *handle, void *cookie); The value of the `id` parameter depends upon the definition of the `IMF_READ_INTERRUPT_ID` build time flag. When the flag is defined, `id` contains the number of the highest priority pending interrupt of the type that this handler was registered for. When the flag is not defined `id` contains `INTR_ID_UNAVAILABLE`. The `flags` parameter contains miscellaneous information as follows. 1. Security state, bit[0]. This bit indicates the security state of the lower exception level when the interrupt was generated. A value of `1` means that it was in the non-secure state. A value of `0` indicates that it was in the secure state. This bit can be used by the handler to ensure that interrupt was generated and routed as per the routing model specified during registration. 2. Reserved, bits[31:1]. The remaining bits are reserved for future use. The `handle` parameter points to the `cpu_context` structure of the current CPU for the security state specified in the `flags` parameter. Once the handler routine completes, execution will return to either the secure or non-secure state. The handler routine should return a pointer to `cpu_context` structure of the current CPU for the the target security state. It should treat all error conditions as critical errors and take appropriate action within its implementation e.g. use assertion failures. The runtime firmware provides the following API for registering a handler for a particular type of interrupt. A Secure Payload Dispatcher service should use this API to register a handler for Secure-EL1 and optionally for non-secure interrupts. This API also requires the caller to specify the routing model for the type of interrupt. int32_t register_interrupt_type_handler(uint32_t type, interrupt_type_handler handler, uint64_t flags); The `type` parameter can be one of the three interrupt types listed above i.e. `INTR_TYPE_S_EL1`, `INTR_TYPE_NS` & `INTR_TYPE_EL3` (currently unimplemented). The `flags` parameter is as described in Section 2. The function will return `0` upon a successful registration. It will return `-EALREADY` in case a handler for the interrupt type has already been registered. If the `type` is unrecognised or the `flags` or the `handler` are invalid it will return `-EINVAL`. It will return `-ENOTSUP` if the specified `type` is not supported by the framework i.e. `INTR_TYPE_EL3`. Interrupt routing is governed by the configuration of the `SCR_EL3.FIQ/IRQ` bits prior to entry into a lower exception level in either security state. The context management library maintains a copy of the `SCR_EL3` system register for each security state in the `cpu_context` structure of each CPU. It exports the following APIs to let EL3 Runtime Firmware program and retrieve the routing model for each security state for the current CPU. The value of `SCR_EL3` stored in the `cpu_context` is used by the `el3_exit()` function to program the `SCR_EL3` register prior to returning from the EL3 exception level. uint32_t cm_get_scr_el3(uint32_t security_state); void cm_write_scr_el3_bit(uint32_t security_state, uint32_t bit_pos, uint32_t value); `cm_get_scr_el3()` returns the value of the `SCR_EL3` register for the specified security state of the current CPU. `cm_write_scr_el3()` writes a `0` or `1` to the bit specified by `bit_pos`. `register_interrupt_type_handler()` invokes `set_routing_model()` API which programs the `SCR_EL3` according to the routing model using the `cm_get_scr_el3()` and `cm_write_scr_el3_bit()` APIs. It is worth noting that in the current implementation of the framework, the EL3 runtime firmware is responsible for programming the routing model. The SPD is responsible for ensuring that the routing model has been adhered to upon receiving an interrupt. #### 2.2.2 Secure payload dispatcher A SPD service is responsible for determining and maintaining the interrupt routing model supported by itself and the Secure Payload. It is also responsible for ferrying interrupts between secure and non-secure software depending upon the routing model. It could determine the routing model at build time or at runtime. It must use this information to register a handler for each interrupt type using the `register_interrupt_type_handler()` API in EL3 runtime firmware. If the routing model is not known to the SPD service at build time, then it must be provided by the SP as the result of its initialisation. The SPD should program the routing model only after SP initialisation has completed e.g. in the SPD initialisation function pointed to by the `bl32_init` variable. The SPD should determine the mechanism to pass control to the Secure Payload after receiving an interrupt from the EL3 runtime firmware. This information could either be provided to the SPD service at build time or by the SP at runtime. #### 2.2.2.1 Test secure payload dispatcher behavior The TSPD only handles Secure-EL1 interrupts and is provided with the following routing model at build time. * Secure-EL1 interrupts are routed to EL3 when execution is in non-secure state and are routed to the FEL when execution is in the secure state i.e __CSS=0, TEL3=0__ & __CSS=1, TEL3=1__ for Secure-EL1 interrupts * The default routing model is used for non-secure interrupts i.e they are routed to the FEL in either security state i.e __CSS=0, TEL3=0__ & __CSS=1, TEL3=0__ for Non-secure interrupts It performs the following actions in the `tspd_init()` function to fulfill the requirements mentioned earlier. 1. It passes control to the Test Secure Payload to perform its initialisation. The TSP provides the address of the vector table `tsp_vectors` in the SP which also includes the handler for Secure-EL1 interrupts in the `fiq_entry` field. The TSPD passes control to the TSP at this address when it receives a Secure-EL1 interrupt. The handover agreement between the TSP and the TSPD requires that the TSPD masks all interrupts (`PSTATE.DAIF` bits) when it calls `tsp_fiq_entry()`. The TSP has to preserve the callee saved general purpose, SP_EL1/Secure-EL0, LR, VFP and system registers. It can use `x0-x18` to enable its C runtime. 2. The TSPD implements a handler function for Secure-EL1 interrupts. It registers it with the EL3 runtime firmware using the `register_interrupt_type_handler()` API as follows /* Forward declaration */ interrupt_type_handler tspd_secure_el1_interrupt_handler; int32_t rc, flags = 0; set_interrupt_rm_flag(flags, NON_SECURE); rc = register_interrupt_type_handler(INTR_TYPE_S_EL1, tspd_secure_el1_interrupt_handler, flags); assert(rc == 0); #### 2.2.3 Secure payload A Secure Payload must implement an interrupt handling framework at Secure-EL1 (Secure-EL1 IHF) to support its chosen interrupt routing model. Secure payload execution will alternate between the below cases. 1. In the code where IRQ, FIQ or both interrupts are enabled, if an interrupt type is targeted to the FEL, then it will be routed to the Secure-EL1 exception vector table. This is defined as the asynchronous model of handling interrupts. This mode applies to both Secure-EL1 and non-secure interrupts. 2. In the code where both interrupts are disabled, if an interrupt type is targeted to the FEL, then execution will eventually migrate to the non-secure state. Any non-secure interrupts will be handled as described in the routing model where __CSS=1 and TEL3=0__. Secure-EL1 interrupts will be routed to EL3 (as per the routing model where __CSS=1 and TEL3=1__) where the SPD service will hand them to the SP. This is defined as the synchronous mode of handling interrupts. The interrupt handling framework implemented by the SP should support one or both these interrupt handling models depending upon the chosen routing model. The following list briefly describes how the choice of a valid routing model (See 1.2.3) effects the implementation of the Secure-EL1 IHF. If the choice of the interrupt routing model is not known to the SPD service at compile time, then the SP should pass this information to the SPD service at runtime during its initialisation phase. As mentioned earlier, it is assumed that the FIQ signal is used to generate Secure-EL1 interrupts and the IRQ signal is used to generate non-secure interrupts in either security state. ##### 2.2.3.1 Secure payload IHF design w.r.t secure-EL1 interrupts 1. __CSS=0, TEL3=0__. If `PSTATE.F=0`, Secure-EL1 interrupts will be trigerred at one of the Secure-EL1 FIQ exception vectors. The Secure-EL1 IHF should implement support for handling FIQ interrupts asynchronously. If `PSTATE.F=1` then Secure-EL1 interrupts will be handled as per the synchronous interrupt handling model. The SP could implement this scenario by exporting a seperate entrypoint for Secure-EL1 interrupts to the SPD service during the registration phase. The SPD service would also need to know the state of the system, general purpose and the `PSTATE` registers in which it should arrange to return execution to the SP. The SP should provide this information in an implementation defined way during the registration phase if it is not known to the SPD service at build time. 2. __CSS=1, TEL3=1__. Interrupts are routed to EL3 when execution is in non-secure state. They should be handled through the synchronous interrupt handling model as described in 1. above. 3. __CSS=0, TEL3=1__. Secure interrupts are routed to EL3 when execution is in secure state. They will not be visible to the SP. The `PSTATE.F` bit in Secure-EL1/Secure-EL0 will not mask FIQs. The EL3 runtime firmware will call the handler registered by the SPD service for Secure-EL1 interrupts. Secure-EL1 IHF should then handle all Secure-EL1 interrupt through the synchronous interrupt handling model described in 1. above. ##### 2.2.3.2 Secure payload IHF design w.r.t non-secure interrupts 1. __CSS=0, TEL3=0__. If `PSTATE.I=0`, non-secure interrupts will be trigerred at one of the Secure-EL1 IRQ exception vectors . The Secure-EL1 IHF should co-ordinate with the SPD service to transfer execution to the non-secure state where the interrupt should be handled e.g the SP could allocate a function identifier to issue a SMC64 or SMC32 to the SPD service which indicates that the SP execution has been pre-empted by a non-secure interrupt. If this function identifier is not known to the SPD service at compile time then the SP could provide it during the registration phase. If `PSTATE.I=1` then the non-secure interrupt will pend until execution resumes in the non-secure state. 2. __CSS=0, TEL3=1__. Non-secure interrupts are routed to EL3. They will not be visible to the SP. The `PSTATE.I` bit in Secure-EL1/Secure-EL0 will have not effect. The SPD service should register a non-secure interrupt handler which should save the SP state correctly and resume execution in the non-secure state where the interrupt will be handled. The Secure-EL1 IHF does not need to take any action. 3. __CSS=1, TEL3=0__. Non-secure interrupts are handled in the FEL in non-secure state (EL1/EL2) and are not visible to the SP. This routing model does not affect the SP behavior. A Secure Payload must also ensure that all Secure-EL1 interrupts are correctly configured at the interrupt controller by the platform port of the EL3 runtime firmware. It should configure any additional Secure-EL1 interrupts which the EL3 runtime firmware is not aware of through its platform port. #### 2.2.3.3 Test secure payload behavior The routing model for Secure-EL1 and non-secure interrupts chosen by the TSP is described in Section 2.2.2. It is known to the TSPD service at build time. The TSP implements an entrypoint (`tsp_fiq_entry()`) for handling Secure-EL1 interrupts taken in non-secure state and routed through the TSPD service (synchronous handling model). It passes the reference to this entrypoint via `tsp_vectors` to the TSPD service. The TSP also replaces the default exception vector table referenced through the `early_exceptions` variable, with a vector table capable of handling FIQ and IRQ exceptions taken at the same (Secure-EL1) exception level. This table is referenced through the `tsp_exceptions` variable and programmed into the VBAR_EL1. It caters for the asynchronous handling model. The TSP also programs the Secure Physical Timer in the ARM Generic Timer block to raise a periodic interrupt (every half a second) for the purpose of testing interrupt management across all the software components listed in 2.1 ### 2.3 Interrupt handling This section describes in detail the role of each software component (see Section 2.1) in handling an interrupt of a particular type. #### 2.3.1 EL3 runtime firmware The EL3 runtime firmware populates the IRQ and FIQ exception vectors referenced by the `runtime_exceptions` variable as follows. 1. IRQ and FIQ exceptions taken from the current exception level with `SP_EL0` or `SP_EL3` are reported as irrecoverable error conditions. As mentioned earlier, EL3 runtime firmware always executes with the `PSTATE.I` and `PSTATE.F` bits set. 2. The following text describes how the IRQ and FIQ exceptions taken from a lower exception level using AArch64 or AArch32 are handled. When an interrupt is generated, the vector for each interrupt type is responsible for: 1. Saving the entire general purpose register context (x0-x30) immediately upon exception entry. The registers are saved in the per-cpu `cpu_context` data structure referenced by the `SP_EL3`register. 2. Saving the `ELR_EL3`, `SP_EL0` and `SPSR_EL3` system registers in the per-cpu `cpu_context` data structure referenced by the `SP_EL3` register. 3. Switching to the C runtime stack by restoring the `CTX_RUNTIME_SP` value from the per-cpu `cpu_context` data structure in `SP_EL0` and executing the `msr spsel, #0` instruction. 4. Determining the type of interrupt. Secure-EL1 interrupts will be signalled at the FIQ vector. Non-secure interrupts will be signalled at the IRQ vector. The platform should implement the following API to determine the type of the pending interrupt. uint32_t plat_ic_get_interrupt_type(void); It should return either `INTR_TYPE_S_EL1` or `INTR_TYPE_NS`. 5. Determining the handler for the type of interrupt that has been generated. The following API has been added for this purpose. interrupt_type_handler get_interrupt_type_handler(uint32_t interrupt_type); It returns the reference to the registered handler for this interrupt type. The `handler` is retrieved from the `intr_type_desc_t` structure as described in Section 2. `NULL` is returned if no handler has been registered for this type of interrupt. This scenario is reported as an irrecoverable error condition. 6. Calling the registered handler function for the interrupt type generated. The firmware also determines the interrupt id if the IMF_READ_INTERRUPT_ID build time flag is set. The id is set to `INTR_ID_UNAVAILABLE` if the flag is not set. The id along with the current security state and a reference to the `cpu_context_t` structure for the current security state are passed to the handler function as its arguments. The handler function returns a reference to the per-cpu `cpu_context_t` structure for the target security state. 7. Calling `el3_exit()` to return from EL3 into a lower exception level in the security state determined by the handler routine. The `el3_exit()` function is responsible for restoring the register context from the `cpu_context_t` data structure for the target security state. #### 2.3.2 Secure payload dispatcher ##### 2.3.2.1 Interrupt entry The SPD service begins handling an interrupt when the EL3 runtime firmware calls the handler function for that type of interrupt. The SPD service is responsible for the following: 1. Validating the interrupt. This involves ensuring that the interrupt was generating according to the interrupt routing model specified by the SPD service during registration. It should use the interrupt id and the security state of the exception level (passed in the `flags` parameter of the handler) where the interrupt was taken from to determine this. If the interrupt is not recognised then the handler should treat it as an irrecoverable error condition. A SPD service can register a handler for Secure-EL1 and/or Non-secure interrupts. The following text describes further error scenarios keeping this in mind: 1. __SPD service has registered a handler for Non-secure interrupts__: When an interrupt is received by the handler, it could check its id to ensure it has been configured as a non-secure interrupt at the interrupt controller. A secure interrupt should never be handed to the non-secure interrupt handler. A non-secure interrupt should never be routed to EL3 when execution is in non-secure state. The handler could check the security state flag to ensure this. 2. __SPD service has registered a handler for Secure-EL1 interrupts__: When an interrupt is received by the handler, it could check its id to ensure it has been configured as a secure interrupt at the interrupt controller. A non-secure interrupt should never be handed to the secure interrupt handler. If the routing model chosen is such that Secure-EL1 interrupts are not routed to EL3 when execution is in non-secure state, then a Secure-EL1 interrupt generated in the secure state would be invalid. The handler could use the security state flag to check this. The SPD service should use the platform API: `plat_ic_get_interrupt_type()` to determine the type of interrupt for the specified id. 2. Determining whether the security state of the exception level for handling the interrupt is the same as the security state of the exception level where the interrupt was generated. This depends upon the routing model and type of the interrupt. The SPD should use this information to determine if a context switch is required. The following two cases would require a context switch from secure to non-secure or vice-versa. 1. A Secure-EL1 interrupt taken from the non-secure state should be routed to the Secure Payload. 2. A non-secure interrupt taken from the secure state should be routed to the last known non-secure exception level. The SPD service must save the system register context of the current security state. It must then restore the system register context of the target security state. It should use the `cm_set_next_eret_context()` API to ensure that the next `cpu_context` to be restored is of the target security state. If the target state is secure then execution should be handed to the SP as per the synchronous interrupt handling model it implements. A Secure-EL1 interrupt can be routed to EL3 while execution is in the SP. This implies that SP execution can be preempted while handling an interrupt by a another higher priority Secure-EL1 interrupt (or a EL3 interrupt in the future). The SPD service should manage secure interrupt priorities before handing control to the SP to prevent this type of preemption which can leave the system in an inconsistent state. 3. Setting the return value of the handler to the per-cpu `cpu_context` if the interrupt has been successfully validated and ready to be handled at a lower exception level. The routing model allows non-secure interrupts to be taken to Secure-EL1 when in secure state. The SPD service and the SP should implement a mechanism for routing these interrupts to the last known exception level in the non-secure state. The former should save the SP context, restore the non-secure context and arrange for entry into the non-secure state so that the interrupt can be handled. ##### 2.3.2.2 Interrupt exit When the Secure Payload has finished handling a Secure-EL1 interrupt, it could return control back to the SPD service through a SMC32 or SMC64. The SPD service should handle this secure monitor call so that execution resumes in the exception level and the security state from where the Secure-EL1 interrupt was originally taken. ##### 2.3.2.3 Test secure payload dispatcher behavior The example TSPD service registers a handler for Secure-EL1 interrupts taken from the non-secure state. Its handler `tspd_secure_el1_interrupt_handler()` takes the following actions upon being invoked. 1. It uses the `id` parameter to query the interrupt controller to ensure that the interrupt is a Secure-EL1 interrupt. It asserts if this is not the case. 2. It uses the security state provided in the `flags` parameter to ensure that the secure interrupt originated from the non-secure state. It asserts if this is not the case. 3. It saves the system register context for the non-secure state by calling `cm_el1_sysregs_context_save(NON_SECURE);`. 4. It sets the `ELR_EL3` system register to `tsp_fiq_entry` and sets the `SPSR_EL3.DAIF` bits in the secure CPU context. It sets `x0` to `TSP_HANDLE_FIQ_AND_RETURN`. If the TSP was in the middle of handling a standard SMC, then the `ELR_EL3` and `SPSR_EL3` registers in the secure CPU context are saved first. 5. It restores the system register context for the secure state by calling `cm_el1_sysregs_context_restore(SECURE);`. 6. It ensures that the secure CPU context is used to program the next exception return from EL3 by calling `cm_set_next_eret_context(SECURE);`. 7. It returns the per-cpu `cpu_context` to indicate that the interrupt can now be handled by the SP. `x1` is written with the value of `elr_el3` register for the non-secure state. This information is used by the SP for debugging purposes. The figure below describes how the interrupt handling is implemented by the TSPD when a Secure-EL1 interrupt is generated when execution is in the non-secure state. ![Image 1](diagrams/sec-int-handling.png?raw=true) The TSP issues an SMC with `TSP_HANDLED_S_EL1_FIQ` as the function identifier to signal completion of interrupt handling. The TSP issues an SMC with `TSP_PREEMPTED` as the function identifier to signal generation of a non-secure interrupt in Secure-EL1. The TSPD service takes the following actions in `tspd_smc_handler()` function upon receiving an SMC with `TSP_HANDLED_S_EL1_FIQ` and `TSP_PREEMPTED` as the function identifiers: 1. It ensures that the call originated from the secure state otherwise execution returns to the non-secure state with `SMC_UNK` in `x0`. 2. If the function identifier is `TSP_HANDLED_S_EL1_FIQ`, it restores the saved `ELR_EL3` and `SPSR_EL3` system registers back to the secure CPU context (see step 4 above) in case the TSP had been preempted by a non secure interrupt earlier. It does not save the secure context since the TSP is expected to preserve it (see Section 2.2.2.1) 3. If the function identifier is `TSP_PREEMPTED`, it saves the system register context for the secure state by calling `cm_el1_sysregs_context_save(SECURE)`. 4. It restores the system register context for the non-secure state by calling `cm_el1_sysregs_context_restore(NON_SECURE)`. It sets `x0` to `SMC_PREEMPTED` if the incoming function identifier is `TSP_PREEMPTED`. The Normal World is expected to resume the TSP after the non-secure interrupt handling by issuing an SMC with `TSP_FID_RESUME` as the function identifier. 5. It ensures that the non-secure CPU context is used to program the next exception return from EL3 by calling `cm_set_next_eret_context(NON_SECURE)`. 6. `tspd_smc_handler()` returns a reference to the non-secure `cpu_context` as the return value. As mentioned in 4. above, if a non-secure interrupt preempts the TSP execution then the non-secure software issues an SMC with `TSP_FID_RESUME` as the function identifier to resume TSP execution. The TSPD service takes the following actions in `tspd_smc_handler()` function upon receiving this SMC: 1. It ensures that the call originated from the non secure state. An assertion is raised otherwise. 2. Checks whether the TSP needs a resume i.e check if it was preempted. It then saves the system register context for the secure state by calling `cm_el1_sysregs_context_save(NON_SECURE)`. 3. Restores the secure context by calling `cm_el1_sysregs_context_restore(SECURE)` 4. It ensures that the secure CPU context is used to program the next exception return from EL3 by calling `cm_set_next_eret_context(SECURE)`. 5. `tspd_smc_handler()` returns a reference to the secure `cpu_context` as the return value. The figure below describes how the TSP/TSPD handle a non-secure interrupt when it is generated during execution in the TSP with `PSTATE.I` = 0. ![Image 2](diagrams/non-sec-int-handling.png?raw=true) #### 2.3.3 Secure payload The SP should implement one or both of the synchronous and asynchronous interrupt handling models depending upon the interrupt routing model it has chosen (as described in 2.2.3). In the synchronous model, it should begin handling a Secure-EL1 interrupt after receiving control from the SPD service at an entrypoint agreed upon during build time or during the registration phase. Before handling the interrupt, the SP should save any Secure-EL1 system register context which is needed for resuming normal execution in the SP later e.g. `SPSR_EL1, `ELR_EL1`. After handling the interrupt, the SP could return control back to the exception level and security state where the interrupt was originally taken from. The SP should use an SMC32 or SMC64 to ask the SPD service to do this. In the asynchronous model, the Secure Payload is responsible for handling non-secure and Secure-EL1 interrupts at the IRQ and FIQ vectors in its exception vector table when `PSTATE.I` and `PSTATE.F` bits are 0. As described earlier, when a non-secure interrupt is generated, the SP should coordinate with the SPD service to pass control back to the non-secure state in the last known exception level. This will allow the non-secure interrupt to be handled in the non-secure state. ##### 2.3.3.1 Test secure payload behavior The TSPD hands control of a Secure-EL1 interrupt to the TSP at the `tsp_fiq_entry()`. The TSP handles the interrupt while ensuring that the handover agreement described in Section 2.2.2.1 is maintained. It updates some statistics by calling `tsp_update_sync_fiq_stats()`. It then calls `tsp_fiq_handler()` which. 1. Checks whether the interrupt is the secure physical timer interrupt. It uses the platform API `plat_ic_get_pending_interrupt_id()` to get the interrupt number. 2. Handles the interrupt by acknowledging it using the `plat_ic_acknowledge_interrupt()` platform API, calling `tsp_generic_timer_handler()` to reprogram the secure physical generic timer and calling the `plat_ic_end_of_interrupt()` platform API to signal end of interrupt processing. The TSP passes control back to the TSPD by issuing an SMC64 with `TSP_HANDLED_S_EL1_FIQ` as the function identifier. The TSP handles interrupts under the asynchronous model as follows. 1. Secure-EL1 interrupts are handled by calling the `tsp_fiq_handler()` function. The function has been described above. 2. Non-secure interrupts are handled by issuing an SMC64 with `TSP_PREEMPTED` as the function identifier. Execution resumes at the instruction that follows this SMC instruction when the TSPD hands control to the TSP in response to an SMC with `TSP_FID_RESUME` as the function identifier from the non-secure state (see section 2.3.2.1). - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2014, ARM Limited and Contributors. All rights reserved._ [Porting Guide]: ./porting-guide.md arm-trusted-firmware-1.0-aw-6/docs/porting-guide.md000066400000000000000000001640601322600646200222420ustar00rootroot00000000000000ARM Trusted Firmware Porting Guide ================================== Contents -------- 1. Introduction 2. Common Modifications * Common mandatory modifications * Handling reset * Common optional modifications 3. Boot Loader stage specific modifications * Boot Loader stage 1 (BL1) * Boot Loader stage 2 (BL2) * Boot Loader stage 3-1 (BL3-1) * PSCI implementation (in BL3-1) * Interrupt Management framework (in BL3-1) * Crash Reporting mechanism (in BL3-1) 4. C Library 5. Storage abstraction layer - - - - - - - - - - - - - - - - - - 1. Introduction ---------------- Porting the ARM Trusted Firmware to a new platform involves making some mandatory and optional modifications for both the cold and warm boot paths. Modifications consist of: * Implementing a platform-specific function or variable, * Setting up the execution context in a certain way, or * Defining certain constants (for example #defines). The platform-specific functions and variables are all declared in [include/plat/common/platform.h]. The firmware provides a default implementation of variables and functions to fulfill the optional requirements. These implementations are all weakly defined; they are provided to ease the porting effort. Each platform port can override them with its own implementation if the default implementation is inadequate. Some modifications are common to all Boot Loader (BL) stages. Section 2 discusses these in detail. The subsequent sections discuss the remaining modifications for each BL stage in detail. This document should be read in conjunction with the ARM Trusted Firmware [User Guide]. 2. Common modifications ------------------------ This section covers the modifications that should be made by the platform for each BL stage to correctly port the firmware stack. They are categorized as either mandatory or optional. 2.1 Common mandatory modifications ---------------------------------- A platform port must enable the Memory Management Unit (MMU) with identity mapped page tables, and enable both the instruction and data caches for each BL stage. In the ARM FVP port, each BL stage configures the MMU in its platform- specific architecture setup function, for example `blX_plat_arch_setup()`. Each platform must allocate a block of identity mapped secure memory with Device-nGnRE attributes aligned to page boundary (4K) for each BL stage. This memory is identified by the section name `tzfw_coherent_mem` so that its possible for the firmware to place variables in it using the following C code directive: __attribute__ ((section("tzfw_coherent_mem"))) Or alternatively the following assembler code directive: .section tzfw_coherent_mem The `tzfw_coherent_mem` section is used to allocate any data structures that are accessed both when a CPU is executing with its MMU and caches enabled, and when it's running with its MMU and caches disabled. Examples are given below. The following variables, functions and constants must be defined by the platform for the firmware to work correctly. ### File : platform_def.h [mandatory] Each platform must ensure that a header file of this name is in the system include path with the following constants defined. This may require updating the list of `PLAT_INCLUDES` in the `platform.mk` file. In the ARM FVP port, this file is found in [plat/fvp/include/platform_def.h]. * **#define : PLATFORM_LINKER_FORMAT** Defines the linker format used by the platform, for example `elf64-littleaarch64` used by the FVP. * **#define : PLATFORM_LINKER_ARCH** Defines the processor architecture for the linker by the platform, for example `aarch64` used by the FVP. * **#define : PLATFORM_STACK_SIZE** Defines the normal stack memory available to each CPU. This constant is used by [plat/common/aarch64/platform_mp_stack.S] and [plat/common/aarch64/platform_up_stack.S]. * **#define : FIRMWARE_WELCOME_STR** Defines the character string printed by BL1 upon entry into the `bl1_main()` function. * **#define : BL2_IMAGE_NAME** Name of the BL2 binary image on the host file-system. This name is used by BL1 to load BL2 into secure memory from non-volatile storage. * **#define : BL31_IMAGE_NAME** Name of the BL3-1 binary image on the host file-system. This name is used by BL2 to load BL3-1 into secure memory from platform storage. * **#define : BL33_IMAGE_NAME** Name of the BL3-3 binary image on the host file-system. This name is used by BL2 to load BL3-3 into non-secure memory from platform storage. * **#define : PLATFORM_CACHE_LINE_SIZE** Defines the size (in bytes) of the largest cache line across all the cache levels in the platform. * **#define : PLATFORM_CLUSTER_COUNT** Defines the total number of clusters implemented by the platform in the system. * **#define : PLATFORM_CORE_COUNT** Defines the total number of CPUs implemented by the platform across all clusters in the system. * **#define : PLATFORM_MAX_CPUS_PER_CLUSTER** Defines the maximum number of CPUs that can be implemented within a cluster on the platform. * **#define : PLATFORM_NUM_AFFS** Defines the total number of nodes in the affinity heirarchy at all affinity levels used by the platform. * **#define : BL1_RO_BASE** Defines the base address in secure ROM where BL1 originally lives. Must be aligned on a page-size boundary. * **#define : BL1_RO_LIMIT** Defines the maximum address in secure ROM that BL1's actual content (i.e. excluding any data section allocated at runtime) can occupy. * **#define : BL1_RW_BASE** Defines the base address in secure RAM where BL1's read-write data will live at runtime. Must be aligned on a page-size boundary. * **#define : BL1_RW_LIMIT** Defines the maximum address in secure RAM that BL1's read-write data can occupy at runtime. * **#define : BL2_BASE** Defines the base address in secure RAM where BL1 loads the BL2 binary image. Must be aligned on a page-size boundary. * **#define : BL2_LIMIT** Defines the maximum address in secure RAM that the BL2 image can occupy. * **#define : BL31_BASE** Defines the base address in secure RAM where BL2 loads the BL3-1 binary image. Must be aligned on a page-size boundary. * **#define : BL31_LIMIT** Defines the maximum address in secure RAM that the BL3-1 image can occupy. * **#define : NS_IMAGE_OFFSET** Defines the base address in non-secure DRAM where BL2 loads the BL3-3 binary image. Must be aligned on a page-size boundary. If a BL3-2 image is supported by the platform, the following constants must also be defined: * **#define : BL32_IMAGE_NAME** Name of the BL3-2 binary image on the host file-system. This name is used by BL2 to load BL3-2 into secure memory from platform storage. * **#define : BL32_BASE** Defines the base address in secure memory where BL2 loads the BL3-2 binary image. Must be aligned on a page-size boundary. * **#define : BL32_LIMIT** Defines the maximum address that the BL3-2 image can occupy. If the Test Secure-EL1 Payload (TSP) instantiation of BL3-2 is supported by the platform, the following constants must also be defined: * **#define : TSP_SEC_MEM_BASE** Defines the base address of the secure memory used by the TSP image on the platform. This must be at the same address or below `BL32_BASE`. * **#define : TSP_SEC_MEM_SIZE** Defines the size of the secure memory used by the BL3-2 image on the platform. `TSP_SEC_MEM_BASE` and `TSP_SEC_MEM_SIZE` must fully accomodate the memory required by the BL3-2 image, defined by `BL32_BASE` and `BL32_LIMIT`. * **#define : TSP_IRQ_SEC_PHY_TIMER** Defines the ID of the secure physical generic timer interrupt used by the TSP's interrupt handling code. If the platform port uses the IO storage framework, the following constants must also be defined: * **#define : MAX_IO_DEVICES** Defines the maximum number of registered IO devices. Attempting to register more devices than this value using `io_register_device()` will fail with IO_RESOURCES_EXHAUSTED. * **#define : MAX_IO_HANDLES** Defines the maximum number of open IO handles. Attempting to open more IO entities than this value using `io_open()` will fail with IO_RESOURCES_EXHAUSTED. The following constants are optional. They should be defined when the platform memory layout implies some image overlaying like on FVP. * **#define : BL31_PROGBITS_LIMIT** Defines the maximum address in secure RAM that the BL3-1's progbits sections can occupy. * **#define : TSP_PROGBITS_LIMIT** Defines the maximum address that the TSP's progbits sections can occupy. ### File : plat_macros.S [mandatory] Each platform must ensure a file of this name is in the system include path with the following macro defined. In the ARM FVP port, this file is found in [plat/fvp/include/plat_macros.S]. * **Macro : plat_print_gic_regs** This macro allows the crash reporting routine to print GIC registers in case of an unhandled exception in BL3-1. This aids in debugging and this macro can be defined to be empty in case GIC register reporting is not desired. * **Macro : plat_print_interconnect_regs** This macro allows the crash reporting routine to print interconnect registers in case of an unhandled exception in BL3-1. This aids in debugging and this macro can be defined to be empty in case interconnect register reporting is not desired. In the ARM FVP port, the CCI snoop control registers are reported. ### Other mandatory modifications The following mandatory modifications may be implemented in any file the implementer chooses. In the ARM FVP port, they are implemented in [plat/fvp/aarch64/plat_common.c]. * **Function : uint64_t plat_get_syscnt_freq(void)** This function is used by the architecture setup code to retrieve the counter frequency for the CPU's generic timer. This value will be programmed into the `CNTFRQ_EL0` register. In the ARM FVP port, it returns the base frequency of the system counter, which is retrieved from the first entry in the frequency modes table. 2.2 Handling Reset ------------------ BL1 by default implements the reset vector where execution starts from a cold or warm boot. BL3-1 can be optionally set as a reset vector using the RESET_TO_BL31 make variable. For each CPU, the reset vector code is responsible for the following tasks: 1. Distinguishing between a cold boot and a warm boot. 2. In the case of a cold boot and the CPU being a secondary CPU, ensuring that the CPU is placed in a platform-specific state until the primary CPU performs the necessary steps to remove it from this state. 3. In the case of a warm boot, ensuring that the CPU jumps to a platform- specific address in the BL3-1 image in the same processor mode as it was when released from reset. The following functions need to be implemented by the platform port to enable reset vector code to perform the above tasks. ### Function : platform_get_entrypoint() [mandatory] Argument : unsigned long Return : unsigned int This function is called with the `SCTLR.M` and `SCTLR.C` bits disabled. The CPU is identified by its `MPIDR`, which is passed as the argument. The function is responsible for distinguishing between a warm and cold reset using platform- specific means. If it's a warm reset then it returns the entrypoint into the BL3-1 image that the CPU must jump to. If it's a cold reset then this function must return zero. This function is also responsible for implementing a platform-specific mechanism to handle the condition where the CPU has been warm reset but there is no entrypoint to jump to. This function does not follow the Procedure Call Standard used by the Application Binary Interface for the ARM 64-bit architecture. The caller should not assume that callee saved registers are preserved across a call to this function. This function fulfills requirement 1 and 3 listed above. ### Function : plat_secondary_cold_boot_setup() [mandatory] Argument : void Return : void This function is called with the MMU and data caches disabled. It is responsible for placing the executing secondary CPU in a platform-specific state until the primary CPU performs the necessary actions to bring it out of that state and allow entry into the OS. In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is responsible for powering up the secondary CPU when normal world software requires them. This function fulfills requirement 2 above. ### Function : platform_is_primary_cpu() [mandatory] Argument : unsigned long Return : unsigned int This function identifies a CPU by its `MPIDR`, which is passed as the argument, to determine whether this CPU is the primary CPU or a secondary CPU. A return value of zero indicates that the CPU is not the primary CPU, while a non-zero return value indicates that the CPU is the primary CPU. ### Function : platform_mem_init() [mandatory] Argument : void Return : void This function is called before any access to data is made by the firmware, in order to carry out any essential memory initialization. The ARM FVP port uses this function to initialize the mailbox memory used for providing the warm-boot entry-point addresses. 2.3 Common optional modifications --------------------------------- The following are helper functions implemented by the firmware that perform common platform-specific tasks. A platform may choose to override these definitions. ### Function : platform_get_core_pos() Argument : unsigned long Return : int A platform may need to convert the `MPIDR` of a CPU to an absolute number, which can be used as a CPU-specific linear index into blocks of memory (for example while allocating per-CPU stacks). This routine contains a simple mechanism to perform this conversion, using the assumption that each cluster contains a maximum of 4 CPUs: linear index = cpu_id + (cluster_id * 4) cpu_id = 8-bit value in MPIDR at affinity level 0 cluster_id = 8-bit value in MPIDR at affinity level 1 ### Function : platform_set_stack() Argument : unsigned long Return : void This function sets the current stack pointer to the normal memory stack that has been allocated for the CPU specificed by MPIDR. For BL images that only require a stack for the primary CPU the parameter is ignored. The size of the stack allocated to each CPU is specified by the platform defined constant `PLATFORM_STACK_SIZE`. Common implementations of this function for the UP and MP BL images are provided in [plat/common/aarch64/platform_up_stack.S] and [plat/common/aarch64/platform_mp_stack.S] ### Function : platform_get_stack() Argument : unsigned long Return : unsigned long This function returns the base address of the normal memory stack that has been allocated for the CPU specificed by MPIDR. For BL images that only require a stack for the primary CPU the parameter is ignored. The size of the stack allocated to each CPU is specified by the platform defined constant `PLATFORM_STACK_SIZE`. Common implementations of this function for the UP and MP BL images are provided in [plat/common/aarch64/platform_up_stack.S] and [plat/common/aarch64/platform_mp_stack.S] ### Function : plat_report_exception() Argument : unsigned int Return : void A platform may need to report various information about its status when an exception is taken, for example the current exception level, the CPU security state (secure/non-secure), the exception type, and so on. This function is called in the following circumstances: * In BL1, whenever an exception is taken. * In BL2, whenever an exception is taken. The default implementation doesn't do anything, to avoid making assumptions about the way the platform displays its status information. This function receives the exception type as its argument. Possible values for exceptions types are listed in the [include/runtime_svc.h] header file. Note that these constants are not related to any architectural exception code; they are just an ARM Trusted Firmware convention. ### Function : plat_reset_handler() Argument : void Return : void A platform may need to do additional initialization after reset. This function allows the platform to do the platform specific intializations. Platform specific errata workarounds could also be implemented here. The api should preserve the value in x10 register as it is used by the caller to store the return address. The default implementation doesn't do anything. ### Function : plat_disable_acp() Argument : void Return : void This api allows a platform to disable the Accelerator Coherency Port (if present) during a cluster power down sequence. The default weak implementation doesn't do anything. Since this api is called during the power down sequence, it has restrictions for stack usage and it can use the registers x0 - x17 as scratch registers. It should preserve the value in x18 register as it is used by the caller to store the return address. 3. Modifications specific to a Boot Loader stage ------------------------------------------------- 3.1 Boot Loader Stage 1 (BL1) ----------------------------- BL1 implements the reset vector where execution starts from after a cold or warm boot. For each CPU, BL1 is responsible for the following tasks: 1. Handling the reset as described in section 2.2 2. In the case of a cold boot and the CPU being the primary CPU, ensuring that only this CPU executes the remaining BL1 code, including loading and passing control to the BL2 stage. 3. Loading the BL2 image from non-volatile storage into secure memory at the address specified by the platform defined constant `BL2_BASE`. 4. Populating a `meminfo` structure with the following information in memory, accessible by BL2 immediately upon entry. meminfo.total_base = Base address of secure RAM visible to BL2 meminfo.total_size = Size of secure RAM visible to BL2 meminfo.free_base = Base address of secure RAM available for allocation to BL2 meminfo.free_size = Size of secure RAM available for allocation to BL2 BL1 places this `meminfo` structure at the beginning of the free memory available for its use. Since BL1 cannot allocate memory dynamically at the moment, its free memory will be available for BL2's use as-is. However, this means that BL2 must read the `meminfo` structure before it starts using its free memory (this is discussed in Section 3.2). In future releases of the ARM Trusted Firmware it will be possible for the platform to decide where it wants to place the `meminfo` structure for BL2. BL1 implements the `bl1_init_bl2_mem_layout()` function to populate the BL2 `meminfo` structure. The platform may override this implementation, for example if the platform wants to restrict the amount of memory visible to BL2. Details of how to do this are given below. The following functions need to be implemented by the platform port to enable BL1 to perform the above tasks. ### Function : bl1_plat_arch_setup() [mandatory] Argument : void Return : void This function performs any platform-specific and architectural setup that the platform requires. Platform-specific setup might include configuration of memory controllers, configuration of the interconnect to allow the cluster to service cache snoop requests from another cluster, and so on. In the ARM FVP port, this function enables CCI snoops into the cluster that the primary CPU is part of. It also enables the MMU. This function helps fulfill requirement 2 above. ### Function : bl1_platform_setup() [mandatory] Argument : void Return : void This function executes with the MMU and data caches enabled. It is responsible for performing any remaining platform-specific setup that can occur after the MMU and data cache have been enabled. This function is also responsible for initializing the storage abstraction layer which is used to load further bootloader images. This function helps fulfill requirement 3 above. ### Function : bl1_plat_sec_mem_layout() [mandatory] Argument : void Return : meminfo * This function should only be called on the cold boot path. It executes with the MMU and data caches enabled. The pointer returned by this function must point to a `meminfo` structure containing the extents and availability of secure RAM for the BL1 stage. meminfo.total_base = Base address of secure RAM visible to BL1 meminfo.total_size = Size of secure RAM visible to BL1 meminfo.free_base = Base address of secure RAM available for allocation to BL1 meminfo.free_size = Size of secure RAM available for allocation to BL1 This information is used by BL1 to load the BL2 image in secure RAM. BL1 also populates a similar structure to tell BL2 the extents of memory available for its own use. This function helps fulfill requirement 3 above. ### Function : bl1_init_bl2_mem_layout() [optional] Argument : meminfo *, meminfo *, unsigned int, unsigned long Return : void BL1 needs to tell the next stage the amount of secure RAM available for it to use. This information is populated in a `meminfo` structure. Depending upon where BL2 has been loaded in secure RAM (determined by `BL2_BASE`), BL1 calculates the amount of free memory available for BL2 to use. BL1 also ensures that its data sections resident in secure RAM are not visible to BL2. An illustration of how this is done in the ARM FVP port is given in the [User Guide], in the Section "Memory layout on Base FVP". ### Function : bl1_plat_set_bl2_ep_info() [mandatory] Argument : image_info *, entry_point_info * Return : void This function is called after loading BL2 image and it can be used to overwrite the entry point set by loader and also set the security state and SPSR which represents the entry point system state for BL2. On FVP, we are setting the security state and the SPSR for the BL2 entrypoint 3.2 Boot Loader Stage 2 (BL2) ----------------------------- The BL2 stage is executed only by the primary CPU, which is determined in BL1 using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at `BL2_BASE`. BL2 executes in Secure EL1 and is responsible for: 1. (Optional) Loading the BL3-0 binary image (if present) from platform provided non-volatile storage. To load the BL3-0 image, BL2 makes use of the `meminfo` returned by the `bl2_plat_get_bl30_meminfo()` function. The platform also defines the address in memory where BL3-0 is loaded through the optional constant `BL30_BASE`. BL2 uses this information to determine if there is enough memory to load the BL3-0 image. Subsequent handling of the BL3-0 image is platform-specific and is implemented in the `bl2_plat_handle_bl30()` function. If `BL30_BASE` is not defined then this step is not performed. 2. Loading the BL3-1 binary image into secure RAM from non-volatile storage. To load the BL3-1 image, BL2 makes use of the `meminfo` structure passed to it by BL1. This structure allows BL2 to calculate how much secure RAM is available for its use. The platform also defines the address in secure RAM where BL3-1 is loaded through the constant `BL31_BASE`. BL2 uses this information to determine if there is enough memory to load the BL3-1 image. 3. (Optional) Loading the BL3-2 binary image (if present) from platform provided non-volatile storage. To load the BL3-2 image, BL2 makes use of the `meminfo` returned by the `bl2_plat_get_bl32_meminfo()` function. The platform also defines the address in memory where BL3-2 is loaded through the optional constant `BL32_BASE`. BL2 uses this information to determine if there is enough memory to load the BL3-2 image. If `BL32_BASE` is not defined then this and the next step is not performed. 4. (Optional) Arranging to pass control to the BL3-2 image (if present) that has been pre-loaded at `BL32_BASE`. BL2 populates an `entry_point_info` structure in memory provided by the platform with information about how BL3-1 should pass control to the BL3-2 image. 5. Loading the normal world BL3-3 binary image into non-secure DRAM from platform storage and arranging for BL3-1 to pass control to this image. This address is determined using the `plat_get_ns_image_entrypoint()` function described below. 6. BL2 populates an `entry_point_info` structure in memory provided by the platform with information about how BL3-1 should pass control to the other BL images. The following functions must be implemented by the platform port to enable BL2 to perform the above tasks. ### Function : bl2_early_platform_setup() [mandatory] Argument : meminfo * Return : void This function executes with the MMU and data caches disabled. It is only called by the primary CPU. The arguments to this function is the address of the `meminfo` structure populated by BL1. The platform must copy the contents of the `meminfo` structure into a private variable as the original memory may be subsequently overwritten by BL2. The copied structure is made available to all BL2 code through the `bl2_plat_sec_mem_layout()` function. ### Function : bl2_plat_arch_setup() [mandatory] Argument : void Return : void This function executes with the MMU and data caches disabled. It is only called by the primary CPU. The purpose of this function is to perform any architectural initialization that varies across platforms, for example enabling the MMU (since the memory map differs across platforms). ### Function : bl2_platform_setup() [mandatory] Argument : void Return : void This function may execute with the MMU and data caches enabled if the platform port does the necessary initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU. The purpose of this function is to perform any platform initialization specific to BL2. Platform security components are configured if required. For the Base FVP the TZC-400 TrustZone controller is configured to only grant non-secure access to DRAM. This avoids aliasing between secure and non-secure accesses in the TLB and cache - secure execution states can use the NS attributes in the MMU translation tables to access the DRAM. This function is also responsible for initializing the storage abstraction layer which is used to load further bootloader images. ### Function : bl2_plat_sec_mem_layout() [mandatory] Argument : void Return : meminfo * This function should only be called on the cold boot path. It may execute with the MMU and data caches enabled if the platform port does the necessary initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU. The purpose of this function is to return a pointer to a `meminfo` structure populated with the extents of secure RAM available for BL2 to use. See `bl2_early_platform_setup()` above. ### Function : bl2_plat_get_bl30_meminfo() [mandatory] Argument : meminfo * Return : void This function is used to get the memory limits where BL2 can load the BL3-0 image. The meminfo provided by this is used by load_image() to validate whether the BL3-0 image can be loaded within the given memory from the given base. ### Function : bl2_plat_handle_bl30() [mandatory] Argument : image_info * Return : int This function is called after loading BL3-0 image and it is used to perform any platform-specific actions required to handle the SCP firmware. Typically it transfers the image into SCP memory using a platform-specific protocol and waits until SCP executes it and signals to the Application Processor (AP) for BL2 execution to continue. This function returns 0 on success, a negative error code otherwise. ### Function : bl2_plat_get_bl31_params() [mandatory] Argument : void Return : bl31_params * BL2 platform code needs to return a pointer to a `bl31_params` structure it will use for passing information to BL3-1. The `bl31_params` structure carries the following information. - Header describing the version information for interpreting the bl31_param structure - Information about executing the BL3-3 image in the `bl33_ep_info` field - Information about executing the BL3-2 image in the `bl32_ep_info` field - Information about the type and extents of BL3-1 image in the `bl31_image_info` field - Information about the type and extents of BL3-2 image in the `bl32_image_info` field - Information about the type and extents of BL3-3 image in the `bl33_image_info` field The memory pointed by this structure and its sub-structures should be accessible from BL3-1 initialisation code. BL3-1 might choose to copy the necessary content, or maintain the structures until BL3-3 is initialised. ### Funtion : bl2_plat_get_bl31_ep_info() [mandatory] Argument : void Return : entry_point_info * BL2 platform code returns a pointer which is used to populate the entry point information for BL3-1 entry point. The location pointed by it should be accessible from BL1 while processing the synchronous exception to run to BL3-1. On FVP this is allocated inside an bl2_to_bl31_params_mem structure which is allocated at an address pointed by PARAMS_BASE. ### Function : bl2_plat_set_bl31_ep_info() [mandatory] Argument : image_info *, entry_point_info * Return : void This function is called after loading BL3-1 image and it can be used to overwrite the entry point set by loader and also set the security state and SPSR which represents the entry point system state for BL3-1. On FVP, we are setting the security state and the SPSR for the BL3-1 entrypoint. ### Function : bl2_plat_set_bl32_ep_info() [mandatory] Argument : image_info *, entry_point_info * Return : void This function is called after loading BL3-2 image and it can be used to overwrite the entry point set by loader and also set the security state and SPSR which represents the entry point system state for BL3-2. On FVP, we are setting the security state and the SPSR for the BL3-2 entrypoint ### Function : bl2_plat_set_bl33_ep_info() [mandatory] Argument : image_info *, entry_point_info * Return : void This function is called after loading BL3-3 image and it can be used to overwrite the entry point set by loader and also set the security state and SPSR which represents the entry point system state for BL3-3. On FVP, we are setting the security state and the SPSR for the BL3-3 entrypoint ### Function : bl2_plat_get_bl32_meminfo() [mandatory] Argument : meminfo * Return : void This function is used to get the memory limits where BL2 can load the BL3-2 image. The meminfo provided by this is used by load_image() to validate whether the BL3-2 image can be loaded with in the given memory from the given base. ### Function : bl2_plat_get_bl33_meminfo() [mandatory] Argument : meminfo * Return : void This function is used to get the memory limits where BL2 can load the BL3-3 image. The meminfo provided by this is used by load_image() to validate whether the BL3-3 image can be loaded with in the given memory from the given base. ### Function : bl2_plat_flush_bl31_params() [mandatory] Argument : void Return : void Once BL2 has populated all the structures that needs to be read by BL1 and BL3-1 including the bl31_params structures and its sub-structures, the bl31_ep_info structure and any platform specific data. It flushes all these data to the main memory so that it is available when we jump to later Bootloader stages with MMU off ### Function : plat_get_ns_image_entrypoint() [mandatory] Argument : void Return : unsigned long As previously described, BL2 is responsible for arranging for control to be passed to a normal world BL image through BL3-1. This function returns the entrypoint of that image, which BL3-1 uses to jump to it. BL2 is responsible for loading the normal world BL3-3 image (e.g. UEFI). 3.2 Boot Loader Stage 3-1 (BL3-1) --------------------------------- During cold boot, the BL3-1 stage is executed only by the primary CPU. This is determined in BL1 using the `platform_is_primary_cpu()` function. BL1 passes control to BL3-1 at `BL31_BASE`. During warm boot, BL3-1 is executed by all CPUs. BL3-1 executes at EL3 and is responsible for: 1. Re-initializing all architectural and platform state. Although BL1 performs some of this initialization, BL3-1 remains resident in EL3 and must ensure that EL3 architectural and platform state is completely initialized. It should make no assumptions about the system state when it receives control. 2. Passing control to a normal world BL image, pre-loaded at a platform- specific address by BL2. BL3-1 uses the `entry_point_info` structure that BL2 populated in memory to do this. 3. Providing runtime firmware services. Currently, BL3-1 only implements a subset of the Power State Coordination Interface (PSCI) API as a runtime service. See Section 3.3 below for details of porting the PSCI implementation. 4. Optionally passing control to the BL3-2 image, pre-loaded at a platform- specific address by BL2. BL3-1 exports a set of apis that allow runtime services to specify the security state in which the next image should be executed and run the corresponding image. BL3-1 uses the `entry_point_info` structure populated by BL2 to do this. If BL3-1 is a reset vector, It also needs to handle the reset as specified in section 2.2 before the tasks described above. The following functions must be implemented by the platform port to enable BL3-1 to perform the above tasks. ### Function : bl31_early_platform_setup() [mandatory] Argument : bl31_params *, void * Return : void This function executes with the MMU and data caches disabled. It is only called by the primary CPU. The arguments to this function are: * The address of the `bl31_params` structure populated by BL2. * An opaque pointer that the platform may use as needed. The platform can copy the contents of the `bl31_params` structure and its sub-structures into private variables if the original memory may be subsequently overwritten by BL3-1 and similarly the `void *` pointing to the platform data also needs to be saved. On the ARM FVP port, BL2 passes a pointer to a `bl31_params` structure populated in the secure DRAM at address `0x6000000` in the bl31_params * argument and it does not use opaque pointer mentioned earlier. BL3-1 does not copy this information to internal data structures as it guarantees that the secure DRAM memory will not be overwritten. It maintains an internal reference to this information in the `bl2_to_bl31_params` variable. ### Function : bl31_plat_arch_setup() [mandatory] Argument : void Return : void This function executes with the MMU and data caches disabled. It is only called by the primary CPU. The purpose of this function is to perform any architectural initialization that varies across platforms, for example enabling the MMU (since the memory map differs across platforms). ### Function : bl31_platform_setup() [mandatory] Argument : void Return : void This function may execute with the MMU and data caches enabled if the platform port does the necessary initialization in `bl31_plat_arch_setup()`. It is only called by the primary CPU. The purpose of this function is to complete platform initialization so that both BL3-1 runtime services and normal world software can function correctly. The ARM FVP port does the following: * Initializes the generic interrupt controller. * Configures the CLCD controller. * Enables system-level implementation of the generic timer counter. * Grants access to the system counter timer module * Initializes the FVP power controller device * Detects the system topology. ### Function : bl31_get_next_image_info() [mandatory] Argument : unsigned int Return : entry_point_info * This function may execute with the MMU and data caches enabled if the platform port does the necessary initializations in `bl31_plat_arch_setup()`. This function is called by `bl31_main()` to retrieve information provided by BL2 for the next image in the security state specified by the argument. BL3-1 uses this information to pass control to that image in the specified security state. This function must return a pointer to the `entry_point_info` structure (that was copied during `bl31_early_platform_setup()`) if the image exists. It should return NULL otherwise. 3.3 Power State Coordination Interface (in BL3-1) ------------------------------------------------ The ARM Trusted Firmware's implementation of the PSCI API is based around the concept of an _affinity instance_. Each _affinity instance_ can be uniquely identified in a system by a CPU ID (the processor `MPIDR` is used in the PSCI interface) and an _affinity level_. A processing element (for example, a CPU) is at level 0. If the CPUs in the system are described in a tree where the node above a CPU is a logical grouping of CPUs that share some state, then affinity level 1 is that group of CPUs (for example, a cluster), and affinity level 2 is a group of clusters (for example, the system). The implementation assumes that the affinity level 1 ID can be computed from the affinity level 0 ID (for example, a unique cluster ID can be computed from the CPU ID). The current implementation computes this on the basis of the recommended use of `MPIDR` affinity fields in the ARM Architecture Reference Manual. BL3-1's platform initialization code exports a pointer to the platform-specific power management operations required for the PSCI implementation to function correctly. This information is populated in the `plat_pm_ops` structure. The PSCI implementation calls members of the `plat_pm_ops` structure for performing power management operations for each affinity instance. For example, the target CPU is specified by its `MPIDR` in a PSCI `CPU_ON` call. The `affinst_on()` handler (if present) is called for each affinity instance as the PSCI implementation powers up each affinity level implemented in the `MPIDR` (for example, CPU, cluster and system). The following functions must be implemented to initialize PSCI functionality in the ARM Trusted Firmware. ### Function : plat_get_aff_count() [mandatory] Argument : unsigned int, unsigned long Return : unsigned int This function may execute with the MMU and data caches enabled if the platform port does the necessary initializations in `bl31_plat_arch_setup()`. It is only called by the primary CPU. This function is called by the PSCI initialization code to detect the system topology. Its purpose is to return the number of affinity instances implemented at a given `affinity level` (specified by the first argument) and a given `MPIDR` (specified by the second argument). For example, on a dual-cluster system where first cluster implements 2 CPUs and the second cluster implements 4 CPUs, a call to this function with an `MPIDR` corresponding to the first cluster (`0x0`) and affinity level 0, would return 2. A call to this function with an `MPIDR` corresponding to the second cluster (`0x100`) and affinity level 0, would return 4. ### Function : plat_get_aff_state() [mandatory] Argument : unsigned int, unsigned long Return : unsigned int This function may execute with the MMU and data caches enabled if the platform port does the necessary initializations in `bl31_plat_arch_setup()`. It is only called by the primary CPU. This function is called by the PSCI initialization code. Its purpose is to return the state of an affinity instance. The affinity instance is determined by the affinity ID at a given `affinity level` (specified by the first argument) and an `MPIDR` (specified by the second argument). The state can be one of `PSCI_AFF_PRESENT` or `PSCI_AFF_ABSENT`. The latter state is used to cater for system topologies where certain affinity instances are unimplemented. For example, consider a platform that implements a single cluster with 4 CPUs and another CPU implemented directly on the interconnect with the cluster. The `MPIDR`s of the cluster would range from `0x0-0x3`. The `MPIDR` of the single CPU would be 0x100 to indicate that it does not belong to cluster 0. Cluster 1 is missing but needs to be accounted for to reach this single CPU in the topology tree. Hence it is marked as `PSCI_AFF_ABSENT`. ### Function : plat_get_max_afflvl() [mandatory] Argument : void Return : int This function may execute with the MMU and data caches enabled if the platform port does the necessary initializations in `bl31_plat_arch_setup()`. It is only called by the primary CPU. This function is called by the PSCI implementation both during cold and warm boot, to determine the maximum affinity level that the power management operations should apply to. ARMv8-A has support for 4 affinity levels. It is likely that hardware will implement fewer affinity levels. This function allows the PSCI implementation to consider only those affinity levels in the system that the platform implements. For example, the Base AEM FVP implements two clusters with a configurable number of CPUs. It reports the maximum affinity level as 1, resulting in PSCI power control up to the cluster level. ### Function : platform_setup_pm() [mandatory] Argument : const plat_pm_ops ** Return : int This function may execute with the MMU and data caches enabled if the platform port does the necessary initializations in `bl31_plat_arch_setup()`. It is only called by the primary CPU. This function is called by PSCI initialization code. Its purpose is to export handler routines for platform-specific power management actions by populating the passed pointer with a pointer to BL3-1's private `plat_pm_ops` structure. A description of each member of this structure is given below. Please refer to the ARM FVP specific implementation of these handlers in [plat/fvp/fvp_pm.c] as an example. A platform port may choose not implement some of the power management operations. #### plat_pm_ops.affinst_standby() Perform the platform-specific setup to enter the standby state indicated by the passed argument. #### plat_pm_ops.affinst_on() Perform the platform specific setup to power on an affinity instance, specified by the `MPIDR` (first argument) and `affinity level` (fourth argument). The `state` (fifth argument) contains the current state of that affinity instance (ON or OFF). This is useful to determine whether any action must be taken. For example, while powering on a CPU, the cluster that contains this CPU might already be in the ON state. The platform decides what actions must be taken to transition from the current state to the target state (indicated by the power management operation). #### plat_pm_ops.affinst_off() Perform the platform specific setup to power off an affinity instance in the `MPIDR` of the calling CPU. It is called by the PSCI `CPU_OFF` API implementation. The `MPIDR` (first argument), `affinity level` (second argument) and `state` (third argument) have a similar meaning as described in the `affinst_on()` operation. They are used to identify the affinity instance on which the call is made and its current state. This gives the platform port an indication of the state transition it must make to perform the requested action. For example, if the calling CPU is the last powered on CPU in the cluster, after powering down affinity level 0 (CPU), the platform port should power down affinity level 1 (the cluster) as well. #### plat_pm_ops.affinst_suspend() Perform the platform specific setup to power off an affinity instance in the `MPIDR` of the calling CPU. It is called by the PSCI `CPU_SUSPEND` API implementation. The `MPIDR` (first argument), `affinity level` (third argument) and `state` (fifth argument) have a similar meaning as described in the `affinst_on()` operation. They are used to identify the affinity instance on which the call is made and its current state. This gives the platform port an indication of the state transition it must make to perform the requested action. For example, if the calling CPU is the last powered on CPU in the cluster, after powering down affinity level 0 (CPU), the platform port should power down affinity level 1 (the cluster) as well. The difference between turning an affinity instance off versus suspending it is that in the former case, the affinity instance is expected to re-initialize its state when its next powered on (see `affinst_on_finish()`). In the latter case, the affinity instance is expected to save enough state so that it can resume execution by restoring this state when its powered on (see `affinst_suspend_finish()`). #### plat_pm_ops.affinst_on_finish() This function is called by the PSCI implementation after the calling CPU is powered on and released from reset in response to an earlier PSCI `CPU_ON` call. It performs the platform-specific setup required to initialize enough state for this CPU to enter the normal world and also provide secure runtime firmware services. The `MPIDR` (first argument), `affinity level` (second argument) and `state` (third argument) have a similar meaning as described in the previous operations. #### plat_pm_ops.affinst_on_suspend() This function is called by the PSCI implementation after the calling CPU is powered on and released from reset in response to an asynchronous wakeup event, for example a timer interrupt that was programmed by the CPU during the `CPU_SUSPEND` call. It performs the platform-specific setup required to restore the saved state for this CPU to resume execution in the normal world and also provide secure runtime firmware services. The `MPIDR` (first argument), `affinity level` (second argument) and `state` (third argument) have a similar meaning as described in the previous operations. BL3-1 platform initialization code must also detect the system topology and the state of each affinity instance in the topology. This information is critical for the PSCI runtime service to function correctly. More details are provided in the description of the `plat_get_aff_count()` and `plat_get_aff_state()` functions above. 3.4 Interrupt Management framework (in BL3-1) ---------------------------------------------- BL3-1 implements an Interrupt Management Framework (IMF) to manage interrupts generated in either security state and targeted to EL1 or EL2 in the non-secure state or EL3/S-EL1 in the secure state. The design of this framework is described in the [IMF Design Guide] A platform should export the following APIs to support the IMF. The following text briefly describes each api and its implementation on the FVP port. The API implementation depends upon the type of interrupt controller present in the platform. The FVP implements an ARM Generic Interrupt Controller (ARM GIC) as per the version 2.0 of the [ARM GIC Architecture Specification] ### Function : plat_interrupt_type_to_line() [mandatory] Argument : uint32_t, uint32_t Return : uint32_t The ARM processor signals an interrupt exception either through the IRQ or FIQ interrupt line. The specific line that is signaled depends on how the interrupt controller (IC) reports different interrupt types from an execution context in either security state. The IMF uses this API to determine which interrupt line the platform IC uses to signal each type of interrupt supported by the framework from a given security state. The first parameter will be one of the `INTR_TYPE_*` values (see [IMF Design Guide]) indicating the target type of the interrupt, the second parameter is the security state of the originating execution context. The return result is the bit position in the `SCR_EL3` register of the respective interrupt trap: IRQ=1, FIQ=2. The FVP port configures the ARM GIC to signal S-EL1 interrupts as FIQs and Non-secure interrupts as IRQs from either security state. ### Function : plat_ic_get_pending_interrupt_type() [mandatory] Argument : void Return : uint32_t This API returns the type of the highest priority pending interrupt at the platform IC. The IMF uses the interrupt type to retrieve the corresponding handler function. `INTR_TYPE_INVAL` is returned when there is no interrupt pending. The valid interrupt types that can be returned are `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`. The FVP port reads the _Highest Priority Pending Interrupt Register_ (`GICC_HPPIR`) to determine the id of the pending interrupt. The type of interrupt depends upon the id value as follows. 1. id < 1022 is reported as a S-EL1 interrupt 2. id = 1022 is reported as a Non-secure interrupt. 3. id = 1023 is reported as an invalid interrupt type. ### Function : plat_ic_get_pending_interrupt_id() [mandatory] Argument : void Return : uint32_t This API returns the id of the highest priority pending interrupt at the platform IC. The IMF passes the id returned by this API to the registered handler for the pending interrupt if the `IMF_READ_INTERRUPT_ID` build time flag is set. INTR_ID_UNAVAILABLE is returned when there is no interrupt pending. The FVP port reads the _Highest Priority Pending Interrupt Register_ (`GICC_HPPIR`) to determine the id of the pending interrupt. The id that is returned by API depends upon the value of the id read from the interrupt controller as follows. 1. id < 1022. id is returned as is. 2. id = 1022. The _Aliased Highest Priority Pending Interrupt Register_ (`GICC_AHPPIR`) is read to determine the id of the non-secure interrupt. This id is returned by the API. 3. id = 1023. `INTR_ID_UNAVAILABLE` is returned. ### Function : plat_ic_acknowledge_interrupt() [mandatory] Argument : void Return : uint32_t This API is used by the CPU to indicate to the platform IC that processing of the highest pending interrupt has begun. It should return the id of the interrupt which is being processed. The FVP port reads the _Interrupt Acknowledge Register_ (`GICC_IAR`). This changes the state of the highest priority pending interrupt from pending to active in the interrupt controller. It returns the value read from the `GICC_IAR`. This value is the id of the interrupt whose state has been changed. The TSP uses this API to start processing of the secure physical timer interrupt. ### Function : plat_ic_end_of_interrupt() [mandatory] Argument : uint32_t Return : void This API is used by the CPU to indicate to the platform IC that processing of the interrupt corresponding to the id (passed as the parameter) has finished. The id should be the same as the id returned by the `plat_ic_acknowledge_interrupt()` API. The FVP port writes the id to the _End of Interrupt Register_ (`GICC_EOIR`). This deactivates the corresponding interrupt in the interrupt controller. The TSP uses this API to finish processing of the secure physical timer interrupt. ### Function : plat_ic_get_interrupt_type() [mandatory] Argument : uint32_t Return : uint32_t This API returns the type of the interrupt id passed as the parameter. `INTR_TYPE_INVAL` is returned if the id is invalid. If the id is valid, a valid interrupt type (one of `INTR_TYPE_EL3`, `INTR_TYPE_S_EL1` and `INTR_TYPE_NS`) is returned depending upon how the interrupt has been configured by the platform IC. The FVP port configures S-EL1 interrupts as Group0 interrupts and Non-secure interrupts as Group1 interrupts. It reads the group value corresponding to the interrupt id from the relevant _Interrupt Group Register_ (`GICD_IGROUPRn`). It uses the group value to determine the type of interrupt. 3.5 Crash Reporting mechanism (in BL3-1) ---------------------------------------------- BL3-1 implements a crash reporting mechanism which prints the various registers of the CPU to enable quick crash analysis and debugging. It requires that a console is designated as the crash console by the platform which will be used to print the register dump. The following functions must be implemented by the platform if it wants crash reporting mechanism in BL3-1. The functions are implemented in assembly so that they can be invoked without a C Runtime stack. ### Function : plat_crash_console_init Argument : void Return : int This API is used by the crash reporting mechanism to initialize the crash console. It should only use the general purpose registers x0 to x2 to do the initialization and returns 1 on success. The FVP port designates the `PL011_UART0` as the crash console and calls the console_core_init() to initialize the console. ### Function : plat_crash_console_putc Argument : int Return : int This API is used by the crash reporting mechanism to print a character on the designated crash console. It should only use general purpose registers x1 and x2 to do its work. The parameter and the return value are in general purpose register x0. The FVP port designates the `PL011_UART0` as the crash console and calls the console_core_putc() to print the character on the console. 4. C Library ------------- To avoid subtle toolchain behavioral dependencies, the header files provided by the compiler are not used. The software is built with the `-nostdinc` flag to ensure no headers are included from the toolchain inadvertently. Instead the required headers are included in the ARM Trusted Firmware source tree. The library only contains those C library definitions required by the local implementation. If more functionality is required, the needed library functions will need to be added to the local implementation. Versions of [FreeBSD] headers can be found in `include/stdlib`. Some of these headers have been cut down in order to simplify the implementation. In order to minimize changes to the header files, the [FreeBSD] layout has been maintained. The generic C library definitions can be found in `include/stdlib` with more system and machine specific declarations in `include/stdlib/sys` and `include/stdlib/machine`. The local C library implementations can be found in `lib/stdlib`. In order to extend the C library these files may need to be modified. It is recommended to use a release version of [FreeBSD] as a starting point. The C library header files in the [FreeBSD] source tree are located in the `include` and `sys/sys` directories. [FreeBSD] machine specific definitions can be found in the `sys/` directories. These files define things like 'the size of a pointer' and 'the range of an integer'. Since an AArch64 port for [FreeBSD] does not yet exist, the machine specific definitions are based on existing machine types with similar properties (for example SPARC64). Where possible, C library function implementations were taken from [FreeBSD] as found in the `lib/libc` directory. A copy of the [FreeBSD] sources can be downloaded with `git`. git clone git://github.com/freebsd/freebsd.git -b origin/release/9.2.0 5. Storage abstraction layer ----------------------------- In order to improve platform independence and portability an storage abstraction layer is used to load data from non-volatile platform storage. Each platform should register devices and their drivers via the Storage layer. These drivers then need to be initialized by bootloader phases as required in their respective `blx_platform_setup()` functions. Currently storage access is only required by BL1 and BL2 phases. The `load_image()` function uses the storage layer to access non-volatile platform storage. It is mandatory to implement at least one storage driver. For the FVP the Firmware Image Package(FIP) driver is provided as the default means to load data from storage (see the "Firmware Image Package" section in the [User Guide]). The storage layer is described in the header file `include/io_storage.h`. The implementation of the common library is in `lib/io_storage.c` and the driver files are located in `drivers/io/`. Each IO driver must provide `io_dev_*` structures, as described in `drivers/io/io_driver.h`. These are returned via a mandatory registration function that is called on platform initialization. The semi-hosting driver implementation in `io_semihosting.c` can be used as an example. The Storage layer provides mechanisms to initialize storage devices before IO operations are called. The basic operations supported by the layer include `open()`, `close()`, `read()`, `write()`, `size()` and `seek()`. Drivers do not have to implement all operations, but each platform must provide at least one driver for a device capable of supporting generic operations such as loading a bootloader image. The current implementation only allows for known images to be loaded by the firmware. These images are specified by using their names, as defined in [include/plat/common/platform.h]. The platform layer (`plat_get_image_source()`) then returns a reference to a device and a driver-specific `spec` which will be understood by the driver to allow access to the image data. The layer is designed in such a way that is it possible to chain drivers with other drivers. For example, file-system drivers may be implemented on top of physical block devices, both represented by IO devices with corresponding drivers. In such a case, the file-system "binding" with the block device may be deferred until the file-system device is initialised. The abstraction currently depends on structures being statically allocated by the drivers and callers, as the system does not yet provide a means of dynamically allocating memory. This may also have the affect of limiting the amount of open resources per driver. - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ [ARM GIC Architecture Specification]: http://arminfo.emea.arm.com/help/topic/com.arm.doc.ihi0048b/IHI0048B_gic_architecture_specification.pdf [IMF Design Guide]: interrupt-framework-design.md [User Guide]: user-guide.md [FreeBSD]: http://www.freebsd.org [plat/common/aarch64/platform_mp_stack.S]: ../plat/common/aarch64/platform_mp_stack.S [plat/common/aarch64/platform_up_stack.S]: ../plat/common/aarch64/platform_up_stack.S [plat/fvp/include/platform_def.h]: ../plat/fvp/include/platform_def.h [plat/fvp/include/plat_macros.S]: ../plat/fvp/include/plat_macros.S [plat/fvp/aarch64/plat_common.c]: ../plat/fvp/aarch64/plat_common.c [plat/fvp/plat_pm.c]: ../plat/fvp/plat_pm.c [include/runtime_svc.h]: ../include/runtime_svc.h [include/plat/common/platform.h]: ../include/plat/common/platform.h arm-trusted-firmware-1.0-aw-6/docs/rt-svc-writers-guide.md000066400000000000000000000323201322600646200234640ustar00rootroot00000000000000EL3 Runtime Service Writers Guide for ARM Trusted Firmware ========================================================== Contents -------- 1. Introduction 2. Owning Entities, Call Types and Function IDs 3. Getting started 4. Registering a runtime service 5. Initializing a runtime service 6. Handling runtime service requests 7. Services that contain multiple sub-services 8. Secure-EL1 Payload Dispatcher service (SPD) - - - - - - - - - - - - - - - - - - 1. Introduction ---------------- This document describes how to add a runtime service to the EL3 Runtime Firmware component of ARM Trusted Firmware (BL3-1). Software executing in the normal world and in the trusted world at exception levels lower than EL3 will request runtime services using the Secure Monitor Call (SMC) instruction. These requests will follow the convention described in the SMC Calling Convention PDD ([SMCCC]). The [SMCCC] assigns function identifiers to each SMC request and describes how arguments are passed and results are returned. SMC Functions are grouped together based on the implementor of the service, for example a subset of the Function IDs are designated as "OEM Calls" (see [SMCCC] for full details). The EL3 runtime services framework in BL3-1 enables the independent implementation of services for each group, which are then compiled into the BL3-1 image. This simplifies the integration of common software from ARM to support [PSCI], Secure Monitor for a Trusted OS and SoC specific software. The common runtime services framework ensures that SMC Functions are dispatched to their respective service implementation - the [Firmware Design] provides details of how this is achieved. The interface and operation of the runtime services depends heavily on the concepts and definitions described in the [SMCCC], in particular SMC Function IDs, Owning Entity Numbers (OEN), Fast and Standard calls, and the SMC32 and SMC64 calling conventions. Please refer to that document for a full explanation of these terms. 2. Owning Entities, Call Types and Function IDs ------------------------------------------------ The SMC Function Identifier includes a OEN field. These values and their meaning are described in [SMCCC] and summarized in table 1 below. Some entities are allocated a range of of OENs. The OEN must be interpreted in conjunction with the SMC call type, which is either _Fast_ or _Standard_. Fast calls are uninterruptible whereas Standard calls can be pre-empted. The majority of Owning Entities only have allocated ranges for Fast calls: Standard calls are reserved exclusively for Trusted OS providers or for interoperability with legacy 32-bit software that predates the [SMCCC]. Type OEN Service Fast 0 ARM Architecture calls Fast 1 CPU Service calls Fast 2 SiP Service calls Fast 3 OEM Service calls Fast 4 Standard Service calls Fast 5-47 Reserved for future use Fast 48-49 Trusted Application calls Fast 50-63 Trusted OS calls Std 0- 1 Reserved for existing ARMv7 calls Std 2-63 Trusted OS Standard Calls _Table 1: Service types and their corresponding Owning Entity Numbers_ Each individual entity can allocate the valid identifiers within the entity range as they need - it is not necessary to coordinate with other entities of the same type. For example, two SoC providers can use the same Function ID within the SiP Service calls OEN range to mean different things - as these calls should be specific to the SoC. The Standard Runtime Calls OEN is used for services defined by ARM standards, such as [PSCI]. The SMC Function ID also indicates whether the call has followed the SMC32 calling convention, where all parameters are 32-bit, or the SMC64 calling convention, where the parameters are 64-bit. The framework identifies and rejects invalid calls that use the SMC64 calling convention but that originate from an AArch32 caller. The EL3 runtime services framework uses the call type and OEN to identify a specific handler for each SMC call, but it is expected that an individual handler will be responsible for all SMC Functions within a given service type. 3. Getting started ------------------- ARM Trusted Firmware has a [`services`] directory in the source tree under which each owning entity can place the implementation of its runtime service. The [PSCI] implementation is located here in the [`services/std_svc/psci`] directory. Runtime service sources will need to include the [`runtime_svc.h`] header file. 4. Registering a runtime service --------------------------------- A runtime service is registered using the `DECLARE_RT_SVC()` macro, specifying the name of the service, the range of OENs covered, the type of service and initialization and call handler functions. #define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) * `_name` is used to identify the data structure declared by this macro, and is also used for diagnostic purposes * `_start` and `_end` values must be based on the `OEN_*` values defined in [`runtime_svc.h`] * `_type` must be one of `SMC_TYPE_FAST` or `SMC_TYPE_STD` * `_setup` is the initialization function with the `rt_svc_init` signature: typedef int32_t (*rt_svc_init)(void); * `_smch` is the SMC handler function with the `rt_svc_handle` signature: typedef uint64_t (*rt_svc_handle)(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *reserved, void *handle, uint64_t flags); Details of the requirements and behavior of the two callbacks is provided in the following sections. During initialization the services framework validates each declared service to ensure that the following conditions are met: 1. The `_start` OEN is not greater than the `_end` OEN 2. The `_end` OEN does not exceed the maximum OEN value (63) 3. The `_type` is one of `SMC_TYPE_FAST` or `SMC_TYPE_STD` 4. `_setup` and `_smch` routines have been specified [`std_svc_setup.c`] provides an example of registering a runtime service: /* Register Standard Service Calls as runtime service */ DECLARE_RT_SVC( std_svc, OEN_STD_START, OEN_STD_END, SMC_TYPE_FAST, std_svc_setup, std_svc_smc_handler ); 5. Initializing a runtime service --------------------------------- Runtime services are initialized once, during cold boot, by the primary CPU after platform and architectural initialization is complete. The framework performs basic validation of the declared service before calling the service initialization function (`_setup` in the declaration). This function must carry out any essential EL3 initialization prior to receiving a SMC Function call via the handler function. On success, the initialization function must return `0`. Any other return value will cause the framework to issue a diagnostic: Error initializing runtime service and then ignore the service - the system will continue to boot but SMC calls will not be passed to the service handler and instead return the _Unknown SMC Function ID_ result `0xFFFFFFFF`. If the system must not be allowed to proceed without the service, the initialization function must itself cause the firmware boot to be halted. If the service uses per-CPU data this must either be initialized for all CPUs during this call, or be done lazily when a CPU first issues an SMC call to that service. 6. Handling runtime service requests ------------------------------------- SMC calls for a service are forwarded by the framework to the service's SMC handler function (`_smch` in the service declaration). This function must have the following signature: typedef uint64_t (*rt_svc_handle)(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *reserved, void *handle, uint64_t flags); The handler is responsible for: 1. Determining that `smc_fid` is a valid and supported SMC Function ID, otherwise completing the request with the _Unknown SMC Function ID_: SMC_RET1(handle, SMC_UNK); 2. Determining if the requested function is valid for the calling security state. SMC Calls can be made from both the normal and trusted worlds and the framework will forward all calls to the service handler. The `flags` parameter to this function indicates the caller security state in bit[0], where a value of `1` indicates a non-secure caller. The `is_caller_secure(flags)` and `is_caller_non_secure(flags)` can be used to test this condition. If invalid, the request should be completed with: SMC_RET1(handle, SMC_UNK); 3. Truncating parameters for calls made using the SMC32 calling convention. Such calls can be determined by checking the CC field in bit[30] of the `smc_fid` parameter, for example by using: if (GET_SMC_CC(smc_fid) == SMC_32) ... For such calls, the upper bits of the parameters x1-x4 and the saved parameters X5-X7 are UNDEFINED and must be explicitly ignored by the handler. This can be done by truncating the values to a suitable 32-bit integer type before use, for example by ensuring that functions defined to handle individual SMC Functions use appropriate 32-bit parameters. 4. Providing the service requested by the SMC Function, utilizing the immediate parameters x1-x4 and/or the additional saved parameters X5-X7. The latter can be retrieved using the `SMC_GET_GP(handle, ref)` function, supplying the appropriate `CTX_GPREG_Xn` reference, e.g. uint64_t x6 = SMC_GET_GP(handle, CTX_GPREG_X6); 5. Implementing the standard SMC32 Functions that provide information about the implementation of the service. These are the Call Count, Implementor UID and Revision Details for each service documented in section 6 of the [SMCCC]. The ARM Trusted Firmware expects owning entities to follow this recommendation. 5. Returning the result to the caller. The [SMCCC] allows for up to 256 bits of return value in SMC64 using X0-X3 and 128 bits in SMC32 using W0-W3. The framework provides a family of macros to set the multi-register return value and complete the handler: SMC_RET1(handle, x0); SMC_RET2(handle, x0, x1); SMC_RET3(handle, x0, x1, x2); SMC_RET4(handle, x0, x1, x2, x3); The `reserved` parameter to the handler is reserved for future use and can be ignored. The value returned by a SMC handler is also reserved for future use - completion of the handler function must always be via one of the `SMC_RETn()` macros. NOTE: The PSCI and Test Secure-EL1 Payload Dispatcher services do not follow all of the above requirements yet. 7. Services that contain multiple sub-services ----------------------------------------------- It is possible that a single owning entity implements multiple sub-services. For example, the Standard calls service handles `0x84000000`-`0x8400FFFF` and `0xC4000000`-`0xC400FFFF` functions. Within that range, the [PSCI] service handles the `0x84000000`-`0x8400001F` and `0xC4000000`-`0xC400001F` functions. In that respect, [PSCI] is a 'sub-service' of the Standard calls service. In future, there could be additional such sub-services in the Standard calls service which perform independent functions. In this situation it may be valuable to introduce a second level framework to enable independent implementation of sub-services. Such a framework might look very similar to the current runtime services framework, but using a different part of the SMC Function ID to identify the sub-service. Trusted Firmware does not provide such a framework at present. 8. Secure-EL1 Payload Dispatcher service (SPD) ----------------------------------------------- Services that handle SMC Functions targeting a Trusted OS, Trusted Application, or other Secure-EL1 Payload are special. These services need to manage the Secure-EL1 context, provide the _Secure Monitor_ functionality of switching between the normal and secure worlds, deliver SMC Calls through to Secure-EL1 and generally manage the Secure-EL1 Payload through CPU power-state transitions. TODO: Provide details of the additional work required to implement a SPD and the BL3-1 support for these services. Or a reference to the document that will provide this information.... - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2014, ARM Limited and Contributors. All rights reserved._ [Firmware Design]: ./firmware-design.md [`services`]: ../services [`services/std_svc/psci`]: ../services/std_svc/psci [`std_svc_setup.c`]: ../services/std_svc/std_svc_setup.c [`runtime_svc.h`]: ../include/runtime_svc.h [PSCI]: http://infocenter.arm.com/help/topic/com.arm.doc.den0022b/index.html "Power State Coordination Interface PDD (ARM DEN 0022B.b)" [SMCCC]: http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html "SMC Calling Convention PDD (ARM DEN 0028A)" arm-trusted-firmware-1.0-aw-6/docs/user-guide.md000066400000000000000000001205511322600646200215330ustar00rootroot00000000000000ARM Trusted Firmware User Guide =============================== Contents : 1. Introduction 2. Host machine requirements 3. Tools 4. Building the Trusted Firmware 5. Obtaining the normal world software 6. Preparing the images to run on FVP 7. Running the software on FVP 8. Preparing the images to run on Juno 9. Running the software on Juno 1. Introduction ---------------- This document describes how to build ARM Trusted Firmware and run it with a tested set of other software components using defined configurations on the Juno ARM development platform and ARM Fixed Virtual Platform (FVP) models. It is possible to use other software components, configurations and platforms but that is outside the scope of this document. This document should be used in conjunction with the [Firmware Design]. 2. Host machine requirements ----------------------------- The minimum recommended machine specification for building the software and running the FVP models is a dual-core processor running at 2GHz with 12GB of RAM. For best performance, use a machine with a quad-core processor running at 2.6GHz with 16GB of RAM. The software has been tested on Ubuntu 12.04.04 (64-bit). Packages used for building the software were installed from that distribution unless otherwise specified. 3. Tools --------- The following tools are required to use the ARM Trusted Firmware: * `git` package to obtain source code. * `build-essential`, `uuid-dev` and `iasl` packages for building UEFI and the Firmware Image Package (FIP) tool. * `bc` and `ncurses-dev` packages for building Linux. * `device-tree-compiler` package for building the Flattened Device Tree (FDT) source files (`.dts` files) provided with this software. * Baremetal GNU GCC tools. Verified packages can be downloaded from [Linaro] [Linaro Toolchain]. The rest of this document assumes that the `gcc-linaro-aarch64-none-elf-4.9-2014.07_linux.tar.xz` tools are used. wget http://releases.linaro.org/14.07/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.9-2014.07_linux.tar.xz tar -xf gcc-linaro-aarch64-none-elf-4.9-2014.07_linux.tar.xz * (Optional) For debugging, ARM [Development Studio 5 (DS-5)][DS-5] v5.19. 4. Building the Trusted Firmware --------------------------------- To build the Trusted Firmware images, follow these steps: 1. Clone the ARM Trusted Firmware repository from GitHub: git clone https://github.com/ARM-software/arm-trusted-firmware.git 2. Change to the trusted firmware directory: cd arm-trusted-firmware 3. Set the compiler path, specify a Non-trusted Firmware image (BL3-3) and a valid platform, and then build: CROSS_COMPILE=/bin/aarch64-none-elf- \ BL33=/ \ make PLAT= all fip If `PLAT` is not specified, `fvp` is assumed by default. See the "Summary of build options" for more information on available build options. The BL3-3 image corresponds to the software that is executed after switching to the non-secure world. UEFI can be used as the BL3-3 image. Refer to the "Obtaining the normal world software" section below. The TSP (Test Secure Payload), corresponding to the BL3-2 image, is not compiled in by default. Refer to the "Building the Test Secure Payload" section below. By default this produces a release version of the build. To produce a debug version instead, refer to the "Debugging options" section below. The build process creates products in a `build` directory tree, building the objects and binaries for each boot loader stage in separate sub-directories. The following boot loader binary files are created from the corresponding ELF files: * `build///bl1.bin` * `build///bl2.bin` * `build///bl31.bin` where `` is the name of the chosen platform and `` is either `debug` or `release`. A Firmare Image Package (FIP) will be created as part of the build. It contains all boot loader images except for `bl1.bin`. * `build///fip.bin` For more information on FIPs, see the "Firmware Image Package" section in the [Firmware Design]. 4. (Optional) Some platforms may require a BL3-0 image to boot. This image can be included in the FIP when building the Trusted Firmware by specifying the `BL30` build option: BL30=/ 5. Output binary files `bl1.bin` and `fip.bin` are both required to boot the system. How these files are used is platform specific. Refer to the platform documentation on how to use the firmware images. 6. (Optional) Build products for a specific build variant can be removed using: make DEBUG= PLAT= clean ... where `` is `0` or `1`, as specified when building. The build tree can be removed completely using: make realclean ### Summary of build options ARM Trusted Firmware build system supports the following build options. Unless mentioned otherwise, these options are expected to be specified at the build command line and are not to be modified in any component makefiles. Note that the build system doesn't track dependency for build options. Therefore, if any of the build options are changed from a previous build, a clean build must be performed. #### Common build options * `BL30`: Path to BL3-0 image in the host file system. This image is optional. If a BL3-0 image is present then this option must be passed for the `fip` target. * `BL33`: Path to BL33 image in the host file system. This is mandatory for `fip` target. * `CROSS_COMPILE`: Prefix to toolchain binaries. Please refer to examples in this document for usage. * `DEBUG`: Chooses between a debug and release build. It can take either 0 (release) or 1 (debug) as values. 0 is the default. * `LOG_LEVEL`: Chooses the log level, which controls the amount of console log output compiled into the build. This should be one of the following: 0 (LOG_LEVEL_NONE) 10 (LOG_LEVEL_NOTICE) 20 (LOG_LEVEL_ERROR) 30 (LOG_LEVEL_WARNING) 40 (LOG_LEVEL_INFO) 50 (LOG_LEVEL_VERBOSE) All log output up to and including the log level is compiled into the build. The default value is 40 in debug builds and 20 in release builds. * `NS_TIMER_SWITCH`: Enable save and restore for non-secure timer register contents upon world switch. It can take either 0 (don't save and restore) or 1 (do save and restore). 0 is the default. An SPD may set this to 1 if it wants the timer registers to be saved and restored. * `PLAT`: Choose a platform to build ARM Trusted Firmware for. The chosen platform name must be the name of one of the directories under the `plat/` directory other than `common`. * `SPD`: Choose a Secure Payload Dispatcher component to be built into the Trusted Firmware. The value should be the path to the directory containing the SPD source, relative to `services/spd/`; the directory is expected to contain a makefile called `.mk`. * `V`: Verbose build. If assigned anything other than 0, the build commands are printed. Default is 0. * `ARM_GIC_ARCH`: Choice of ARM GIC architecture version used by the ARM GIC driver for implementing the platform GIC API. This API is used by the interrupt management framework. Default is 2 (that is, version 2.0). * `IMF_READ_INTERRUPT_ID`: Boolean flag used by the interrupt management framework to enable passing of the interrupt id to its handler. The id is read using a platform GIC API. `INTR_ID_UNAVAILABLE` is passed instead if this option set to 0. Default is 0. * `RESET_TO_BL31`: Enable BL3-1 entrypoint as the CPU reset vector instead of the BL1 entrypoint. It can take the value 0 (CPU reset to BL1 entrypoint) or 1 (CPU reset to BL3-1 entrypoint). The default value is 0. * `CRASH_REPORTING`: A non-zero value enables a console dump of processor register state when an unexpected exception occurs during execution of BL3-1. This option defaults to the value of `DEBUG` - i.e. by default this is only enabled for a debug build of the firmware. * `ASM_ASSERTION`: This flag determines whether the assertion checks within assembly source files are enabled or not. This option defaults to the value of `DEBUG` - that is, by default this is only enabled for a debug build of the firmware. * `TSP_INIT_ASYNC`: Choose BL3-2 initialization method as asynchronous or synchronous, (see "Initializing a BL3-2 Image" section in [Firmware Design]). It can take the value 0 (BL3-2 is initialized using synchronous method) or 1 (BL3-2 is initialized using asynchronous method). Default is 0. #### FVP specific build options * `FVP_SHARED_DATA_LOCATION`: location of the shared memory page. Available options: - `tsram` (default) : top of Trusted SRAM - `tdram` : base of Trusted DRAM * `FVP_TSP_RAM_LOCATION`: location of the TSP binary. Options: - `tsram` (default) : base of Trusted SRAM - `tdram` : Trusted DRAM (above shared data) For a better understanding of FVP options, the FVP memory map is explained in the [Firmware Design]. ### Creating a Firmware Image Package FIPs are automatically created as part of the build instructions described in the previous section. It is also possible to independently build the FIP creation tool and FIPs if required. To do this, follow these steps: Build the tool: make -C tools/fip_create It is recommended to remove the build artifacts before rebuilding: make -C tools/fip_create clean Create a Firmware package that contains existing BL2 and BL3-1 images: # fip_create --help to print usage information # fip_create [--dump to show result] ./tools/fip_create/fip_create fip.bin --dump \ --bl2 build//debug/bl2.bin --bl31 build//debug/bl31.bin Firmware Image Package ToC: --------------------------- - Trusted Boot Firmware BL2: offset=0x88, size=0x81E8 file: 'build//debug/bl2.bin' - EL3 Runtime Firmware BL3-1: offset=0x8270, size=0xC218 file: 'build//debug/bl31.bin' --------------------------- Creating "fip.bin" View the contents of an existing Firmware package: ./tools/fip_create/fip_create fip.bin --dump Firmware Image Package ToC: --------------------------- - Trusted Boot Firmware BL2: offset=0x88, size=0x81E8 - EL3 Runtime Firmware BL3-1: offset=0x8270, size=0xC218 --------------------------- Existing package entries can be individially updated: # Change the BL2 from Debug to Release version ./tools/fip_create/fip_create fip.bin --dump \ --bl2 build//release/bl2.bin Firmware Image Package ToC: --------------------------- - Trusted Boot Firmware BL2: offset=0x88, size=0x7240 file: 'build//release/bl2.bin' - EL3 Runtime Firmware BL3-1: offset=0x72C8, size=0xC218 --------------------------- Updating "fip.bin" ### Debugging options To compile a debug version and make the build more verbose use CROSS_COMPILE=/bin/aarch64-none-elf- \ BL33=/ \ make PLAT= DEBUG=1 V=1 all fip AArch64 GCC uses DWARF version 4 debugging symbols by default. Some tools (for example DS-5) might not support this and may need an older version of DWARF symbols to be emitted by GCC. This can be achieved by using the `-gdwarf-` flag, with the version being set to 2 or 3. Setting the version to 2 is recommended for DS-5 versions older than 5.16. When debugging logic problems it might also be useful to disable all compiler optimizations by using `-O0`. NOTE: Using `-O0` could cause output images to be larger and base addresses might need to be recalculated (see the "Memory layout of BL images" section in the [Firmware Design]). Extra debug options can be passed to the build system by setting `CFLAGS`: CFLAGS='-O0 -gdwarf-2' \ CROSS_COMPILE=/bin/aarch64-none-elf- \ BL33=/ \ make PLAT= DEBUG=1 V=1 all fip ### Building the Test Secure Payload The TSP is coupled with a companion runtime service in the BL3-1 firmware, called the TSPD. Therefore, if you intend to use the TSP, the BL3-1 image must be recompiled as well. For more information on SPs and SPDs, see the "Secure-EL1 Payloads and Dispatchers" section in the [Firmware Design]. First clean the Trusted Firmware build directory to get rid of any previous BL3-1 binary. Then to build the TSP image and include it into the FIP use: CROSS_COMPILE=/bin/aarch64-none-elf- \ BL33=/ \ make PLAT= SPD=tspd all fip An additional boot loader binary file is created in the `build` directory: * `build///bl32.bin` The FIP will now contain the additional BL3-2 image. Here is an example output from an FVP build in release mode including BL3-2 and using FVP_AARCH64_EFI.fd as BL3-3 image: Firmware Image Package ToC: --------------------------- - Trusted Boot Firmware BL2: offset=0xD8, size=0x6000 file: './build/fvp/release/bl2.bin' - EL3 Runtime Firmware BL3-1: offset=0x60D8, size=0x9000 file: './build/fvp/release/bl31.bin' - Secure Payload BL3-2 (Trusted OS): offset=0xF0D8, size=0x3000 file: './build/fvp/release/bl32.bin' - Non-Trusted Firmware BL3-3: offset=0x120D8, size=0x280000 file: '../FVP_AARCH64_EFI.fd' --------------------------- Creating "build/fvp/release/fip.bin" ### Checking source code style When making changes to the source for submission to the project, the source must be in compliance with the Linux style guide, and to assist with this check the project Makefile contains two targets, which both utilise the `checkpatch.pl` script that ships with the Linux source tree. To check the entire source tree, you must first download a copy of `checkpatch.pl` (or the full Linux source), set the `CHECKPATCH` environment variable to point to the script and build the target checkcodebase: make CHECKPATCH=/linux/scripts/checkpatch.pl checkcodebase To just check the style on the files that differ between your local branch and the remote master, use: make CHECKPATCH=/linux/scripts/checkpatch.pl checkpatch If you wish to check your patch against something other than the remote master, set the `BASE_COMMIT` variable to your desired branch. By default, `BASE_COMMIT` is set to `origin/master`. 5. Obtaining the normal world software --------------------------------------- ### Obtaining EDK2 Potentially any kind of non-trusted firmware may be used with the ARM Trusted Firmware but the software has only been tested with the EFI Development Kit 2 (EDK2) open source implementation of the UEFI specification. To build the software to be compatible with the Foundation and Base FVPs, or the Juno platform, follow these steps: 1. Clone the [EDK2 source code][EDK2] from GitHub: git clone -n https://github.com/tianocore/edk2.git Not all required features are available in the EDK2 mainline yet. These can be obtained from the ARM-software EDK2 repository instead: cd edk2 git remote add -f --tags arm-software https://github.com/ARM-software/edk2.git git checkout --detach v1.2 2. Copy build config templates to local workspace # in edk2/ . edksetup.sh 3. Build the EDK2 host tools make -C BaseTools clean make -C BaseTools 4. Build the EDK2 software 1. Build for FVP GCC49_AARCH64_PREFIX=/bin/aarch64-none-elf- \ make -f ArmPlatformPkg/Scripts/Makefile EDK2_ARCH=AARCH64 \ EDK2_DSC=ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-FVP-AArch64.dsc \ EDK2_TOOLCHAIN=GCC49 EDK2_BUILD=RELEASE \ EDK2_MACROS="-n 6 -D ARM_FOUNDATION_FVP=1" The EDK2 binary for use with the ARM Trusted Firmware can then be found here: Build/ArmVExpress-FVP-AArch64/RELEASE_GCC49/FV/FVP_AARCH64_EFI.fd 2. Build for Juno GCC49_AARCH64_PREFIX=/bin/aarch64-none-elf- \ make -f ArmPlatformPkg/ArmJunoPkg/Makefile EDK2_ARCH=AARCH64 \ EDK2_TOOLCHAIN=GCC49 EDK2_BUILD=RELEASE The EDK2 binary for use with the ARM Trusted Firmware can then be found here: Build/ArmJuno/RELEASE_GCC49/FV/BL33_AP_UEFI.fd The EDK2 binary should be specified as `BL33` in in the `make` command line when building the Trusted Firmware. See the "Building the Trusted Firmware" section above. 5. (Optional) To build EDK2 in debug mode, remove `EDK2_BUILD=RELEASE` from the command line. 6. (Optional) To boot Linux using a VirtioBlock file-system, the command line passed from EDK2 to the Linux kernel must be modified as described in the "Obtaining a root file-system" section below. 7. (Optional) If legacy GICv2 locations are used, the EDK2 platform description must be updated. This is required as EDK2 does not support probing for the GIC location. To do this, first clean the EDK2 build directory. make -f ArmPlatformPkg/Scripts/Makefile EDK2_ARCH=AARCH64 \ EDK2_DSC=ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-FVP-AArch64.dsc \ EDK2_TOOLCHAIN=ARMGCC clean Then rebuild EDK2 as described in step 3, using the following flag: -D ARM_FVP_LEGACY_GICV2_LOCATION=1 Finally rebuild the Trusted Firmware to generate a new FIP using the instructions in the "Building the Trusted Firmware" section. ### Obtaining a Linux kernel Preparing a Linux kernel for use on the FVPs can be done as follows (GICv2 support only): 1. Clone Linux: git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Not all required features are available in the kernel mainline yet. These can be obtained from the ARM-software EDK2 repository instead: cd linux git remote add -f --tags arm-software https://github.com/ARM-software/linux.git git checkout --detach 1.1-Juno 2. Build with the Linaro GCC tools. # in linux/ make mrproper make ARCH=arm64 defconfig CROSS_COMPILE=/bin/aarch64-none-elf- \ make -j6 ARCH=arm64 The compiled Linux image will now be found at `arch/arm64/boot/Image`. 6. Preparing the images to run on FVP -------------------------------------- ### Obtaining the Flattened Device Trees Depending on the FVP configuration and Linux configuration used, different FDT files are required. FDTs for the Foundation and Base FVPs can be found in the Trusted Firmware source directory under `fdts/`. The Foundation FVP has a subset of the Base FVP components. For example, the Foundation FVP lacks CLCD and MMC support, and has only one CPU cluster. * `fvp-base-gicv2-psci.dtb` (Default) For use with both AEMv8 and Cortex-A57-A53 Base FVPs with Base memory map configuration. * `fvp-base-gicv2legacy-psci.dtb` For use with AEMv8 Base FVP with legacy VE GIC memory map configuration. * `fvp-base-gicv3-psci.dtb` For use with both AEMv8 and Cortex-A57-A53 Base FVPs with Base memory map configuration and Linux GICv3 support. * `fvp-foundation-gicv2-psci.dtb` (Default) For use with Foundation FVP with Base memory map configuration. * `fvp-foundation-gicv2legacy-psci.dtb` For use with Foundation FVP with legacy VE GIC memory map configuration. * `fvp-foundation-gicv3-psci.dtb` For use with Foundation FVP with Base memory map configuration and Linux GICv3 support. Copy the chosen FDT blob as `fdt.dtb` to the directory from which the FVP is launched. Alternatively a symbolic link may be used. ### Preparing the kernel image Copy the kernel image file `arch/arm64/boot/Image` to the directory from which the FVP is launched. Alternatively a symbolic link may be used. ### Obtaining a root file-system To prepare a Linaro LAMP based Open Embedded file-system, the following instructions can be used as a guide. The file-system can be provided to Linux via VirtioBlock or as a RAM-disk. Both methods are described below. #### Prepare VirtioBlock To prepare a VirtioBlock file-system, do the following: 1. Download and unpack the disk image. NOTE: The unpacked disk image grows to 3 GiB in size. wget http://releases.linaro.org/14.07/openembedded/aarch64/vexpress64-openembedded_lamp-armv8-gcc-4.9_20140727-682.img.gz gunzip vexpress64-openembedded_lamp-armv8-gcc-4.9_20140727-682.img.gz 2. Make sure the Linux kernel has Virtio support enabled using `make ARCH=arm64 menuconfig`. Device Drivers ---> Virtio drivers ---> <*> Platform bus driver for memory mapped virtio devices Device Drivers ---> [*] Block devices ---> <*> Virtio block driver File systems ---> <*> The Extended 4 (ext4) filesystem If some of these configurations are missing, enable them, save the kernel configuration, then rebuild the kernel image using the instructions provided in the section "Obtaining a Linux kernel". 3. Change the Kernel command line to include `root=/dev/vda2`. This can either be done in the EDK2 boot menu or in the platform file. Editing the platform file and rebuilding EDK2 will make the change persist. To do this: 1. In EDK2, edit the following file: ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-FVP-AArch64.dsc 2. Add `root=/dev/vda2` to: gArmPlatformTokenSpaceGuid.PcdDefaultBootArgument|"" 3. Remove the entry: gArmPlatformTokenSpaceGuid.PcdDefaultBootInitrdPath|"" 4. Rebuild EDK2 (see "Obtaining UEFI" section above). 4. The file-system image file should be provided to the model environment by passing it the correct command line option. In the FVPs the following option should be provided in addition to the ones described in the "Running the software on FVP" section below. NOTE: A symbolic link to this file cannot be used with the FVP; the path to the real file must be provided. On the Base FVPs: -C bp.virtioblockdevice.image_path="/" On the Foundation FVP: --block-device="/" 5. Ensure that the FVP doesn't output any error messages. If the following error message is displayed: ERROR: BlockDevice: Failed to open "/"! then make sure the path to the file-system image in the model parameter is correct and that read permission is correctly set on the file-system image file. #### Prepare RAM-disk To prepare a RAM-disk root file-system, do the following: 1. Download the file-system image: wget http://releases.linaro.org/14.07/openembedded/aarch64/linaro-image-lamp-genericarmv8-20140727-701.rootfs.tar.gz 2. Modify the Linaro image: # Prepare for use as RAM-disk. Normally use MMC, NFS or VirtioBlock. # Be careful, otherwise you could damage your host file-system. mkdir tmp; cd tmp sudo sh -c "zcat ../linaro-image-lamp-genericarmv8-20140727-701.rootfs.tar.gz | cpio -id" sudo ln -s sbin/init . sudo sh -c "echo 'devtmpfs /dev devtmpfs mode=0755,nosuid 0 0' >> etc/fstab" sudo sh -c "find . | cpio --quiet -H newc -o | gzip -3 -n > ../filesystem.cpio.gz" cd .. 3. Copy the resultant `filesystem.cpio.gz` to the directory where the FVP is launched from. Alternatively a symbolic link may be used. 7. Running the software on FVP ------------------------------- This version of the ARM Trusted Firmware has been tested on the following ARM FVPs (64-bit versions only). * `Foundation_v8` (Version 2.1, Build 9.0.24) * `FVP_Base_AEMv8A-AEMv8A` (Version 5.8, Build 0.8.5802) * `FVP_Base_Cortex-A57x4-A53x4` (Version 5.8, Build 0.8.5802) * `FVP_Base_Cortex-A57x1-A53x1` (Version 5.8, Build 0.8.5802) * `FVP_Base_Cortex-A57x2-A53x4` (Version 5.8, Build 0.8.5802) NOTE: The build numbers quoted above are those reported by launching the FVP with the `--version` parameter. NOTE: The software will not work on Version 1.0 of the Foundation FVP. The commands below would report an `unhandled argument` error in this case. NOTE: The Foundation FVP does not provide a debugger interface. Please refer to the FVP documentation for a detailed description of the model parameter options. A brief description of the important ones that affect the ARM Trusted Firmware and normal world software behavior is provided below. The Foundation FVP is a cut down version of the AArch64 Base FVP. It can be downloaded for free from [ARM's website][ARM FVP website]. ### Running on the Foundation FVP with reset to BL1 entrypoint The following `Foundation_v8` parameters should be used to boot Linux with 4 CPUs using the ARM Trusted Firmware. NOTE: Using the `--block-device` parameter is not necessary if a Linux RAM-disk file-system is used (see the "Obtaining a File-system" section above). NOTE: The `--data=""@0x8000000` parameter is used to load a Firmware Image Package at the start of NOR FLASH0 (see the "Building the Trusted Firmware" section above). /Foundation_v8 \ --cores=4 \ --no-secure-memory \ --visualization \ --gicv3 \ --data="/"@0x0 \ --data="/"@0x8000000 \ --block-device="/" The default use-case for the Foundation FVP is to enable the GICv3 device in the model but use the GICv2 FDT, in order for Linux to drive the GIC in GICv2 emulation mode. The memory mapped addresses `0x0` and `0x8000000` correspond to the start of trusted ROM and NOR FLASH0 respectively. ### Notes regarding Base FVP configuration options Please refer to these notes in the subsequent "Running on the Base FVP" sections. 1. The `-C bp.flashloader0.fname` parameter is used to load a Firmware Image Package at the start of NOR FLASH0 (see the "Building the Trusted Firmware" section above). 2. Using `cache_state_modelled=1` makes booting very slow. The software will still work (and run much faster) without this option but this will hide any cache maintenance defects in the software. 3. Using the `-C bp.virtioblockdevice.image_path` parameter is not necessary if a Linux RAM-disk file-system is used (see the "Obtaining a root file-system" section above). 4. Setting the `-C bp.secure_memory` parameter to `1` is only supported on Base FVP versions 5.4 and newer. Setting this parameter to `0` is also supported. The `-C bp.tzc_400.diagnostics=1` parameter is optional. It instructs the FVP to provide some helpful information if a secure memory violation occurs. 5. This and the following notes only apply when the firmware is built with the `RESET_TO_BL31` option. The `--data=""@` parameter is used to load bootloader images into Base FVP memory (see the "Building the Trusted Firmware" section above). The base addresses used should match the image base addresses in `platform_def.h` used while linking the images. The BL3-2 image is only needed if BL3-1 has been built to expect a Secure-EL1 Payload. 6. The `-C cluster.cpu.RVBAR=@` parameter, where X and Y are the cluster and CPU numbers respectively, is used to set the reset vector for each core. 7. Changing the default value of `FVP_SHARED_DATA_LOCATION` will also require changing the value of `--data=""@` and `-C cluster.cpu.RVBAR=@`, to the new value of `BL31_BASE` in `platform_def.h`. 8. Changing the default value of `FVP_TSP_RAM_LOCATION` will also require changing the value of `--data=""@` to the new value of `BL32_BASE` in `platform_def.h`. ### Running on the AEMv8 Base FVP with reset to BL1 entrypoint Please read "Notes regarding Base FVP configuration options" section above for information about some of the options to run the software. The following `FVP_Base_AEMv8A-AEMv8A` parameters should be used to boot Linux with 8 CPUs using the ARM Trusted Firmware. /FVP_Base_AEMv8A-AEMv8A \ -C pctl.startup=0.0.0.0 \ -C bp.secure_memory=1 \ -C bp.tzc_400.diagnostics=1 \ -C cluster0.NUM_CORES=4 \ -C cluster1.NUM_CORES=4 \ -C cache_state_modelled=1 \ -C bp.pl011_uart0.untimed_fifos=1 \ -C bp.secureflashloader.fname="/" \ -C bp.flashloader0.fname="/" \ -C bp.virtioblockdevice.image_path="/" ### Running on the Cortex-A57-A53 Base FVP with reset to BL1 entrypoint Please read "Notes regarding Base FVP configuration options" section above for information about some of the options to run the software. The following `FVP_Base_Cortex-A57x4-A53x4` model parameters should be used to boot Linux with 8 CPUs using the ARM Trusted Firmware. /FVP_Base_Cortex-A57x4-A53x4 \ -C pctl.startup=0.0.0.0 \ -C bp.secure_memory=1 \ -C bp.tzc_400.diagnostics=1 \ -C cache_state_modelled=1 \ -C bp.pl011_uart0.untimed_fifos=1 \ -C bp.secureflashloader.fname="/" \ -C bp.flashloader0.fname="/" \ -C bp.virtioblockdevice.image_path="/" ### Running on the AEMv8 Base FVP with reset to BL3-1 entrypoint Please read "Notes regarding Base FVP configuration options" section above for information about some of the options to run the software. The following `FVP_Base_AEMv8A-AEMv8A` parameters should be used to boot Linux with 8 CPUs using the ARM Trusted Firmware. /FVP_Base_AEMv8A-AEMv8A \ -C pctl.startup=0.0.0.0 \ -C bp.secure_memory=1 \ -C bp.tzc_400.diagnostics=1 \ -C cluster0.NUM_CORES=4 \ -C cluster1.NUM_CORES=4 \ -C cache_state_modelled=1 \ -C bp.pl011_uart0.untimed_fifos=1 \ -C cluster0.cpu0.RVBAR=0x04022000 \ -C cluster0.cpu1.RVBAR=0x04022000 \ -C cluster0.cpu2.RVBAR=0x04022000 \ -C cluster0.cpu3.RVBAR=0x04022000 \ -C cluster1.cpu0.RVBAR=0x04022000 \ -C cluster1.cpu1.RVBAR=0x04022000 \ -C cluster1.cpu2.RVBAR=0x04022000 \ -C cluster1.cpu3.RVBAR=0x04022000 \ --data cluster0.cpu0="/"@0x04022000 \ --data cluster0.cpu0="/"@0x04000000 \ --data cluster0.cpu0="/"@0x88000000 \ -C bp.virtioblockdevice.image_path="/" ### Running on the Cortex-A57-A53 Base FVP with reset to BL3-1 entrypoint Please read "Notes regarding Base FVP configuration options" section above for information about some of the options to run the software. The following `FVP_Base_Cortex-A57x4-A53x4` model parameters should be used to boot Linux with 8 CPUs using the ARM Trusted Firmware. /FVP_Base_Cortex-A57x4-A53x4 \ -C pctl.startup=0.0.0.0 \ -C bp.secure_memory=1 \ -C bp.tzc_400.diagnostics=1 \ -C cache_state_modelled=1 \ -C bp.pl011_uart0.untimed_fifos=1 \ -C cluster0.cpu0.RVBARADDR=0x04022000 \ -C cluster0.cpu1.RVBARADDR=0x04022000 \ -C cluster0.cpu2.RVBARADDR=0x04022000 \ -C cluster0.cpu3.RVBARADDR=0x04022000 \ -C cluster1.cpu0.RVBARADDR=0x04022000 \ -C cluster1.cpu1.RVBARADDR=0x04022000 \ -C cluster1.cpu2.RVBARADDR=0x04022000 \ -C cluster1.cpu3.RVBARADDR=0x04022000 \ --data cluster0.cpu0="/"@0x04022000 \ --data cluster0.cpu0="/"@0x04000000 \ --data cluster0.cpu0="/"@0x88000000 \ -C bp.virtioblockdevice.image_path="/" ### Configuring the GICv2 memory map The Base FVP models support GICv2 with the default model parameters at the following addresses. The Foundation FVP also supports these addresses when configured for GICv3 in GICv2 emulation mode. GICv2 Distributor Interface 0x2f000000 GICv2 CPU Interface 0x2c000000 GICv2 Virtual CPU Interface 0x2c010000 GICv2 Hypervisor Interface 0x2c02f000 The AEMv8 Base FVP can be configured to support GICv2 at addresses corresponding to the legacy (Versatile Express) memory map as follows. These are the default addresses when using the Foundation FVP in GICv2 mode. GICv2 Distributor Interface 0x2c001000 GICv2 CPU Interface 0x2c002000 GICv2 Virtual CPU Interface 0x2c004000 GICv2 Hypervisor Interface 0x2c006000 The choice of memory map is reflected in the build variant field (bits[15:12]) in the `SYS_ID` register (Offset `0x0`) in the Versatile Express System registers memory map (`0x1c010000`). * `SYS_ID.Build[15:12]` `0x1` corresponds to the presence of the Base GIC memory map. This is the default value on the Base FVPs. * `SYS_ID.Build[15:12]` `0x0` corresponds to the presence of the Legacy VE GIC memory map. This is the default value on the Foundation FVP. This register can be configured as described in the following sections. NOTE: If the legacy VE GIC memory map is used, then the corresponding FDT and BL3-3 images should be used. #### Configuring AEMv8 Foundation FVP GIC for legacy VE memory map The following parameters configure the Foundation FVP to use GICv2 with the legacy VE memory map: /Foundation_v8 \ --cores=4 \ --no-secure-memory \ --visualization \ --no-gicv3 \ --data="/"@0x0 \ --data="/"@0x8000000 \ --block-device="/" Explicit configuration of the `SYS_ID` register is not required. #### Configuring AEMv8 Base FVP GIC for legacy VE memory map The following parameters configure the AEMv8 Base FVP to use GICv2 with the legacy VE memory map. They must added to the parameters described in the "Running on the AEMv8 Base FVP" section above: -C cluster0.gic.GICD-offset=0x1000 \ -C cluster0.gic.GICC-offset=0x2000 \ -C cluster0.gic.GICH-offset=0x4000 \ -C cluster0.gic.GICH-other-CPU-offset=0x5000 \ -C cluster0.gic.GICV-offset=0x6000 \ -C cluster0.gic.PERIPH-size=0x8000 \ -C cluster1.gic.GICD-offset=0x1000 \ -C cluster1.gic.GICC-offset=0x2000 \ -C cluster1.gic.GICH-offset=0x4000 \ -C cluster1.gic.GICH-other-CPU-offset=0x5000 \ -C cluster1.gic.GICV-offset=0x6000 \ -C cluster1.gic.PERIPH-size=0x8000 \ -C gic_distributor.GICD-alias=0x2c001000 \ -C bp.variant=0x0 The `bp.variant` parameter corresponds to the build variant field of the `SYS_ID` register. Setting this to `0x0` allows the ARM Trusted Firmware to detect the legacy VE memory map while configuring the GIC. 8. Preparing the images to run on Juno --------------------------------------- ### Preparing Trusted Firmware images The Juno platform requires a BL3-0 image to boot up. This image contains the runtime firmware that runs on the SCP (System Control Processor). It can be downloaded from [this ARM website] [SCP download] (requires registration). Rebuild the Trusted Firmware specifying the BL3-0 image. Refer to the section "Building the Trusted Firmware". Alternatively, the FIP image can be updated manually with the BL3-0 image: fip_create --dump --bl30 / / ### Obtaining the Flattened Device Tree Juno's device tree blob is built along with the kernel. It is located in: /arch/arm64/boot/dts/juno.dtb ### Deploying a root filesystem on a USB mass storage device 1. Format the partition on the USB mass storage as ext4 filesystem. A 2GB or larger USB mass storage device is required. If another filesystem type is preferred then support needs to be enabled in the kernel. For example, if the USB mass storage corresponds to /dev/sdb device on your computer, use the following command to format partition 1 as ext4: sudo mkfs.ext4 /dev/sdb1 Note: Please be cautious with this command as it could format your hard drive instead if you specify the wrong device. 2. Mount the USB mass storage on the computer (if not done automatically): sudo mount /dev/sdb1 /media/usb_storage where '/media/usb_storage' corresponds to the mount point (the directory must exist prior to using the mount command). 3. Download the rootfs specified in section "Prepare RAM-disk" and extract the files as root user onto the formatted partition: sudo tar zxf .tar.gz -C /media/usb_storage/ Note: It is not necessary to modify the Linaro image as described in that section since we are not using a RAM-disk. 5. Unmount the USB mass storage: sudo umount /media/usb_storage 9. Running the software on Juno -------------------------------- The steps to install and run the binaries on Juno are as follows: 1. Connect a serial cable to the UART0 port (the top UART port on the back panel). The UART settings are 115200 bauds, 8 bits data, no parity, 1 stop bit. 2. Mount the Juno board storage via the CONFIG USB port This is the only USB type B port on the board, labelled DBG_USB and located on the back panel next to the ON/OFF and HW RESET buttons. Plug a type B USB cable into this port on the Juno board and plug the other end into a host PC, and then issue the following command in the UART0 session: Cmd> usb_on If the board doesn't show the Cmd> prompt then press the black HW RESET button once. Once the Juno board storage is detected by your PC, mount it (if not automatically done by your operating system). mount /dev/sdbX /media/JUNO For the rest of the installation instructions, we will assume that the Juno board storage has been mounted under the /media/JUNO directory. 3. Copy the files obtained from the build process into /media/JUNO/SOFTWARE: bl1.bin fip.bin Image juno.dtb 4. Umount the Juno board storage umount /media/JUNO 5. Reboot the board. In the UART0 session, type: Cmd> reboot - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ [Firmware Design]: ./firmware-design.md [ARM FVP website]: http://www.arm.com/fvp [SCP download]: https://silver.arm.com/download/download.tm?pv=1764630 [Linaro Toolchain]: http://releases.linaro.org/14.07/components/toolchain/binaries/ [EDK2]: http://github.com/tianocore/edk2 [DS-5]: http://www.arm.com/products/tools/software-tools/ds-5/index.php arm-trusted-firmware-1.0-aw-6/drivers/000077500000000000000000000000001322600646200176625ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/arm/000077500000000000000000000000001322600646200204415ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/arm/cci400/000077500000000000000000000000001322600646200214235ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/arm/cci400/cci400.c000066400000000000000000000072771322600646200225660ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #define MAX_CLUSTERS 2 static unsigned long cci_base_addr; static unsigned int cci_cluster_ix_to_iface[MAX_CLUSTERS]; void cci_init(unsigned long cci_base, int slave_iface3_cluster_ix, int slave_iface4_cluster_ix) { /* * Check the passed arguments are valid. The cluster indices must be * less than MAX_CLUSTERS, not the same as each other and at least one * of them must be refer to a valid cluster index. */ assert(cci_base); assert(slave_iface3_cluster_ix < MAX_CLUSTERS); assert(slave_iface4_cluster_ix < MAX_CLUSTERS); assert(slave_iface3_cluster_ix != slave_iface4_cluster_ix); assert((slave_iface3_cluster_ix >= 0) || (slave_iface3_cluster_ix >= 0)); cci_base_addr = cci_base; if (slave_iface3_cluster_ix >= 0) cci_cluster_ix_to_iface[slave_iface3_cluster_ix] = SLAVE_IFACE3_OFFSET; if (slave_iface4_cluster_ix >= 0) cci_cluster_ix_to_iface[slave_iface4_cluster_ix] = SLAVE_IFACE4_OFFSET; } static inline unsigned long get_slave_iface_base(unsigned long mpidr) { /* * We assume the TF topology code allocates affinity instances * consecutively from zero. * It is a programming error if this is called without initializing * the slave interface to use for this cluster. */ unsigned int cluster_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK; assert(cluster_id < MAX_CLUSTERS); assert(cci_cluster_ix_to_iface[cluster_id] != 0); return cci_base_addr + cci_cluster_ix_to_iface[cluster_id]; } void cci_enable_cluster_coherency(unsigned long mpidr) { assert(cci_base_addr); /* Enable Snoops and DVM messages */ mmio_write_32(get_slave_iface_base(mpidr) + SNOOP_CTRL_REG, DVM_EN_BIT | SNOOP_EN_BIT); /* Wait for the dust to settle down */ while (mmio_read_32(cci_base_addr + STATUS_REG) & CHANGE_PENDING_BIT) ; } void cci_disable_cluster_coherency(unsigned long mpidr) { assert(cci_base_addr); /* Disable Snoops and DVM messages */ mmio_write_32(get_slave_iface_base(mpidr) + SNOOP_CTRL_REG, ~(DVM_EN_BIT | SNOOP_EN_BIT)); /* Wait for the dust to settle down */ while (mmio_read_32(cci_base_addr + STATUS_REG) & CHANGE_PENDING_BIT) ; } arm-trusted-firmware-1.0-aw-6/drivers/arm/gic/000077500000000000000000000000001322600646200212035ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/arm/gic/arm_gic.c000066400000000000000000000345201322600646200227540ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include static unsigned int g_gicc_base; static unsigned int g_gicd_base; static unsigned long g_gicr_base; static const unsigned int *g_irq_sec_ptr; static unsigned int g_num_irqs; /******************************************************************************* * This function does some minimal GICv3 configuration. The Firmware itself does * not fully support GICv3 at this time and relies on GICv2 emulation as * provided by GICv3. This function allows software (like Linux) in later stages * to use full GICv3 features. ******************************************************************************/ static void gicv3_cpuif_setup(void) { unsigned int scr_val, val; uintptr_t base; /* * When CPUs come out of reset they have their GICR_WAKER.ProcessorSleep * bit set. In order to allow interrupts to get routed to the CPU we * need to clear this bit if set and wait for GICR_WAKER.ChildrenAsleep * to clear (GICv3 Architecture specification 5.4.23). * GICR_WAKER is NOT banked per CPU, compute the correct base address * per CPU. */ assert(g_gicr_base); base = gicv3_get_rdist(g_gicr_base, read_mpidr()); if (base == (uintptr_t)NULL) { /* No re-distributor base address. This interface cannot be * configured. */ panic(); } val = gicr_read_waker(base); val &= ~WAKER_PS; gicr_write_waker(base, val); dsb(); /* We need to wait for ChildrenAsleep to clear. */ val = gicr_read_waker(base); while (val & WAKER_CA) val = gicr_read_waker(base); /* * We need to set SCR_EL3.NS in order to see GICv3 non-secure state. * Restore SCR_EL3.NS again before exit. */ scr_val = read_scr(); write_scr(scr_val | SCR_NS_BIT); isb(); /* ensure NS=1 takes effect before accessing ICC_SRE_EL2 */ /* * By default EL2 and NS-EL1 software should be able to enable GICv3 * System register access without any configuration at EL3. But it turns * out that GICC PMR as set in GICv2 mode does not affect GICv3 mode. So * we need to set it here again. In order to do that we need to enable * register access. We leave it enabled as it should be fine and might * prevent problems with later software trying to access GIC System * Registers. */ val = read_icc_sre_el3(); write_icc_sre_el3(val | ICC_SRE_EN | ICC_SRE_SRE); val = read_icc_sre_el2(); write_icc_sre_el2(val | ICC_SRE_EN | ICC_SRE_SRE); write_icc_pmr_el1(GIC_PRI_MASK); isb(); /* commit ICC_* changes before setting NS=0 */ /* Restore SCR_EL3 */ write_scr(scr_val); isb(); /* ensure NS=0 takes effect immediately */ } /******************************************************************************* * This function does some minimal GICv3 configuration when cores go * down. ******************************************************************************/ static void gicv3_cpuif_deactivate(void) { unsigned int val; uintptr_t base; /* * When taking CPUs down we need to set GICR_WAKER.ProcessorSleep and * wait for GICR_WAKER.ChildrenAsleep to get set. * (GICv3 Architecture specification 5.4.23). * GICR_WAKER is NOT banked per CPU, compute the correct base address * per CPU. */ assert(g_gicr_base); base = gicv3_get_rdist(g_gicr_base, read_mpidr()); if (base == (uintptr_t)NULL) { /* No re-distributor base address. This interface cannot be * configured. */ panic(); } val = gicr_read_waker(base); val |= WAKER_PS; gicr_write_waker(base, val); dsb(); /* We need to wait for ChildrenAsleep to set. */ val = gicr_read_waker(base); while ((val & WAKER_CA) == 0) val = gicr_read_waker(base); } /******************************************************************************* * Enable secure interrupts and use FIQs to route them. Disable legacy bypass * and set the priority mask register to allow all interrupts to trickle in. ******************************************************************************/ void arm_gic_cpuif_setup(void) { unsigned int val; assert(g_gicc_base); val = gicc_read_iidr(g_gicc_base); /* * If GICv3 we need to do a bit of additional setup. We want to * allow default GICv2 behaviour but allow the next stage to * enable full gicv3 features. */ if (((val >> GICC_IIDR_ARCH_SHIFT) & GICC_IIDR_ARCH_MASK) >= 3) gicv3_cpuif_setup(); val = ENABLE_GRP0 | FIQ_EN | FIQ_BYP_DIS_GRP0; val |= IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP1 | IRQ_BYP_DIS_GRP1; gicc_write_pmr(g_gicc_base, GIC_PRI_MASK); gicc_write_ctlr(g_gicc_base, val); } /******************************************************************************* * Place the cpu interface in a state where it can never make a cpu exit wfi as * as result of an asserted interrupt. This is critical for powering down a cpu ******************************************************************************/ void arm_gic_cpuif_deactivate(void) { unsigned int val; /* Disable secure, non-secure interrupts and disable their bypass */ assert(g_gicc_base); val = gicc_read_ctlr(g_gicc_base); val &= ~(ENABLE_GRP0 | ENABLE_GRP1); val |= FIQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP0; val |= IRQ_BYP_DIS_GRP0 | IRQ_BYP_DIS_GRP1; gicc_write_ctlr(g_gicc_base, val); val = gicc_read_iidr(g_gicc_base); /* * If GICv3 we need to do a bit of additional setup. Make sure the * RDIST is put to sleep. */ if (((val >> GICC_IIDR_ARCH_SHIFT) & GICC_IIDR_ARCH_MASK) >= 3) gicv3_cpuif_deactivate(); } /******************************************************************************* * Per cpu gic distributor setup which will be done by all cpus after a cold * boot/hotplug. This marks out the secure interrupts & enables them. ******************************************************************************/ void arm_gic_pcpu_distif_setup(void) { unsigned int index, irq_num; assert(g_gicd_base); gicd_write_igroupr(g_gicd_base, 0, ~0); assert(!g_num_irqs || g_irq_sec_ptr); for (index = 0; index < g_num_irqs; index++) { irq_num = g_irq_sec_ptr[index]; if (irq_num < MIN_SPI_ID) { /* We have an SGI or a PPI */ gicd_clr_igroupr(g_gicd_base, irq_num); gicd_set_ipriorityr(g_gicd_base, irq_num, GIC_HIGHEST_SEC_PRIORITY); gicd_set_isenabler(g_gicd_base, irq_num); } } } /******************************************************************************* * Global gic distributor setup which will be done by the primary cpu after a * cold boot. It marks out the secure SPIs, PPIs & SGIs and enables them. It * then enables the secure GIC distributor interface. ******************************************************************************/ static void arm_gic_distif_setup(void) { unsigned int num_ints, ctlr, index, irq_num; /* Disable the distributor before going further */ assert(g_gicd_base); ctlr = gicd_read_ctlr(g_gicd_base); ctlr &= ~(ENABLE_GRP0 | ENABLE_GRP1); gicd_write_ctlr(g_gicd_base, ctlr); /* * Mark out non-secure interrupts. Calculate number of * IGROUPR registers to consider. Will be equal to the * number of IT_LINES */ num_ints = gicd_read_typer(g_gicd_base) & IT_LINES_NO_MASK; num_ints++; for (index = 0; index < num_ints; index++) gicd_write_igroupr(g_gicd_base, index << IGROUPR_SHIFT, ~0); /* Configure secure interrupts now */ assert(!g_num_irqs || g_irq_sec_ptr); for (index = 0; index < g_num_irqs; index++) { irq_num = g_irq_sec_ptr[index]; if (irq_num >= MIN_SPI_ID) { /* We have an SPI */ gicd_clr_igroupr(g_gicd_base, irq_num); gicd_set_ipriorityr(g_gicd_base, irq_num, GIC_HIGHEST_SEC_PRIORITY); gicd_set_itargetsr(g_gicd_base, irq_num, platform_get_core_pos(read_mpidr())); gicd_set_isenabler(g_gicd_base, irq_num); } } arm_gic_pcpu_distif_setup(); gicd_write_ctlr(g_gicd_base, ctlr | ENABLE_GRP0); } /******************************************************************************* * Initialize the ARM GIC driver with the provided platform inputs ******************************************************************************/ void arm_gic_init(unsigned int gicc_base, unsigned int gicd_base, unsigned long gicr_base, const unsigned int *irq_sec_ptr, unsigned int num_irqs ) { assert(gicc_base); assert(gicd_base); assert(!num_irqs || irq_sec_ptr); g_gicc_base = gicc_base; g_gicd_base = gicd_base; g_gicr_base = gicr_base; g_irq_sec_ptr = irq_sec_ptr; g_num_irqs = num_irqs; } /******************************************************************************* * Setup the ARM GIC CPU and distributor interfaces. ******************************************************************************/ void arm_gic_setup(void) { arm_gic_cpuif_setup(); arm_gic_distif_setup(); } /******************************************************************************* * An ARM processor signals interrupt exceptions through the IRQ and FIQ pins. * The interrupt controller knows which pin/line it uses to signal a type of * interrupt. This function provides a common implementation of * plat_interrupt_type_to_line() in an ARM GIC environment for optional re-use * across platforms. It lets the interrupt management framework determine * for a type of interrupt and security state, which line should be used in the * SCR_EL3 to control its routing to EL3. The interrupt line is represented as * the bit position of the IRQ or FIQ bit in the SCR_EL3. ******************************************************************************/ uint32_t arm_gic_interrupt_type_to_line(uint32_t type, uint32_t security_state) { assert(type == INTR_TYPE_S_EL1 || type == INTR_TYPE_EL3 || type == INTR_TYPE_NS); assert(sec_state_is_valid(security_state)); /* * We ignore the security state parameter under the assumption that * both normal and secure worlds are using ARM GICv2. This parameter * will be used when the secure world starts using GICv3. */ #if ARM_GIC_ARCH == 2 return gicv2_interrupt_type_to_line(g_gicc_base, type); #else #error "Invalid ARM GIC architecture version specified for platform port" #endif /* ARM_GIC_ARCH */ } #if ARM_GIC_ARCH == 2 /******************************************************************************* * This function returns the type of the highest priority pending interrupt at * the GIC cpu interface. INTR_TYPE_INVAL is returned when there is no * interrupt pending. ******************************************************************************/ uint32_t arm_gic_get_pending_interrupt_type(void) { uint32_t id; assert(g_gicc_base); id = gicc_read_hppir(g_gicc_base); /* Assume that all secure interrupts are S-EL1 interrupts */ if (id < 1022) return INTR_TYPE_S_EL1; if (id == GIC_SPURIOUS_INTERRUPT) return INTR_TYPE_INVAL; return INTR_TYPE_NS; } /******************************************************************************* * This function returns the id of the highest priority pending interrupt at * the GIC cpu interface. INTR_ID_UNAVAILABLE is returned when there is no * interrupt pending. ******************************************************************************/ uint32_t arm_gic_get_pending_interrupt_id(void) { uint32_t id; assert(g_gicc_base); id = gicc_read_hppir(g_gicc_base); if (id < 1022) return id; if (id == 1023) return INTR_ID_UNAVAILABLE; /* * Find out which non-secure interrupt it is under the assumption that * the GICC_CTLR.AckCtl bit is 0. */ return gicc_read_ahppir(g_gicc_base); } /******************************************************************************* * This functions reads the GIC cpu interface Interrupt Acknowledge register * to start handling the pending interrupt. It returns the contents of the IAR. ******************************************************************************/ uint32_t arm_gic_acknowledge_interrupt(void) { assert(g_gicc_base); return gicc_read_IAR(g_gicc_base); } /******************************************************************************* * This functions writes the GIC cpu interface End Of Interrupt register with * the passed value to finish handling the active interrupt ******************************************************************************/ void arm_gic_end_of_interrupt(uint32_t id) { assert(g_gicc_base); gicc_write_EOIR(g_gicc_base, id); } /******************************************************************************* * This function returns the type of the interrupt id depending upon the group * this interrupt has been configured under by the interrupt controller i.e. * group0 or group1. ******************************************************************************/ uint32_t arm_gic_get_interrupt_type(uint32_t id) { uint32_t group; assert(g_gicd_base); group = gicd_get_igroupr(g_gicd_base, id); /* Assume that all secure interrupts are S-EL1 interrupts */ if (group == GRP0) return INTR_TYPE_S_EL1; else return INTR_TYPE_NS; } #else #error "Invalid ARM GIC architecture version specified for platform port" #endif /* ARM_GIC_ARCH */ arm-trusted-firmware-1.0-aw-6/drivers/arm/gic/gic_v2.c000066400000000000000000000240471322600646200225270ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include /******************************************************************************* * GIC Distributor interface accessors for reading entire registers ******************************************************************************/ unsigned int gicd_read_igroupr(unsigned int base, unsigned int id) { unsigned n = id >> IGROUPR_SHIFT; return mmio_read_32(base + GICD_IGROUPR + (n << 2)); } unsigned int gicd_read_isenabler(unsigned int base, unsigned int id) { unsigned n = id >> ISENABLER_SHIFT; return mmio_read_32(base + GICD_ISENABLER + (n << 2)); } unsigned int gicd_read_icenabler(unsigned int base, unsigned int id) { unsigned n = id >> ICENABLER_SHIFT; return mmio_read_32(base + GICD_ICENABLER + (n << 2)); } unsigned int gicd_read_ispendr(unsigned int base, unsigned int id) { unsigned n = id >> ISPENDR_SHIFT; return mmio_read_32(base + GICD_ISPENDR + (n << 2)); } unsigned int gicd_read_icpendr(unsigned int base, unsigned int id) { unsigned n = id >> ICPENDR_SHIFT; return mmio_read_32(base + GICD_ICPENDR + (n << 2)); } unsigned int gicd_read_isactiver(unsigned int base, unsigned int id) { unsigned n = id >> ISACTIVER_SHIFT; return mmio_read_32(base + GICD_ISACTIVER + (n << 2)); } unsigned int gicd_read_icactiver(unsigned int base, unsigned int id) { unsigned n = id >> ICACTIVER_SHIFT; return mmio_read_32(base + GICD_ICACTIVER + (n << 2)); } unsigned int gicd_read_ipriorityr(unsigned int base, unsigned int id) { unsigned n = id >> IPRIORITYR_SHIFT; return mmio_read_32(base + GICD_IPRIORITYR + (n << 2)); } unsigned int gicd_read_itargetsr(unsigned int base, unsigned int id) { unsigned n = id >> ITARGETSR_SHIFT; return mmio_read_32(base + GICD_ITARGETSR + (n << 2)); } unsigned int gicd_read_icfgr(unsigned int base, unsigned int id) { unsigned n = id >> ICFGR_SHIFT; return mmio_read_32(base + GICD_ICFGR + (n << 2)); } unsigned int gicd_read_cpendsgir(unsigned int base, unsigned int id) { unsigned n = id >> CPENDSGIR_SHIFT; return mmio_read_32(base + GICD_CPENDSGIR + (n << 2)); } unsigned int gicd_read_spendsgir(unsigned int base, unsigned int id) { unsigned n = id >> SPENDSGIR_SHIFT; return mmio_read_32(base + GICD_SPENDSGIR + (n << 2)); } /******************************************************************************* * GIC Distributor interface accessors for writing entire registers ******************************************************************************/ void gicd_write_igroupr(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> IGROUPR_SHIFT; mmio_write_32(base + GICD_IGROUPR + (n << 2), val); } void gicd_write_isenabler(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ISENABLER_SHIFT; mmio_write_32(base + GICD_ISENABLER + (n << 2), val); } void gicd_write_icenabler(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ICENABLER_SHIFT; mmio_write_32(base + GICD_ICENABLER + (n << 2), val); } void gicd_write_ispendr(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ISPENDR_SHIFT; mmio_write_32(base + GICD_ISPENDR + (n << 2), val); } void gicd_write_icpendr(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ICPENDR_SHIFT; mmio_write_32(base + GICD_ICPENDR + (n << 2), val); } void gicd_write_isactiver(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ISACTIVER_SHIFT; mmio_write_32(base + GICD_ISACTIVER + (n << 2), val); } void gicd_write_icactiver(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ICACTIVER_SHIFT; mmio_write_32(base + GICD_ICACTIVER + (n << 2), val); } void gicd_write_ipriorityr(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> IPRIORITYR_SHIFT; mmio_write_32(base + GICD_IPRIORITYR + (n << 2), val); } void gicd_write_itargetsr(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ITARGETSR_SHIFT; mmio_write_32(base + GICD_ITARGETSR + (n << 2), val); } void gicd_write_icfgr(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> ICFGR_SHIFT; mmio_write_32(base + GICD_ICFGR + (n << 2), val); } void gicd_write_cpendsgir(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> CPENDSGIR_SHIFT; mmio_write_32(base + GICD_CPENDSGIR + (n << 2), val); } void gicd_write_spendsgir(unsigned int base, unsigned int id, unsigned int val) { unsigned n = id >> SPENDSGIR_SHIFT; mmio_write_32(base + GICD_SPENDSGIR + (n << 2), val); } /******************************************************************************* * GIC Distributor interface accessors for individual interrupt manipulation ******************************************************************************/ unsigned int gicd_get_igroupr(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << IGROUPR_SHIFT) - 1); unsigned int reg_val = gicd_read_igroupr(base, id); return (reg_val >> bit_num) & 0x1; } void gicd_set_igroupr(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << IGROUPR_SHIFT) - 1); unsigned int reg_val = gicd_read_igroupr(base, id); gicd_write_igroupr(base, id, reg_val | (1 << bit_num)); } void gicd_clr_igroupr(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << IGROUPR_SHIFT) - 1); unsigned int reg_val = gicd_read_igroupr(base, id); gicd_write_igroupr(base, id, reg_val & ~(1 << bit_num)); } void gicd_set_isenabler(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << ISENABLER_SHIFT) - 1); gicd_write_isenabler(base, id, (1 << bit_num)); } void gicd_set_icenabler(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << ICENABLER_SHIFT) - 1); gicd_write_icenabler(base, id, (1 << bit_num)); } void gicd_set_ispendr(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << ISPENDR_SHIFT) - 1); gicd_write_ispendr(base, id, (1 << bit_num)); } void gicd_set_icpendr(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << ICPENDR_SHIFT) - 1); gicd_write_icpendr(base, id, (1 << bit_num)); } void gicd_set_isactiver(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << ISACTIVER_SHIFT) - 1); gicd_write_isactiver(base, id, (1 << bit_num)); } void gicd_set_icactiver(unsigned int base, unsigned int id) { unsigned bit_num = id & ((1 << ICACTIVER_SHIFT) - 1); gicd_write_icactiver(base, id, (1 << bit_num)); } /* * Make sure that the interrupt's group is set before expecting * this function to do its job correctly. */ void gicd_set_ipriorityr(unsigned int base, unsigned int id, unsigned int pri) { unsigned int reg = base + GICD_IPRIORITYR + (id & ~3); unsigned int shift = (id & 3) << 3; unsigned int reg_val = mmio_read_32(reg); /* * Enforce ARM recommendation to manage priority values such * that group1 interrupts always have a lower priority than * group0 interrupts. * Note, lower numerical values are higher priorities so the comparison * checks below are reversed from what might be expected. */ assert(gicd_get_igroupr(base, id) == GRP1 ? pri >= GIC_HIGHEST_NS_PRIORITY && pri <= GIC_LOWEST_NS_PRIORITY : pri >= GIC_HIGHEST_SEC_PRIORITY && pri <= GIC_LOWEST_SEC_PRIORITY); reg_val &= ~(GIC_PRI_MASK << shift); reg_val |= (pri & GIC_PRI_MASK) << shift; mmio_write_32(reg, reg_val); } void gicd_set_itargetsr(unsigned int base, unsigned int id, unsigned int iface) { unsigned byte_off = id & ((1 << ITARGETSR_SHIFT) - 1); unsigned int reg_val = gicd_read_itargetsr(base, id); gicd_write_itargetsr(base, id, reg_val | (1 << iface) << (byte_off << 3)); } /******************************************************************************* * This function allows the interrupt management framework to determine (through * the platform) which interrupt line (IRQ/FIQ) to use for an interrupt type to * route it to EL3. The interrupt line is represented as the bit position of the * IRQ or FIQ bit in the SCR_EL3. ******************************************************************************/ uint32_t gicv2_interrupt_type_to_line(uint32_t cpuif_base, uint32_t type) { uint32_t gicc_ctlr; /* Non-secure interrupts are signalled on the IRQ line always */ if (type == INTR_TYPE_NS) return __builtin_ctz(SCR_IRQ_BIT); /* * Secure interrupts are signalled using the IRQ line if the FIQ_EN * bit is not set else they are signalled using the FIQ line. */ gicc_ctlr = gicc_read_ctlr(cpuif_base); if (gicc_ctlr & FIQ_EN) return __builtin_ctz(SCR_FIQ_BIT); else return __builtin_ctz(SCR_IRQ_BIT); } arm-trusted-firmware-1.0-aw-6/drivers/arm/gic/gic_v3.c000066400000000000000000000056141322600646200225270ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include uintptr_t gicv3_get_rdist(uintptr_t gicr_base, uint64_t mpidr) { uint32_t cpu_aff, gicr_aff; uint64_t gicr_typer; uintptr_t addr; /* Construct the affinity as used by GICv3. MPIDR and GIC affinity level * mask is the same. */ cpu_aff = ((mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK) << GICV3_AFF0_SHIFT; cpu_aff |= ((mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK) << GICV3_AFF1_SHIFT; cpu_aff |= ((mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK) << GICV3_AFF2_SHIFT; cpu_aff |= ((mpidr >> MPIDR_AFF3_SHIFT) & MPIDR_AFFLVL_MASK) << GICV3_AFF3_SHIFT; addr = gicr_base; do { gicr_typer = gicr_read_typer(addr); gicr_aff = (gicr_typer >> GICR_TYPER_AFF_SHIFT) & GICR_TYPER_AFF_MASK; if (cpu_aff == gicr_aff) { /* Disable this print for now as it appears every time * when using PSCI CPU_SUSPEND. * TODO: Print this only the first time for each CPU. * INFO("GICv3 - Found RDIST for MPIDR(0x%lx) at 0x%lx\n", * mpidr, addr); */ return addr; } /* TODO: * For GICv4 we need to adjust the Base address based on * GICR_TYPER.VLPIS */ addr += (1 << GICR_PCPUBASE_SHIFT); } while (!(gicr_typer & GICR_TYPER_LAST)); /* If we get here we did not find a match. */ ERROR("GICv3 - Did not find RDIST for CPU with MPIDR 0x%lx\n", mpidr); return (uintptr_t)NULL; } arm-trusted-firmware-1.0-aw-6/drivers/arm/pl011/000077500000000000000000000000001322600646200212765ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/arm/pl011/pl011_console.S000066400000000000000000000133141322600646200240030ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .globl console_init .globl console_putc .globl console_core_init .globl console_core_putc .globl console_getc /* * The console base is in the data section and not in .bss * even though it is zero-init. In particular, this allows * the console functions to start using this variable before * the runtime memory is initialized for images which do not * need to copy the .data section from ROM to RAM. */ .section .data.console_base ; .align 3 console_base: .quad 0x0 /* ----------------------------------------------- * int console_init(unsigned long base_addr, * unsigned int uart_clk, unsigned int baud_rate) * Function to initialize the console without a * C Runtime to print debug information. It saves * the console base to the data section. * In: x0 - console base address * w1 - Uart clock in Hz * w2 - Baud rate * out: return 1 on success. * Clobber list : x1 - x3 * ----------------------------------------------- */ func console_init adrp x3, console_base str x0, [x3, :lo12:console_base] b console_core_init /* ----------------------------------------------- * int console_core_init(unsigned long base_addr, * unsigned int uart_clk, unsigned int baud_rate) * Function to initialize the console without a * C Runtime to print debug information. This * function will be accessed by console_init and * crash reporting. * In: x0 - console base address * w1 - Uart clock in Hz * w2 - Baud rate * Out: return 1 on success * Clobber list : x1, x2 * ----------------------------------------------- */ func console_core_init /* Check the input base address */ cbz x0, init_fail /* Check baud rate and uart clock for sanity */ cbz w1, init_fail cbz w2, init_fail /* Program the baudrate */ /* Divisor = (Uart clock * 4) / baudrate */ lsl w1, w1, #2 udiv w2, w1, w2 /* IBRD = Divisor >> 6 */ lsr w1, w2, #6 /* Write the IBRD */ str w1, [x0, #UARTIBRD] /* FBRD = Divisor & 0x3F */ and w1, w2, #0x3f /* Write the FBRD */ str w1, [x0, #UARTFBRD] mov w1, #PL011_LINE_CONTROL str w1, [x0, #UARTLCR_H] /* Clear any pending errors */ str wzr, [x0, #UARTECR] /* Enable tx, rx, and uart overall */ mov w1, #(PL011_UARTCR_RXE | PL011_UARTCR_TXE | PL011_UARTCR_UARTEN) str w1, [x0, #UARTCR] mov w0, #1 init_fail: ret /* --------------------------------------------- * int console_putc(int c) * Function to output a character over the * console. It returns the character printed on * success or -1 on error. * In : x0 - character to be printed * Out : return -1 on error else return character. * Clobber list : x1, x2 * --------------------------------------------- */ func console_putc adrp x2, console_base ldr x1, [x2, :lo12:console_base] b console_core_putc /* -------------------------------------------------------- * int console_core_putc(int c, unsigned int base_addr) * Function to output a character over the console. It * returns the character printed on success or -1 on error. * In : w0 - character to be printed * x1 - console base address * Out : return -1 on error else return character. * Clobber list : x2 * -------------------------------------------------------- */ func console_core_putc /* Check the input parameter */ cbz x1, putc_error /* Prepend '\r' to '\n' */ cmp w0, #0xA b.ne 2f 1: /* Check if the transmit FIFO is full */ ldr w2, [x1, #UARTFR] tbnz w2, #PL011_UARTFR_TXFF_BIT, 1b mov w2, #0xD str w2, [x1, #UARTDR] 2: /* Check if the transmit FIFO is full */ ldr w2, [x1, #UARTFR] tbnz w2, #PL011_UARTFR_TXFF_BIT, 2b str w0, [x1, #UARTDR] ret putc_error: mov w0, #-1 ret /* --------------------------------------------- * int console_getc(void) * Function to get a character from the console. * It returns the character grabbed on success * or -1 on error. * Clobber list : x0, x1 * --------------------------------------------- */ func console_getc adrp x0, console_base ldr x1, [x0, :lo12:console_base] cbz x1, getc_error 1: /* Check if the receive FIFO is empty */ ldr w0, [x1, #UARTFR] tbnz w0, #PL011_UARTFR_RXFE_BIT, 1b ldr w0, [x1, #UARTDR] ret getc_error: mov w0, #-1 ret arm-trusted-firmware-1.0-aw-6/drivers/arm/tzc400/000077500000000000000000000000001322600646200214655ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/arm/tzc400/tzc400.c000066400000000000000000000205411322600646200226570ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include /* * Implementation defined values used to validate inputs later. * Filters : max of 4 ; 0 to 3 * Regions : max of 9 ; 0 to 8 * Address width : Values between 32 to 64 */ typedef struct tzc_instance { uint64_t base; uint8_t addr_width; uint8_t num_filters; uint8_t num_regions; } tzc_instance_t; tzc_instance_t tzc; static inline uint32_t tzc_read_build_config(uint64_t base) { return mmio_read_32(base + BUILD_CONFIG_OFF); } static inline uint32_t tzc_read_gate_keeper(uint64_t base) { return mmio_read_32(base + GATE_KEEPER_OFF); } static inline void tzc_write_gate_keeper(uint64_t base, uint32_t val) { mmio_write_32(base + GATE_KEEPER_OFF, val); } static inline void tzc_write_action(uint64_t base, tzc_action_t action) { mmio_write_32(base + ACTION_OFF, action); } static inline void tzc_write_region_base_low(uint64_t base, uint32_t region, uint32_t val) { mmio_write_32(base + REGION_BASE_LOW_OFF + REGION_NUM_OFF(region), val); } static inline void tzc_write_region_base_high(uint64_t base, uint32_t region, uint32_t val) { mmio_write_32(base + REGION_BASE_HIGH_OFF + REGION_NUM_OFF(region), val); } static inline void tzc_write_region_top_low(uint64_t base, uint32_t region, uint32_t val) { mmio_write_32(base + REGION_TOP_LOW_OFF + REGION_NUM_OFF(region), val); } static inline void tzc_write_region_top_high(uint64_t base, uint32_t region, uint32_t val) { mmio_write_32(base + REGION_TOP_HIGH_OFF + REGION_NUM_OFF(region), val); } static inline void tzc_write_region_attributes(uint64_t base, uint32_t region, uint32_t val) { mmio_write_32(base + REGION_ATTRIBUTES_OFF + REGION_NUM_OFF(region), val); } static inline void tzc_write_region_id_access(uint64_t base, uint32_t region, uint32_t val) { mmio_write_32(base + REGION_ID_ACCESS_OFF + REGION_NUM_OFF(region), val); } static uint32_t tzc_read_component_id(uint64_t base) { uint32_t id; id = mmio_read_8(base + CID0_OFF); id |= (mmio_read_8(base + CID1_OFF) << 8); id |= (mmio_read_8(base + CID2_OFF) << 16); id |= (mmio_read_8(base + CID3_OFF) << 24); return id; } static uint32_t tzc_get_gate_keeper(uint64_t base, uint8_t filter) { uint32_t tmp; tmp = (tzc_read_gate_keeper(base) >> GATE_KEEPER_OS_SHIFT) & GATE_KEEPER_OS_MASK; return (tmp >> filter) & GATE_KEEPER_FILTER_MASK; } /* This function is not MP safe. */ static void tzc_set_gate_keeper(uint64_t base, uint8_t filter, uint32_t val) { uint32_t tmp; /* Upper half is current state. Lower half is requested state. */ tmp = (tzc_read_gate_keeper(base) >> GATE_KEEPER_OS_SHIFT) & GATE_KEEPER_OS_MASK; if (val) tmp |= (1 << filter); else tmp &= ~(1 << filter); tzc_write_gate_keeper(base, (tmp & GATE_KEEPER_OR_MASK) << GATE_KEEPER_OR_SHIFT); /* Wait here until we see the change reflected in the TZC status. */ while (((tzc_read_gate_keeper(base) >> GATE_KEEPER_OS_SHIFT) & GATE_KEEPER_OS_MASK) != tmp) ; } void tzc_init(uint64_t base) { uint32_t tzc_id, tzc_build; assert(base); tzc.base = base; /* * We expect to see a tzc400. Check component ID. The TZC-400 TRM shows * component ID is expected to be "0xB105F00D". */ tzc_id = tzc_read_component_id(tzc.base); if (tzc_id != TZC400_COMPONENT_ID) { ERROR("TZC : Wrong device ID (0x%x).\n", tzc_id); panic(); } /* Save values we will use later. */ tzc_build = tzc_read_build_config(tzc.base); tzc.num_filters = ((tzc_build >> BUILD_CONFIG_NF_SHIFT) & BUILD_CONFIG_NF_MASK) + 1; tzc.addr_width = ((tzc_build >> BUILD_CONFIG_AW_SHIFT) & BUILD_CONFIG_AW_MASK) + 1; tzc.num_regions = ((tzc_build >> BUILD_CONFIG_NR_SHIFT) & BUILD_CONFIG_NR_MASK) + 1; } /* * `tzc_configure_region` is used to program regions into the TrustZone * controller. A region can be associated with more than one filter. The * associated filters are passed in as a bitmap (bit0 = filter0). * NOTE: * The region 0 covers the whole address space and is enabled on all filters, * this cannot be changed. It is, however, possible to change some region 0 * permissions. */ void tzc_configure_region(uint32_t filters, uint8_t region, uint64_t region_base, uint64_t region_top, tzc_region_attributes_t sec_attr, uint32_t ns_device_access) { assert(tzc.base); /* Do range checks on filters and regions. */ assert(((filters >> tzc.num_filters) == 0) && (region < tzc.num_regions)); /* * Do address range check based on TZC configuration. A 64bit address is * the max and expected case. */ assert(((region_top <= (UINT64_MAX >> (64 - tzc.addr_width))) && (region_base < region_top))); /* region_base and (region_top + 1) must be 4KB aligned */ assert(((region_base | (region_top + 1)) & (4096 - 1)) == 0); assert(sec_attr <= TZC_REGION_S_RDWR); /* * Inputs look ok, start programming registers. * All the address registers are 32 bits wide and have a LOW and HIGH * component used to construct a up to a 64bit address. */ tzc_write_region_base_low(tzc.base, region, (uint32_t)(region_base)); tzc_write_region_base_high(tzc.base, region, (uint32_t)(region_base >> 32)); tzc_write_region_top_low(tzc.base, region, (uint32_t)(region_top)); tzc_write_region_top_high(tzc.base, region, (uint32_t)(region_top >> 32)); /* Assign the region to a filter and set secure attributes */ tzc_write_region_attributes(tzc.base, region, (sec_attr << REGION_ATTRIBUTES_SEC_SHIFT) | filters); /* * Specify which non-secure devices have permission to access this * region. */ tzc_write_region_id_access(tzc.base, region, ns_device_access); } void tzc_set_action(tzc_action_t action) { assert(tzc.base); /* * - Currently no handler is provided to trap an error via interrupt * or exception. * - The interrupt action has not been tested. */ tzc_write_action(tzc.base, action); } void tzc_enable_filters(void) { uint32_t state; uint32_t filter; assert(tzc.base); for (filter = 0; filter < tzc.num_filters; filter++) { state = tzc_get_gate_keeper(tzc.base, filter); if (state) { /* The TZC filter is already configured. Changing the * programmer's view in an active system can cause * unpredictable behavior therefore panic for now rather * than try to determine whether this is safe in this * instance. See: * http://infocenter.arm.com/help/index.jsp?\ * topic=/com.arm.doc.ddi0504c/CJHHECBF.html */ ERROR("TZC : Filter %d Gatekeeper already enabled.\n", filter); panic(); } tzc_set_gate_keeper(tzc.base, filter, 1); } } void tzc_disable_filters(void) { uint32_t filter; assert(tzc.base); /* * We don't do the same state check as above as the Gatekeepers are * disabled after reset. */ for (filter = 0; filter < tzc.num_filters; filter++) tzc_set_gate_keeper(tzc.base, filter, 0); } arm-trusted-firmware-1.0-aw-6/drivers/io/000077500000000000000000000000001322600646200202715ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/drivers/io/io_fip.c000066400000000000000000000265761322600646200217220ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* Useful for printing UUIDs when debugging.*/ #define PRINT_UUID2(x) \ "%08x-%04hx-%04hx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx", \ x.time_low, x.time_mid, x.time_hi_and_version, \ x.clock_seq_hi_and_reserved, x.clock_seq_low, \ x.node[0], x.node[1], x.node[2], x.node[3], \ x.node[4], x.node[5] typedef struct { const char *name; const uuid_t uuid; } plat_fip_name_uuid_t; typedef struct { /* Put file_pos above the struct to allow {0} on static init. * It is a workaround for a known bug in GCC * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 */ unsigned int file_pos; fip_toc_entry_t entry; } file_state_t; static const plat_fip_name_uuid_t name_uuid[] = { {BL2_IMAGE_NAME, UUID_TRUSTED_BOOT_FIRMWARE_BL2}, #ifdef BL30_IMAGE_NAME /* BL3-0 is optional in the platform */ {BL30_IMAGE_NAME, UUID_SCP_FIRMWARE_BL30}, #endif /* BL30_IMAGE_NAME */ {BL31_IMAGE_NAME, UUID_EL3_RUNTIME_FIRMWARE_BL31}, #ifdef BL32_IMAGE_NAME /* BL3-2 is optional in the platform */ {BL32_IMAGE_NAME, UUID_SECURE_PAYLOAD_BL32}, #endif /* BL32_IMAGE_NAME */ {BL33_IMAGE_NAME, UUID_NON_TRUSTED_FIRMWARE_BL33}, }; static const uuid_t uuid_null = {0}; static file_state_t current_file = {0}; static uintptr_t backend_dev_handle; static uintptr_t backend_image_spec; /* Firmware Image Package driver functions */ static int fip_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info); static int fip_file_open(io_dev_info_t *dev_info, const uintptr_t spec, io_entity_t *entity); static int fip_file_len(io_entity_t *entity, size_t *length); static int fip_file_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read); static int fip_file_close(io_entity_t *entity); static int fip_dev_init(io_dev_info_t *dev_info, const uintptr_t init_params); static int fip_dev_close(io_dev_info_t *dev_info); static inline int copy_uuid(uuid_t *dst, const uuid_t *src) { memcpy(dst, src, sizeof(uuid_t)); return 0; } /* Return 0 for equal uuids. */ static inline int compare_uuids(const uuid_t *uuid1, const uuid_t *uuid2) { return memcmp(uuid1, uuid2, sizeof(uuid_t)); } /* TODO: We could check version numbers or do a package checksum? */ static inline int is_valid_header(fip_toc_header_t *header) { if ((header->name == TOC_HEADER_NAME) && (header->serial_number != 0)) { return 1; } else { return 0; } } static int file_to_uuid(const char *filename, uuid_t *uuid) { int i; int status = -EINVAL; for (i = 0; i < (sizeof(name_uuid) / sizeof(name_uuid[0])); i++) { if (strcmp(filename, name_uuid[i].name) == 0) { copy_uuid(uuid, &name_uuid[i].uuid); status = 0; break; } } return status; } /* Identify the device type as a virtual driver */ io_type_t device_type_fip(void) { return IO_TYPE_FIRMWARE_IMAGE_PACKAGE; } static const io_dev_connector_t fip_dev_connector = { .dev_open = fip_dev_open }; static const io_dev_funcs_t fip_dev_funcs = { .type = device_type_fip, .open = fip_file_open, .seek = NULL, .size = fip_file_len, .read = fip_file_read, .write = NULL, .close = fip_file_close, .dev_init = fip_dev_init, .dev_close = fip_dev_close, }; /* No state associated with this device so structure can be const */ static const io_dev_info_t fip_dev_info = { .funcs = &fip_dev_funcs, .info = (uintptr_t)NULL }; /* Open a connection to the FIP device */ static int fip_dev_open(const uintptr_t dev_spec __attribute__((unused)), io_dev_info_t **dev_info) { assert(dev_info != NULL); *dev_info = (io_dev_info_t *)&fip_dev_info; /* cast away const */ return IO_SUCCESS; } /* Do some basic package checks. */ static int fip_dev_init(io_dev_info_t *dev_info, const uintptr_t init_params) { int result = IO_FAIL; char *image_name = (char *)init_params; uintptr_t backend_handle; fip_toc_header_t header; size_t bytes_read; /* Obtain a reference to the image by querying the platform layer */ result = plat_get_image_source(image_name, &backend_dev_handle, &backend_image_spec); if (result != IO_SUCCESS) { WARN("Failed to obtain reference to image '%s' (%i)\n", image_name, result); result = IO_FAIL; goto fip_dev_init_exit; } /* Attempt to access the FIP image */ result = io_open(backend_dev_handle, backend_image_spec, &backend_handle); if (result != IO_SUCCESS) { WARN("Failed to access image '%s' (%i)\n", image_name, result); result = IO_FAIL; goto fip_dev_init_exit; } result = io_read(backend_handle, (uintptr_t)&header, sizeof(header), &bytes_read); if (result == IO_SUCCESS) { if (!is_valid_header(&header)) { WARN("Firmware Image Package header check failed.\n"); result = IO_FAIL; } else { VERBOSE("FIP header looks OK.\n"); } } io_close(backend_handle); fip_dev_init_exit: return result; } /* Close a connection to the FIP device */ static int fip_dev_close(io_dev_info_t *dev_info) { /* TODO: Consider tracking open files and cleaning them up here */ /* Clear the backend. */ backend_dev_handle = (uintptr_t)NULL; backend_image_spec = (uintptr_t)NULL; return IO_SUCCESS; } /* Open a file for access from package. */ static int fip_file_open(io_dev_info_t *dev_info, const uintptr_t spec, io_entity_t *entity) { int result = IO_FAIL; uintptr_t backend_handle; uuid_t file_uuid; const io_file_spec_t *file_spec = (io_file_spec_t *)spec; size_t bytes_read; int found_file = 0; assert(file_spec != NULL); assert(entity != NULL); /* Can only have one file open at a time for the moment. We need to * track state like file cursor position. We know the header lives at * offset zero, so this entry should never be zero for an active file. * When the system supports dynamic memory allocation we can allow more * than one open file at a time if needed. */ if (current_file.entry.offset_address != 0) { WARN("fip_file_open : Only one open file at a time.\n"); return IO_RESOURCES_EXHAUSTED; } /* Attempt to access the FIP image */ result = io_open(backend_dev_handle, backend_image_spec, &backend_handle); if (result != IO_SUCCESS) { WARN("Failed to open Firmware Image Package (%i)\n", result); result = IO_FAIL; goto fip_file_open_exit; } /* Seek past the FIP header into the Table of Contents */ result = io_seek(backend_handle, IO_SEEK_SET, sizeof(fip_toc_header_t)); if (result != IO_SUCCESS) { WARN("fip_file_open: failed to seek\n"); result = IO_FAIL; goto fip_file_open_close; } file_to_uuid(file_spec->path, &file_uuid); found_file = 0; do { result = io_read(backend_handle, (uintptr_t)¤t_file.entry, sizeof(current_file.entry), &bytes_read); if (result == IO_SUCCESS) { if (compare_uuids(¤t_file.entry.uuid, &file_uuid) == 0) { found_file = 1; break; } } else { WARN("Failed to read FIP (%i)\n", result); goto fip_file_open_close; } } while (compare_uuids(¤t_file.entry.uuid, &uuid_null) != 0); if (found_file == 1) { /* All fine. Update entity info with file state and return. Set * the file position to 0. The 'current_file.entry' holds the * base and size of the file. */ current_file.file_pos = 0; entity->info = (uintptr_t)¤t_file; } else { /* Did not find the file in the FIP. */ current_file.entry.offset_address = 0; result = IO_FAIL; } fip_file_open_close: io_close(backend_handle); fip_file_open_exit: return result; } /* Return the size of a file in package */ static int fip_file_len(io_entity_t *entity, size_t *length) { assert(entity != NULL); assert(length != NULL); *length = ((file_state_t *)entity->info)->entry.size; return IO_SUCCESS; } /* Read data from a file in package */ static int fip_file_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read) { int result = IO_FAIL; file_state_t *fp; size_t file_offset; size_t bytes_read; uintptr_t backend_handle; assert(entity != NULL); assert(buffer != (uintptr_t)NULL); assert(length_read != NULL); assert(entity->info != (uintptr_t)NULL); /* Open the backend, attempt to access the blob image */ result = io_open(backend_dev_handle, backend_image_spec, &backend_handle); if (result != IO_SUCCESS) { WARN("Failed to open FIP (%i)\n", result); result = IO_FAIL; goto fip_file_read_exit; } fp = (file_state_t *)entity->info; /* Seek to the position in the FIP where the payload lives */ file_offset = fp->entry.offset_address + fp->file_pos; result = io_seek(backend_handle, IO_SEEK_SET, file_offset); if (result != IO_SUCCESS) { WARN("fip_file_read: failed to seek\n"); result = IO_FAIL; goto fip_file_read_close; } result = io_read(backend_handle, buffer, length, &bytes_read); if (result != IO_SUCCESS) { /* We cannot read our data. Fail. */ WARN("Failed to read payload (%i)\n", result); result = IO_FAIL; goto fip_file_read_close; } else { /* Set caller length and new file position. */ *length_read = bytes_read; fp->file_pos += bytes_read; } /* Close the backend. */ fip_file_read_close: io_close(backend_handle); fip_file_read_exit: return result; } /* Close a file in package */ static int fip_file_close(io_entity_t *entity) { /* Clear our current file pointer. * If we had malloc() we would free() here. */ if (current_file.entry.offset_address != 0) { memset(¤t_file, 0, sizeof(current_file)); } /* Clear the Entity info. */ entity->info = 0; return IO_SUCCESS; } /* Exported functions */ /* Register the Firmware Image Package driver with the IO abstraction */ int register_io_dev_fip(const io_dev_connector_t **dev_con) { int result = IO_FAIL; assert(dev_con != NULL); result = io_register_device(&fip_dev_info); if (result == IO_SUCCESS) *dev_con = &fip_dev_connector; return result; } arm-trusted-firmware-1.0-aw-6/drivers/io/io_memmap.c000066400000000000000000000153601322600646200224050ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include /* As we need to be able to keep state for seek, only one file can be open * at a time. Make this a structure and point to the entity->info. When we * can malloc memory we can change this to support more open files. */ typedef struct { /* Use the 'in_use' flag as any value for base and file_pos could be * valid. */ int in_use; uintptr_t base; size_t file_pos; } file_state_t; static file_state_t current_file = {0}; /* Identify the device type as memmap */ io_type_t device_type_memmap(void) { return IO_TYPE_MEMMAP; } /* Memmap device functions */ static int memmap_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info); static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec, io_entity_t *entity); static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset); static int memmap_block_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read); static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer, size_t length, size_t *length_written); static int memmap_block_close(io_entity_t *entity); static int memmap_dev_close(io_dev_info_t *dev_info); static const io_dev_connector_t memmap_dev_connector = { .dev_open = memmap_dev_open }; static const io_dev_funcs_t memmap_dev_funcs = { .type = device_type_memmap, .open = memmap_block_open, .seek = memmap_block_seek, .size = NULL, .read = memmap_block_read, .write = memmap_block_write, .close = memmap_block_close, .dev_init = NULL, .dev_close = memmap_dev_close, }; /* No state associated with this device so structure can be const */ static const io_dev_info_t memmap_dev_info = { .funcs = &memmap_dev_funcs, .info = (uintptr_t)NULL }; /* Open a connection to the memmap device */ static int memmap_dev_open(const uintptr_t dev_spec __attribute__((unused)), io_dev_info_t **dev_info) { assert(dev_info != NULL); *dev_info = (io_dev_info_t *)&memmap_dev_info; /* cast away const */ return IO_SUCCESS; } /* Close a connection to the memmap device */ static int memmap_dev_close(io_dev_info_t *dev_info) { /* NOP */ /* TODO: Consider tracking open files and cleaning them up here */ return IO_SUCCESS; } /* Open a file on the memmap device */ /* TODO: Can we do any sensible limit checks on requested memory */ static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec, io_entity_t *entity) { int result = IO_FAIL; const io_block_spec_t *block_spec = (io_block_spec_t *)spec; /* Since we need to track open state for seek() we only allow one open * spec at a time. When we have dynamic memory we can malloc and set * entity->info. */ if (current_file.in_use == 0) { assert(block_spec != NULL); assert(entity != NULL); current_file.in_use = 1; current_file.base = block_spec->offset; /* File cursor offset for seek and incremental reads etc. */ current_file.file_pos = 0; entity->info = (uintptr_t)¤t_file; result = IO_SUCCESS; } else { WARN("A Memmap device is already active. Close first.\n"); result = IO_RESOURCES_EXHAUSTED; } return result; } /* Seek to a particular file offset on the memmap device */ static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset) { int result = IO_FAIL; /* We only support IO_SEEK_SET for the moment. */ if (mode == IO_SEEK_SET) { assert(entity != NULL); /* TODO: can we do some basic limit checks on seek? */ ((file_state_t *)entity->info)->file_pos = offset; result = IO_SUCCESS; } else { result = IO_FAIL; } return result; } /* Read data from a file on the memmap device */ static int memmap_block_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read) { file_state_t *fp; assert(entity != NULL); assert(buffer != (uintptr_t)NULL); assert(length_read != NULL); fp = (file_state_t *)entity->info; memcpy((void *)buffer, (void *)(fp->base + fp->file_pos), length); *length_read = length; /* advance the file 'cursor' for incremental reads */ fp->file_pos += length; return IO_SUCCESS; } /* Write data to a file on the memmap device */ static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer, size_t length, size_t *length_written) { file_state_t *fp; assert(entity != NULL); assert(buffer != (uintptr_t)NULL); assert(length_written != NULL); fp = (file_state_t *)entity->info; memcpy((void *)(fp->base + fp->file_pos), (void *)buffer, length); *length_written = length; /* advance the file 'cursor' for incremental writes */ fp->file_pos += length; return IO_SUCCESS; } /* Close a file on the memmap device */ static int memmap_block_close(io_entity_t *entity) { assert(entity != NULL); entity->info = 0; /* This would be a mem free() if we had malloc.*/ memset((void *)¤t_file, 0, sizeof(current_file)); return IO_SUCCESS; } /* Exported functions */ /* Register the memmap driver with the IO abstraction */ int register_io_dev_memmap(const io_dev_connector_t **dev_con) { int result = IO_FAIL; assert(dev_con != NULL); result = io_register_device(&memmap_dev_info); if (result == IO_SUCCESS) *dev_con = &memmap_dev_connector; return result; } arm-trusted-firmware-1.0-aw-6/drivers/io/io_semihosting.c000066400000000000000000000143071322600646200234620ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include /* Identify the device type as semihosting */ static io_type_t device_type_sh(void) { return IO_TYPE_SEMIHOSTING; } /* Semi-hosting functions, device info and handle */ static int sh_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info); static int sh_file_open(io_dev_info_t *dev_info, const uintptr_t spec, io_entity_t *entity); static int sh_file_seek(io_entity_t *entity, int mode, ssize_t offset); static int sh_file_len(io_entity_t *entity, size_t *length); static int sh_file_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read); static int sh_file_write(io_entity_t *entity, const uintptr_t buffer, size_t length, size_t *length_written); static int sh_file_close(io_entity_t *entity); static const io_dev_connector_t sh_dev_connector = { .dev_open = sh_dev_open }; static const io_dev_funcs_t sh_dev_funcs = { .type = device_type_sh, .open = sh_file_open, .seek = sh_file_seek, .size = sh_file_len, .read = sh_file_read, .write = sh_file_write, .close = sh_file_close, .dev_init = NULL, /* NOP */ .dev_close = NULL, /* NOP */ }; /* No state associated with this device so structure can be const */ static const io_dev_info_t sh_dev_info = { .funcs = &sh_dev_funcs, .info = (uintptr_t)NULL }; /* Open a connection to the semi-hosting device */ static int sh_dev_open(const uintptr_t dev_spec __unused, io_dev_info_t **dev_info) { int result = IO_SUCCESS; assert(dev_info != NULL); *dev_info = (io_dev_info_t *)&sh_dev_info; /* cast away const */ return result; } /* Open a file on the semi-hosting device */ static int sh_file_open(io_dev_info_t *dev_info __attribute__((unused)), const uintptr_t spec, io_entity_t *entity) { int result = IO_FAIL; long sh_result = -1; const io_file_spec_t *file_spec = (const io_file_spec_t *)spec; assert(file_spec != NULL); assert(entity != NULL); sh_result = semihosting_file_open(file_spec->path, file_spec->mode); if (sh_result > 0) { entity->info = (uintptr_t)sh_result; result = IO_SUCCESS; } else { result = IO_FAIL; } return result; } /* Seek to a particular file offset on the semi-hosting device */ static int sh_file_seek(io_entity_t *entity, int mode, ssize_t offset) { int result = IO_FAIL; long file_handle, sh_result; assert(entity != NULL); file_handle = (long)entity->info; sh_result = semihosting_file_seek(file_handle, offset); result = (sh_result == 0) ? IO_SUCCESS : IO_FAIL; return result; } /* Return the size of a file on the semi-hosting device */ static int sh_file_len(io_entity_t *entity, size_t *length) { int result = IO_FAIL; assert(entity != NULL); assert(length != NULL); long sh_handle = (long)entity->info; long sh_result = semihosting_file_length(sh_handle); if (sh_result >= 0) { result = IO_SUCCESS; *length = (size_t)sh_result; } return result; } /* Read data from a file on the semi-hosting device */ static int sh_file_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read) { int result = IO_FAIL; long sh_result = -1; size_t bytes = length; long file_handle; assert(entity != NULL); assert(buffer != (uintptr_t)NULL); assert(length_read != NULL); file_handle = (long)entity->info; sh_result = semihosting_file_read(file_handle, &bytes, buffer); if (sh_result >= 0) { *length_read = (bytes != length) ? bytes : length; result = IO_SUCCESS; } else result = IO_FAIL; return result; } /* Write data to a file on the semi-hosting device */ static int sh_file_write(io_entity_t *entity, const uintptr_t buffer, size_t length, size_t *length_written) { int result = IO_FAIL; long sh_result = -1; long file_handle; size_t bytes = length; assert(entity != NULL); assert(buffer != (uintptr_t)NULL); assert(length_written != NULL); file_handle = (long)entity->info; sh_result = semihosting_file_write(file_handle, &bytes, buffer); if (sh_result >= 0) { *length_written = sh_result; result = IO_SUCCESS; } else result = IO_FAIL; return result; } /* Close a file on the semi-hosting device */ static int sh_file_close(io_entity_t *entity) { int result = IO_FAIL; long sh_result = -1; long file_handle; assert(entity != NULL); file_handle = (long)entity->info; sh_result = semihosting_file_close(file_handle); result = (sh_result >= 0) ? IO_SUCCESS : IO_FAIL; return result; } /* Exported functions */ /* Register the semi-hosting driver with the IO abstraction */ int register_io_dev_sh(const io_dev_connector_t **dev_con) { int result = IO_FAIL; assert(dev_con != NULL); result = io_register_device(&sh_dev_info); if (result == IO_SUCCESS) *dev_con = &sh_dev_connector; return result; } arm-trusted-firmware-1.0-aw-6/drivers/io/io_storage.c000066400000000000000000000222751322600646200226000ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include /* Storage for a fixed maximum number of IO entities, definable by platform */ static io_entity_t entity_pool[MAX_IO_HANDLES]; /* Simple way of tracking used storage - each entry is NULL or a pointer to an * entity */ static io_entity_t *entity_map[MAX_IO_HANDLES]; /* Track number of allocated entities */ static unsigned int entity_count; /* Array of fixed maximum of registered devices, definable by platform */ static const io_dev_info_t *devices[MAX_IO_DEVICES]; /* Number of currently registered devices */ static unsigned int dev_count; #if DEBUG /* Extra validation functions only used in debug builds */ /* Return a boolean value indicating whether a device connector is valid */ static int is_valid_dev_connector(const io_dev_connector_t *dev_con) { int result = (dev_con != NULL) && (dev_con->dev_open != NULL); return result; } /* Return a boolean value indicating whether a device handle is valid */ static int is_valid_dev(const uintptr_t dev_handle) { const io_dev_info_t *dev = (io_dev_info_t *)dev_handle; int result = (dev != NULL) && (dev->funcs != NULL) && (dev->funcs->type != NULL) && (dev->funcs->type() < IO_TYPE_MAX); return result; } /* Return a boolean value indicating whether an IO entity is valid */ static int is_valid_entity(const uintptr_t handle) { const io_entity_t *entity = (io_entity_t *)handle; int result = (entity != NULL) && (is_valid_dev((uintptr_t)entity->dev_handle)); return result; } /* Return a boolean value indicating whether a seek mode is valid */ static int is_valid_seek_mode(io_seek_mode_t mode) { return ((mode != IO_SEEK_INVALID) && (mode < IO_SEEK_MAX)); } #endif /* End of debug-only validation functions */ /* Open a connection to a specific device */ static int dev_open(const io_dev_connector_t *dev_con, const uintptr_t dev_spec, io_dev_info_t **dev_info) { int result = IO_FAIL; assert(dev_info != NULL); assert(is_valid_dev_connector(dev_con)); result = dev_con->dev_open(dev_spec, dev_info); return result; } /* Set a handle to track an entity */ static void set_handle(uintptr_t *handle, io_entity_t *entity) { assert(handle != NULL); *handle = (uintptr_t)entity; } /* Locate an entity in the pool, specified by address */ static int find_first_entity(const io_entity_t *entity, unsigned int *index_out) { int result = IO_FAIL; for (int index = 0; index < MAX_IO_HANDLES; ++index) { if (entity_map[index] == entity) { result = IO_SUCCESS; *index_out = index; break; } } return result; } /* Allocate an entity from the pool and return a pointer to it */ static int allocate_entity(io_entity_t **entity) { int result = IO_FAIL; assert(entity != NULL); if (entity_count < MAX_IO_HANDLES) { unsigned int index = 0; result = find_first_entity(NULL, &index); assert(result == IO_SUCCESS); *entity = entity_map[index] = &entity_pool[index]; ++entity_count; } else result = IO_RESOURCES_EXHAUSTED; return result; } /* Release an entity back to the pool */ static int free_entity(const io_entity_t *entity) { int result = IO_FAIL; unsigned int index = 0; assert(entity != NULL); result = find_first_entity(entity, &index); if (result == IO_SUCCESS) { entity_map[index] = NULL; --entity_count; } return result; } /* Exported API */ /* Register a device driver */ int io_register_device(const io_dev_info_t *dev_info) { int result = IO_FAIL; assert(dev_info != NULL); if (dev_count < MAX_IO_DEVICES) { devices[dev_count] = dev_info; dev_count++; result = IO_SUCCESS; } else { result = IO_RESOURCES_EXHAUSTED; } return result; } /* Open a connection to an IO device */ int io_dev_open(const io_dev_connector_t *dev_con, const uintptr_t dev_spec, uintptr_t *handle) { int result = IO_FAIL; assert(handle != NULL); result = dev_open(dev_con, dev_spec, (io_dev_info_t **)handle); return result; } /* Initialise an IO device explicitly - to permit lazy initialisation or * re-initialisation */ int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params) { int result = IO_FAIL; assert(dev_handle != (uintptr_t)NULL); assert(is_valid_dev(dev_handle)); io_dev_info_t *dev = (io_dev_info_t *)dev_handle; if (dev->funcs->dev_init != NULL) { result = dev->funcs->dev_init(dev, init_params); } else { /* Absence of registered function implies NOP here */ result = IO_SUCCESS; } return result; } /* TODO: Consider whether an explicit "shutdown" API should be included */ /* Close a connection to a device */ int io_dev_close(uintptr_t dev_handle) { int result = IO_FAIL; assert(dev_handle != (uintptr_t)NULL); assert(is_valid_dev(dev_handle)); io_dev_info_t *dev = (io_dev_info_t *)dev_handle; if (dev->funcs->dev_close != NULL) { result = dev->funcs->dev_close(dev); } else { /* Absence of registered function implies NOP here */ result = IO_SUCCESS; } return result; } /* Synchronous operations */ /* Open an IO entity */ int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle) { int result = IO_FAIL; assert((spec != (uintptr_t)NULL) && (handle != NULL)); assert(is_valid_dev(dev_handle)); io_dev_info_t *dev = (io_dev_info_t *)dev_handle; io_entity_t *entity; result = allocate_entity(&entity); if (result == IO_SUCCESS) { assert(dev->funcs->open != NULL); result = dev->funcs->open(dev, spec, entity); if (result == IO_SUCCESS) { entity->dev_handle = dev; set_handle(handle, entity); } else free_entity(entity); } return result; } /* Seek to a specific position in an IO entity */ int io_seek(uintptr_t handle, io_seek_mode_t mode, ssize_t offset) { int result = IO_FAIL; assert(is_valid_entity(handle) && is_valid_seek_mode(mode)); io_entity_t *entity = (io_entity_t *)handle; io_dev_info_t *dev = entity->dev_handle; if (dev->funcs->seek != NULL) result = dev->funcs->seek(entity, mode, offset); else result = IO_NOT_SUPPORTED; return result; } /* Determine the length of an IO entity */ int io_size(uintptr_t handle, size_t *length) { int result = IO_FAIL; assert(is_valid_entity(handle) && (length != NULL)); io_entity_t *entity = (io_entity_t *)handle; io_dev_info_t *dev = entity->dev_handle; if (dev->funcs->size != NULL) result = dev->funcs->size(entity, length); else result = IO_NOT_SUPPORTED; return result; } /* Read data from an IO entity */ int io_read(uintptr_t handle, uintptr_t buffer, size_t length, size_t *length_read) { int result = IO_FAIL; assert(is_valid_entity(handle) && (buffer != (uintptr_t)NULL)); io_entity_t *entity = (io_entity_t *)handle; io_dev_info_t *dev = entity->dev_handle; if (dev->funcs->read != NULL) result = dev->funcs->read(entity, buffer, length, length_read); else result = IO_NOT_SUPPORTED; return result; } /* Write data to an IO entity */ int io_write(uintptr_t handle, const uintptr_t buffer, size_t length, size_t *length_written) { int result = IO_FAIL; assert(is_valid_entity(handle) && (buffer != (uintptr_t)NULL)); io_entity_t *entity = (io_entity_t *)handle; io_dev_info_t *dev = entity->dev_handle; if (dev->funcs->write != NULL) { result = dev->funcs->write(entity, buffer, length, length_written); } else result = IO_NOT_SUPPORTED; return result; } /* Close an IO entity */ int io_close(uintptr_t handle) { int result = IO_FAIL; assert(is_valid_entity(handle)); io_entity_t *entity = (io_entity_t *)handle; io_dev_info_t *dev = entity->dev_handle; if (dev->funcs->close != NULL) result = dev->funcs->close(entity); else { /* Absence of registered function implies NOP here */ result = IO_SUCCESS; } /* Ignore improbable free_entity failure */ (void)free_entity(entity); return result; } arm-trusted-firmware-1.0-aw-6/fdts/000077500000000000000000000000001322600646200171445ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/fdts/fvp-base-gicv2-psci.dtb000066400000000000000000000235421322600646200233140ustar00rootroot00000000000000Ð þí'bH$(b#¸€ FVP Basearm,vfp-basearm,vexpress"1chosenaliases/=/smb/motherboard/iofpga@3,00000000/uart@090000/E/smb/motherboard/iofpga@3,00000000/uart@0a0000/M/smb/motherboard/iofpga@3,00000000/uart@0b0000/U/smb/motherboard/iofpga@3,00000000/uart@0c0000psci arm,psci]smcdÄp„xÄ„Œ„ cpus"1cpu-mapcluster0core0–core1–core2–core3–cluster1core0–core1–core2–core3– idle-states šarm,pscicpu-sleep-0arm,idle-state§º(ËdÛ–ì ò cluster-sleep-0arm,idle-state§ºôËèÛ Äì ò cpu@0úcpu arm,armv8 psci ìòcpu@1úcpu arm,armv8 psci ìòcpu@2úcpu arm,armv8 psci ìòcpu@3úcpu arm,armv8 psci ìòcpu@100úcpu arm,armv8 psci ìòcpu@101úcpu arm,armv8 psci ìòcpu@102úcpu arm,armv8 psci ìòcpu@103úcpu arm,armv8 psci ì ò memory@80000000úmemory €€€interrupt-controller@2f000000%arm,cortex-a15-gicarm,cortex-a9-gic("9@/, , ,ð  N ìòtimerarm,armv8-timer0N ÿÿ ÿ ÿYõátimer@2a810000arm,armv7-timer-mem*Yõá"1iframe@2a830000p N*ƒpmuarm,armv8-pmuv30N<=>?smb simple-bus"1xi ( }?´            !!""##$$%%&&''(())**motherboardžrs1arm,vexpress,v2m-p1simple-bus"1(iflash@0,00000000arm,vexpress-flashcfi-flash±vram@2,00000000arm,vexpress-vram €ethernet@2,02000000smsc,lan91c111 Nclk24mhz fixed-clock¼Yn6 Év2m:clk24mhzìòrefclk1mhz fixed-clock¼YB@Év2m:refclk1mhzì ò refclk32khz fixed-clock¼Y€Év2m:refclk32khzì ò iofpga@3,00000000arm,amba-bussimple-bus"1i sysreg@010000arm,vexpress-sysregÜììòsysctl@020000arm,sp810arm,primecell ø ÿrefclktimclkapb_pclk¼0Étimerclken0timerclken1timerclken2timerclken3ìòaaci@040000arm,pl041arm,primecellN ø ÿapb_pclkmmci@050000arm,pl180arm,primecellN    ·+øÿmclkapb_pclkkmi@060000arm,pl050arm,primecellN øÿKMIREFCLKapb_pclkkmi@070000arm,pl050arm,primecellN øÿKMIREFCLKapb_pclkuart@090000arm,pl011arm,primecell Nøÿuartclkapb_pclkuart@0a0000arm,pl011arm,primecell Nøÿuartclkapb_pclkuart@0b0000arm,pl011arm,primecell Nøÿuartclkapb_pclkuart@0c0000arm,pl011arm,primecell Nøÿuartclkapb_pclkwdt@0f0000arm,sp805arm,primecellNø ÿwdogclkapb_pclktimer@110000arm,sp804arm,primecellNøÿtimclken1timclken2apb_pclktimer@120000arm,sp804arm,primecellNøÿtimclken1timclken2apb_pclkrtc@170000arm,pl031arm,primecellNø ÿapb_pclkclcd@1f0000arm,pl111arm,primecellNøÿclcdclkapb_pclk7XVGA<Dvirtio_block@0130000 virtio,mmioN*fixedregulator@0regulator-fixedP3V3_2Z w2Z ìòmcc#arm,vexpress,config-bussimple-bus£osc@1arm,vexpress-osc¾×jepÈî༠Év2m:oscclk1ìòmuxfpga@0arm,vexpress-muxfpga¾dvimode@0arm,vexpress-dvimode¾ panelspanel@0panel7XVGAâ<êïô=„ý˜ 0#0h:DIFB_VMODE_NONINTERLACEDOTIM2_BCDTIM2_IPC&TCNTL_LCDTFTCNTL_BGRCNTL_LCDVCOMP(1)(YCLCD_CAP_5551CLCD_CAP_565CLCD_CAP_888^ modelcompatibleinterrupt-parent#address-cells#size-cellsserial0serial1serial2serial3methodcpu_suspendcpu_offcpu_onsys_poweroffsys_resetcpuentry-methodentry-method-paramentry-latency-usexit-latency-usmin-residency-uslinux,phandledevice_typeregenable-methodcpu-idle-states#interrupt-cellsinterrupt-controllerinterruptsclock-frequencyrangesframe-numberinterrupt-map-maskinterrupt-maparm,v2m-memory-mapbank-width#clock-cellsclock-output-namesgpio-controller#gpio-cellsclocksclock-namescd-gpioswp-gpiosmax-frequencyvmmc-supplymodeuse_dmaframebufferregulator-nameregulator-min-microvoltregulator-max-microvoltregulator-always-onarm,vexpress,config-bridgearm,vexpress-sysreg,funcfreq-rangerefreshxresyrespixclockleft_marginright_marginupper_marginlower_marginhsync_lenvsync_lensyncvmodetim2cntlcapsbpparm-trusted-firmware-1.0-aw-6/fdts/fvp-base-gicv2-psci.dts000066400000000000000000000166011322600646200233330ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /dts-v1/; /memreserve/ 0x80000000 0x00010000; / { }; / { model = "FVP Base"; compatible = "arm,vfp-base", "arm,vexpress"; interrupt-parent = <&gic>; #address-cells = <2>; #size-cells = <2>; chosen { }; aliases { serial0 = &v2m_serial0; serial1 = &v2m_serial1; serial2 = &v2m_serial2; serial3 = &v2m_serial3; }; psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; cpu_on = <0xc4000003>; sys_poweroff = <0x84000008>; sys_reset = <0x84000009>; }; cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; cluster1 { core0 { cpu = <&CPU4>; }; core1 { cpu = <&CPU5>; }; core2 { cpu = <&CPU6>; }; core3 { cpu = <&CPU7>; }; }; }; idle-states { entry-method = "arm,psci"; CPU_SLEEP_0: cpu-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x0010000>; entry-latency-us = <40>; exit-latency-us = <100>; min-residency-us = <150>; }; CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x1010000>; entry-latency-us = <500>; exit-latency-us = <1000>; min-residency-us = <2500>; }; }; CPU0:cpu@0 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x0>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU1:cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x1>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU2:cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x2>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU3:cpu@3 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x3>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU4:cpu@100 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x100>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU5:cpu@101 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x101>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU6:cpu@102 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x102>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU7:cpu@103 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x103>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x00000000 0x80000000 0 0x7F000000>, <0x00000008 0x80000000 0 0x80000000>; }; gic: interrupt-controller@2f000000 { compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; #interrupt-cells = <3>; #address-cells = <0>; interrupt-controller; reg = <0x0 0x2f000000 0 0x10000>, <0x0 0x2c000000 0 0x2000>, <0x0 0x2c010000 0 0x2000>, <0x0 0x2c02F000 0 0x2000>; interrupts = <1 9 0xf04>; }; timer { compatible = "arm,armv8-timer"; interrupts = <1 13 0xff01>, <1 14 0xff01>, <1 11 0xff01>, <1 10 0xff01>; clock-frequency = <100000000>; }; timer@2a810000 { compatible = "arm,armv7-timer-mem"; reg = <0x0 0x2a810000 0x0 0x10000>; clock-frequency = <100000000>; #address-cells = <2>; #size-cells = <2>; ranges; frame@2a830000 { frame-number = <1>; interrupts = <0 26 4>; reg = <0x0 0x2a830000 0x0 0x10000>; }; }; pmu { compatible = "arm,armv8-pmuv3"; interrupts = <0 60 4>, <0 61 4>, <0 62 4>, <0 63 4>; }; smb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0 0 0 0x08000000 0x04000000>, <1 0 0 0x14000000 0x04000000>, <2 0 0 0x18000000 0x04000000>, <3 0 0 0x1c000000 0x04000000>, <4 0 0 0x0c000000 0x04000000>, <5 0 0 0x10000000 0x04000000>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 63>; interrupt-map = <0 0 0 &gic 0 0 4>, <0 0 1 &gic 0 1 4>, <0 0 2 &gic 0 2 4>, <0 0 3 &gic 0 3 4>, <0 0 4 &gic 0 4 4>, <0 0 5 &gic 0 5 4>, <0 0 6 &gic 0 6 4>, <0 0 7 &gic 0 7 4>, <0 0 8 &gic 0 8 4>, <0 0 9 &gic 0 9 4>, <0 0 10 &gic 0 10 4>, <0 0 11 &gic 0 11 4>, <0 0 12 &gic 0 12 4>, <0 0 13 &gic 0 13 4>, <0 0 14 &gic 0 14 4>, <0 0 15 &gic 0 15 4>, <0 0 16 &gic 0 16 4>, <0 0 17 &gic 0 17 4>, <0 0 18 &gic 0 18 4>, <0 0 19 &gic 0 19 4>, <0 0 20 &gic 0 20 4>, <0 0 21 &gic 0 21 4>, <0 0 22 &gic 0 22 4>, <0 0 23 &gic 0 23 4>, <0 0 24 &gic 0 24 4>, <0 0 25 &gic 0 25 4>, <0 0 26 &gic 0 26 4>, <0 0 27 &gic 0 27 4>, <0 0 28 &gic 0 28 4>, <0 0 29 &gic 0 29 4>, <0 0 30 &gic 0 30 4>, <0 0 31 &gic 0 31 4>, <0 0 32 &gic 0 32 4>, <0 0 33 &gic 0 33 4>, <0 0 34 &gic 0 34 4>, <0 0 35 &gic 0 35 4>, <0 0 36 &gic 0 36 4>, <0 0 37 &gic 0 37 4>, <0 0 38 &gic 0 38 4>, <0 0 39 &gic 0 39 4>, <0 0 40 &gic 0 40 4>, <0 0 41 &gic 0 41 4>, <0 0 42 &gic 0 42 4>; /include/ "rtsm_ve-motherboard.dtsi" }; panels { panel@0 { compatible = "panel"; mode = "XVGA"; refresh = <60>; xres = <1024>; yres = <768>; pixclock = <15748>; left_margin = <152>; right_margin = <48>; upper_margin = <23>; lower_margin = <3>; hsync_len = <104>; vsync_len = <4>; sync = <0>; vmode = "FB_VMODE_NONINTERLACED"; tim2 = "TIM2_BCD", "TIM2_IPC"; cntl = "CNTL_LCDTFT", "CNTL_BGR", "CNTL_LCDVCOMP(1)"; caps = "CLCD_CAP_5551", "CLCD_CAP_565", "CLCD_CAP_888"; bpp = <16>; }; }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-base-gicv2legacy-psci.dtb000066400000000000000000000235421322600646200245010ustar00rootroot00000000000000Ð þí'bH$(b#¸€ FVP Basearm,vfp-basearm,vexpress"1chosenaliases/=/smb/motherboard/iofpga@3,00000000/uart@090000/E/smb/motherboard/iofpga@3,00000000/uart@0a0000/M/smb/motherboard/iofpga@3,00000000/uart@0b0000/U/smb/motherboard/iofpga@3,00000000/uart@0c0000psci arm,psci]smcdÄp„xÄ„Œ„ cpus"1cpu-mapcluster0core0–core1–core2–core3–cluster1core0–core1–core2–core3– idle-states šarm,pscicpu-sleep-0arm,idle-state§º(ËdÛ–ì ò cluster-sleep-0arm,idle-state§ºôËèÛ Äì ò cpu@0úcpu arm,armv8 psci ìòcpu@1úcpu arm,armv8 psci ìòcpu@2úcpu arm,armv8 psci ìòcpu@3úcpu arm,armv8 psci ìòcpu@100úcpu arm,armv8 psci ìòcpu@101úcpu arm,armv8 psci ìòcpu@102úcpu arm,armv8 psci ìòcpu@103úcpu arm,armv8 psci ì ò memory@80000000úmemory €€€interrupt-controller@2c001000%arm,cortex-a15-gicarm,cortex-a9-gic("9@,, ,@ ,`  N ìòtimerarm,armv8-timer0N ÿÿ ÿ ÿYõátimer@2a810000arm,armv7-timer-mem*Yõá"1iframe@2a830000p N*ƒpmuarm,armv8-pmuv30N<=>?smb simple-bus"1xi ( }?´            !!""##$$%%&&''(())**motherboardžrs1arm,vexpress,v2m-p1simple-bus"1(iflash@0,00000000arm,vexpress-flashcfi-flash±vram@2,00000000arm,vexpress-vram €ethernet@2,02000000smsc,lan91c111 Nclk24mhz fixed-clock¼Yn6 Év2m:clk24mhzìòrefclk1mhz fixed-clock¼YB@Év2m:refclk1mhzì ò refclk32khz fixed-clock¼Y€Év2m:refclk32khzì ò iofpga@3,00000000arm,amba-bussimple-bus"1i sysreg@010000arm,vexpress-sysregÜììòsysctl@020000arm,sp810arm,primecell ø ÿrefclktimclkapb_pclk¼0Étimerclken0timerclken1timerclken2timerclken3ìòaaci@040000arm,pl041arm,primecellN ø ÿapb_pclkmmci@050000arm,pl180arm,primecellN    ·+øÿmclkapb_pclkkmi@060000arm,pl050arm,primecellN øÿKMIREFCLKapb_pclkkmi@070000arm,pl050arm,primecellN øÿKMIREFCLKapb_pclkuart@090000arm,pl011arm,primecell Nøÿuartclkapb_pclkuart@0a0000arm,pl011arm,primecell Nøÿuartclkapb_pclkuart@0b0000arm,pl011arm,primecell Nøÿuartclkapb_pclkuart@0c0000arm,pl011arm,primecell Nøÿuartclkapb_pclkwdt@0f0000arm,sp805arm,primecellNø ÿwdogclkapb_pclktimer@110000arm,sp804arm,primecellNøÿtimclken1timclken2apb_pclktimer@120000arm,sp804arm,primecellNøÿtimclken1timclken2apb_pclkrtc@170000arm,pl031arm,primecellNø ÿapb_pclkclcd@1f0000arm,pl111arm,primecellNøÿclcdclkapb_pclk7XVGA<Dvirtio_block@0130000 virtio,mmioN*fixedregulator@0regulator-fixedP3V3_2Z w2Z ìòmcc#arm,vexpress,config-bussimple-bus£osc@1arm,vexpress-osc¾×jepÈî༠Év2m:oscclk1ìòmuxfpga@0arm,vexpress-muxfpga¾dvimode@0arm,vexpress-dvimode¾ panelspanel@0panel7XVGAâ<êïô=„ý˜ 0#0h:DIFB_VMODE_NONINTERLACEDOTIM2_BCDTIM2_IPC&TCNTL_LCDTFTCNTL_BGRCNTL_LCDVCOMP(1)(YCLCD_CAP_5551CLCD_CAP_565CLCD_CAP_888^ modelcompatibleinterrupt-parent#address-cells#size-cellsserial0serial1serial2serial3methodcpu_suspendcpu_offcpu_onsys_poweroffsys_resetcpuentry-methodentry-method-paramentry-latency-usexit-latency-usmin-residency-uslinux,phandledevice_typeregenable-methodcpu-idle-states#interrupt-cellsinterrupt-controllerinterruptsclock-frequencyrangesframe-numberinterrupt-map-maskinterrupt-maparm,v2m-memory-mapbank-width#clock-cellsclock-output-namesgpio-controller#gpio-cellsclocksclock-namescd-gpioswp-gpiosmax-frequencyvmmc-supplymodeuse_dmaframebufferregulator-nameregulator-min-microvoltregulator-max-microvoltregulator-always-onarm,vexpress,config-bridgearm,vexpress-sysreg,funcfreq-rangerefreshxresyrespixclockleft_marginright_marginupper_marginlower_marginhsync_lenvsync_lensyncvmodetim2cntlcapsbpparm-trusted-firmware-1.0-aw-6/fdts/fvp-base-gicv2legacy-psci.dts000066400000000000000000000166001322600646200245170ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /dts-v1/; /memreserve/ 0x80000000 0x00010000; / { }; / { model = "FVP Base"; compatible = "arm,vfp-base", "arm,vexpress"; interrupt-parent = <&gic>; #address-cells = <2>; #size-cells = <2>; chosen { }; aliases { serial0 = &v2m_serial0; serial1 = &v2m_serial1; serial2 = &v2m_serial2; serial3 = &v2m_serial3; }; psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; cpu_on = <0xc4000003>; sys_poweroff = <0x84000008>; sys_reset = <0x84000009>; }; cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; cluster1 { core0 { cpu = <&CPU4>; }; core1 { cpu = <&CPU5>; }; core2 { cpu = <&CPU6>; }; core3 { cpu = <&CPU7>; }; }; }; idle-states { entry-method = "arm,psci"; CPU_SLEEP_0: cpu-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x0010000>; entry-latency-us = <40>; exit-latency-us = <100>; min-residency-us = <150>; }; CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x1010000>; entry-latency-us = <500>; exit-latency-us = <1000>; min-residency-us = <2500>; }; }; CPU0:cpu@0 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x0>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU1:cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x1>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU2:cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x2>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU3:cpu@3 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x3>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU4:cpu@100 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x100>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU5:cpu@101 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x101>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU6:cpu@102 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x102>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU7:cpu@103 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x103>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x00000000 0x80000000 0 0x7F000000>, <0x00000008 0x80000000 0 0x80000000>; }; gic: interrupt-controller@2c001000 { compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; #interrupt-cells = <3>; #address-cells = <0>; interrupt-controller; reg = <0x0 0x2c001000 0 0x1000>, <0x0 0x2c002000 0 0x1000>, <0x0 0x2c004000 0 0x2000>, <0x0 0x2c006000 0 0x2000>; interrupts = <1 9 0xf04>; }; timer { compatible = "arm,armv8-timer"; interrupts = <1 13 0xff01>, <1 14 0xff01>, <1 11 0xff01>, <1 10 0xff01>; clock-frequency = <100000000>; }; timer@2a810000 { compatible = "arm,armv7-timer-mem"; reg = <0x0 0x2a810000 0x0 0x10000>; clock-frequency = <100000000>; #address-cells = <2>; #size-cells = <2>; ranges; frame@2a830000 { frame-number = <1>; interrupts = <0 26 4>; reg = <0x0 0x2a830000 0x0 0x10000>; }; }; pmu { compatible = "arm,armv8-pmuv3"; interrupts = <0 60 4>, <0 61 4>, <0 62 4>, <0 63 4>; }; smb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0 0 0 0x08000000 0x04000000>, <1 0 0 0x14000000 0x04000000>, <2 0 0 0x18000000 0x04000000>, <3 0 0 0x1c000000 0x04000000>, <4 0 0 0x0c000000 0x04000000>, <5 0 0 0x10000000 0x04000000>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 63>; interrupt-map = <0 0 0 &gic 0 0 4>, <0 0 1 &gic 0 1 4>, <0 0 2 &gic 0 2 4>, <0 0 3 &gic 0 3 4>, <0 0 4 &gic 0 4 4>, <0 0 5 &gic 0 5 4>, <0 0 6 &gic 0 6 4>, <0 0 7 &gic 0 7 4>, <0 0 8 &gic 0 8 4>, <0 0 9 &gic 0 9 4>, <0 0 10 &gic 0 10 4>, <0 0 11 &gic 0 11 4>, <0 0 12 &gic 0 12 4>, <0 0 13 &gic 0 13 4>, <0 0 14 &gic 0 14 4>, <0 0 15 &gic 0 15 4>, <0 0 16 &gic 0 16 4>, <0 0 17 &gic 0 17 4>, <0 0 18 &gic 0 18 4>, <0 0 19 &gic 0 19 4>, <0 0 20 &gic 0 20 4>, <0 0 21 &gic 0 21 4>, <0 0 22 &gic 0 22 4>, <0 0 23 &gic 0 23 4>, <0 0 24 &gic 0 24 4>, <0 0 25 &gic 0 25 4>, <0 0 26 &gic 0 26 4>, <0 0 27 &gic 0 27 4>, <0 0 28 &gic 0 28 4>, <0 0 29 &gic 0 29 4>, <0 0 30 &gic 0 30 4>, <0 0 31 &gic 0 31 4>, <0 0 32 &gic 0 32 4>, <0 0 33 &gic 0 33 4>, <0 0 34 &gic 0 34 4>, <0 0 35 &gic 0 35 4>, <0 0 36 &gic 0 36 4>, <0 0 37 &gic 0 37 4>, <0 0 38 &gic 0 38 4>, <0 0 39 &gic 0 39 4>, <0 0 40 &gic 0 40 4>, <0 0 41 &gic 0 41 4>, <0 0 42 &gic 0 42 4>; /include/ "rtsm_ve-motherboard.dtsi" }; panels { panel@0 { compatible = "panel"; mode = "XVGA"; refresh = <60>; xres = <1024>; yres = <768>; pixclock = <15748>; left_margin = <152>; right_margin = <48>; upper_margin = <23>; lower_margin = <3>; hsync_len = <104>; vsync_len = <4>; sync = <0>; vmode = "FB_VMODE_NONINTERLACED"; tim2 = "TIM2_BCD", "TIM2_IPC"; cntl = "CNTL_LCDTFT", "CNTL_BGR", "CNTL_LCDVCOMP(1)"; caps = "CLCD_CAP_5551", "CLCD_CAP_565", "CLCD_CAP_888"; bpp = <16>; }; }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-base-gicv3-psci.dtb000066400000000000000000000247261322600646200233220ustar00rootroot00000000000000Ð þí)ÖH&|(Z&4€ FVP Basearm,vfp-basearm,vexpress"1chosenaliases/=/smb/motherboard/iofpga@3,00000000/uart@090000/E/smb/motherboard/iofpga@3,00000000/uart@0a0000/M/smb/motherboard/iofpga@3,00000000/uart@0b0000/U/smb/motherboard/iofpga@3,00000000/uart@0c0000psci arm,psci]smcdÄp„xÄcpus"1cpu-mapcluster0core0core1core2core3cluster1core0core1core2core3 idle-states ƒarm,pscicpu-sleep-0arm,idle-state£(´dÄ–Õ Û cluster-sleep-0arm,idle-state£ô´èÄ ÄÕ Û cpu@0ãcpu arm,armv8ïópsci ÕÛcpu@1ãcpu arm,armv8ïópsci ÕÛcpu@2ãcpu arm,armv8ïópsci ÕÛcpu@3ãcpu arm,armv8ïópsci ÕÛcpu@100ãcpu arm,armv8ïópsci ÕÛcpu@101ãcpu arm,armv8ïópsci ÕÛcpu@102ãcpu arm,armv8ïópsci ÕÛcpu@103ãcpu arm,armv8ïópsci Õ Û memory@80000000ãmemory €interrupt-controller@2f000000 arm,gic-v3"1")Pï// , , ,ð  > ÕÛits@2f020000arm,gic-v3-itsIï/timerarm,armv8-timer0> ÿÿ ÿ ÿXõátimer@2a810000arm,armv7-timer-memï*Xõá"1"frame@2a830000h >ï*ƒpmuarm,armv8-pmuv30><=>?smb simple-bus"1x"  u? ˆ            !!""##$$%%&&''(())**motherboard–rs1arm,vexpress,v2m-p1simple-bus"1"flash@0,00000000arm,vexpress-flashcfi-flashï©vram@2,00000000arm,vexpress-vram ï€ethernet@2,02000000smsc,lan91c111 ï>clk24mhz fixed-clock´Xn6 Áv2m:clk24mhzÕÛrefclk1mhz fixed-clock´XB@Áv2m:refclk1mhzÕ Û refclk32khz fixed-clock´X€Áv2m:refclk32khzÕ Û iofpga@3,00000000arm,amba-bussimple-bus"1" sysreg@010000arm,vexpress-sysregïÔäÕÛsysctl@020000arm,sp810arm,primecellï ð ÷refclktimclkapb_pclk´0Átimerclken0timerclken1timerclken2timerclken3ÕÛaaci@040000arm,pl041arm,primecellï> ð ÷apb_pclkmmci@050000arm,pl180arm,primecellï>    ·#ð÷mclkapb_pclkkmi@060000arm,pl050arm,primecellï> ð÷KMIREFCLKapb_pclkkmi@070000arm,pl050arm,primecellï> ð÷KMIREFCLKapb_pclkuart@090000arm,pl011arm,primecellï >ð÷uartclkapb_pclkuart@0a0000arm,pl011arm,primecellï >ð÷uartclkapb_pclkuart@0b0000arm,pl011arm,primecellï >ð÷uartclkapb_pclkuart@0c0000arm,pl011arm,primecellï >ð÷uartclkapb_pclkwdt@0f0000arm,sp805arm,primecellï>ð ÷wdogclkapb_pclktimer@110000arm,sp804arm,primecellï>ð÷timclken1timclken2apb_pclktimer@120000arm,sp804arm,primecellï>ð÷timclken1timclken2apb_pclkrtc@170000arm,pl031arm,primecellï>ð ÷apb_pclkclcd@1f0000arm,pl111arm,primecellï>ð÷clcdclkapb_pclk/XVGA4<virtio_block@0130000 virtio,mmioï>*fixedregulator@0regulator-fixedH3V3W2Z o2Z ‡ÕÛmcc#arm,vexpress,config-bussimple-bus›osc@1arm,vexpress-osc¶ÏjepÈîà´ Áv2m:oscclk1ÕÛreset@0arm,vexpress-reset¶muxfpga@0arm,vexpress-muxfpga¶shutdown@0arm,vexpress-shutdown¶reboot@0arm,vexpress-reboot¶ dvimode@0arm,vexpress-dvimode¶ panelspanel@0panel/XVGAÚ<âçì=„õ˜0(h2<AFB_VMODE_NONINTERLACEDGTIM2_BCDTIM2_IPC&LCNTL_LCDTFTCNTL_BGRCNTL_LCDVCOMP(1)(QCLCD_CAP_5551CLCD_CAP_565CLCD_CAP_888V modelcompatibleinterrupt-parent#address-cells#size-cellsserial0serial1serial2serial3methodcpu_suspendcpu_offcpu_oncpuentry-methodentry-method-paramentry-latency-usexit-latency-usmin-residency-uslinux,phandledevice_typeregenable-methodcpu-idle-states#interrupt-cellsrangesinterrupt-controllerinterruptsmsi-controllerclock-frequencyframe-numberinterrupt-map-maskinterrupt-maparm,v2m-memory-mapbank-width#clock-cellsclock-output-namesgpio-controller#gpio-cellsclocksclock-namescd-gpioswp-gpiosmax-frequencyvmmc-supplymodeuse_dmaframebufferregulator-nameregulator-min-microvoltregulator-max-microvoltregulator-always-onarm,vexpress,config-bridgearm,vexpress-sysreg,funcfreq-rangerefreshxresyrespixclockleft_marginright_marginupper_marginlower_marginhsync_lenvsync_lensyncvmodetim2cntlcapsbpparm-trusted-firmware-1.0-aw-6/fdts/fvp-base-gicv3-psci.dts000066400000000000000000000173051322600646200233360ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /dts-v1/; /memreserve/ 0x80000000 0x00010000; / { }; / { model = "FVP Base"; compatible = "arm,vfp-base", "arm,vexpress"; interrupt-parent = <&gic>; #address-cells = <2>; #size-cells = <2>; chosen { }; aliases { serial0 = &v2m_serial0; serial1 = &v2m_serial1; serial2 = &v2m_serial2; serial3 = &v2m_serial3; }; psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; cpu_on = <0xc4000003>; }; cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; cluster1 { core0 { cpu = <&CPU4>; }; core1 { cpu = <&CPU5>; }; core2 { cpu = <&CPU6>; }; core3 { cpu = <&CPU7>; }; }; }; idle-states { entry-method = "arm,psci"; CPU_SLEEP_0: cpu-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x0010000>; entry-latency-us = <40>; exit-latency-us = <100>; min-residency-us = <150>; }; CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x1010000>; entry-latency-us = <500>; exit-latency-us = <1000>; min-residency-us = <2500>; }; }; CPU0:cpu@0 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x0>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU1:cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x1>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU2:cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x2>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU3:cpu@3 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x3>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU4:cpu@100 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x100>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU5:cpu@101 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x101>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU6:cpu@102 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x102>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU7:cpu@103 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x103>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x00000000 0x80000000 0 0x7F000000>, <0x00000008 0x80000000 0 0x80000000>; }; gic: interrupt-controller@2f000000 { compatible = "arm,gic-v3"; #interrupt-cells = <3>; #address-cells = <2>; #size-cells = <2>; ranges; interrupt-controller; reg = <0x0 0x2f000000 0 0x10000>, // GICD <0x0 0x2f100000 0 0x200000>, // GICR <0x0 0x2c000000 0 0x2000>, // GICC <0x0 0x2c010000 0 0x2000>, // GICH <0x0 0x2c02f000 0 0x2000>; // GICV interrupts = <1 9 4>; its: its@2f020000 { compatible = "arm,gic-v3-its"; msi-controller; reg = <0x0 0x2f020000 0x0 0x20000>; // GITS }; }; timer { compatible = "arm,armv8-timer"; interrupts = <1 13 0xff01>, <1 14 0xff01>, <1 11 0xff01>, <1 10 0xff01>; clock-frequency = <100000000>; }; timer@2a810000 { compatible = "arm,armv7-timer-mem"; reg = <0x0 0x2a810000 0x0 0x10000>; clock-frequency = <100000000>; #address-cells = <2>; #size-cells = <2>; ranges; frame@2a830000 { frame-number = <1>; interrupts = <0 26 4>; reg = <0x0 0x2a830000 0x0 0x10000>; }; }; pmu { compatible = "arm,armv8-pmuv3"; interrupts = <0 60 4>, <0 61 4>, <0 62 4>, <0 63 4>; }; smb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0 0 0 0x08000000 0x04000000>, <1 0 0 0x14000000 0x04000000>, <2 0 0 0x18000000 0x04000000>, <3 0 0 0x1c000000 0x04000000>, <4 0 0 0x0c000000 0x04000000>, <5 0 0 0x10000000 0x04000000>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 63>; interrupt-map = <0 0 0 &gic 0 0 0 0 4>, <0 0 1 &gic 0 0 0 1 4>, <0 0 2 &gic 0 0 0 2 4>, <0 0 3 &gic 0 0 0 3 4>, <0 0 4 &gic 0 0 0 4 4>, <0 0 5 &gic 0 0 0 5 4>, <0 0 6 &gic 0 0 0 6 4>, <0 0 7 &gic 0 0 0 7 4>, <0 0 8 &gic 0 0 0 8 4>, <0 0 9 &gic 0 0 0 9 4>, <0 0 10 &gic 0 0 0 10 4>, <0 0 11 &gic 0 0 0 11 4>, <0 0 12 &gic 0 0 0 12 4>, <0 0 13 &gic 0 0 0 13 4>, <0 0 14 &gic 0 0 0 14 4>, <0 0 15 &gic 0 0 0 15 4>, <0 0 16 &gic 0 0 0 16 4>, <0 0 17 &gic 0 0 0 17 4>, <0 0 18 &gic 0 0 0 18 4>, <0 0 19 &gic 0 0 0 19 4>, <0 0 20 &gic 0 0 0 20 4>, <0 0 21 &gic 0 0 0 21 4>, <0 0 22 &gic 0 0 0 22 4>, <0 0 23 &gic 0 0 0 23 4>, <0 0 24 &gic 0 0 0 24 4>, <0 0 25 &gic 0 0 0 25 4>, <0 0 26 &gic 0 0 0 26 4>, <0 0 27 &gic 0 0 0 27 4>, <0 0 28 &gic 0 0 0 28 4>, <0 0 29 &gic 0 0 0 29 4>, <0 0 30 &gic 0 0 0 30 4>, <0 0 31 &gic 0 0 0 31 4>, <0 0 32 &gic 0 0 0 32 4>, <0 0 33 &gic 0 0 0 33 4>, <0 0 34 &gic 0 0 0 34 4>, <0 0 35 &gic 0 0 0 35 4>, <0 0 36 &gic 0 0 0 36 4>, <0 0 37 &gic 0 0 0 37 4>, <0 0 38 &gic 0 0 0 38 4>, <0 0 39 &gic 0 0 0 39 4>, <0 0 40 &gic 0 0 0 40 4>, <0 0 41 &gic 0 0 0 41 4>, <0 0 42 &gic 0 0 0 42 4>; /include/ "rtsm_ve-motherboard-no_psci.dtsi" }; panels { panel@0 { compatible = "panel"; mode = "XVGA"; refresh = <60>; xres = <1024>; yres = <768>; pixclock = <15748>; left_margin = <152>; right_margin = <48>; upper_margin = <23>; lower_margin = <3>; hsync_len = <104>; vsync_len = <4>; sync = <0>; vmode = "FB_VMODE_NONINTERLACED"; tim2 = "TIM2_BCD", "TIM2_IPC"; cntl = "CNTL_LCDTFT", "CNTL_BGR", "CNTL_LCDVCOMP(1)"; caps = "CLCD_CAP_5551", "CLCD_CAP_565", "CLCD_CAP_888"; bpp = <16>; }; }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-gicv2-psci.dtb000066400000000000000000000164331322600646200245510ustar00rootroot00000000000000Ð þíH”(‡L€FVP Foundationarm,fvp-basearm,vexpress"1chosenaliases/=/smb/motherboard/iofpga@3,00000000/uart@090000/E/smb/motherboard/iofpga@3,00000000/uart@0a0000/M/smb/motherboard/iofpga@3,00000000/uart@0b0000/U/smb/motherboard/iofpga@3,00000000/uart@0c0000psci arm,psci]smcdÄp„xÄ„Œ„ cpus"1cpu-mapcluster0core0–core1–core2–core3–idle-states šarm,pscicpu-sleep-0arm,idle-state§º(ËdÛ–ìòcluster-sleep-0arm,idle-state§ºôËèÛ Äìòcpu@0úcpu arm,armv8 psciìòcpu@1úcpu arm,armv8 psciìòcpu@2úcpu arm,armv8 psciìòcpu@3úcpu arm,armv8 psciìòmemory@80000000úmemory €€€interrupt-controller@2f000000%arm,cortex-a15-gicarm,cortex-a9-gic("9@/, , ,ð  N ìòtimerarm,armv8-timer0N ÿÿ ÿ ÿYõátimer@2a810000arm,armv7-timer-mem*Yõá"1iframe@2a830000p N*ƒpmuarm,armv8-pmuv30N<=>?smb simple-bus"1xi ( }?´            !!""##$$%%&&''(())**motherboardžrs1arm,vexpress,v2m-p1simple-bus"1(iethernet@2,02000000smsc,lan91c111 Nclk24mhz fixed-clock±Yn6 ¾v2m:clk24mhzì ò refclk1mhz fixed-clock±YB@¾v2m:refclk1mhzì ò refclk32khz fixed-clock±Y€¾v2m:refclk32khzìòiofpga@3,00000000arm,amba-bussimple-bus"1i sysreg@010000arm,vexpress-sysregÑáì ò sysctl@020000arm,sp810arm,primecell í ôrefclktimclkapb_pclk±0¾timerclken0timerclken1timerclken2timerclken3ì ò uart@090000arm,pl011arm,primecell Ní ôuartclkapb_pclkuart@0a0000arm,pl011arm,primecell Ní ôuartclkapb_pclkuart@0b0000arm,pl011arm,primecell Ní ôuartclkapb_pclkuart@0c0000arm,pl011arm,primecell Ní ôuartclkapb_pclkwdt@0f0000arm,sp805arm,primecellNí ôwdogclkapb_pclktimer@110000arm,sp804arm,primecellNí  ôtimclken1timclken2apb_pclktimer@120000arm,sp804arm,primecellNí   ôtimclken1timclken2apb_pclkrtc@170000arm,pl031arm,primecellNí  ôapb_pclkvirtio_block@0130000 virtio,mmioN*fixedregulator@0regulator-fixed3V32Z '2Z ?mcc#arm,vexpress,config-bussimple-busS muxfpga@0arm,vexpress-muxfpgandvimode@0arm,vexpress-dvimoden  modelcompatibleinterrupt-parent#address-cells#size-cellsserial0serial1serial2serial3methodcpu_suspendcpu_offcpu_onsys_poweroffsys_resetcpuentry-methodentry-method-paramentry-latency-usexit-latency-usmin-residency-uslinux,phandledevice_typeregenable-methodcpu-idle-states#interrupt-cellsinterrupt-controllerinterruptsclock-frequencyrangesframe-numberinterrupt-map-maskinterrupt-maparm,v2m-memory-map#clock-cellsclock-output-namesgpio-controller#gpio-cellsclocksclock-namesregulator-nameregulator-min-microvoltregulator-max-microvoltregulator-always-onarm,vexpress,config-bridgearm,vexpress-sysreg,funcarm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-gicv2-psci.dts000066400000000000000000000140211322600646200245610ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /dts-v1/; /memreserve/ 0x80000000 0x00010000; / { }; / { model = "FVP Foundation"; compatible = "arm,fvp-base", "arm,vexpress"; interrupt-parent = <&gic>; #address-cells = <2>; #size-cells = <2>; chosen { }; aliases { serial0 = &v2m_serial0; serial1 = &v2m_serial1; serial2 = &v2m_serial2; serial3 = &v2m_serial3; }; psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; cpu_on = <0xc4000003>; sys_poweroff = <0x84000008>; sys_reset = <0x84000009>; }; cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; }; idle-states { entry-method = "arm,psci"; CPU_SLEEP_0: cpu-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x0010000>; entry-latency-us = <40>; exit-latency-us = <100>; min-residency-us = <150>; }; CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x1010000>; entry-latency-us = <500>; exit-latency-us = <1000>; min-residency-us = <2500>; }; }; CPU0:cpu@0 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x0>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU1:cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x1>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU2:cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x2>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU3:cpu@3 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x3>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x00000000 0x80000000 0 0x7F000000>, <0x00000008 0x80000000 0 0x80000000>; }; gic: interrupt-controller@2f000000 { compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; #interrupt-cells = <3>; #address-cells = <0>; interrupt-controller; reg = <0x0 0x2f000000 0 0x10000>, <0x0 0x2c000000 0 0x2000>, <0x0 0x2c010000 0 0x2000>, <0x0 0x2c02F000 0 0x2000>; interrupts = <1 9 0xf04>; }; timer { compatible = "arm,armv8-timer"; interrupts = <1 13 0xff01>, <1 14 0xff01>, <1 11 0xff01>, <1 10 0xff01>; clock-frequency = <100000000>; }; timer@2a810000 { compatible = "arm,armv7-timer-mem"; reg = <0x0 0x2a810000 0x0 0x10000>; clock-frequency = <100000000>; #address-cells = <2>; #size-cells = <2>; ranges; frame@2a830000 { frame-number = <1>; interrupts = <0 26 4>; reg = <0x0 0x2a830000 0x0 0x10000>; }; }; pmu { compatible = "arm,armv8-pmuv3"; interrupts = <0 60 4>, <0 61 4>, <0 62 4>, <0 63 4>; }; smb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0 0 0 0x08000000 0x04000000>, <1 0 0 0x14000000 0x04000000>, <2 0 0 0x18000000 0x04000000>, <3 0 0 0x1c000000 0x04000000>, <4 0 0 0x0c000000 0x04000000>, <5 0 0 0x10000000 0x04000000>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 63>; interrupt-map = <0 0 0 &gic 0 0 4>, <0 0 1 &gic 0 1 4>, <0 0 2 &gic 0 2 4>, <0 0 3 &gic 0 3 4>, <0 0 4 &gic 0 4 4>, <0 0 5 &gic 0 5 4>, <0 0 6 &gic 0 6 4>, <0 0 7 &gic 0 7 4>, <0 0 8 &gic 0 8 4>, <0 0 9 &gic 0 9 4>, <0 0 10 &gic 0 10 4>, <0 0 11 &gic 0 11 4>, <0 0 12 &gic 0 12 4>, <0 0 13 &gic 0 13 4>, <0 0 14 &gic 0 14 4>, <0 0 15 &gic 0 15 4>, <0 0 16 &gic 0 16 4>, <0 0 17 &gic 0 17 4>, <0 0 18 &gic 0 18 4>, <0 0 19 &gic 0 19 4>, <0 0 20 &gic 0 20 4>, <0 0 21 &gic 0 21 4>, <0 0 22 &gic 0 22 4>, <0 0 23 &gic 0 23 4>, <0 0 24 &gic 0 24 4>, <0 0 25 &gic 0 25 4>, <0 0 26 &gic 0 26 4>, <0 0 27 &gic 0 27 4>, <0 0 28 &gic 0 28 4>, <0 0 29 &gic 0 29 4>, <0 0 30 &gic 0 30 4>, <0 0 31 &gic 0 31 4>, <0 0 32 &gic 0 32 4>, <0 0 33 &gic 0 33 4>, <0 0 34 &gic 0 34 4>, <0 0 35 &gic 0 35 4>, <0 0 36 &gic 0 36 4>, <0 0 37 &gic 0 37 4>, <0 0 38 &gic 0 38 4>, <0 0 39 &gic 0 39 4>, <0 0 40 &gic 0 40 4>, <0 0 41 &gic 0 41 4>, <0 0 42 &gic 0 42 4>; /include/ "fvp-foundation-motherboard.dtsi" }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-gicv2legacy-psci.dtb000066400000000000000000000164331322600646200257360ustar00rootroot00000000000000Ð þíH”(‡L€FVP Foundationarm,fvp-basearm,vexpress"1chosenaliases/=/smb/motherboard/iofpga@3,00000000/uart@090000/E/smb/motherboard/iofpga@3,00000000/uart@0a0000/M/smb/motherboard/iofpga@3,00000000/uart@0b0000/U/smb/motherboard/iofpga@3,00000000/uart@0c0000psci arm,psci]smcdÄp„xÄ„Œ„ cpus"1cpu-mapcluster0core0–core1–core2–core3–idle-states šarm,pscicpu-sleep-0arm,idle-state§º(ËdÛ–ìòcluster-sleep-0arm,idle-state§ºôËèÛ Äìòcpu@0úcpu arm,armv8 psciìòcpu@1úcpu arm,armv8 psciìòcpu@2úcpu arm,armv8 psciìòcpu@3úcpu arm,armv8 psciìòmemory@80000000úmemory €€€interrupt-controller@2c001000%arm,cortex-a15-gicarm,cortex-a9-gic("9@,, ,@ ,`  N ìòtimerarm,armv8-timer0N ÿÿ ÿ ÿYõátimer@2a810000arm,armv7-timer-mem*Yõá"1iframe@2a830000p N*ƒpmuarm,armv8-pmuv30N<=>?smb simple-bus"1xi ( }?´            !!""##$$%%&&''(())**motherboardžrs1arm,vexpress,v2m-p1simple-bus"1(iethernet@2,02000000smsc,lan91c111 Nclk24mhz fixed-clock±Yn6 ¾v2m:clk24mhzì ò refclk1mhz fixed-clock±YB@¾v2m:refclk1mhzì ò refclk32khz fixed-clock±Y€¾v2m:refclk32khzìòiofpga@3,00000000arm,amba-bussimple-bus"1i sysreg@010000arm,vexpress-sysregÑáì ò sysctl@020000arm,sp810arm,primecell í ôrefclktimclkapb_pclk±0¾timerclken0timerclken1timerclken2timerclken3ì ò uart@090000arm,pl011arm,primecell Ní ôuartclkapb_pclkuart@0a0000arm,pl011arm,primecell Ní ôuartclkapb_pclkuart@0b0000arm,pl011arm,primecell Ní ôuartclkapb_pclkuart@0c0000arm,pl011arm,primecell Ní ôuartclkapb_pclkwdt@0f0000arm,sp805arm,primecellNí ôwdogclkapb_pclktimer@110000arm,sp804arm,primecellNí  ôtimclken1timclken2apb_pclktimer@120000arm,sp804arm,primecellNí   ôtimclken1timclken2apb_pclkrtc@170000arm,pl031arm,primecellNí  ôapb_pclkvirtio_block@0130000 virtio,mmioN*fixedregulator@0regulator-fixed3V32Z '2Z ?mcc#arm,vexpress,config-bussimple-busS muxfpga@0arm,vexpress-muxfpgandvimode@0arm,vexpress-dvimoden  modelcompatibleinterrupt-parent#address-cells#size-cellsserial0serial1serial2serial3methodcpu_suspendcpu_offcpu_onsys_poweroffsys_resetcpuentry-methodentry-method-paramentry-latency-usexit-latency-usmin-residency-uslinux,phandledevice_typeregenable-methodcpu-idle-states#interrupt-cellsinterrupt-controllerinterruptsclock-frequencyrangesframe-numberinterrupt-map-maskinterrupt-maparm,v2m-memory-map#clock-cellsclock-output-namesgpio-controller#gpio-cellsclocksclock-namesregulator-nameregulator-min-microvoltregulator-max-microvoltregulator-always-onarm,vexpress,config-bridgearm,vexpress-sysreg,funcarm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-gicv2legacy-psci.dts000066400000000000000000000140201322600646200257450ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /dts-v1/; /memreserve/ 0x80000000 0x00010000; / { }; / { model = "FVP Foundation"; compatible = "arm,fvp-base", "arm,vexpress"; interrupt-parent = <&gic>; #address-cells = <2>; #size-cells = <2>; chosen { }; aliases { serial0 = &v2m_serial0; serial1 = &v2m_serial1; serial2 = &v2m_serial2; serial3 = &v2m_serial3; }; psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; cpu_on = <0xc4000003>; sys_poweroff = <0x84000008>; sys_reset = <0x84000009>; }; cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; }; idle-states { entry-method = "arm,psci"; CPU_SLEEP_0: cpu-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x0010000>; entry-latency-us = <40>; exit-latency-us = <100>; min-residency-us = <150>; }; CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x1010000>; entry-latency-us = <500>; exit-latency-us = <1000>; min-residency-us = <2500>; }; }; CPU0:cpu@0 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x0>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU1:cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x1>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU2:cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x2>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU3:cpu@3 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x3>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x00000000 0x80000000 0 0x7F000000>, <0x00000008 0x80000000 0 0x80000000>; }; gic: interrupt-controller@2c001000 { compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; #interrupt-cells = <3>; #address-cells = <0>; interrupt-controller; reg = <0x0 0x2c001000 0 0x1000>, <0x0 0x2c002000 0 0x1000>, <0x0 0x2c004000 0 0x2000>, <0x0 0x2c006000 0 0x2000>; interrupts = <1 9 0xf04>; }; timer { compatible = "arm,armv8-timer"; interrupts = <1 13 0xff01>, <1 14 0xff01>, <1 11 0xff01>, <1 10 0xff01>; clock-frequency = <100000000>; }; timer@2a810000 { compatible = "arm,armv7-timer-mem"; reg = <0x0 0x2a810000 0x0 0x10000>; clock-frequency = <100000000>; #address-cells = <2>; #size-cells = <2>; ranges; frame@2a830000 { frame-number = <1>; interrupts = <0 26 4>; reg = <0x0 0x2a830000 0x0 0x10000>; }; }; pmu { compatible = "arm,armv8-pmuv3"; interrupts = <0 60 4>, <0 61 4>, <0 62 4>, <0 63 4>; }; smb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0 0 0 0x08000000 0x04000000>, <1 0 0 0x14000000 0x04000000>, <2 0 0 0x18000000 0x04000000>, <3 0 0 0x1c000000 0x04000000>, <4 0 0 0x0c000000 0x04000000>, <5 0 0 0x10000000 0x04000000>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 63>; interrupt-map = <0 0 0 &gic 0 0 4>, <0 0 1 &gic 0 1 4>, <0 0 2 &gic 0 2 4>, <0 0 3 &gic 0 3 4>, <0 0 4 &gic 0 4 4>, <0 0 5 &gic 0 5 4>, <0 0 6 &gic 0 6 4>, <0 0 7 &gic 0 7 4>, <0 0 8 &gic 0 8 4>, <0 0 9 &gic 0 9 4>, <0 0 10 &gic 0 10 4>, <0 0 11 &gic 0 11 4>, <0 0 12 &gic 0 12 4>, <0 0 13 &gic 0 13 4>, <0 0 14 &gic 0 14 4>, <0 0 15 &gic 0 15 4>, <0 0 16 &gic 0 16 4>, <0 0 17 &gic 0 17 4>, <0 0 18 &gic 0 18 4>, <0 0 19 &gic 0 19 4>, <0 0 20 &gic 0 20 4>, <0 0 21 &gic 0 21 4>, <0 0 22 &gic 0 22 4>, <0 0 23 &gic 0 23 4>, <0 0 24 &gic 0 24 4>, <0 0 25 &gic 0 25 4>, <0 0 26 &gic 0 26 4>, <0 0 27 &gic 0 27 4>, <0 0 28 &gic 0 28 4>, <0 0 29 &gic 0 29 4>, <0 0 30 &gic 0 30 4>, <0 0 31 &gic 0 31 4>, <0 0 32 &gic 0 32 4>, <0 0 33 &gic 0 33 4>, <0 0 34 &gic 0 34 4>, <0 0 35 &gic 0 35 4>, <0 0 36 &gic 0 36 4>, <0 0 37 &gic 0 37 4>, <0 0 38 &gic 0 38 4>, <0 0 39 &gic 0 39 4>, <0 0 40 &gic 0 40 4>, <0 0 41 &gic 0 41 4>, <0 0 42 &gic 0 42 4>; /include/ "fvp-foundation-motherboard.dtsi" }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-gicv3-psci.dtb000066400000000000000000000176171322600646200245570ustar00rootroot00000000000000Ð þíH(È€FVP Foundationarm,fvp-basearm,vexpress"1chosenaliases/=/smb/motherboard/iofpga@3,00000000/uart@090000/E/smb/motherboard/iofpga@3,00000000/uart@0a0000/M/smb/motherboard/iofpga@3,00000000/uart@0b0000/U/smb/motherboard/iofpga@3,00000000/uart@0c0000psci arm,psci]smcdÄp„xÄcpus"1cpu-mapcluster0core0core1core2core3idle-states ƒarm,pscicpu-sleep-0arm,idle-state£(´dÄ–ÕÛcluster-sleep-0arm,idle-state£ô´èÄ ÄÕÛcpu@0ãcpu arm,armv8ïópsciÕÛcpu@1ãcpu arm,armv8ïópsciÕÛcpu@2ãcpu arm,armv8ïópsciÕÛcpu@3ãcpu arm,armv8ïópsciÕÛmemory@80000000ãmemory €interrupt-controller@2f000000 arm,gic-v3"1")Pï// , , ,ð  > ÕÛits@2f020000arm,gic-v3-itsIï/timerarm,armv8-timer0> ÿÿ ÿ ÿXõátimer@2a810000arm,armv7-timer-memï*Xõá"1"frame@2a830000h >ï*ƒpmuarm,armv8-pmuv30><=>?smb simple-bus"1x"  u? ˆ            !!""##$$%%&&''(())**motherboard–rs1arm,vexpress,v2m-p1simple-bus"1"ethernet@2,02000000smsc,lan91c111 ï>clk24mhz fixed-clock©Xn6 ¶v2m:clk24mhzÕ Û refclk1mhz fixed-clock©XB@¶v2m:refclk1mhzÕ Û refclk32khz fixed-clock©X€¶v2m:refclk32khzÕÛiofpga@3,00000000arm,amba-bussimple-bus"1" sysreg@010000arm,vexpress-sysregïÉÙÕ Û sysctl@020000arm,sp810arm,primecellï å ìrefclktimclkapb_pclk©0¶timerclken0timerclken1timerclken2timerclken3Õ Û uart@090000arm,pl011arm,primecellï >å ìuartclkapb_pclkuart@0a0000arm,pl011arm,primecellï >å ìuartclkapb_pclkuart@0b0000arm,pl011arm,primecellï >å ìuartclkapb_pclkuart@0c0000arm,pl011arm,primecellï >å ìuartclkapb_pclkwdt@0f0000arm,sp805arm,primecellï>å ìwdogclkapb_pclktimer@110000arm,sp804arm,primecellï>å  ìtimclken1timclken2apb_pclktimer@120000arm,sp804arm,primecellï>å   ìtimclken1timclken2apb_pclkrtc@170000arm,pl031arm,primecellï>å  ìapb_pclkvirtio_block@0130000 virtio,mmioï>*fixedregulator@0regulator-fixedø3V32Z 2Z 7mcc#arm,vexpress,config-bussimple-busK reset@0arm,vexpress-resetfmuxfpga@0arm,vexpress-muxfpgafshutdown@0arm,vexpress-shutdownfreboot@0arm,vexpress-rebootf dvimode@0arm,vexpress-dvimodef  modelcompatibleinterrupt-parent#address-cells#size-cellsserial0serial1serial2serial3methodcpu_suspendcpu_offcpu_oncpuentry-methodentry-method-paramentry-latency-usexit-latency-usmin-residency-uslinux,phandledevice_typeregenable-methodcpu-idle-states#interrupt-cellsrangesinterrupt-controllerinterruptsmsi-controllerclock-frequencyframe-numberinterrupt-map-maskinterrupt-maparm,v2m-memory-map#clock-cellsclock-output-namesgpio-controller#gpio-cellsclocksclock-namesregulator-nameregulator-min-microvoltregulator-max-microvoltregulator-always-onarm,vexpress,config-bridgearm,vexpress-sysreg,funcarm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-gicv3-psci.dts000066400000000000000000000145211322600646200245670ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /dts-v1/; /memreserve/ 0x80000000 0x00010000; / { }; / { model = "FVP Foundation"; compatible = "arm,fvp-base", "arm,vexpress"; interrupt-parent = <&gic>; #address-cells = <2>; #size-cells = <2>; chosen { }; aliases { serial0 = &v2m_serial0; serial1 = &v2m_serial1; serial2 = &v2m_serial2; serial3 = &v2m_serial3; }; psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; cpu_on = <0xc4000003>; }; cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; }; idle-states { entry-method = "arm,psci"; CPU_SLEEP_0: cpu-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x0010000>; entry-latency-us = <40>; exit-latency-us = <100>; min-residency-us = <150>; }; CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "arm,idle-state"; entry-method-param = <0x1010000>; entry-latency-us = <500>; exit-latency-us = <1000>; min-residency-us = <2500>; }; }; CPU0:cpu@0 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x0>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU1:cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x1>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU2:cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x2>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; CPU3:cpu@3 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x0 0x3>; enable-method = "psci"; cpu-idle-states = <&CPU_SLEEP_0 &CLUSTER_SLEEP_0>; }; }; memory@80000000 { device_type = "memory"; reg = <0x00000000 0x80000000 0 0x7F000000>, <0x00000008 0x80000000 0 0x80000000>; }; gic: interrupt-controller@2f000000 { compatible = "arm,gic-v3"; #interrupt-cells = <3>; #address-cells = <2>; #size-cells = <2>; ranges; interrupt-controller; reg = <0x0 0x2f000000 0 0x10000>, // GICD <0x0 0x2f100000 0 0x200000>, // GICR <0x0 0x2c000000 0 0x2000>, // GICC <0x0 0x2c010000 0 0x2000>, // GICH <0x0 0x2c02f000 0 0x2000>; // GICV interrupts = <1 9 4>; its: its@2f020000 { compatible = "arm,gic-v3-its"; msi-controller; reg = <0x0 0x2f020000 0x0 0x20000>; // GITS }; }; timer { compatible = "arm,armv8-timer"; interrupts = <1 13 0xff01>, <1 14 0xff01>, <1 11 0xff01>, <1 10 0xff01>; clock-frequency = <100000000>; }; timer@2a810000 { compatible = "arm,armv7-timer-mem"; reg = <0x0 0x2a810000 0x0 0x10000>; clock-frequency = <100000000>; #address-cells = <2>; #size-cells = <2>; ranges; frame@2a830000 { frame-number = <1>; interrupts = <0 26 4>; reg = <0x0 0x2a830000 0x0 0x10000>; }; }; pmu { compatible = "arm,armv8-pmuv3"; interrupts = <0 60 4>, <0 61 4>, <0 62 4>, <0 63 4>; }; smb { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <1>; ranges = <0 0 0 0x08000000 0x04000000>, <1 0 0 0x14000000 0x04000000>, <2 0 0 0x18000000 0x04000000>, <3 0 0 0x1c000000 0x04000000>, <4 0 0 0x0c000000 0x04000000>, <5 0 0 0x10000000 0x04000000>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 63>; interrupt-map = <0 0 0 &gic 0 0 0 0 4>, <0 0 1 &gic 0 0 0 1 4>, <0 0 2 &gic 0 0 0 2 4>, <0 0 3 &gic 0 0 0 3 4>, <0 0 4 &gic 0 0 0 4 4>, <0 0 5 &gic 0 0 0 5 4>, <0 0 6 &gic 0 0 0 6 4>, <0 0 7 &gic 0 0 0 7 4>, <0 0 8 &gic 0 0 0 8 4>, <0 0 9 &gic 0 0 0 9 4>, <0 0 10 &gic 0 0 0 10 4>, <0 0 11 &gic 0 0 0 11 4>, <0 0 12 &gic 0 0 0 12 4>, <0 0 13 &gic 0 0 0 13 4>, <0 0 14 &gic 0 0 0 14 4>, <0 0 15 &gic 0 0 0 15 4>, <0 0 16 &gic 0 0 0 16 4>, <0 0 17 &gic 0 0 0 17 4>, <0 0 18 &gic 0 0 0 18 4>, <0 0 19 &gic 0 0 0 19 4>, <0 0 20 &gic 0 0 0 20 4>, <0 0 21 &gic 0 0 0 21 4>, <0 0 22 &gic 0 0 0 22 4>, <0 0 23 &gic 0 0 0 23 4>, <0 0 24 &gic 0 0 0 24 4>, <0 0 25 &gic 0 0 0 25 4>, <0 0 26 &gic 0 0 0 26 4>, <0 0 27 &gic 0 0 0 27 4>, <0 0 28 &gic 0 0 0 28 4>, <0 0 29 &gic 0 0 0 29 4>, <0 0 30 &gic 0 0 0 30 4>, <0 0 31 &gic 0 0 0 31 4>, <0 0 32 &gic 0 0 0 32 4>, <0 0 33 &gic 0 0 0 33 4>, <0 0 34 &gic 0 0 0 34 4>, <0 0 35 &gic 0 0 0 35 4>, <0 0 36 &gic 0 0 0 36 4>, <0 0 37 &gic 0 0 0 37 4>, <0 0 38 &gic 0 0 0 38 4>, <0 0 39 &gic 0 0 0 39 4>, <0 0 40 &gic 0 0 0 40 4>, <0 0 41 &gic 0 0 0 41 4>, <0 0 42 &gic 0 0 0 42 4>; /include/ "fvp-foundation-motherboard-no_psci.dtsi" }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-motherboard-no_psci.dtsi000066400000000000000000000132331322600646200267260ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ motherboard { arm,v2m-memory-map = "rs1"; compatible = "arm,vexpress,v2m-p1", "simple-bus"; #address-cells = <2>; /* SMB chipselect number and offset */ #size-cells = <1>; #interrupt-cells = <1>; ranges; ethernet@2,02000000 { compatible = "smsc,lan91c111"; reg = <2 0x02000000 0x10000>; interrupts = <15>; }; v2m_clk24mhz: clk24mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <24000000>; clock-output-names = "v2m:clk24mhz"; }; v2m_refclk1mhz: refclk1mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <1000000>; clock-output-names = "v2m:refclk1mhz"; }; v2m_refclk32khz: refclk32khz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <32768>; clock-output-names = "v2m:refclk32khz"; }; iofpga@3,00000000 { compatible = "arm,amba-bus", "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges = <0 3 0 0x200000>; v2m_sysreg: sysreg@010000 { compatible = "arm,vexpress-sysreg"; reg = <0x010000 0x1000>; gpio-controller; #gpio-cells = <2>; }; v2m_sysctl: sysctl@020000 { compatible = "arm,sp810", "arm,primecell"; reg = <0x020000 0x1000>; clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&v2m_clk24mhz>; clock-names = "refclk", "timclk", "apb_pclk"; #clock-cells = <1>; clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; }; v2m_serial0: uart@090000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x090000 0x1000>; interrupts = <5>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial1: uart@0a0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0a0000 0x1000>; interrupts = <6>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial2: uart@0b0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0b0000 0x1000>; interrupts = <7>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial3: uart@0c0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0c0000 0x1000>; interrupts = <8>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; wdt@0f0000 { compatible = "arm,sp805", "arm,primecell"; reg = <0x0f0000 0x1000>; interrupts = <0>; clocks = <&v2m_refclk32khz>, <&v2m_clk24mhz>; clock-names = "wdogclk", "apb_pclk"; }; v2m_timer01: timer@110000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x110000 0x1000>; interrupts = <2>; clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; v2m_timer23: timer@120000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x120000 0x1000>; interrupts = <3>; clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; rtc@170000 { compatible = "arm,pl031", "arm,primecell"; reg = <0x170000 0x1000>; interrupts = <4>; clocks = <&v2m_clk24mhz>; clock-names = "apb_pclk"; }; virtio_block@0130000 { compatible = "virtio,mmio"; reg = <0x130000 0x1000>; interrupts = <0x2a>; }; }; v2m_fixed_3v3: fixedregulator@0 { compatible = "regulator-fixed"; regulator-name = "3V3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; mcc { compatible = "arm,vexpress,config-bus", "simple-bus"; arm,vexpress,config-bridge = <&v2m_sysreg>; reset@0 { compatible = "arm,vexpress-reset"; arm,vexpress-sysreg,func = <5 0>; }; muxfpga@0 { compatible = "arm,vexpress-muxfpga"; arm,vexpress-sysreg,func = <7 0>; }; shutdown@0 { compatible = "arm,vexpress-shutdown"; arm,vexpress-sysreg,func = <8 0>; }; reboot@0 { compatible = "arm,vexpress-reboot"; arm,vexpress-sysreg,func = <9 0>; }; dvimode@0 { compatible = "arm,vexpress-dvimode"; arm,vexpress-sysreg,func = <11 0>; }; }; }; arm-trusted-firmware-1.0-aw-6/fdts/fvp-foundation-motherboard.dtsi000066400000000000000000000135711322600646200253030ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ motherboard { arm,v2m-memory-map = "rs1"; compatible = "arm,vexpress,v2m-p1", "simple-bus"; #address-cells = <2>; /* SMB chipselect number and offset */ #size-cells = <1>; #interrupt-cells = <1>; ranges; ethernet@2,02000000 { compatible = "smsc,lan91c111"; reg = <2 0x02000000 0x10000>; interrupts = <15>; }; v2m_clk24mhz: clk24mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <24000000>; clock-output-names = "v2m:clk24mhz"; }; v2m_refclk1mhz: refclk1mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <1000000>; clock-output-names = "v2m:refclk1mhz"; }; v2m_refclk32khz: refclk32khz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <32768>; clock-output-names = "v2m:refclk32khz"; }; iofpga@3,00000000 { compatible = "arm,amba-bus", "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges = <0 3 0 0x200000>; v2m_sysreg: sysreg@010000 { compatible = "arm,vexpress-sysreg"; reg = <0x010000 0x1000>; gpio-controller; #gpio-cells = <2>; }; v2m_sysctl: sysctl@020000 { compatible = "arm,sp810", "arm,primecell"; reg = <0x020000 0x1000>; clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&v2m_clk24mhz>; clock-names = "refclk", "timclk", "apb_pclk"; #clock-cells = <1>; clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; }; v2m_serial0: uart@090000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x090000 0x1000>; interrupts = <5>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial1: uart@0a0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0a0000 0x1000>; interrupts = <6>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial2: uart@0b0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0b0000 0x1000>; interrupts = <7>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial3: uart@0c0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0c0000 0x1000>; interrupts = <8>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; wdt@0f0000 { compatible = "arm,sp805", "arm,primecell"; reg = <0x0f0000 0x1000>; interrupts = <0>; clocks = <&v2m_refclk32khz>, <&v2m_clk24mhz>; clock-names = "wdogclk", "apb_pclk"; }; v2m_timer01: timer@110000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x110000 0x1000>; interrupts = <2>; clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; v2m_timer23: timer@120000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x120000 0x1000>; interrupts = <3>; clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; rtc@170000 { compatible = "arm,pl031", "arm,primecell"; reg = <0x170000 0x1000>; interrupts = <4>; clocks = <&v2m_clk24mhz>; clock-names = "apb_pclk"; }; virtio_block@0130000 { compatible = "virtio,mmio"; reg = <0x130000 0x1000>; interrupts = <0x2a>; }; }; v2m_fixed_3v3: fixedregulator@0 { compatible = "regulator-fixed"; regulator-name = "3V3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; mcc { compatible = "arm,vexpress,config-bus", "simple-bus"; arm,vexpress,config-bridge = <&v2m_sysreg>; /* * Not supported in FVP models * * reset@0 { * compatible = "arm,vexpress-reset"; * arm,vexpress-sysreg,func = <5 0>; * }; */ muxfpga@0 { compatible = "arm,vexpress-muxfpga"; arm,vexpress-sysreg,func = <7 0>; }; /* * Not used - Superseded by PSCI sys_poweroff * * shutdown@0 { * compatible = "arm,vexpress-shutdown"; * arm,vexpress-sysreg,func = <8 0>; * }; */ /* * Not used - Superseded by PSCI sys_reset * * reboot@0 { * compatible = "arm,vexpress-reboot"; * arm,vexpress-sysreg,func = <9 0>; * }; */ dvimode@0 { compatible = "arm,vexpress-dvimode"; arm,vexpress-sysreg,func = <11 0>; }; }; }; arm-trusted-firmware-1.0-aw-6/fdts/rtsm_ve-motherboard-no_psci.dtsi000066400000000000000000000165451322600646200254570ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ motherboard { arm,v2m-memory-map = "rs1"; compatible = "arm,vexpress,v2m-p1", "simple-bus"; #address-cells = <2>; /* SMB chipselect number and offset */ #size-cells = <1>; #interrupt-cells = <1>; ranges; flash@0,00000000 { compatible = "arm,vexpress-flash", "cfi-flash"; reg = <0 0x00000000 0x04000000>, <4 0x00000000 0x04000000>; bank-width = <4>; }; vram@2,00000000 { compatible = "arm,vexpress-vram"; reg = <2 0x00000000 0x00800000>; }; ethernet@2,02000000 { compatible = "smsc,lan91c111"; reg = <2 0x02000000 0x10000>; interrupts = <15>; }; v2m_clk24mhz: clk24mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <24000000>; clock-output-names = "v2m:clk24mhz"; }; v2m_refclk1mhz: refclk1mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <1000000>; clock-output-names = "v2m:refclk1mhz"; }; v2m_refclk32khz: refclk32khz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <32768>; clock-output-names = "v2m:refclk32khz"; }; iofpga@3,00000000 { compatible = "arm,amba-bus", "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges = <0 3 0 0x200000>; v2m_sysreg: sysreg@010000 { compatible = "arm,vexpress-sysreg"; reg = <0x010000 0x1000>; gpio-controller; #gpio-cells = <2>; }; v2m_sysctl: sysctl@020000 { compatible = "arm,sp810", "arm,primecell"; reg = <0x020000 0x1000>; clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&v2m_clk24mhz>; clock-names = "refclk", "timclk", "apb_pclk"; #clock-cells = <1>; clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; }; aaci@040000 { compatible = "arm,pl041", "arm,primecell"; reg = <0x040000 0x1000>; interrupts = <11>; clocks = <&v2m_clk24mhz>; clock-names = "apb_pclk"; }; mmci@050000 { compatible = "arm,pl180", "arm,primecell"; reg = <0x050000 0x1000>; interrupts = <9 10>; cd-gpios = <&v2m_sysreg 0 0>; wp-gpios = <&v2m_sysreg 1 0>; max-frequency = <12000000>; vmmc-supply = <&v2m_fixed_3v3>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "mclk", "apb_pclk"; }; kmi@060000 { compatible = "arm,pl050", "arm,primecell"; reg = <0x060000 0x1000>; interrupts = <12>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "KMIREFCLK", "apb_pclk"; }; kmi@070000 { compatible = "arm,pl050", "arm,primecell"; reg = <0x070000 0x1000>; interrupts = <13>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "KMIREFCLK", "apb_pclk"; }; v2m_serial0: uart@090000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x090000 0x1000>; interrupts = <5>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial1: uart@0a0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0a0000 0x1000>; interrupts = <6>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial2: uart@0b0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0b0000 0x1000>; interrupts = <7>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial3: uart@0c0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0c0000 0x1000>; interrupts = <8>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; wdt@0f0000 { compatible = "arm,sp805", "arm,primecell"; reg = <0x0f0000 0x1000>; interrupts = <0>; clocks = <&v2m_refclk32khz>, <&v2m_clk24mhz>; clock-names = "wdogclk", "apb_pclk"; }; v2m_timer01: timer@110000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x110000 0x1000>; interrupts = <2>; clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; v2m_timer23: timer@120000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x120000 0x1000>; interrupts = <3>; clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; rtc@170000 { compatible = "arm,pl031", "arm,primecell"; reg = <0x170000 0x1000>; interrupts = <4>; clocks = <&v2m_clk24mhz>; clock-names = "apb_pclk"; }; clcd@1f0000 { compatible = "arm,pl111", "arm,primecell"; reg = <0x1f0000 0x1000>; interrupts = <14>; clocks = <&v2m_oscclk1>, <&v2m_clk24mhz>; clock-names = "clcdclk", "apb_pclk"; mode = "XVGA"; use_dma = <0>; framebuffer = <0x18000000 0x00180000>; }; virtio_block@0130000 { compatible = "virtio,mmio"; reg = <0x130000 0x1000>; interrupts = <0x2a>; }; }; v2m_fixed_3v3: fixedregulator@0 { compatible = "regulator-fixed"; regulator-name = "3V3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; mcc { compatible = "arm,vexpress,config-bus", "simple-bus"; arm,vexpress,config-bridge = <&v2m_sysreg>; v2m_oscclk1: osc@1 { /* CLCD clock */ compatible = "arm,vexpress-osc"; arm,vexpress-sysreg,func = <1 1>; freq-range = <23750000 63500000>; #clock-cells = <0>; clock-output-names = "v2m:oscclk1"; }; reset@0 { compatible = "arm,vexpress-reset"; arm,vexpress-sysreg,func = <5 0>; }; muxfpga@0 { compatible = "arm,vexpress-muxfpga"; arm,vexpress-sysreg,func = <7 0>; }; shutdown@0 { compatible = "arm,vexpress-shutdown"; arm,vexpress-sysreg,func = <8 0>; }; reboot@0 { compatible = "arm,vexpress-reboot"; arm,vexpress-sysreg,func = <9 0>; }; dvimode@0 { compatible = "arm,vexpress-dvimode"; arm,vexpress-sysreg,func = <11 0>; }; }; }; arm-trusted-firmware-1.0-aw-6/fdts/rtsm_ve-motherboard.dtsi000066400000000000000000000171031322600646200240160ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ motherboard { arm,v2m-memory-map = "rs1"; compatible = "arm,vexpress,v2m-p1", "simple-bus"; #address-cells = <2>; /* SMB chipselect number and offset */ #size-cells = <1>; #interrupt-cells = <1>; ranges; flash@0,00000000 { compatible = "arm,vexpress-flash", "cfi-flash"; reg = <0 0x00000000 0x04000000>, <4 0x00000000 0x04000000>; bank-width = <4>; }; vram@2,00000000 { compatible = "arm,vexpress-vram"; reg = <2 0x00000000 0x00800000>; }; ethernet@2,02000000 { compatible = "smsc,lan91c111"; reg = <2 0x02000000 0x10000>; interrupts = <15>; }; v2m_clk24mhz: clk24mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <24000000>; clock-output-names = "v2m:clk24mhz"; }; v2m_refclk1mhz: refclk1mhz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <1000000>; clock-output-names = "v2m:refclk1mhz"; }; v2m_refclk32khz: refclk32khz { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <32768>; clock-output-names = "v2m:refclk32khz"; }; iofpga@3,00000000 { compatible = "arm,amba-bus", "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges = <0 3 0 0x200000>; v2m_sysreg: sysreg@010000 { compatible = "arm,vexpress-sysreg"; reg = <0x010000 0x1000>; gpio-controller; #gpio-cells = <2>; }; v2m_sysctl: sysctl@020000 { compatible = "arm,sp810", "arm,primecell"; reg = <0x020000 0x1000>; clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&v2m_clk24mhz>; clock-names = "refclk", "timclk", "apb_pclk"; #clock-cells = <1>; clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; }; aaci@040000 { compatible = "arm,pl041", "arm,primecell"; reg = <0x040000 0x1000>; interrupts = <11>; clocks = <&v2m_clk24mhz>; clock-names = "apb_pclk"; }; mmci@050000 { compatible = "arm,pl180", "arm,primecell"; reg = <0x050000 0x1000>; interrupts = <9 10>; cd-gpios = <&v2m_sysreg 0 0>; wp-gpios = <&v2m_sysreg 1 0>; max-frequency = <12000000>; vmmc-supply = <&v2m_fixed_3v3>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "mclk", "apb_pclk"; }; kmi@060000 { compatible = "arm,pl050", "arm,primecell"; reg = <0x060000 0x1000>; interrupts = <12>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "KMIREFCLK", "apb_pclk"; }; kmi@070000 { compatible = "arm,pl050", "arm,primecell"; reg = <0x070000 0x1000>; interrupts = <13>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "KMIREFCLK", "apb_pclk"; }; v2m_serial0: uart@090000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x090000 0x1000>; interrupts = <5>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial1: uart@0a0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0a0000 0x1000>; interrupts = <6>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial2: uart@0b0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0b0000 0x1000>; interrupts = <7>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; v2m_serial3: uart@0c0000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x0c0000 0x1000>; interrupts = <8>; clocks = <&v2m_clk24mhz>, <&v2m_clk24mhz>; clock-names = "uartclk", "apb_pclk"; }; wdt@0f0000 { compatible = "arm,sp805", "arm,primecell"; reg = <0x0f0000 0x1000>; interrupts = <0>; clocks = <&v2m_refclk32khz>, <&v2m_clk24mhz>; clock-names = "wdogclk", "apb_pclk"; }; v2m_timer01: timer@110000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x110000 0x1000>; interrupts = <2>; clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; v2m_timer23: timer@120000 { compatible = "arm,sp804", "arm,primecell"; reg = <0x120000 0x1000>; interrupts = <3>; clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&v2m_clk24mhz>; clock-names = "timclken1", "timclken2", "apb_pclk"; }; rtc@170000 { compatible = "arm,pl031", "arm,primecell"; reg = <0x170000 0x1000>; interrupts = <4>; clocks = <&v2m_clk24mhz>; clock-names = "apb_pclk"; }; clcd@1f0000 { compatible = "arm,pl111", "arm,primecell"; reg = <0x1f0000 0x1000>; interrupts = <14>; clocks = <&v2m_oscclk1>, <&v2m_clk24mhz>; clock-names = "clcdclk", "apb_pclk"; mode = "XVGA"; use_dma = <0>; framebuffer = <0x18000000 0x00180000>; }; virtio_block@0130000 { compatible = "virtio,mmio"; reg = <0x130000 0x1000>; interrupts = <0x2a>; }; }; v2m_fixed_3v3: fixedregulator@0 { compatible = "regulator-fixed"; regulator-name = "3V3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; mcc { compatible = "arm,vexpress,config-bus", "simple-bus"; arm,vexpress,config-bridge = <&v2m_sysreg>; v2m_oscclk1: osc@1 { /* CLCD clock */ compatible = "arm,vexpress-osc"; arm,vexpress-sysreg,func = <1 1>; freq-range = <23750000 63500000>; #clock-cells = <0>; clock-output-names = "v2m:oscclk1"; }; /* * Not supported in FVP models * * reset@0 { * compatible = "arm,vexpress-reset"; * arm,vexpress-sysreg,func = <5 0>; * }; */ muxfpga@0 { compatible = "arm,vexpress-muxfpga"; arm,vexpress-sysreg,func = <7 0>; }; /* * Not used - Superseded by PSCI sys_poweroff * * shutdown@0 { * compatible = "arm,vexpress-shutdown"; * arm,vexpress-sysreg,func = <8 0>; * }; */ /* * Not used - Superseded by PSCI sys_reset * * reboot@0 { * compatible = "arm,vexpress-reboot"; * arm,vexpress-sysreg,func = <9 0>; * }; */ dvimode@0 { compatible = "arm,vexpress-dvimode"; arm,vexpress-sysreg,func = <11 0>; }; }; }; arm-trusted-firmware-1.0-aw-6/include/000077500000000000000000000000001322600646200176275ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/bl31/000077500000000000000000000000001322600646200203705ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/bl31/bl31.h000066400000000000000000000040561322600646200213070ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BL31_H__ #define __BL31_H__ #include /******************************************************************************* * Function prototypes ******************************************************************************/ void bl31_arch_setup(void); void bl31_next_el_arch_setup(uint32_t security_state); void bl31_set_next_image_type(uint32_t type); uint32_t bl31_get_next_image_type(void); void bl31_prepare_next_image_entry(void); void bl31_register_bl32_init(int32_t (*)(void)); #endif /* __BL31_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/context.h000066400000000000000000000274101322600646200222310ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CONTEXT_H__ #define __CONTEXT_H__ /******************************************************************************* * Constants that allow assembler code to access members of and the 'gp_regs' * structure at their correct offsets. ******************************************************************************/ #define CTX_GPREGS_OFFSET 0x0 #define CTX_GPREG_X0 0x0 #define CTX_GPREG_X1 0x8 #define CTX_GPREG_X2 0x10 #define CTX_GPREG_X3 0x18 #define CTX_GPREG_X4 0x20 #define CTX_GPREG_X5 0x28 #define CTX_GPREG_X6 0x30 #define CTX_GPREG_X7 0x38 #define CTX_GPREG_X8 0x40 #define CTX_GPREG_X9 0x48 #define CTX_GPREG_X10 0x50 #define CTX_GPREG_X11 0x58 #define CTX_GPREG_X12 0x60 #define CTX_GPREG_X13 0x68 #define CTX_GPREG_X14 0x70 #define CTX_GPREG_X15 0x78 #define CTX_GPREG_X16 0x80 #define CTX_GPREG_X17 0x88 #define CTX_GPREG_X18 0x90 #define CTX_GPREG_X19 0x98 #define CTX_GPREG_X20 0xa0 #define CTX_GPREG_X21 0xa8 #define CTX_GPREG_X22 0xb0 #define CTX_GPREG_X23 0xb8 #define CTX_GPREG_X24 0xc0 #define CTX_GPREG_X25 0xc8 #define CTX_GPREG_X26 0xd0 #define CTX_GPREG_X27 0xd8 #define CTX_GPREG_X28 0xe0 #define CTX_GPREG_X29 0xe8 #define CTX_GPREG_LR 0xf0 #define CTX_GPREG_SP_EL0 0xf8 #define CTX_GPREGS_END 0x100 /******************************************************************************* * Constants that allow assembler code to access members of and the 'el3_state' * structure at their correct offsets. Note that some of the registers are only * 32-bits wide but are stored as 64-bit values for convenience ******************************************************************************/ #define CTX_EL3STATE_OFFSET (CTX_GPREGS_OFFSET + CTX_GPREGS_END) #define CTX_SCR_EL3 0x0 #define CTX_RUNTIME_SP 0x8 #define CTX_SPSR_EL3 0x10 #define CTX_ELR_EL3 0x18 #define CTX_EL3STATE_END 0x20 /******************************************************************************* * Constants that allow assembler code to access members of and the * 'el1_sys_regs' structure at their correct offsets. Note that some of the * registers are only 32-bits wide but are stored as 64-bit values for * convenience ******************************************************************************/ #define CTX_SYSREGS_OFFSET (CTX_EL3STATE_OFFSET + CTX_EL3STATE_END) #define CTX_SPSR_EL1 0x0 #define CTX_ELR_EL1 0x8 #define CTX_SPSR_ABT 0x10 #define CTX_SPSR_UND 0x18 #define CTX_SPSR_IRQ 0x20 #define CTX_SPSR_FIQ 0x28 #define CTX_SCTLR_EL1 0x30 #define CTX_ACTLR_EL1 0x38 #define CTX_CPACR_EL1 0x40 #define CTX_CSSELR_EL1 0x48 #define CTX_SP_EL1 0x50 #define CTX_ESR_EL1 0x58 #define CTX_TTBR0_EL1 0x60 #define CTX_TTBR1_EL1 0x68 #define CTX_MAIR_EL1 0x70 #define CTX_AMAIR_EL1 0x78 #define CTX_TCR_EL1 0x80 #define CTX_TPIDR_EL1 0x88 #define CTX_TPIDR_EL0 0x90 #define CTX_TPIDRRO_EL0 0x98 #define CTX_DACR32_EL2 0xa0 #define CTX_IFSR32_EL2 0xa8 #define CTX_PAR_EL1 0xb0 #define CTX_FAR_EL1 0xb8 #define CTX_AFSR0_EL1 0xc0 #define CTX_AFSR1_EL1 0xc8 #define CTX_CONTEXTIDR_EL1 0xd0 #define CTX_VBAR_EL1 0xd8 /* * If the timer registers aren't saved and restored, we don't have to reserve * space for them in the context */ #if NS_TIMER_SWITCH #define CTX_CNTP_CTL_EL0 0xe0 #define CTX_CNTP_CVAL_EL0 0xe8 #define CTX_CNTV_CTL_EL0 0xf0 #define CTX_CNTV_CVAL_EL0 0xf8 #define CTX_CNTKCTL_EL1 0x100 #define CTX_FP_FPEXC32_EL2 0x108 #define CTX_SYSREGS_END 0x110 #else #define CTX_FP_FPEXC32_EL2 0xe0 #define CTX_SYSREGS_END 0xf0 #endif /******************************************************************************* * Constants that allow assembler code to access members of and the 'fp_regs' * structure at their correct offsets. ******************************************************************************/ #if CTX_INCLUDE_FPREGS #define CTX_FPREGS_OFFSET (CTX_SYSREGS_OFFSET + CTX_SYSREGS_END) #define CTX_FP_Q0 0x0 #define CTX_FP_Q1 0x10 #define CTX_FP_Q2 0x20 #define CTX_FP_Q3 0x30 #define CTX_FP_Q4 0x40 #define CTX_FP_Q5 0x50 #define CTX_FP_Q6 0x60 #define CTX_FP_Q7 0x70 #define CTX_FP_Q8 0x80 #define CTX_FP_Q9 0x90 #define CTX_FP_Q10 0xa0 #define CTX_FP_Q11 0xb0 #define CTX_FP_Q12 0xc0 #define CTX_FP_Q13 0xd0 #define CTX_FP_Q14 0xe0 #define CTX_FP_Q15 0xf0 #define CTX_FP_Q16 0x100 #define CTX_FP_Q17 0x110 #define CTX_FP_Q18 0x120 #define CTX_FP_Q19 0x130 #define CTX_FP_Q20 0x140 #define CTX_FP_Q21 0x150 #define CTX_FP_Q22 0x160 #define CTX_FP_Q23 0x170 #define CTX_FP_Q24 0x180 #define CTX_FP_Q25 0x190 #define CTX_FP_Q26 0x1a0 #define CTX_FP_Q27 0x1b0 #define CTX_FP_Q28 0x1c0 #define CTX_FP_Q29 0x1d0 #define CTX_FP_Q30 0x1e0 #define CTX_FP_Q31 0x1f0 #define CTX_FP_FPSR 0x200 #define CTX_FP_FPCR 0x208 #define CTX_FPREGS_END 0x210 #endif #ifndef __ASSEMBLY__ #include #include /* for CACHE_WRITEBACK_GRANULE */ #include /* * Common constants to help define the 'cpu_context' structure and its * members below. */ #define DWORD_SHIFT 3 #define DEFINE_REG_STRUCT(name, num_regs) \ typedef struct name { \ uint64_t _regs[num_regs]; \ } __aligned(16) name##_t /* Constants to determine the size of individual context structures */ #define CTX_GPREG_ALL (CTX_GPREGS_END >> DWORD_SHIFT) #define CTX_SYSREG_ALL (CTX_SYSREGS_END >> DWORD_SHIFT) #if CTX_INCLUDE_FPREGS #define CTX_FPREG_ALL (CTX_FPREGS_END >> DWORD_SHIFT) #endif #define CTX_EL3STATE_ALL (CTX_EL3STATE_END >> DWORD_SHIFT) /* * AArch64 general purpose register context structure. Usually x0-x18, * lr are saved as the compiler is expected to preserve the remaining * callee saved registers if used by the C runtime and the assembler * does not touch the remaining. But in case of world switch during * exception handling, we need to save the callee registers too. */ DEFINE_REG_STRUCT(gp_regs, CTX_GPREG_ALL); /* * AArch64 EL1 system register context structure for preserving the * architectural state during switches from one security state to * another in EL1. */ DEFINE_REG_STRUCT(el1_sys_regs, CTX_SYSREG_ALL); /* * AArch64 floating point register context structure for preserving * the floating point state during switches from one security state to * another. */ #if CTX_INCLUDE_FPREGS DEFINE_REG_STRUCT(fp_regs, CTX_FPREG_ALL); #endif /* * Miscellaneous registers used by EL3 firmware to maintain its state * across exception entries and exits */ DEFINE_REG_STRUCT(el3_state, CTX_EL3STATE_ALL); /* * Macros to access members of any of the above structures using their * offsets */ #define read_ctx_reg(ctx, offset) ((ctx)->_regs[offset >> DWORD_SHIFT]) #define write_ctx_reg(ctx, offset, val) (((ctx)->_regs[offset >> DWORD_SHIFT]) \ = val) /* * Top-level context structure which is used by EL3 firmware to * preserve the state of a core at EL1 in one of the two security * states and save enough EL3 meta data to be able to return to that * EL and security state. The context management library will be used * to ensure that SP_EL3 always points to an instance of this * structure at exception entry and exit. Each instance will * correspond to either the secure or the non-secure state. */ typedef struct cpu_context { gp_regs_t gpregs_ctx; el3_state_t el3state_ctx; el1_sys_regs_t sysregs_ctx; #if CTX_INCLUDE_FPREGS fp_regs_t fpregs_ctx; #endif } cpu_context_t; /* Macros to access members of the 'cpu_context_t' structure */ #define get_el3state_ctx(h) (&((cpu_context_t *) h)->el3state_ctx) #if CTX_INCLUDE_FPREGS #define get_fpregs_ctx(h) (&((cpu_context_t *) h)->fpregs_ctx) #endif #define get_sysregs_ctx(h) (&((cpu_context_t *) h)->sysregs_ctx) #define get_gpregs_ctx(h) (&((cpu_context_t *) h)->gpregs_ctx) /* * Compile time assertions related to the 'cpu_context' structure to * ensure that the assembler and the compiler view of the offsets of * the structure members is the same. */ CASSERT(CTX_GPREGS_OFFSET == __builtin_offsetof(cpu_context_t, gpregs_ctx), \ assert_core_context_gp_offset_mismatch); CASSERT(CTX_SYSREGS_OFFSET == __builtin_offsetof(cpu_context_t, sysregs_ctx), \ assert_core_context_sys_offset_mismatch); #if CTX_INCLUDE_FPREGS CASSERT(CTX_FPREGS_OFFSET == __builtin_offsetof(cpu_context_t, fpregs_ctx), \ assert_core_context_fp_offset_mismatch); #endif CASSERT(CTX_EL3STATE_OFFSET == __builtin_offsetof(cpu_context_t, el3state_ctx), \ assert_core_context_el3state_offset_mismatch); /* * Helper macro to set the general purpose registers that correspond to * parameters in an aapcs_64 call i.e. x0-x7 */ #define set_aapcs_args0(ctx, x0) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X0, x0); \ } while (0); #define set_aapcs_args1(ctx, x0, x1) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X1, x1); \ set_aapcs_args0(ctx, x0); \ } while (0); #define set_aapcs_args2(ctx, x0, x1, x2) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X2, x2); \ set_aapcs_args1(ctx, x0, x1); \ } while (0); #define set_aapcs_args3(ctx, x0, x1, x2, x3) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X3, x3); \ set_aapcs_args2(ctx, x0, x1, x2); \ } while (0); #define set_aapcs_args4(ctx, x0, x1, x2, x3, x4) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X4, x4); \ set_aapcs_args3(ctx, x0, x1, x2, x3); \ } while (0); #define set_aapcs_args5(ctx, x0, x1, x2, x3, x4, x5) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X5, x5); \ set_aapcs_args4(ctx, x0, x1, x2, x3, x4); \ } while (0); #define set_aapcs_args6(ctx, x0, x1, x2, x3, x4, x5, x6) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X6, x6); \ set_aapcs_args5(ctx, x0, x1, x2, x3, x4, x5); \ } while (0); #define set_aapcs_args7(ctx, x0, x1, x2, x3, x4, x5, x6, x7) do { \ write_ctx_reg(get_gpregs_ctx(ctx), CTX_GPREG_X7, x7); \ set_aapcs_args6(ctx, x0, x1, x2, x3, x4, x5, x6); \ } while (0); /******************************************************************************* * Function prototypes ******************************************************************************/ void el1_sysregs_context_save(el1_sys_regs_t *regs); void el1_sysregs_context_restore(el1_sys_regs_t *regs); #if CTX_INCLUDE_FPREGS void fpregs_context_save(fp_regs_t *regs); void fpregs_context_restore(fp_regs_t *regs); #endif #undef CTX_SYSREG_ALL #if CTX_INCLUDE_FPREGS #undef CTX_FPREG_ALL #endif #undef CTX_GPREG_ALL #undef CTX_EL3STATE_ALL #endif /* __ASSEMBLY__ */ #endif /* __CONTEXT_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/context_mgmt.h000066400000000000000000000076531322600646200232640ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CM_H__ #define __CM_H__ #include #include /******************************************************************************* * Forward declarations ******************************************************************************/ struct entry_point_info; /******************************************************************************* * Function & variable prototypes ******************************************************************************/ void cm_init(void); void *cm_get_context_by_mpidr(uint64_t mpidr, uint32_t security_state); static inline void *cm_get_context(uint32_t security_state); void cm_set_context_by_mpidr(uint64_t mpidr, void *context, uint32_t security_state); static inline void cm_set_context(void *context, uint32_t security_state); void cm_init_context(uint64_t mpidr, const struct entry_point_info *ep); void cm_prepare_el3_exit(uint32_t security_state); void cm_el1_sysregs_context_save(uint32_t security_state); void cm_el1_sysregs_context_restore(uint32_t security_state); void cm_set_elr_el3(uint32_t security_state, uint64_t entrypoint); void cm_set_elr_spsr_el3(uint32_t security_state, uint64_t entrypoint, uint32_t spsr); void cm_write_scr_el3_bit(uint32_t security_state, uint32_t bit_pos, uint32_t value); void cm_set_next_eret_context(uint32_t security_state); uint32_t cm_get_scr_el3(uint32_t security_state); /* Inline definitions */ /******************************************************************************* * This function returns a pointer to the most recent 'cpu_context' structure * for the calling CPU that was set as the context for the specified security * state. NULL is returned if no such structure has been specified. ******************************************************************************/ void *cm_get_context(uint32_t security_state) { assert(security_state <= NON_SECURE); return get_cpu_data(cpu_context[security_state]); } /******************************************************************************* * This function sets the pointer to the current 'cpu_context' structure for the * specified security state for the calling CPU ******************************************************************************/ void cm_set_context(void *context, uint32_t security_state) { assert(security_state <= NON_SECURE); set_cpu_data(cpu_context[security_state], context); } #endif /* __CM_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/cpu_data.h000066400000000000000000000113151322600646200223220ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CPU_DATA_H__ #define __CPU_DATA_H__ /* Offsets for the cpu_data structure */ #define CPU_DATA_CRASH_BUF_OFFSET 0x20 #if CRASH_REPORTING #define CPU_DATA_LOG2SIZE 7 #else #define CPU_DATA_LOG2SIZE 6 #endif /* need enough space in crash buffer to save 8 registers */ #define CPU_DATA_CRASH_BUF_SIZE 64 #define CPU_DATA_CPU_OPS_PTR 0x10 #ifndef __ASSEMBLY__ #include #include #include #include /******************************************************************************* * Function & variable prototypes ******************************************************************************/ /******************************************************************************* * Cache of frequently used per-cpu data: * Pointers to non-secure and secure security state contexts * Address of the crash stack * It is aligned to the cache line boundary to allow efficient concurrent * manipulation of these pointers on different cpus * * TODO: Add other commonly used variables to this (tf_issues#90) * * The data structure and the _cpu_data accessors should not be used directly * by components that have per-cpu members. The member access macros should be * used for this. ******************************************************************************/ typedef struct cpu_data { void *cpu_context[2]; uint64_t cpu_ops_ptr; struct psci_cpu_data psci_svc_cpu_data; #if CRASH_REPORTING uint64_t crash_buf[CPU_DATA_CRASH_BUF_SIZE >> 3]; #endif } __aligned(CACHE_WRITEBACK_GRANULE) cpu_data_t; #if CRASH_REPORTING /* verify assembler offsets match data structures */ CASSERT(CPU_DATA_CRASH_BUF_OFFSET == __builtin_offsetof (cpu_data_t, crash_buf), assert_cpu_data_crash_stack_offset_mismatch); #endif CASSERT((1 << CPU_DATA_LOG2SIZE) == sizeof(cpu_data_t), assert_cpu_data_log2size_mismatch); CASSERT(CPU_DATA_CPU_OPS_PTR == __builtin_offsetof (cpu_data_t, cpu_ops_ptr), assert_cpu_data_cpu_ops_ptr_offset_mismatch); struct cpu_data *_cpu_data_by_index(uint32_t cpu_index); struct cpu_data *_cpu_data_by_mpidr(uint64_t mpidr); /* Return the cpu_data structure for the current CPU. */ static inline struct cpu_data *_cpu_data(void) { return (cpu_data_t *)read_tpidr_el3(); } /************************************************************************** * APIs for initialising and accessing per-cpu data *************************************************************************/ void init_cpu_data_ptr(void); #define get_cpu_data(_m) _cpu_data()->_m #define set_cpu_data(_m, _v) _cpu_data()->_m = _v #define get_cpu_data_by_index(_ix, _m) _cpu_data_by_index(_ix)->_m #define set_cpu_data_by_index(_ix, _m, _v) _cpu_data_by_index(_ix)->_m = _v #define get_cpu_data_by_mpidr(_id, _m) _cpu_data_by_mpidr(_id)->_m #define set_cpu_data_by_mpidr(_id, _m, _v) _cpu_data_by_mpidr(_id)->_m = _v #define flush_cpu_data(_m) flush_dcache_range((uint64_t) \ &(_cpu_data()->_m), \ sizeof(_cpu_data()->_m)) #define flush_cpu_data_by_index(_ix, _m) \ flush_dcache_range((uint64_t) \ &(_cpu_data_by_index(_ix)->_m), \ sizeof(_cpu_data_by_index(_ix)->_m)) #endif /* __ASSEMBLY__ */ #endif /* __CPU_DATA_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/head_data.h000066400000000000000000000016341322600646200224370ustar00rootroot00000000000000/* * * Header for system * */ #ifndef __HEAD_H__ #define __HEAD_H__ /******************************************************************************/ /* the control information stored in file head */ /******************************************************************************/ struct spare_boot_ctrl_head { unsigned int jump_instruction; // one intruction jumping to real code unsigned char magic[8]; // ="u-boot" unsigned int check_sum; // generated by PC unsigned int align_size; // align size in byte unsigned int length; // the size of all file unsigned int uboot_length; // the size of uboot unsigned char version[8]; // uboot version unsigned char platform[8]; // platform information int reserved[1]; //stamp space, 16bytes align } ; #endif /* __HEAD_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/interrupt_mgmt.h000066400000000000000000000131561322600646200236270ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __INTERRUPT_MGMT_H__ #define __INTERRUPT_MGMT_H__ #include /******************************************************************************* * Constants for the types of interrupts recognised by the IM framework ******************************************************************************/ #define INTR_TYPE_S_EL1 0 #define INTR_TYPE_EL3 1 #define INTR_TYPE_NS 2 #define MAX_INTR_TYPES 3 #define INTR_TYPE_INVAL MAX_INTR_TYPES /* * Constant passed to the interrupt handler in the 'id' field when the * framework does not read the gic registers to determine the interrupt id. */ #define INTR_ID_UNAVAILABLE 0xFFFFFFFF /******************************************************************************* * Mask for _both_ the routing model bits in the 'flags' parameter and * constants to define the valid routing models for each supported interrupt * type ******************************************************************************/ #define INTR_RM_FLAGS_SHIFT 0x0 #define INTR_RM_FLAGS_MASK 0x3 /* Routed to EL3 from NS. Taken to S-EL1 from Secure */ #define INTR_SEL1_VALID_RM0 0x2 /* Routed to EL3 from NS and Secure */ #define INTR_SEL1_VALID_RM1 0x3 /* Routed to EL1/EL2 from NS and to S-EL1 from Secure */ #define INTR_NS_VALID_RM0 0x0 /* Routed to EL1/EL2 from NS and to EL3 from Secure */ #define INTR_NS_VALID_RM1 0x1 /******************************************************************************* * Constants for the _individual_ routing model bits in the 'flags' field for * each interrupt type and mask to validate the 'flags' parameter while * registering an interrupt handler ******************************************************************************/ #define INTR_TYPE_FLAGS_MASK 0xFFFFFFFC #define INTR_RM_FROM_SEC_SHIFT SECURE /* BIT[0] */ #define INTR_RM_FROM_NS_SHIFT NON_SECURE /* BIT[1] */ #define INTR_RM_FROM_FLAG_MASK 1 #define get_interrupt_rm_flag(flag, ss) (((flag >> INTR_RM_FLAGS_SHIFT) >> ss) \ & INTR_RM_FROM_FLAG_MASK) #define set_interrupt_rm_flag(flag, ss) (flag |= 1 << ss) #define clr_interrupt_rm_flag(flag, ss) (flag &= ~(1 << ss)) /******************************************************************************* * Macros to validate the routing model bits in the 'flags' for a type * of interrupt. If the model does not match one of the valid masks * -EINVAL is returned. ******************************************************************************/ #define validate_sel1_interrupt_rm(x) (x == INTR_SEL1_VALID_RM0 ? 0 : \ (x == INTR_SEL1_VALID_RM1 ? 0 :\ -EINVAL)) #define validate_ns_interrupt_rm(x) (x == INTR_NS_VALID_RM0 ? 0 : \ (x == INTR_NS_VALID_RM1 ? 0 :\ -EINVAL)) /******************************************************************************* * Macros to set the 'flags' parameter passed to an interrupt type handler. Only * the flag to indicate the security state when the exception was generated is * supported. ******************************************************************************/ #define INTR_SRC_SS_FLAG_SHIFT 0 /* BIT[0] */ #define INTR_SRC_SS_FLAG_MASK 1 #define set_interrupt_src_ss(flag, val) (flag |= val << INTR_SRC_SS_FLAG_SHIFT) #define clr_interrupt_src_ss(flag) (flag &= ~(1 << INTR_SRC_SS_FLAG_SHIFT)) #define get_interrupt_src_ss(flag) ((flag >> INTR_SRC_SS_FLAG_SHIFT) & \ INTR_SRC_SS_FLAG_MASK) #ifndef __ASSEMBLY__ /* Prototype for defining a handler for an interrupt type */ typedef uint64_t (*interrupt_type_handler_t)(uint32_t id, uint32_t flags, void *handle, void *cookie); /******************************************************************************* * Function & variable prototypes ******************************************************************************/ uint32_t get_scr_el3_from_routing_model(uint32_t security_state); int32_t set_routing_model(uint32_t type, uint32_t flags); int32_t register_interrupt_type_handler(uint32_t type, interrupt_type_handler_t handler, uint32_t flags); interrupt_type_handler_t get_interrupt_type_handler(uint32_t interrupt_type); #endif /*__ASSEMBLY__*/ #endif /* __INTERRUPT_MGMT_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/runtime_svc.h000066400000000000000000000225511322600646200231040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __RUNTIME_SVC_H__ #define __RUNTIME_SVC_H__ /******************************************************************************* * Bit definitions inside the function id as per the SMC calling convention ******************************************************************************/ #define FUNCID_TYPE_SHIFT 31 #define FUNCID_CC_SHIFT 30 #define FUNCID_OEN_SHIFT 24 #define FUNCID_NUM_SHIFT 0 #define FUNCID_TYPE_MASK 0x1 #define FUNCID_CC_MASK 0x1 #define FUNCID_OEN_MASK 0x3f #define FUNCID_NUM_MASK 0xffff #define FUNCID_TYPE_WIDTH 1 #define FUNCID_CC_WIDTH 1 #define FUNCID_OEN_WIDTH 6 #define FUNCID_NUM_WIDTH 16 #define GET_SMC_CC(id) ((id >> FUNCID_CC_SHIFT) & \ FUNCID_CC_MASK) #define GET_SMC_TYPE(id) ((id >> FUNCID_TYPE_SHIFT) & \ FUNCID_TYPE_MASK) #define SMC_64 1 #define SMC_32 0 #define SMC_UNK 0xffffffff #define SMC_TYPE_FAST 1 #define SMC_TYPE_STD 0 #define SMC_PREEMPTED 0xfffffffe /******************************************************************************* * Owning entity number definitions inside the function id as per the SMC * calling convention ******************************************************************************/ #define OEN_ARM_START 0 #define OEN_ARM_END 0 #define OEN_CPU_START 1 #define OEN_CPU_END 1 #define OEN_SIP_START 2 #define OEN_SIP_END 2 #define OEN_OEM_START 3 #define OEN_OEM_END 3 #define OEN_STD_START 4 /* Standard Calls */ #define OEN_STD_END 4 #define OEN_TAP_START 48 /* Trusted Applications */ #define OEN_TAP_END 49 #define OEN_TOS_START 50 /* Trusted OS */ #define OEN_TOS_END 63 #define OEN_LIMIT 64 /******************************************************************************* * Constants to indicate type of exception to the common exception handler. ******************************************************************************/ #define SYNC_EXCEPTION_SP_EL0 0x0 #define IRQ_SP_EL0 0x1 #define FIQ_SP_EL0 0x2 #define SERROR_SP_EL0 0x3 #define SYNC_EXCEPTION_SP_ELX 0x4 #define IRQ_SP_ELX 0x5 #define FIQ_SP_ELX 0x6 #define SERROR_SP_ELX 0x7 #define SYNC_EXCEPTION_AARCH64 0x8 #define IRQ_AARCH64 0x9 #define FIQ_AARCH64 0xa #define SERROR_AARCH64 0xb #define SYNC_EXCEPTION_AARCH32 0xc #define IRQ_AARCH32 0xd #define FIQ_AARCH32 0xe #define SERROR_AARCH32 0xf /******************************************************************************* * Structure definition, typedefs & constants for the runtime service framework ******************************************************************************/ /* * Constants to allow the assembler access a runtime service * descriptor */ #define RT_SVC_SIZE_LOG2 5 #define SIZEOF_RT_SVC_DESC (1 << RT_SVC_SIZE_LOG2) #define RT_SVC_DESC_INIT 16 #define RT_SVC_DESC_HANDLE 24 /* * The function identifier has 6 bits for the owning entity number and * single bit for the type of smc call. When taken together these * values limit the maximum number of runtime services to 128. */ #define MAX_RT_SVCS 128 #ifndef __ASSEMBLY__ #include #include #include /* Various flags passed to SMC handlers */ #define SMC_FROM_SECURE (0 << 0) #define SMC_FROM_NON_SECURE (1 << 0) #define is_caller_non_secure(_f) (!!(_f & SMC_FROM_NON_SECURE)) #define is_caller_secure(_f) (!(is_caller_non_secure(_f))) /* Prototype for runtime service initializing function */ typedef int32_t (*rt_svc_init_t)(void); /* Convenience macros to return from SMC handler */ #define SMC_RET0(_h) { \ return (uint64_t) (_h); \ } #define SMC_RET1(_h, _x0) { \ write_ctx_reg(get_gpregs_ctx(_h), CTX_GPREG_X0, (_x0)); \ SMC_RET0(_h); \ } #define SMC_RET2(_h, _x0, _x1) { \ write_ctx_reg(get_gpregs_ctx(_h), CTX_GPREG_X1, (_x1)); \ SMC_RET1(_h, (_x0)); \ } #define SMC_RET3(_h, _x0, _x1, _x2) { \ write_ctx_reg(get_gpregs_ctx(_h), CTX_GPREG_X2, (_x2)); \ SMC_RET2(_h, (_x0), (_x1)); \ } #define SMC_RET4(_h, _x0, _x1, _x2, _x3) { \ write_ctx_reg(get_gpregs_ctx(_h), CTX_GPREG_X3, (_x3)); \ SMC_RET3(_h, (_x0), (_x1), (_x2)); \ } /* * Convenience macros to access general purpose registers using handle provided * to SMC handler. These takes the offset values defined in context.h */ #define SMC_GET_GP(_h, _g) \ read_ctx_reg(get_gpregs_ctx(_h), (_g)); #define SMC_SET_GP(_h, _g, _v) \ write_ctx_reg(get_gpregs_ctx(_h), (_g), (_v)); /* * Convenience macros to access EL3 context registers using handle provided to * SMC handler. These takes the offset values defined in context.h */ #define SMC_GET_EL3(_h, _e) \ read_ctx_reg(get_el3state_ctx(_h), (_e)); #define SMC_SET_EL3(_h, _e, _v) \ write_ctx_reg(get_el3state_ctx(_h), (_e), (_v)); /* * Prototype for runtime service SMC handler function. x0 (SMC Function ID) to * x4 are as passed by the caller. Rest of the arguments to SMC and the context * can be accessed using the handle pointer. The cookie parameter is reserved * for future use */ typedef uint64_t (*rt_svc_handle_t)(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags); typedef struct rt_svc_desc { uint8_t start_oen; uint8_t end_oen; uint8_t call_type; const char *name; rt_svc_init_t init; rt_svc_handle_t handle; } rt_svc_desc_t; /* * Convenience macro to declare a service descriptor */ #define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \ static const rt_svc_desc_t __svc_desc_ ## _name \ __attribute__ ((section("rt_svc_descs"), used)) = { \ _start, \ _end, \ _type, \ #_name, \ _setup, \ _smch } /* * Compile time assertions related to the 'rt_svc_desc' structure to: * 1. ensure that the assembler and the compiler view of the size * of the structure are the same. * 2. ensure that the assembler and the compiler see the initialisation * routine at the same offset. * 3. ensure that the assembler and the compiler see the handler * routine at the same offset. */ CASSERT((sizeof(rt_svc_desc_t) == SIZEOF_RT_SVC_DESC), \ assert_sizeof_rt_svc_desc_mismatch); CASSERT(RT_SVC_DESC_INIT == __builtin_offsetof(rt_svc_desc_t, init), \ assert_rt_svc_desc_init_offset_mismatch); CASSERT(RT_SVC_DESC_HANDLE == __builtin_offsetof(rt_svc_desc_t, handle), \ assert_rt_svc_desc_handle_offset_mismatch); /* * This macro combines the call type and the owning entity number corresponding * to a runtime service to generate a unique owning entity number. This unique * oen is used to access an entry in the 'rt_svc_descs_indices' array. The entry * contains the index of the service descriptor in the 'rt_svc_descs' array. */ #define get_unique_oen(oen, call_type) ((oen & FUNCID_OEN_MASK) | \ ((call_type & FUNCID_TYPE_MASK) \ << FUNCID_OEN_WIDTH)) /* * Macro to define UUID for services. Apart from defining and initializing a * uuid_t structure, this macro verifies that the first word of the defined UUID * does not equal SMC_UNK. This is to ensure that the caller won't mistake the * returned UUID in x0 for an invalid SMC error return */ #define DEFINE_SVC_UUID(_name, _tl, _tm, _th, _cl, _ch, \ _n0, _n1, _n2, _n3, _n4, _n5) \ CASSERT(_tl != SMC_UNK, invalid_svc_uuid);\ static const uuid_t _name = { \ _tl, _tm, _th, _cl, _ch, \ { _n0, _n1, _n2, _n3, _n4, _n5 } \ } /* Return a UUID in the SMC return registers */ #define SMC_UUID_RET(_h, _uuid) \ SMC_RET4(handle, ((const uint32_t *) &(_uuid))[0], \ ((const uint32_t *) &(_uuid))[1], \ ((const uint32_t *) &(_uuid))[2], \ ((const uint32_t *) &(_uuid))[3]) /******************************************************************************* * Function & variable prototypes ******************************************************************************/ void runtime_svc_init(void); extern uint64_t __RT_SVC_DESCS_START__; extern uint64_t __RT_SVC_DESCS_END__; void init_crash_reporting(void); #endif /*__ASSEMBLY__*/ #endif /* __RUNTIME_SVC_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/services/000077500000000000000000000000001322600646200222135ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/bl31/services/psci.h000066400000000000000000000206171322600646200233300ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PSCI_H__ #define __PSCI_H__ /******************************************************************************* * Defines for runtime services func ids ******************************************************************************/ #define PSCI_VERSION 0x84000000 #define PSCI_CPU_SUSPEND_AARCH32 0x84000001 #define PSCI_CPU_SUSPEND_AARCH64 0xc4000001 #define PSCI_CPU_OFF 0x84000002 #define PSCI_CPU_ON_AARCH32 0x84000003 #define PSCI_CPU_ON_AARCH64 0xc4000003 #define PSCI_AFFINITY_INFO_AARCH32 0x84000004 #define PSCI_AFFINITY_INFO_AARCH64 0xc4000004 #define PSCI_MIG_AARCH32 0x84000005 #define PSCI_MIG_AARCH64 0xc4000005 #define PSCI_MIG_INFO_TYPE 0x84000006 #define PSCI_MIG_INFO_UP_CPU_AARCH32 0x84000007 #define PSCI_MIG_INFO_UP_CPU_AARCH64 0xc4000007 #define PSCI_SYSTEM_OFF 0x84000008 #define PSCI_SYSTEM_RESET 0x84000009 /* * Number of PSCI calls (above) implemented */ #define PSCI_NUM_CALLS 15 /******************************************************************************* * PSCI Migrate and friends ******************************************************************************/ #define PSCI_TOS_UP_MIG_CAP 0 #define PSCI_TOS_NOT_UP_MIG_CAP 1 #define PSCI_TOS_NOT_PRESENT_MP 2 /******************************************************************************* * PSCI CPU_SUSPEND 'power_state' parameter specific defines ******************************************************************************/ #define PSTATE_ID_SHIFT 0 #define PSTATE_TYPE_SHIFT 16 #define PSTATE_AFF_LVL_SHIFT 24 #define PSTATE_ID_MASK 0xffff #define PSTATE_TYPE_MASK 0x1 #define PSTATE_AFF_LVL_MASK 0x3 #define PSTATE_VALID_MASK 0xFCFE0000 #define PSTATE_TYPE_STANDBY 0x0 #define PSTATE_TYPE_POWERDOWN 0x1 #define psci_get_pstate_id(pstate) (pstate >> PSTATE_ID_SHIFT) & \ PSTATE_ID_MASK #define psci_get_pstate_type(pstate) (pstate >> PSTATE_TYPE_SHIFT) & \ PSTATE_TYPE_MASK #define psci_get_pstate_afflvl(pstate) (pstate >> PSTATE_AFF_LVL_SHIFT) & \ PSTATE_AFF_LVL_MASK /******************************************************************************* * PSCI version ******************************************************************************/ #define PSCI_MAJOR_VER (0 << 16) #define PSCI_MINOR_VER 0x2 /******************************************************************************* * PSCI error codes ******************************************************************************/ #define PSCI_E_SUCCESS 0 #define PSCI_E_NOT_SUPPORTED -1 #define PSCI_E_INVALID_PARAMS -2 #define PSCI_E_DENIED -3 #define PSCI_E_ALREADY_ON -4 #define PSCI_E_ON_PENDING -5 #define PSCI_E_INTERN_FAIL -6 #define PSCI_E_NOT_PRESENT -7 #define PSCI_E_DISABLED -8 /******************************************************************************* * PSCI affinity state related constants. An affinity instance could be present * or absent physically to cater for asymmetric topologies. If present then it * could in one of the 4 further defined states. ******************************************************************************/ #define PSCI_STATE_SHIFT 1 #define PSCI_STATE_MASK 0xff #define PSCI_AFF_ABSENT 0x0 #define PSCI_AFF_PRESENT 0x1 #define PSCI_STATE_ON 0x0 #define PSCI_STATE_OFF 0x1 #define PSCI_STATE_ON_PENDING 0x2 #define PSCI_STATE_SUSPEND 0x3 #define PSCI_INVALID_DATA -1 #define get_phys_state(x) (x != PSCI_STATE_ON ? \ PSCI_STATE_OFF : PSCI_STATE_ON) #define psci_validate_power_state(pstate) (pstate & PSTATE_VALID_MASK) #ifndef __ASSEMBLY__ #include /******************************************************************************* * Structure used to store per-cpu information relevant to the PSCI service. * It is populated in the per-cpu data array. In return we get a guarantee that * this information will not reside on a cache line shared with another cpu. ******************************************************************************/ typedef struct psci_cpu_data { uint32_t power_state; uint32_t max_phys_off_afflvl; /* Highest affinity level in physically powered off state */ } psci_cpu_data_t; /******************************************************************************* * Structure populated by platform specific code to export routines which * perform common low level pm functions ******************************************************************************/ typedef struct plat_pm_ops { int (*affinst_standby)(unsigned int); int (*affinst_on)(unsigned long, unsigned long, unsigned long, unsigned int, unsigned int); int (*affinst_off)(unsigned long, unsigned int, unsigned int); int (*affinst_suspend)(unsigned long, unsigned long, unsigned long, unsigned int, unsigned int); int (*affinst_on_finish)(unsigned long, unsigned int, unsigned int); int (*affinst_suspend_finish)(unsigned long, unsigned int, unsigned int); void (*core_power_down_wfi)(unsigned long); void (*system_off)(void) __dead2; void (*system_reset)(void) __dead2; } plat_pm_ops_t; /******************************************************************************* * Optional structure populated by the Secure Payload Dispatcher to be given a * chance to perform any bookkeeping before PSCI executes a power mgmt. * operation. It also allows PSCI to determine certain properties of the SP e.g. * migrate capability etc. ******************************************************************************/ typedef struct spd_pm_ops { void (*svc_on)(uint64_t target_cpu); int32_t (*svc_off)(uint64_t __unused); void (*svc_suspend)(uint64_t power_state); void (*svc_on_finish)(uint64_t __unused); void (*svc_suspend_finish)(uint64_t suspend_level); void (*svc_migrate)(uint64_t __unused1, uint64_t __unused2); int32_t (*svc_migrate_info)(uint64_t *__unused); void (*svc_system_off)(void); void (*svc_system_reset)(void); } spd_pm_ops_t; /******************************************************************************* * Function & Data prototypes ******************************************************************************/ unsigned int psci_version(void); int psci_affinity_info(unsigned long, unsigned int); int psci_migrate(unsigned int); unsigned int psci_migrate_info_type(void); unsigned long psci_migrate_info_up_cpu(void); int psci_cpu_on(unsigned long, unsigned long, unsigned long); void __dead2 psci_power_down_wfi(void); void psci_aff_on_finish_entry(void); void psci_aff_suspend_finish_entry(void); void psci_register_spd_pm_hook(const spd_pm_ops_t *); int psci_get_suspend_stateid_by_mpidr(unsigned long); int psci_get_suspend_stateid(void); int psci_get_suspend_afflvl(void); uint32_t psci_get_max_phys_off_afflvl(void); uint64_t psci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags); /* PSCI setup function */ int32_t psci_setup(void); #endif /*__ASSEMBLY__*/ #endif /* __PSCI_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl31/services/std_svc.h000066400000000000000000000041751322600646200240400ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __STD_SVC_H__ #define __STD_SVC_H__ /* SMC function IDs for Standard Service queries */ #define ARM_STD_SVC_CALL_COUNT 0x8400ff00 #define ARM_STD_SVC_UID 0x8400ff01 /* 0x8400ff02 is reserved */ #define ARM_STD_SVC_VERSION 0x8400ff03 /* ARM Standard Service Calls version numbers */ #define STD_SVC_VERSION_MAJOR 0x0 #define STD_SVC_VERSION_MINOR 0x1 /* The macros below are used to identify PSCI calls from the SMC function ID */ #define PSCI_FID_MASK 0xffe0u #define PSCI_FID_VALUE 0u #define is_psci_fid(_fid) \ (((_fid) & PSCI_FID_MASK) == PSCI_FID_VALUE) #endif /* __STD_SVC_H__ */ arm-trusted-firmware-1.0-aw-6/include/bl32/000077500000000000000000000000001322600646200203715ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/bl32/tsp/000077500000000000000000000000001322600646200211775ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/bl32/tsp/platform_tsp.h000066400000000000000000000036271322600646200240720ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLATFORM_TSP_H__ /******************************************************************************* * Mandatory TSP functions (only if platform contains a TSP) ******************************************************************************/ void tsp_early_platform_setup(void); void tsp_plat_arch_setup(void); void tsp_platform_setup(void); #define __PLATFORM_H__ #endif arm-trusted-firmware-1.0-aw-6/include/bl32/tsp/tsp.h000066400000000000000000000104131322600646200221550ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __TSP_H__ #define __TSP_H__ /* * SMC function IDs that TSP uses to signal various forms of completions * to the secure payload dispatcher. */ #define TSP_ENTRY_DONE 0xf2000000 #define TSP_ON_DONE 0xf2000001 #define TSP_OFF_DONE 0xf2000002 #define TSP_SUSPEND_DONE 0xf2000003 #define TSP_RESUME_DONE 0xf2000004 #define TSP_PREEMPTED 0xf2000005 #define TSP_SYSTEM_OFF_DONE 0xf2000008 #define TSP_SYSTEM_RESET_DONE 0xf2000009 /* * Function identifiers to handle FIQs through the synchronous handling model. * If the TSP was previously interrupted then control has to be returned to * the TSPD after handling the interrupt else execution can remain in the TSP. */ #define TSP_HANDLED_S_EL1_FIQ 0xf2000006 #define TSP_EL3_FIQ 0xf2000007 /* SMC function ID that TSP uses to request service from secure monitor */ #define TSP_GET_ARGS 0xf2001000 /* * Identifiers for various TSP services. Corresponding function IDs (whether * fast or standard) are generated by macros defined below */ #define TSP_ADD 0x2000 #define TSP_SUB 0x2001 #define TSP_MUL 0x2002 #define TSP_DIV 0x2003 #define TSP_HANDLE_FIQ_AND_RETURN 0x2004 /* * Generate function IDs for TSP services to be used in SMC calls, by * appropriately setting bit 31 to differentiate standard and fast SMC calls */ #define TSP_STD_FID(fid) ((fid) | 0x72000000 | (0 << 31)) #define TSP_FAST_FID(fid) ((fid) | 0x72000000 | (1 << 31)) /* SMC function ID to request a previously preempted std smc */ #define TSP_FID_RESUME TSP_STD_FID(0x3000) /* * Identify a TSP service from function ID filtering the last 16 bits from the * SMC function ID */ #define TSP_BARE_FID(fid) ((fid) & 0xffff) /* * Total number of function IDs implemented for services offered to NS clients. * The function IDs are defined above */ #define TSP_NUM_FID 0x4 /* TSP implementation version numbers */ #define TSP_VERSION_MAJOR 0x0 /* Major version */ #define TSP_VERSION_MINOR 0x1 /* Minor version */ /* * Standard Trusted OS Function IDs that fall under Trusted OS call range * according to SMC calling convention */ #define TOS_CALL_COUNT 0xbf00ff00 /* Number of calls implemented */ #define TOS_UID 0xbf00ff01 /* Implementation UID */ /* 0xbf00ff02 is reserved */ #define TOS_CALL_VERSION 0xbf00ff03 /* Trusted OS Call Version */ #ifndef __ASSEMBLY__ #include typedef uint32_t tsp_vector_isn_t; typedef struct tsp_vectors { tsp_vector_isn_t std_smc_entry; tsp_vector_isn_t fast_smc_entry; tsp_vector_isn_t cpu_on_entry; tsp_vector_isn_t cpu_off_entry; tsp_vector_isn_t cpu_resume_entry; tsp_vector_isn_t cpu_suspend_entry; tsp_vector_isn_t fiq_entry; tsp_vector_isn_t system_off_entry; tsp_vector_isn_t system_reset_entry; } tsp_vectors_t; #endif /* __ASSEMBLY__ */ #endif /* __TSP_H__ */ arm-trusted-firmware-1.0-aw-6/include/common/000077500000000000000000000000001322600646200211175ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/common/asm_macros.S000066400000000000000000000130541322600646200233720ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include .macro func_prologue stp x29, x30, [sp, #-0x10]! mov x29,sp .endm .macro func_epilogue ldp x29, x30, [sp], #0x10 .endm .macro dcache_line_size reg, tmp mrs \tmp, ctr_el0 ubfx \tmp, \tmp, #16, #4 mov \reg, #4 lsl \reg, \reg, \tmp .endm .macro icache_line_size reg, tmp mrs \tmp, ctr_el0 and \tmp, \tmp, #0xf mov \reg, #4 lsl \reg, \reg, \tmp .endm .macro smc_check label mrs x0, esr_el3 ubfx x0, x0, #ESR_EC_SHIFT, #ESR_EC_LENGTH cmp x0, #EC_AARCH64_SMC b.ne $label .endm /* * This macro verifies that the a given vector doesn't exceed the * architectural limit of 32 instructions. This is meant to be placed * immedately after the last instruction in the vector. It takes the * vector entry as the parameter */ .macro check_vector_size since .if (. - \since) > (32 * 4) .error "Vector exceeds 32 instructions" .endif .endm /* * This macro is used to create a function label and place the * code into a separate text section based on the function name * to enable elimination of unused code during linking */ .macro func _name .section .text.\_name, "ax" .type \_name, %function \_name: .endm /* --------------------------------------------- * Find the type of reset and jump to handler * if present. If the handler is null then it is * a cold boot. The primary cpu will set up the * platform while the secondaries wait for * their turn to be woken up * --------------------------------------------- */ .macro wait_for_entrypoint wait_for_entrypoint: mrs x0, mpidr_el1 bl platform_get_entrypoint cbnz x0, do_warm_boot mrs x0, mpidr_el1 bl platform_is_primary_cpu cbnz x0, do_cold_boot /* --------------------------------------------- * Perform any platform specific secondary cpu * actions * --------------------------------------------- */ bl plat_secondary_cold_boot_setup b wait_for_entrypoint do_warm_boot: /* --------------------------------------------- * Jump to BL31 for all warm boot init. * --------------------------------------------- */ blr x0 do_cold_boot: .endm /* * This macro declares an array of 1 or more stacks, properly * aligned and in the requested section */ #define STACK_ALIGN 6 .macro declare_stack _name, _section, _size, _count .if ((\_size & ((1 << STACK_ALIGN) - 1)) <> 0) .error "Stack size not correctly aligned" .endif .section \_section, "aw", %nobits .align STACK_ALIGN \_name: .space ((\_count) * (\_size)), 0 .endm /* * This macro calculates the base address of an MP stack using the * platform_get_core_pos() index, the name of the stack storage and * the size of each stack * In: X0 = MPIDR of CPU whose stack is wanted * Out: X0 = physical address of stack base * Clobber: X30, X1, X2 */ .macro get_mp_stack _name, _size bl platform_get_core_pos ldr x2, =(\_name + \_size) mov x1, #\_size madd x0, x0, x1, x2 .endm /* * This macro calculates the base address of a UP stack using the * name of the stack storage and the size of the stack * Out: X0 = physical address of stack base */ .macro get_up_stack _name, _size ldr x0, =(\_name + \_size) .endm /* * Helper macro to generate the best mov/movk combinations according * the value to be moved. The 16 bits from '_shift' are tested and * if not zero, they are moved into '_reg' without affecting * other bits. */ .macro _mov_imm16 _reg, _val, _shift .if (\_val >> \_shift) & 0xffff .if (\_val & (1 << \_shift - 1)) movk \_reg, (\_val >> \_shift) & 0xffff, LSL \_shift .else mov \_reg, \_val & (0xffff << \_shift) .endif .endif .endm /* * Helper macro to load arbitrary values into 32 or 64-bit registers * which generates the best mov/movk combinations. Many base addresses * are 64KB aligned the macro will eliminate updating bits 15:0 in * that case */ .macro mov_imm _reg, _val .if (\_val) == 0 mov \_reg, #0 .else _mov_imm16 \_reg, (\_val), 0 _mov_imm16 \_reg, (\_val), 16 _mov_imm16 \_reg, (\_val), 32 _mov_imm16 \_reg, (\_val), 48 .endif .endm arm-trusted-firmware-1.0-aw-6/include/common/assert_macros.S000066400000000000000000000040751322600646200241160ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Assembler macro to enable asm_assert. Use this macro wherever * assert is required in assembly. Please note that the macro makes * use of label '300' to provide the logic and the caller * should make sure that this label is not used to branch prior * to calling this macro. */ #define ASM_ASSERT(_cc) \ .ifndef .L_assert_filename ;\ .pushsection .rodata.str1.1, "aS" ;\ .L_assert_filename: ;\ .string __FILE__ ;\ .popsection ;\ .endif ;\ b._cc 300f ;\ adr x0, .L_assert_filename ;\ mov x1, __LINE__ ;\ b asm_assert ;\ 300: arm-trusted-firmware-1.0-aw-6/include/common/bl_common.h000066400000000000000000000210731322600646200232400ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BL_COMMON_H__ #define __BL_COMMON_H__ #define SECURE 0x0 #define NON_SECURE 0x1 #define sec_state_is_valid(s) (((s) == SECURE) || ((s) == NON_SECURE)) #define UP 1 #define DOWN 0 /******************************************************************************* * Constants to identify the location of a memory region in a given memory * layout. ******************************************************************************/ #define TOP 0x1 #define BOTTOM !TOP /****************************************************************************** * Opcode passed in x0 to tell next EL that we want to run an image. * Corresponds to the function ID of the only SMC that the BL1 exception * handlers service. That's why the chosen value is the first function ID of * the ARM SMC64 range. *****************************************************************************/ #define RUN_IMAGE 0xC0000000 /******************************************************************************* * Constants that allow assembler code to access members of and the * 'entry_point_info' structure at their correct offsets. ******************************************************************************/ #define ENTRY_POINT_INFO_PC_OFFSET 0x08 #define ENTRY_POINT_INFO_ARGS_OFFSET 0x18 #define PARAM_EP_SECURITY_MASK 0x1 #define GET_SECURITY_STATE(x) (x & PARAM_EP_SECURITY_MASK) #define SET_SECURITY_STATE(x, security) \ ((x) = ((x) & ~PARAM_EP_SECURITY_MASK) | (security)) #define EP_EE_MASK 0x2 #define EP_EE_LITTLE 0x0 #define EP_EE_BIG 0x2 #define EP_GET_EE(x) (x & EP_EE_MASK) #define EP_SET_EE(x, ee) ((x) = ((x) & ~EP_EE_MASK) | (ee)) #define EP_ST_MASK 0x4 #define EP_ST_DISABLE 0x0 #define EP_ST_ENABLE 0x4 #define EP_GET_ST(x) (x & EP_ST_MASK) #define EP_SET_ST(x, ee) ((x) = ((x) & ~EP_ST_MASK) | (ee)) #define PARAM_EP 0x01 #define PARAM_IMAGE_BINARY 0x02 #define PARAM_BL31 0x03 #define VERSION_1 0x01 #define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \ (_p)->h.type = (uint8_t)(_type); \ (_p)->h.version = (uint8_t)(_ver); \ (_p)->h.size = (uint16_t)sizeof(*_p); \ (_p)->h.attr = (uint32_t)(_attr) ; \ } while (0) #ifndef __ASSEMBLY__ #include /* For __dead2 */ #include #include #include /******************************************************************************* * Structure used for telling the next BL how much of a particular type of * memory is available for its use and how much is already used. ******************************************************************************/ typedef struct meminfo { uint64_t total_base; size_t total_size; uint64_t free_base; size_t free_size; } meminfo_t; typedef struct aapcs64_params { unsigned long arg0; unsigned long arg1; unsigned long arg2; unsigned long arg3; unsigned long arg4; unsigned long arg5; unsigned long arg6; unsigned long arg7; } aapcs64_params_t; /*************************************************************************** * This structure provides version information and the size of the * structure, attributes for the structure it represents ***************************************************************************/ typedef struct param_header { uint8_t type; /* type of the structure */ uint8_t version; /* version of this structure */ uint16_t size; /* size of this structure in bytes */ uint32_t attr; /* attributes: unused bits SBZ */ } param_header_t; /***************************************************************************** * This structure represents the superset of information needed while * switching exception levels. The only two mechanisms to do so are * ERET & SMC. Security state is indicated using bit zero of header * attribute * NOTE: BL1 expects entrypoint followed by spsr while processing * SMC to jump to BL31 from the start of entry_point_info *****************************************************************************/ typedef struct entry_point_info { param_header_t h; uintptr_t pc; uint32_t spsr; aapcs64_params_t args; } entry_point_info_t; /***************************************************************************** * Image info binary provides information from the image loader that * can be used by the firmware to manage available trusted RAM. * More advanced firmware image formats can provide additional * information that enables optimization or greater flexibility in the * common firmware code *****************************************************************************/ typedef struct image_info { param_header_t h; uintptr_t image_base; /* physical address of base of image */ uint32_t image_size; /* bytes read from image file */ } image_info_t; /******************************************************************************* * This structure represents the superset of information that can be passed to * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be * populated only if BL2 detects its presence. A pointer to a structure of this * type should be passed in X3 to BL31's cold boot entrypoint * * Use of this structure and the X3 parameter is not mandatory: the BL3-1 * platform code can use other mechanisms to provide the necessary information * about BL3-2 and BL3-3 to the common and SPD code. * * BL3-1 image information is mandatory if this structure is used. If either of * the optional BL3-2 and BL3-3 image information is not provided, this is * indicated by the respective image_info pointers being zero. ******************************************************************************/ typedef struct bl31_params { param_header_t h; image_info_t *bl31_image_info; entry_point_info_t *bl32_ep_info; image_info_t *bl32_image_info; entry_point_info_t *bl33_ep_info; image_info_t *bl33_image_info; } bl31_params_t; /* * Compile time assertions related to the 'entry_point_info' structure to * ensure that the assembler and the compiler view of the offsets of * the structure members is the same. */ CASSERT(ENTRY_POINT_INFO_PC_OFFSET == __builtin_offsetof(entry_point_info_t, pc), \ assert_BL31_pc_offset_mismatch); CASSERT(ENTRY_POINT_INFO_ARGS_OFFSET == \ __builtin_offsetof(entry_point_info_t, args), \ assert_BL31_args_offset_mismatch); CASSERT(sizeof(unsigned long) == __builtin_offsetof(entry_point_info_t, spsr) - \ __builtin_offsetof(entry_point_info_t, pc), \ assert_entrypoint_and_spsr_should_be_adjacent); /******************************************************************************* * Function & variable prototypes ******************************************************************************/ unsigned long page_align(unsigned long, unsigned); void change_security_state(unsigned int); unsigned long image_size(const char *); int load_image(meminfo_t *mem_layout, const char *image_name, uint64_t image_base, image_info_t *image_data, entry_point_info_t *entry_point_info); extern const char build_message[]; extern const char version_string[]; void reserve_mem(uint64_t *free_base, size_t *free_size, uint64_t addr, size_t size); #endif /*__ASSEMBLY__*/ #endif /* __BL_COMMON_H__ */ arm-trusted-firmware-1.0-aw-6/include/common/debug.h000066400000000000000000000056501322600646200223640ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __DEBUG_H__ #define __DEBUG_H__ #include /* The log output macros print output to the console. These macros produce * compiled log output only if the LOG_LEVEL defined in the makefile (or the * make command line) is greater or equal than the level required for that * type of log output. * The format expected is the same as for printf(). For example: * INFO("Info %s.\n", "message") -> INFO: Info message. * WARN("Warning %s.\n", "message") -> WARNING: Warning message. */ #define LOG_LEVEL_NONE 0 #define LOG_LEVEL_ERROR 10 #define LOG_LEVEL_NOTICE 20 #define LOG_LEVEL_WARNING 30 #define LOG_LEVEL_INFO 40 #define LOG_LEVEL_VERBOSE 50 #if LOG_LEVEL >= LOG_LEVEL_NOTICE # define NOTICE(...) tf_printf("NOTICE: " __VA_ARGS__) #else # define NOTICE(...) #endif #if LOG_LEVEL >= LOG_LEVEL_ERROR # define ERROR(...) tf_printf("ERROR: " __VA_ARGS__) #else # define ERROR(...) #endif #if LOG_LEVEL >= LOG_LEVEL_WARNING # define WARN(...) tf_printf("WARNING: " __VA_ARGS__) #else # define WARN(...) #endif #if LOG_LEVEL >= LOG_LEVEL_INFO # define INFO(...) tf_printf("INFO: " __VA_ARGS__) #else # define INFO(...) #endif #if LOG_LEVEL >= LOG_LEVEL_VERBOSE # define VERBOSE(...) tf_printf("VERBOSE: " __VA_ARGS__) #else # define VERBOSE(...) #endif void __dead2 do_panic(void); #define panic() do_panic() void tf_printf(const char *fmt, ...); #endif /* __DEBUG_H__ */ arm-trusted-firmware-1.0-aw-6/include/common/firmware_image_package.h000066400000000000000000000051541322600646200257260ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __FIRMWARE_IMAGE_PACKAGE_H__ #define __FIRMWARE_IMAGE_PACKAGE_H__ #include #include /* This is used as a signature to validate the blob header */ #define TOC_HEADER_NAME 0xAA640001 /* ToC Entry UUIDs */ #define UUID_TRUSTED_BOOT_FIRMWARE_BL2 \ {0x0becf95f, 0x224d, 0x4d3e, 0xa5, 0x44, {0xc3, 0x9d, 0x81, 0xc7, 0x3f, 0x0a} } #define UUID_SCP_FIRMWARE_BL30 \ {0x3dfd6697, 0xbe89, 0x49e8, 0xae, 0x5d, {0x78, 0xa1, 0x40, 0x60, 0x82, 0x13} } #define UUID_EL3_RUNTIME_FIRMWARE_BL31 \ {0x6d08d447, 0xfe4c, 0x4698, 0x9b, 0x95, {0x29, 0x50, 0xcb, 0xbd, 0x5a, 0x00} } #define UUID_SECURE_PAYLOAD_BL32 \ {0x89e1d005, 0xdc53, 0x4713, 0x8d, 0x2b, {0x50, 0x0a, 0x4b, 0x7a, 0x3e, 0x38} } #define UUID_NON_TRUSTED_FIRMWARE_BL33 \ {0xa7eed0d6, 0xeafc, 0x4bd5, 0x97, 0x82, {0x99, 0x34, 0xf2, 0x34, 0xb6, 0xe4} } typedef struct fip_toc_header { uint32_t name; uint32_t serial_number; uint64_t flags; } fip_toc_header_t; typedef struct fip_toc_entry { uuid_t uuid; uint64_t offset_address; uint64_t size; uint64_t flags; } fip_toc_entry_t; #endif /* __FIRMWARE_IMAGE_PACKAGE_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/000077500000000000000000000000001322600646200213055ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/drivers/arm/000077500000000000000000000000001322600646200220645ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/drivers/arm/arm_gic.h000066400000000000000000000046221322600646200236420ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __ARM_GIC_H__ #define __ARM_GIC_H__ #include /******************************************************************************* * Function declarations ******************************************************************************/ void arm_gic_init(unsigned int gicc_base, unsigned int gicd_base, unsigned long gicr_base, const unsigned int *irq_sec_ptr, unsigned int num_irqs); void arm_gic_setup(void); void arm_gic_cpuif_deactivate(void); void arm_gic_cpuif_setup(void); void arm_gic_pcpu_distif_setup(void); uint32_t arm_gic_interrupt_type_to_line(uint32_t type, uint32_t security_state); uint32_t arm_gic_get_pending_interrupt_type(void); uint32_t arm_gic_get_pending_interrupt_id(void); uint32_t arm_gic_acknowledge_interrupt(void); void arm_gic_end_of_interrupt(uint32_t id); uint32_t arm_gic_get_interrupt_type(uint32_t id); #endif /* __GIC_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/arm/cci400.h000066400000000000000000000066331322600646200232270ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CCI_400_H__ #define __CCI_400_H__ /* Slave interface offsets from PERIPHBASE */ #define SLAVE_IFACE4_OFFSET 0x5000 #define SLAVE_IFACE3_OFFSET 0x4000 #define SLAVE_IFACE2_OFFSET 0x3000 #define SLAVE_IFACE1_OFFSET 0x2000 #define SLAVE_IFACE0_OFFSET 0x1000 #define SLAVE_IFACE_OFFSET(index) SLAVE_IFACE0_OFFSET + \ (0x1000 * (index)) /* Control and ID register offsets */ #define CTRL_OVERRIDE_REG 0x0 #define SPEC_CTRL_REG 0x4 #define SECURE_ACCESS_REG 0x8 #define STATUS_REG 0xc #define IMPRECISE_ERR_REG 0x10 #define PERFMON_CTRL_REG 0x100 /* Slave interface register offsets */ #define SNOOP_CTRL_REG 0x0 #define SH_OVERRIDE_REG 0x4 #define READ_CHNL_QOS_VAL_OVERRIDE_REG 0x100 #define WRITE_CHNL_QOS_VAL_OVERRIDE_REG 0x104 #define QOS_CTRL_REG 0x10c #define MAX_OT_REG 0x110 #define TARGET_LATENCY_REG 0x130 #define LATENCY_REGULATION_REG 0x134 #define QOS_RANGE_REG 0x138 /* Snoop Control register bit definitions */ #define DVM_EN_BIT (1 << 1) #define SNOOP_EN_BIT (1 << 0) /* Status register bit definitions */ #define CHANGE_PENDING_BIT (1 << 0) #ifndef __ASSEMBLY__ /* Function declarations */ /* * The CCI-400 driver must be initialized with the base address of the * CCI-400 device in the platform memory map, and the cluster indices for * the CCI-400 slave interfaces 3 and 4 respectively. These are the fully * coherent ACE slave interfaces of CCI-400. * The cluster indices must either be 0 or 1, corresponding to the level 1 * affinity instance of the mpidr representing the cluster. A negative cluster * index indicates that no cluster is present on that slave interface. */ void cci_init(unsigned long cci_base, int slave_iface3_cluster_ix, int slave_iface4_cluster_ix); void cci_enable_cluster_coherency(unsigned long mpidr); void cci_disable_cluster_coherency(unsigned long mpidr); #endif /* __ASSEMBLY__ */ #endif /* __CCI_400_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/arm/gic_v2.h000066400000000000000000000241661322600646200234170ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __GIC_V2_H__ #define __GIC_V2_H__ #define GIC400_NUM_SPIS 480 #define MAX_PPIS 14 #define MAX_SGIS 16 #define MIN_SGI_ID 0 #define MIN_PPI_ID 16 #define MIN_SPI_ID 32 #define GRP0 0 #define GRP1 1 #define GIC_PRI_MASK 0xff #define GIC_HIGHEST_SEC_PRIORITY 0 #define GIC_LOWEST_SEC_PRIORITY 127 #define GIC_HIGHEST_NS_PRIORITY 128 #define GIC_LOWEST_NS_PRIORITY 254 /* 255 would disable an interrupt */ #define GIC_SPURIOUS_INTERRUPT 1023 #define ENABLE_GRP0 (1 << 0) #define ENABLE_GRP1 (1 << 1) /* Distributor interface definitions */ #define GICD_CTLR 0x0 #define GICD_TYPER 0x4 #define GICD_IGROUPR 0x80 #define GICD_ISENABLER 0x100 #define GICD_ICENABLER 0x180 #define GICD_ISPENDR 0x200 #define GICD_ICPENDR 0x280 #define GICD_ISACTIVER 0x300 #define GICD_ICACTIVER 0x380 #define GICD_IPRIORITYR 0x400 #define GICD_ITARGETSR 0x800 #define GICD_ICFGR 0xC00 #define GICD_SGIR 0xF00 #define GICD_CPENDSGIR 0xF10 #define GICD_SPENDSGIR 0xF20 #define IGROUPR_SHIFT 5 #define ISENABLER_SHIFT 5 #define ICENABLER_SHIFT ISENABLER_SHIFT #define ISPENDR_SHIFT 5 #define ICPENDR_SHIFT ISPENDR_SHIFT #define ISACTIVER_SHIFT 5 #define ICACTIVER_SHIFT ISACTIVER_SHIFT #define IPRIORITYR_SHIFT 2 #define ITARGETSR_SHIFT 2 #define ICFGR_SHIFT 4 #define CPENDSGIR_SHIFT 2 #define SPENDSGIR_SHIFT CPENDSGIR_SHIFT /* GICD_TYPER bit definitions */ #define IT_LINES_NO_MASK 0x1f /* Physical CPU Interface registers */ #define GICC_CTLR 0x0 #define GICC_PMR 0x4 #define GICC_BPR 0x8 #define GICC_IAR 0xC #define GICC_EOIR 0x10 #define GICC_RPR 0x14 #define GICC_HPPIR 0x18 #define GICC_AHPPIR 0x28 #define GICC_IIDR 0xFC #define GICC_DIR 0x1000 #define GICC_PRIODROP GICC_EOIR /* GICC_CTLR bit definitions */ #define EOI_MODE_NS (1 << 10) #define EOI_MODE_S (1 << 9) #define IRQ_BYP_DIS_GRP1 (1 << 8) #define FIQ_BYP_DIS_GRP1 (1 << 7) #define IRQ_BYP_DIS_GRP0 (1 << 6) #define FIQ_BYP_DIS_GRP0 (1 << 5) #define CBPR (1 << 4) #define FIQ_EN (1 << 3) #define ACK_CTL (1 << 2) /* GICC_IIDR bit masks and shifts */ #define GICC_IIDR_PID_SHIFT 20 #define GICC_IIDR_ARCH_SHIFT 16 #define GICC_IIDR_REV_SHIFT 12 #define GICC_IIDR_IMP_SHIFT 0 #define GICC_IIDR_PID_MASK 0xfff #define GICC_IIDR_ARCH_MASK 0xf #define GICC_IIDR_REV_MASK 0xf #define GICC_IIDR_IMP_MASK 0xfff /* HYP view virtual CPU Interface registers */ #define GICH_CTL 0x0 #define GICH_VTR 0x4 #define GICH_ELRSR0 0x30 #define GICH_ELRSR1 0x34 #define GICH_APR0 0xF0 #define GICH_LR_BASE 0x100 /* Virtual CPU Interface registers */ #define GICV_CTL 0x0 #define GICV_PRIMASK 0x4 #define GICV_BP 0x8 #define GICV_INTACK 0xC #define GICV_EOI 0x10 #define GICV_RUNNINGPRI 0x14 #define GICV_HIGHESTPEND 0x18 #define GICV_DEACTIVATE 0x1000 #ifndef __ASSEMBLY__ #include /******************************************************************************* * GIC Distributor function prototypes ******************************************************************************/ unsigned int gicd_read_igroupr(unsigned int, unsigned int); unsigned int gicd_read_isenabler(unsigned int, unsigned int); unsigned int gicd_read_icenabler(unsigned int, unsigned int); unsigned int gicd_read_ispendr(unsigned int, unsigned int); unsigned int gicd_read_icpendr(unsigned int, unsigned int); unsigned int gicd_read_isactiver(unsigned int, unsigned int); unsigned int gicd_read_icactiver(unsigned int, unsigned int); unsigned int gicd_read_ipriorityr(unsigned int, unsigned int); unsigned int gicd_read_itargetsr(unsigned int, unsigned int); unsigned int gicd_read_icfgr(unsigned int, unsigned int); unsigned int gicd_read_cpendsgir(unsigned int, unsigned int); unsigned int gicd_read_spendsgir(unsigned int, unsigned int); void gicd_write_igroupr(unsigned int, unsigned int, unsigned int); void gicd_write_isenabler(unsigned int, unsigned int, unsigned int); void gicd_write_icenabler(unsigned int, unsigned int, unsigned int); void gicd_write_ispendr(unsigned int, unsigned int, unsigned int); void gicd_write_icpendr(unsigned int, unsigned int, unsigned int); void gicd_write_isactiver(unsigned int, unsigned int, unsigned int); void gicd_write_icactiver(unsigned int, unsigned int, unsigned int); void gicd_write_ipriorityr(unsigned int, unsigned int, unsigned int); void gicd_write_itargetsr(unsigned int, unsigned int, unsigned int); void gicd_write_icfgr(unsigned int, unsigned int, unsigned int); void gicd_write_cpendsgir(unsigned int, unsigned int, unsigned int); void gicd_write_spendsgir(unsigned int, unsigned int, unsigned int); unsigned int gicd_get_igroupr(unsigned int, unsigned int); void gicd_set_igroupr(unsigned int, unsigned int); void gicd_clr_igroupr(unsigned int, unsigned int); void gicd_set_isenabler(unsigned int, unsigned int); void gicd_set_icenabler(unsigned int, unsigned int); void gicd_set_ispendr(unsigned int, unsigned int); void gicd_set_icpendr(unsigned int, unsigned int); void gicd_set_isactiver(unsigned int, unsigned int); void gicd_set_icactiver(unsigned int, unsigned int); void gicd_set_ipriorityr(unsigned int, unsigned int, unsigned int); void gicd_set_itargetsr(unsigned int, unsigned int, unsigned int); /******************************************************************************* * GIC Distributor interface accessors for reading entire registers ******************************************************************************/ static inline unsigned int gicd_read_ctlr(unsigned int base) { return mmio_read_32(base + GICD_CTLR); } static inline unsigned int gicd_read_typer(unsigned int base) { return mmio_read_32(base + GICD_TYPER); } static inline unsigned int gicd_read_sgir(unsigned int base) { return mmio_read_32(base + GICD_SGIR); } /******************************************************************************* * GIC Distributor interface accessors for writing entire registers ******************************************************************************/ static inline void gicd_write_ctlr(unsigned int base, unsigned int val) { mmio_write_32(base + GICD_CTLR, val); } static inline void gicd_write_sgir(unsigned int base, unsigned int val) { mmio_write_32(base + GICD_SGIR, val); } /******************************************************************************* * GIC CPU interface accessors for reading entire registers ******************************************************************************/ static inline unsigned int gicc_read_ctlr(unsigned int base) { return mmio_read_32(base + GICC_CTLR); } static inline unsigned int gicc_read_pmr(unsigned int base) { return mmio_read_32(base + GICC_PMR); } static inline unsigned int gicc_read_BPR(unsigned int base) { return mmio_read_32(base + GICC_BPR); } static inline unsigned int gicc_read_IAR(unsigned int base) { return mmio_read_32(base + GICC_IAR); } static inline unsigned int gicc_read_EOIR(unsigned int base) { return mmio_read_32(base + GICC_EOIR); } static inline unsigned int gicc_read_hppir(unsigned int base) { return mmio_read_32(base + GICC_HPPIR); } static inline unsigned int gicc_read_ahppir(unsigned int base) { return mmio_read_32(base + GICC_AHPPIR); } static inline unsigned int gicc_read_dir(unsigned int base) { return mmio_read_32(base + GICC_DIR); } static inline unsigned int gicc_read_iidr(unsigned int base) { return mmio_read_32(base + GICC_IIDR); } /******************************************************************************* * GIC CPU interface accessors for writing entire registers ******************************************************************************/ static inline void gicc_write_ctlr(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_CTLR, val); } static inline void gicc_write_pmr(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_PMR, val); } static inline void gicc_write_BPR(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_BPR, val); } static inline void gicc_write_IAR(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_IAR, val); } static inline void gicc_write_EOIR(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_EOIR, val); } static inline void gicc_write_hppir(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_HPPIR, val); } static inline void gicc_write_dir(unsigned int base, unsigned int val) { mmio_write_32(base + GICC_DIR, val); } /******************************************************************************* * Prototype of function to map an interrupt type to the interrupt line used to * signal it. ******************************************************************************/ uint32_t gicv2_interrupt_type_to_line(uint32_t cpuif_base, uint32_t type); #endif /*__ASSEMBLY__*/ #endif /* __GIC_V2_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/arm/gic_v3.h000066400000000000000000000063231322600646200234130ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __GIC_V3_H__ #define __GIC_V3_H__ #include #include /* GICv3 Re-distributor interface registers & shifts */ #define GICR_PCPUBASE_SHIFT 0x11 #define GICR_TYPER 0x08 #define GICR_WAKER 0x14 /* GICR_WAKER bit definitions */ #define WAKER_CA (1UL << 2) #define WAKER_PS (1UL << 1) /* GICR_TYPER bit definitions */ #define GICR_TYPER_AFF_SHIFT 32 #define GICR_TYPER_AFF_MASK 0xffffffff #define GICR_TYPER_LAST (1UL << 4) /* GICv3 ICC_SRE register bit definitions*/ #define ICC_SRE_EN (1UL << 3) #define ICC_SRE_SRE (1UL << 0) /******************************************************************************* * GICv3 defintions ******************************************************************************/ #define GICV3_AFFLVL_MASK 0xff #define GICV3_AFF0_SHIFT 0 #define GICV3_AFF1_SHIFT 8 #define GICV3_AFF2_SHIFT 16 #define GICV3_AFF3_SHIFT 24 #define GICV3_AFFINITY_MASK 0xffffffff /******************************************************************************* * Function prototypes ******************************************************************************/ uintptr_t gicv3_get_rdist(uintptr_t gicr_base, uint64_t mpidr); /******************************************************************************* * GIC Redistributor interface accessors ******************************************************************************/ static inline uint32_t gicr_read_waker(uintptr_t base) { return mmio_read_32(base + GICR_WAKER); } static inline void gicr_write_waker(uintptr_t base, uint32_t val) { mmio_write_32(base + GICR_WAKER, val); } static inline uint64_t gicr_read_typer(uintptr_t base) { return mmio_read_64(base + GICR_TYPER); } #endif /* __GIC_V3_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/arm/pl011.h000066400000000000000000000106351322600646200230770ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PL011_H__ #define __PL011_H__ /* PL011 Registers */ #define UARTDR 0x000 #define UARTRSR 0x004 #define UARTECR 0x004 #define UARTFR 0x018 #define UARTILPR 0x020 #define UARTIBRD 0x024 #define UARTFBRD 0x028 #define UARTLCR_H 0x02C #define UARTCR 0x030 #define UARTIFLS 0x034 #define UARTIMSC 0x038 #define UARTRIS 0x03C #define UARTMIS 0x040 #define UARTICR 0x044 #define UARTDMACR 0x048 /* Data status bits */ #define UART_DATA_ERROR_MASK 0x0F00 /* Status reg bits */ #define UART_STATUS_ERROR_MASK 0x0F /* Flag reg bits */ #define PL011_UARTFR_RI (1 << 8) /* Ring indicator */ #define PL011_UARTFR_TXFE (1 << 7) /* Transmit FIFO empty */ #define PL011_UARTFR_RXFF (1 << 6) /* Receive FIFO full */ #define PL011_UARTFR_TXFF (1 << 5) /* Transmit FIFO full */ #define PL011_UARTFR_RXFE (1 << 4) /* Receive FIFO empty */ #define PL011_UARTFR_BUSY (1 << 3) /* UART busy */ #define PL011_UARTFR_DCD (1 << 2) /* Data carrier detect */ #define PL011_UARTFR_DSR (1 << 1) /* Data set ready */ #define PL011_UARTFR_CTS (1 << 0) /* Clear to send */ #define PL011_UARTFR_TXFF_BIT 5 /* Transmit FIFO full bit in UARTFR register */ #define PL011_UARTFR_RXFE_BIT 4 /* Receive FIFO empty bit in UARTFR register */ /* Control reg bits */ #define PL011_UARTCR_CTSEN (1 << 15) /* CTS hardware flow control enable */ #define PL011_UARTCR_RTSEN (1 << 14) /* RTS hardware flow control enable */ #define PL011_UARTCR_RTS (1 << 11) /* Request to send */ #define PL011_UARTCR_DTR (1 << 10) /* Data transmit ready. */ #define PL011_UARTCR_RXE (1 << 9) /* Receive enable */ #define PL011_UARTCR_TXE (1 << 8) /* Transmit enable */ #define PL011_UARTCR_LBE (1 << 7) /* Loopback enable */ #define PL011_UARTCR_UARTEN (1 << 0) /* UART Enable */ #if !defined(PL011_LINE_CONTROL) /* FIFO Enabled / No Parity / 8 Data bit / One Stop Bit */ #define PL011_LINE_CONTROL (PL011_UARTLCR_H_FEN | PL011_UARTLCR_H_WLEN_8) #endif /* Line Control Register Bits */ #define PL011_UARTLCR_H_SPS (1 << 7) /* Stick parity select */ #define PL011_UARTLCR_H_WLEN_8 (3 << 5) #define PL011_UARTLCR_H_WLEN_7 (2 << 5) #define PL011_UARTLCR_H_WLEN_6 (1 << 5) #define PL011_UARTLCR_H_WLEN_5 (0 << 5) #define PL011_UARTLCR_H_FEN (1 << 4) /* FIFOs Enable */ #define PL011_UARTLCR_H_STP2 (1 << 3) /* Two stop bits select */ #define PL011_UARTLCR_H_EPS (1 << 2) /* Even parity select */ #define PL011_UARTLCR_H_PEN (1 << 1) /* Parity Enable */ #define PL011_UARTLCR_H_BRK (1 << 0) /* Send break */ #endif /* __PL011_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/arm/tzc400.h000066400000000000000000000147421322600646200232710ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __TZC400_H__ #define __TZC400_H__ #include #define BUILD_CONFIG_OFF 0x000 #define ACTION_OFF 0x004 #define GATE_KEEPER_OFF 0x008 #define SPECULATION_CTRL_OFF 0x00c #define INT_STATUS 0x010 #define INT_CLEAR 0x014 #define FAIL_ADDRESS_LOW_OFF 0x020 #define FAIL_ADDRESS_HIGH_OFF 0x024 #define FAIL_CONTROL_OFF 0x028 #define FAIL_ID 0x02c #define REGION_BASE_LOW_OFF 0x100 #define REGION_BASE_HIGH_OFF 0x104 #define REGION_TOP_LOW_OFF 0x108 #define REGION_TOP_HIGH_OFF 0x10c #define REGION_ATTRIBUTES_OFF 0x110 #define REGION_ID_ACCESS_OFF 0x114 #define REGION_NUM_OFF(region) (0x20 * region) /* ID Registers */ #define PID0_OFF 0xfe0 #define PID1_OFF 0xfe4 #define PID2_OFF 0xfe8 #define PID3_OFF 0xfec #define PID4_OFF 0xfd0 #define PID5_OFF 0xfd4 #define PID6_OFF 0xfd8 #define PID7_OFF 0xfdc #define CID0_OFF 0xff0 #define CID1_OFF 0xff4 #define CID2_OFF 0xff8 #define CID3_OFF 0xffc #define BUILD_CONFIG_NF_SHIFT 24 #define BUILD_CONFIG_NF_MASK 0x3 #define BUILD_CONFIG_AW_SHIFT 8 #define BUILD_CONFIG_AW_MASK 0x3f #define BUILD_CONFIG_NR_SHIFT 0 #define BUILD_CONFIG_NR_MASK 0x1f /* Not describing the case where regions 1 to 8 overlap */ #define ACTION_RV_SHIFT 0 #define ACTION_RV_MASK 0x3 #define ACTION_RV_LOWOK 0x0 #define ACTION_RV_LOWERR 0x1 #define ACTION_RV_HIGHOK 0x2 #define ACTION_RV_HIGHERR 0x3 /* * Number of gate keepers is implementation defined. But we know the max for * this device is 4. Get implementation details from BUILD_CONFIG. */ #define GATE_KEEPER_OS_SHIFT 16 #define GATE_KEEPER_OS_MASK 0xf #define GATE_KEEPER_OR_SHIFT 0 #define GATE_KEEPER_OR_MASK 0xf #define GATE_KEEPER_FILTER_MASK 0x1 /* Speculation is enabled by default. */ #define SPECULATION_CTRL_WRITE_DISABLE (1 << 1) #define SPECULATION_CTRL_READ_DISABLE (1 << 0) /* Max number of filters allowed is 4. */ #define INT_STATUS_OVERLAP_SHIFT 16 #define INT_STATUS_OVERLAP_MASK 0xf #define INT_STATUS_OVERRUN_SHIFT 8 #define INT_STATUS_OVERRUN_MASK 0xf #define INT_STATUS_STATUS_SHIFT 0 #define INT_STATUS_STATUS_MASK 0xf #define INT_CLEAR_CLEAR_SHIFT 0 #define INT_CLEAR_CLEAR_MASK 0xf #define FAIL_CONTROL_DIR_SHIFT (1 << 24) #define FAIL_CONTROL_DIR_READ 0x0 #define FAIL_CONTROL_DIR_WRITE 0x1 #define FAIL_CONTROL_NS_SHIFT (1 << 21) #define FAIL_CONTROL_NS_SECURE 0x0 #define FAIL_CONTROL_NS_NONSECURE 0x1 #define FAIL_CONTROL_PRIV_SHIFT (1 << 20) #define FAIL_CONTROL_PRIV_PRIV 0x0 #define FAIL_CONTROL_PRIV_UNPRIV 0x1 /* * FAIL_ID_ID_MASK depends on AID_WIDTH which is platform specific. * Platform should provide the value on initialisation. */ #define FAIL_ID_VNET_SHIFT 24 #define FAIL_ID_VNET_MASK 0xf #define FAIL_ID_ID_SHIFT 0 /* Used along with 'tzc_region_attributes_t' below */ #define REGION_ATTRIBUTES_SEC_SHIFT 30 #define REGION_ATTRIBUTES_F_EN_SHIFT 0 #define REGION_ATTRIBUTES_F_EN_MASK 0xf #define REGION_ID_ACCESS_NSAID_WR_EN_SHIFT 16 #define REGION_ID_ACCESS_NSAID_RD_EN_SHIFT 0 #define REGION_ID_ACCESS_NSAID_ID_MASK 0xf /* Macros for setting Region ID access permissions based on NSAID */ #define TZC_REGION_ACCESS_RD(id) \ ((1 << (id & REGION_ID_ACCESS_NSAID_ID_MASK)) << \ REGION_ID_ACCESS_NSAID_RD_EN_SHIFT) #define TZC_REGION_ACCESS_WR(id) \ ((1 << (id & REGION_ID_ACCESS_NSAID_ID_MASK)) << \ REGION_ID_ACCESS_NSAID_WR_EN_SHIFT) #define TZC_REGION_ACCESS_RDWR(id) \ (TZC_REGION_ACCESS_RD(id) | TZC_REGION_ACCESS_WR(id)) /* Filters are bit mapped 0 to 3. */ #define TZC400_COMPONENT_ID 0xb105f00d /******************************************************************************* * Function & variable prototypes ******************************************************************************/ /* * What type of action is expected when an access violation occurs. * The memory requested is zeroed. But we can also raise and event to * let the system know it happened. * We can raise an interrupt(INT) and/or cause an exception(ERR). * TZC_ACTION_NONE - No interrupt, no Exception * TZC_ACTION_ERR - No interrupt, raise exception -> sync external * data abort * TZC_ACTION_INT - Raise interrupt, no exception * TZC_ACTION_ERR_INT - Raise interrupt, raise exception -> sync * external data abort */ typedef enum { TZC_ACTION_NONE = 0, TZC_ACTION_ERR = 1, TZC_ACTION_INT = 2, TZC_ACTION_ERR_INT = (TZC_ACTION_ERR | TZC_ACTION_INT) } tzc_action_t; /* * Controls secure access to a region. If not enabled secure access is not * allowed to region. */ typedef enum { TZC_REGION_S_NONE = 0, TZC_REGION_S_RD = 1, TZC_REGION_S_WR = 2, TZC_REGION_S_RDWR = (TZC_REGION_S_RD | TZC_REGION_S_WR) } tzc_region_attributes_t; void tzc_init(uint64_t base); void tzc_configure_region(uint32_t filters, uint8_t region, uint64_t region_base, uint64_t region_top, tzc_region_attributes_t sec_attr, uint32_t ns_device_access); void tzc_enable_filters(void); void tzc_disable_filters(void); void tzc_set_action(tzc_action_t action); #endif /* __TZC400__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/console.h000066400000000000000000000034121322600646200231200ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CONSOLE_H__ #define __CONSOLE_H__ int console_init(unsigned long base_addr, unsigned int uart_clk, unsigned int baud_rate); int console_exit(void); int console_putc(int c); int console_getc(void); #endif /* __CONSOLE_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/io/000077500000000000000000000000001322600646200217145ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/drivers/io/io_driver.h000066400000000000000000000061621322600646200240540ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __IO_DRIVER_H__ #define __IO_DRIVER_H__ #include #include /* Generic IO entity structure,representing an accessible IO construct on the * device, such as a file */ typedef struct io_entity { struct io_dev_info *dev_handle; uintptr_t info; } io_entity_t; /* Device info structure, providing device-specific functions and a means of * adding driver-specific state */ typedef struct io_dev_info { const struct io_dev_funcs *funcs; uintptr_t info; } io_dev_info_t; /* Structure used to create a connection to a type of device */ typedef struct io_dev_connector { /* dev_open opens a connection to a particular device driver */ int (*dev_open)(const uintptr_t dev_spec, io_dev_info_t **dev_info); } io_dev_connector_t; /* Structure to hold device driver function pointers */ typedef struct io_dev_funcs { io_type_t (*type)(void); int (*open)(io_dev_info_t *dev_info, const uintptr_t spec, io_entity_t *entity); int (*seek)(io_entity_t *entity, int mode, ssize_t offset); int (*size)(io_entity_t *entity, size_t *length); int (*read)(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read); int (*write)(io_entity_t *entity, const uintptr_t buffer, size_t length, size_t *length_written); int (*close)(io_entity_t *entity); int (*dev_init)(io_dev_info_t *dev_info, const uintptr_t init_params); int (*dev_close)(io_dev_info_t *dev_info); } io_dev_funcs_t; /* Operations intended to be performed during platform initialisation */ /* Register an IO device */ int io_register_device(const io_dev_info_t *dev_info); #endif /* __IO_DRIVER_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/io/io_fip.h000066400000000000000000000032671322600646200233420ustar00rootroot00000000000000/* * Copyright (c) 2014 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __IO_FIP_H__ #define __IO_FIP_H__ struct io_dev_connector; int register_io_dev_fip(const struct io_dev_connector **dev_con); #endif /* __IO_FIP_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/io/io_memmap.h000066400000000000000000000033041322600646200240300ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __IO_MEMMAP_H__ #define __IO_MEMMAP_H__ struct io_dev_connector; int register_io_dev_memmap(const struct io_dev_connector **dev_con); #endif /* __IO_MEMMAP_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/io/io_semihosting.h000066400000000000000000000032641322600646200251120ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __IO_SH_H__ #define __IO_SH_H__ struct io_dev_connector; int register_io_dev_sh(const struct io_dev_connector **dev_con); #endif /* __IO_SH_H__ */ arm-trusted-firmware-1.0-aw-6/include/drivers/io/io_storage.h000066400000000000000000000072311322600646200242230ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __IO_H__ #define __IO_H__ #include #include /* For ssize_t */ /* Device type which can be used to enable policy decisions about which device * to access */ typedef enum { IO_TYPE_INVALID, IO_TYPE_SEMIHOSTING, IO_TYPE_MEMMAP, IO_TYPE_FIRMWARE_IMAGE_PACKAGE, IO_TYPE_MAX } io_type_t; /* Modes used when seeking data on a supported device */ typedef enum { IO_SEEK_INVALID, IO_SEEK_SET, IO_SEEK_END, IO_SEEK_CUR, IO_SEEK_MAX } io_seek_mode_t; /* Connector type, providing a means of identifying a device to open */ struct io_dev_connector; /* File specification - used to refer to data on a device supporting file-like * entities */ typedef struct io_file_spec { const char *path; unsigned int mode; } io_file_spec_t; /* Block specification - used to refer to data on a device supporting * block-like entities */ typedef struct io_block_spec { size_t offset; size_t length; } io_block_spec_t; /* Access modes used when accessing data on a device */ #define IO_MODE_INVALID (0) #define IO_MODE_RO (1 << 0) #define IO_MODE_RW (1 << 1) /* Return codes reported by 'io_*' APIs */ #define IO_SUCCESS (0) #define IO_FAIL (-1) #define IO_NOT_SUPPORTED (-2) #define IO_RESOURCES_EXHAUSTED (-3) /* Open a connection to a device */ int io_dev_open(const struct io_dev_connector *dev_con, const uintptr_t dev_spec, uintptr_t *dev_handle); /* Initialise a device explicitly - to permit lazy initialisation or * re-initialisation */ int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params); /* TODO: Consider whether an explicit "shutdown" API should be included */ /* Close a connection to a device */ int io_dev_close(uintptr_t dev_handle); /* Synchronous operations */ int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle); int io_seek(uintptr_t handle, io_seek_mode_t mode, ssize_t offset); int io_size(uintptr_t handle, size_t *length); int io_read(uintptr_t handle, uintptr_t buffer, size_t length, size_t *length_read); int io_write(uintptr_t handle, const uintptr_t buffer, size_t length, size_t *length_written); int io_close(uintptr_t handle); #endif /* __IO_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/000077500000000000000000000000001322600646200203755ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/lib/aarch64/000077500000000000000000000000001322600646200216255ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/lib/aarch64/arch.h000066400000000000000000000330021322600646200227110ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __ARCH_H__ #define __ARCH_H__ /******************************************************************************* * MIDR bit definitions ******************************************************************************/ #define MIDR_IMPL_MASK 0xff #define MIDR_IMPL_SHIFT 0x18 #define MIDR_VAR_SHIFT 20 #define MIDR_REV_SHIFT 0 #define MIDR_PN_MASK 0xfff #define MIDR_PN_SHIFT 0x4 /******************************************************************************* * MPIDR macros ******************************************************************************/ #define MPIDR_CPU_MASK MPIDR_AFFLVL_MASK #define MPIDR_CLUSTER_MASK MPIDR_AFFLVL_MASK << MPIDR_AFFINITY_BITS #define MPIDR_AFFINITY_BITS 8 #define MPIDR_AFFLVL_MASK 0xff #define MPIDR_AFF0_SHIFT 0 #define MPIDR_AFF1_SHIFT 8 #define MPIDR_AFF2_SHIFT 16 #define MPIDR_AFF3_SHIFT 32 #define MPIDR_AFFINITY_MASK 0xff00ffffff #define MPIDR_AFFLVL_SHIFT 3 #define MPIDR_AFFLVL0 0 #define MPIDR_AFFLVL1 1 #define MPIDR_AFFLVL2 2 #define MPIDR_AFFLVL3 3 /* TODO: Support only the first 3 affinity levels for now */ #define MPIDR_MAX_AFFLVL 2 /* Constant to highlight the assumption that MPIDR allocation starts from 0 */ #define FIRST_MPIDR 0 /******************************************************************************* * Definitions for CPU system register interface to GICv3 ******************************************************************************/ #define ICC_SRE_EL1 S3_0_C12_C12_5 #define ICC_SRE_EL2 S3_4_C12_C9_5 #define ICC_SRE_EL3 S3_6_C12_C12_5 #define ICC_CTLR_EL1 S3_0_C12_C12_4 #define ICC_CTLR_EL3 S3_6_C12_C12_4 #define ICC_PMR_EL1 S3_0_C4_C6_0 /******************************************************************************* * Generic timer memory mapped registers & offsets ******************************************************************************/ #define CNTCR_OFF 0x000 #define CNTFID_OFF 0x020 #define CNTCR_EN (1 << 0) #define CNTCR_HDBG (1 << 1) #define CNTCR_FCREQ(x) ((x) << 8) /******************************************************************************* * System register bit definitions ******************************************************************************/ /* CLIDR definitions */ #define LOUIS_SHIFT 21 #define LOC_SHIFT 24 #define CLIDR_FIELD_WIDTH 3 /* CSSELR definitions */ #define LEVEL_SHIFT 1 /* D$ set/way op type defines */ #define DCISW 0x0 #define DCCISW 0x1 #define DCCSW 0x2 /* ID_AA64PFR0_EL1 definitions */ #define ID_AA64PFR0_EL0_SHIFT 0 #define ID_AA64PFR0_EL1_SHIFT 4 #define ID_AA64PFR0_EL2_SHIFT 8 #define ID_AA64PFR0_EL3_SHIFT 12 #define ID_AA64PFR0_ELX_MASK 0xf /* ID_PFR1_EL1 definitions */ #define ID_PFR1_VIRTEXT_SHIFT 12 #define ID_PFR1_VIRTEXT_MASK 0xf #define GET_VIRT_EXT(id) ((id >> ID_PFR1_VIRTEXT_SHIFT) \ & ID_PFR1_VIRTEXT_MASK) /* SCTLR definitions */ #define SCTLR_EL2_RES1 ((1 << 29) | (1 << 28) | (1 << 23) | (1 << 22) | \ (1 << 18) | (1 << 16) | (1 << 11) | (1 << 5) | \ (1 << 4)) #define SCTLR_EL1_RES1 ((1 << 29) | (1 << 28) | (1 << 23) | (1 << 22) | \ (1 << 11)) #define SCTLR_M_BIT (1 << 0) #define SCTLR_A_BIT (1 << 1) #define SCTLR_C_BIT (1 << 2) #define SCTLR_SA_BIT (1 << 3) #define SCTLR_I_BIT (1 << 12) #define SCTLR_WXN_BIT (1 << 19) #define SCTLR_EE_BIT (1 << 25) /* CPACR_El1 definitions */ #define CPACR_EL1_FPEN(x) (x << 20) #define CPACR_EL1_FP_TRAP_EL0 0x1 #define CPACR_EL1_FP_TRAP_ALL 0x2 #define CPACR_EL1_FP_TRAP_NONE 0x3 /* SCR definitions */ #define SCR_RES1_BITS ((1 << 4) | (1 << 5)) #define SCR_TWE_BIT (1 << 13) #define SCR_TWI_BIT (1 << 12) #define SCR_ST_BIT (1 << 11) #define SCR_RW_BIT (1 << 10) #define SCR_SIF_BIT (1 << 9) #define SCR_HCE_BIT (1 << 8) #define SCR_SMD_BIT (1 << 7) #define SCR_EA_BIT (1 << 3) #define SCR_FIQ_BIT (1 << 2) #define SCR_IRQ_BIT (1 << 1) #define SCR_NS_BIT (1 << 0) #define SCR_VALID_BIT_MASK 0x2f8f /* HCR definitions */ #define HCR_RW_BIT (1ull << 31) #define HCR_AMO_BIT (1 << 5) #define HCR_IMO_BIT (1 << 4) #define HCR_FMO_BIT (1 << 3) /* CNTHCTL_EL2 definitions */ #define EVNTEN_BIT (1 << 2) #define EL1PCEN_BIT (1 << 1) #define EL1PCTEN_BIT (1 << 0) /* CNTKCTL_EL1 definitions */ #define EL0PTEN_BIT (1 << 9) #define EL0VTEN_BIT (1 << 8) #define EL0PCTEN_BIT (1 << 0) #define EL0VCTEN_BIT (1 << 1) #define EVNTEN_BIT (1 << 2) #define EVNTDIR_BIT (1 << 3) #define EVNTI_SHIFT 4 #define EVNTI_MASK 0xf /* CPTR_EL3 definitions */ #define TCPAC_BIT (1 << 31) #define TTA_BIT (1 << 20) #define TFP_BIT (1 << 10) /* CPSR/SPSR definitions */ #define DAIF_FIQ_BIT (1 << 0) #define DAIF_IRQ_BIT (1 << 1) #define DAIF_ABT_BIT (1 << 2) #define DAIF_DBG_BIT (1 << 3) #define SPSR_DAIF_SHIFT 6 #define SPSR_DAIF_MASK 0xf #define SPSR_AIF_SHIFT 6 #define SPSR_AIF_MASK 0x7 #define SPSR_E_SHIFT 9 #define SPSR_E_MASK 0x1 #define SPSR_E_LITTLE 0x0 #define SPSR_E_BIG 0x1 #define SPSR_T_SHIFT 5 #define SPSR_T_MASK 0x1 #define SPSR_T_ARM 0x0 #define SPSR_T_THUMB 0x1 #define DISABLE_ALL_EXCEPTIONS \ (DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT) /* * TCR defintions */ #define TCR_EL3_RES1 ((1UL << 31) | (1UL << 23)) #define TCR_EL1_IPS_SHIFT 32 #define TCR_EL3_PS_SHIFT 16 /* (internal) physical address size bits in EL3/EL1 */ #define TCR_PS_BITS_4GB (0x0) #define TCR_PS_BITS_64GB (0x1) #define TCR_PS_BITS_1TB (0x2) #define TCR_PS_BITS_4TB (0x3) #define TCR_PS_BITS_16TB (0x4) #define TCR_PS_BITS_256TB (0x5) #define ADDR_MASK_48_TO_63 0xFFFF000000000000UL #define ADDR_MASK_44_TO_47 0x0000F00000000000UL #define ADDR_MASK_42_TO_43 0x00000C0000000000UL #define ADDR_MASK_40_TO_41 0x0000030000000000UL #define ADDR_MASK_36_TO_39 0x000000F000000000UL #define ADDR_MASK_32_TO_35 0x0000000F00000000UL #define TCR_RGN_INNER_NC (0x0 << 8) #define TCR_RGN_INNER_WBA (0x1 << 8) #define TCR_RGN_INNER_WT (0x2 << 8) #define TCR_RGN_INNER_WBNA (0x3 << 8) #define TCR_RGN_OUTER_NC (0x0 << 10) #define TCR_RGN_OUTER_WBA (0x1 << 10) #define TCR_RGN_OUTER_WT (0x2 << 10) #define TCR_RGN_OUTER_WBNA (0x3 << 10) #define TCR_SH_NON_SHAREABLE (0x0 << 12) #define TCR_SH_OUTER_SHAREABLE (0x2 << 12) #define TCR_SH_INNER_SHAREABLE (0x3 << 12) #define MODE_SP_SHIFT 0x0 #define MODE_SP_MASK 0x1 #define MODE_SP_EL0 0x0 #define MODE_SP_ELX 0x1 #define MODE_RW_SHIFT 0x4 #define MODE_RW_MASK 0x1 #define MODE_RW_64 0x0 #define MODE_RW_32 0x1 #define MODE_EL_SHIFT 0x2 #define MODE_EL_MASK 0x3 #define MODE_EL3 0x3 #define MODE_EL2 0x2 #define MODE_EL1 0x1 #define MODE_EL0 0x0 #define MODE32_SHIFT 0 #define MODE32_MASK 0xf #define MODE32_usr 0x0 #define MODE32_fiq 0x1 #define MODE32_irq 0x2 #define MODE32_svc 0x3 #define MODE32_mon 0x6 #define MODE32_abt 0x7 #define MODE32_hyp 0xa #define MODE32_und 0xb #define MODE32_sys 0xf #define GET_RW(mode) (((mode) >> MODE_RW_SHIFT) & MODE_RW_MASK) #define GET_EL(mode) (((mode) >> MODE_EL_SHIFT) & MODE_EL_MASK) #define GET_SP(mode) (((mode) >> MODE_SP_SHIFT) & MODE_SP_MASK) #define GET_M32(mode) (((mode) >> MODE32_SHIFT) & MODE32_MASK) #define SPSR_64(el, sp, daif) \ (MODE_RW_64 << MODE_RW_SHIFT | \ ((el) & MODE_EL_MASK) << MODE_EL_SHIFT | \ ((sp) & MODE_SP_MASK) << MODE_SP_SHIFT | \ ((daif) & SPSR_DAIF_MASK) << SPSR_DAIF_SHIFT) #define SPSR_MODE32(mode, isa, endian, aif) \ (MODE_RW_32 << MODE_RW_SHIFT | \ ((mode) & MODE32_MASK) << MODE32_SHIFT | \ ((isa) & SPSR_T_MASK) << SPSR_T_SHIFT | \ ((endian) & SPSR_E_MASK) << SPSR_E_SHIFT | \ ((aif) & SPSR_AIF_MASK) << SPSR_AIF_SHIFT) /* Physical timer control register bit fields shifts and masks */ #define CNTP_CTL_ENABLE_SHIFT 0 #define CNTP_CTL_IMASK_SHIFT 1 #define CNTP_CTL_ISTATUS_SHIFT 2 #define CNTP_CTL_ENABLE_MASK 1 #define CNTP_CTL_IMASK_MASK 1 #define CNTP_CTL_ISTATUS_MASK 1 #define get_cntp_ctl_enable(x) ((x >> CNTP_CTL_ENABLE_SHIFT) & \ CNTP_CTL_ENABLE_MASK) #define get_cntp_ctl_imask(x) ((x >> CNTP_CTL_IMASK_SHIFT) & \ CNTP_CTL_IMASK_MASK) #define get_cntp_ctl_istatus(x) ((x >> CNTP_CTL_ISTATUS_SHIFT) & \ CNTP_CTL_ISTATUS_MASK) #define set_cntp_ctl_enable(x) (x |= 1 << CNTP_CTL_ENABLE_SHIFT) #define set_cntp_ctl_imask(x) (x |= 1 << CNTP_CTL_IMASK_SHIFT) #define clr_cntp_ctl_enable(x) (x &= ~(1 << CNTP_CTL_ENABLE_SHIFT)) #define clr_cntp_ctl_imask(x) (x &= ~(1 << CNTP_CTL_IMASK_SHIFT)) /* Miscellaneous MMU related constants */ #define NUM_2MB_IN_GB (1 << 9) #define NUM_4K_IN_2MB (1 << 9) #define NUM_GB_IN_4GB (1 << 2) #define TWO_MB_SHIFT 21 #define ONE_GB_SHIFT 30 #define FOUR_KB_SHIFT 12 #define ONE_GB_INDEX(x) ((x) >> ONE_GB_SHIFT) #define TWO_MB_INDEX(x) ((x) >> TWO_MB_SHIFT) #define FOUR_KB_INDEX(x) ((x) >> FOUR_KB_SHIFT) #define INVALID_DESC 0x0 #define BLOCK_DESC 0x1 #define TABLE_DESC 0x3 #define FIRST_LEVEL_DESC_N ONE_GB_SHIFT #define SECOND_LEVEL_DESC_N TWO_MB_SHIFT #define THIRD_LEVEL_DESC_N FOUR_KB_SHIFT #define LEVEL1 1 #define LEVEL2 2 #define LEVEL3 3 #define XN (1ull << 2) #define PXN (1ull << 1) #define CONT_HINT (1ull << 0) #define UPPER_ATTRS(x) (x & 0x7) << 52 #define NON_GLOBAL (1 << 9) #define ACCESS_FLAG (1 << 8) #define NSH (0x0 << 6) #define OSH (0x2 << 6) #define ISH (0x3 << 6) #define PAGE_SIZE_SHIFT FOUR_KB_SHIFT #define PAGE_SIZE (1 << PAGE_SIZE_SHIFT) #define PAGE_SIZE_MASK (PAGE_SIZE - 1) #define IS_PAGE_ALIGNED(addr) (((addr) & PAGE_SIZE_MASK) == 0) #define XLAT_ENTRY_SIZE_SHIFT 3 /* Each MMU table entry is 8 bytes (1 << 3) */ #define XLAT_ENTRY_SIZE (1 << XLAT_ENTRY_SIZE_SHIFT) #define XLAT_TABLE_SIZE_SHIFT PAGE_SIZE_SHIFT #define XLAT_TABLE_SIZE (1 << XLAT_TABLE_SIZE_SHIFT) /* Values for number of entries in each MMU translation table */ #define XLAT_TABLE_ENTRIES_SHIFT (XLAT_TABLE_SIZE_SHIFT - XLAT_ENTRY_SIZE_SHIFT) #define XLAT_TABLE_ENTRIES (1 << XLAT_TABLE_ENTRIES_SHIFT) #define XLAT_TABLE_ENTRIES_MASK (XLAT_TABLE_ENTRIES - 1) /* Values to convert a memory address to an index into a translation table */ #define L3_XLAT_ADDRESS_SHIFT PAGE_SIZE_SHIFT #define L2_XLAT_ADDRESS_SHIFT (L3_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT) #define L1_XLAT_ADDRESS_SHIFT (L2_XLAT_ADDRESS_SHIFT + XLAT_TABLE_ENTRIES_SHIFT) /* * AP[1] bit is ignored by hardware and is * treated as if it is One in EL2/EL3 */ #define AP_RO (0x1 << 5) #define AP_RW (0x0 << 5) #define NS (0x1 << 3) #define ATTR_SO_INDEX 0x2 #define ATTR_DEVICE_INDEX 0x1 #define ATTR_IWBWA_OWBWA_NTR_INDEX 0x0 #define LOWER_ATTRS(x) (((x) & 0xfff) << 2) #define ATTR_SO (0x0) #define ATTR_DEVICE (0x4) #define ATTR_IWBWA_OWBWA_NTR (0xff) #define MAIR_ATTR_SET(attr, index) (attr << (index << 3)) /* Exception Syndrome register bits and bobs */ #define ESR_EC_SHIFT 26 #define ESR_EC_MASK 0x3f #define ESR_EC_LENGTH 6 #define EC_UNKNOWN 0x0 #define EC_WFE_WFI 0x1 #define EC_AARCH32_CP15_MRC_MCR 0x3 #define EC_AARCH32_CP15_MRRC_MCRR 0x4 #define EC_AARCH32_CP14_MRC_MCR 0x5 #define EC_AARCH32_CP14_LDC_STC 0x6 #define EC_FP_SIMD 0x7 #define EC_AARCH32_CP10_MRC 0x8 #define EC_AARCH32_CP14_MRRC_MCRR 0xc #define EC_ILLEGAL 0xe #define EC_AARCH32_SVC 0x11 #define EC_AARCH32_HVC 0x12 #define EC_AARCH32_SMC 0x13 #define EC_AARCH64_SVC 0x15 #define EC_AARCH64_HVC 0x16 #define EC_AARCH64_SMC 0x17 #define EC_AARCH64_SYS 0x18 #define EC_IABORT_LOWER_EL 0x20 #define EC_IABORT_CUR_EL 0x21 #define EC_PC_ALIGN 0x22 #define EC_DABORT_LOWER_EL 0x24 #define EC_DABORT_CUR_EL 0x25 #define EC_SP_ALIGN 0x26 #define EC_AARCH32_FP 0x28 #define EC_AARCH64_FP 0x2c #define EC_SERROR 0x2f #define EC_BITS(x) (x >> ESR_EC_SHIFT) & ESR_EC_MASK /******************************************************************************* * Definitions of register offsets and fields in the CNTCTLBase Frame of the * system level implementation of the Generic Timer. ******************************************************************************/ #define CNTNSAR 0x4 #define CNTNSAR_NS_SHIFT(x) x #define CNTACR_BASE(x) (0x40 + (x << 2)) #define CNTACR_RPCT_SHIFT 0x0 #define CNTACR_RVCT_SHIFT 0x1 #define CNTACR_RFRQ_SHIFT 0x2 #define CNTACR_RVOFF_SHIFT 0x3 #define CNTACR_RWVT_SHIFT 0x4 #define CNTACR_RWPT_SHIFT 0x5 #endif /* __ARCH_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/aarch64/arch_helpers.h000066400000000000000000000241151322600646200244400ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __ARCH_HELPERS_H__ #define __ARCH_HELPERS_H__ #include /* for additional register definitions */ #include /* For __dead2 */ #include /********************************************************************** * Macros which create inline functions to read or write CPU system * registers *********************************************************************/ #define _DEFINE_SYSREG_READ_FUNC(_name, _reg_name) \ static inline uint64_t read_ ## _name(void) \ { \ uint64_t v; \ __asm__ volatile ("mrs %0, " #_reg_name : "=r" (v)); \ return v; \ } #define _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name) \ static inline void write_ ## _name(uint64_t v) \ { \ __asm__ volatile ("msr " #_reg_name ", %0" : : "r" (v)); \ } #define _DEFINE_SYSREG_WRITE_CONST_FUNC(_name, _reg_name) \ static inline void write_ ## _name(const uint64_t v) \ { \ __asm__ volatile ("msr " #_reg_name ", %0" : : "i" (v)); \ } /* Define read function for system register */ #define DEFINE_SYSREG_READ_FUNC(_name) \ _DEFINE_SYSREG_READ_FUNC(_name, _name) /* Define read & write function for system register */ #define DEFINE_SYSREG_RW_FUNCS(_name) \ _DEFINE_SYSREG_READ_FUNC(_name, _name) \ _DEFINE_SYSREG_WRITE_FUNC(_name, _name) /* Define read & write function for renamed system register */ #define DEFINE_RENAME_SYSREG_RW_FUNCS(_name, _reg_name) \ _DEFINE_SYSREG_READ_FUNC(_name, _reg_name) \ _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name) /* Define write function for special system registers */ #define DEFINE_SYSREG_WRITE_CONST_FUNC(_name) \ _DEFINE_SYSREG_WRITE_CONST_FUNC(_name, _name) /********************************************************************** * Macros to create inline functions for system instructions *********************************************************************/ /* Define function for simple system instruction */ #define DEFINE_SYSOP_FUNC(_op) \ static inline void _op(void) \ { \ __asm__ (#_op); \ } /* Define function for system instruction with type specifier */ #define DEFINE_SYSOP_TYPE_FUNC(_op, _type) \ static inline void _op ## _type(void) \ { \ __asm__ (#_op " " #_type); \ } /* Define function for system instruction with register parameter */ #define DEFINE_SYSOP_TYPE_PARAM_FUNC(_op, _type) \ static inline void _op ## _type(uint64_t v) \ { \ __asm__ (#_op " " #_type ", %0" : : "r" (v)); \ } /******************************************************************************* * Aarch64 translation tables manipulation helper prototypes ******************************************************************************/ uint64_t create_table_desc(uint64_t *next_table_ptr); uint64_t create_block_desc(uint64_t desc, uint64_t addr, uint32_t level); uint64_t create_device_block(uint64_t output_addr, uint32_t level, uint32_t ns); uint64_t create_romem_block(uint64_t output_addr, uint32_t level, uint32_t ns); uint64_t create_rwmem_block(uint64_t output_addr, uint32_t level, uint32_t ns); /******************************************************************************* * TLB maintenance accessor prototypes ******************************************************************************/ DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2is) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3) DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3is) DEFINE_SYSOP_TYPE_FUNC(tlbi, vmalle1) /******************************************************************************* * Cache maintenance accessor prototypes ******************************************************************************/ DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, isw) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cisw) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, csw) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvac) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, ivac) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, civac) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvau) DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, zva) void flush_dcache_range(uint64_t, uint64_t); void inv_dcache_range(uint64_t, uint64_t); void dcsw_op_louis(uint32_t); void dcsw_op_all(uint32_t); void disable_mmu_el3(void); void disable_mmu_icache_el3(void); /******************************************************************************* * Misc. accessor prototypes ******************************************************************************/ DEFINE_SYSREG_WRITE_CONST_FUNC(daifset) DEFINE_SYSREG_WRITE_CONST_FUNC(daifclr) #define enable_irq() write_daifclr(DAIF_IRQ_BIT) #define enable_fiq() write_daifclr(DAIF_FIQ_BIT) #define enable_serror() write_daifclr(DAIF_ABT_BIT) #define enable_debug_exceptions() write_daifclr(DAIF_DBG_BIT) #define disable_irq() write_daifset(DAIF_IRQ_BIT) #define disable_fiq() write_daifset(DAIF_FIQ_BIT) #define disable_serror() write_daifset(DAIF_ABT_BIT) #define disable_debug_exceptions() write_daifset(DAIF_DBG_BIT) DEFINE_SYSREG_READ_FUNC(id_pfr1_el1) DEFINE_SYSREG_READ_FUNC(id_aa64pfr0_el1) DEFINE_SYSREG_READ_FUNC(CurrentEl) DEFINE_SYSREG_RW_FUNCS(daif) DEFINE_SYSREG_RW_FUNCS(spsr_el1) DEFINE_SYSREG_RW_FUNCS(spsr_el2) DEFINE_SYSREG_RW_FUNCS(spsr_el3) DEFINE_SYSREG_RW_FUNCS(elr_el1) DEFINE_SYSREG_RW_FUNCS(elr_el2) DEFINE_SYSREG_RW_FUNCS(elr_el3) DEFINE_SYSOP_FUNC(wfi) DEFINE_SYSOP_FUNC(wfe) DEFINE_SYSOP_FUNC(sev) DEFINE_SYSOP_TYPE_FUNC(dsb, sy) DEFINE_SYSOP_FUNC(isb) uint32_t get_afflvl_shift(uint32_t); uint32_t mpidr_mask_lower_afflvls(uint64_t, uint32_t); void __dead2 eret(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7); void __dead2 smc(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7); /******************************************************************************* * System register accessor prototypes ******************************************************************************/ DEFINE_SYSREG_READ_FUNC(midr_el1) DEFINE_SYSREG_READ_FUNC(mpidr_el1) DEFINE_SYSREG_RW_FUNCS(scr_el3) DEFINE_SYSREG_RW_FUNCS(hcr_el2) DEFINE_SYSREG_RW_FUNCS(vbar_el1) DEFINE_SYSREG_RW_FUNCS(vbar_el2) DEFINE_SYSREG_RW_FUNCS(vbar_el3) DEFINE_SYSREG_RW_FUNCS(sctlr_el1) DEFINE_SYSREG_RW_FUNCS(sctlr_el2) DEFINE_SYSREG_RW_FUNCS(sctlr_el3) DEFINE_SYSREG_RW_FUNCS(actlr_el1) DEFINE_SYSREG_RW_FUNCS(actlr_el2) DEFINE_SYSREG_RW_FUNCS(actlr_el3) DEFINE_SYSREG_RW_FUNCS(esr_el1) DEFINE_SYSREG_RW_FUNCS(esr_el2) DEFINE_SYSREG_RW_FUNCS(esr_el3) DEFINE_SYSREG_RW_FUNCS(afsr0_el1) DEFINE_SYSREG_RW_FUNCS(afsr0_el2) DEFINE_SYSREG_RW_FUNCS(afsr0_el3) DEFINE_SYSREG_RW_FUNCS(afsr1_el1) DEFINE_SYSREG_RW_FUNCS(afsr1_el2) DEFINE_SYSREG_RW_FUNCS(afsr1_el3) DEFINE_SYSREG_RW_FUNCS(far_el1) DEFINE_SYSREG_RW_FUNCS(far_el2) DEFINE_SYSREG_RW_FUNCS(far_el3) DEFINE_SYSREG_RW_FUNCS(mair_el1) DEFINE_SYSREG_RW_FUNCS(mair_el2) DEFINE_SYSREG_RW_FUNCS(mair_el3) DEFINE_SYSREG_RW_FUNCS(amair_el1) DEFINE_SYSREG_RW_FUNCS(amair_el2) DEFINE_SYSREG_RW_FUNCS(amair_el3) DEFINE_SYSREG_READ_FUNC(rvbar_el1) DEFINE_SYSREG_READ_FUNC(rvbar_el2) DEFINE_SYSREG_READ_FUNC(rvbar_el3) DEFINE_SYSREG_RW_FUNCS(rmr_el1) DEFINE_SYSREG_RW_FUNCS(rmr_el2) DEFINE_SYSREG_RW_FUNCS(rmr_el3) DEFINE_SYSREG_RW_FUNCS(tcr_el1) DEFINE_SYSREG_RW_FUNCS(tcr_el2) DEFINE_SYSREG_RW_FUNCS(tcr_el3) DEFINE_SYSREG_RW_FUNCS(ttbr0_el1) DEFINE_SYSREG_RW_FUNCS(ttbr0_el2) DEFINE_SYSREG_RW_FUNCS(ttbr0_el3) DEFINE_SYSREG_RW_FUNCS(ttbr1_el1) DEFINE_SYSREG_RW_FUNCS(cptr_el2) DEFINE_SYSREG_RW_FUNCS(cptr_el3) DEFINE_SYSREG_RW_FUNCS(cpacr_el1) DEFINE_SYSREG_RW_FUNCS(cntfrq_el0) DEFINE_SYSREG_RW_FUNCS(cntps_ctl_el1) DEFINE_SYSREG_RW_FUNCS(cntps_tval_el1) DEFINE_SYSREG_RW_FUNCS(cntps_cval_el1) DEFINE_SYSREG_READ_FUNC(cntpct_el0) DEFINE_SYSREG_RW_FUNCS(cnthctl_el2) DEFINE_SYSREG_RW_FUNCS(tpidr_el3) DEFINE_SYSREG_RW_FUNCS(vpidr_el2) DEFINE_SYSREG_RW_FUNCS(vmpidr_el2) /* GICv3 System Registers */ DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1) DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el2, ICC_SRE_EL2) DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el3, ICC_SRE_EL3) DEFINE_RENAME_SYSREG_RW_FUNCS(icc_pmr_el1, ICC_PMR_EL1) #define IS_IN_EL(x) \ (GET_EL(read_CurrentEl()) == MODE_EL##x) #define IS_IN_EL1() IS_IN_EL(1) #define IS_IN_EL3() IS_IN_EL(3) /* Previously defined accesor functions with incomplete register names */ #define read_current_el() read_CurrentEl() #define dsb() dsbsy() #define read_midr() read_midr_el1() #define read_mpidr() read_mpidr_el1() #define read_scr() read_scr_el3() #define write_scr(_v) write_scr_el3(_v) #define read_hcr() read_hcr_el2() #define write_hcr(_v) write_hcr_el2(_v) #define read_cpacr() read_cpacr_el1() #define write_cpacr(_v) write_cpacr_el1(_v) #endif /* __ARCH_HELPERS_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/aarch64/xlat_tables.h000066400000000000000000000052771322600646200243130ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __XLAT_TABLES_H__ #define __XLAT_TABLES_H__ /* * Flags to override default values used to program system registers while * enabling the MMU. */ #define DISABLE_DCACHE (1 << 0) #ifndef __ASSEMBLY__ #include /* * Flags for building up memory mapping attributes. * These are organised so that a clear bit gives a more restrictive mapping * that a set bit, that way a bitwise-and two sets of attributes will never give * an attribute which has greater access rights that any of the original * attributes. */ typedef enum { MT_DEVICE = 0 << 0, MT_MEMORY = 1 << 0, MT_RO = 0 << 1, MT_RW = 1 << 1, MT_SECURE = 0 << 2, MT_NS = 1 << 2 } mmap_attr_t; /* * Structure for specifying a single region of memory. */ typedef struct mmap_region { unsigned long base_pa; unsigned long base_va; unsigned long size; mmap_attr_t attr; } mmap_region_t; void mmap_add_region(unsigned long base_pa, unsigned long base_va, unsigned long size, unsigned attr); void mmap_add(const mmap_region_t *mm); void init_xlat_tables(void); void enable_mmu_el1(uint32_t flags); void enable_mmu_el3(uint32_t flags); #endif /*__ASSEMBLY__*/ #endif /* __XLAT_TABLES_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/bakery_lock.h000066400000000000000000000040501322600646200230320ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BAKERY_LOCK_H__ #define __BAKERY_LOCK_H__ #include #define BAKERY_LOCK_MAX_CPUS PLATFORM_CORE_COUNT typedef struct bakery_lock { int owner; volatile char entering[BAKERY_LOCK_MAX_CPUS]; volatile unsigned number[BAKERY_LOCK_MAX_CPUS]; } bakery_lock_t; #define NO_OWNER (-1) void bakery_lock_init(bakery_lock_t *bakery); void bakery_lock_get(bakery_lock_t *bakery); void bakery_lock_release(bakery_lock_t *bakery); int bakery_lock_try(bakery_lock_t *bakery); #endif /* __BAKERY_LOCK_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/cassert.h000066400000000000000000000040731322600646200222160ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CASSERT_H__ #define __CASSERT_H__ /******************************************************************************* * Macro to flag a compile time assertion. It uses the preprocessor to generate * an invalid C construct if 'cond' evaluates to false. * The following compilation error is triggered if the assertion fails: * "error: size of array 'msg' is negative" ******************************************************************************/ #define CASSERT(cond, msg) typedef char msg[(cond) ? 1 : -1] #endif /* __CASSERT_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/cpus/000077500000000000000000000000001322600646200213475ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/lib/cpus/aarch64/000077500000000000000000000000001322600646200225775ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/lib/cpus/aarch64/aem_generic.h000066400000000000000000000034021322600646200252050ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __AEM_GENERIC_H__ #define __AEM_GENERIC_H__ /* BASE AEM midr for revision 0 */ #define BASE_AEM_MIDR 0x410FD0F0 /* Foundation AEM midr for revision 0 */ #define FOUNDATION_AEM_MIDR 0x410FD000 #endif /* __AEM_GENERIC_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/cpus/aarch64/cortex_a53.h000066400000000000000000000037521322600646200247330ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CORTEX_A53_H__ #define __CORTEX_A53_H__ /* Cortex-A53 midr for revision 0 */ #define CORTEX_A53_MIDR 0x410FD030 /******************************************************************************* * CPU Extended Control register specific definitions. ******************************************************************************/ #define CPUECTLR_EL1 S3_1_C15_C2_1 /* Instruction def. */ #define CPUECTLR_SMP_BIT (1 << 6) #endif /* __CORTEX_A53_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/cpus/aarch64/cortex_a57.h000066400000000000000000000056431322600646200247400ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __CORTEX_A57_H__ #define __CORTEX_A57_H__ /* Cortex-A57 midr for revision 0 */ #define CORTEX_A57_MIDR 0x410FD070 /******************************************************************************* * CPU Extended Control register specific definitions. ******************************************************************************/ #define CPUECTLR_EL1 S3_1_C15_C2_1 /* Instruction def. */ #define CPUECTLR_SMP_BIT (1 << 6) #define CPUECTLR_DIS_TWD_ACC_PFTCH_BIT (1 << 38) #define CPUECTLR_L2_IPFTCH_DIST_MASK (0x3 << 35) #define CPUECTLR_L2_DPFTCH_DIST_MASK (0x3 << 32) /******************************************************************************* * CPU Auxiliary Control register specific definitions. ******************************************************************************/ #define CPUACTLR_EL1 S3_1_C15_C2_0 /* Instruction def. */ #define CPUACTLR_NO_ALLOC_WBWA (1 << 49) #define CPUACTLR_DCC_AS_DCCI (1 << 44) /******************************************************************************* * L2 Control register specific definitions. ******************************************************************************/ #define L2CTLR_EL1 S3_1_C11_C0_2 /* Instruction def. */ #define L2CTLR_DATA_RAM_LATENCY_SHIFT 0 #define L2CTLR_TAG_RAM_LATENCY_SHIFT 6 #define L2_DATA_RAM_LATENCY_3_CYCLES 0x2 #define L2_TAG_RAM_LATENCY_3_CYCLES 0x2 #endif /* __CORTEX_A57_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/cpus/aarch64/cpu_macros.S000066400000000000000000000054551322600646200250670ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #define CPU_IMPL_PN_MASK (MIDR_IMPL_MASK << MIDR_IMPL_SHIFT) | \ (MIDR_PN_MASK << MIDR_PN_SHIFT) /* * Define the offsets to the fields in cpu_ops structure. */ .struct 0 CPU_MIDR: /* cpu_ops midr */ .space 8 /* Reset fn is needed in BL at reset vector */ #if IMAGE_BL1 || (IMAGE_BL31 && RESET_TO_BL31) CPU_RESET_FUNC: /* cpu_ops reset_func */ .space 8 #endif #if IMAGE_BL31 /* The power down core and cluster is needed only in BL3-1 */ CPU_PWR_DWN_CORE: /* cpu_ops core_pwr_dwn */ .space 8 CPU_PWR_DWN_CLUSTER: /* cpu_ops cluster_pwr_dwn */ .space 8 #endif #if (IMAGE_BL31 && CRASH_REPORTING) CPU_REG_DUMP: /* cpu specific register dump for crash reporting */ .space 8 #endif CPU_OPS_SIZE = . /* * Convenience macro to declare cpu_ops structure. * Make sure the structure fields are as per the offsets * defined above. */ .macro declare_cpu_ops _name:req, _midr:req, _noresetfunc = 0 .section cpu_ops, "a"; .align 3 .type cpu_ops_\_name, %object .quad \_midr #if IMAGE_BL1 || (IMAGE_BL31 && RESET_TO_BL31) .if \_noresetfunc .quad 0 .else .quad \_name\()_reset_func .endif #endif #if IMAGE_BL31 .quad \_name\()_core_pwr_dwn .quad \_name\()_cluster_pwr_dwn #endif #if (IMAGE_BL31 && CRASH_REPORTING) .quad \_name\()_cpu_reg_dump #endif .endm arm-trusted-firmware-1.0-aw-6/include/lib/mmio.h000066400000000000000000000042731322600646200215150ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __MMIO_H__ #define __MMIO_H__ #include static inline void mmio_write_8(uintptr_t addr, uint8_t value) { *(volatile uint8_t*)addr = value; } static inline uint8_t mmio_read_8(uintptr_t addr) { return *(volatile uint8_t*)addr; } static inline void mmio_write_32(uintptr_t addr, uint32_t value) { *(volatile uint32_t*)addr = value; } static inline uint32_t mmio_read_32(uintptr_t addr) { return *(volatile uint32_t*)addr; } static inline void mmio_write_64(uintptr_t addr, uint64_t value) { *(volatile uint64_t*)addr = value; } static inline uint64_t mmio_read_64(uintptr_t addr) { return *(volatile uint64_t*)addr; } #endif /* __MMIO_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/semihosting.h000066400000000000000000000064521322600646200231060ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SEMIHOSTING_H__ #define __SEMIHOSTING_H__ #include #include /* For ssize_t */ #define SEMIHOSTING_SYS_OPEN 0x01 #define SEMIHOSTING_SYS_CLOSE 0x02 #define SEMIHOSTING_SYS_WRITE0 0x04 #define SEMIHOSTING_SYS_WRITEC 0x03 #define SEMIHOSTING_SYS_WRITE 0x05 #define SEMIHOSTING_SYS_READ 0x06 #define SEMIHOSTING_SYS_READC 0x07 #define SEMIHOSTING_SYS_SEEK 0x0A #define SEMIHOSTING_SYS_FLEN 0x0C #define SEMIHOSTING_SYS_REMOVE 0x0E #define SEMIHOSTING_SYS_SYSTEM 0x12 #define SEMIHOSTING_SYS_ERRNO 0x13 #define FOPEN_MODE_R 0x0 #define FOPEN_MODE_RB 0x1 #define FOPEN_MODE_RPLUS 0x2 #define FOPEN_MODE_RPLUSB 0x3 #define FOPEN_MODE_W 0x4 #define FOPEN_MODE_WB 0x5 #define FOPEN_MODE_WPLUS 0x6 #define FOPEN_MODE_WPLUSB 0x7 #define FOPEN_MODE_A 0x8 #define FOPEN_MODE_AB 0x9 #define FOPEN_MODE_APLUS 0xa #define FOPEN_MODE_APLUSB 0xb long semihosting_connection_supported(void); long semihosting_file_open(const char *file_name, size_t mode); long semihosting_file_seek(long file_handle, ssize_t offset); long semihosting_file_read(long file_handle, size_t *length, uintptr_t buffer); long semihosting_file_write(long file_handle, size_t *length, const uintptr_t buffer); long semihosting_file_close(long file_handle); long semihosting_file_length(long file_handle); long semihosting_system(char *command_line); long semihosting_get_flen(const char *file_name); long semihosting_download_file(const char *file_name, size_t buf_size, uintptr_t buf); void semihosting_write_char(char character); void semihosting_write_string(char *string); char semihosting_read_char(void); #endif /* __SEMIHOSTING_H__ */ arm-trusted-firmware-1.0-aw-6/include/lib/spinlock.h000066400000000000000000000033631322600646200223750ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SPINLOCK_H__ #define __SPINLOCK_H__ typedef struct spinlock { volatile unsigned int lock; } spinlock_t; void spin_lock(spinlock_t *lock); void spin_unlock(spinlock_t *lock); #endif /* __SPINLOCK_H__ */ arm-trusted-firmware-1.0-aw-6/include/plat/000077500000000000000000000000001322600646200205675ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/plat/common/000077500000000000000000000000001322600646200220575ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/plat/common/plat_config.h000066400000000000000000000047661322600646200245320ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLAT_CONFIG_H__ #define __PLAT_CONFIG_H__ #define CONFIG_GICC_BASE_OFFSET 0x4 #ifndef __ASSEMBLY__ #include enum plat_config_flags { /* Whether Base FVP memory map is in use */ CONFIG_BASE_MMAP = 0x1, /* Whether CCI should be enabled */ CONFIG_HAS_CCI = 0x2, /* Whether TZC should be configured */ CONFIG_HAS_TZC = 0x4 }; typedef struct plat_config { unsigned int gicd_base; unsigned int gicc_base; unsigned int gich_base; unsigned int gicv_base; unsigned int max_aff0; unsigned int max_aff1; unsigned long flags; } plat_config_t; inline const plat_config_t *get_plat_config(); CASSERT(CONFIG_GICC_BASE_OFFSET == __builtin_offsetof( plat_config_t, gicc_base), assert_gicc_base_offset_mismatch); /* If used, plat_config must be defined and populated in the platform port*/ extern plat_config_t plat_config; inline const plat_config_t *get_plat_config() { return &plat_config; } #endif /* __ASSEMBLY__ */ #endif /* __PLAT_CONFIG_H__ */ arm-trusted-firmware-1.0-aw-6/include/plat/common/platform.h000066400000000000000000000203751322600646200240630ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLATFORM_H__ #define __PLATFORM_H__ #include /******************************************************************************* * Forward declarations ******************************************************************************/ struct plat_pm_ops; struct meminfo; struct image_info; struct entry_point_info; struct bl31_params; /******************************************************************************* * Function declarations ******************************************************************************/ /******************************************************************************* * Mandatory common functions ******************************************************************************/ uint64_t plat_get_syscnt_freq(void); int plat_get_image_source(const char *image_name, uintptr_t *dev_handle, uintptr_t *image_spec); unsigned long plat_get_ns_image_entrypoint(void); /******************************************************************************* * Mandatory interrupt management functions ******************************************************************************/ uint32_t plat_ic_get_pending_interrupt_id(void); uint32_t plat_ic_get_pending_interrupt_type(void); uint32_t plat_ic_acknowledge_interrupt(void); uint32_t plat_ic_get_interrupt_type(uint32_t id); void plat_ic_end_of_interrupt(uint32_t id); uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state); /******************************************************************************* * Optional common functions (may be overridden) ******************************************************************************/ unsigned int platform_get_core_pos(unsigned long mpidr); unsigned long platform_get_stack(unsigned long mpidr); void plat_report_exception(unsigned long); int plat_crash_console_init(void); int plat_crash_console_putc(int c); /******************************************************************************* * Mandatory BL1 functions ******************************************************************************/ void bl1_early_platform_setup(void); void bl1_plat_arch_setup(void); void bl1_platform_setup(void); struct meminfo *bl1_plat_sec_mem_layout(void); /* * This function allows the platform to change the entrypoint information for * BL2, after BL1 has loaded BL2 into memory but before BL2 is executed. */ void bl1_plat_set_bl2_ep_info(struct image_info *image, struct entry_point_info *ep); /******************************************************************************* * Optional BL1 functions (may be overridden) ******************************************************************************/ void bl1_init_bl2_mem_layout(const struct meminfo *bl1_mem_layout, struct meminfo *bl2_mem_layout); /******************************************************************************* * Mandatory BL2 functions ******************************************************************************/ void bl2_early_platform_setup(struct meminfo *mem_layout); void bl2_plat_arch_setup(void); void bl2_platform_setup(void); struct meminfo *bl2_plat_sec_mem_layout(void); /* * This function returns a pointer to the shared memory that the platform has * kept aside to pass trusted firmware related information that BL3-1 * could need */ struct bl31_params *bl2_plat_get_bl31_params(void); /* * This function returns a pointer to the shared memory that the platform * has kept to point to entry point information of BL31 to BL2 */ struct entry_point_info *bl2_plat_get_bl31_ep_info(void); /* * This function flushes to main memory all the params that are * passed to BL3-1 */ void bl2_plat_flush_bl31_params(void); /* * The next 2 functions allow the platform to change the entrypoint information * for the mandatory 3rd level BL images, BL3-1 and BL3-3. This is done after * BL2 has loaded those images into memory but before BL3-1 is executed. */ void bl2_plat_set_bl31_ep_info(struct image_info *image, struct entry_point_info *ep); void bl2_plat_set_bl33_ep_info(struct image_info *image, struct entry_point_info *ep); /* Gets the memory layout for BL3-3 */ void bl2_plat_get_bl33_meminfo(struct meminfo *mem_info); /******************************************************************************* * Conditionally mandatory BL2 functions: must be implemented if BL3-0 image * is supported ******************************************************************************/ /* Gets the memory layout for BL3-0 */ void bl2_plat_get_bl30_meminfo(struct meminfo *mem_info); /* * This function is called after loading BL3-0 image and it is used to perform * any platform-specific actions required to handle the SCP firmware. */ int bl2_plat_handle_bl30(struct image_info *bl30_image_info); /******************************************************************************* * Conditionally mandatory BL2 functions: must be implemented if BL3-2 image * is supported ******************************************************************************/ void bl2_plat_set_bl32_ep_info(struct image_info *image, struct entry_point_info *ep); /* Gets the memory layout for BL3-2 */ void bl2_plat_get_bl32_meminfo(struct meminfo *mem_info); /******************************************************************************* * Optional BL2 functions (may be overridden) ******************************************************************************/ /******************************************************************************* * Mandatory BL3-1 functions ******************************************************************************/ void bl31_early_platform_setup(struct bl31_params *from_bl2, void *plat_params_from_bl2); void bl31_plat_arch_setup(void); void bl31_platform_setup(void); struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type); /******************************************************************************* * Mandatory PSCI functions (BL3-1) ******************************************************************************/ int platform_setup_pm(const struct plat_pm_ops **); int plat_get_max_afflvl(void); unsigned int plat_get_aff_count(unsigned int, unsigned long); unsigned int plat_get_aff_state(unsigned int, unsigned long); /******************************************************************************* * Optional BL3-1 functions (may be overridden) ******************************************************************************/ void bl31_plat_enable_mmu(uint32_t flags); /******************************************************************************* * Optional BL3-2 functions (may be overridden) ******************************************************************************/ void bl32_plat_enable_mmu(uint32_t flags); void platform_smp_init(void); #endif /* __PLATFORM_H__ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/000077500000000000000000000000001322600646200211105ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/stdlib/assert.h000066400000000000000000000047241322600646200225710ustar00rootroot00000000000000/*- * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph * Co. or Unix System Laboratories, Inc. and are reproduced herein with * the permission of UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)assert.h 8.2 (Berkeley) 1/21/94 * $FreeBSD$ */ #include /* * Unlike other ANSI header files, may usefully be included * multiple times, with and without NDEBUG defined. */ #undef assert #undef _assert #ifdef NDEBUG #define assert(e) ((void)0) #define _assert(e) ((void)0) #else #define _assert(e) assert(e) #define assert(e) ((e) ? (void)0 : __assert(__func__, __FILE__, \ __LINE__, #e)) #endif /* NDEBUG */ #ifndef _ASSERT_H_ #define _ASSERT_H_ __BEGIN_DECLS void __assert(const char *, const char *, int, const char *) __dead2; __END_DECLS #endif /* !_ASSERT_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/machine/000077500000000000000000000000001322600646200225145ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/stdlib/machine/_limits.h000066400000000000000000000071741322600646200243360ustar00rootroot00000000000000/*- * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)limits.h 8.3 (Berkeley) 1/4/94 * $FreeBSD$ */ #ifndef _MACHINE__LIMITS_H_ #define _MACHINE__LIMITS_H_ /* * According to ANSI (section 2.2.4.2), the values below must be usable by * #if preprocessing directives. Additionally, the expression must have the * same type as would an expression that is an object of the corresponding * type converted according to the integral promotions. The subtraction for * INT_MIN, etc., is so the value is not unsigned; e.g., 0x80000000 is an * unsigned int for 32-bit two's complement ANSI compilers (section 3.1.3.2). */ #define __CHAR_BIT 8 /* number of bits in a char */ #define __SCHAR_MAX 0x7f /* max value for a signed char */ #define __SCHAR_MIN (-0x7f-1) /* min value for a signed char */ #define __UCHAR_MAX 0xff /* max value for an unsigned char */ #define __USHRT_MAX 0xffff /* max value for an unsigned short */ #define __SHRT_MAX 0x7fff /* max value for a short */ #define __SHRT_MIN (-0x7fff-1) /* min value for a short */ #define __UINT_MAX 0xffffffff /* max value for an unsigned int */ #define __INT_MAX 0x7fffffff /* max value for an int */ #define __INT_MIN (-0x7fffffff-1) /* min value for an int */ #define __ULONG_MAX 0xffffffffffffffff /* max for an unsigned long */ #define __LONG_MAX 0x7fffffffffffffff /* max for a long */ #define __LONG_MIN (-0x7fffffffffffffff-1) /* min for a long */ /* Long longs have the same size but not the same type as longs. */ /* max for an unsigned long long */ #define __ULLONG_MAX 0xffffffffffffffffULL #define __LLONG_MAX 0x7fffffffffffffffLL /* max for a long long */ #define __LLONG_MIN (-0x7fffffffffffffffLL-1) /* min for a long long */ #define __SSIZE_MAX __LONG_MAX /* max value for a ssize_t */ #define __SIZE_T_MAX __ULONG_MAX /* max value for a size_t */ #define __OFF_MAX __LONG_MAX /* max value for an off_t */ #define __OFF_MIN __LONG_MIN /* min value for an off_t */ /* Quads and longs are the same size. Ensure they stay in sync. */ #define __UQUAD_MAX (__ULONG_MAX) /* max value for a uquad_t */ #define __QUAD_MAX (__LONG_MAX) /* max value for a quad_t */ #define __QUAD_MIN (__LONG_MIN) /* min value for a quad_t */ #define __LONG_BIT 64 #define __WORD_BIT 32 /* Minimum signal stack size. */ #define __MINSIGSTKSZ (1024 * 4) #endif /* !_MACHINE__LIMITS_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/machine/_stdint.h000066400000000000000000000117341322600646200243370ustar00rootroot00000000000000/*- * Copyright (c) 2001, 2002 Mike Barcroft * Copyright (c) 2001 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Klaus Klein. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _MACHINE__STDINT_H_ #define _MACHINE__STDINT_H_ #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) #define INT8_C(c) (c) #define INT16_C(c) (c) #define INT32_C(c) (c) #define INT64_C(c) (c ## L) #define UINT8_C(c) (c) #define UINT16_C(c) (c) #define UINT32_C(c) (c ## U) #define UINT64_C(c) (c ## UL) #define INTMAX_C(c) INT64_C(c) #define UINTMAX_C(c) UINT64_C(c) #endif /* !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) */ #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) /* * ISO/IEC 9899:1999 * 7.18.2.1 Limits of exact-width integer types */ /* Minimum values of exact-width signed integer types. */ #define INT8_MIN (-0x7f-1) #define INT16_MIN (-0x7fff-1) #define INT32_MIN (-0x7fffffff-1) #define INT64_MIN (-0x7fffffffffffffffL-1) /* Maximum values of exact-width signed integer types. */ #define INT8_MAX 0x7f #define INT16_MAX 0x7fff #define INT32_MAX 0x7fffffff #define INT64_MAX 0x7fffffffffffffffL /* Maximum values of exact-width unsigned integer types. */ #define UINT8_MAX 0xff #define UINT16_MAX 0xffff #define UINT32_MAX 0xffffffffU #define UINT64_MAX 0xffffffffffffffffUL /* * ISO/IEC 9899:1999 * 7.18.2.2 Limits of minimum-width integer types */ /* Minimum values of minimum-width signed integer types. */ #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST64_MIN INT64_MIN /* Maximum values of minimum-width signed integer types. */ #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MAX INT64_MAX /* Maximum values of minimum-width unsigned integer types. */ #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX /* * ISO/IEC 9899:1999 * 7.18.2.3 Limits of fastest minimum-width integer types */ /* Minimum values of fastest minimum-width signed integer types. */ #define INT_FAST8_MIN INT32_MIN #define INT_FAST16_MIN INT32_MIN #define INT_FAST32_MIN INT32_MIN #define INT_FAST64_MIN INT64_MIN /* Maximum values of fastest minimum-width signed integer types. */ #define INT_FAST8_MAX INT32_MAX #define INT_FAST16_MAX INT32_MAX #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MAX INT64_MAX /* Maximum values of fastest minimum-width unsigned integer types. */ #define UINT_FAST8_MAX UINT32_MAX #define UINT_FAST16_MAX UINT32_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX /* * ISO/IEC 9899:1999 * 7.18.2.4 Limits of integer types capable of holding object pointers */ #define INTPTR_MIN INT64_MIN #define INTPTR_MAX INT64_MAX #define UINTPTR_MAX UINT64_MAX /* * ISO/IEC 9899:1999 * 7.18.2.5 Limits of greatest-width integer types */ #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX /* * ISO/IEC 9899:1999 * 7.18.3 Limits of other integer types */ /* Limits of ptrdiff_t. */ #define PTRDIFF_MIN INT64_MIN #define PTRDIFF_MAX INT64_MAX /* Limits of sig_atomic_t. */ #define SIG_ATOMIC_MIN INT32_MIN #define SIG_ATOMIC_MAX INT32_MAX /* Limit of size_t. */ #define SIZE_MAX UINT64_MAX #ifndef WCHAR_MIN /* Also possibly defined in */ /* Limits of wchar_t. */ #define WCHAR_MIN INT32_MIN #define WCHAR_MAX INT32_MAX #endif /* Limits of wint_t. */ #define WINT_MIN INT32_MIN #define WINT_MAX INT32_MAX #endif /* !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) */ #endif /* !_MACHINE__STDINT_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/machine/_types.h000066400000000000000000000077351322600646200242040ustar00rootroot00000000000000/*- * Copyright (c) 2002 Mike Barcroft * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * From: @(#)ansi.h 8.2 (Berkeley) 1/4/94 * From: @(#)types.h 8.3 (Berkeley) 1/5/94 * $FreeBSD$ */ #ifndef _MACHINE__TYPES_H_ #define _MACHINE__TYPES_H_ #ifndef _SYS_CDEFS_H_ #error this file needs sys/cdefs.h as a prerequisite #endif /* * Basic types upon which most other types are built. */ typedef __signed char __int8_t; typedef unsigned char __uint8_t; typedef short __int16_t; typedef unsigned short __uint16_t; typedef int __int32_t; typedef unsigned int __uint32_t; typedef long __int64_t; typedef unsigned long __uint64_t; /* * Standard type definitions. */ typedef __int32_t __clock_t; /* clock()... */ typedef __int64_t __critical_t; typedef double __double_t; typedef float __float_t; typedef __int64_t __intfptr_t; typedef __int64_t __intmax_t; typedef __int64_t __intptr_t; typedef __int32_t __int_fast8_t; typedef __int32_t __int_fast16_t; typedef __int32_t __int_fast32_t; typedef __int64_t __int_fast64_t; typedef __int8_t __int_least8_t; typedef __int16_t __int_least16_t; typedef __int32_t __int_least32_t; typedef __int64_t __int_least64_t; typedef __int64_t __ptrdiff_t; /* ptr1 - ptr2 */ typedef __int64_t __register_t; typedef __int64_t __segsz_t; /* segment size (in pages) */ typedef __uint64_t __size_t; /* sizeof() */ typedef __int64_t __ssize_t; /* byte count or error */ typedef __int64_t __time_t; /* time()... */ typedef __uint64_t __uintfptr_t; typedef __uint64_t __uintmax_t; typedef __uint64_t __uintptr_t; typedef __uint32_t __uint_fast8_t; typedef __uint32_t __uint_fast16_t; typedef __uint32_t __uint_fast32_t; typedef __uint64_t __uint_fast64_t; typedef __uint8_t __uint_least8_t; typedef __uint16_t __uint_least16_t; typedef __uint32_t __uint_least32_t; typedef __uint64_t __uint_least64_t; typedef __uint64_t __u_register_t; typedef __uint64_t __vm_offset_t; typedef __int64_t __vm_ooffset_t; typedef __uint64_t __vm_paddr_t; typedef __uint64_t __vm_pindex_t; typedef __uint64_t __vm_size_t; /* * Unusual type definitions. */ #ifdef __GNUCLIKE_BUILTIN_VARARGS typedef __builtin_va_list __va_list; /* internally known to gcc */ #else typedef char * __va_list; #endif /* __GNUCLIKE_BUILTIN_VARARGS */ #if defined(__GNUCLIKE_BUILTIN_VAALIST) && !defined(__GNUC_VA_LIST) \ && !defined(__NO_GNUC_VA_LIST) #define __GNUC_VA_LIST typedef __va_list __gnuc_va_list; /* compatibility w/GNU headers*/ #endif #endif /* !_MACHINE__TYPES_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/stddef.h000066400000000000000000000042051322600646200225330ustar00rootroot00000000000000/*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)stddef.h 8.1 (Berkeley) 6/2/93 * * $FreeBSD$ */ #ifndef _STDDEF_H_ #define _STDDEF_H_ #include #include #include typedef __ptrdiff_t ptrdiff_t; #if __BSD_VISIBLE #ifndef _RUNE_T_DECLARED typedef __rune_t rune_t; #define _RUNE_T_DECLARED #endif #endif #ifndef _SIZE_T_DECLARED typedef __size_t size_t; #define _SIZE_T_DECLARED #endif #ifndef __cplusplus #ifndef _WCHAR_T_DECLARED typedef __wchar_t wchar_t; #define _WCHAR_T_DECLARED #endif #endif #define offsetof(type, member) __offsetof(type, member) #endif /* _STDDEF_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/stdio.h000066400000000000000000000050641322600646200224100ustar00rootroot00000000000000/*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)stdio.h 8.5 (Berkeley) 4/29/95 * $FreeBSD$ */ /* * Portions copyright (c) 2013-2014, ARM Limited and Contributors. * All rights reserved. */ #ifndef _STDIO_H_ #define _STDIO_H_ #include #include #include #ifndef _SIZE_T_DECLARED typedef __size_t size_t; #define _SIZE_T_DECLARED #endif #ifndef _SSIZE_T_DECLARED #define _SSIZE_T_DECLARED typedef __ssize_t ssize_t; #endif #define EOF (-1) int printf(const char * __restrict, ...); int putchar(int); int puts(const char *); int sprintf(char * __restrict, const char * __restrict, ...); int vsprintf(char * __restrict, const char * __restrict, __va_list); #if __ISO_C_VISIBLE >= 1999 int snprintf(char * __restrict, size_t, const char * __restrict, ...) __printflike(3, 4); int vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list) __printflike(3, 0); #endif #endif /* !_STDIO_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/string.h000066400000000000000000000045741322600646200226010ustar00rootroot00000000000000/*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)string.h 8.1 (Berkeley) 6/2/93 * $FreeBSD$ */ /* * Portions copyright (c) 2013-2014, ARM Limited and Contributors. * All rights reserved. */ #ifndef _STRING_H_ #define _STRING_H_ #include #include #include #ifndef _SIZE_T_DECLARED typedef __size_t size_t; #define _SIZE_T_DECLARED #endif __BEGIN_DECLS void *memchr(const void *, int, size_t) __pure; int memcmp(const void *, const void *, size_t) __pure; void *memcpy(void * __restrict, const void * __restrict, size_t); void *memmove(void *, const void *, size_t); void *memset(void *, int, size_t); char *strchr(const char *, int) __pure; int strcmp(const char *, const char *) __pure; size_t strlen(const char *) __pure; int strncmp(const char *, const char *, size_t) __pure; __END_DECLS #endif /* _STRING_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/000077500000000000000000000000001322600646200217265ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/_null.h000066400000000000000000000032271322600646200232140ustar00rootroot00000000000000/*- * Copyright (c) 2003 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ */ #ifndef NULL #if !defined(__cplusplus) #define NULL ((void *)0) #else #if __cplusplus >= 201103L #define NULL nullptr #elif defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4 #define NULL __null #else #if defined(__LP64__) #define NULL (0L) #else #define NULL 0 #endif /* __LP64__ */ #endif /* __GNUG__ */ #endif /* !__cplusplus */ #endif arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/_stdint.h000066400000000000000000000045751322600646200235560ustar00rootroot00000000000000/*- * Copyright (c) 2011 David E. O'Brien * Copyright (c) 2001 Mike Barcroft * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _SYS__STDINT_H_ #define _SYS__STDINT_H_ #ifndef _INT8_T_DECLARED typedef __int8_t int8_t; #define _INT8_T_DECLARED #endif #ifndef _INT16_T_DECLARED typedef __int16_t int16_t; #define _INT16_T_DECLARED #endif #ifndef _INT32_T_DECLARED typedef __int32_t int32_t; #define _INT32_T_DECLARED #endif #ifndef _INT64_T_DECLARED typedef __int64_t int64_t; #define _INT64_T_DECLARED #endif #ifndef _UINT8_T_DECLARED typedef __uint8_t uint8_t; #define _UINT8_T_DECLARED #endif #ifndef _UINT16_T_DECLARED typedef __uint16_t uint16_t; #define _UINT16_T_DECLARED #endif #ifndef _UINT32_T_DECLARED typedef __uint32_t uint32_t; #define _UINT32_T_DECLARED #endif #ifndef _UINT64_T_DECLARED typedef __uint64_t uint64_t; #define _UINT64_T_DECLARED #endif #ifndef _INTPTR_T_DECLARED typedef __intptr_t intptr_t; #define _INTPTR_T_DECLARED #endif #ifndef _UINTPTR_T_DECLARED typedef __uintptr_t uintptr_t; #define _UINTPTR_T_DECLARED #endif #endif /* !_SYS__STDINT_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/_types.h000066400000000000000000000106231322600646200234040ustar00rootroot00000000000000/*- * Copyright (c) 2002 Mike Barcroft * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _SYS__TYPES_H_ #define _SYS__TYPES_H_ #include #include /* * Standard type definitions. */ typedef __uint32_t __blksize_t; /* file block size */ typedef __int64_t __blkcnt_t; /* file block count */ typedef __int32_t __clockid_t; /* clock_gettime()... */ typedef __uint64_t __cap_rights_t; /* capability rights */ typedef __uint32_t __fflags_t; /* file flags */ typedef __uint64_t __fsblkcnt_t; typedef __uint64_t __fsfilcnt_t; typedef __uint32_t __gid_t; typedef __int64_t __id_t; /* can hold a gid_t, pid_t, or uid_t */ typedef __uint32_t __ino_t; /* inode number */ typedef long __key_t; /* IPC key (for Sys V IPC) */ typedef __int32_t __lwpid_t; /* Thread ID (a.k.a. LWP) */ typedef __uint16_t __mode_t; /* permissions */ typedef int __accmode_t; /* access permissions */ typedef int __nl_item; typedef __uint16_t __nlink_t; /* link count */ typedef __int64_t __off_t; /* file offset */ typedef __int32_t __pid_t; /* process [group] */ typedef __int64_t __rlim_t; /* resource limit - intentionally */ /* signed, because of legacy code */ /* that uses -1 for RLIM_INFINITY */ typedef __uint8_t __sa_family_t; typedef __uint32_t __socklen_t; typedef long __suseconds_t; /* microseconds (signed) */ typedef struct __timer *__timer_t; /* timer_gettime()... */ typedef struct __mq *__mqd_t; /* mq_open()... */ typedef __uint32_t __uid_t; typedef unsigned int __useconds_t; /* microseconds (unsigned) */ typedef int __cpuwhich_t; /* which parameter for cpuset. */ typedef int __cpulevel_t; /* level parameter for cpuset. */ typedef int __cpusetid_t; /* cpuset identifier. */ /* * Unusual type definitions. */ /* * rune_t is declared to be an ``int'' instead of the more natural * ``unsigned long'' or ``long''. Two things are happening here. It is not * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, * it looks like 10646 will be a 31 bit standard. This means that if your * ints cannot hold 32 bits, you will be in trouble. The reason an int was * chosen over a long is that the is*() and to*() routines take ints (says * ANSI C), but they use __ct_rune_t instead of int. * * NOTE: rune_t is not covered by ANSI nor other standards, and should not * be instantiated outside of lib/libc/locale. Use wchar_t. wchar_t and * rune_t must be the same type. Also, wint_t must be no narrower than * wchar_t, and should be able to hold all members of the largest * character set plus one extra value (WEOF), and must be at least 16 bits. */ typedef int __ct_rune_t; /* arg type for ctype funcs */ typedef __ct_rune_t __rune_t; /* rune_t (see above) */ typedef __ct_rune_t __wchar_t; /* wchar_t (see above) */ typedef __ct_rune_t __wint_t; /* wint_t (see above) */ typedef __uint32_t __dev_t; /* device number */ typedef __uint32_t __fixpt_t; /* fixed point number */ /* * mbstate_t is an opaque object to keep conversion state during multibyte * stream conversions. */ typedef union { char __mbstate8[128]; __int64_t _mbstateL; /* for alignment */ } __mbstate_t; #endif /* !_SYS__TYPES_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/cdefs.h000066400000000000000000000540451322600646200231730ustar00rootroot00000000000000/*- * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Berkeley Software Design, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 * $FreeBSD$ */ #ifndef _SYS_CDEFS_H_ #define _SYS_CDEFS_H_ #if defined(__cplusplus) #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS #define __END_DECLS #endif /* * This code has been put in place to help reduce the addition of * compiler specific defines in FreeBSD code. It helps to aid in * having a compiler-agnostic source tree. */ #if defined(__GNUC__) || defined(__INTEL_COMPILER) #if __GNUC__ >= 3 || defined(__INTEL_COMPILER) #define __GNUCLIKE_ASM 3 #define __GNUCLIKE_MATH_BUILTIN_CONSTANTS #else #define __GNUCLIKE_ASM 2 #endif #define __GNUCLIKE___TYPEOF 1 #define __GNUCLIKE___OFFSETOF 1 #define __GNUCLIKE___SECTION 1 #ifndef __INTEL_COMPILER # define __GNUCLIKE_CTOR_SECTION_HANDLING 1 #endif #define __GNUCLIKE_BUILTIN_CONSTANT_P 1 # if defined(__INTEL_COMPILER) && defined(__cplusplus) \ && __INTEL_COMPILER < 800 # undef __GNUCLIKE_BUILTIN_CONSTANT_P # endif #if (__GNUC_MINOR__ > 95 || __GNUC__ >= 3) && !defined(__INTEL_COMPILER) # define __GNUCLIKE_BUILTIN_VARARGS 1 # define __GNUCLIKE_BUILTIN_STDARG 1 # define __GNUCLIKE_BUILTIN_VAALIST 1 #endif #if defined(__GNUC__) # define __GNUC_VA_LIST_COMPATIBILITY 1 #endif #ifndef __INTEL_COMPILER # define __GNUCLIKE_BUILTIN_NEXT_ARG 1 # define __GNUCLIKE_MATH_BUILTIN_RELOPS #endif #define __GNUCLIKE_BUILTIN_MEMCPY 1 /* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */ #define __CC_SUPPORTS_INLINE 1 #define __CC_SUPPORTS___INLINE 1 #define __CC_SUPPORTS___INLINE__ 1 #define __CC_SUPPORTS___FUNC__ 1 #define __CC_SUPPORTS_WARNING 1 #define __CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */ #define __CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1 #endif /* __GNUC__ || __INTEL_COMPILER */ /* * Macro to test if we're using a specific version of gcc or later. */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) #define __GNUC_PREREQ__(ma, mi) \ (__GNUC__ > (ma) || __GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)) #else #define __GNUC_PREREQ__(ma, mi) 0 #endif /* * The __CONCAT macro is used to concatenate parts of symbol names, e.g. * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI * mode -- there must be no spaces between its arguments, and for nested * __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also * concatenate double-quoted strings produced by the __STRING macro, but * this only works with ANSI C. * * __XSTRING is like __STRING, but it expands any macros in its argument * first. It is only available with ANSI C. */ #if defined(__STDC__) || defined(__cplusplus) #define __P(protos) protos /* full-blown ANSI C */ #define __CONCAT1(x,y) x ## y #define __CONCAT(x,y) __CONCAT1(x,y) #define __STRING(x) #x /* stringify without expanding x */ #define __XSTRING(x) __STRING(x) /* expand x, then stringify */ #define __const const /* define reserved names to standard */ #define __signed signed #define __volatile volatile #if defined(__cplusplus) #define __inline inline /* convert to C++ keyword */ #else #if !(defined(__CC_SUPPORTS___INLINE)) #define __inline /* delete GCC keyword */ #endif /* ! __CC_SUPPORTS___INLINE */ #endif /* !__cplusplus */ #else /* !(__STDC__ || __cplusplus) */ #define __P(protos) () /* traditional C preprocessor */ #define __CONCAT(x,y) x/**/y #define __STRING(x) "x" #if !defined(__CC_SUPPORTS___INLINE) #define __const /* delete pseudo-ANSI C keywords */ #define __inline #define __signed #define __volatile /* * In non-ANSI C environments, new programs will want ANSI-only C keywords * deleted from the program and old programs will want them left alone. * When using a compiler other than gcc, programs using the ANSI C keywords * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. * When using "gcc -traditional", we assume that this is the intent; if * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. */ #ifndef NO_ANSI_KEYWORDS #define const /* delete ANSI C keywords */ #define inline #define signed #define volatile #endif /* !NO_ANSI_KEYWORDS */ #endif /* !__CC_SUPPORTS___INLINE */ #endif /* !(__STDC__ || __cplusplus) */ /* * Compiler-dependent macros to help declare dead (non-returning) and * pure (no side effects) functions, and unused variables. They are * null except for versions of gcc that are known to support the features * properly (old versions of gcc-2 supported the dead and pure features * in a different (wrong) way). If we do not provide an implementation * for a given compiler, let the compile fail if it is told to use * a feature that we cannot live without. */ #ifdef lint #define __dead2 #define __pure2 #define __unused #define __packed #define __aligned(x) #define __section(x) #else #if !__GNUC_PREREQ__(2, 5) && !defined(__INTEL_COMPILER) #define __dead2 #define __pure2 #define __unused #endif #if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 && !defined(__INTEL_COMPILER) #define __dead2 __attribute__((__noreturn__)) #define __pure2 __attribute__((__const__)) #define __unused /* XXX Find out what to do for __packed, __aligned and __section */ #endif #if __GNUC_PREREQ__(2, 7) #define __dead2 __attribute__((__noreturn__)) #define __pure2 __attribute__((__const__)) #define __unused __attribute__((__unused__)) #define __used __attribute__((__used__)) #define __packed __attribute__((__packed__)) #define __aligned(x) __attribute__((__aligned__(x))) #define __section(x) __attribute__((__section__(x))) #endif #if defined(__INTEL_COMPILER) #define __dead2 __attribute__((__noreturn__)) #define __pure2 __attribute__((__const__)) #define __unused __attribute__((__unused__)) #define __used __attribute__((__used__)) #define __packed __attribute__((__packed__)) #define __aligned(x) __attribute__((__aligned__(x))) #define __section(x) __attribute__((__section__(x))) #endif #endif #if !__GNUC_PREREQ__(2, 95) #define __alignof(x) __offsetof(struct { char __a; x __b; }, __b) #endif /* * Keywords added in C11. */ #if defined(__cplusplus) && __cplusplus >= 201103L #define _Alignas(e) alignas(e) #define _Alignof(e) alignof(e) #define _Noreturn [[noreturn]] #define _Static_assert(e, s) static_assert(e, s) /* FIXME: change this to thread_local when clang in base supports it */ #define _Thread_local __thread #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L /* Do nothing. They are language keywords. */ #else /* Not supported. Implement them using our versions. */ #define _Alignas(x) __aligned(x) #define _Alignof(x) __alignof(x) #define _Noreturn __dead2 #define _Thread_local __thread #ifdef __COUNTER__ #define _Static_assert(x, y) __Static_assert(x, __COUNTER__) #define __Static_assert(x, y) ___Static_assert(x, y) #define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 : -1] #else #define _Static_assert(x, y) struct __hack #endif #endif /* * Emulation of C11 _Generic(). Unlike the previously defined C11 * keywords, it is not possible to implement this using exactly the same * syntax. Therefore implement something similar under the name * __generic(). Unlike _Generic(), this macro can only distinguish * between a single type, so it requires nested invocations to * distinguish multiple cases. */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #define __generic(expr, t, yes, no) \ _Generic(expr, t: yes, default: no) #elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus) #define __generic(expr, t, yes, no) \ __builtin_choose_expr( \ __builtin_types_compatible_p(__typeof(expr), t), yes, no) #endif #if __GNUC_PREREQ__(2, 96) #define __malloc_like __attribute__((__malloc__)) #define __pure __attribute__((__pure__)) #else #define __malloc_like #define __pure #endif #if __GNUC_PREREQ__(3, 1) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800) #define __always_inline __attribute__((__always_inline__)) #else #define __always_inline #endif #if __GNUC_PREREQ__(3, 1) #define __noinline __attribute__ ((__noinline__)) #else #define __noinline #endif #if __GNUC_PREREQ__(3, 3) #define __nonnull(x) __attribute__((__nonnull__(x))) #else #define __nonnull(x) #endif #if __GNUC_PREREQ__(3, 4) #define __fastcall __attribute__((__fastcall__)) #else #define __fastcall #endif #if __GNUC_PREREQ__(4, 1) #define __returns_twice __attribute__((__returns_twice__)) #else #define __returns_twice #endif /* XXX: should use `#if __STDC_VERSION__ < 199901'. */ #if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER) #define __func__ NULL #endif #if (defined(__INTEL_COMPILER) || (defined(__GNUC__) && __GNUC__ >= 2)) && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901 #define __LONG_LONG_SUPPORTED #endif /* C++11 exposes a load of C99 stuff */ #if defined(__cplusplus) && __cplusplus >= 201103L #define __LONG_LONG_SUPPORTED #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS #endif #endif /* * GCC 2.95 provides `__restrict' as an extension to C90 to support the * C99-specific `restrict' type qualifier. We happen to use `__restrict' as * a way to define the `restrict' type qualifier without disturbing older * software that is unaware of C99 keywords. */ #if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95) #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 || defined(lint) #define __restrict #else #define __restrict restrict #endif #endif /* * GNU C version 2.96 adds explicit branch prediction so that * the CPU back-end can hint the processor and also so that * code blocks can be reordered such that the predicted path * sees a more linear flow, thus improving cache behavior, etc. * * The following two macros provide us with a way to utilize this * compiler feature. Use __predict_true() if you expect the expression * to evaluate to true, and __predict_false() if you expect the * expression to evaluate to false. * * A few notes about usage: * * * Generally, __predict_false() error condition checks (unless * you have some _strong_ reason to do otherwise, in which case * document it), and/or __predict_true() `no-error' condition * checks, assuming you want to optimize for the no-error case. * * * Other than that, if you don't know the likelihood of a test * succeeding from empirical or other `hard' evidence, don't * make predictions. * * * These are meant to be used in places that are run `a lot'. * It is wasteful to make predictions in code that is run * seldomly (e.g. at subsystem initialization time) as the * basic block reordering that this affects can often generate * larger code. */ #if __GNUC_PREREQ__(2, 96) #define __predict_true(exp) __builtin_expect((exp), 1) #define __predict_false(exp) __builtin_expect((exp), 0) #else #define __predict_true(exp) (exp) #define __predict_false(exp) (exp) #endif #if __GNUC_PREREQ__(4, 2) #define __hidden __attribute__((__visibility__("hidden"))) #define __exported __attribute__((__visibility__("default"))) #else #define __hidden #define __exported #endif /* * We define this here since , , and * require it. */ #if __GNUC_PREREQ__(4, 1) #define __offsetof(type, field) __builtin_offsetof(type, field) #else #ifndef __cplusplus #define __offsetof(type, field) \ ((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->field)) #else #define __offsetof(type, field) \ (__offsetof__ (reinterpret_cast <__size_t> \ (&reinterpret_cast \ (static_cast (0)->field)))) #endif #endif #define __rangeof(type, start, end) \ (__offsetof(type, end) - __offsetof(type, start)) /* * Given the pointer x to the member m of the struct s, return * a pointer to the containing structure. When using GCC, we first * assign pointer x to a local variable, to check that its type is * compatible with member m. */ #if __GNUC_PREREQ__(3, 1) #define __containerof(x, s, m) ({ \ const volatile __typeof(((s *)0)->m) *__x = (x); \ __DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\ }) #else #define __containerof(x, s, m) \ __DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m)) #endif /* * Compiler-dependent macros to declare that functions take printf-like * or scanf-like arguments. They are null except for versions of gcc * that are known to support the features properly (old versions of gcc-2 * didn't permit keeping the keywords out of the application namespace). */ #if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER) #define __printflike(fmtarg, firstvararg) #define __scanflike(fmtarg, firstvararg) #define __format_arg(fmtarg) #define __strfmonlike(fmtarg, firstvararg) #define __strftimelike(fmtarg, firstvararg) #else #define __printflike(fmtarg, firstvararg) \ __attribute__((__format__ (__printf__, fmtarg, firstvararg))) #define __scanflike(fmtarg, firstvararg) \ __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) #define __format_arg(fmtarg) __attribute__((__format_arg__ (fmtarg))) #define __strfmonlike(fmtarg, firstvararg) \ __attribute__((__format__ (__strfmon__, fmtarg, firstvararg))) #define __strftimelike(fmtarg, firstvararg) \ __attribute__((__format__ (__strftime__, fmtarg, firstvararg))) #endif /* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ #if __FreeBSD_cc_version >= 300001 && defined(__GNUC__) && !defined(__INTEL_COMPILER) #define __printf0like(fmtarg, firstvararg) \ __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) #else #define __printf0like(fmtarg, firstvararg) #endif #if defined(__GNUC__) || defined(__INTEL_COMPILER) #ifndef __INTEL_COMPILER #define __strong_reference(sym,aliassym) \ extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))) #endif #ifdef __STDC__ #define __weak_reference(sym,alias) \ __asm__(".weak " #alias); \ __asm__(".equ " #alias ", " #sym) #define __warn_references(sym,msg) \ __asm__(".section .gnu.warning." #sym); \ __asm__(".asciz \"" msg "\""); \ __asm__(".previous") #define __sym_compat(sym,impl,verid) \ __asm__(".symver " #impl ", " #sym "@" #verid) #define __sym_default(sym,impl,verid) \ __asm__(".symver " #impl ", " #sym "@@" #verid) #else #define __weak_reference(sym,alias) \ __asm__(".weak alias"); \ __asm__(".equ alias, sym") #define __warn_references(sym,msg) \ __asm__(".section .gnu.warning.sym"); \ __asm__(".asciz \"msg\""); \ __asm__(".previous") #define __sym_compat(sym,impl,verid) \ __asm__(".symver impl, sym@verid") #define __sym_default(impl,sym,verid) \ __asm__(".symver impl, sym@@verid") #endif /* __STDC__ */ #endif /* __GNUC__ || __INTEL_COMPILER */ #define __GLOBL1(sym) __asm__(".globl " #sym) #define __GLOBL(sym) __GLOBL1(sym) #if defined(__GNUC__) || defined(__INTEL_COMPILER) #define __IDSTRING(name,string) __asm__(".ident\t\"" string "\"") #else /* * The following definition might not work well if used in header files, * but it should be better than nothing. If you want a "do nothing" * version, then it should generate some harmless declaration, such as: * #define __IDSTRING(name,string) struct __hack */ #define __IDSTRING(name,string) static const char name[] __unused = string #endif /* * Embed the rcs id of a source file in the resulting library. Note that in * more recent ELF binutils, we use .ident allowing the ID to be stripped. * Usage: * __FBSDID("$FreeBSD$"); */ #ifndef __FBSDID #if !defined(lint) && !defined(STRIP_FBSDID) #define __FBSDID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) #else #define __FBSDID(s) struct __hack #endif #endif #ifndef __RCSID #ifndef NO__RCSID #define __RCSID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) #else #define __RCSID(s) struct __hack #endif #endif #ifndef __RCSID_SOURCE #ifndef NO__RCSID_SOURCE #define __RCSID_SOURCE(s) __IDSTRING(__CONCAT(__rcsid_source_,__LINE__),s) #else #define __RCSID_SOURCE(s) struct __hack #endif #endif #ifndef __SCCSID #ifndef NO__SCCSID #define __SCCSID(s) __IDSTRING(__CONCAT(__sccsid_,__LINE__),s) #else #define __SCCSID(s) struct __hack #endif #endif #ifndef __COPYRIGHT #ifndef NO__COPYRIGHT #define __COPYRIGHT(s) __IDSTRING(__CONCAT(__copyright_,__LINE__),s) #else #define __COPYRIGHT(s) struct __hack #endif #endif #ifndef __DECONST #define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var)) #endif #ifndef __DEVOLATILE #define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var)) #endif #ifndef __DEQUALIFY #define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var)) #endif /*- * The following definitions are an extension of the behavior originally * implemented in , but with a different level of granularity. * POSIX.1 requires that the macros we test be defined before any standard * header file is included. * * Here's a quick run-down of the versions: * defined(_POSIX_SOURCE) 1003.1-1988 * _POSIX_C_SOURCE == 1 1003.1-1990 * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option * _POSIX_C_SOURCE == 199309 1003.1b-1993 * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995, * and the omnibus ISO/IEC 9945-1: 1996 * _POSIX_C_SOURCE == 200112 1003.1-2001 * _POSIX_C_SOURCE == 200809 1003.1-2008 * * In addition, the X/Open Portability Guide, which is now the Single UNIX * Specification, defines a feature-test macro which indicates the version of * that specification, and which subsumes _POSIX_C_SOURCE. * * Our macros begin with two underscores to avoid namespace screwage. */ /* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */ #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1 #undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */ #define _POSIX_C_SOURCE 199009 #endif /* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */ #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2 #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199209 #endif /* Deal with various X/Open Portability Guides and Single UNIX Spec. */ #ifdef _XOPEN_SOURCE #if _XOPEN_SOURCE - 0 >= 700 #define __XSI_VISIBLE 700 #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809 #elif _XOPEN_SOURCE - 0 >= 600 #define __XSI_VISIBLE 600 #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200112 #elif _XOPEN_SOURCE - 0 >= 500 #define __XSI_VISIBLE 500 #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199506 #endif #endif /* * Deal with all versions of POSIX. The ordering relative to the tests above is * important. */ #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 198808 #endif #ifdef _POSIX_C_SOURCE #if _POSIX_C_SOURCE >= 200809 #define __POSIX_VISIBLE 200809 #define __ISO_C_VISIBLE 1999 #elif _POSIX_C_SOURCE >= 200112 #define __POSIX_VISIBLE 200112 #define __ISO_C_VISIBLE 1999 #elif _POSIX_C_SOURCE >= 199506 #define __POSIX_VISIBLE 199506 #define __ISO_C_VISIBLE 1990 #elif _POSIX_C_SOURCE >= 199309 #define __POSIX_VISIBLE 199309 #define __ISO_C_VISIBLE 1990 #elif _POSIX_C_SOURCE >= 199209 #define __POSIX_VISIBLE 199209 #define __ISO_C_VISIBLE 1990 #elif _POSIX_C_SOURCE >= 199009 #define __POSIX_VISIBLE 199009 #define __ISO_C_VISIBLE 1990 #else #define __POSIX_VISIBLE 198808 #define __ISO_C_VISIBLE 0 #endif /* _POSIX_C_SOURCE */ #else /*- * Deal with _ANSI_SOURCE: * If it is defined, and no other compilation environment is explicitly * requested, then define our internal feature-test macros to zero. This * makes no difference to the preprocessor (undefined symbols in preprocessing * expressions are defined to have value zero), but makes it more convenient for * a test program to print out the values. * * If a program mistakenly defines _ANSI_SOURCE and some other macro such as * _POSIX_C_SOURCE, we will assume that it wants the broader compilation * environment (and in fact we will never get here). */ #if defined(_ANSI_SOURCE) /* Hide almost everything. */ #define __POSIX_VISIBLE 0 #define __XSI_VISIBLE 0 #define __BSD_VISIBLE 0 #define __ISO_C_VISIBLE 1990 #elif defined(_C99_SOURCE) /* Localism to specify strict C99 env. */ #define __POSIX_VISIBLE 0 #define __XSI_VISIBLE 0 #define __BSD_VISIBLE 0 #define __ISO_C_VISIBLE 1999 #else /* Default environment: show everything. */ #define __POSIX_VISIBLE 200809 #define __XSI_VISIBLE 700 #define __BSD_VISIBLE 1 #define __ISO_C_VISIBLE 1999 #endif #endif #ifndef __has_feature #define __has_feature(x) 0 #endif #ifndef __has_include #define __has_include(x) 0 #endif #ifndef __has_builtin #define __has_builtin(x) 0 #endif #if defined(__mips) || defined(__powerpc64__) || defined(__arm__) #define __NO_TLS 1 #endif #endif /* !_SYS_CDEFS_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/ctype.h000066400000000000000000000051621322600646200232270ustar00rootroot00000000000000/*- * Copyright (c) 1982, 1988, 1991, 1993 * The Regents of the University of California. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph * Co. or Unix System Laboratories, Inc. and are reproduced herein with * the permission of UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ /* * Portions copyright (c) 2009-2014, ARM Limited and Contributors. * All rights reserved. */ #ifndef _SYS_CTYPE_H_ #define _SYS_CTYPE_H_ #define isspace(c) ((c) == ' ' || ((c) >= '\t' && (c) <= '\r')) #define isascii(c) (((c) & ~0x7f) == 0) #define isupper(c) ((c) >= 'A' && (c) <= 'Z') #define islower(c) ((c) >= 'a' && (c) <= 'z') #define isalpha(c) (isupper(c) || islower(c)) #define isdigit(c) ((c) >= '0' && (c) <= '9') #define isxdigit(c) (isdigit(c) \ || ((c) >= 'A' && (c) <= 'F') \ || ((c) >= 'a' && (c) <= 'f')) #define isprint(c) ((c) >= ' ' && (c) <= '~') #define toupper(c) ((c) - 0x20 * (((c) >= 'a') && ((c) <= 'z'))) #define tolower(c) ((c) + 0x20 * (((c) >= 'A') && ((c) <= 'Z'))) #endif /* !_SYS_CTYPE_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/errno.h000066400000000000000000000174311322600646200232320ustar00rootroot00000000000000/*- * Copyright (c) 1982, 1986, 1989, 1993 * The Regents of the University of California. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph * Co. or Unix System Laboratories, Inc. and are reproduced herein with * the permission of UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)errno.h 8.5 (Berkeley) 1/21/94 * $FreeBSD$ */ #ifndef _SYS_ERRNO_H_ #define _SYS_ERRNO_H_ #ifndef _KERNEL #include __BEGIN_DECLS int * __error(void); __END_DECLS #define errno (* __error()) #endif #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted system call */ #define EIO 5 /* Input/output error */ #define ENXIO 6 /* Device not configured */ #define E2BIG 7 /* Argument list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file descriptor */ #define ECHILD 10 /* No child processes */ #define EDEADLK 11 /* Resource deadlock avoided */ /* 11 was EAGAIN */ #define ENOMEM 12 /* Cannot allocate memory */ #define EACCES 13 /* Permission denied */ #define EFAULT 14 /* Bad address */ #ifndef _POSIX_SOURCE #define ENOTBLK 15 /* Block device required */ #endif #define EBUSY 16 /* Device busy */ #define EEXIST 17 /* File exists */ #define EXDEV 18 /* Cross-device link */ #define ENODEV 19 /* Operation not supported by device */ #define ENOTDIR 20 /* Not a directory */ #define EISDIR 21 /* Is a directory */ #define EINVAL 22 /* Invalid argument */ #define ENFILE 23 /* Too many open files in system */ #define EMFILE 24 /* Too many open files */ #define ENOTTY 25 /* Inappropriate ioctl for device */ #ifndef _POSIX_SOURCE #define ETXTBSY 26 /* Text file busy */ #endif #define EFBIG 27 /* File too large */ #define ENOSPC 28 /* No space left on device */ #define ESPIPE 29 /* Illegal seek */ #define EROFS 30 /* Read-only filesystem */ #define EMLINK 31 /* Too many links */ #define EPIPE 32 /* Broken pipe */ /* math software */ #define EDOM 33 /* Numerical argument out of domain */ #define ERANGE 34 /* Result too large */ /* non-blocking and interrupt i/o */ #define EAGAIN 35 /* Resource temporarily unavailable */ #ifndef _POSIX_SOURCE #define EWOULDBLOCK EAGAIN /* Operation would block */ #define EINPROGRESS 36 /* Operation now in progress */ #define EALREADY 37 /* Operation already in progress */ /* ipc/network software -- argument errors */ #define ENOTSOCK 38 /* Socket operation on non-socket */ #define EDESTADDRREQ 39 /* Destination address required */ #define EMSGSIZE 40 /* Message too long */ #define EPROTOTYPE 41 /* Protocol wrong type for socket */ #define ENOPROTOOPT 42 /* Protocol not available */ #define EPROTONOSUPPORT 43 /* Protocol not supported */ #define ESOCKTNOSUPPORT 44 /* Socket type not supported */ #define EOPNOTSUPP 45 /* Operation not supported */ #define ENOTSUP EOPNOTSUPP /* Operation not supported */ #define EPFNOSUPPORT 46 /* Protocol family not supported */ #define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ #define EADDRINUSE 48 /* Address already in use */ #define EADDRNOTAVAIL 49 /* Can't assign requested address */ /* ipc/network software -- operational errors */ #define ENETDOWN 50 /* Network is down */ #define ENETUNREACH 51 /* Network is unreachable */ #define ENETRESET 52 /* Network dropped connection on reset */ #define ECONNABORTED 53 /* Software caused connection abort */ #define ECONNRESET 54 /* Connection reset by peer */ #define ENOBUFS 55 /* No buffer space available */ #define EISCONN 56 /* Socket is already connected */ #define ENOTCONN 57 /* Socket is not connected */ #define ESHUTDOWN 58 /* Can't send after socket shutdown */ #define ETOOMANYREFS 59 /* Too many references: can't splice */ #define ETIMEDOUT 60 /* Operation timed out */ #define ECONNREFUSED 61 /* Connection refused */ #define ELOOP 62 /* Too many levels of symbolic links */ #endif /* _POSIX_SOURCE */ #define ENAMETOOLONG 63 /* File name too long */ /* should be rearranged */ #ifndef _POSIX_SOURCE #define EHOSTDOWN 64 /* Host is down */ #define EHOSTUNREACH 65 /* No route to host */ #endif /* _POSIX_SOURCE */ #define ENOTEMPTY 66 /* Directory not empty */ /* quotas & mush */ #ifndef _POSIX_SOURCE #define EPROCLIM 67 /* Too many processes */ #define EUSERS 68 /* Too many users */ #define EDQUOT 69 /* Disc quota exceeded */ /* Network File System */ #define ESTALE 70 /* Stale NFS file handle */ #define EREMOTE 71 /* Too many levels of remote in path */ #define EBADRPC 72 /* RPC struct is bad */ #define ERPCMISMATCH 73 /* RPC version wrong */ #define EPROGUNAVAIL 74 /* RPC prog. not avail */ #define EPROGMISMATCH 75 /* Program version wrong */ #define EPROCUNAVAIL 76 /* Bad procedure for program */ #endif /* _POSIX_SOURCE */ #define ENOLCK 77 /* No locks available */ #define ENOSYS 78 /* Function not implemented */ #ifndef _POSIX_SOURCE #define EFTYPE 79 /* Inappropriate file type or format */ #define EAUTH 80 /* Authentication error */ #define ENEEDAUTH 81 /* Need authenticator */ #define EIDRM 82 /* Identifier removed */ #define ENOMSG 83 /* No message of desired type */ #define EOVERFLOW 84 /* Value too large to be stored in data type */ #define ECANCELED 85 /* Operation canceled */ #define EILSEQ 86 /* Illegal byte sequence */ #define ENOATTR 87 /* Attribute not found */ #define EDOOFUS 88 /* Programming error */ #endif /* _POSIX_SOURCE */ #define EBADMSG 89 /* Bad message */ #define EMULTIHOP 90 /* Multihop attempted */ #define ENOLINK 91 /* Link has been severed */ #define EPROTO 92 /* Protocol error */ #ifndef _POSIX_SOURCE #define ENOTCAPABLE 93 /* Capabilities insufficient */ #define ECAPMODE 94 /* Not permitted in capability mode */ #endif /* _POSIX_SOURCE */ #ifndef _POSIX_SOURCE #define ELAST 94 /* Must be equal largest errno */ #endif /* _POSIX_SOURCE */ #ifdef _KERNEL /* pseudo-errors returned inside kernel to modify return to process */ #define ERESTART (-1) /* restart syscall */ #define EJUSTRETURN (-2) /* don't modify regs, just return */ #define ENOIOCTL (-3) /* ioctl not handled by this layer */ #define EDIRIOCTL (-4) /* do direct ioctl in GEOM */ #endif #endif arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/limits.h000066400000000000000000000072271322600646200234100ustar00rootroot00000000000000/*- * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _SYS_LIMITS_H_ #define _SYS_LIMITS_H_ #include #include #define CHAR_BIT __CHAR_BIT /* number of bits in a char */ #define SCHAR_MAX __SCHAR_MAX /* max value for a signed char */ #define SCHAR_MIN __SCHAR_MIN /* min value for a signed char */ #define UCHAR_MAX __UCHAR_MAX /* max value for an unsigned char */ #ifdef __CHAR_UNSIGNED__ #define CHAR_MAX UCHAR_MAX /* max value for a char */ #define CHAR_MIN 0 /* min value for a char */ #else #define CHAR_MAX SCHAR_MAX #define CHAR_MIN SCHAR_MIN #endif #define USHRT_MAX __USHRT_MAX /* max value for an unsigned short */ #define SHRT_MAX __SHRT_MAX /* max value for a short */ #define SHRT_MIN __SHRT_MIN /* min value for a short */ #define UINT_MAX __UINT_MAX /* max value for an unsigned int */ #define INT_MAX __INT_MAX /* max value for an int */ #define INT_MIN __INT_MIN /* min value for an int */ #define ULONG_MAX __ULONG_MAX /* max for an unsigned long */ #define LONG_MAX __LONG_MAX /* max for a long */ #define LONG_MIN __LONG_MIN /* min for a long */ #ifdef __LONG_LONG_SUPPORTED #define ULLONG_MAX __ULLONG_MAX /* max for an unsigned long long */ #define LLONG_MAX __LLONG_MAX /* max for a long long */ #define LLONG_MIN __LLONG_MIN /* min for a long long */ #endif #if __POSIX_VISIBLE || __XSI_VISIBLE #define SSIZE_MAX __SSIZE_MAX /* max value for an ssize_t */ #endif #if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE #define SIZE_T_MAX __SIZE_T_MAX /* max value for a size_t */ #define OFF_MAX __OFF_MAX /* max value for an off_t */ #define OFF_MIN __OFF_MIN /* min value for an off_t */ #endif #if __BSD_VISIBLE #define GID_MAX UINT_MAX /* max value for a gid_t */ #define UID_MAX UINT_MAX /* max value for a uid_t */ #define UQUAD_MAX (__UQUAD_MAX) /* max value for a uquad_t */ #define QUAD_MAX (__QUAD_MAX) /* max value for a quad_t */ #define QUAD_MIN (__QUAD_MIN) /* min value for a quad_t */ #endif #if __XSI_VISIBLE || __POSIX_VISIBLE >= 200809 #define LONG_BIT __LONG_BIT #define WORD_BIT __WORD_BIT #endif #if __POSIX_VISIBLE #define MQ_PRIO_MAX 64 #endif #endif /* !_SYS_LIMITS_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/stdarg.h000066400000000000000000000050121322600646200233610ustar00rootroot00000000000000/*- * Copyright (c) 2002 David E. O'Brien. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _MACHINE_STDARG_H_ #define _MACHINE_STDARG_H_ #include #include #ifndef _VA_LIST_DECLARED #define _VA_LIST_DECLARED typedef __va_list va_list; #endif #ifdef __GNUCLIKE_BUILTIN_STDARG #define va_start(ap, last) \ __builtin_va_start((ap), (last)) #define va_arg(ap, type) \ __builtin_va_arg((ap), type) #define __va_copy(dest, src) \ __builtin_va_copy((dest), (src)) #if __ISO_C_VISIBLE >= 1999 #define va_copy(dest, src) \ __va_copy(dest, src) #endif #define va_end(ap) \ __builtin_va_end(ap) #elif defined(lint) /* Provide a fake implementation for lint's benefit */ #define __va_size(type) \ (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long)) #define va_start(ap, last) \ ((ap) = (va_list)&(last) + __va_size(last)) #define va_arg(ap, type) \ (*(type *)((ap) += __va_size(type), (ap) - __va_size(type))) #define va_end(ap) #else #error this file needs to be ported to your compiler #endif #endif /* !_MACHINE_STDARG_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/stdint.h000066400000000000000000000050511322600646200234050ustar00rootroot00000000000000/*- * Copyright (c) 2001 Mike Barcroft * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _SYS_STDINT_H_ #define _SYS_STDINT_H_ #include #include #include #include typedef __int_least8_t int_least8_t; typedef __int_least16_t int_least16_t; typedef __int_least32_t int_least32_t; typedef __int_least64_t int_least64_t; typedef __uint_least8_t uint_least8_t; typedef __uint_least16_t uint_least16_t; typedef __uint_least32_t uint_least32_t; typedef __uint_least64_t uint_least64_t; typedef __int_fast8_t int_fast8_t; typedef __int_fast16_t int_fast16_t; typedef __int_fast32_t int_fast32_t; typedef __int_fast64_t int_fast64_t; typedef __uint_fast8_t uint_fast8_t; typedef __uint_fast16_t uint_fast16_t; typedef __uint_fast32_t uint_fast32_t; typedef __uint_fast64_t uint_fast64_t; #ifndef _INTMAX_T_DECLARED typedef __intmax_t intmax_t; #define _INTMAX_T_DECLARED #endif #ifndef _UINTMAX_T_DECLARED typedef __uintmax_t uintmax_t; #define _UINTMAX_T_DECLARED #endif /* GNU and Darwin define this and people seem to think it's portable */ #if defined(UINTPTR_MAX) && defined(UINT64_MAX) && (UINTPTR_MAX == UINT64_MAX) #define __WORDSIZE 64 #else #define __WORDSIZE 32 #endif #endif /* !_SYS_STDINT_H_ */ arm-trusted-firmware-1.0-aw-6/include/stdlib/sys/uuid.h000066400000000000000000000040241322600646200230450ustar00rootroot00000000000000/*- * Copyright (c) 2002 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ */ /* * Portions copyright (c) 2014, ARM Limited and Contributors. * All rights reserved. */ #ifndef _SYS_UUID_H_ #define _SYS_UUID_H_ #include /* Length of a node address (an IEEE 802 address). */ #define _UUID_NODE_LEN 6 /* * See also: * http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt * http://www.opengroup.org/onlinepubs/009629399/apdxa.htm * * A DCE 1.1 compatible source representation of UUIDs. */ struct uuid { uint32_t time_low; uint16_t time_mid; uint16_t time_hi_and_version; uint8_t clock_seq_hi_and_reserved; uint8_t clock_seq_low; uint8_t node[_UUID_NODE_LEN]; }; /* XXX namespace pollution? */ typedef struct uuid uuid_t; #endif /* _SYS_UUID_H_ */ arm-trusted-firmware-1.0-aw-6/lib/000077500000000000000000000000001322600646200167525ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/aarch64/000077500000000000000000000000001322600646200202025ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/aarch64/cache_helpers.S000066400000000000000000000116731322600646200231230ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include .globl flush_dcache_range .globl inv_dcache_range .globl dcsw_op_louis .globl dcsw_op_all /* ------------------------------------------ * Clean+Invalidate from base address till * size. 'x0' = addr, 'x1' = size * ------------------------------------------ */ func flush_dcache_range dcache_line_size x2, x3 add x1, x0, x1 sub x3, x2, #1 bic x0, x0, x3 flush_loop: dc civac, x0 add x0, x0, x2 cmp x0, x1 b.lo flush_loop dsb sy ret /* ------------------------------------------ * Invalidate from base address till * size. 'x0' = addr, 'x1' = size * ------------------------------------------ */ func inv_dcache_range dcache_line_size x2, x3 add x1, x0, x1 sub x3, x2, #1 bic x0, x0, x3 inv_loop: dc ivac, x0 add x0, x0, x2 cmp x0, x1 b.lo inv_loop dsb sy ret /* --------------------------------------------------------------- * Data cache operations by set/way to the level specified * * The main function, do_dcsw_op requires: * x0: The operation type (0-2), as defined in arch.h * x3: The last cache level to operate on * x9: clidr_el1 * and will carry out the operation on each data cache from level 0 * to the level in x3 in sequence * * The dcsw_op macro sets up the x3 and x9 parameters based on * clidr_el1 cache information before invoking the main function * --------------------------------------------------------------- */ .macro dcsw_op shift, fw, ls mrs x9, clidr_el1 ubfx x3, x9, \shift, \fw lsl x3, x3, \ls b do_dcsw_op .endm func do_dcsw_op cbz x3, exit mov x10, xzr adr x14, dcsw_loop_table // compute inner loop address add x14, x14, x0, lsl #5 // inner loop is 8x32-bit instructions mov x0, x9 mov w8, #1 loop1: add x2, x10, x10, lsr #1 // work out 3x current cache level lsr x1, x0, x2 // extract cache type bits from clidr and x1, x1, #7 // mask the bits for current cache only cmp x1, #2 // see what cache we have at this level b.lt level_done // nothing to do if no cache or icache msr csselr_el1, x10 // select current cache level in csselr isb // isb to sych the new cssr&csidr mrs x1, ccsidr_el1 // read the new ccsidr and x2, x1, #7 // extract the length of the cache lines add x2, x2, #4 // add 4 (line length offset) ubfx x4, x1, #3, #10 // maximum way number clz w5, w4 // bit position of way size increment lsl w9, w4, w5 // w9 = aligned max way number lsl w16, w8, w5 // w16 = way number loop decrement orr w9, w10, w9 // w9 = combine way and cache number ubfx w6, w1, #13, #15 // w6 = max set number lsl w17, w8, w2 // w17 = set number loop decrement dsb sy // barrier before we start this level br x14 // jump to DC operation specific loop .macro dcsw_loop _op loop2_\_op: lsl w7, w6, w2 // w7 = aligned max set number loop3_\_op: orr w11, w9, w7 // combine cache, way and set number dc \_op, x11 subs w7, w7, w17 // decrement set number b.ge loop3_\_op subs x9, x9, x16 // decrement way number b.ge loop2_\_op b level_done .endm level_done: add x10, x10, #2 // increment cache number cmp x3, x10 b.gt loop1 msr csselr_el1, xzr // select cache level 0 in csselr dsb sy // barrier to complete final cache operation isb exit: ret dcsw_loop_table: dcsw_loop isw dcsw_loop cisw dcsw_loop csw func dcsw_op_louis dcsw_op #LOUIS_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT func dcsw_op_all dcsw_op #LOC_SHIFT, #CLIDR_FIELD_WIDTH, #LEVEL_SHIFT arm-trusted-firmware-1.0-aw-6/lib/aarch64/misc_helpers.S000066400000000000000000000107151322600646200230070ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .globl get_afflvl_shift .globl mpidr_mask_lower_afflvls .globl eret .globl smc .globl zeromem16 .globl memcpy16 .globl disable_mmu_el3 .globl disable_mmu_icache_el3 #if SUPPORT_VFP .globl enable_vfp #endif func get_afflvl_shift cmp x0, #3 cinc x0, x0, eq mov x1, #MPIDR_AFFLVL_SHIFT lsl x0, x0, x1 ret func mpidr_mask_lower_afflvls cmp x1, #3 cinc x1, x1, eq mov x2, #MPIDR_AFFLVL_SHIFT lsl x2, x1, x2 lsr x0, x0, x2 lsl x0, x0, x2 ret func eret eret func smc smc #0 /* ----------------------------------------------------------------------- * void zeromem16(void *mem, unsigned int length); * * Initialise a memory region to 0. * The memory address must be 16-byte aligned. * ----------------------------------------------------------------------- */ func zeromem16 #if ASM_ASSERTION tst x0, #0xf ASM_ASSERT(eq) #endif add x2, x0, x1 /* zero 16 bytes at a time */ z_loop16: sub x3, x2, x0 cmp x3, #16 b.lt z_loop1 stp xzr, xzr, [x0], #16 b z_loop16 /* zero byte per byte */ z_loop1: cmp x0, x2 b.eq z_end strb wzr, [x0], #1 b z_loop1 z_end: ret /* -------------------------------------------------------------------------- * void memcpy16(void *dest, const void *src, unsigned int length) * * Copy length bytes from memory area src to memory area dest. * The memory areas should not overlap. * Destination and source addresses must be 16-byte aligned. * -------------------------------------------------------------------------- */ func memcpy16 #if ASM_ASSERTION orr x3, x0, x1 tst x3, #0xf ASM_ASSERT(eq) #endif /* copy 16 bytes at a time */ m_loop16: cmp x2, #16 b.lt m_loop1 ldp x3, x4, [x1], #16 stp x3, x4, [x0], #16 sub x2, x2, #16 b m_loop16 /* copy byte per byte */ m_loop1: cbz x2, m_end ldrb w3, [x1], #1 strb w3, [x0], #1 subs x2, x2, #1 b.ne m_loop1 m_end: ret /* --------------------------------------------------------------------------- * Disable the MMU at EL3 * This is implemented in assembler to ensure that the data cache is cleaned * and invalidated after the MMU is disabled without any intervening cacheable * data accesses * --------------------------------------------------------------------------- */ func disable_mmu_el3 mov x1, #(SCTLR_M_BIT | SCTLR_C_BIT) do_disable_mmu: mrs x0, sctlr_el3 bic x0, x0, x1 msr sctlr_el3, x0 isb // ensure MMU is off mov x0, #DCCISW // DCache clean and invalidate b dcsw_op_all func disable_mmu_icache_el3 mov x1, #(SCTLR_M_BIT | SCTLR_C_BIT | SCTLR_I_BIT) b do_disable_mmu /* --------------------------------------------------------------------------- * Enable the use of VFP at EL3 * --------------------------------------------------------------------------- */ #if SUPPORT_VFP func enable_vfp mrs x0, cpacr_el1 orr x0, x0, #CPACR_VFP_BITS msr cpacr_el1, x0 mrs x0, cptr_el3 mov x1, #AARCH64_CPTR_TFP bic x0, x0, x1 msr cptr_el3, x0 isb ret #endif arm-trusted-firmware-1.0-aw-6/lib/aarch64/xlat_helpers.c000066400000000000000000000113211322600646200230360ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /******************************************************************************* * Helper to create a level 1/2 table descriptor which points to a level 2/3 * table. ******************************************************************************/ unsigned long create_table_desc(unsigned long *next_table_ptr) { unsigned long desc = (unsigned long) next_table_ptr; /* Clear the last 12 bits */ desc >>= FOUR_KB_SHIFT; desc <<= FOUR_KB_SHIFT; desc |= TABLE_DESC; return desc; } /******************************************************************************* * Helper to create a level 1/2/3 block descriptor which maps the va to addr ******************************************************************************/ unsigned long create_block_desc(unsigned long desc, unsigned long addr, unsigned int level) { switch (level) { case LEVEL1: desc |= (addr << FIRST_LEVEL_DESC_N) | BLOCK_DESC; break; case LEVEL2: desc |= (addr << SECOND_LEVEL_DESC_N) | BLOCK_DESC; break; case LEVEL3: desc |= (addr << THIRD_LEVEL_DESC_N) | TABLE_DESC; break; default: assert(0); } return desc; } /******************************************************************************* * Helper to create a level 1/2/3 block descriptor which maps the va to output_ * addr with Device nGnRE attributes. ******************************************************************************/ unsigned long create_device_block(unsigned long output_addr, unsigned int level, unsigned int ns) { unsigned long upper_attrs, lower_attrs, desc; lower_attrs = LOWER_ATTRS(ACCESS_FLAG | OSH | AP_RW); lower_attrs |= LOWER_ATTRS(ns | ATTR_DEVICE_INDEX); upper_attrs = UPPER_ATTRS(XN); desc = upper_attrs | lower_attrs; return create_block_desc(desc, output_addr, level); } /******************************************************************************* * Helper to create a level 1/2/3 block descriptor which maps the va to output_ * addr with inner-shareable normal wbwa read-only memory attributes. ******************************************************************************/ unsigned long create_romem_block(unsigned long output_addr, unsigned int level, unsigned int ns) { unsigned long upper_attrs, lower_attrs, desc; lower_attrs = LOWER_ATTRS(ACCESS_FLAG | ISH | AP_RO); lower_attrs |= LOWER_ATTRS(ns | ATTR_IWBWA_OWBWA_NTR_INDEX); upper_attrs = UPPER_ATTRS(0ull); desc = upper_attrs | lower_attrs; return create_block_desc(desc, output_addr, level); } /******************************************************************************* * Helper to create a level 1/2/3 block descriptor which maps the va to output_ * addr with inner-shareable normal wbwa read-write memory attributes. ******************************************************************************/ unsigned long create_rwmem_block(unsigned long output_addr, unsigned int level, unsigned int ns) { unsigned long upper_attrs, lower_attrs, desc; lower_attrs = LOWER_ATTRS(ACCESS_FLAG | ISH | AP_RW); lower_attrs |= LOWER_ATTRS(ns | ATTR_IWBWA_OWBWA_NTR_INDEX); upper_attrs = UPPER_ATTRS(XN); desc = upper_attrs | lower_attrs; return create_block_desc(desc, output_addr, level); } arm-trusted-firmware-1.0-aw-6/lib/aarch64/xlat_tables.c000066400000000000000000000236171322600646200226610ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #ifndef DEBUG_XLAT_TABLE #define DEBUG_XLAT_TABLE 0 #endif #if DEBUG_XLAT_TABLE #define debug_print(...) printf(__VA_ARGS__) #else #define debug_print(...) ((void)0) #endif CASSERT(ADDR_SPACE_SIZE > 0, assert_valid_addr_space_size); #define UNSET_DESC ~0ul #define NUM_L1_ENTRIES (ADDR_SPACE_SIZE >> L1_XLAT_ADDRESS_SHIFT) static uint64_t l1_xlation_table[NUM_L1_ENTRIES] __aligned(NUM_L1_ENTRIES * sizeof(uint64_t)); static uint64_t xlat_tables[MAX_XLAT_TABLES][XLAT_TABLE_ENTRIES] __aligned(XLAT_TABLE_SIZE) __attribute__((section("xlat_table"))); static unsigned next_xlat; static unsigned long max_pa; static unsigned long max_va; static unsigned long tcr_ps_bits; /* * Array of all memory regions stored in order of ascending base address. * The list is terminated by the first entry with size == 0. */ static mmap_region_t mmap[MAX_MMAP_REGIONS + 1]; static void print_mmap(void) { #if DEBUG_XLAT_TABLE debug_print("mmap:\n"); mmap_region_t *mm = mmap; while (mm->size) { debug_print(" %010lx %010lx %10lx %x\n", mm->base_va, mm->base_pa, mm->size, mm->attr); ++mm; }; debug_print("\n"); #endif } void mmap_add_region(unsigned long base_pa, unsigned long base_va, unsigned long size, unsigned attr) { mmap_region_t *mm = mmap; mmap_region_t *mm_last = mm + sizeof(mmap) / sizeof(mmap[0]) - 1; unsigned long pa_end = base_pa + size - 1; unsigned long va_end = base_va + size - 1; assert(IS_PAGE_ALIGNED(base_pa)); assert(IS_PAGE_ALIGNED(base_va)); assert(IS_PAGE_ALIGNED(size)); if (!size) return; /* Find correct place in mmap to insert new region */ while (mm->base_va < base_va && mm->size) ++mm; /* Make room for new region by moving other regions up by one place */ memmove(mm + 1, mm, (uintptr_t)mm_last - (uintptr_t)mm); /* Check we haven't lost the empty sentinal from the end of the array */ assert(mm_last->size == 0); mm->base_pa = base_pa; mm->base_va = base_va; mm->size = size; mm->attr = attr; if (pa_end > max_pa) max_pa = pa_end; if (va_end > max_va) max_va = va_end; } void mmap_add(const mmap_region_t *mm) { while (mm->size) { mmap_add_region(mm->base_pa, mm->base_va, mm->size, mm->attr); ++mm; } } static unsigned long mmap_desc(unsigned attr, unsigned long addr_pa, unsigned level) { unsigned long desc = addr_pa; desc |= level == 3 ? TABLE_DESC : BLOCK_DESC; desc |= attr & MT_NS ? LOWER_ATTRS(NS) : 0; desc |= attr & MT_RW ? LOWER_ATTRS(AP_RW) : LOWER_ATTRS(AP_RO); desc |= LOWER_ATTRS(ACCESS_FLAG); if (attr & MT_MEMORY) { desc |= LOWER_ATTRS(ATTR_IWBWA_OWBWA_NTR_INDEX | ISH); if (attr & MT_RW) desc |= UPPER_ATTRS(XN); } else { desc |= LOWER_ATTRS(ATTR_DEVICE_INDEX | OSH); desc |= UPPER_ATTRS(XN); } debug_print(attr & MT_MEMORY ? "MEM" : "DEV"); debug_print(attr & MT_RW ? "-RW" : "-RO"); debug_print(attr & MT_NS ? "-NS" : "-S"); return desc; } static int mmap_region_attr(mmap_region_t *mm, unsigned long base_va, unsigned long size) { int attr = mm->attr; for (;;) { ++mm; if (!mm->size) return attr; /* Reached end of list */ if (mm->base_va >= base_va + size) return attr; /* Next region is after area so end */ if (mm->base_va + mm->size <= base_va) continue; /* Next region has already been overtaken */ if ((mm->attr & attr) == attr) continue; /* Region doesn't override attribs so skip */ attr &= mm->attr; if (mm->base_va > base_va || mm->base_va + mm->size < base_va + size) return -1; /* Region doesn't fully cover our area */ } } static mmap_region_t *init_xlation_table(mmap_region_t *mm, unsigned long base_va, unsigned long *table, unsigned level) { unsigned level_size_shift = L1_XLAT_ADDRESS_SHIFT - (level - 1) * XLAT_TABLE_ENTRIES_SHIFT; unsigned level_size = 1 << level_size_shift; unsigned long level_index_mask = XLAT_TABLE_ENTRIES_MASK << level_size_shift; assert(level <= 3); debug_print("New xlat table:\n"); do { unsigned long desc = UNSET_DESC; if (mm->base_va + mm->size <= base_va) { /* Area now after the region so skip it */ ++mm; continue; } debug_print(" %010lx %8lx " + 6 - 2 * level, base_va, level_size); if (mm->base_va >= base_va + level_size) { /* Next region is after area so nothing to map yet */ desc = INVALID_DESC; } else if (mm->base_va <= base_va && mm->base_va + mm->size >= base_va + level_size) { /* Next region covers all of area */ int attr = mmap_region_attr(mm, base_va, level_size); if (attr >= 0) desc = mmap_desc(attr, base_va - mm->base_va + mm->base_pa, level); } /* else Next region only partially covers area, so need */ if (desc == UNSET_DESC) { /* Area not covered by a region so need finer table */ unsigned long *new_table = xlat_tables[next_xlat++]; assert(next_xlat <= MAX_XLAT_TABLES); desc = TABLE_DESC | (unsigned long)new_table; /* Recurse to fill in new table */ mm = init_xlation_table(mm, base_va, new_table, level+1); } debug_print("\n"); *table++ = desc; base_va += level_size; } while (mm->size && (base_va & level_index_mask)); return mm; } static unsigned int calc_physical_addr_size_bits(unsigned long max_addr) { /* Physical address can't exceed 48 bits */ assert((max_addr & ADDR_MASK_48_TO_63) == 0); /* 48 bits address */ if (max_addr & ADDR_MASK_44_TO_47) return TCR_PS_BITS_256TB; /* 44 bits address */ if (max_addr & ADDR_MASK_42_TO_43) return TCR_PS_BITS_16TB; /* 42 bits address */ if (max_addr & ADDR_MASK_40_TO_41) return TCR_PS_BITS_4TB; /* 40 bits address */ if (max_addr & ADDR_MASK_36_TO_39) return TCR_PS_BITS_1TB; /* 36 bits address */ if (max_addr & ADDR_MASK_32_TO_35) return TCR_PS_BITS_64GB; return TCR_PS_BITS_4GB; } void init_xlat_tables(void) { print_mmap(); init_xlation_table(mmap, 0, l1_xlation_table, 1); tcr_ps_bits = calc_physical_addr_size_bits(max_pa); assert(max_va < ADDR_SPACE_SIZE); } /******************************************************************************* * Macro generating the code for the function enabling the MMU in the given * exception level, assuming that the pagetables have already been created. * * _el: Exception level at which the function will run * _tcr_extra: Extra bits to set in the TCR register. This mask will * be OR'ed with the default TCR value. * _tlbi_fct: Function to invalidate the TLBs at the current * exception level ******************************************************************************/ #define DEFINE_ENABLE_MMU_EL(_el, _tcr_extra, _tlbi_fct) \ void enable_mmu_el##_el(uint32_t flags) \ { \ uint64_t mair, tcr, ttbr; \ uint32_t sctlr; \ \ assert(IS_IN_EL(_el)); \ assert((read_sctlr_el##_el() & SCTLR_M_BIT) == 0); \ \ /* Set attributes in the right indices of the MAIR */ \ mair = MAIR_ATTR_SET(ATTR_DEVICE, ATTR_DEVICE_INDEX); \ mair |= MAIR_ATTR_SET(ATTR_IWBWA_OWBWA_NTR, \ ATTR_IWBWA_OWBWA_NTR_INDEX); \ write_mair_el##_el(mair); \ \ /* Invalidate TLBs at the current exception level */ \ _tlbi_fct(); \ \ /* Set TCR bits as well. */ \ /* Inner & outer WBWA & shareable + T0SZ = 32 */ \ tcr = TCR_SH_INNER_SHAREABLE | TCR_RGN_OUTER_WBA | \ TCR_RGN_INNER_WBA | \ (64 - __builtin_ctzl(ADDR_SPACE_SIZE)); \ tcr |= _tcr_extra; \ write_tcr_el##_el(tcr); \ \ /* Set TTBR bits as well */ \ ttbr = (uint64_t) l1_xlation_table; \ write_ttbr0_el##_el(ttbr); \ \ /* Ensure all translation table writes have drained */ \ /* into memory, the TLB invalidation is complete, */ \ /* and translation register writes are committed */ \ /* before enabling the MMU */ \ dsb(); \ isb(); \ \ sctlr = read_sctlr_el##_el(); \ sctlr |= SCTLR_WXN_BIT | SCTLR_M_BIT; \ \ if (flags & DISABLE_DCACHE) \ sctlr &= ~SCTLR_C_BIT; \ else \ sctlr |= SCTLR_C_BIT; \ \ write_sctlr_el##_el(sctlr); \ \ /* Ensure the MMU enable takes effect immediately */ \ isb(); \ } /* Define EL1 and EL3 variants of the function enabling the MMU */ DEFINE_ENABLE_MMU_EL(1, (tcr_ps_bits << TCR_EL1_IPS_SHIFT), tlbivmalle1) DEFINE_ENABLE_MMU_EL(3, TCR_EL3_RES1 | (tcr_ps_bits << TCR_EL3_PS_SHIFT), tlbialle3) arm-trusted-firmware-1.0-aw-6/lib/cpus/000077500000000000000000000000001322600646200177245ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/cpus/aarch64/000077500000000000000000000000001322600646200211545ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/cpus/aarch64/aem_generic.S000066400000000000000000000057351322600646200235500ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include func aem_generic_core_pwr_dwn /* --------------------------------------------- * Disable the Data Cache. * --------------------------------------------- */ mrs x1, sctlr_el3 bic x1, x1, #SCTLR_C_BIT msr sctlr_el3, x1 isb mov x0, #DCCISW /* --------------------------------------------- * Flush L1 cache to PoU. * --------------------------------------------- */ b dcsw_op_louis func aem_generic_cluster_pwr_dwn /* --------------------------------------------- * Disable the Data Cache. * --------------------------------------------- */ mrs x1, sctlr_el3 bic x1, x1, #SCTLR_C_BIT msr sctlr_el3, x1 isb /* --------------------------------------------- * Flush L1 and L2 caches to PoC. * --------------------------------------------- */ mov x0, #DCCISW b dcsw_op_all /* --------------------------------------------- * This function provides cpu specific * register information for crash reporting. * It needs to return with x6 pointing to * a list of register names in ascii and * x8 - x15 having values of registers to be * reported. * --------------------------------------------- */ func aem_generic_cpu_reg_dump mov x6, #0 /* no registers to report */ ret /* cpu_ops for Base AEM FVP */ declare_cpu_ops aem_generic, BASE_AEM_MIDR, 1 /* cpu_ops for Foundation FVP */ declare_cpu_ops aem_generic, FOUNDATION_AEM_MIDR, 1 arm-trusted-firmware-1.0-aw-6/lib/cpus/aarch64/cortex_a53.S000066400000000000000000000103621322600646200232560ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include /* --------------------------------------------- * Disable L1 data cache and unified L2 cache * --------------------------------------------- */ func cortex_a53_disable_dcache mrs x1, sctlr_el3 bic x1, x1, #SCTLR_C_BIT msr sctlr_el3, x1 isb ret /* --------------------------------------------- * Disable intra-cluster coherency * --------------------------------------------- */ func cortex_a53_disable_smp mrs x0, CPUECTLR_EL1 bic x0, x0, #CPUECTLR_SMP_BIT msr CPUECTLR_EL1, x0 isb dsb sy ret func cortex_a53_reset_func /* --------------------------------------------- * As a bare minimum enable the SMP bit. * --------------------------------------------- */ mrs x0, CPUECTLR_EL1 orr x0, x0, #CPUECTLR_SMP_BIT msr CPUECTLR_EL1, x0 isb ret func cortex_a53_core_pwr_dwn mov x18, x30 /* --------------------------------------------- * Turn off caches. * --------------------------------------------- */ bl cortex_a53_disable_dcache /* --------------------------------------------- * Flush L1 cache to PoU. * --------------------------------------------- */ mov x0, #DCCISW bl dcsw_op_louis /* --------------------------------------------- * Come out of intra cluster coherency * --------------------------------------------- */ mov x30, x18 b cortex_a53_disable_smp func cortex_a53_cluster_pwr_dwn mov x18, x30 /* --------------------------------------------- * Turn off caches. * --------------------------------------------- */ bl cortex_a53_disable_dcache /* --------------------------------------------- * Disable the optional ACP. * --------------------------------------------- */ bl plat_disable_acp /* --------------------------------------------- * Flush L1 and L2 caches to PoC. * --------------------------------------------- */ mov x0, #DCCISW bl dcsw_op_all /* --------------------------------------------- * Come out of intra cluster coherency * --------------------------------------------- */ mov x30, x18 b cortex_a53_disable_smp /* --------------------------------------------- * This function provides cortex_a53 specific * register information for crash reporting. * It needs to return with x6 pointing to * a list of register names in ascii and * x8 - x15 having values of registers to be * reported. * --------------------------------------------- */ .section .rodata.cortex_a53_regs, "aS" cortex_a53_regs: /* The ascii list of register names to be reported */ .asciz "cpuectlr_el1", "" func cortex_a53_cpu_reg_dump adr x6, cortex_a53_regs mrs x8, CPUECTLR_EL1 ret declare_cpu_ops cortex_a53, CORTEX_A53_MIDR arm-trusted-firmware-1.0-aw-6/lib/cpus/aarch64/cortex_a57.S000066400000000000000000000141641322600646200232660ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include /* --------------------------------------------- * Disable L1 data cache and unified L2 cache * --------------------------------------------- */ func cortex_a57_disable_dcache mrs x1, sctlr_el3 bic x1, x1, #SCTLR_C_BIT msr sctlr_el3, x1 isb ret /* --------------------------------------------- * Disable all types of L2 prefetches. * --------------------------------------------- */ func cortex_a57_disable_l2_prefetch mrs x0, CPUECTLR_EL1 orr x0, x0, #CPUECTLR_DIS_TWD_ACC_PFTCH_BIT mov x1, #CPUECTLR_L2_IPFTCH_DIST_MASK orr x1, x1, #CPUECTLR_L2_DPFTCH_DIST_MASK bic x0, x0, x1 msr CPUECTLR_EL1, x0 isb dsb sy ret /* --------------------------------------------- * Disable intra-cluster coherency * --------------------------------------------- */ func cortex_a57_disable_smp mrs x0, CPUECTLR_EL1 bic x0, x0, #CPUECTLR_SMP_BIT msr CPUECTLR_EL1, x0 ret /* --------------------------------------------- * Disable debug interfaces * --------------------------------------------- */ func cortex_a57_disable_ext_debug mov x0, #1 msr osdlr_el1, x0 isb dsb sy ret func cortex_a57_reset_func #if ERRATA_A57_806969 || ERRATA_A57_813420 /* --------------------------------------------- * Ensure that the following errata is only * applied on r0p0 parts. * --------------------------------------------- */ #if ASM_ASSERTION mrs x0, midr_el1 ubfx x1, x0, #MIDR_VAR_SHIFT, #4 ubfx x2, x0, #MIDR_REV_SHIFT, #4 orr x0, x1, x2 cmp x0, #0 ASM_ASSERT(eq) #endif mov x1, xzr #if ERRATA_A57_806969 orr x1, x1, #CPUACTLR_NO_ALLOC_WBWA #endif #if ERRATA_A57_813420 orr x1, x1, #CPUACTLR_DCC_AS_DCCI #endif mrs x0, CPUACTLR_EL1 orr x0, x0, x1 msr CPUACTLR_EL1, x0 #endif /* --------------------------------------------- * As a bare minimum enable the SMP bit. * --------------------------------------------- */ mrs x0, CPUECTLR_EL1 orr x0, x0, #CPUECTLR_SMP_BIT msr CPUECTLR_EL1, x0 isb ret func cortex_a57_core_pwr_dwn mov x18, x30 /* --------------------------------------------- * Turn off caches. * --------------------------------------------- */ bl cortex_a57_disable_dcache /* --------------------------------------------- * Disable the L2 prefetches. * --------------------------------------------- */ bl cortex_a57_disable_l2_prefetch /* --------------------------------------------- * Flush L1 cache to PoU. * --------------------------------------------- */ mov x0, #DCCISW bl dcsw_op_louis /* --------------------------------------------- * Come out of intra cluster coherency * --------------------------------------------- */ bl cortex_a57_disable_smp /* --------------------------------------------- * Force the debug interfaces to be quiescent * --------------------------------------------- */ mov x30, x18 b cortex_a57_disable_ext_debug func cortex_a57_cluster_pwr_dwn mov x18, x30 /* --------------------------------------------- * Turn off caches. * --------------------------------------------- */ bl cortex_a57_disable_dcache /* --------------------------------------------- * Disable the L2 prefetches. * --------------------------------------------- */ bl cortex_a57_disable_l2_prefetch /* --------------------------------------------- * Disable the optional ACP. * --------------------------------------------- */ bl plat_disable_acp /* --------------------------------------------- * Flush L1 and L2 caches to PoC. * --------------------------------------------- */ mov x0, #DCCISW bl dcsw_op_all /* --------------------------------------------- * Come out of intra cluster coherency * --------------------------------------------- */ bl cortex_a57_disable_smp /* --------------------------------------------- * Force the debug interfaces to be quiescent * --------------------------------------------- */ mov x30, x18 b cortex_a57_disable_ext_debug /* --------------------------------------------- * This function provides cortex_a57 specific * register information for crash reporting. * It needs to return with x6 pointing to * a list of register names in ascii and * x8 - x15 having values of registers to be * reported. * --------------------------------------------- */ .section .rodata.cortex_a57_regs, "aS" cortex_a57_regs: /* The ascii list of register names to be reported */ .asciz "cpuectlr_el1", "" func cortex_a57_cpu_reg_dump adr x6, cortex_a57_regs mrs x8, CPUECTLR_EL1 ret declare_cpu_ops cortex_a57, CORTEX_A57_MIDR arm-trusted-firmware-1.0-aw-6/lib/cpus/aarch64/cpu_helpers.S000066400000000000000000000124401322600646200236120ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #if IMAGE_BL31 #include #endif /* Reset fn is needed in BL at reset vector */ #if IMAGE_BL1 || (IMAGE_BL31 && RESET_TO_BL31) /* * The reset handler common to all platforms. After a matching * cpu_ops structure entry is found, the correponding reset_handler * in the cpu_ops is invoked. */ .globl reset_handler func reset_handler mov x10, x30 bl plat_reset_handler /* Get the matching cpu_ops pointer */ bl get_cpu_ops_ptr #if ASM_ASSERTION cmp x0, #0 ASM_ASSERT(ne) #endif /* Get the cpu_ops reset handler */ ldr x2, [x0, #CPU_RESET_FUNC] cbz x2, 1f blr x2 1: ret x10 #endif /* IMAGE_BL1 || (IMAGE_BL31 && RESET_TO_BL31) */ #if IMAGE_BL31 /* The power down core and cluster is needed only in BL31 */ /* * The prepare core power down function for all platforms. After * the cpu_ops pointer is retrieved from cpu_data, the corresponding * pwr_dwn_core in the cpu_ops is invoked. */ .globl prepare_core_pwr_dwn func prepare_core_pwr_dwn mrs x1, tpidr_el3 ldr x0, [x1, #CPU_DATA_CPU_OPS_PTR] #if ASM_ASSERTION cmp x0, #0 ASM_ASSERT(ne) #endif /* Get the cpu_ops core_pwr_dwn handler */ ldr x1, [x0, #CPU_PWR_DWN_CORE] br x1 /* * The prepare cluster power down function for all platforms. After * the cpu_ops pointer is retrieved from cpu_data, the corresponding * pwr_dwn_cluster in the cpu_ops is invoked. */ .globl prepare_cluster_pwr_dwn func prepare_cluster_pwr_dwn mrs x1, tpidr_el3 ldr x0, [x1, #CPU_DATA_CPU_OPS_PTR] #if ASM_ASSERTION cmp x0, #0 ASM_ASSERT(ne) #endif /* Get the cpu_ops cluster_pwr_dwn handler */ ldr x1, [x0, #CPU_PWR_DWN_CLUSTER] br x1 /* * Initializes the cpu_ops_ptr if not already initialized * in cpu_data. This can be called without a runtime stack, but may * only be called after the MMU is enabled. * clobbers: x0 - x6, x10 */ .globl init_cpu_ops func init_cpu_ops mrs x6, tpidr_el3 ldr x0, [x6, #CPU_DATA_CPU_OPS_PTR] cbnz x0, 1f mov x10, x30 bl get_cpu_ops_ptr #if ASM_ASSERTION cmp x0, #0 ASM_ASSERT(ne) #endif str x0, [x6, #CPU_DATA_CPU_OPS_PTR]! mov x30, x10 1: ret #endif /* IMAGE_BL31 */ #if IMAGE_BL31 && CRASH_REPORTING /* * The cpu specific registers which need to be reported in a crash * are reported via cpu_ops cpu_reg_dump function. After a matching * cpu_ops structure entry is found, the correponding cpu_reg_dump * in the cpu_ops is invoked. */ .globl do_cpu_reg_dump func do_cpu_reg_dump mov x16, x30 /* Get the matching cpu_ops pointer */ bl get_cpu_ops_ptr cbz x0, 1f /* Get the cpu_ops cpu_reg_dump */ ldr x2, [x0, #CPU_REG_DUMP] cbz x2, 1f blr x2 1: mov x30, x16 ret #endif /* * The below function returns the cpu_ops structure matching the * midr of the core. It reads the MIDR_EL1 and finds the matching * entry in cpu_ops entries. Only the implementation and part number * are used to match the entries. * Return : * x0 - The matching cpu_ops pointer on Success * x0 - 0 on failure. * Clobbers : x0 - x5 */ .globl get_cpu_ops_ptr func get_cpu_ops_ptr /* Get the cpu_ops start and end locations */ adr x4, (__CPU_OPS_START__ + CPU_MIDR) adr x5, (__CPU_OPS_END__ + CPU_MIDR) /* Initialize the return parameter */ mov x0, #0 /* Read the MIDR_EL1 */ mrs x2, midr_el1 mov_imm x3, CPU_IMPL_PN_MASK /* Retain only the implementation and part number using mask */ and w2, w2, w3 1: /* Check if we have reached end of list */ cmp x4, x5 b.eq error_exit /* load the midr from the cpu_ops */ ldr x1, [x4], #CPU_OPS_SIZE and w1, w1, w3 /* Check if midr matches to midr of this core */ cmp w1, w2 b.ne 1b /* Subtract the increment and offset to get the cpu-ops pointer */ sub x0, x4, #(CPU_OPS_SIZE + CPU_MIDR) error_exit: ret arm-trusted-firmware-1.0-aw-6/lib/cpus/cpu-errata.mk000066400000000000000000000041531322600646200223230ustar00rootroot00000000000000# # Copyright (c) 2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # CPU Errata Build flags. These should be enabled by the # platform if the errata needs to be applied. # Flag to apply errata 806969 during reset. This errata applies only to # revision r0p0 of the Cortex A57 cpu. ERRATA_A57_806969 ?=0 # Flag to apply errata 813420 during reset. This errata applies only to # revision r0p0 of the Cortex A57 cpu. ERRATA_A57_813420 ?=0 # Process ERRATA_A57_806969 flag $(eval $(call assert_boolean,ERRATA_A57_806969)) $(eval $(call add_define,ERRATA_A57_806969)) # Process ERRATA_A57_813420 flag $(eval $(call assert_boolean,ERRATA_A57_813420)) $(eval $(call add_define,ERRATA_A57_813420)) arm-trusted-firmware-1.0-aw-6/lib/locks/000077500000000000000000000000001322600646200200655ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/locks/bakery/000077500000000000000000000000001322600646200213425ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/locks/bakery/bakery_lock.c000066400000000000000000000146531322600646200240040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include /* * Functions in this file implement Bakery Algorithm for mutual exclusion. * * ARM architecture offers a family of exclusive access instructions to * efficiently implement mutual exclusion with hardware support. However, as * well as depending on external hardware, the these instructions have defined * behavior only on certain memory types (cacheable and Normal memory in * particular; see ARMv8 Architecture Reference Manual section B2.10). Use cases * in trusted firmware are such that mutual exclusion implementation cannot * expect that accesses to the lock have the specific type required by the * architecture for these primitives to function (for example, not all * contenders may have address translation enabled). * * This implementation does not use mutual exclusion primitives. It expects * memory regions where the locks reside to be fully ordered and coherent * (either by disabling address translation, or by assigning proper attributes * when translation is enabled). * * Note that the ARM architecture guarantees single-copy atomicity for aligned * accesses regardless of status of address translation. */ #define assert_bakery_entry_valid(entry, bakery) do { \ assert(bakery); \ assert(entry < BAKERY_LOCK_MAX_CPUS); \ } while (0) /* Convert a ticket to priority */ #define PRIORITY(t, pos) (((t) << 8) | (pos)) /* Initialize Bakery Lock to reset ownership and all ticket values */ void bakery_lock_init(bakery_lock_t *bakery) { assert(bakery); /* All ticket values need to be 0 */ memset(bakery, 0, sizeof(*bakery)); bakery->owner = NO_OWNER; } /* Obtain a ticket for a given CPU */ static unsigned int bakery_get_ticket(bakery_lock_t *bakery, unsigned int me) { unsigned int my_ticket, their_ticket; unsigned int they; /* * Flag that we're busy getting our ticket. All CPUs are iterated in the * order of their ordinal position to decide the maximum ticket value * observed so far. Our priority is set to be greater than the maximum * observed priority * * Note that it's possible that more than one contender gets the same * ticket value. That's OK as the lock is acquired based on the priority * value, not the ticket value alone. */ my_ticket = 0; bakery->entering[me] = 1; for (they = 0; they < BAKERY_LOCK_MAX_CPUS; they++) { their_ticket = bakery->number[they]; if (their_ticket > my_ticket) my_ticket = their_ticket; } /* * Compute ticket; then signal to other contenders waiting for us to * finish calculating our ticket value that we're done */ ++my_ticket; bakery->number[me] = my_ticket; bakery->entering[me] = 0; dsb(); sev(); return my_ticket; } /* * Acquire bakery lock * * Contending CPUs need first obtain a non-zero ticket and then calculate * priority value. A contending CPU iterate over all other CPUs in the platform, * which may be contending for the same lock, in the order of their ordinal * position (CPU0, CPU1 and so on). A non-contending CPU will have its ticket * (and priority) value as 0. The contending CPU compares its priority with that * of others'. The CPU with the highest priority (lowest numerical value) * acquires the lock */ void bakery_lock_get(bakery_lock_t *bakery) { unsigned int they, me; unsigned int my_ticket, my_prio, their_ticket; me = platform_get_core_pos(read_mpidr_el1()); assert_bakery_entry_valid(me, bakery); /* Prevent recursive acquisition */ assert(bakery->owner != me); /* Get a ticket */ my_ticket = bakery_get_ticket(bakery, me); /* * Now that we got our ticket, compute our priority value, then compare * with that of others, and proceed to acquire the lock */ my_prio = PRIORITY(my_ticket, me); for (they = 0; they < BAKERY_LOCK_MAX_CPUS; they++) { if (me == they) continue; /* Wait for the contender to get their ticket */ while (bakery->entering[they]) wfe(); /* * If the other party is a contender, they'll have non-zero * (valid) ticket value. If they do, compare priorities */ their_ticket = bakery->number[they]; if (their_ticket && (PRIORITY(their_ticket, they) < my_prio)) { /* * They have higher priority (lower value). Wait for * their ticket value to change (either release the lock * to have it dropped to 0; or drop and probably content * again for the same lock to have an even higher value) */ do { wfe(); } while (their_ticket == bakery->number[they]); } } /* Lock acquired */ bakery->owner = me; } /* Release the lock and signal contenders */ void bakery_lock_release(bakery_lock_t *bakery) { unsigned int me = platform_get_core_pos(read_mpidr_el1()); assert_bakery_entry_valid(me, bakery); assert(bakery->owner == me); /* * Release lock by resetting ownership and ticket. Then signal other * waiting contenders */ bakery->owner = NO_OWNER; bakery->number[me] = 0; dsb(); sev(); } arm-trusted-firmware-1.0-aw-6/lib/locks/exclusive/000077500000000000000000000000001322600646200220745ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/locks/exclusive/spinlock.S000066400000000000000000000033621322600646200240460ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include .globl spin_lock .globl spin_unlock func spin_lock mov w2, #1 sevl l1: wfe l2: ldaxr w1, [x0] cbnz w1, l1 stxr w1, w2, [x0] cbnz w1, l2 ret func spin_unlock stlr wzr, [x0] ret arm-trusted-firmware-1.0-aw-6/lib/semihosting/000077500000000000000000000000001322600646200213035ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/semihosting/aarch64/000077500000000000000000000000001322600646200225335ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/semihosting/aarch64/semihosting_call.S000066400000000000000000000031661322600646200262110ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include .globl semihosting_call func semihosting_call hlt #0xf000 ret arm-trusted-firmware-1.0-aw-6/lib/semihosting/semihosting.c000066400000000000000000000136261322600646200240100ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #ifndef SEMIHOSTING_SUPPORTED #define SEMIHOSTING_SUPPORTED 1 #endif long semihosting_call(unsigned long operation, void *system_block_address); typedef struct { const char *file_name; unsigned long mode; size_t name_length; } smh_file_open_block_t; typedef struct { long handle; uintptr_t buffer; size_t length; } smh_file_read_write_block_t; typedef struct { long handle; ssize_t location; } smh_file_seek_block_t; typedef struct { char *command_line; size_t command_length; } smh_system_block_t; long semihosting_connection_supported(void) { return SEMIHOSTING_SUPPORTED; } long semihosting_file_open(const char *file_name, size_t mode) { smh_file_open_block_t open_block; open_block.file_name = file_name; open_block.mode = mode; open_block.name_length = strlen(file_name); return semihosting_call(SEMIHOSTING_SYS_OPEN, (void *) &open_block); } long semihosting_file_seek(long file_handle, ssize_t offset) { smh_file_seek_block_t seek_block; long result; seek_block.handle = file_handle; seek_block.location = offset; result = semihosting_call(SEMIHOSTING_SYS_SEEK, (void *) &seek_block); if (result) result = semihosting_call(SEMIHOSTING_SYS_ERRNO, 0); return result; } long semihosting_file_read(long file_handle, size_t *length, uintptr_t buffer) { smh_file_read_write_block_t read_block; long result = -EINVAL; if ((length == NULL) || (buffer == (uintptr_t)NULL)) return result; read_block.handle = file_handle; read_block.buffer = buffer; read_block.length = *length; result = semihosting_call(SEMIHOSTING_SYS_READ, (void *) &read_block); if (result == *length) { return -EINVAL; } else if (result < *length) { *length -= result; return 0; } else return result; } long semihosting_file_write(long file_handle, size_t *length, const uintptr_t buffer) { smh_file_read_write_block_t write_block; if ((length == NULL) || (buffer == (uintptr_t)NULL)) return -EINVAL; write_block.handle = file_handle; write_block.buffer = (uintptr_t)buffer; /* cast away const */ write_block.length = *length; *length = semihosting_call(SEMIHOSTING_SYS_WRITE, (void *) &write_block); return *length; } long semihosting_file_close(long file_handle) { return semihosting_call(SEMIHOSTING_SYS_CLOSE, (void *) &file_handle); } long semihosting_file_length(long file_handle) { return semihosting_call(SEMIHOSTING_SYS_FLEN, (void *) &file_handle); } char semihosting_read_char(void) { return semihosting_call(SEMIHOSTING_SYS_READC, NULL); } void semihosting_write_char(char character) { semihosting_call(SEMIHOSTING_SYS_WRITEC, (void *) &character); } void semihosting_write_string(char *string) { semihosting_call(SEMIHOSTING_SYS_WRITE0, (void *) string); } long semihosting_system(char *command_line) { smh_system_block_t system_block; system_block.command_line = command_line; system_block.command_length = strlen(command_line); return semihosting_call(SEMIHOSTING_SYS_SYSTEM, (void *) &system_block); } long semihosting_get_flen(const char *file_name) { long file_handle; size_t length; assert(semihosting_connection_supported()); file_handle = semihosting_file_open(file_name, FOPEN_MODE_RB); if (file_handle == -1) return file_handle; /* Find the length of the file */ length = semihosting_file_length(file_handle); return semihosting_file_close(file_handle) ? -1 : length; } long semihosting_download_file(const char *file_name, size_t buf_size, uintptr_t buf) { long ret = -EINVAL; size_t length; long file_handle; /* Null pointer check */ if (!buf) return ret; assert(semihosting_connection_supported()); file_handle = semihosting_file_open(file_name, FOPEN_MODE_RB); if (file_handle == -1) return ret; /* Find the actual length of the file */ length = semihosting_file_length(file_handle); if (length == -1) goto semihosting_fail; /* Signal error if we do not have enough space for the file */ if (length > buf_size) goto semihosting_fail; /* * A successful read will return 0 in which case we pass back * the actual number of bytes read. Else we pass a negative * value indicating an error. */ ret = semihosting_file_read(file_handle, &length, buf); if (ret) goto semihosting_fail; else ret = length; semihosting_fail: semihosting_file_close(file_handle); return ret; } arm-trusted-firmware-1.0-aw-6/lib/stdlib/000077500000000000000000000000001322600646200202335ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/lib/stdlib/abort.c000066400000000000000000000032441322600646200215110ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include /* * This is a basic implementation. This could be improved. */ void abort (void) { ERROR("ABORT\n"); panic(); } arm-trusted-firmware-1.0-aw-6/lib/stdlib/assert.c000066400000000000000000000034441322600646200217050ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include /* * This is a basic implementation. This could be improved. */ void __assert (const char *function, const char *file, unsigned int line, const char *assertion) { tf_printf("ASSERT: %s <%d> : %s\n", function, line, assertion); while(1); } arm-trusted-firmware-1.0-aw-6/lib/stdlib/mem.c000066400000000000000000000062621322600646200211630ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include /* size_t */ /* * Fill @count bytes of memory pointed to by @dst with @val */ void *memset(void *dst, int val, size_t count) { char *ptr = dst; while (count--) *ptr++ = val; return dst; } /* * Compare @len bytes of @s1 and @s2 */ int memcmp(const void *s1, const void *s2, size_t len) { const char *s = s1; const char *d = s2; char dc; char sc; while (len--) { sc = *s++; dc = *d++; if (sc - dc) return (sc - dc); } return 0; } /* * Copy @len bytes from @src to @dst */ void *memcpy(void *dst, const void *src, size_t len) { const char *s = src; char *d = dst; while (len--) *d++ = *s++; return dst; } /* * Move @len bytes from @src to @dst */ void *memmove(void *dst, const void *src, size_t len) { /* * The following test makes use of unsigned arithmetic overflow to * more efficiently test the condition !(src <= dst && dst < str+len). * It also avoids the situation where the more explicit test would give * incorrect results were the calculation str+len to overflow (though * that issue is probably moot as such usage is probably undefined * behaviour and a bug anyway. */ if ((size_t)dst - (size_t)src >= len) { /* destination not in source data, so can safely use memcpy */ return memcpy(dst, src, len); } else { /* copy backwards... */ const char *end = dst; const char *s = (const char *)src + len; char *d = (char *)dst + len; while (d != end) *--d = *--s; } return dst; } /* * Scan @len bytes of @src for value @c */ void *memchr(const void *src, int c, size_t len) { const char *s = src; while (len--) { if (*s == c) return (void *) s; s++; } return NULL; } arm-trusted-firmware-1.0-aw-6/lib/stdlib/printf.c000066400000000000000000000040451322600646200217040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /* Choose max of 128 chars for now. */ #define PRINT_BUFFER_SIZE 128 int printf(const char *fmt, ...) { va_list args; char buf[PRINT_BUFFER_SIZE]; int count; va_start(args, fmt); vsnprintf(buf, sizeof(buf) - 1, fmt, args); va_end(args); /* Use putchar directly as 'puts()' adds a newline. */ buf[PRINT_BUFFER_SIZE - 1] = '\0'; count = 0; while (buf[count]) { if (putchar(buf[count]) != EOF) { count++; } else { count = EOF; break; } } return count; } arm-trusted-firmware-1.0-aw-6/lib/stdlib/putchar.c000066400000000000000000000037321322600646200220520ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /* Putchar() should either return the character printed or EOF in case of error. * Our current console_putc() function assumes success and returns the * character. Write all other printing functions in terms of putchar(), if * possible, so they all benefit when this is improved. */ int putchar(int c) { int res; if (console_putc((unsigned char)c) >= 0) res = c; else res = EOF; return res; } arm-trusted-firmware-1.0-aw-6/lib/stdlib/puts.c000066400000000000000000000035741322600646200214030ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include int puts(const char *s) { int count = 0; while(*s) { if (putchar(*s++) != EOF) { count++; } else { count = EOF; break; } } /* According to the puts(3) manpage, the function should write a * trailing newline. */ if ((count != EOF) && (putchar('\n') != EOF)) count++; else count = EOF; return count; } arm-trusted-firmware-1.0-aw-6/lib/stdlib/std.c000066400000000000000000000034461322600646200212000ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* Include the various implemented functions */ #include "abort.c" #include "assert.c" #include "mem.c" #include "printf.c" #include "putchar.c" #include "puts.c" #include "strchr.c" #include "strcmp.c" #include "strlen.c" #include "strncmp.c" #include "subr_prf.c" arm-trusted-firmware-1.0-aw-6/lib/stdlib/strchr.c000066400000000000000000000036121322600646200217060ustar00rootroot00000000000000/*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Portions copyright (c) 2013-2014, ARM Limited and Contributors. * All rights reserved. */ #include #include #include char * strchr(const char *p, int ch) { char c; c = ch; for (;; ++p) { if (*p == c) return ((char *)p); if (*p == '\0') return (NULL); } /* NOTREACHED */ } arm-trusted-firmware-1.0-aw-6/lib/stdlib/strcmp.c000066400000000000000000000037431322600646200217160ustar00rootroot00000000000000/*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Portions copyright (c) 2014, ARM Limited and Contributors. * All rights reserved. */ #include #include /* * Compare strings. */ int strcmp(const char *s1, const char *s2) { while (*s1 == *s2++) if (*s1++ == '\0') return 0; return *(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1); } arm-trusted-firmware-1.0-aw-6/lib/stdlib/strlen.c000066400000000000000000000034371322600646200217150ustar00rootroot00000000000000/*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Portions copyright (c) 2009-2014, ARM Limited and Contributors. All rights reserved. */ #include size_t strlen(str) const char *str; { register const char *s; for (s = str; *s; ++s); return(s - str); } arm-trusted-firmware-1.0-aw-6/lib/stdlib/strncmp.c000066400000000000000000000037011322600646200220660ustar00rootroot00000000000000/* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Portions copyright (c) 2014, ARM Limited and Contributors. * All rights reserved. */ #include #include int strncmp(const char *s1, const char *s2, size_t n) { if (n == 0) return 0; do { if (*s1 != *s2++) return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1)); if (*s1++ == '\0') break; } while (--n != 0); return 0; } arm-trusted-firmware-1.0-aw-6/lib/stdlib/subr_prf.c000066400000000000000000000277361322600646200222400ustar00rootroot00000000000000/*- * Copyright (c) 1986, 1988, 1991, 1993 * The Regents of the University of California. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph * Co. or Unix System Laboratories, Inc. and are reproduced herein with * the permission of UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)subr_prf.c 8.3 (Berkeley) 1/21/94 */ /* * Portions copyright (c) 2009-2014, ARM Limited and Contributors. * All rights reserved. */ #include #include #include #include #include #include typedef unsigned char u_char; typedef unsigned int u_int; typedef int64_t quad_t; typedef uint64_t u_quad_t; typedef unsigned long u_long; typedef unsigned short u_short; static inline int imax(int a, int b) { return (a > b ? a : b); } /* * Note that stdarg.h and the ANSI style va_start macro is used for both * ANSI and traditional C compilers. */ #define TOCONS 0x01 #define TOTTY 0x02 #define TOLOG 0x04 /* Max number conversion buffer length: a u_quad_t in base 2, plus NUL byte. */ #define MAXNBUF (sizeof(intmax_t) * 8 + 1) struct putchar_arg { int flags; int pri; struct tty *tty; char *p_bufr; size_t n_bufr; char *p_next; size_t remain; }; struct snprintf_arg { char *str; size_t remain; }; extern int log_open; static char *ksprintn(char *nbuf, uintmax_t num, int base, int *len, int upper); static void snprintf_func(int ch, void *arg); static int kvprintf(char const *fmt, void (*func)(int, void*), void *arg, int radix, va_list ap); int vsnprintf(char *str, size_t size, const char *format, va_list ap); static char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; #define hex2ascii(hex) (hex2ascii_data[hex]) /* * Scaled down version of sprintf(3). */ int sprintf(char *buf, const char *cfmt, ...) { int retval; va_list ap; va_start(ap, cfmt); retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap); buf[retval] = '\0'; va_end(ap); return (retval); } /* * Scaled down version of vsprintf(3). */ int vsprintf(char *buf, const char *cfmt, va_list ap) { int retval; retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap); buf[retval] = '\0'; return (retval); } /* * Scaled down version of snprintf(3). */ int snprintf(char *str, size_t size, const char *format, ...) { int retval; va_list ap; va_start(ap, format); retval = vsnprintf(str, size, format, ap); va_end(ap); return(retval); } /* * Scaled down version of vsnprintf(3). */ int vsnprintf(char *str, size_t size, const char *format, va_list ap) { struct snprintf_arg info; int retval; info.str = str; info.remain = size; retval = kvprintf(format, snprintf_func, &info, 10, ap); if (info.remain >= 1) *info.str++ = '\0'; return (retval); } static void snprintf_func(int ch, void *arg) { struct snprintf_arg *const info = arg; if (info->remain >= 2) { *info->str++ = ch; info->remain--; } } /* * Kernel version which takes radix argument vsnprintf(3). */ int vsnrprintf(char *str, size_t size, int radix, const char *format, va_list ap) { struct snprintf_arg info; int retval; info.str = str; info.remain = size; retval = kvprintf(format, snprintf_func, &info, radix, ap); if (info.remain >= 1) *info.str++ = '\0'; return (retval); } /* * Put a NUL-terminated ASCII number (base <= 36) in a buffer in reverse * order; return an optional length and a pointer to the last character * written in the buffer (i.e., the first character of the string). * The buffer pointed to by `nbuf' must have length >= MAXNBUF. */ static char * ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) { char *p, c; p = nbuf; *p = '\0'; do { c = hex2ascii(num % base); *++p = upper ? toupper(c) : c; } while (num /= base); if (lenp) *lenp = p - nbuf; return (p); } /* * Scaled down version of printf(3). * * Two additional formats: * * The format %b is supported to decode error registers. * Its usage is: * * printf("reg=%b\n", regval, "*"); * * where is the output base expressed as a control character, e.g. * \10 gives octal; \20 gives hex. Each arg is a sequence of characters, * the first of which gives the bit number to be inspected (origin 1), and * the next characters (up to a control character, i.e. a character <= 32), * give the name of the register. Thus: * * kvprintf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); * * would produce output: * * reg=3 * * XXX: %D -- Hexdump, takes pointer and separator string: * ("%6D", ptr, ":") -> XX:XX:XX:XX:XX:XX * ("%*D", len, ptr, " " -> XX XX XX XX ... */ int kvprintf(char const *fmt, void (*func)(int, void*), void *arg, int radix, va_list ap) { #define PCHAR(c) {int cc=(c); if (func) (*func)(cc,arg); else *d++ = cc; retval++; } char nbuf[MAXNBUF]; char *d; const char *p, *percent, *q; u_char *up; int ch, n; uintmax_t num; int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot; int cflag, hflag, jflag, tflag, zflag; int dwidth, upper; char padc; int stop = 0, retval = 0; num = 0; if (!func) d = (char *) arg; else d = NULL; if (fmt == NULL) fmt = "(fmt null)\n"; if (radix < 2 || radix > 36) radix = 10; for (;;) { padc = ' '; width = 0; while ((ch = (u_char)*fmt++) != '%' || stop) { if (ch == '\0') return (retval); PCHAR(ch); } percent = fmt - 1; qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0; sign = 0; dot = 0; dwidth = 0; upper = 0; cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0; reswitch: switch (ch = (u_char)*fmt++) { case '.': dot = 1; goto reswitch; case '#': sharpflag = 1; goto reswitch; case '+': sign = 1; goto reswitch; case '-': ladjust = 1; goto reswitch; case '%': PCHAR(ch); break; case '*': if (!dot) { width = va_arg(ap, int); if (width < 0) { ladjust = !ladjust; width = -width; } } else { dwidth = va_arg(ap, int); } goto reswitch; case '0': if (!dot) { padc = '0'; goto reswitch; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (n = 0;; ++fmt) { n = n * 10 + ch - '0'; ch = *fmt; if (ch < '0' || ch > '9') break; } if (dot) dwidth = n; else width = n; goto reswitch; case 'b': num = (u_int)va_arg(ap, int); p = va_arg(ap, char *); for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;) PCHAR(*q--); if (num == 0) break; for (tmp = 0; *p;) { n = *p++; if (num & (1 << (n - 1))) { PCHAR(tmp ? ',' : '<'); for (; (n = *p) > ' '; ++p) PCHAR(n); tmp = 1; } else for (; *p > ' '; ++p) continue; } if (tmp) PCHAR('>'); break; case 'c': PCHAR(va_arg(ap, int)); break; case 'D': up = va_arg(ap, u_char *); p = va_arg(ap, char *); if (!width) width = 16; while(width--) { PCHAR(hex2ascii(*up >> 4)); PCHAR(hex2ascii(*up & 0x0f)); up++; if (width) for (q=p;*q;q++) PCHAR(*q); } break; case 'd': case 'i': base = 10; sign = 1; goto handle_sign; case 'h': if (hflag) { hflag = 0; cflag = 1; } else hflag = 1; goto reswitch; case 'j': jflag = 1; goto reswitch; case 'l': if (lflag) { lflag = 0; qflag = 1; } else lflag = 1; goto reswitch; case 'n': if (jflag) *(va_arg(ap, intmax_t *)) = retval; else if (qflag) *(va_arg(ap, quad_t *)) = retval; else if (lflag) *(va_arg(ap, long *)) = retval; else if (zflag) *(va_arg(ap, size_t *)) = retval; else if (hflag) *(va_arg(ap, short *)) = retval; else if (cflag) *(va_arg(ap, char *)) = retval; else *(va_arg(ap, int *)) = retval; break; case 'o': base = 8; goto handle_nosign; case 'p': base = 16; sharpflag = (width == 0); sign = 0; num = (uintptr_t)va_arg(ap, void *); goto number; case 'q': qflag = 1; goto reswitch; case 'r': base = radix; if (sign) goto handle_sign; goto handle_nosign; case 's': p = va_arg(ap, char *); if (p == NULL) p = "(null)"; if (!dot) n = strlen (p); else for (n = 0; n < dwidth && p[n]; n++) continue; width -= n; if (!ladjust && width > 0) while (width--) PCHAR(padc); while (n--) PCHAR(*p++); if (ladjust && width > 0) while (width--) PCHAR(padc); break; case 't': tflag = 1; goto reswitch; case 'u': base = 10; goto handle_nosign; case 'X': upper = 1; case 'x': base = 16; goto handle_nosign; case 'y': base = 16; sign = 1; goto handle_sign; case 'z': zflag = 1; goto reswitch; handle_nosign: sign = 0; if (jflag) num = va_arg(ap, uintmax_t); else if (qflag) num = va_arg(ap, u_quad_t); else if (tflag) num = va_arg(ap, ptrdiff_t); else if (lflag) num = va_arg(ap, u_long); else if (zflag) num = va_arg(ap, size_t); else if (hflag) num = (u_short)va_arg(ap, int); else if (cflag) num = (u_char)va_arg(ap, int); else num = va_arg(ap, u_int); goto number; handle_sign: if (jflag) num = va_arg(ap, intmax_t); else if (qflag) num = va_arg(ap, quad_t); else if (tflag) num = va_arg(ap, ptrdiff_t); else if (lflag) num = va_arg(ap, long); else if (zflag) num = va_arg(ap, ssize_t); else if (hflag) num = (short)va_arg(ap, int); else if (cflag) num = (char)va_arg(ap, int); else num = va_arg(ap, int); number: if (sign && (intmax_t)num < 0) { neg = 1; num = -(intmax_t)num; } p = ksprintn(nbuf, num, base, &n, upper); tmp = 0; if (sharpflag && num != 0) { if (base == 8) tmp++; else if (base == 16) tmp += 2; } if (neg) tmp++; if (!ladjust && padc == '0') dwidth = width - tmp; width -= tmp + imax(dwidth, n); dwidth -= n; if (!ladjust) while (width-- > 0) PCHAR(' '); if (neg) PCHAR('-'); if (sharpflag && num != 0) { if (base == 8) { PCHAR('0'); } else if (base == 16) { PCHAR('0'); PCHAR('x'); } } while (dwidth-- > 0) PCHAR('0'); while (*p) PCHAR(*p--); if (ladjust) while (width-- > 0) PCHAR(' '); break; default: while (percent < fmt) PCHAR(*percent++); /* * Since we ignore an formatting argument it is no * longer safe to obey the remaining formatting * arguments as the arguments will no longer match * the format specs. */ stop = 1; break; } } #undef PCHAR } arm-trusted-firmware-1.0-aw-6/license.md000066400000000000000000000027271322600646200201600ustar00rootroot00000000000000Copyright (c) 2013-2014, 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: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of ARM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. arm-trusted-firmware-1.0-aw-6/plat/000077500000000000000000000000001322600646200171445ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/common/000077500000000000000000000000001322600646200204345ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/common/aarch64/000077500000000000000000000000001322600646200216645ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/common/aarch64/plat_common.c000066400000000000000000000037241322600646200243460ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include /* * The following 2 platform setup functions are weakly defined. They * provide typical implementations that may be re-used by multiple * platforms but may also be overridden by a platform if required. */ #pragma weak bl31_plat_enable_mmu #pragma weak bl32_plat_enable_mmu void bl31_plat_enable_mmu(uint32_t flags) { enable_mmu_el3(flags); } void bl32_plat_enable_mmu(uint32_t flags) { enable_mmu_el1(flags); } arm-trusted-firmware-1.0-aw-6/plat/common/aarch64/platform_helpers.S000066400000000000000000000071121322600646200253570ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .weak platform_get_core_pos .weak platform_check_mpidr .weak plat_report_exception .weak plat_crash_console_init .weak plat_crash_console_putc .weak plat_reset_handler .weak plat_disable_acp /* ----------------------------------------------------- * int platform_get_core_pos(int mpidr); * With this function: CorePos = (ClusterId * 4) + * CoreId * ----------------------------------------------------- */ func platform_get_core_pos and x1, x0, #MPIDR_CPU_MASK and x0, x0, #MPIDR_CLUSTER_MASK add x0, x1, x0, LSR #6 ret /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. * ----------------------------------------------------- */ func platform_check_mpidr mov x0, xzr ret /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. * ----------------------------------------------------- */ func plat_report_exception ret /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. * ----------------------------------------------------- */ func plat_crash_console_init mov x0, #0 ret /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. * ----------------------------------------------------- */ func plat_crash_console_putc ret /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. This function should preserve x10. * ----------------------------------------------------- */ func plat_reset_handler ret /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. This function is allowed to use * registers x0 - x17. * ----------------------------------------------------- */ func plat_disable_acp ret arm-trusted-firmware-1.0-aw-6/plat/common/aarch64/platform_mp_stack.S000066400000000000000000000053531322600646200255230ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .local platform_normal_stacks .weak platform_set_stack .weak platform_get_stack /* ----------------------------------------------------- * unsigned long platform_get_stack (unsigned long mpidr) * * For a given CPU, this function returns the stack * pointer for a stack allocated in device memory. * ----------------------------------------------------- */ func platform_get_stack mov x10, x30 // lr get_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE ret x10 /* ----------------------------------------------------- * void platform_set_stack (unsigned long mpidr) * * For a given CPU, this function sets the stack pointer * to a stack allocated in normal memory. * ----------------------------------------------------- */ func platform_set_stack mov x9, x30 // lr bl platform_get_stack mov sp, x0 ret x9 /* ----------------------------------------------------- * Per-cpu stacks in normal memory. Each cpu gets a * stack of PLATFORM_STACK_SIZE bytes. * ----------------------------------------------------- */ declare_stack platform_normal_stacks, tzfw_normal_stacks, \ PLATFORM_STACK_SIZE, PLATFORM_CORE_COUNT arm-trusted-firmware-1.0-aw-6/plat/common/aarch64/platform_up_stack.S000066400000000000000000000054711322600646200255340ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include .local platform_normal_stacks .globl platform_set_stack .globl platform_get_stack /* ----------------------------------------------------- * unsigned long platform_get_stack (unsigned long) * * For cold-boot BL images, only the primary CPU needs a * stack. This function returns the stack pointer for a * stack allocated in device memory. * ----------------------------------------------------- */ func platform_get_stack get_up_stack platform_normal_stacks, PLATFORM_STACK_SIZE ret /* ----------------------------------------------------- * void platform_set_stack (unsigned long) * * For cold-boot BL images, only the primary CPU needs a * stack. This function sets the stack pointer to a stack * allocated in normal memory. * ----------------------------------------------------- */ func platform_set_stack get_up_stack platform_normal_stacks, PLATFORM_STACK_SIZE mov sp, x0 ret /* ----------------------------------------------------- * Single cpu stack in normal memory. * Used for C code during boot, PLATFORM_STACK_SIZE bytes * are allocated * ----------------------------------------------------- */ declare_stack platform_normal_stacks, tzfw_normal_stacks, \ PLATFORM_STACK_SIZE, 1 arm-trusted-firmware-1.0-aw-6/plat/common/plat_gic.c000066400000000000000000000051331322600646200223640ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include /* * The following platform GIC functions are weakly defined. They * provide typical implementations that may be re-used by multiple * platforms but may also be overridden by a platform if required. */ #pragma weak plat_ic_get_pending_interrupt_id #pragma weak plat_ic_get_pending_interrupt_type #pragma weak plat_ic_acknowledge_interrupt #pragma weak plat_ic_get_interrupt_type #pragma weak plat_ic_end_of_interrupt #pragma weak plat_interrupt_type_to_line uint32_t plat_ic_get_pending_interrupt_id(void) { return arm_gic_get_pending_interrupt_id(); } uint32_t plat_ic_get_pending_interrupt_type(void) { return arm_gic_get_pending_interrupt_type(); } uint32_t plat_ic_acknowledge_interrupt(void) { return arm_gic_acknowledge_interrupt(); } uint32_t plat_ic_get_interrupt_type(uint32_t id) { return arm_gic_get_interrupt_type(id); } void plat_ic_end_of_interrupt(uint32_t id) { arm_gic_end_of_interrupt(id); } uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state) { return arm_gic_interrupt_type_to_line(type, security_state); } arm-trusted-firmware-1.0-aw-6/plat/fvp/000077500000000000000000000000001322600646200177375ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/fvp/aarch64/000077500000000000000000000000001322600646200211675ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/fvp/aarch64/fvp_common.c000066400000000000000000000225771322600646200235130ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "../fvp_def.h" /******************************************************************************* * plat_config holds the characteristics of the differences between the three * FVP platforms (Base, A53_A57 & Foundation). It will be populated during cold * boot at each boot stage by the primary before enabling the MMU (to allow cci * configuration) & used thereafter. Each BL will have its own copy to allow * independent operation. ******************************************************************************/ plat_config_t plat_config; /* * Table of regions to map using the MMU. * This doesn't include TZRAM as the 'mem_layout' argument passed to * configure_mmu_elx() will give the available subset of that, */ const mmap_region_t fvp_mmap[] = { { FVP_SHARED_RAM_BASE, FVP_SHARED_RAM_BASE, FVP_SHARED_RAM_SIZE, MT_MEMORY | MT_RW | MT_SECURE }, { FVP_TRUSTED_DRAM_BASE, FVP_TRUSTED_DRAM_BASE, FVP_TRUSTED_DRAM_SIZE, MT_MEMORY | MT_RW | MT_SECURE }, { FLASH0_BASE, FLASH0_BASE, FLASH0_SIZE, MT_MEMORY | MT_RO | MT_SECURE }, { FLASH1_BASE, FLASH1_BASE, FLASH1_SIZE, MT_MEMORY | MT_RO | MT_SECURE }, { VRAM_BASE, VRAM_BASE, VRAM_SIZE, MT_MEMORY | MT_RW | MT_SECURE }, { DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, { DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, /* 2nd GB as device for now...*/ { 0x40000000, 0x40000000, 0x40000000, MT_DEVICE | MT_RW | MT_SECURE }, { DRAM1_BASE, DRAM1_BASE, DRAM1_SIZE, MT_MEMORY | MT_RW | MT_NS }, {0} }; /* Array of secure interrupts to be configured by the gic driver */ const unsigned int irq_sec_array[] = { IRQ_TZ_WDOG, IRQ_SEC_PHY_TIMER, IRQ_SEC_SGI_0, IRQ_SEC_SGI_1, IRQ_SEC_SGI_2, IRQ_SEC_SGI_3, IRQ_SEC_SGI_4, IRQ_SEC_SGI_5, IRQ_SEC_SGI_6, IRQ_SEC_SGI_7 }; const unsigned int num_sec_irqs = sizeof(irq_sec_array) / sizeof(irq_sec_array[0]); /******************************************************************************* * Macro generating the code for the function setting up the pagetables as per * the platform memory map & initialize the mmu, for the given exception level ******************************************************************************/ #define DEFINE_CONFIGURE_MMU_EL(_el) \ void fvp_configure_mmu_el##_el(unsigned long total_base, \ unsigned long total_size, \ unsigned long ro_start, \ unsigned long ro_limit, \ unsigned long coh_start, \ unsigned long coh_limit) \ { \ mmap_add_region(total_base, total_base, \ total_size, \ MT_MEMORY | MT_RW | MT_SECURE); \ mmap_add_region(ro_start, ro_start, \ ro_limit - ro_start, \ MT_MEMORY | MT_RO | MT_SECURE); \ mmap_add_region(coh_start, coh_start, \ coh_limit - coh_start, \ MT_DEVICE | MT_RW | MT_SECURE); \ mmap_add(fvp_mmap); \ init_xlat_tables(); \ \ enable_mmu_el##_el(0); \ } /* Define EL1 and EL3 variants of the function initialising the MMU */ DEFINE_CONFIGURE_MMU_EL(1) DEFINE_CONFIGURE_MMU_EL(3) /******************************************************************************* * A single boot loader stack is expected to work on both the Foundation FVP * models and the two flavours of the Base FVP models (AEMv8 & Cortex). The * SYS_ID register provides a mechanism for detecting the differences between * these platforms. This information is stored in a per-BL array to allow the * code to take the correct path.Per BL platform configuration. ******************************************************************************/ int fvp_config_setup(void) { unsigned int rev, hbi, bld, arch, sys_id; sys_id = mmio_read_32(VE_SYSREGS_BASE + V2M_SYS_ID); rev = (sys_id >> SYS_ID_REV_SHIFT) & SYS_ID_REV_MASK; hbi = (sys_id >> SYS_ID_HBI_SHIFT) & SYS_ID_HBI_MASK; bld = (sys_id >> SYS_ID_BLD_SHIFT) & SYS_ID_BLD_MASK; arch = (sys_id >> SYS_ID_ARCH_SHIFT) & SYS_ID_ARCH_MASK; if (arch != ARCH_MODEL) { ERROR("This firmware is for FVP models\n"); panic(); } /* * The build field in the SYS_ID tells which variant of the GIC * memory is implemented by the model. */ switch (bld) { case BLD_GIC_VE_MMAP: plat_config.gicd_base = VE_GICD_BASE; plat_config.gicc_base = VE_GICC_BASE; plat_config.gich_base = VE_GICH_BASE; plat_config.gicv_base = VE_GICV_BASE; break; case BLD_GIC_A53A57_MMAP: plat_config.gicd_base = BASE_GICD_BASE; plat_config.gicc_base = BASE_GICC_BASE; plat_config.gich_base = BASE_GICH_BASE; plat_config.gicv_base = BASE_GICV_BASE; break; default: ERROR("Unsupported board build %x\n", bld); panic(); } /* * The hbi field in the SYS_ID is 0x020 for the Base FVP & 0x010 * for the Foundation FVP. */ switch (hbi) { case HBI_FOUNDATION: plat_config.max_aff0 = 4; plat_config.max_aff1 = 1; plat_config.flags = 0; /* * Check for supported revisions of Foundation FVP * Allow future revisions to run but emit warning diagnostic */ switch (rev) { case REV_FOUNDATION_V2_0: case REV_FOUNDATION_V2_1: break; default: WARN("Unrecognized Foundation FVP revision %x\n", rev); break; } break; case HBI_FVP_BASE: plat_config.max_aff0 = 4; plat_config.max_aff1 = 2; plat_config.flags |= CONFIG_BASE_MMAP | CONFIG_HAS_CCI | CONFIG_HAS_TZC; /* * Check for supported revisions * Allow future revisions to run but emit warning diagnostic */ switch (rev) { case REV_FVP_BASE_V0: break; default: WARN("Unrecognized Base FVP revision %x\n", rev); break; } break; default: ERROR("Unsupported board HBI number 0x%x\n", hbi); panic(); } return 0; } unsigned long plat_get_ns_image_entrypoint(void) { return NS_IMAGE_OFFSET; } uint64_t plat_get_syscnt_freq(void) { uint64_t counter_base_frequency; /* Read the frequency from Frequency modes table */ counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); /* The first entry of the frequency modes table must not be 0 */ if (counter_base_frequency == 0) panic(); return counter_base_frequency; } void fvp_cci_init(void) { /* * Initialize CCI-400 driver */ if (plat_config.flags & CONFIG_HAS_CCI) cci_init(CCI400_BASE, CCI400_SL_IFACE3_CLUSTER_IX, CCI400_SL_IFACE4_CLUSTER_IX); } void fvp_cci_enable(void) { /* * Enable CCI-400 coherency for this cluster. No need * for locks as no other cpu is active at the * moment */ if (plat_config.flags & CONFIG_HAS_CCI) cci_enable_cluster_coherency(read_mpidr()); } void fvp_gic_init(void) { arm_gic_init(plat_config.gicc_base, plat_config.gicd_base, BASE_GICR_BASE, irq_sec_array, num_sec_irqs); } /******************************************************************************* * Gets SPSR for BL32 entry ******************************************************************************/ uint32_t fvp_get_spsr_for_bl32_entry(void) { /* * The Secure Payload Dispatcher service is responsible for * setting the SPSR prior to entry into the BL32 image. */ return 0; } /******************************************************************************* * Gets SPSR for BL33 entry ******************************************************************************/ uint32_t fvp_get_spsr_for_bl33_entry(void) { unsigned long el_status; unsigned int mode; uint32_t spsr; /* Figure out what mode we enter the non-secure world in */ el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; el_status &= ID_AA64PFR0_ELX_MASK; if (el_status) mode = MODE_EL2; else mode = MODE_EL1; /* * TODO: Consider the possibility of specifying the SPSR in * the FIP ToC and allowing the platform to have a say as * well. */ spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); return spsr; } arm-trusted-firmware-1.0-aw-6/plat/fvp/aarch64/fvp_helpers.S000066400000000000000000000165631322600646200236430ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "../drivers/pwrc/fvp_pwrc.h" .globl platform_get_entrypoint .globl plat_secondary_cold_boot_setup .globl platform_mem_init .globl plat_report_exception .globl platform_is_primary_cpu .globl plat_crash_console_init .globl plat_crash_console_putc .macro fvp_choose_gicmmap param1, param2, x_tmp, w_tmp, res ldr \x_tmp, =VE_SYSREGS_BASE + V2M_SYS_ID ldr \w_tmp, [\x_tmp] ubfx \w_tmp, \w_tmp, #SYS_ID_BLD_SHIFT, #SYS_ID_BLD_LENGTH cmp \w_tmp, #BLD_GIC_VE_MMAP csel \res, \param1, \param2, eq .endm /* ----------------------------------------------------- * void plat_secondary_cold_boot_setup (void); * * This function performs any platform specific actions * needed for a secondary cpu after a cold reset e.g * mark the cpu's presence, mechanism to place it in a * holding pen etc. * TODO: Should we read the PSYS register to make sure * that the request has gone through. * ----------------------------------------------------- */ func plat_secondary_cold_boot_setup /* --------------------------------------------- * Power down this cpu. * TODO: Do we need to worry about powering the * cluster down as well here. That will need * locks which we won't have unless an elf- * loader zeroes out the zi section. * --------------------------------------------- */ mrs x0, mpidr_el1 ldr x1, =PWRC_BASE str w0, [x1, #PPOFFR_OFF] /* --------------------------------------------- * Deactivate the gic cpu interface as well * --------------------------------------------- */ ldr x0, =VE_GICC_BASE ldr x1, =BASE_GICC_BASE fvp_choose_gicmmap x0, x1, x2, w2, x1 mov w0, #(IRQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP1) orr w0, w0, #(IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP0) str w0, [x1, #GICC_CTLR] /* --------------------------------------------- * There is no sane reason to come out of this * wfi so panic if we do. This cpu will be pow- * ered on and reset by the cpu_on pm api * --------------------------------------------- */ dsb sy wfi cb_panic: b cb_panic /* ----------------------------------------------------- * void platform_get_entrypoint (unsigned int mpid); * * Main job of this routine is to distinguish between * a cold and warm boot. * On a cold boot the secondaries first wait for the * platform to be initialized after which they are * hotplugged in. The primary proceeds to perform the * platform initialization. * On a warm boot, each cpu jumps to the address in its * mailbox. * * TODO: Not a good idea to save lr in a temp reg * TODO: PSYSR is a common register and should be * accessed using locks. Since its not possible * to use locks immediately after a cold reset * we are relying on the fact that after a cold * reset all cpus will read the same WK field * ----------------------------------------------------- */ func platform_get_entrypoint mov x9, x30 // lr mov x2, x0 ldr x1, =PWRC_BASE str w2, [x1, #PSYSR_OFF] ldr w2, [x1, #PSYSR_OFF] ubfx w2, w2, #PSYSR_WK_SHIFT, #PSYSR_WK_MASK cmp w2, #WKUP_PPONR beq warm_reset cmp w2, #WKUP_GICREQ beq warm_reset mov x0, #0 b exit warm_reset: /* --------------------------------------------- * A per-cpu mailbox is maintained in the tru- * sted DRAM. Its flushed out of the caches * after every update using normal memory so * its safe to read it here with SO attributes * --------------------------------------------- */ ldr x10, =MBOX_BASE bl platform_get_core_pos lsl x0, x0, #CACHE_WRITEBACK_SHIFT ldr x0, [x10, x0] cbz x0, _panic exit: ret x9 _panic: b _panic /* ----------------------------------------------------- * void platform_mem_init (void); * * Zero out the mailbox registers in the shared memory. * The mmu is turned off right now and only the primary can * ever execute this code. Secondaries will read the * mailboxes using SO accesses. In short, BL31 will * update the mailboxes after mapping the tzdram as * normal memory. It will flush its copy after update. * BL1 will always read the mailboxes with the MMU off * ----------------------------------------------------- */ func platform_mem_init ldr x0, =MBOX_BASE mov w1, #PLATFORM_CORE_COUNT loop: str xzr, [x0], #CACHE_WRITEBACK_GRANULE subs w1, w1, #1 b.gt loop ret /* --------------------------------------------- * void plat_report_exception(unsigned int type) * Function to report an unhandled exception * with platform-specific means. * On FVP platform, it updates the LEDs * to indicate where we are * --------------------------------------------- */ func plat_report_exception mrs x1, CurrentEl lsr x1, x1, #MODE_EL_SHIFT lsl x1, x1, #SYS_LED_EL_SHIFT lsl x0, x0, #SYS_LED_EC_SHIFT mov x2, #(SECURE << SYS_LED_SS_SHIFT) orr x0, x0, x2 orr x0, x0, x1 mov x1, #VE_SYSREGS_BASE add x1, x1, #V2M_SYS_LED str w0, [x1] ret func platform_is_primary_cpu and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) cmp x0, #FVP_PRIMARY_CPU cset x0, eq ret /* Define a crash console for the plaform */ #define FVP_CRASH_CONSOLE_BASE PL011_UART0_BASE /* --------------------------------------------- * int plat_crash_console_init(void) * Function to initialize the crash console * without a C Runtime to print crash report. * Clobber list : x0, x1, x2 * --------------------------------------------- */ func plat_crash_console_init mov_imm x0, FVP_CRASH_CONSOLE_BASE mov_imm x1, PL011_UART0_CLK_IN_HZ mov_imm x2, PL011_BAUDRATE b console_core_init /* --------------------------------------------- * int plat_crash_console_putc(int c) * Function to print a character on the crash * console without a C Runtime. * Clobber list : x1, x2 * --------------------------------------------- */ func plat_crash_console_putc mov_imm x1, FVP_CRASH_CONSOLE_BASE b console_core_putc arm-trusted-firmware-1.0-aw-6/plat/fvp/bl1_fvp_setup.c000066400000000000000000000127201322600646200226560ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "../../bl1/bl1_private.h" #include "fvp_def.h" #include "fvp_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to * page-aligned addresses. */ #define BL1_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL1_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /* Data structure which holds the extents of the trusted SRAM for BL1*/ static meminfo_t bl1_tzram_layout; meminfo_t *bl1_plat_sec_mem_layout(void) { return &bl1_tzram_layout; } /******************************************************************************* * Perform any BL1 specific platform actions. ******************************************************************************/ void bl1_early_platform_setup(void) { const size_t bl1_size = BL1_RAM_LIMIT - BL1_RAM_BASE; /* Initialize the console to provide early debug support */ console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE); /* Allow BL1 to see the whole Trusted RAM */ bl1_tzram_layout.total_base = FVP_TRUSTED_SRAM_BASE; bl1_tzram_layout.total_size = FVP_TRUSTED_SRAM_SIZE; /* Calculate how much RAM BL1 is using and how much remains free */ bl1_tzram_layout.free_base = FVP_TRUSTED_SRAM_BASE; bl1_tzram_layout.free_size = FVP_TRUSTED_SRAM_SIZE; reserve_mem(&bl1_tzram_layout.free_base, &bl1_tzram_layout.free_size, BL1_RAM_BASE, bl1_size); /* Initialize the platform config for future decision making */ fvp_config_setup(); } /******************************************************************************* * Function which will evaluate how much of the trusted ram has been gobbled * up by BL1 and return the base and size of whats available for loading BL2. * Its called after coherency and the MMU have been turned on. ******************************************************************************/ void bl1_platform_setup(void) { /* Initialise the IO layer and register platform IO devices */ fvp_io_setup(); } /******************************************************************************* * Perform the very early platform specific architecture setup here. At the * moment this only does basic initialization. Later architectural setup * (bl1_arch_setup()) does not do anything platform specific. ******************************************************************************/ void bl1_plat_arch_setup(void) { fvp_cci_init(); fvp_cci_enable(); fvp_configure_mmu_el3(bl1_tzram_layout.total_base, bl1_tzram_layout.total_size, BL1_RO_BASE, BL1_RO_LIMIT, BL1_COHERENT_RAM_BASE, BL1_COHERENT_RAM_LIMIT); } /******************************************************************************* * Before calling this function BL2 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL2 and set SPSR and security state. * On FVP we are only setting the security state, entrypoint ******************************************************************************/ void bl1_plat_set_bl2_ep_info(image_info_t *bl2_image, entry_point_info_t *bl2_ep) { SET_SECURITY_STATE(bl2_ep->h.attr, SECURE); bl2_ep->spsr = SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); } arm-trusted-firmware-1.0-aw-6/plat/fvp/bl2_fvp_setup.c000066400000000000000000000265351322600646200226700ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "fvp_def.h" #include "fvp_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL2_RO_BASE (unsigned long)(&__RO_START__) #define BL2_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to * page-aligned addresses. */ #define BL2_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL2_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /* Data structure which holds the extents of the trusted SRAM for BL2 */ static meminfo_t bl2_tzram_layout __attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE), section("tzfw_coherent_mem"))); /* Assert that BL3-1 parameters fit in shared memory */ CASSERT((PARAMS_BASE + sizeof(bl2_to_bl31_params_mem_t)) < (FVP_SHARED_RAM_BASE + FVP_SHARED_RAM_SIZE), assert_bl31_params_do_not_fit_in_shared_memory); /******************************************************************************* * Reference to structures which holds the arguments which need to be passed * to BL31 ******************************************************************************/ static bl31_params_t *bl2_to_bl31_params; static entry_point_info_t *bl31_ep_info; meminfo_t *bl2_plat_sec_mem_layout(void) { return &bl2_tzram_layout; } /******************************************************************************* * This function assigns a pointer to the memory that the platform has kept * aside to pass platform specific and trusted firmware related information * to BL31. This memory is allocated by allocating memory to * bl2_to_bl31_params_mem_t structure which is a superset of all the * structure whose information is passed to BL31 * NOTE: This function should be called only once and should be done * before generating params to BL31 ******************************************************************************/ bl31_params_t *bl2_plat_get_bl31_params(void) { bl2_to_bl31_params_mem_t *bl31_params_mem; /* * Allocate the memory for all the arguments that needs to * be passed to BL31 */ bl31_params_mem = (bl2_to_bl31_params_mem_t *)PARAMS_BASE; memset((void *)PARAMS_BASE, 0, sizeof(bl2_to_bl31_params_mem_t)); /* Assign memory for TF related information */ bl2_to_bl31_params = &bl31_params_mem->bl31_params; SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0); /* Fill BL31 related information */ bl31_ep_info = &bl31_params_mem->bl31_ep_info; bl2_to_bl31_params->bl31_image_info = &bl31_params_mem->bl31_image_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); /* Fill BL32 related information if it exists */ if (BL32_BASE) { bl2_to_bl31_params->bl32_ep_info = &bl31_params_mem->bl32_ep_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info, PARAM_EP, VERSION_1, 0); bl2_to_bl31_params->bl32_image_info = &bl31_params_mem->bl32_image_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); } /* Fill BL33 related information */ bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem->bl33_ep_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info, PARAM_EP, VERSION_1, 0); bl2_to_bl31_params->bl33_image_info = &bl31_params_mem->bl33_image_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); return bl2_to_bl31_params; } /******************************************************************************* * This function returns a pointer to the shared memory that the platform * has kept to point to entry point information of BL31 to BL2 ******************************************************************************/ struct entry_point_info *bl2_plat_get_bl31_ep_info(void) { #if DEBUG bl31_ep_info->args.arg1 = FVP_BL31_PLAT_PARAM_VAL; #endif return bl31_ep_info; } /******************************************************************************* * BL1 has passed the extents of the trusted SRAM that should be visible to BL2 * in x0. This memory layout is sitting at the base of the free trusted SRAM. * Copy it to a safe loaction before its reclaimed by later BL2 functionality. ******************************************************************************/ void bl2_early_platform_setup(meminfo_t *mem_layout) { /* Initialize the console to provide early debug support */ console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE); /* Setup the BL2 memory layout */ bl2_tzram_layout = *mem_layout; /* Initialize the platform config for future decision making */ fvp_config_setup(); } /******************************************************************************* * Perform platform specific setup. For now just initialize the memory location * to use for passing arguments to BL31. ******************************************************************************/ void bl2_platform_setup(void) { /* * Do initial security configuration to allow DRAM/device access. On * Base FVP only DRAM security is programmable (via TrustZone), but * other platforms might have more programmable security devices * present. */ fvp_security_setup(); /* Initialise the IO layer and register platform IO devices */ fvp_io_setup(); } /* Flush the TF params and the TF plat params */ void bl2_plat_flush_bl31_params(void) { flush_dcache_range((unsigned long)PARAMS_BASE, \ sizeof(bl2_to_bl31_params_mem_t)); } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only intializes the mmu in a quick and dirty way. ******************************************************************************/ void bl2_plat_arch_setup(void) { fvp_configure_mmu_el1(bl2_tzram_layout.total_base, bl2_tzram_layout.total_size, BL2_RO_BASE, BL2_RO_LIMIT, BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT); } /******************************************************************************* * Before calling this function BL31 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL31 and set SPSR and security state. * On FVP we are only setting the security state, entrypoint ******************************************************************************/ void bl2_plat_set_bl31_ep_info(image_info_t *bl31_image_info, entry_point_info_t *bl31_ep_info) { SET_SECURITY_STATE(bl31_ep_info->h.attr, SECURE); bl31_ep_info->spsr = SPSR_64(MODE_EL3, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); } /******************************************************************************* * Before calling this function BL32 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL32 and set SPSR and security state. * On FVP we are only setting the security state, entrypoint ******************************************************************************/ void bl2_plat_set_bl32_ep_info(image_info_t *bl32_image_info, entry_point_info_t *bl32_ep_info) { SET_SECURITY_STATE(bl32_ep_info->h.attr, SECURE); bl32_ep_info->spsr = fvp_get_spsr_for_bl32_entry(); } /******************************************************************************* * Before calling this function BL33 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL33 and set SPSR and security state. * On FVP we are only setting the security state, entrypoint ******************************************************************************/ void bl2_plat_set_bl33_ep_info(image_info_t *image, entry_point_info_t *bl33_ep_info) { SET_SECURITY_STATE(bl33_ep_info->h.attr, NON_SECURE); bl33_ep_info->spsr = fvp_get_spsr_for_bl33_entry(); } /******************************************************************************* * Populate the extents of memory available for loading BL32 ******************************************************************************/ void bl2_plat_get_bl32_meminfo(meminfo_t *bl32_meminfo) { /* * Populate the extents of memory available for loading BL32. */ bl32_meminfo->total_base = BL32_BASE; bl32_meminfo->free_base = BL32_BASE; bl32_meminfo->total_size = (TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE; bl32_meminfo->free_size = (TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE; } /******************************************************************************* * Populate the extents of memory available for loading BL33 ******************************************************************************/ void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo) { bl33_meminfo->total_base = DRAM_BASE; bl33_meminfo->total_size = DRAM_SIZE - DRAM1_SEC_SIZE; bl33_meminfo->free_base = DRAM_BASE; bl33_meminfo->free_size = DRAM_SIZE - DRAM1_SEC_SIZE; } arm-trusted-firmware-1.0-aw-6/plat/fvp/bl31_fvp_setup.c000066400000000000000000000220111322600646200227330ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "drivers/pwrc/fvp_pwrc.h" #include "fvp_def.h" #include "fvp_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL31_RO_BASE (unsigned long)(&__RO_START__) #define BL31_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols * refer to page-aligned addresses. */ #define BL31_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL31_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) #if RESET_TO_BL31 static entry_point_info_t bl32_image_ep_info; static entry_point_info_t bl33_image_ep_info; #else /******************************************************************************* * Reference to structure which holds the arguments that have been passed to * BL31 from BL2. ******************************************************************************/ static bl31_params_t *bl2_to_bl31_params; #endif /******************************************************************************* * Return a pointer to the 'entry_point_info' structure of the next image for the * security state specified. BL33 corresponds to the non-secure image type * while BL32 corresponds to the secure image type. A NULL pointer is returned * if the image does not exist. ******************************************************************************/ entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) { #if RESET_TO_BL31 assert(sec_state_is_valid(type)); if (type == NON_SECURE) return &bl33_image_ep_info; else return &bl32_image_ep_info; #else entry_point_info_t *next_image_info; assert(sec_state_is_valid(type)); next_image_info = (type == NON_SECURE) ? bl2_to_bl31_params->bl33_ep_info : bl2_to_bl31_params->bl32_ep_info; /* None of the images on this platform can have 0x0 as the entrypoint */ if (next_image_info->pc) return next_image_info; else return NULL; #endif } /******************************************************************************* * Perform any BL31 specific platform actions. Here is an opportunity to copy * parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they * are lost (potentially). This needs to be done before the MMU is initialized * so that the memory layout can be used while creating page tables. On the FVP * we know that BL2 has populated the parameters in secure DRAM. So we just use * the reference passed in 'from_bl2' instead of copying. The 'data' parameter * is not used since all the information is contained in 'from_bl2'. Also, BL2 * has flushed this information to memory, so we are guaranteed to pick up good * data ******************************************************************************/ void bl31_early_platform_setup(bl31_params_t *from_bl2, void *plat_params_from_bl2) { /* Initialize the console to provide early debug support */ console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE); /* Initialize the platform config for future decision making */ fvp_config_setup(); #if RESET_TO_BL31 /* There are no parameters from BL2 if BL31 is a reset vector */ assert(from_bl2 == NULL); assert(plat_params_from_bl2 == NULL); /* * Do initial security configuration to allow DRAM/device access. On * Base FVP only DRAM security is programmable (via TrustZone), but * other platforms might have more programmable security devices * present. */ fvp_security_setup(); /* Populate entry point information for BL3-2 and BL3-3 */ SET_PARAM_HEAD(&bl32_image_ep_info, PARAM_EP, VERSION_1, 0); SET_SECURITY_STATE(bl32_image_ep_info.h.attr, SECURE); bl32_image_ep_info.pc = BL32_BASE; bl32_image_ep_info.spsr = fvp_get_spsr_for_bl32_entry(); SET_PARAM_HEAD(&bl33_image_ep_info, PARAM_EP, VERSION_1, 0); /* * Tell BL31 where the non-trusted software image * is located and the entry state information */ bl33_image_ep_info.pc = plat_get_ns_image_entrypoint(); bl33_image_ep_info.spsr = fvp_get_spsr_for_bl33_entry(); SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); #else /* Check params passed from BL2 should not be NULL, * We are not checking plat_params_from_bl2 as NULL as we are not * using it on FVP */ assert(from_bl2 != NULL); assert(from_bl2->h.type == PARAM_BL31); assert(from_bl2->h.version >= VERSION_1); bl2_to_bl31_params = from_bl2; assert(((unsigned long)plat_params_from_bl2) == FVP_BL31_PLAT_PARAM_VAL); #endif } /******************************************************************************* * Initialize the gic, configure the CLCD and zero out variables needed by the * secondaries to boot up correctly. ******************************************************************************/ void bl31_platform_setup(void) { unsigned int reg_val; /* Initialize the gic cpu and distributor interfaces */ fvp_gic_init(); arm_gic_setup(); /* * TODO: Configure the CLCD before handing control to * linux. Need to see if a separate driver is needed * instead. */ mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGDATA, 0); mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGCTRL, (1ull << 31) | (1 << 30) | (7 << 20) | (0 << 16)); /* Enable and initialize the System level generic timer */ mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN); /* Allow access to the System counter timer module */ reg_val = (1 << CNTACR_RPCT_SHIFT) | (1 << CNTACR_RVCT_SHIFT); reg_val |= (1 << CNTACR_RFRQ_SHIFT) | (1 << CNTACR_RVOFF_SHIFT); reg_val |= (1 << CNTACR_RWVT_SHIFT) | (1 << CNTACR_RWPT_SHIFT); mmio_write_32(SYS_TIMCTL_BASE + CNTACR_BASE(0), reg_val); mmio_write_32(SYS_TIMCTL_BASE + CNTACR_BASE(1), reg_val); reg_val = (1 << CNTNSAR_NS_SHIFT(0)) | (1 << CNTNSAR_NS_SHIFT(1)); mmio_write_32(SYS_TIMCTL_BASE + CNTNSAR, reg_val); /* Intialize the power controller */ fvp_pwrc_setup(); /* Topologies are best known to the platform. */ fvp_setup_topology(); } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only intializes the mmu in a quick and dirty way. ******************************************************************************/ void bl31_plat_arch_setup(void) { fvp_cci_init(); #if RESET_TO_BL31 fvp_cci_enable(); #endif fvp_configure_mmu_el3(BL31_RO_BASE, (BL31_COHERENT_RAM_LIMIT - BL31_RO_BASE), BL31_RO_BASE, BL31_RO_LIMIT, BL31_COHERENT_RAM_BASE, BL31_COHERENT_RAM_LIMIT); } arm-trusted-firmware-1.0-aw-6/plat/fvp/drivers/000077500000000000000000000000001322600646200214155ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/fvp/drivers/pwrc/000077500000000000000000000000001322600646200223705ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/fvp/drivers/pwrc/fvp_pwrc.c000066400000000000000000000063511322600646200243670ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "../../fvp_def.h" #include "fvp_pwrc.h" /* * TODO: Someday there will be a generic power controller api. At the moment * each platform has its own pwrc so just exporting functions is fine. */ static bakery_lock_t pwrc_lock __attribute__ ((section("tzfw_coherent_mem"))); unsigned int fvp_pwrc_get_cpu_wkr(unsigned long mpidr) { return PSYSR_WK(fvp_pwrc_read_psysr(mpidr)); } unsigned int fvp_pwrc_read_psysr(unsigned long mpidr) { unsigned int rc; bakery_lock_get(&pwrc_lock); mmio_write_32(PWRC_BASE + PSYSR_OFF, (unsigned int) mpidr); rc = mmio_read_32(PWRC_BASE + PSYSR_OFF); bakery_lock_release(&pwrc_lock); return rc; } void fvp_pwrc_write_pponr(unsigned long mpidr) { bakery_lock_get(&pwrc_lock); mmio_write_32(PWRC_BASE + PPONR_OFF, (unsigned int) mpidr); bakery_lock_release(&pwrc_lock); } void fvp_pwrc_write_ppoffr(unsigned long mpidr) { bakery_lock_get(&pwrc_lock); mmio_write_32(PWRC_BASE + PPOFFR_OFF, (unsigned int) mpidr); bakery_lock_release(&pwrc_lock); } void fvp_pwrc_set_wen(unsigned long mpidr) { bakery_lock_get(&pwrc_lock); mmio_write_32(PWRC_BASE + PWKUPR_OFF, (unsigned int) (PWKUPR_WEN | mpidr)); bakery_lock_release(&pwrc_lock); } void fvp_pwrc_clr_wen(unsigned long mpidr) { bakery_lock_get(&pwrc_lock); mmio_write_32(PWRC_BASE + PWKUPR_OFF, (unsigned int) mpidr); bakery_lock_release(&pwrc_lock); } void fvp_pwrc_write_pcoffr(unsigned long mpidr) { bakery_lock_get(&pwrc_lock); mmio_write_32(PWRC_BASE + PCOFFR_OFF, (unsigned int) mpidr); bakery_lock_release(&pwrc_lock); } /* Nothing else to do here apart from initializing the lock */ int fvp_pwrc_setup(void) { bakery_lock_init(&pwrc_lock); return 0; } arm-trusted-firmware-1.0-aw-6/plat/fvp/drivers/pwrc/fvp_pwrc.h000066400000000000000000000054301322600646200243710ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __FVP_PWRC_H__ #define __FVP_PWRC_H__ /* FVP Power controller register offset etc */ #define PPOFFR_OFF 0x0 #define PPONR_OFF 0x4 #define PCOFFR_OFF 0x8 #define PWKUPR_OFF 0xc #define PSYSR_OFF 0x10 #define PWKUPR_WEN (1ull << 31) #define PSYSR_AFF_L2 (1 << 31) #define PSYSR_AFF_L1 (1 << 30) #define PSYSR_AFF_L0 (1 << 29) #define PSYSR_WEN (1 << 28) #define PSYSR_PC (1 << 27) #define PSYSR_PP (1 << 26) #define PSYSR_WK_SHIFT 24 #define PSYSR_WK_MASK 0x3 #define PSYSR_WK(x) (x >> PSYSR_WK_SHIFT) & PSYSR_WK_MASK #define WKUP_COLD 0x0 #define WKUP_RESET 0x1 #define WKUP_PPONR 0x2 #define WKUP_GICREQ 0x3 #define PSYSR_INVALID 0xffffffff #ifndef __ASSEMBLY__ /******************************************************************************* * Function & variable prototypes ******************************************************************************/ int fvp_pwrc_setup(void); void fvp_pwrc_write_pcoffr(unsigned long); void fvp_pwrc_write_ppoffr(unsigned long); void fvp_pwrc_write_pponr(unsigned long); void fvp_pwrc_set_wen(unsigned long); void fvp_pwrc_clr_wen(unsigned long); unsigned int fvp_pwrc_read_psysr(unsigned long); unsigned int fvp_pwrc_get_cpu_wkr(unsigned long); #endif /*__ASSEMBLY__*/ #endif /* __FVP_PWRC_H__ */ arm-trusted-firmware-1.0-aw-6/plat/fvp/fvp_def.h000066400000000000000000000215361322600646200215300ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __FVP_DEF_H__ #define __FVP_DEF_H__ /* Firmware Image Package */ #define FIP_IMAGE_NAME "fip.bin" #define FVP_PRIMARY_CPU 0x0 /* Memory location options for Shared data and TSP in FVP */ #define FVP_IN_TRUSTED_SRAM 0 #define FVP_IN_TRUSTED_DRAM 1 /******************************************************************************* * FVP memory map related constants ******************************************************************************/ #define FVP_TRUSTED_ROM_BASE 0x00000000 #define FVP_TRUSTED_ROM_SIZE 0x04000000 /* 64 MB */ #define FVP_TRUSTED_SRAM_BASE 0x04000000 #define FVP_TRUSTED_SRAM_SIZE 0x00040000 /* 256 KB */ #define FVP_TRUSTED_DRAM_BASE 0x06000000 #define FVP_TRUSTED_DRAM_SIZE 0x02000000 /* 32 MB */ #define FLASH0_BASE 0x08000000 #define FLASH0_SIZE 0x04000000 #define FLASH1_BASE 0x0c000000 #define FLASH1_SIZE 0x04000000 #define PSRAM_BASE 0x14000000 #define PSRAM_SIZE 0x04000000 #define VRAM_BASE 0x18000000 #define VRAM_SIZE 0x02000000 /* Aggregate of all devices in the first GB */ #define DEVICE0_BASE 0x1a000000 #define DEVICE0_SIZE 0x12200000 #define DEVICE1_BASE 0x2f000000 #define DEVICE1_SIZE 0x200000 #define NSRAM_BASE 0x2e000000 #define NSRAM_SIZE 0x10000 /* 4KB shared memory */ #define FVP_SHARED_RAM_SIZE 0x1000 /* Location of shared memory */ #if (FVP_SHARED_DATA_LOCATION_ID == FVP_IN_TRUSTED_DRAM) /* Shared memory at the base of Trusted DRAM */ # define FVP_SHARED_RAM_BASE FVP_TRUSTED_DRAM_BASE # define FVP_TRUSTED_SRAM_LIMIT (FVP_TRUSTED_SRAM_BASE \ + FVP_TRUSTED_SRAM_SIZE) #elif (FVP_SHARED_DATA_LOCATION_ID == FVP_IN_TRUSTED_SRAM) # if (FVP_TSP_RAM_LOCATION_ID == FVP_IN_TRUSTED_DRAM) # error "Shared data in Trusted SRAM and TSP in Trusted DRAM is not supported" # endif /* Shared memory at the top of the Trusted SRAM */ # define FVP_SHARED_RAM_BASE (FVP_TRUSTED_SRAM_BASE \ + FVP_TRUSTED_SRAM_SIZE \ - FVP_SHARED_RAM_SIZE) # define FVP_TRUSTED_SRAM_LIMIT FVP_SHARED_RAM_BASE #else # error "Unsupported FVP_SHARED_DATA_LOCATION_ID value" #endif #define DRAM1_BASE 0x80000000ull #define DRAM1_SIZE 0x80000000ull #define DRAM1_END (DRAM1_BASE + DRAM1_SIZE - 1) #define DRAM1_SEC_SIZE 0x01000000ull #define DRAM_BASE DRAM1_BASE #define DRAM_SIZE DRAM1_SIZE #define DRAM2_BASE 0x880000000ull #define DRAM2_SIZE 0x780000000ull #define DRAM2_END (DRAM2_BASE + DRAM2_SIZE - 1) #define PCIE_EXP_BASE 0x40000000 #define TZRNG_BASE 0x7fe60000 #define TZNVCTR_BASE 0x7fe70000 #define TZROOTKEY_BASE 0x7fe80000 /* Memory mapped Generic timer interfaces */ #define SYS_CNTCTL_BASE 0x2a430000 #define SYS_CNTREAD_BASE 0x2a800000 #define SYS_TIMCTL_BASE 0x2a810000 /* V2M motherboard system registers & offsets */ #define VE_SYSREGS_BASE 0x1c010000 #define V2M_SYS_ID 0x0 #define V2M_SYS_SWITCH 0x4 #define V2M_SYS_LED 0x8 #define V2M_SYS_CFGDATA 0xa0 #define V2M_SYS_CFGCTRL 0xa4 #define V2M_SYS_CFGSTATUS 0xa8 #define CFGCTRL_START (1 << 31) #define CFGCTRL_RW (1 << 30) #define CFGCTRL_FUNC_SHIFT 20 #define CFGCTRL_FUNC(fn) (fn << CFGCTRL_FUNC_SHIFT) #define FUNC_CLK_GEN 0x01 #define FUNC_TEMP 0x04 #define FUNC_DB_RESET 0x05 #define FUNC_SCC_CFG 0x06 #define FUNC_SHUTDOWN 0x08 #define FUNC_REBOOT 0x09 /* Load address of BL33 in the FVP port */ #define NS_IMAGE_OFFSET (DRAM1_BASE + 0x8000000) /* DRAM + 128MB */ /* Special value used to verify platform parameters from BL2 to BL3-1 */ #define FVP_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL /* * V2M sysled bit definitions. The values written to this * register are defined in arch.h & runtime_svc.h. Only * used by the primary cpu to diagnose any cold boot issues. * * SYS_LED[0] - Security state (S=0/NS=1) * SYS_LED[2:1] - Exception Level (EL3-EL0) * SYS_LED[7:3] - Exception Class (Sync/Async & origin) * */ #define SYS_LED_SS_SHIFT 0x0 #define SYS_LED_EL_SHIFT 0x1 #define SYS_LED_EC_SHIFT 0x3 #define SYS_LED_SS_MASK 0x1 #define SYS_LED_EL_MASK 0x3 #define SYS_LED_EC_MASK 0x1f /* V2M sysid register bits */ #define SYS_ID_REV_SHIFT 28 #define SYS_ID_HBI_SHIFT 16 #define SYS_ID_BLD_SHIFT 12 #define SYS_ID_ARCH_SHIFT 8 #define SYS_ID_FPGA_SHIFT 0 #define SYS_ID_REV_MASK 0xf #define SYS_ID_HBI_MASK 0xfff #define SYS_ID_BLD_MASK 0xf #define SYS_ID_ARCH_MASK 0xf #define SYS_ID_FPGA_MASK 0xff #define SYS_ID_BLD_LENGTH 4 #define HBI_FVP_BASE 0x020 #define REV_FVP_BASE_V0 0x0 #define HBI_FOUNDATION 0x010 #define REV_FOUNDATION_V2_0 0x0 #define REV_FOUNDATION_V2_1 0x1 #define BLD_GIC_VE_MMAP 0x0 #define BLD_GIC_A53A57_MMAP 0x1 #define ARCH_MODEL 0x1 /* FVP Power controller base address*/ #define PWRC_BASE 0x1c100000 /******************************************************************************* * CCI-400 related constants ******************************************************************************/ #define CCI400_BASE 0x2c090000 #define CCI400_SL_IFACE3_CLUSTER_IX 0 #define CCI400_SL_IFACE4_CLUSTER_IX 1 /******************************************************************************* * GIC-400 & interrupt handling related constants ******************************************************************************/ /* VE compatible GIC memory map */ #define VE_GICD_BASE 0x2c001000 #define VE_GICC_BASE 0x2c002000 #define VE_GICH_BASE 0x2c004000 #define VE_GICV_BASE 0x2c006000 /* Base FVP compatible GIC memory map */ #define BASE_GICD_BASE 0x2f000000 #define BASE_GICR_BASE 0x2f100000 #define BASE_GICC_BASE 0x2c000000 #define BASE_GICH_BASE 0x2c010000 #define BASE_GICV_BASE 0x2c02f000 #define IRQ_TZ_WDOG 56 #define IRQ_SEC_PHY_TIMER 29 #define IRQ_SEC_SGI_0 8 #define IRQ_SEC_SGI_1 9 #define IRQ_SEC_SGI_2 10 #define IRQ_SEC_SGI_3 11 #define IRQ_SEC_SGI_4 12 #define IRQ_SEC_SGI_5 13 #define IRQ_SEC_SGI_6 14 #define IRQ_SEC_SGI_7 15 #define IRQ_SEC_SGI_8 16 /******************************************************************************* * PL011 related constants ******************************************************************************/ #define PL011_UART0_BASE 0x1c090000 #define PL011_UART1_BASE 0x1c0a0000 #define PL011_UART2_BASE 0x1c0b0000 #define PL011_UART3_BASE 0x1c0c0000 #define PL011_BAUDRATE 115200 #define PL011_UART0_CLK_IN_HZ 24000000 #define PL011_UART1_CLK_IN_HZ 24000000 #define PL011_UART2_CLK_IN_HZ 24000000 #define PL011_UART3_CLK_IN_HZ 24000000 /******************************************************************************* * TrustZone address space controller related constants ******************************************************************************/ #define TZC400_BASE 0x2a4a0000 /* * The NSAIDs for this platform as used to program the TZC400. */ /* NSAIDs used by devices in TZC filter 0 on FVP */ #define FVP_NSAID_DEFAULT 0 #define FVP_NSAID_PCI 1 #define FVP_NSAID_VIRTIO 8 /* from FVP v5.6 onwards */ #define FVP_NSAID_AP 9 /* Application Processors */ #define FVP_NSAID_VIRTIO_OLD 15 /* until FVP v5.5 */ /* NSAIDs used by devices in TZC filter 2 on FVP */ #define FVP_NSAID_HDLCD0 2 #define FVP_NSAID_CLCD 7 /******************************************************************************* * Shared Data ******************************************************************************/ /* Entrypoint mailboxes */ #define MBOX_BASE FVP_SHARED_RAM_BASE #define MBOX_SIZE 0x200 /* Base address where parameters to BL31 are stored */ #define PARAMS_BASE (MBOX_BASE + MBOX_SIZE) #endif /* __FVP_DEF_H__ */ arm-trusted-firmware-1.0-aw-6/plat/fvp/fvp_io_storage.c000066400000000000000000000142771322600646200231240ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include /* For FOPEN_MODE_... */ #include /* IO devices */ static const io_dev_connector_t *sh_dev_con; static uintptr_t sh_dev_spec; static uintptr_t sh_init_params; static uintptr_t sh_dev_handle; static const io_dev_connector_t *fip_dev_con; static uintptr_t fip_dev_spec; static uintptr_t fip_dev_handle; static const io_dev_connector_t *memmap_dev_con; static uintptr_t memmap_dev_spec; static uintptr_t memmap_init_params; static uintptr_t memmap_dev_handle; static const io_block_spec_t fip_block_spec = { .offset = FLASH0_BASE, .length = FLASH0_SIZE }; static const io_file_spec_t bl2_file_spec = { .path = BL2_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl31_file_spec = { .path = BL31_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl32_file_spec = { .path = BL32_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl33_file_spec = { .path = BL33_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static int open_fip(const uintptr_t spec); static int open_memmap(const uintptr_t spec); struct plat_io_policy { char *image_name; uintptr_t *dev_handle; uintptr_t image_spec; int (*check)(const uintptr_t spec); }; static const struct plat_io_policy policies[] = { { FIP_IMAGE_NAME, &memmap_dev_handle, (uintptr_t)&fip_block_spec, open_memmap }, { BL2_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl2_file_spec, open_fip }, { BL31_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl31_file_spec, open_fip }, { BL32_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl32_file_spec, open_fip }, { BL33_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl33_file_spec, open_fip }, { 0, 0, 0 } }; static int open_fip(const uintptr_t spec) { int result = IO_FAIL; /* See if a Firmware Image Package is available */ result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_NAME); if (result == IO_SUCCESS) { VERBOSE("Using FIP\n"); /*TODO: Check image defined in spec is present in FIP. */ } return result; } static int open_memmap(const uintptr_t spec) { int result = IO_FAIL; uintptr_t local_image_handle; result = io_dev_init(memmap_dev_handle, memmap_init_params); if (result == IO_SUCCESS) { result = io_open(memmap_dev_handle, spec, &local_image_handle); if (result == IO_SUCCESS) { VERBOSE("Using Memmap IO\n"); io_close(local_image_handle); } } return result; } static int open_semihosting(const uintptr_t spec) { int result = IO_FAIL; uintptr_t local_image_handle; /* See if the file exists on semi-hosting.*/ result = io_dev_init(sh_dev_handle, sh_init_params); if (result == IO_SUCCESS) { result = io_open(sh_dev_handle, spec, &local_image_handle); if (result == IO_SUCCESS) { VERBOSE("Using Semi-hosting IO\n"); io_close(local_image_handle); } } return result; } void fvp_io_setup (void) { int io_result = IO_FAIL; /* Register the IO devices on this platform */ io_result = register_io_dev_sh(&sh_dev_con); assert(io_result == IO_SUCCESS); io_result = register_io_dev_fip(&fip_dev_con); assert(io_result == IO_SUCCESS); io_result = register_io_dev_memmap(&memmap_dev_con); assert(io_result == IO_SUCCESS); /* Open connections to devices and cache the handles */ io_result = io_dev_open(sh_dev_con, sh_dev_spec, &sh_dev_handle); assert(io_result == IO_SUCCESS); io_result = io_dev_open(fip_dev_con, fip_dev_spec, &fip_dev_handle); assert(io_result == IO_SUCCESS); io_result = io_dev_open(memmap_dev_con, memmap_dev_spec, &memmap_dev_handle); assert(io_result == IO_SUCCESS); /* Ignore improbable errors in release builds */ (void)io_result; } /* Return an IO device handle and specification which can be used to access * an image. Use this to enforce platform load policy */ int plat_get_image_source(const char *image_name, uintptr_t *dev_handle, uintptr_t *image_spec) { int result = IO_FAIL; const struct plat_io_policy *policy; if ((image_name != NULL) && (dev_handle != NULL) && (image_spec != NULL)) { policy = policies; while (policy->image_name != NULL) { if (strcmp(policy->image_name, image_name) == 0) { result = policy->check(policy->image_spec); if (result == IO_SUCCESS) { *image_spec = policy->image_spec; *dev_handle = *(policy->dev_handle); break; } else { result = open_semihosting( policy->image_spec); if (result == IO_SUCCESS) { *dev_handle = sh_dev_handle; *image_spec = policy->image_spec; } } } policy++; } } else { result = IO_FAIL; } return result; } arm-trusted-firmware-1.0-aw-6/plat/fvp/fvp_pm.c000066400000000000000000000316371322600646200214040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "drivers/pwrc/fvp_pwrc.h" #include "fvp_def.h" #include "fvp_private.h" /******************************************************************************* * Private FVP function to program the mailbox for a cpu before it is released * from reset. ******************************************************************************/ static void fvp_program_mailbox(uint64_t mpidr, uint64_t address) { uint64_t linear_id; mailbox_t *fvp_mboxes; linear_id = platform_get_core_pos(mpidr); fvp_mboxes = (mailbox_t *)MBOX_BASE; fvp_mboxes[linear_id].value = address; flush_dcache_range((unsigned long) &fvp_mboxes[linear_id], sizeof(unsigned long)); } /******************************************************************************* * Function which implements the common FVP specific operations to power down a * cpu in response to a CPU_OFF or CPU_SUSPEND request. ******************************************************************************/ static void fvp_cpu_pwrdwn_common() { /* Prevent interrupts from spuriously waking up this cpu */ arm_gic_cpuif_deactivate(); /* Program the power controller to power off this cpu. */ fvp_pwrc_write_ppoffr(read_mpidr_el1()); } /******************************************************************************* * Function which implements the common FVP specific operations to power down a * cluster in response to a CPU_OFF or CPU_SUSPEND request. ******************************************************************************/ static void fvp_cluster_pwrdwn_common() { uint64_t mpidr = read_mpidr_el1(); /* Disable coherency if this cluster is to be turned off */ if (get_plat_config()->flags & CONFIG_HAS_CCI) cci_disable_cluster_coherency(mpidr); /* Program the power controller to turn the cluster off */ fvp_pwrc_write_pcoffr(mpidr); } /******************************************************************************* * Private FVP function which is used to determine if any platform actions * should be performed for the specified affinity instance given its * state. Nothing needs to be done if the 'state' is not off or if this is not * the highest affinity level which will enter the 'state'. ******************************************************************************/ static int32_t fvp_do_plat_actions(unsigned int afflvl, unsigned int state) { unsigned int max_phys_off_afflvl; assert(afflvl <= MPIDR_AFFLVL1); if (state != PSCI_STATE_OFF) return -EAGAIN; /* * Find the highest affinity level which will be suspended and postpone * all the platform specific actions until that level is hit. */ max_phys_off_afflvl = psci_get_max_phys_off_afflvl(); assert(max_phys_off_afflvl != PSCI_INVALID_DATA); if (afflvl != max_phys_off_afflvl) return -EAGAIN; return 0; } /******************************************************************************* * FVP handler called when an affinity instance is about to enter standby. ******************************************************************************/ int fvp_affinst_standby(unsigned int power_state) { unsigned int target_afflvl; /* Sanity check the requested state */ target_afflvl = psci_get_pstate_afflvl(power_state); /* * It's possible to enter standby only on affinity level 0 i.e. a cpu * on the FVP. Ignore any other affinity level. */ if (target_afflvl != MPIDR_AFFLVL0) return PSCI_E_INVALID_PARAMS; /* * Enter standby state * dsb is good practice before using wfi to enter low power states */ dsb(); wfi(); return PSCI_E_SUCCESS; } /******************************************************************************* * FVP handler called when an affinity instance is about to be turned on. The * level and mpidr determine the affinity instance. ******************************************************************************/ int fvp_affinst_on(unsigned long mpidr, unsigned long sec_entrypoint, unsigned long ns_entrypoint, unsigned int afflvl, unsigned int state) { int rc = PSCI_E_SUCCESS; unsigned int psysr; /* * It's possible to turn on only affinity level 0 i.e. a cpu * on the FVP. Ignore any other affinity level. */ if (afflvl != MPIDR_AFFLVL0) return rc; /* * Ensure that we do not cancel an inflight power off request * for the target cpu. That would leave it in a zombie wfi. * Wait for it to power off, program the jump address for the * target cpu and then program the power controller to turn * that cpu on */ do { psysr = fvp_pwrc_read_psysr(mpidr); } while (psysr & PSYSR_AFF_L0); fvp_program_mailbox(mpidr, sec_entrypoint); fvp_pwrc_write_pponr(mpidr); return rc; } /******************************************************************************* * FVP handler called when an affinity instance is about to be turned off. The * level and mpidr determine the affinity instance. The 'state' arg. allows the * platform to decide whether the cluster is being turned off and take apt * actions. * * CAUTION: There is no guarantee that caches will remain turned on across calls * to this function as each affinity level is dealt with. So do not write & read * global variables across calls. It will be wise to do flush a write to the * global to prevent unpredictable results. ******************************************************************************/ int fvp_affinst_off(unsigned long mpidr, unsigned int afflvl, unsigned int state) { /* Determine if any platform actions need to be executed */ if (fvp_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; /* * If execution reaches this stage then this affinity level will be * suspended. Perform at least the cpu specific actions followed the * cluster specific operations if applicable. */ fvp_cpu_pwrdwn_common(); if (afflvl != MPIDR_AFFLVL0) fvp_cluster_pwrdwn_common(); return PSCI_E_SUCCESS; } /******************************************************************************* * FVP handler called when an affinity instance is about to be suspended. The * level and mpidr determine the affinity instance. The 'state' arg. allows the * platform to decide whether the cluster is being turned off and take apt * actions. * * CAUTION: There is no guarantee that caches will remain turned on across calls * to this function as each affinity level is dealt with. So do not write & read * global variables across calls. It will be wise to do flush a write to the * global to prevent unpredictable results. ******************************************************************************/ int fvp_affinst_suspend(unsigned long mpidr, unsigned long sec_entrypoint, unsigned long ns_entrypoint, unsigned int afflvl, unsigned int state) { /* Determine if any platform actions need to be executed. */ if (fvp_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; /* Program the jump address for the target cpu */ fvp_program_mailbox(read_mpidr_el1(), sec_entrypoint); /* Program the power controller to enable wakeup interrupts. */ fvp_pwrc_set_wen(mpidr); /* Perform the common cpu specific operations */ fvp_cpu_pwrdwn_common(); /* Perform the common cluster specific operations */ if (afflvl != MPIDR_AFFLVL0) fvp_cluster_pwrdwn_common(); return PSCI_E_SUCCESS; } /******************************************************************************* * FVP handler called when an affinity instance has just been powered on after * being turned off earlier. The level and mpidr determine the affinity * instance. The 'state' arg. allows the platform to decide whether the cluster * was turned off prior to wakeup and do what's necessary to setup it up * correctly. ******************************************************************************/ int fvp_affinst_on_finish(unsigned long mpidr, unsigned int afflvl, unsigned int state) { int rc = PSCI_E_SUCCESS; /* Determine if any platform actions need to be executed. */ if (fvp_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; /* Perform the common cluster specific operations */ if (afflvl != MPIDR_AFFLVL0) { /* * This CPU might have woken up whilst the cluster was * attempting to power down. In this case the FVP power * controller will have a pending cluster power off request * which needs to be cleared by writing to the PPONR register. * This prevents the power controller from interpreting a * subsequent entry of this cpu into a simple wfi as a power * down request. */ fvp_pwrc_write_pponr(mpidr); /* Enable coherency if this cluster was off */ fvp_cci_enable(); } /* * Clear PWKUPR.WEN bit to ensure interrupts do not interfere * with a cpu power down unless the bit is set again */ fvp_pwrc_clr_wen(mpidr); /* Zero the jump address in the mailbox for this cpu */ fvp_program_mailbox(read_mpidr_el1(), 0); /* Enable the gic cpu interface */ arm_gic_cpuif_setup(); /* TODO: This setup is needed only after a cold boot */ arm_gic_pcpu_distif_setup(); return rc; } /******************************************************************************* * FVP handler called when an affinity instance has just been powered on after * having been suspended earlier. The level and mpidr determine the affinity * instance. * TODO: At the moment we reuse the on finisher and reinitialize the secure * context. Need to implement a separate suspend finisher. ******************************************************************************/ int fvp_affinst_suspend_finish(unsigned long mpidr, unsigned int afflvl, unsigned int state) { return fvp_affinst_on_finish(mpidr, afflvl, state); } /******************************************************************************* * FVP handlers to shutdown/reboot the system ******************************************************************************/ static void __dead2 fvp_system_off(void) { /* Write the System Configuration Control Register */ mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGCTRL, CFGCTRL_START | CFGCTRL_RW | CFGCTRL_FUNC(FUNC_SHUTDOWN)); wfi(); ERROR("FVP System Off: operation not handled.\n"); panic(); } static void __dead2 fvp_system_reset(void) { /* Write the System Configuration Control Register */ mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGCTRL, CFGCTRL_START | CFGCTRL_RW | CFGCTRL_FUNC(FUNC_REBOOT)); wfi(); ERROR("FVP System Reset: operation not handled.\n"); panic(); } /******************************************************************************* * Export the platform handlers to enable psci to invoke them ******************************************************************************/ static const plat_pm_ops_t fvp_plat_pm_ops = { .affinst_standby = fvp_affinst_standby, .affinst_on = fvp_affinst_on, .affinst_off = fvp_affinst_off, .affinst_suspend = fvp_affinst_suspend, .affinst_on_finish = fvp_affinst_on_finish, .affinst_suspend_finish = fvp_affinst_suspend_finish, .system_off = fvp_system_off, .system_reset = fvp_system_reset }; /******************************************************************************* * Export the platform specific power ops & initialize the fvp power controller ******************************************************************************/ int platform_setup_pm(const plat_pm_ops_t **plat_ops) { *plat_ops = &fvp_plat_pm_ops; return 0; } arm-trusted-firmware-1.0-aw-6/plat/fvp/fvp_private.h000066400000000000000000000071311322600646200224370ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __FVP_PRIVATE_H__ #define __FVP_PRIVATE_H__ #include #include typedef volatile struct mailbox { unsigned long value __attribute__((__aligned__(CACHE_WRITEBACK_GRANULE))); } mailbox_t; /******************************************************************************* * This structure represents the superset of information that is passed to * BL31 e.g. while passing control to it from BL2 which is bl31_params * and bl31_plat_params and its elements ******************************************************************************/ typedef struct bl2_to_bl31_params_mem { bl31_params_t bl31_params; image_info_t bl31_image_info; image_info_t bl32_image_info; image_info_t bl33_image_info; entry_point_info_t bl33_ep_info; entry_point_info_t bl32_ep_info; entry_point_info_t bl31_ep_info; } bl2_to_bl31_params_mem_t; /******************************************************************************* * Forward declarations ******************************************************************************/ struct meminfo; /******************************************************************************* * Function and variable prototypes ******************************************************************************/ void fvp_configure_mmu_el1(unsigned long total_base, unsigned long total_size, unsigned long, unsigned long, unsigned long, unsigned long); void fvp_configure_mmu_el3(unsigned long total_base, unsigned long total_size, unsigned long, unsigned long, unsigned long, unsigned long); int fvp_config_setup(void); void fvp_cci_init(void); void fvp_cci_enable(void); void fvp_gic_init(void); /* Declarations for fvp_topology.c */ int fvp_setup_topology(void); /* Declarations for fvp_io_storage.c */ void fvp_io_setup(void); /* Declarations for fvp_security.c */ void fvp_security_setup(void); /* Gets the SPR for BL32 entry */ uint32_t fvp_get_spsr_for_bl32_entry(void); /* Gets the SPSR for BL33 entry */ uint32_t fvp_get_spsr_for_bl33_entry(void); #endif /* __FVP_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/plat/fvp/fvp_security.c000066400000000000000000000113601322600646200226260ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "fvp_def.h" #include "fvp_private.h" /* Used to improve readability for configuring regions. */ #define FILTER_SHIFT(filter) (1 << filter) /* * For the moment we assume that all security programming is done by the * primary core. * TODO: * Might want to enable interrupt on violations when supported? */ void fvp_security_setup(void) { /* * The Base FVP has a TrustZone address space controller, the Foundation * FVP does not. Trying to program the device on the foundation FVP will * cause an abort. * * If the platform had additional peripheral specific security * configurations, those would be configured here. */ if (!(get_plat_config()->flags & CONFIG_HAS_TZC)) return; /* * The TrustZone controller controls access to main DRAM. Give * full NS access for the moment to use with OS. */ INFO("Configuring TrustZone Controller\n"); /* * The driver does some error checking and will assert. * - Provide base address of device on platform. * - Provide width of ACE-Lite IDs on platform. */ tzc_init(TZC400_BASE); /* * Currently only filters 0 and 2 are connected on Base FVP. * Filter 0 : CPU clusters (no access to DRAM by default) * Filter 1 : not connected * Filter 2 : LCDs (access to VRAM allowed by default) * Filter 3 : not connected * Programming unconnected filters will have no effect at the * moment. These filter could, however, be connected in future. * So care should be taken not to configure the unused filters. */ /* Disable all filters before programming. */ tzc_disable_filters(); /* * Allow only non-secure access to all DRAM to supported devices. * Give access to the CPUs and Virtio. Some devices * would normally use the default ID so allow that too. We use * two regions to cover the blocks of physical memory in the FVPs. * * Software executing in the secure state, such as a secure * boot-loader, can access the DRAM by using the NS attributes in * the MMU translation tables and descriptors. */ /* Set to cover the first block of DRAM */ tzc_configure_region(FILTER_SHIFT(0), 1, DRAM1_BASE, DRAM1_END - DRAM1_SEC_SIZE, TZC_REGION_S_NONE, TZC_REGION_ACCESS_RDWR(FVP_NSAID_DEFAULT) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_PCI) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_AP) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO_OLD)); /* Set to cover the secure reserved region */ tzc_configure_region(FILTER_SHIFT(0), 3, (DRAM1_END - DRAM1_SEC_SIZE) + 1 , DRAM1_END, TZC_REGION_S_RDWR, 0x0); /* Set to cover the second block of DRAM */ tzc_configure_region(FILTER_SHIFT(0), 2, DRAM2_BASE, DRAM2_END, TZC_REGION_S_NONE, TZC_REGION_ACCESS_RDWR(FVP_NSAID_DEFAULT) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_PCI) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_AP) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO) | TZC_REGION_ACCESS_RDWR(FVP_NSAID_VIRTIO_OLD)); /* * TODO: Interrupts are not currently supported. The only * options we have are for access errors to occur quietly or to * cause an exception. We choose to cause an exception. */ tzc_set_action(TZC_ACTION_ERR); /* Enable filters. */ tzc_enable_filters(); } arm-trusted-firmware-1.0-aw-6/plat/fvp/fvp_topology.c000066400000000000000000000222641322600646200226400ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /* TODO: Reusing psci error codes & state information. Get our own! */ #include #include "drivers/pwrc/fvp_pwrc.h" /* We treat '255' as an invalid affinity instance */ #define AFFINST_INVAL 0xff /******************************************************************************* * We support 3 flavours of the FVP: Foundation, Base AEM & Base Cortex. Each * flavour has a different topology. The common bit is that there can be a max. * of 2 clusters (affinity 1) and 4 cpus (affinity 0) per cluster. So we define * a tree like data structure which caters to these maximum bounds. It simply * marks the absent affinity level instances as PSCI_AFF_ABSENT e.g. there is no * cluster 1 on the Foundation FVP. The 'data' field is currently unused. ******************************************************************************/ typedef struct affinity_info { unsigned char sibling; unsigned char child; unsigned char state; unsigned int data; } affinity_info_t; /******************************************************************************* * The following two data structures store the topology tree for the fvp. There * is a separate array for each affinity level i.e. cpus and clusters. The child * and sibling references allow traversal inside and in between the two arrays. ******************************************************************************/ static affinity_info_t fvp_aff1_topology_map[PLATFORM_CLUSTER_COUNT]; static affinity_info_t fvp_aff0_topology_map[PLATFORM_CORE_COUNT]; /* Simple global variable to safeguard us from stupidity */ static unsigned int topology_setup_done; /******************************************************************************* * This function implements a part of the critical interface between the psci * generic layer and the platform to allow the former to detect the platform * topology. psci queries the platform to determine how many affinity instances * are present at a particular level for a given mpidr e.g. consider a dual * cluster platform where each cluster has 4 cpus. A call to this function with * (0, 0x100) will return the number of cpus implemented under cluster 1 i.e. 4. * Similarly a call with (1, 0x100) will return 2 i.e. the number of clusters. * This is 'cause we are effectively asking how many affinity level 1 instances * are implemented under affinity level 2 instance 0. ******************************************************************************/ unsigned int plat_get_aff_count(unsigned int aff_lvl, unsigned long mpidr) { unsigned int aff_count = 1, ctr; unsigned char parent_aff_id; assert(topology_setup_done == 1); switch (aff_lvl) { case 3: case 2: /* * Assert if the parent affinity instance is not 0. * This also takes care of level 3 in an obfuscated way */ parent_aff_id = (mpidr >> MPIDR_AFF3_SHIFT) & MPIDR_AFFLVL_MASK; assert(parent_aff_id == 0); /* * Report that we implement a single instance of * affinity levels 2 & 3 which are AFF_ABSENT */ break; case 1: /* Assert if the parent affinity instance is not 0. */ parent_aff_id = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK; assert(parent_aff_id == 0); /* Fetch the starting index in the aff1 array */ for (ctr = 0; fvp_aff1_topology_map[ctr].sibling != AFFINST_INVAL; ctr = fvp_aff1_topology_map[ctr].sibling) { aff_count++; } break; case 0: /* Assert if the cluster id is anything apart from 0 or 1 */ parent_aff_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK; assert(parent_aff_id < PLATFORM_CLUSTER_COUNT); /* Fetch the starting index in the aff0 array */ for (ctr = fvp_aff1_topology_map[parent_aff_id].child; fvp_aff0_topology_map[ctr].sibling != AFFINST_INVAL; ctr = fvp_aff0_topology_map[ctr].sibling) { aff_count++; } break; default: assert(0); } return aff_count; } /******************************************************************************* * This function implements a part of the critical interface between the psci * generic layer and the platform to allow the former to detect the state of a * affinity instance in the platform topology. psci queries the platform to * determine whether an affinity instance is present or absent. This caters for * topologies where an intermediate affinity level instance is missing e.g. * consider a platform which implements a single cluster with 4 cpus and there * is another cpu sitting directly on the interconnect along with the cluster. * The mpidrs of the cluster would range from 0x0-0x3. The mpidr of the single * cpu would be 0x100 to highlight that it does not belong to cluster 0. Cluster * 1 is however missing but needs to be accounted to reach this single cpu in * the topology tree. Hence it will be marked as PSCI_AFF_ABSENT. This is not * applicable to the FVP but depicted as an example. ******************************************************************************/ unsigned int plat_get_aff_state(unsigned int aff_lvl, unsigned long mpidr) { unsigned int aff_state = PSCI_AFF_ABSENT, idx; idx = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK; assert(topology_setup_done == 1); switch (aff_lvl) { case 3: case 2: /* Report affinity levels 2 & 3 as absent */ break; case 1: aff_state = fvp_aff1_topology_map[idx].state; break; case 0: /* * First get start index of the aff0 in its array & then add * to it the affinity id that we want the state of */ idx = fvp_aff1_topology_map[idx].child; idx += (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK; aff_state = fvp_aff0_topology_map[idx].state; break; default: assert(0); } return aff_state; } /******************************************************************************* * Handy optimization to prevent the psci implementation from traversing through * affinity levels which are not present while detecting the platform topology. ******************************************************************************/ int plat_get_max_afflvl(void) { return MPIDR_AFFLVL1; } /******************************************************************************* * This function populates the FVP specific topology information depending upon * the FVP flavour its running on. We construct all the mpidrs we can handle * and rely on the PWRC.PSYSR to flag absent cpus when their status is queried. ******************************************************************************/ int fvp_setup_topology(void) { unsigned char aff0, aff1, aff_state, aff0_offset = 0; unsigned long mpidr; topology_setup_done = 0; for (aff1 = 0; aff1 < PLATFORM_CLUSTER_COUNT; aff1++) { fvp_aff1_topology_map[aff1].child = aff0_offset; fvp_aff1_topology_map[aff1].sibling = aff1 + 1; for (aff0 = 0; aff0 < PLATFORM_MAX_CPUS_PER_CLUSTER; aff0++) { mpidr = aff1 << MPIDR_AFF1_SHIFT; mpidr |= aff0 << MPIDR_AFF0_SHIFT; if (fvp_pwrc_read_psysr(mpidr) != PSYSR_INVALID) { /* * Presence of even a single aff0 indicates * presence of parent aff1 on the FVP. */ aff_state = PSCI_AFF_PRESENT; fvp_aff1_topology_map[aff1].state = PSCI_AFF_PRESENT; } else { aff_state = PSCI_AFF_ABSENT; } fvp_aff0_topology_map[aff0_offset].child = AFFINST_INVAL; fvp_aff0_topology_map[aff0_offset].state = aff_state; fvp_aff0_topology_map[aff0_offset].sibling = aff0_offset + 1; /* Increment the absolute number of aff0s traversed */ aff0_offset++; } /* Tie-off the last aff0 sibling to -1 to avoid overflow */ fvp_aff0_topology_map[aff0_offset - 1].sibling = AFFINST_INVAL; } /* Tie-off the last aff1 sibling to AFFINST_INVAL to avoid overflow */ fvp_aff1_topology_map[aff1 - 1].sibling = AFFINST_INVAL; topology_setup_done = 1; return 0; } arm-trusted-firmware-1.0-aw-6/plat/fvp/include/000077500000000000000000000000001322600646200213625ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/fvp/include/plat_macros.S000066400000000000000000000072231322600646200240160ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "../fvp_def.h" .section .rodata.gic_reg_name, "aS" gic_regs: .asciz "gic_hppir", "gic_ahppir", "gic_ctlr", "" gicd_pend_reg: .asciz "gicd_ispendr regs (Offsets 0x200 - 0x278)\n Offset:\t\t\tvalue\n" newline: .asciz "\n" spacer: .asciz ":\t\t0x" /* --------------------------------------------- * The below macro prints out relevant GIC * registers whenever an unhandled exception is * taken in BL3-1. * Clobbers: x0 - x10, x16, sp * --------------------------------------------- */ .macro plat_print_gic_regs adr x0, plat_config ldr w16, [x0, #CONFIG_GICC_BASE_OFFSET] cbz x16, exit_print_gic_regs /* gic base address is now in x16 */ adr x6, gic_regs /* Load the gic reg list to x6 */ /* Load the gic regs to gp regs used by str_in_crash_buf_print */ ldr w8, [x16, #GICC_HPPIR] ldr w9, [x16, #GICC_AHPPIR] ldr w10, [x16, #GICC_CTLR] /* Store to the crash buf and print to console */ bl str_in_crash_buf_print /* Print the GICD_ISPENDR regs */ add x7, x16, #GICD_ISPENDR adr x4, gicd_pend_reg bl asm_print_str gicd_ispendr_loop: sub x4, x7, x16 cmp x4, #0x280 b.eq exit_print_gic_regs bl asm_print_hex adr x4, spacer bl asm_print_str ldr x4, [x7], #8 bl asm_print_hex adr x4, newline bl asm_print_str b gicd_ispendr_loop exit_print_gic_regs: .endm .section .rodata.cci_reg_name, "aS" cci_iface_regs: .asciz "cci_snoop_ctrl_cluster0", "cci_snoop_ctrl_cluster1" , "" /* ------------------------------------------------ * The below macro prints out relevant interconnect * registers whenever an unhandled exception is * taken in BL3-1. * Clobbers: x0 - x9, sp * ------------------------------------------------ */ .macro plat_print_interconnect_regs adr x6, cci_iface_regs /* Store in x7 the base address of the first interface */ mov_imm x7, (CCI400_BASE + SLAVE_IFACE3_OFFSET) ldr w8, [x7, #SNOOP_CTRL_REG] /* Store in x7 the base address of the second interface */ mov_imm x7, (CCI400_BASE + SLAVE_IFACE4_OFFSET) ldr w9, [x7, #SNOOP_CTRL_REG] /* Store to the crash buf and print to console */ bl str_in_crash_buf_print .endm arm-trusted-firmware-1.0-aw-6/plat/fvp/include/platform_def.h000066400000000000000000000154501322600646200242020ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLATFORM_DEF_H__ #define __PLATFORM_DEF_H__ #include #include "../fvp_def.h" /******************************************************************************* * Platform binary types for linking ******************************************************************************/ #define PLATFORM_LINKER_FORMAT "elf64-littleaarch64" #define PLATFORM_LINKER_ARCH aarch64 /******************************************************************************* * Generic platform constants ******************************************************************************/ /* Size of cacheable stacks */ #if DEBUG_XLAT_TABLE #define PLATFORM_STACK_SIZE 0x800 #elif IMAGE_BL1 #define PLATFORM_STACK_SIZE 0x440 #elif IMAGE_BL2 #define PLATFORM_STACK_SIZE 0x400 #elif IMAGE_BL31 #define PLATFORM_STACK_SIZE 0x400 #elif IMAGE_BL32 #define PLATFORM_STACK_SIZE 0x440 #endif #define FIRMWARE_WELCOME_STR "Booting Trusted Firmware\n" /* Trusted Boot Firmware BL2 */ #define BL2_IMAGE_NAME "bl2.bin" /* EL3 Runtime Firmware BL31 */ #define BL31_IMAGE_NAME "bl31.bin" /* Secure Payload BL32 (Trusted OS) */ #define BL32_IMAGE_NAME "bl32.bin" /* Non-Trusted Firmware BL33 */ #define BL33_IMAGE_NAME "bl33.bin" /* e.g. UEFI */ #define PLATFORM_CACHE_LINE_SIZE 64 #define PLATFORM_CLUSTER_COUNT 2ull #define PLATFORM_CLUSTER0_CORE_COUNT 4 #define PLATFORM_CLUSTER1_CORE_COUNT 4 #define PLATFORM_CORE_COUNT (PLATFORM_CLUSTER1_CORE_COUNT + \ PLATFORM_CLUSTER0_CORE_COUNT) #define PLATFORM_MAX_CPUS_PER_CLUSTER 4 #define PLATFORM_NUM_AFFS (PLATFORM_CLUSTER_COUNT + \ PLATFORM_CORE_COUNT) #define MAX_IO_DEVICES 3 #define MAX_IO_HANDLES 4 /******************************************************************************* * BL1 specific defines. * BL1 RW data is relocated from ROM to RAM at runtime so we need 2 sets of * addresses. ******************************************************************************/ #define BL1_RO_BASE FVP_TRUSTED_ROM_BASE #define BL1_RO_LIMIT (FVP_TRUSTED_ROM_BASE \ + FVP_TRUSTED_ROM_SIZE) /* * Put BL1 RW at the top of the Trusted SRAM (just below the shared memory, if * present). BL1_RW_BASE is calculated using the current BL1 RW debug size plus * a little space for growth. */ #define BL1_RW_BASE (FVP_TRUSTED_SRAM_LIMIT - 0x6000) #define BL1_RW_LIMIT FVP_TRUSTED_SRAM_LIMIT /******************************************************************************* * BL2 specific defines. ******************************************************************************/ /* * Put BL2 just below BL3-1. BL2_BASE is calculated using the current BL2 debug * size plus a little space for growth. */ #define BL2_BASE (BL31_BASE - 0xC000) #define BL2_LIMIT BL31_BASE /******************************************************************************* * BL31 specific defines. ******************************************************************************/ /* * Put BL3-1 at the top of the Trusted SRAM (just below the shared memory, if * present). BL31_BASE is calculated using the current BL3-1 debug size plus a * little space for growth. */ #define BL31_BASE (FVP_TRUSTED_SRAM_LIMIT - 0x1D000) #define BL31_PROGBITS_LIMIT BL1_RW_BASE #define BL31_LIMIT FVP_TRUSTED_SRAM_LIMIT /******************************************************************************* * BL32 specific defines. ******************************************************************************/ /* * On FVP, the TSP can execute either from Trusted SRAM or Trusted DRAM. */ #if FVP_TSP_RAM_LOCATION_ID == FVP_IN_TRUSTED_SRAM # define TSP_SEC_MEM_BASE FVP_TRUSTED_SRAM_BASE # define TSP_SEC_MEM_SIZE FVP_TRUSTED_SRAM_SIZE # define TSP_PROGBITS_LIMIT BL2_BASE # define BL32_BASE FVP_TRUSTED_SRAM_BASE # define BL32_LIMIT BL31_BASE #elif FVP_TSP_RAM_LOCATION_ID == FVP_IN_TRUSTED_DRAM # define TSP_SEC_MEM_BASE FVP_TRUSTED_DRAM_BASE # define TSP_SEC_MEM_SIZE FVP_TRUSTED_DRAM_SIZE # define BL32_BASE (FVP_TRUSTED_DRAM_BASE \ + FVP_SHARED_RAM_SIZE) # define BL32_LIMIT (FVP_TRUSTED_DRAM_BASE + (1 << 21)) #else # error "Unsupported FVP_TSP_RAM_LOCATION_ID value" #endif /* * ID of the secure physical generic timer interrupt used by the TSP. */ #define TSP_IRQ_SEC_PHY_TIMER IRQ_SEC_PHY_TIMER /******************************************************************************* * Platform specific page table and MMU setup constants ******************************************************************************/ #define ADDR_SPACE_SIZE (1ull << 32) #define MAX_XLAT_TABLES 2 #define MAX_MMAP_REGIONS 16 /******************************************************************************* * Declarations and constants to access the mailboxes safely. Each mailbox is * aligned on the biggest cache line size in the platform. This is known only * to the platform as it might have a combination of integrated and external * caches. Such alignment ensures that two maiboxes do not sit on the same cache * line at any cache level. They could belong to different cpus/clusters & * get written while being protected by different locks causing corruption of * a valid mailbox address. ******************************************************************************/ #define CACHE_WRITEBACK_SHIFT 6 #define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT) #endif /* __PLATFORM_DEF_H__ */ arm-trusted-firmware-1.0-aw-6/plat/fvp/platform.mk000066400000000000000000000101251322600646200221130ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Shared memory may be allocated at the top of Trusted SRAM (tsram) or at the # base of Trusted SRAM (tdram) FVP_SHARED_DATA_LOCATION := tsram ifeq (${FVP_SHARED_DATA_LOCATION}, tsram) FVP_SHARED_DATA_LOCATION_ID := FVP_IN_TRUSTED_SRAM else ifeq (${FVP_SHARED_DATA_LOCATION}, tdram) FVP_SHARED_DATA_LOCATION_ID := FVP_IN_TRUSTED_DRAM else $(error "Unsupported FVP_SHARED_DATA_LOCATION value") endif # On FVP, the TSP can execute either from Trusted SRAM or Trusted DRAM. # Trusted SRAM is the default. FVP_TSP_RAM_LOCATION := tsram ifeq (${FVP_TSP_RAM_LOCATION}, tsram) FVP_TSP_RAM_LOCATION_ID := FVP_IN_TRUSTED_SRAM else ifeq (${FVP_TSP_RAM_LOCATION}, tdram) FVP_TSP_RAM_LOCATION_ID := FVP_IN_TRUSTED_DRAM else $(error "Unsupported FVP_TSP_RAM_LOCATION value") endif ifeq (${FVP_SHARED_DATA_LOCATION}, tsram) ifeq (${FVP_TSP_RAM_LOCATION}, tdram) $(error Shared data in Trusted SRAM and TSP in Trusted DRAM is not supported) endif endif # Process flags $(eval $(call add_define,FVP_SHARED_DATA_LOCATION_ID)) $(eval $(call add_define,FVP_TSP_RAM_LOCATION_ID)) PLAT_INCLUDES := -Iplat/fvp/include/ PLAT_BL_COMMON_SOURCES := drivers/arm/pl011/pl011_console.S \ drivers/io/io_fip.c \ drivers/io/io_memmap.c \ drivers/io/io_semihosting.c \ drivers/io/io_storage.c \ lib/aarch64/xlat_tables.c \ lib/semihosting/semihosting.c \ lib/semihosting/aarch64/semihosting_call.S \ plat/common/aarch64/plat_common.c \ plat/fvp/fvp_io_storage.c BL1_SOURCES += drivers/arm/cci400/cci400.c \ lib/cpus/aarch64/aem_generic.S \ lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ plat/common/aarch64/platform_up_stack.S \ plat/fvp/bl1_fvp_setup.c \ plat/fvp/aarch64/fvp_common.c \ plat/fvp/aarch64/fvp_helpers.S BL2_SOURCES += drivers/arm/tzc400/tzc400.c \ plat/common/aarch64/platform_up_stack.S \ plat/fvp/bl2_fvp_setup.c \ plat/fvp/fvp_security.c \ plat/fvp/aarch64/fvp_common.c BL31_SOURCES += drivers/arm/cci400/cci400.c \ drivers/arm/gic/arm_gic.c \ drivers/arm/gic/gic_v2.c \ drivers/arm/gic/gic_v3.c \ drivers/arm/tzc400/tzc400.c \ lib/cpus/aarch64/aem_generic.S \ lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ plat/common/plat_gic.c \ plat/common/aarch64/platform_mp_stack.S \ plat/fvp/bl31_fvp_setup.c \ plat/fvp/fvp_pm.c \ plat/fvp/fvp_security.c \ plat/fvp/fvp_topology.c \ plat/fvp/aarch64/fvp_helpers.S \ plat/fvp/aarch64/fvp_common.c \ plat/fvp/drivers/pwrc/fvp_pwrc.c arm-trusted-firmware-1.0-aw-6/plat/fvp/tsp/000077500000000000000000000000001322600646200205455ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/fvp/tsp/tsp-fvp.mk000066400000000000000000000034661322600646200225060ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # TSP source files specific to FVP platform BL32_SOURCES += drivers/arm/gic/arm_gic.c \ drivers/arm/gic/gic_v2.c \ plat/common/aarch64/platform_mp_stack.S \ plat/common/plat_gic.c \ plat/fvp/aarch64/fvp_common.c \ plat/fvp/aarch64/fvp_helpers.S \ plat/fvp/tsp/tsp_fvp_setup.c arm-trusted-firmware-1.0-aw-6/plat/fvp/tsp/tsp_fvp_setup.c000066400000000000000000000102561322600646200236160ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "../fvp_def.h" #include "../fvp_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL32_RO_BASE (unsigned long)(&__RO_START__) #define BL32_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to * page-aligned addresses. */ #define BL32_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL32_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /******************************************************************************* * Initialize the UART ******************************************************************************/ void tsp_early_platform_setup(void) { /* * Initialize a different console than already in use to display * messages from TSP */ console_init(PL011_UART2_BASE, PL011_UART2_CLK_IN_HZ, PL011_BAUDRATE); /* Initialize the platform config for future decision making */ fvp_config_setup(); } /******************************************************************************* * Perform platform specific setup placeholder ******************************************************************************/ void tsp_platform_setup(void) { fvp_gic_init(); } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only intializes the MMU ******************************************************************************/ void tsp_plat_arch_setup(void) { fvp_configure_mmu_el1(BL32_RO_BASE, (BL32_COHERENT_RAM_LIMIT - BL32_RO_BASE), BL32_RO_BASE, BL32_RO_LIMIT, BL32_COHERENT_RAM_BASE, BL32_COHERENT_RAM_LIMIT); } arm-trusted-firmware-1.0-aw-6/plat/juno/000077500000000000000000000000001322600646200201175ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/juno/aarch64/000077500000000000000000000000001322600646200213475ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/juno/aarch64/bl1_plat_helpers.S000066400000000000000000000114371322600646200247210ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "../juno_def.h" .globl platform_is_primary_cpu .globl platform_get_entrypoint .globl platform_cold_boot_init .globl plat_secondary_cold_boot_setup /* ----------------------------------------------------- * unsigned int platform_is_primary_cpu (unsigned int mpid); * * Given the mpidr say whether this cpu is the primary * cpu (applicable ony after a cold boot) * ----------------------------------------------------- */ func platform_is_primary_cpu mov x9, x30 bl platform_get_core_pos ldr x1, =SCP_BOOT_CFG_ADDR ldr x1, [x1] ubfx x1, x1, #PRIMARY_CPU_SHIFT, #PRIMARY_CPU_MASK cmp x0, x1 cset x0, eq ret x9 /* ----------------------------------------------------- * void plat_secondary_cold_boot_setup (void); * * This function performs any platform specific actions * needed for a secondary cpu after a cold reset e.g * mark the cpu's presence, mechanism to place it in a * holding pen etc. * ----------------------------------------------------- */ func plat_secondary_cold_boot_setup /* Juno todo: Implement secondary CPU cold boot setup on Juno */ cb_panic: b cb_panic /* ----------------------------------------------------- * void platform_get_entrypoint (unsigned int mpid); * * Main job of this routine is to distinguish between * a cold and warm boot. * On a cold boot the secondaries first wait for the * platform to be initialized after which they are * hotplugged in. The primary proceeds to perform the * platform initialization. * On a warm boot, each cpu jumps to the address in its * mailbox. * * TODO: Not a good idea to save lr in a temp reg * ----------------------------------------------------- */ func platform_get_entrypoint mov x9, x30 // lr bl platform_get_core_pos ldr x1, =TRUSTED_MAILBOXES_BASE lsl x0, x0, #TRUSTED_MAILBOX_SHIFT ldr x0, [x1, x0] ret x9 /* ----------------------------------------------------- * void platform_cold_boot_init (bl1_main function); * * Routine called only by the primary cpu after a cold * boot to perform early platform initialization * ----------------------------------------------------- */ func platform_cold_boot_init mov x20, x0 /* --------------------------------------------- * Give ourselves a small coherent stack to * ease the pain of initializing the MMU and * CCI in assembler * --------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_coherent_stack /* --------------------------------------------- * Architectural init. can be generic e.g. * enabling stack alignment and platform spec- * ific e.g. MMU & page table setup as per the * platform memory map. Perform the latter here * and the former in bl1_main. * --------------------------------------------- */ bl bl1_early_platform_setup bl bl1_plat_arch_setup /* --------------------------------------------- * Give ourselves a stack allocated in Normal * -IS-WBWA memory * --------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* --------------------------------------------- * Jump to the main function. Returning from it * is a terminal error. * --------------------------------------------- */ blr x20 cb_init_panic: b cb_init_panic arm-trusted-firmware-1.0-aw-6/plat/juno/aarch64/juno_common.c000066400000000000000000000104501322600646200240360ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "../juno_def.h" /* * Table of regions to map using the MMU. * This doesn't include Trusted RAM as the 'mem_layout' argument passed to * configure_mmu_elx() will give the available subset of that, */ static const mmap_region_t juno_mmap[] = { { TZROM_BASE, TZROM_BASE, TZROM_SIZE, MT_MEMORY | MT_RO | MT_SECURE }, { MHU_SECURE_BASE, MHU_SECURE_BASE, MHU_SECURE_SIZE, (MHU_PAYLOAD_CACHED ? MT_MEMORY : MT_DEVICE) | MT_RW | MT_SECURE }, { FLASH_BASE, FLASH_BASE, FLASH_SIZE, MT_MEMORY | MT_RO | MT_SECURE }, { EMMC_BASE, EMMC_BASE, EMMC_SIZE, MT_MEMORY | MT_RO | MT_SECURE }, { PSRAM_BASE, PSRAM_BASE, PSRAM_SIZE, MT_MEMORY | MT_RW | MT_SECURE }, /* Used for 'TZDRAM' */ { IOFPGA_BASE, IOFPGA_BASE, IOFPGA_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, { DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, { DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, { DRAM_BASE, DRAM_BASE, DRAM_SIZE, MT_MEMORY | MT_RW | MT_NS }, {0} }; /******************************************************************************* * Macro generating the code for the function setting up the pagetables as per * the platform memory map & initialize the mmu, for the given exception level ******************************************************************************/ #define DEFINE_CONFIGURE_MMU_EL(_el) \ void configure_mmu_el##_el(unsigned long total_base, \ unsigned long total_size, \ unsigned long ro_start, \ unsigned long ro_limit, \ unsigned long coh_start, \ unsigned long coh_limit) \ { \ mmap_add_region(total_base, total_base, \ total_size, \ MT_MEMORY | MT_RW | MT_SECURE); \ mmap_add_region(ro_start, ro_start, \ ro_limit - ro_start, \ MT_MEMORY | MT_RO | MT_SECURE); \ mmap_add_region(coh_start, coh_start, \ coh_limit - coh_start, \ MT_DEVICE | MT_RW | MT_SECURE); \ mmap_add(juno_mmap); \ init_xlat_tables(); \ \ enable_mmu_el##_el(0); \ } /* Define EL1 and EL3 variants of the function initialising the MMU */ DEFINE_CONFIGURE_MMU_EL(1) DEFINE_CONFIGURE_MMU_EL(3) unsigned long plat_get_ns_image_entrypoint(void) { return NS_IMAGE_OFFSET; } uint64_t plat_get_syscnt_freq(void) { uint64_t counter_base_frequency; /* Read the frequency from Frequency modes table */ counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); /* The first entry of the frequency modes table must not be 0 */ if (counter_base_frequency == 0) panic(); return counter_base_frequency; } arm-trusted-firmware-1.0-aw-6/plat/juno/aarch64/plat_helpers.S000066400000000000000000000113361322600646200241610ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "../juno_def.h" .globl plat_crash_console_init .globl plat_crash_console_putc .globl plat_report_exception .globl plat_reset_handler .globl platform_get_core_pos .globl platform_mem_init /* Define a crash console for the plaform */ #define JUNO_CRASH_CONSOLE_BASE PL011_UART0_BASE /* --------------------------------------------- * int plat_crash_console_init(void) * Function to initialize the crash console * without a C Runtime to print crash report. * Clobber list : x0, x1, x2 * --------------------------------------------- */ func plat_crash_console_init mov_imm x0, JUNO_CRASH_CONSOLE_BASE mov_imm x1, PL011_UART0_CLK_IN_HZ mov_imm x2, PL011_BAUDRATE b console_core_init /* --------------------------------------------- * int plat_crash_console_putc(int c) * Function to print a character on the crash * console without a C Runtime. * Clobber list : x1, x2 * --------------------------------------------- */ func plat_crash_console_putc mov_imm x1, JUNO_CRASH_CONSOLE_BASE b console_core_putc /* --------------------------------------------- * void plat_report_exception(unsigned int type) * Function to report an unhandled exception * with platform-specific means. * On Juno platform, it updates the LEDs * to indicate where we are * --------------------------------------------- */ func plat_report_exception mrs x1, CurrentEl lsr x1, x1, #MODE_EL_SHIFT lsl x1, x1, #SYS_LED_EL_SHIFT lsl x0, x0, #SYS_LED_EC_SHIFT mov x2, #(SECURE << SYS_LED_SS_SHIFT) orr x0, x0, x2 orr x0, x0, x1 mov x1, #VE_SYSREGS_BASE add x1, x1, #V2M_SYS_LED str w0, [x1] ret /* * Return 0 to 3 for the A53s and 4 or 5 for the A57s */ func platform_get_core_pos and x1, x0, #MPIDR_CPU_MASK and x0, x0, #MPIDR_CLUSTER_MASK eor x0, x0, #(1 << MPIDR_AFFINITY_BITS) // swap A53/A57 order add x0, x1, x0, LSR #6 ret /* ----------------------------------------------------- * void platform_mem_init(void); * * We don't need to carry out any memory initialization * on Juno. The Secure RAM is accessible straight away. * ----------------------------------------------------- */ func platform_mem_init ret /* ----------------------------------------------------- * void plat_reset_handler(void); * * Implement workaround for defect id 831273 by enabling * an event stream every 65536 cycles and set the L2 RAM * latencies for Cortex-A57. * ----------------------------------------------------- */ func plat_reset_handler /* Read the MIDR_EL1 */ mrs x0, midr_el1 ubfx x1, x0, MIDR_PN_SHIFT, #12 cmp w1, #((CORTEX_A57_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK) b.ne 1f /* Change the L2 Data and Tag Ram latency to 3 cycles */ mov x0, #(L2_DATA_RAM_LATENCY_3_CYCLES | \ (L2_TAG_RAM_LATENCY_3_CYCLES << \ L2CTLR_TAG_RAM_LATENCY_SHIFT)) msr L2CTLR_EL1, x0 1: /* --------------------------------------------- * Enable the event stream every 65536 cycles * --------------------------------------------- */ mov x0, #(0xf << EVNTI_SHIFT) orr x0, x0, #EVNTEN_BIT msr CNTKCTL_EL1, x0 isb ret arm-trusted-firmware-1.0-aw-6/plat/juno/bl1_plat_setup.c000066400000000000000000000210511322600646200232000ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "../../bl1/bl1_private.h" #include "juno_def.h" #include "juno_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted RAM ******************************************************************************/ extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to * page-aligned addresses. */ #define BL1_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL1_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /* Data structure which holds the extents of the trusted RAM for BL1 */ static meminfo_t bl1_tzram_layout; meminfo_t *bl1_plat_sec_mem_layout(void) { return &bl1_tzram_layout; } /******************************************************************************* * Perform any BL1 specific platform actions. ******************************************************************************/ void bl1_early_platform_setup(void) { const size_t bl1_size = BL1_RAM_LIMIT - BL1_RAM_BASE; /* Initialize the console to provide early debug support */ console_init(PL011_UART2_BASE, PL011_UART2_CLK_IN_HZ, PL011_BAUDRATE); /* * Enable CCI-400 for this cluster. No need for locks as no other cpu is * active at the moment */ cci_init(CCI400_BASE, CCI400_SL_IFACE3_CLUSTER_IX, CCI400_SL_IFACE4_CLUSTER_IX); cci_enable_cluster_coherency(read_mpidr()); /* Allow BL1 to see the whole Trusted RAM */ bl1_tzram_layout.total_base = TZRAM_BASE; bl1_tzram_layout.total_size = TZRAM_SIZE; /* Calculate how much RAM BL1 is using and how much remains free */ bl1_tzram_layout.free_base = TZRAM_BASE; bl1_tzram_layout.free_size = TZRAM_SIZE; reserve_mem(&bl1_tzram_layout.free_base, &bl1_tzram_layout.free_size, BL1_RAM_BASE, bl1_size); INFO("BL1: 0x%lx - 0x%lx [size = %u]\n", BL1_RAM_BASE, BL1_RAM_LIMIT, bl1_size); } /* * Address of slave 'n' security setting in the NIC-400 address region * control * TODO: Ideally this macro should be moved in a "nic-400.h" header file but * it would be the only thing in there so it's not worth it at the moment. */ #define NIC400_ADDR_CTRL_SECURITY_REG(n) (0x8 + (n) * 4) static void init_nic400(void) { /* * NIC-400 Access Control Initialization * * Define access privileges by setting each corresponding bit to: * 0 = Secure access only * 1 = Non-secure access allowed */ /* * Allow non-secure access to some SOC regions, excluding UART1, which * remains secure. * Note: This is the NIC-400 device on the SOC */ mmio_write_32(SOC_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(SOC_NIC400_USB_EHCI), ~0); mmio_write_32(SOC_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(SOC_NIC400_TLX_MASTER), ~0); mmio_write_32(SOC_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(SOC_NIC400_USB_OHCI), ~0); mmio_write_32(SOC_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(SOC_NIC400_PL354_SMC), ~0); mmio_write_32(SOC_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(SOC_NIC400_APB4_BRIDGE), ~0); mmio_write_32(SOC_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(SOC_NIC400_BOOTSEC_BRIDGE), ~SOC_NIC400_BOOTSEC_BRIDGE_UART1); /* * Allow non-secure access to some CSS regions. * Note: This is the NIC-400 device on the CSS */ mmio_write_32(CSS_NIC400_BASE + NIC400_ADDR_CTRL_SECURITY_REG(CSS_NIC400_SLAVE_BOOTSECURE), ~0); } static void init_tzc400(void) { /* Enable all filter units available */ mmio_write_32(TZC400_BASE + GATE_KEEPER_OFF, 0x0000000f); /* * Secure read and write are enabled for region 0, and the background * region (region 0) is enabled for all four filter units */ mmio_write_32(TZC400_BASE + REGION_ATTRIBUTES_OFF, 0xc0000000); /* * Enable Non-secure read/write accesses for the Soc Devices from the * Non-Secure World */ mmio_write_32(TZC400_BASE + REGION_ID_ACCESS_OFF, TZC_REGION_ACCESS_RDWR(TZC400_NSAID_CCI400) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_PCIE) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_HDLCD0) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_HDLCD1) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_USB) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_DMA330) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_THINLINKS) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_AP) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_GPU) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_SCP) | TZC_REGION_ACCESS_RDWR(TZC400_NSAID_CORESIGHT) ); } #define PCIE_SECURE_REG 0x3000 #define PCIE_SEC_ACCESS_MASK ((1 << 0) | (1 << 1)) /* REG and MEM access bits */ static void init_pcie(void) { /* * PCIE Root Complex Security settings to enable non-secure * access to config registers. */ mmio_write_32(PCIE_CONTROL_BASE + PCIE_SECURE_REG, PCIE_SEC_ACCESS_MASK); } /******************************************************************************* * Function which will perform any remaining platform-specific setup that can * occur after the MMU and data cache have been enabled. ******************************************************************************/ void bl1_platform_setup(void) { init_nic400(); init_tzc400(); init_pcie(); /* Initialise the IO layer and register platform IO devices */ io_setup(); /* Enable and initialize the System level generic timer */ mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN); } /******************************************************************************* * Perform the very early platform specific architecture setup here. At the * moment this only does basic initialization. Later architectural setup * (bl1_arch_setup()) does not do anything platform specific. ******************************************************************************/ void bl1_plat_arch_setup(void) { configure_mmu_el3(bl1_tzram_layout.total_base, bl1_tzram_layout.total_size, TZROM_BASE, TZROM_BASE + TZROM_SIZE, BL1_COHERENT_RAM_BASE, BL1_COHERENT_RAM_LIMIT); } /******************************************************************************* * Before calling this function BL2 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL2 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint ******************************************************************************/ void bl1_plat_set_bl2_ep_info(image_info_t *bl2_image, entry_point_info_t *bl2_ep) { SET_SECURITY_STATE(bl2_ep->h.attr, SECURE); bl2_ep->spsr = SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); } arm-trusted-firmware-1.0-aw-6/plat/juno/bl2_plat_setup.c000066400000000000000000000304501322600646200232040ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "juno_def.h" #include "juno_private.h" #include "scp_bootloader.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted RAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL2_RO_BASE (unsigned long)(&__RO_START__) #define BL2_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to * page-aligned addresses. */ #define BL2_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL2_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /* Data structure which holds the extents of the trusted RAM for BL2 */ static meminfo_t bl2_tzram_layout __attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE), section("tzfw_coherent_mem"))); /******************************************************************************* * Structure which holds the arguments which need to be passed to BL3-1 ******************************************************************************/ static bl2_to_bl31_params_mem_t bl31_params_mem; meminfo_t *bl2_plat_sec_mem_layout(void) { return &bl2_tzram_layout; } /******************************************************************************* * This function assigns a pointer to the memory that the platform has kept * aside to pass platform specific and trusted firmware related information * to BL31. This memory is allocated by allocating memory to * bl2_to_bl31_params_mem_t structure which is a superset of all the * structure whose information is passed to BL31 * NOTE: This function should be called only once and should be done * before generating params to BL31 ******************************************************************************/ bl31_params_t *bl2_plat_get_bl31_params(void) { bl31_params_t *bl2_to_bl31_params; /* * Initialise the memory for all the arguments that needs to * be passed to BL3-1 */ memset(&bl31_params_mem, 0, sizeof(bl2_to_bl31_params_mem_t)); /* Assign memory for TF related information */ bl2_to_bl31_params = &bl31_params_mem.bl31_params; SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0); /* Fill BL3-1 related information */ bl2_to_bl31_params->bl31_image_info = &bl31_params_mem.bl31_image_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); /* Fill BL3-2 related information if it exists */ #if BL32_BASE bl2_to_bl31_params->bl32_ep_info = &bl31_params_mem.bl32_ep_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info, PARAM_EP, VERSION_1, 0); bl2_to_bl31_params->bl32_image_info = &bl31_params_mem.bl32_image_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); #endif /* Fill BL3-3 related information */ bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem.bl33_ep_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info, PARAM_EP, VERSION_1, 0); /* BL3-3 expects to receive the primary CPU MPID (through x0) */ bl2_to_bl31_params->bl33_ep_info->args.arg0 = 0xffff & read_mpidr(); bl2_to_bl31_params->bl33_image_info = &bl31_params_mem.bl33_image_info; SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info, PARAM_IMAGE_BINARY, VERSION_1, 0); return bl2_to_bl31_params; } /******************************************************************************* * This function returns a pointer to the shared memory that the platform * has kept to point to entry point information of BL31 to BL2 ******************************************************************************/ struct entry_point_info *bl2_plat_get_bl31_ep_info(void) { #if DEBUG bl31_params_mem.bl31_ep_info.args.arg1 = JUNO_BL31_PLAT_PARAM_VAL; #endif return &bl31_params_mem.bl31_ep_info; } /******************************************************************************* * BL1 has passed the extents of the trusted RAM that should be visible to BL2 * in x0. This memory layout is sitting at the base of the free trusted RAM. * Copy it to a safe loaction before its reclaimed by later BL2 functionality. ******************************************************************************/ void bl2_early_platform_setup(meminfo_t *mem_layout) { /* Initialize the console to provide early debug support */ console_init(PL011_UART2_BASE, PL011_UART2_CLK_IN_HZ, PL011_BAUDRATE); /* Setup the BL2 memory layout */ bl2_tzram_layout = *mem_layout; } /******************************************************************************* * Perform platform specific setup, i.e. initialize the IO layer, load BL3-0 * image and initialise the memory location to use for passing arguments to * BL3-1. ******************************************************************************/ void bl2_platform_setup(void) { /* Initialise the IO layer and register platform IO devices */ io_setup(); } /* Flush the TF params and the TF plat params */ void bl2_plat_flush_bl31_params(void) { flush_dcache_range((unsigned long)&bl31_params_mem, sizeof(bl2_to_bl31_params_mem_t)); } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only intializes the mmu in a quick and dirty way. ******************************************************************************/ void bl2_plat_arch_setup(void) { configure_mmu_el1(bl2_tzram_layout.total_base, bl2_tzram_layout.total_size, BL2_RO_BASE, BL2_RO_LIMIT, BL2_COHERENT_RAM_BASE, BL2_COHERENT_RAM_LIMIT); } /******************************************************************************* * Populate the extents of memory available for loading BL3-0, i.e. anywhere * in trusted RAM as long as it doesn't overwrite BL2. ******************************************************************************/ void bl2_plat_get_bl30_meminfo(meminfo_t *bl30_meminfo) { *bl30_meminfo = bl2_tzram_layout; } /******************************************************************************* * Transfer BL3-0 from Trusted RAM using the SCP Download protocol. * Return 0 on success, -1 otherwise. ******************************************************************************/ int bl2_plat_handle_bl30(image_info_t *bl30_image_info) { int ret; ret = scp_bootloader_transfer((void *)bl30_image_info->image_base, bl30_image_info->image_size); if (ret == 0) INFO("BL2: BL3-0 transferred to SCP\n\r"); else ERROR("BL2: BL3-0 transfer failure\n\r"); return ret; } /******************************************************************************* * Before calling this function BL31 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL31 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint ******************************************************************************/ void bl2_plat_set_bl31_ep_info(image_info_t *bl31_image_info, entry_point_info_t *bl31_ep_info) { SET_SECURITY_STATE(bl31_ep_info->h.attr, SECURE); bl31_ep_info->spsr = SPSR_64(MODE_EL3, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); } /******************************************************************************* * Before calling this function BL32 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL32 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint ******************************************************************************/ void bl2_plat_set_bl32_ep_info(image_info_t *bl32_image_info, entry_point_info_t *bl32_ep_info) { SET_SECURITY_STATE(bl32_ep_info->h.attr, SECURE); /* * The Secure Payload Dispatcher service is responsible for * setting the SPSR prior to entry into the BL32 image. */ bl32_ep_info->spsr = 0; } /******************************************************************************* * Before calling this function BL33 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL33 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint ******************************************************************************/ void bl2_plat_set_bl33_ep_info(image_info_t *image, entry_point_info_t *bl33_ep_info) { unsigned long el_status; unsigned int mode; /* Figure out what mode we enter the non-secure world in */ el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; el_status &= ID_AA64PFR0_ELX_MASK; if (el_status) mode = MODE_EL2; else mode = MODE_EL1; /* * TODO: Consider the possibility of specifying the SPSR in * the FIP ToC and allowing the platform to have a say as * well. */ bl33_ep_info->spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); SET_SECURITY_STATE(bl33_ep_info->h.attr, NON_SECURE); } /******************************************************************************* * Populate the extents of memory available for loading BL3-2 ******************************************************************************/ void bl2_plat_get_bl32_meminfo(meminfo_t *bl32_meminfo) { /* * Populate the extents of memory available for loading BL3-2. */ bl32_meminfo->total_base = BL32_BASE; bl32_meminfo->free_base = BL32_BASE; bl32_meminfo->total_size = (TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE; bl32_meminfo->free_size = (TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE; } /******************************************************************************* * Populate the extents of memory available for loading BL3-3 ******************************************************************************/ void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo) { bl33_meminfo->total_base = DRAM_BASE; bl33_meminfo->total_size = DRAM_SIZE; bl33_meminfo->free_base = DRAM_BASE; bl33_meminfo->free_size = DRAM_SIZE; } arm-trusted-firmware-1.0-aw-6/plat/juno/bl31_plat_setup.c000066400000000000000000000163621322600646200232740ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "juno_def.h" #include "juno_private.h" #include "mhu.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted RAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL31_RO_BASE (unsigned long)(&__RO_START__) #define BL31_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols * refer to page-aligned addresses. */ #define BL31_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL31_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /****************************************************************************** * Placeholder variables for copying the arguments that have been passed to * BL3-1 from BL2. ******************************************************************************/ static entry_point_info_t bl32_ep_info; static entry_point_info_t bl33_ep_info; /******************************************************************************* * Return a pointer to the 'entry_point_info' structure of the next image for * the security state specified. BL3-3 corresponds to the non-secure image type * while BL3-2 corresponds to the secure image type. A NULL pointer is returned * if the image does not exist. ******************************************************************************/ entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) { entry_point_info_t *next_image_info; next_image_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info; /* None of the images on this platform can have 0x0 as the entrypoint */ if (next_image_info->pc) return next_image_info; else return NULL; } /******************************************************************************* * Perform any BL3-1 specific platform actions. Here is an opportunity to copy * parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they * are lost (potentially). This needs to be done before the MMU is initialized * so that the memory layout can be used while creating page tables. Also, BL2 * has flushed this information to memory, so we are guaranteed to pick up good * data ******************************************************************************/ void bl31_early_platform_setup(bl31_params_t *from_bl2, void *plat_params_from_bl2) { /* Initialize the console to provide early debug support */ console_init(PL011_UART2_BASE, PL011_UART2_CLK_IN_HZ, PL011_BAUDRATE); /* * Initialise the CCI-400 driver for BL31 so that it is accessible after * a warm boot. BL1 should have already enabled CCI coherency for this * cluster during cold boot. */ cci_init(CCI400_BASE, CCI400_SL_IFACE3_CLUSTER_IX, CCI400_SL_IFACE4_CLUSTER_IX); /* * Check params passed from BL2 should not be NULL, */ assert(from_bl2 != NULL); assert(from_bl2->h.type == PARAM_BL31); assert(from_bl2->h.version >= VERSION_1); /* * In debug builds, we pass a special value in 'plat_params_from_bl2' * to verify platform parameters from BL2 to BL3-1. * In release builds, it's not used. */ assert(((unsigned long long)plat_params_from_bl2) == JUNO_BL31_PLAT_PARAM_VAL); /* * Copy BL3-2 and BL3-3 entry point information. * They are stored in Secure RAM, in BL2's address space. */ bl32_ep_info = *from_bl2->bl32_ep_info; bl33_ep_info = *from_bl2->bl33_ep_info; } /******************************************************************************* * Initialize the MHU and the GIC. ******************************************************************************/ void bl31_platform_setup(void) { unsigned int reg_val; mhu_secure_init(); /* Initialize the gic cpu and distributor interfaces */ gic_setup(); /* Enable and initialize the System level generic timer */ mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN); /* Allow access to the System counter timer module */ reg_val = (1 << CNTACR_RPCT_SHIFT) | (1 << CNTACR_RVCT_SHIFT); reg_val |= (1 << CNTACR_RFRQ_SHIFT) | (1 << CNTACR_RVOFF_SHIFT); reg_val |= (1 << CNTACR_RWVT_SHIFT) | (1 << CNTACR_RWPT_SHIFT); mmio_write_32(SYS_TIMCTL_BASE + CNTACR_BASE(1), reg_val); reg_val = (1 << CNTNSAR_NS_SHIFT(1)); mmio_write_32(SYS_TIMCTL_BASE + CNTNSAR, reg_val); /* Topologies are best known to the platform. */ plat_setup_topology(); } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only intializes the mmu in a quick and dirty way. ******************************************************************************/ void bl31_plat_arch_setup() { configure_mmu_el3(BL31_RO_BASE, BL31_COHERENT_RAM_LIMIT - BL31_RO_BASE, BL31_RO_BASE, BL31_RO_LIMIT, BL31_COHERENT_RAM_BASE, BL31_COHERENT_RAM_LIMIT); } arm-trusted-firmware-1.0-aw-6/plat/juno/include/000077500000000000000000000000001322600646200215425ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/juno/include/plat_macros.S000066400000000000000000000070561322600646200242020ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "platform_def.h" #include "../juno_def.h" .section .rodata.gic_reg_name, "aS" gic_regs: .asciz "gic_hppir", "gic_ahppir", "gic_ctlr", "" gicd_pend_reg: .asciz "gicd_ispendr regs (Offsets 0x200 - 0x278)\n Offset:\t\t\tvalue\n" newline: .asciz "\n" spacer: .asciz ":\t\t0x" /* --------------------------------------------- * The below macro prints out relevant GIC * registers whenever an unhandled exception is * taken in BL3-1. * Clobbers: x0 - x10, x16, sp * --------------------------------------------- */ .macro plat_print_gic_regs ldr x16, =GICC_BASE /* Load the gic reg list to x6 */ adr x6, gic_regs /* Load the gic regs to gp regs used by str_in_crash_buf_print */ ldr w8, [x16, #GICC_HPPIR] ldr w9, [x16, #GICC_AHPPIR] ldr w10, [x16, #GICC_CTLR] /* Store to the crash buf and print to console */ bl str_in_crash_buf_print /* Print the GICD_ISPENDR regs */ add x7, x16, #GICD_ISPENDR adr x4, gicd_pend_reg bl asm_print_str gicd_ispendr_loop: sub x4, x7, x16 cmp x4, #0x280 b.eq exit_print_gic_regs bl asm_print_hex adr x4, spacer bl asm_print_str ldr x4, [x7], #8 bl asm_print_hex adr x4, newline bl asm_print_str b gicd_ispendr_loop exit_print_gic_regs: .endm .section .rodata.cci_reg_name, "aS" cci_iface_regs: .asciz "cci_snoop_ctrl_cluster0", "cci_snoop_ctrl_cluster1" , "" /* ------------------------------------------------ * The below macro prints out relevant interconnect * registers whenever an unhandled exception is * taken in BL3-1. * Clobbers: x0 - x9, sp * ------------------------------------------------ */ .macro plat_print_interconnect_regs adr x6, cci_iface_regs /* Store in x7 the base address of the first interface */ mov_imm x7, (CCI400_BASE + SLAVE_IFACE3_OFFSET) ldr w8, [x7, #SNOOP_CTRL_REG] /* Store in x7 the base address of the second interface */ mov_imm x7, (CCI400_BASE + SLAVE_IFACE4_OFFSET) ldr w9, [x7, #SNOOP_CTRL_REG] /* Store to the crash buf and print to console */ bl str_in_crash_buf_print .endm arm-trusted-firmware-1.0-aw-6/plat/juno/include/platform_def.h000066400000000000000000000153001322600646200243540ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLATFORM_DEF_H__ #define __PLATFORM_DEF_H__ #include #include "../juno_def.h" /******************************************************************************* * Platform binary types for linking ******************************************************************************/ #define PLATFORM_LINKER_FORMAT "elf64-littleaarch64" #define PLATFORM_LINKER_ARCH aarch64 /******************************************************************************* * Generic platform constants ******************************************************************************/ /* Size of cacheable stacks */ #define PLATFORM_STACK_SIZE 0x800 #define FIRMWARE_WELCOME_STR "Booting Trusted Firmware\n" /* Trusted Boot Firmware BL2 */ #define BL2_IMAGE_NAME "bl2.bin" /* EL3 Runtime Firmware BL3-1 */ #define BL31_IMAGE_NAME "bl31.bin" /* SCP Firmware BL3-0 */ #define BL30_IMAGE_NAME "bl30.bin" /* Secure Payload BL3-2 (Trusted OS) */ #define BL32_IMAGE_NAME "bl32.bin" /* Non-Trusted Firmware BL3-3 */ #define BL33_IMAGE_NAME "bl33.bin" /* e.g. UEFI */ /* Firmware Image Package */ #define FIP_IMAGE_NAME "fip.bin" #define PLATFORM_CACHE_LINE_SIZE 64 #define PLATFORM_CLUSTER_COUNT 2 #define PLATFORM_CORE_COUNT 6 #define PLATFORM_NUM_AFFS (PLATFORM_CLUSTER_COUNT + \ PLATFORM_CORE_COUNT) #define MAX_IO_DEVICES 3 #define MAX_IO_HANDLES 4 /******************************************************************************* * Platform memory map related constants ******************************************************************************/ #define FLASH_BASE 0x08000000 #define FLASH_SIZE 0x04000000 /* Bypass offset from start of NOR flash */ #define BL1_ROM_BYPASS_OFFSET 0x03EC0000 #ifndef TZROM_BASE /* Use the bypass address */ #define TZROM_BASE FLASH_BASE + BL1_ROM_BYPASS_OFFSET #endif #define TZROM_SIZE 0x00010000 #define TZRAM_BASE 0x04001000 #define TZRAM_SIZE 0x0003F000 /******************************************************************************* * BL1 specific defines. * BL1 RW data is relocated from ROM to RAM at runtime so we need 2 base * addresses. ******************************************************************************/ #define BL1_RO_BASE TZROM_BASE #define BL1_RO_LIMIT (TZROM_BASE + TZROM_SIZE) #define BL1_RW_BASE TZRAM_BASE #define BL1_RW_LIMIT BL31_BASE /******************************************************************************* * BL2 specific defines. ******************************************************************************/ #define BL2_BASE (TZRAM_BASE + TZRAM_SIZE - 0xd000) #define BL2_LIMIT (TZRAM_BASE + TZRAM_SIZE) /******************************************************************************* * Load address of BL3-0 in the Juno port * BL3-0 is loaded to the same place as BL3-1. Once BL3-0 is transferred to the * SCP, it is discarded and BL3-1 is loaded over the top. ******************************************************************************/ #define BL30_BASE BL31_BASE /******************************************************************************* * BL3-1 specific defines. ******************************************************************************/ #define BL31_BASE (TZRAM_BASE + 0x8000) #define BL31_LIMIT BL32_BASE /******************************************************************************* * BL3-2 specific defines. ******************************************************************************/ #define TSP_SEC_MEM_BASE TZRAM_BASE #define TSP_SEC_MEM_SIZE TZRAM_SIZE #define BL32_BASE (TZRAM_BASE + TZRAM_SIZE - 0x1d000) #define BL32_LIMIT BL2_BASE /******************************************************************************* * Load address of BL3-3 in the Juno port ******************************************************************************/ #define NS_IMAGE_OFFSET 0xE0000000 /******************************************************************************* * Platform specific page table and MMU setup constants ******************************************************************************/ #define ADDR_SPACE_SIZE (1ull << 32) #define MAX_XLAT_TABLES 2 #define MAX_MMAP_REGIONS 16 /******************************************************************************* * ID of the secure physical generic timer interrupt used by the TSP ******************************************************************************/ #define TSP_IRQ_SEC_PHY_TIMER IRQ_SEC_PHY_TIMER /******************************************************************************* * Declarations and constants to access the mailboxes safely. Each mailbox is * aligned on the biggest cache line size in the platform. This is known only * to the platform as it might have a combination of integrated and external * caches. Such alignment ensures that two maiboxes do not sit on the same cache * line at any cache level. They could belong to different cpus/clusters & * get written while being protected by different locks causing corruption of * a valid mailbox address. ******************************************************************************/ #define CACHE_WRITEBACK_SHIFT 6 #define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT) #endif /* __PLATFORM_DEF_H__ */ arm-trusted-firmware-1.0-aw-6/plat/juno/juno_def.h000066400000000000000000000155421322600646200220700ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __JUNO_DEF_H__ #define __JUNO_DEF_H__ /* Special value used to verify platform parameters from BL2 to BL3-1 */ #define JUNO_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL /******************************************************************************* * Juno memory map related constants ******************************************************************************/ #define MHU_SECURE_BASE 0x04000000 #define MHU_SECURE_SIZE 0x00001000 #define MHU_PAYLOAD_CACHED 0 #define TRUSTED_MAILBOXES_BASE MHU_SECURE_BASE #define TRUSTED_MAILBOX_SHIFT 4 #define EMMC_BASE 0x0c000000 #define EMMC_SIZE 0x04000000 #define PSRAM_BASE 0x14000000 #define PSRAM_SIZE 0x02000000 #define IOFPGA_BASE 0x1c000000 #define IOFPGA_SIZE 0x03000000 #define NSROM_BASE 0x1f000000 #define NSROM_SIZE 0x00001000 /* Following covers Columbus Peripherals excluding NSROM and NSRAM */ #define DEVICE0_BASE 0x20000000 #define DEVICE0_SIZE 0x0e000000 #define MHU_BASE 0x2b1f0000 #define NSRAM_BASE 0x2e000000 #define NSRAM_SIZE 0x00008000 /* Following covers Juno Peripherals and PCIe expansion area */ #define DEVICE1_BASE 0x40000000 #define DEVICE1_SIZE 0x40000000 #define PCIE_CONTROL_BASE 0x7ff20000 #define DRAM_BASE 0x80000000 #define DRAM_SIZE 0x80000000 /* Memory mapped Generic timer interfaces */ #define SYS_CNTCTL_BASE 0x2a430000 #define SYS_CNTREAD_BASE 0x2a800000 #define SYS_TIMCTL_BASE 0x2a810000 /* V2M motherboard system registers & offsets */ #define VE_SYSREGS_BASE 0x1c010000 #define V2M_SYS_LED 0x8 /* * V2M sysled bit definitions. The values written to this * register are defined in arch.h & runtime_svc.h. Only * used by the primary cpu to diagnose any cold boot issues. * * SYS_LED[0] - Security state (S=0/NS=1) * SYS_LED[2:1] - Exception Level (EL3-EL0) * SYS_LED[7:3] - Exception Class (Sync/Async & origin) * */ #define SYS_LED_SS_SHIFT 0x0 #define SYS_LED_EL_SHIFT 0x1 #define SYS_LED_EC_SHIFT 0x3 /******************************************************************************* * GIC-400 & interrupt handling related constants ******************************************************************************/ #define GICD_BASE 0x2c010000 #define GICC_BASE 0x2c02f000 #define GICH_BASE 0x2c04f000 #define GICV_BASE 0x2c06f000 #define IRQ_MHU 69 #define IRQ_GPU_SMMU_0 71 #define IRQ_GPU_SMMU_1 73 #define IRQ_ETR_SMMU 75 #define IRQ_TZC400 80 #define IRQ_TZ_WDOG 86 #define IRQ_SEC_PHY_TIMER 29 #define IRQ_SEC_SGI_0 8 #define IRQ_SEC_SGI_1 9 #define IRQ_SEC_SGI_2 10 #define IRQ_SEC_SGI_3 11 #define IRQ_SEC_SGI_4 12 #define IRQ_SEC_SGI_5 13 #define IRQ_SEC_SGI_6 14 #define IRQ_SEC_SGI_7 15 #define IRQ_SEC_SGI_8 16 /******************************************************************************* * PL011 related constants ******************************************************************************/ /* FPGA UART0 */ #define PL011_UART0_BASE 0x1c090000 /* FPGA UART1 */ #define PL011_UART1_BASE 0x1c0a0000 /* SoC UART0 */ #define PL011_UART2_BASE 0x7ff80000 /* SoC UART1 */ #define PL011_UART3_BASE 0x7ff70000 #define PL011_BAUDRATE 115200 #define PL011_UART0_CLK_IN_HZ 24000000 #define PL011_UART1_CLK_IN_HZ 24000000 #define PL011_UART2_CLK_IN_HZ 7273800 #define PL011_UART3_CLK_IN_HZ 7273800 /******************************************************************************* * NIC-400 related constants ******************************************************************************/ /* CSS NIC-400 Global Programmers View (GPV) */ #define CSS_NIC400_BASE 0x2a000000 /* The slave_bootsecure controls access to GPU, DMC and CS. */ #define CSS_NIC400_SLAVE_BOOTSECURE 8 /* SoC NIC-400 Global Programmers View (GPV) */ #define SOC_NIC400_BASE 0x7fd00000 #define SOC_NIC400_USB_EHCI 0 #define SOC_NIC400_TLX_MASTER 1 #define SOC_NIC400_USB_OHCI 2 #define SOC_NIC400_PL354_SMC 3 /* * The apb4_bridge controls access to: * - the PCIe configuration registers * - the MMU units for USB, HDLCD and DMA */ #define SOC_NIC400_APB4_BRIDGE 4 /* * The bootsec_bridge controls access to a bunch of peripherals, e.g. the UARTs. */ #define SOC_NIC400_BOOTSEC_BRIDGE 5 #define SOC_NIC400_BOOTSEC_BRIDGE_UART1 (1 << 12) /******************************************************************************* * TZC-400 related constants ******************************************************************************/ #define TZC400_BASE 0x2a4a0000 #define TZC400_NSAID_CCI400 0 /* Note: Same as default NSAID!! */ #define TZC400_NSAID_PCIE 1 #define TZC400_NSAID_HDLCD0 2 #define TZC400_NSAID_HDLCD1 3 #define TZC400_NSAID_USB 4 #define TZC400_NSAID_DMA330 5 #define TZC400_NSAID_THINLINKS 6 #define TZC400_NSAID_AP 9 #define TZC400_NSAID_GPU 10 #define TZC400_NSAID_SCP 11 #define TZC400_NSAID_CORESIGHT 12 /******************************************************************************* * CCI-400 related constants ******************************************************************************/ #define CCI400_BASE 0x2c090000 #define CCI400_SL_IFACE3_CLUSTER_IX 1 #define CCI400_SL_IFACE4_CLUSTER_IX 0 /******************************************************************************* * SCP <=> AP boot configuration ******************************************************************************/ #define SCP_BOOT_CFG_ADDR 0x04000080 #define PRIMARY_CPU_SHIFT 8 #define PRIMARY_CPU_MASK 0xf #endif /* __JUNO_DEF_H__ */ arm-trusted-firmware-1.0-aw-6/plat/juno/juno_private.h000066400000000000000000000143061322600646200230010ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __JUNO_PRIVATE_H__ #define __JUNO_PRIVATE_H__ #include #include #include /******************************************************************************* * Forward declarations ******************************************************************************/ struct plat_pm_ops; struct meminfo; struct bl31_params; struct image_info; struct entry_point_info; /******************************************************************************* * This structure represents the superset of information that is passed to * BL3-1 e.g. while passing control to it from BL2 which is bl31_params * and other platform specific params ******************************************************************************/ typedef struct bl2_to_bl31_params_mem { struct bl31_params bl31_params; struct image_info bl31_image_info; struct image_info bl32_image_info; struct image_info bl33_image_info; struct entry_point_info bl33_ep_info; struct entry_point_info bl32_ep_info; struct entry_point_info bl31_ep_info; } bl2_to_bl31_params_mem_t; /******************************************************************************* * Function and variable prototypes ******************************************************************************/ void bl1_plat_arch_setup(void); void bl2_plat_arch_setup(void); void bl31_plat_arch_setup(void); int platform_setup_pm(const struct plat_pm_ops **plat_ops); unsigned int platform_get_core_pos(unsigned long mpidr); void configure_mmu_el1(unsigned long total_base, unsigned long total_size, unsigned long ro_start, unsigned long ro_limit, unsigned long coh_start, unsigned long coh_limit); void configure_mmu_el3(unsigned long total_base, unsigned long total_size, unsigned long ro_start, unsigned long ro_limit, unsigned long coh_start, unsigned long coh_limit); void plat_report_exception(unsigned long type); unsigned long plat_get_ns_image_entrypoint(void); unsigned long platform_get_stack(unsigned long mpidr); uint64_t plat_get_syscnt_freq(void); /* Declarations for plat_gic.c */ uint32_t ic_get_pending_interrupt_id(void); uint32_t ic_get_pending_interrupt_type(void); uint32_t ic_acknowledge_interrupt(void); uint32_t ic_get_interrupt_type(uint32_t id); void ic_end_of_interrupt(uint32_t id); void gic_cpuif_deactivate(unsigned int gicc_base); void gic_cpuif_setup(unsigned int gicc_base); void gic_pcpu_distif_setup(unsigned int gicd_base); void gic_setup(void); uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state); /* Declarations for plat_topology.c */ int plat_setup_topology(void); int plat_get_max_afflvl(void); unsigned int plat_get_aff_count(unsigned int aff_lvl, unsigned long mpidr); unsigned int plat_get_aff_state(unsigned int aff_lvl, unsigned long mpidr); /* Declarations for plat_io_storage.c */ void io_setup(void); int plat_get_image_source(const char *image_name, uintptr_t *dev_handle, uintptr_t *image_spec); /* * Before calling this function BL2 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL2 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint */ void bl1_plat_set_bl2_ep_info(struct image_info *image, struct entry_point_info *ep); /* * Before calling this function BL3-1 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL3-1 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint */ void bl2_plat_set_bl31_ep_info(struct image_info *image, struct entry_point_info *ep); /* * Before calling this function BL3-2 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL3-2 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint */ void bl2_plat_set_bl32_ep_info(struct image_info *image, struct entry_point_info *ep); /* * Before calling this function BL3-3 is loaded in memory and its entrypoint * is set by load_image. This is a placeholder for the platform to change * the entrypoint of BL3-3 and set SPSR and security state. * On Juno we are only setting the security state, entrypoint */ void bl2_plat_set_bl33_ep_info(struct image_info *image, struct entry_point_info *ep); /* Gets the memory layout for BL3-2 */ void bl2_plat_get_bl32_meminfo(struct meminfo *mem_info); /* Gets the memory layout for BL3-3 */ void bl2_plat_get_bl33_meminfo(struct meminfo *mem_info); #endif /* __JUNO_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/plat/juno/mhu.c000066400000000000000000000060271322600646200210610ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "juno_def.h" #include "mhu.h" /* SCP MHU secure channel registers */ #define SCP_INTR_S_STAT 0x200 #define SCP_INTR_S_SET 0x208 #define SCP_INTR_S_CLEAR 0x210 /* CPU MHU secure channel registers */ #define CPU_INTR_S_STAT 0x300 #define CPU_INTR_S_SET 0x308 #define CPU_INTR_S_CLEAR 0x310 static bakery_lock_t mhu_secure_lock __attribute__ ((section("tzfw_coherent_mem"))); void mhu_secure_message_start(void) { bakery_lock_get(&mhu_secure_lock); /* Make sure any previous command has finished */ while (mmio_read_32(MHU_BASE + CPU_INTR_S_STAT) != 0) ; } void mhu_secure_message_send(uint32_t command) { /* Send command to SCP and wait for it to pick it up */ mmio_write_32(MHU_BASE + CPU_INTR_S_SET, command); while (mmio_read_32(MHU_BASE + CPU_INTR_S_STAT) != 0) ; } uint32_t mhu_secure_message_wait(void) { /* Wait for response from SCP */ uint32_t response; while (!(response = mmio_read_32(MHU_BASE + SCP_INTR_S_STAT))) ; return response; } void mhu_secure_message_end(void) { /* Clear any response we got by writing all ones to the CLEAR register */ mmio_write_32(MHU_BASE + SCP_INTR_S_CLEAR, 0xffffffffu); bakery_lock_release(&mhu_secure_lock); } void mhu_secure_init(void) { bakery_lock_init(&mhu_secure_lock); /* * Clear the CPU's INTR register to make sure we don't see a stale * or garbage value and think it's a message we've already sent. */ mmio_write_32(MHU_BASE + CPU_INTR_S_CLEAR, 0xffffffffu); } arm-trusted-firmware-1.0-aw-6/plat/juno/mhu.h000066400000000000000000000035101322600646200210600ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __MHU_H__ #define __MHU_H__ #include extern void mhu_secure_message_start(void); extern void mhu_secure_message_send(uint32_t command); extern uint32_t mhu_secure_message_wait(void); extern void mhu_secure_message_end(void); extern void mhu_secure_init(void); #endif /* __MHU_H__ */ arm-trusted-firmware-1.0-aw-6/plat/juno/plat-tsp.ld.S000066400000000000000000000031361322600646200224100ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ ASSERT(__BL32_END__ <= BL2_BASE, "BL3-2 image overlaps BL2 image.") arm-trusted-firmware-1.0-aw-6/plat/juno/plat_gic.c000066400000000000000000000237721322600646200220600ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "juno_def.h" #include "juno_private.h" /* Value used to initialise Non-Secure irq priorities four at a time */ #define DEFAULT_NS_PRIORITY_X4 \ (GIC_HIGHEST_NS_PRIORITY | \ (GIC_HIGHEST_NS_PRIORITY << 8) | \ (GIC_HIGHEST_NS_PRIORITY << 16) | \ (GIC_HIGHEST_NS_PRIORITY << 24)) /******************************************************************************* * Enable secure interrupts and use FIQs to route them. Disable legacy bypass * and set the priority mask register to allow all interrupts to trickle in. ******************************************************************************/ void gic_cpuif_setup(unsigned int gicc_base) { unsigned int val; gicc_write_pmr(gicc_base, GIC_PRI_MASK); val = ENABLE_GRP0 | FIQ_EN; val |= FIQ_BYP_DIS_GRP0 | IRQ_BYP_DIS_GRP0; val |= FIQ_BYP_DIS_GRP1 | IRQ_BYP_DIS_GRP1; gicc_write_ctlr(gicc_base, val); } /******************************************************************************* * Place the cpu interface in a state where it can never make a cpu exit wfi as * as result of an asserted interrupt. This is critical for powering down a cpu ******************************************************************************/ void gic_cpuif_deactivate(unsigned int gicc_base) { unsigned int val; /* Disable secure, non-secure interrupts and disable their bypass */ val = gicc_read_ctlr(gicc_base); val &= ~(ENABLE_GRP0 | ENABLE_GRP1); val |= FIQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP0; val |= IRQ_BYP_DIS_GRP0 | IRQ_BYP_DIS_GRP1; gicc_write_ctlr(gicc_base, val); } static void gic_set_secure(unsigned int gicd_base, unsigned id) { /* Set interrupt as Group 0 */ gicd_clr_igroupr(gicd_base, id); /* Set priority to max */ gicd_set_ipriorityr(gicd_base, id, GIC_HIGHEST_SEC_PRIORITY); } /******************************************************************************* * Per cpu gic distributor setup which will be done by all cpus after a cold * boot/hotplug. This marks out the secure interrupts & enables them. ******************************************************************************/ void gic_pcpu_distif_setup(unsigned int gicd_base) { unsigned i; /* Mark all 32 PPI interrupts as Group 1 (non-secure) */ mmio_write_32(gicd_base + GICD_IGROUPR, 0xffffffffu); /* Setup PPI priorities doing four at a time */ for (i = 0; i < 32; i += 4) mmio_write_32(gicd_base + GICD_IPRIORITYR + i, DEFAULT_NS_PRIORITY_X4); /* Configure those PPIs we want as secure, and enable them. */ static const char sec_irq[] = { IRQ_SEC_PHY_TIMER, IRQ_SEC_SGI_0, IRQ_SEC_SGI_1, IRQ_SEC_SGI_2, IRQ_SEC_SGI_3, IRQ_SEC_SGI_4, IRQ_SEC_SGI_5, IRQ_SEC_SGI_6, IRQ_SEC_SGI_7 }; for (i = 0; i < sizeof(sec_irq) / sizeof(sec_irq[0]); i++) { gic_set_secure(gicd_base, sec_irq[i]); gicd_set_isenabler(gicd_base, sec_irq[i]); } } /******************************************************************************* * Global gic distributor setup which will be done by the primary cpu after a * cold boot. It marks out the secure SPIs, PPIs & SGIs and enables them. It * then enables the secure GIC distributor interface. ******************************************************************************/ static void gic_distif_setup(unsigned int gicd_base) { unsigned int i, ctlr; const unsigned int ITLinesNumber = gicd_read_typer(gicd_base) & IT_LINES_NO_MASK; /* Disable the distributor before going further */ ctlr = gicd_read_ctlr(gicd_base); ctlr &= ~(ENABLE_GRP0 | ENABLE_GRP1); gicd_write_ctlr(gicd_base, ctlr); /* Mark all lines of SPIs as Group 1 (non-secure) */ for (i = 0; i < ITLinesNumber; i++) mmio_write_32(gicd_base + GICD_IGROUPR + 4 + i * 4, 0xffffffffu); /* Setup SPI priorities doing four at a time */ for (i = 0; i < ITLinesNumber * 32; i += 4) mmio_write_32(gicd_base + GICD_IPRIORITYR + 32 + i, DEFAULT_NS_PRIORITY_X4); /* Configure the SPIs we want as secure */ static const char sec_irq[] = { IRQ_MHU, IRQ_GPU_SMMU_0, IRQ_GPU_SMMU_1, IRQ_ETR_SMMU, IRQ_TZC400, IRQ_TZ_WDOG }; for (i = 0; i < sizeof(sec_irq) / sizeof(sec_irq[0]); i++) gic_set_secure(gicd_base, sec_irq[i]); /* Route watchdog interrupt to this CPU and enable it. */ gicd_set_itargetsr(gicd_base, IRQ_TZ_WDOG, platform_get_core_pos(read_mpidr())); gicd_set_isenabler(gicd_base, IRQ_TZ_WDOG); /* Now setup the PPIs */ gic_pcpu_distif_setup(gicd_base); /* Enable Group 0 (secure) interrupts */ gicd_write_ctlr(gicd_base, ctlr | ENABLE_GRP0); } void gic_setup(void) { gic_cpuif_setup(GICC_BASE); gic_distif_setup(GICD_BASE); } /******************************************************************************* * An ARM processor signals interrupt exceptions through the IRQ and FIQ pins. * The interrupt controller knows which pin/line it uses to signal a type of * interrupt. The platform knows which interrupt controller type is being used * in a particular security state e.g. with an ARM GIC, normal world could use * the GICv2 features while the secure world could use GICv3 features and vice * versa. * This function is exported by the platform to let the interrupt management * framework determine for a type of interrupt and security state, which line * should be used in the SCR_EL3 to control its routing to EL3. The interrupt * line is represented as the bit position of the IRQ or FIQ bit in the SCR_EL3. ******************************************************************************/ uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state) { assert(type == INTR_TYPE_S_EL1 || type == INTR_TYPE_EL3 || type == INTR_TYPE_NS); assert(sec_state_is_valid(security_state)); /* * We ignore the security state parameter because Juno is GICv2 only * so both normal and secure worlds are using ARM GICv2. */ return gicv2_interrupt_type_to_line(GICC_BASE, type); } /******************************************************************************* * This function returns the type of the highest priority pending interrupt at * the GIC cpu interface. INTR_TYPE_INVAL is returned when there is no * interrupt pending. ******************************************************************************/ uint32_t plat_ic_get_pending_interrupt_type(void) { uint32_t id; id = gicc_read_hppir(GICC_BASE); /* Assume that all secure interrupts are S-EL1 interrupts */ if (id < 1022) return INTR_TYPE_S_EL1; if (id == GIC_SPURIOUS_INTERRUPT) return INTR_TYPE_INVAL; return INTR_TYPE_NS; } /******************************************************************************* * This function returns the id of the highest priority pending interrupt at * the GIC cpu interface. INTR_ID_UNAVAILABLE is returned when there is no * interrupt pending. ******************************************************************************/ uint32_t plat_ic_get_pending_interrupt_id(void) { uint32_t id; id = gicc_read_hppir(GICC_BASE); if (id < 1022) return id; if (id == 1023) return INTR_ID_UNAVAILABLE; /* * Find out which non-secure interrupt it is under the assumption that * the GICC_CTLR.AckCtl bit is 0. */ return gicc_read_ahppir(GICC_BASE); } /******************************************************************************* * This functions reads the GIC cpu interface Interrupt Acknowledge register * to start handling the pending interrupt. It returns the contents of the IAR. ******************************************************************************/ uint32_t plat_ic_acknowledge_interrupt(void) { return gicc_read_IAR(GICC_BASE); } /******************************************************************************* * This functions writes the GIC cpu interface End Of Interrupt register with * the passed value to finish handling the active interrupt ******************************************************************************/ void plat_ic_end_of_interrupt(uint32_t id) { gicc_write_EOIR(GICC_BASE, id); } /******************************************************************************* * This function returns the type of the interrupt id depending upon the group * this interrupt has been configured under by the interrupt controller i.e. * group0 or group1. ******************************************************************************/ uint32_t plat_ic_get_interrupt_type(uint32_t id) { uint32_t group; group = gicd_get_igroupr(GICD_BASE, id); /* Assume that all secure interrupts are S-EL1 interrupts */ if (group == GRP0) return INTR_TYPE_S_EL1; else return INTR_TYPE_NS; } arm-trusted-firmware-1.0-aw-6/plat/juno/plat_io_storage.c000066400000000000000000000126521322600646200234440ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include /* For FOPEN_MODE_... */ #include /* IO devices */ static const io_dev_connector_t *fip_dev_con; static uintptr_t fip_dev_spec; static uintptr_t fip_dev_handle; static const io_dev_connector_t *memmap_dev_con; static uintptr_t memmap_dev_spec; static uintptr_t memmap_init_params; static uintptr_t memmap_dev_handle; static const io_block_spec_t fip_block_spec = { .offset = FLASH_BASE, .length = FLASH_SIZE }; static const io_file_spec_t bl2_file_spec = { .path = BL2_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl30_file_spec = { .path = BL30_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl31_file_spec = { .path = BL31_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl32_file_spec = { .path = BL32_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static const io_file_spec_t bl33_file_spec = { .path = BL33_IMAGE_NAME, .mode = FOPEN_MODE_RB }; static int open_fip(const uintptr_t spec); static int open_memmap(const uintptr_t spec); struct plat_io_policy { const char *image_name; uintptr_t *dev_handle; uintptr_t image_spec; int (*check)(const uintptr_t spec); }; static const struct plat_io_policy policies[] = { { FIP_IMAGE_NAME, &memmap_dev_handle, (uintptr_t)&fip_block_spec, open_memmap }, { BL2_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl2_file_spec, open_fip }, { BL30_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl30_file_spec, open_fip }, { BL31_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl31_file_spec, open_fip }, { BL32_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl32_file_spec, open_fip }, { BL33_IMAGE_NAME, &fip_dev_handle, (uintptr_t)&bl33_file_spec, open_fip }, { 0, 0, 0 } }; static int open_fip(const uintptr_t spec) { int result = IO_FAIL; /* See if a Firmware Image Package is available */ result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_NAME); if (result == IO_SUCCESS) { INFO("Using FIP\n"); /*TODO: Check image defined in spec is present in FIP. */ } return result; } static int open_memmap(const uintptr_t spec) { int result = IO_FAIL; uintptr_t local_image_handle; result = io_dev_init(memmap_dev_handle, memmap_init_params); if (result == IO_SUCCESS) { result = io_open(memmap_dev_handle, spec, &local_image_handle); if (result == IO_SUCCESS) { /* INFO("Using Memmap IO\n"); */ io_close(local_image_handle); } } return result; } void io_setup(void) { int io_result = IO_FAIL; /* Register the IO devices on this platform */ io_result = register_io_dev_fip(&fip_dev_con); assert(io_result == IO_SUCCESS); io_result = register_io_dev_memmap(&memmap_dev_con); assert(io_result == IO_SUCCESS); /* Open connections to devices and cache the handles */ io_result = io_dev_open(fip_dev_con, fip_dev_spec, &fip_dev_handle); assert(io_result == IO_SUCCESS); io_result = io_dev_open(memmap_dev_con, memmap_dev_spec, &memmap_dev_handle); assert(io_result == IO_SUCCESS); /* Ignore improbable errors in release builds */ (void)io_result; } /* Return an IO device handle and specification which can be used to access * an image. Use this to enforce platform load policy */ int plat_get_image_source(const char *image_name, uintptr_t *dev_handle, uintptr_t *image_spec) { int result = IO_FAIL; const struct plat_io_policy *policy; if ((image_name != NULL) && (dev_handle != NULL) && (image_spec != NULL)) { policy = policies; while (policy->image_name != NULL) { if (strcmp(policy->image_name, image_name) == 0) { result = policy->check(policy->image_spec); if (result == IO_SUCCESS) { *image_spec = policy->image_spec; *dev_handle = *(policy->dev_handle); break; } } policy++; } } else { result = IO_FAIL; } return result; } arm-trusted-firmware-1.0-aw-6/plat/juno/plat_pm.c000066400000000000000000000253661322600646200217330ustar00rootroot00000000000000/* * Copyright (c) 2013, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "juno_def.h" #include "juno_private.h" #include "scpi.h" /******************************************************************************* * Private Juno function to program the mailbox for a cpu before it is released * from reset. ******************************************************************************/ static void juno_program_mailbox(uint64_t mpidr, uint64_t address) { uint64_t linear_id; uint64_t mbox; linear_id = platform_get_core_pos(mpidr); mbox = TRUSTED_MAILBOXES_BASE + (linear_id << TRUSTED_MAILBOX_SHIFT); *((uint64_t *) mbox) = address; flush_dcache_range(mbox, sizeof(mbox)); } /******************************************************************************* * Private Juno function which is used to determine if any platform actions * should be performed for the specified affinity instance given its * state. Nothing needs to be done if the 'state' is not off or if this is not * the highest affinity level which will enter the 'state'. ******************************************************************************/ static int32_t juno_do_plat_actions(uint32_t afflvl, uint32_t state) { uint32_t max_phys_off_afflvl; assert(afflvl <= MPIDR_AFFLVL1); if (state != PSCI_STATE_OFF) return -EAGAIN; /* * Find the highest affinity level which will be suspended and postpone * all the platform specific actions until that level is hit. */ max_phys_off_afflvl = psci_get_max_phys_off_afflvl(); assert(max_phys_off_afflvl != PSCI_INVALID_DATA); assert(psci_get_suspend_afflvl() >= max_phys_off_afflvl); if (afflvl != max_phys_off_afflvl) return -EAGAIN; return 0; } /******************************************************************************* * Juno handler called when an affinity instance is about to be turned on. The * level and mpidr determine the affinity instance. ******************************************************************************/ int32_t juno_affinst_on(uint64_t mpidr, uint64_t sec_entrypoint, uint64_t ns_entrypoint, uint32_t afflvl, uint32_t state) { /* * SCP takes care of powering up higher affinity levels so we * only need to care about level 0 */ if (afflvl != MPIDR_AFFLVL0) return PSCI_E_SUCCESS; /* * Setup mailbox with address for CPU entrypoint when it next powers up */ juno_program_mailbox(mpidr, sec_entrypoint); scpi_set_css_power_state(mpidr, scpi_power_on, scpi_power_on, scpi_power_on); return PSCI_E_SUCCESS; } /******************************************************************************* * Juno handler called when an affinity instance has just been powered on after * being turned off earlier. The level and mpidr determine the affinity * instance. The 'state' arg. allows the platform to decide whether the cluster * was turned off prior to wakeup and do what's necessary to setup it up * correctly. ******************************************************************************/ int32_t juno_affinst_on_finish(uint64_t mpidr, uint32_t afflvl, uint32_t state) { /* Determine if any platform actions need to be executed. */ if (juno_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; /* * Perform the common cluster specific operations i.e enable coherency * if this cluster was off. */ if (afflvl != MPIDR_AFFLVL0) cci_enable_cluster_coherency(mpidr); /* Enable the gic cpu interface */ gic_cpuif_setup(GICC_BASE); /* Juno todo: Is this setup only needed after a cold boot? */ gic_pcpu_distif_setup(GICD_BASE); /* Clear the mailbox for this cpu. */ juno_program_mailbox(mpidr, 0); return PSCI_E_SUCCESS; } /******************************************************************************* * Common function called while turning a cpu off or suspending it. It is called * from juno_off() or juno_suspend() when these functions in turn are called for * the highest affinity level which will be powered down. It performs the * actions common to the OFF and SUSPEND calls. ******************************************************************************/ static int32_t juno_power_down_common(uint32_t afflvl) { uint32_t cluster_state = scpi_power_on; /* Prevent interrupts from spuriously waking up this cpu */ gic_cpuif_deactivate(GICC_BASE); /* Cluster is to be turned off, so disable coherency */ if (afflvl > MPIDR_AFFLVL0) { cci_disable_cluster_coherency(read_mpidr_el1()); cluster_state = scpi_power_off; } /* * Ask the SCP to power down the appropriate components depending upon * their state. */ scpi_set_css_power_state(read_mpidr_el1(), scpi_power_off, cluster_state, scpi_power_on); return PSCI_E_SUCCESS; } /******************************************************************************* * Handler called when an affinity instance is about to be turned off. The * level and mpidr determine the affinity instance. The 'state' arg. allows the * platform to decide whether the cluster is being turned off and take * appropriate actions. * * CAUTION: There is no guarantee that caches will remain turned on across calls * to this function as each affinity level is dealt with. So do not write & read * global variables across calls. It will be wise to do flush a write to the * global to prevent unpredictable results. ******************************************************************************/ static int32_t juno_affinst_off(uint64_t mpidr, uint32_t afflvl, uint32_t state) { /* Determine if any platform actions need to be executed */ if (juno_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; return juno_power_down_common(afflvl); } /******************************************************************************* * Handler called when an affinity instance is about to be suspended. The * level and mpidr determine the affinity instance. The 'state' arg. allows the * platform to decide whether the cluster is being turned off and take apt * actions. The 'sec_entrypoint' determines the address in BL3-1 from where * execution should resume. * * CAUTION: There is no guarantee that caches will remain turned on across calls * to this function as each affinity level is dealt with. So do not write & read * global variables across calls. It will be wise to do flush a write to the * global to prevent unpredictable results. ******************************************************************************/ static int32_t juno_affinst_suspend(uint64_t mpidr, uint64_t sec_entrypoint, uint64_t ns_entrypoint, uint32_t afflvl, uint32_t state) { /* Determine if any platform actions need to be executed */ if (juno_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; /* * Setup mailbox with address for CPU entrypoint when it next powers up. */ juno_program_mailbox(mpidr, sec_entrypoint); return juno_power_down_common(afflvl); } /******************************************************************************* * Juno handler called when an affinity instance has just been powered on after * having been suspended earlier. The level and mpidr determine the affinity * instance. * TODO: At the moment we reuse the on finisher and reinitialize the secure * context. Need to implement a separate suspend finisher. ******************************************************************************/ static int32_t juno_affinst_suspend_finish(uint64_t mpidr, uint32_t afflvl, uint32_t state) { return juno_affinst_on_finish(mpidr, afflvl, state); } /******************************************************************************* * Juno handlers to shutdown/reboot the system ******************************************************************************/ static void __dead2 juno_system_off(void) { uint32_t response; /* Send the power down request to the SCP */ response = scpi_sys_power_state(scpi_system_shutdown); if (response != SCP_OK) { ERROR("Juno System Off: SCP error %u.\n", response); panic(); } wfi(); ERROR("Juno System Off: operation not handled.\n"); panic(); } static void __dead2 juno_system_reset(void) { uint32_t response; /* Send the system reset request to the SCP */ response = scpi_sys_power_state(scpi_system_reboot); if (response != SCP_OK) { ERROR("Juno System Reset: SCP error %u.\n", response); panic(); } wfi(); ERROR("Juno System Reset: operation not handled.\n"); panic(); } /******************************************************************************* * Export the platform handlers to enable psci to invoke them ******************************************************************************/ static const plat_pm_ops_t juno_ops = { .affinst_on = juno_affinst_on, .affinst_on_finish = juno_affinst_on_finish, .affinst_off = juno_affinst_off, .affinst_suspend = juno_affinst_suspend, .affinst_suspend_finish = juno_affinst_suspend_finish, .system_off = juno_system_off, .system_reset = juno_system_reset }; /******************************************************************************* * Export the platform specific power ops. ******************************************************************************/ int32_t platform_setup_pm(const plat_pm_ops_t **plat_ops) { *plat_ops = &juno_ops; return 0; } arm-trusted-firmware-1.0-aw-6/plat/juno/plat_topology.c000066400000000000000000000043031322600646200231570ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include unsigned int plat_get_aff_count(unsigned int aff_lvl, unsigned long mpidr) { /* Report 1 (absent) instance at levels higher that the cluster level */ if (aff_lvl > MPIDR_AFFLVL1) return 1; if (aff_lvl == MPIDR_AFFLVL1) return 2; /* We have two clusters */ return mpidr & 0x100 ? 4 : 2; /* 4 cpus in cluster 1, 2 in cluster 0 */ } unsigned int plat_get_aff_state(unsigned int aff_lvl, unsigned long mpidr) { return aff_lvl <= MPIDR_AFFLVL1 ? PSCI_AFF_PRESENT : PSCI_AFF_ABSENT; } int plat_get_max_afflvl() { return MPIDR_AFFLVL1; } int plat_setup_topology() { /* Juno todo: Make topology configurable via SCC */ return 0; } arm-trusted-firmware-1.0-aw-6/plat/juno/platform.mk000066400000000000000000000061161322600646200223000ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # PLAT_INCLUDES := -Iplat/juno/include/ PLAT_BL_COMMON_SOURCES := drivers/arm/pl011/pl011_console.S \ drivers/io/io_fip.c \ drivers/io/io_memmap.c \ drivers/io/io_storage.c \ lib/aarch64/xlat_tables.c \ plat/common/aarch64/plat_common.c \ plat/juno/plat_io_storage.c BL1_SOURCES += drivers/arm/cci400/cci400.c \ lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ plat/common/aarch64/platform_up_stack.S \ plat/juno/bl1_plat_setup.c \ plat/juno/aarch64/bl1_plat_helpers.S \ plat/juno/aarch64/plat_helpers.S \ plat/juno/aarch64/juno_common.c BL2_SOURCES += lib/locks/bakery/bakery_lock.c \ plat/common/aarch64/platform_up_stack.S \ plat/juno/bl2_plat_setup.c \ plat/juno/mhu.c \ plat/juno/aarch64/plat_helpers.S \ plat/juno/aarch64/juno_common.c \ plat/juno/scp_bootloader.c \ plat/juno/scpi.c BL31_SOURCES += drivers/arm/cci400/cci400.c \ drivers/arm/gic/gic_v2.c \ lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ plat/common/aarch64/platform_mp_stack.S \ plat/juno/bl31_plat_setup.c \ plat/juno/mhu.c \ plat/juno/aarch64/plat_helpers.S \ plat/juno/aarch64/juno_common.c \ plat/juno/plat_pm.c \ plat/juno/plat_topology.c \ plat/juno/plat_gic.c \ plat/juno/scpi.c ifneq (${RESET_TO_BL31},0) $(error "Using BL3-1 as the reset vector is not supported on Juno. \ Please set RESET_TO_BL31 to 0.") endif NEED_BL30 := yes # Enable workarounds for selected Cortex-A57 erratas. ERRATA_A57_806969 := 1 ERRATA_A57_813420 := 1 arm-trusted-firmware-1.0-aw-6/plat/juno/scp_bootloader.c000066400000000000000000000105651322600646200232710ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "juno_def.h" #include "mhu.h" #include "scp_bootloader.h" #include "scpi.h" /* Boot commands sent from AP -> SCP */ #define BOOT_CMD_START 0x01 #define BOOT_CMD_DATA 0x02 typedef struct { uint32_t image_size; } cmd_start_payload; typedef struct { uint32_t sequence_num; uint32_t offset; uint32_t size; } cmd_data_payload; #define BOOT_DATA_MAX_SIZE 0x1000 /* Boot commands sent from SCP -> AP */ #define BOOT_CMD_ACK 0x03 #define BOOT_CMD_NACK 0x04 typedef struct { uint32_t sequence_num; } cmd_ack_payload; /* * Unlike the runtime protocol, the boot protocol uses the same memory region * for both AP -> SCP and SCP -> AP transfers; define the address of this... */ static void * const cmd_payload = (void *)(MHU_SECURE_BASE + 0x0080); static void *scp_boot_message_start(void) { mhu_secure_message_start(); return cmd_payload; } static void scp_boot_message_send(unsigned command, size_t size) { /* Make sure payload can be seen by SCP */ if (MHU_PAYLOAD_CACHED) flush_dcache_range((unsigned long)cmd_payload, size); /* Send command to SCP */ mhu_secure_message_send(command | (size << 8)); } static uint32_t scp_boot_message_wait(size_t size) { uint32_t response = mhu_secure_message_wait(); /* Make sure we see the reply from the SCP and not any stale data */ if (MHU_PAYLOAD_CACHED) inv_dcache_range((unsigned long)cmd_payload, size); return response & 0xff; } static void scp_boot_message_end(void) { mhu_secure_message_end(); } static int transfer_block(uint32_t sequence_num, uint32_t offset, uint32_t size) { cmd_data_payload *cmd_data = scp_boot_message_start(); cmd_data->sequence_num = sequence_num; cmd_data->offset = offset; cmd_data->size = size; scp_boot_message_send(BOOT_CMD_DATA, sizeof(*cmd_data)); cmd_ack_payload *cmd_ack = cmd_payload; int ok = scp_boot_message_wait(sizeof(*cmd_ack)) == BOOT_CMD_ACK && cmd_ack->sequence_num == sequence_num; scp_boot_message_end(); return ok; } int scp_bootloader_transfer(void *image, unsigned int image_size) { uintptr_t offset = (uintptr_t)image - MHU_SECURE_BASE; uintptr_t end = offset + image_size; uint32_t response; mhu_secure_init(); /* Initiate communications with SCP */ do { cmd_start_payload *cmd_start = scp_boot_message_start(); cmd_start->image_size = image_size; scp_boot_message_send(BOOT_CMD_START, sizeof(*cmd_start)); response = scp_boot_message_wait(0); scp_boot_message_end(); } while (response != BOOT_CMD_ACK); /* Transfer image to SCP a block at a time */ uint32_t sequence_num = 1; size_t size; while ((size = end - offset) != 0) { if (size > BOOT_DATA_MAX_SIZE) size = BOOT_DATA_MAX_SIZE; while (!transfer_block(sequence_num, offset, size)) ; /* Retry forever */ offset += size; sequence_num++; } /* Wait for SCP to signal it's ready */ return scpi_wait_ready(); } arm-trusted-firmware-1.0-aw-6/plat/juno/scp_bootloader.h000066400000000000000000000032341322600646200232710ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SCP_BOOTLOADER_H__ #define __SCP_BOOTLOADER_H__ int scp_bootloader_transfer(void *image, unsigned int image_size); #endif arm-trusted-firmware-1.0-aw-6/plat/juno/scpi.c000066400000000000000000000105711322600646200212250ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "juno_def.h" #include "mhu.h" #include "scpi.h" #define MHU_SECURE_SCP_TO_AP_PAYLOAD (MHU_SECURE_BASE+0x0080) #define MHU_SECURE_AP_TO_SCP_PAYLOAD (MHU_SECURE_BASE+0x0280) #define SIZE_SHIFT 20 /* Bit position for size value in MHU header */ #define SIZE_MASK 0x1ff /* Mask to extract size value in MHU header*/ void *scpi_secure_message_start(void) { mhu_secure_message_start(); /* Return address of payload area. */ return (void *)MHU_SECURE_AP_TO_SCP_PAYLOAD; } void scpi_secure_message_send(unsigned command, size_t size) { /* Make sure payload can be seen by SCP */ if (MHU_PAYLOAD_CACHED) flush_dcache_range(MHU_SECURE_AP_TO_SCP_PAYLOAD, size); mhu_secure_message_send(command | (size << SIZE_SHIFT)); } unsigned scpi_secure_message_receive(void **message_out, size_t *size_out) { uint32_t response = mhu_secure_message_wait(); /* Get size of payload */ size_t size = (response >> SIZE_SHIFT) & SIZE_MASK; /* Clear size from response */ response &= ~(SIZE_MASK << SIZE_SHIFT); /* Make sure we don't read stale data */ if (MHU_PAYLOAD_CACHED) inv_dcache_range(MHU_SECURE_SCP_TO_AP_PAYLOAD, size); if (size_out) *size_out = size; if (message_out) *message_out = (void *)MHU_SECURE_SCP_TO_AP_PAYLOAD; return response; } void scpi_secure_message_end(void) { mhu_secure_message_end(); } static void scpi_secure_send32(unsigned command, uint32_t message) { *(__typeof__(message) *)scpi_secure_message_start() = message; scpi_secure_message_send(command, sizeof(message)); scpi_secure_message_end(); } int scpi_wait_ready(void) { /* Get a message from the SCP */ scpi_secure_message_start(); size_t size; unsigned command = scpi_secure_message_receive(NULL, &size); scpi_secure_message_end(); /* We are expecting 'SCP Ready', produce correct error if it's not */ scpi_status_t response = SCP_OK; if (command != SCPI_CMD_SCP_READY) response = SCP_E_SUPPORT; else if (size != 0) response = SCP_E_SIZE; /* Send our response back to SCP */ scpi_secure_send32(command, response); return response == SCP_OK ? 0 : -1; } void scpi_set_css_power_state(unsigned mpidr, scpi_power_state_t cpu_state, scpi_power_state_t cluster_state, scpi_power_state_t css_state) { uint32_t state = mpidr & 0x0f; /* CPU ID */ state |= (mpidr & 0xf00) >> 4; /* Cluster ID */ state |= cpu_state << 8; state |= cluster_state << 12; state |= css_state << 16; scpi_secure_send32(SCPI_CMD_SET_CSS_POWER_STATE, state); } uint32_t scpi_sys_power_state(scpi_system_state_t system_state) { uint32_t *response; size_t size; uint8_t state = system_state & 0xff; /* Send the command */ *(__typeof__(state) *)scpi_secure_message_start() = state; scpi_secure_message_send(SCPI_CMD_SYS_POWER_STATE, sizeof(state)); scpi_secure_message_receive((void *)&response, &size); scpi_secure_message_end(); return *response; } arm-trusted-firmware-1.0-aw-6/plat/juno/scpi.h000066400000000000000000000057251322600646200212370ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SCPI_H__ #define __SCPI_H__ #include #include extern void *scpi_secure_message_start(void); extern void scpi_secure_message_send(unsigned command, size_t size); extern unsigned scpi_secure_message_receive(void **message_out, size_t *size_out); extern void scpi_secure_message_end(void); enum { SCP_OK = 0, /* Success */ SCP_E_PARAM, /* Invalid parameter(s) */ SCP_E_ALIGN, /* Invalid alignment */ SCP_E_SIZE, /* Invalid size */ SCP_E_HANDLER, /* Invalid handler or callback */ SCP_E_ACCESS, /* Invalid access or permission denied */ SCP_E_RANGE, /* Value out of range */ SCP_E_TIMEOUT, /* Time out has ocurred */ SCP_E_NOMEM, /* Invalid memory area or pointer */ SCP_E_PWRSTATE, /* Invalid power state */ SCP_E_SUPPORT, /* Feature not supported or disabled */ }; typedef uint32_t scpi_status_t; typedef enum { SCPI_CMD_SCP_READY = 0x01, SCPI_CMD_SET_CSS_POWER_STATE = 0x04, SCPI_CMD_SYS_POWER_STATE = 0x08 } scpi_command_t; typedef enum { scpi_power_on = 0, scpi_power_retention = 1, scpi_power_off = 3, } scpi_power_state_t; typedef enum { scpi_system_shutdown = 0, scpi_system_reboot = 1, scpi_system_reset = 2 } scpi_system_state_t; extern int scpi_wait_ready(void); extern void scpi_set_css_power_state(unsigned mpidr, scpi_power_state_t cpu_state, scpi_power_state_t cluster_state, scpi_power_state_t css_state); uint32_t scpi_sys_power_state(scpi_system_state_t system_state); #endif /* __SCPI_H__ */ arm-trusted-firmware-1.0-aw-6/plat/juno/tsp/000077500000000000000000000000001322600646200207255ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/juno/tsp/tsp-juno.mk000066400000000000000000000034151322600646200230400ustar00rootroot00000000000000# # Copyright (c) 2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # TSP source files specific to Juno platform BL32_SOURCES += drivers/arm/gic/gic_v2.c \ plat/common/aarch64/platform_mp_stack.S \ plat/juno/aarch64/juno_common.c \ plat/juno/aarch64/plat_helpers.S \ plat/juno/tsp/tsp_plat_setup.c \ plat/juno/plat_gic.c arm-trusted-firmware-1.0-aw-6/plat/juno/tsp/tsp_plat_setup.c000066400000000000000000000100461322600646200241400ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "../juno_def.h" #include "../juno_private.h" /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL32_RO_BASE (unsigned long)(&__RO_START__) #define BL32_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to * page-aligned addresses. */ #define BL32_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL32_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) /******************************************************************************* * Initialize the UART ******************************************************************************/ void tsp_early_platform_setup(void) { /* * Initialize a different console than already in use to display * messages from TSP */ console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE); } /******************************************************************************* * Perform platform specific setup placeholder ******************************************************************************/ void tsp_platform_setup(void) { } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this only intializes the MMU ******************************************************************************/ void tsp_plat_arch_setup(void) { configure_mmu_el1(BL32_RO_BASE, BL32_COHERENT_RAM_LIMIT - BL32_RO_BASE, BL32_RO_BASE, BL32_RO_LIMIT, BL32_COHERENT_RAM_BASE, BL32_COHERENT_RAM_LIMIT); } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/000077500000000000000000000000001322600646200210005ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/aarch64/000077500000000000000000000000001322600646200222305ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/aarch64/plat_helpers.S000066400000000000000000000055131322600646200250420ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include "../sunxi_def.h" .globl plat_crash_console_init .globl plat_crash_console_putc .globl platform_mem_init .globl platform_smp_init /* ----------------------------------------------------- * void platform_mem_init(void); * * We don't need to carry out any memory initialization. * ----------------------------------------------------- */ func platform_mem_init ret func platform_smp_init mrs x0, ACTLR_EL3 orr x0, x0, #(1 << 1) // Set CPUECTLR_EL1 access control bit msr ACTLR_EL3, x0 mrs x0, ACTLR_EL2 orr x0, x0, #(1 << 1) // Set CPUECTLR_EL1 access control bit msr ACTLR_EL2, x0 mrs x0, S3_1_c15_c2_1 // Read CPUECTLR_EL1 orr x0, x0, #(1 << 6) // Set the SMPEN bit msr S3_1_c15_c2_1, x0 // Write CPUECTLR_EL1 mov x0, #0x0 msr cntvoff_el2, x0 ret #define UART_TX 0 /* Out: Transmit buffer */ #define UART_LSR 5 /* In: Line Status Register */ #define UART_LSR_TEMT_BIT 6 /* Transmitter empty */ /* Use UART0 both for the normal console and for the crash console as well. */ plat_crash_console_putc: func console_core_putc ldr x1, =SUNXI_UART0_BASE 1: ldr w2, [x1, #(UART_LSR * 4)] tbz w2, #UART_LSR_TEMT_BIT, 1b str w0, [x1, #0] ret /* nothing to do here, just return 1 to indicate success */ func plat_crash_console_init mov w0, #1 ret arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/aarch64/sunxi_common.c000066400000000000000000000132211322600646200251110ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "../sunxi_def.h" #include "../sunxi_private.h" /******************************************************************************* * plat_config holds the characteristics of the differences between the three * FVP platforms (Base, A53_A57 & Foundation). It will be populated during cold * boot at each boot stage by the primary before enabling the MMU (to allow cci * configuration) & used thereafter. Each BL will have its own copy to allow * independent operation. ******************************************************************************/ plat_config_t plat_config; /* * Table of regions to map using the MMU. * This doesn't include TZRAM as the 'mem_layout' argument passed to * configure_mmu_elx() will give the available subset of that, */ const mmap_region_t sunxi_mmap[] = { // SRAM regions { 0x0010000, 0x0010000, 0x0030000, MT_DEVICE | MT_RW | MT_NS }, // MMI/O region used by peripherals from 0x100.0000 to 0x200.0000 { 0x1000000, 0x1000000, 0x1000000, MT_DEVICE | MT_RW | MT_SECURE }, //2G { DRAM1_BASE, DRAM1_BASE, SUNXI_MAX_DRAM_SIZE, MT_MEMORY | MT_RW | MT_NS}, {0} }; void sunxi_configure_mmu_el3(unsigned long total_base, unsigned long total_size, unsigned long ro_start, unsigned long ro_limit, unsigned long coh_start, unsigned long coh_limit) { mmap_add_region(total_base, total_base, total_size, MT_MEMORY | MT_RW | MT_SECURE); mmap_add_region(ro_start, ro_start, ro_limit - ro_start, MT_MEMORY | MT_RO | MT_SECURE); mmap_add_region(coh_start, coh_start, coh_limit - coh_start, MT_DEVICE | MT_RW | MT_SECURE); mmap_add(sunxi_mmap); init_xlat_tables(); enable_mmu_el3(0); } unsigned long plat_get_ns_image_entrypoint(void) { return NS_IMAGE_OFFSET; } uint64_t plat_get_syscnt_freq(void) { return 24 * 1000 * 1000; } static unsigned int get_highest_el(int aarch) { unsigned int el_status; /* Figure out whether we have the HYP/EL2 mode implemented */ if (aarch == 32) { el_status = (read_id_pfr1_el1() >> ID_PFR1_VIRTEXT_SHIFT); el_status &= ID_PFR1_VIRTEXT_MASK; return el_status ? MODE32_hyp : MODE32_svc; } else if (aarch == 64) { el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; el_status &= ID_AA64PFR0_ELX_MASK; return el_status ? MODE_EL2 : MODE_EL1; } else { return -1; } } /******************************************************************************* * Gets SPSR for BL33 entry ******************************************************************************/ uint32_t sunxi_get_spsr_for_bl33_entry(int aarch) { unsigned int mode; uint32_t spsr; mode = get_highest_el(aarch); switch (aarch) { case 32: spsr = SPSR_MODE32(mode, SPSR_T_ARM, SPSR_E_LITTLE, DISABLE_ALL_EXCEPTIONS); break; case 64: default: spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); break; } return spsr; } #define SRAM_VER_REG 0x01c00024 uint16_t sunxi_get_socid(void) { uint32_t reg; reg = mmio_read_32(SRAM_VER_REG); mmio_write_32(SRAM_VER_REG, reg | (1 << 15)); reg = mmio_read_32(SRAM_VER_REG); mmio_write_32(0x01c00024, reg & ~(1 << 15)); return reg >> 16; } struct spl_boot_file_head { uint32_t jump_instruction; uint32_t magic[2]; uint32_t check_sum; uint32_t length; uint8_t spl_signature[4]; uint32_t fel_script_address; uint32_t fel_uEnv_length; uint32_t offset_dt_name; uint32_t reserved1; uint32_t boot_media; uint32_t string_pool[13]; }; #define MAGIC_eGON 0x4e4f4765 /* "eGON" */ #define MAGIC_BT0 0x3054422e /* ".BT0" */ #define MAGIC_FEL 0x4c45462e /* ".FEL" */ const char *get_dt_name(void) { const struct spl_boot_file_head *spl_head = (void *)0x10000; if (spl_head->magic[0] != MAGIC_eGON) return NULL; if (spl_head->magic[1] != MAGIC_BT0 && spl_head->magic[1] != MAGIC_FEL) return NULL; /* We need at least U-Boot SPL version 2 for the DT name feature. */ if (spl_head->spl_signature[3] < 2) return NULL; return (const char *)spl_head + spl_head->offset_dt_name; } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/bl31_sunxi_setup.c000066400000000000000000000226721322600646200243640ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "sunxi_def.h" #include "sunxi_private.h" #include /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout * of trusted SRAM ******************************************************************************/ extern unsigned long __RO_START__; extern unsigned long __RO_END__; extern unsigned long __COHERENT_RAM_START__; extern unsigned long __COHERENT_RAM_END__; /* * The next 2 constants identify the extents of the code & RO data region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __RO_START__ and __RO_END__ linker symbols refer to page-aligned addresses. */ #define BL31_RO_BASE (unsigned long)(&__RO_START__) #define BL31_RO_LIMIT (unsigned long)(&__RO_END__) /* * The next 2 constants identify the extents of the coherent memory region. * These addresses are used by the MMU setup code and therefore they must be * page-aligned. It is the responsibility of the linker script to ensure that * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols * refer to page-aligned addresses. */ #define BL31_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) #define BL31_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) #if 0 #if RESET_TO_BL31 static entry_point_info_t bl33_image_ep_info; #else /******************************************************************************* * Reference to structure which holds the arguments that have been passed to * BL31 from BL2. ******************************************************************************/ static bl31_params_t *bl2_to_bl31_params; #endif #else static entry_point_info_t bl33_image_ep_info; #endif /******************************************************************************* * Return a pointer to the 'entry_point_info' structure of the next image for the * security state specified. BL33 corresponds to the non-secure image type * while BL32 corresponds to the secure image type. A NULL pointer is returned * if the image does not exist. ******************************************************************************/ entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) { //#if RESET_TO_BL31 #if 1 assert(sec_state_is_valid(type)); assert(type == NON_SECURE); return &bl33_image_ep_info; #else entry_point_info_t *next_image_info; assert(sec_state_is_valid(type)); next_image_info = (type == NON_SECURE) ? bl2_to_bl31_params->bl33_ep_info : bl2_to_bl31_params->bl32_ep_info; /* None of the images on this platform can have 0x0 as the entrypoint */ if (next_image_info->pc) return next_image_info; else return NULL; #endif } static unsigned long get_pc(void) { unsigned long pc; __asm__ volatile ("adr %0, .\n" : "=r" (pc)); return pc; } /******************************************************************************* * Perform any BL31 specific platform actions. Here is an opportunity to copy * parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they * are lost (potentially). This needs to be done before the MMU is initialized * so that the memory layout can be used while creating page tables. On the FVP * we know that BL2 has populated the parameters in secure DRAM. So we just use * the reference passed in 'from_bl2' instead of copying. The 'data' parameter * is not used since all the information is contained in 'from_bl2'. Also, BL2 * has flushed this information to memory, so we are guaranteed to pick up good * data ******************************************************************************/ void bl31_early_platform_setup(bl31_params_t *from_bl2, void *plat_params_from_bl2) { unsigned long load_addr; const char *mem_name = "unknown memory region"; const char *soc_name = "unknown SoC"; uint16_t soc_id; /* Initialize the console to provide early debug support */ console_init(SUNXI_UART0_BASE, UART0_CLK_IN_HZ, UART0_BAUDRATE); load_addr = get_pc() & ~0xfff; if (load_addr >= 0x44000 && load_addr < 0x54000) { mem_name = "SRAM A2"; } else if (load_addr >= 0x10000 && load_addr < 0x18000) { mem_name = "SRAM A1"; } else if (load_addr >= 0x18000 && load_addr < 0x40000) { mem_name = "SRAM C"; } else if (load_addr >= 0x40000000) mem_name = "DRAM"; soc_id = sunxi_get_socid(); switch (soc_id) { case 0x1689: soc_name = "A64/H64"; break; case 0x1718: soc_name = "H5"; break; } NOTICE("BL3-1: Running on %s (%x) in %s (@0x%lx)\n", soc_name, soc_id, mem_name, load_addr); #if 0 #if RESET_TO_BL31 /* There are no parameters from BL2 if BL31 is a reset vector */ assert(from_bl2 == NULL); assert(plat_params_from_bl2 == NULL); /* * Do initial security configuration to allow DRAM/device access. On * Base FVP only DRAM security is programmable (via TrustZone), but * other platforms might have more programmable security devices * present. */ sunxi_security_setup(); SET_PARAM_HEAD(&bl33_image_ep_info, PARAM_EP, VERSION_1, 0); /* * Tell BL31 where the non-trusted software image * is located and the entry state information */ bl33_image_ep_info.pc = plat_get_ns_image_entrypoint(); bl33_image_ep_info.spsr = sunxi_get_spsr_for_bl33_entry(64); SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); #else /* Check params passed from BL2 should not be NULL, * We are not checking plat_params_from_bl2 as NULL as we are not * using it on FVP */ assert(from_bl2 != NULL); assert(from_bl2->h.type == PARAM_BL31); assert(from_bl2->h.version >= VERSION_1); sunxi_security_setup(); bl2_to_bl31_params = from_bl2; assert(((unsigned long)plat_params_from_bl2) == SUNXI_BL31_PLAT_PARAM_VAL); #endif #endif /* * Do initial security configuration to allow DRAM/device access. On * Base FVP only DRAM security is programmable (via TrustZone), but * other platforms might have more programmable security devices * present. */ sunxi_security_setup(); /* * Tell BL31 where the non-trusted software image * is located and the entry state information */ bl33_image_ep_info.pc = plat_get_ns_image_entrypoint(); bl33_image_ep_info.spsr = sunxi_get_spsr_for_bl33_entry(64); SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); } /******************************************************************************* * Initialize the gic, configure the CLCD and zero out variables needed by the * secondaries to boot up correctly. ******************************************************************************/ void bl31_platform_setup(void) { uint16_t socid; const char *dt_name; /* Initialize the gic cpu and distributor interfaces */ arm_gic_init(GICC_BASE, GICD_BASE, 0, NULL, 0); arm_gic_setup(); socid = sunxi_get_socid(); dt_name = get_dt_name(); if (dt_name) NOTICE("DT: %s\n", dt_name); else NOTICE("No DT name found, skipping board specific setup.\n"); /* Detect if this SoC is a multi-cluster one. */ plat_setup_topology(); switch (socid) { case 0x1689: sunxi_pmic_setup(dt_name); break; case 0x1718: break; } sunxi_setup_clocks(socid, dt_name); NOTICE("SCPI: dummy stub handler, implementation level: 000000\n"); } /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only intializes the mmu in a quick and dirty way. ******************************************************************************/ void bl31_plat_arch_setup(void) { //set smp bit before cache enable platform_smp_init(); sunxi_configure_mmu_el3(BL31_RO_BASE, (BL31_COHERENT_RAM_LIMIT - BL31_RO_BASE), BL31_RO_BASE, BL31_RO_LIMIT, BL31_COHERENT_RAM_BASE, BL31_COHERENT_RAM_LIMIT); } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/drivers/000077500000000000000000000000001322600646200224565ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/drivers/uart/000077500000000000000000000000001322600646200234315ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/drivers/uart/uart.c000066400000000000000000000075261322600646200245620ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #if DEBUG uintptr_t serial_ctrl_base; int uart_locked = 1; void sunxi_serial_init(int uart_port) { uint32_t reg; uint32_t uart_clk; /* assert the UART port's reset line */ reg = mmio_read_32(CCMU_BUS_SOFT_RST_REG4); reg &= ~(1 << (CCM_UART_PORT_OFFSET + uart_port)); mmio_write_32(CCMU_BUS_SOFT_RST_REG4, reg); /* release the clock gate */ reg = mmio_read_32(CCMU_BUS_CLK_GATING_REG3); reg |= (1 << (CCM_UART_PORT_OFFSET + uart_port)); mmio_write_32(CCMU_BUS_CLK_GATING_REG3, reg); /* de-assert the UART port's reset line */ reg = mmio_read_32(CCMU_BUS_SOFT_RST_REG4); reg |= (1 << (CCM_UART_PORT_OFFSET + uart_port)); mmio_write_32(CCMU_BUS_SOFT_RST_REG4, reg); /* The GPIO pins are already configured */ serial_ctrl_base = SUNXI_UART0_BASE + uart_port * CCM_UART_ADDR_OFFSET; mmio_write_32(serial_ctrl_base + DW_UART_MCR, 0x3); uart_clk = (24000000 + 8 * UART_BAUD) / (16 * UART_BAUD); mmio_write_32(serial_ctrl_base + DW_UART_LCR, mmio_read_32(serial_ctrl_base + DW_UART_LCR) | 0x80); mmio_write_32(serial_ctrl_base + DW_UART_DLH, uart_clk >> 8); mmio_write_32(serial_ctrl_base + DW_UART_DLL, uart_clk & 0xff); mmio_write_32(serial_ctrl_base + DW_UART_LCR, mmio_read_32(serial_ctrl_base + DW_UART_LCR) & ~0x80); mmio_write_32(serial_ctrl_base + DW_UART_LCR, (PARITY << 3) | (STOP << 2) | DLEN); mmio_write_32(serial_ctrl_base + DW_UART_FCR, 0x7); uart_locked = 0; return; } void sunxi_serial_exit(void) { uart_locked = 1; } void sunxi_serial_putc (char c) { if (uart_locked) return; while (!(mmio_read_32(serial_ctrl_base + DW_UART_LSR) & 0x40)) ; mmio_write_32(serial_ctrl_base + DW_UART_THR, c); } char sunxi_serial_getc (void) { if (uart_locked) return 0; while (!(mmio_read_32(serial_ctrl_base + DW_UART_LSR) & 0x01)) ; return mmio_read_32(serial_ctrl_base + DW_UART_RBR); } int sunxi_serial_tstc (void) { return mmio_read_32(serial_ctrl_base + DW_UART_LSR) & 0x01; } #endif /* DEBUG */ int console_init(unsigned long base_addr, unsigned int uart_clk, unsigned int baud_rate) { sunxi_serial_init(0); return 0; } int console_exit() { sunxi_serial_exit(); return 0; } int console_putc(int c) { sunxi_serial_putc(c); return 0; } int console_getc(void) { return sunxi_serial_getc(); } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/include/000077500000000000000000000000001322600646200224235ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/include/ccmu.h000066400000000000000000000100601322600646200235200ustar00rootroot00000000000000/* * (C) Copyright 2007-2015 * Allwinner Technology Co., Ltd. * Jerry Wang * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * SPDX-License-Identifier: GPL-2.0 */ #ifndef __CCMU_H #define __CCMU_H #include "../sunxi_def.h" /* pll list */ #define CCMU_PLL_CPUX_CTRL_REG (SUNXI_CCM_BASE + 0x00) #define CCMU_PLL_AUDIO_CTRL_REG (SUNXI_CCM_BASE + 0x08) #define CCMU_PLL_VIDEO0_CTRL_REG (SUNXI_CCM_BASE + 0x10) #define CCMU_PLL_VE_CTRL_REG (SUNXI_CCM_BASE + 0x18) #define CCMU_PLL_DDR0_CTRL_REG (SUNXI_CCM_BASE + 0x20) #define CCMU_PLL_PERIPH0_CTRL_REG (SUNXI_CCM_BASE + 0x28) #define CCMU_PLL_PERIPH1_CTRL_REG (SUNXI_CCM_BASE + 0x2C) #define CCMU_PLL_VIDEO1_CTRL_REG (SUNXI_CCM_BASE + 0x30) #define CCMU_PLL_GPU_CTRL_REG (SUNXI_CCM_BASE + 0x38) #define CCMU_PLL_MIPI_CTRL_REG (SUNXI_CCM_BASE + 0x40) #define CCMU_PLL_HSIC_CTRL_REG (SUNXI_CCM_BASE + 0x44) #define CCMU_PLL_DE_CTRL_REG (SUNXI_CCM_BASE + 0x48) #define CCMU_PLL_DDR1_CTRL_REG (SUNXI_CCM_BASE + 0x4C) #define PLL_ENABLE_BIT (1U << 31) #define PLL_STABLE_BIT (1U << 28) /* cfg list */ #define CCMU_CPUX_AXI_CFG_REG (SUNXI_CCM_BASE + 0x50) #define CPUX_SRCSEL_MASK (0x3 << 16) #define CPUX_SRCSEL_LOSC (0x0 << 16) #define CPUX_SRCSEL_OSC24M (0x1 << 16) #define CPUX_SRCSEL_PLLCPUX (0x2 << 16) #define AXI_CLKDIV_MASK (0x3 << 8) #define AXI_CLKDIV(n) ((n - 1) << 8) #define APB_CLKDIV_MASK (0x3 << 0) #define APB_CLKDIV(n) ((n - 1) << 0) #define CCMU_AHB1_APB1_CFG_REG (SUNXI_CCM_BASE + 0x54) #define CCMU_APB2_CFG_GREG (SUNXI_CCM_BASE + 0x58) #define CCMU_AHB2_CFG_GREG (SUNXI_CCM_BASE + 0x5C) /* gate list */ #define CCMU_BUS_CLK_GATING_REG0 (SUNXI_CCM_BASE + 0x60) #define CCMU_BUS_CLK_GATING_REG1 (SUNXI_CCM_BASE + 0x64) #define CCMU_BUS_CLK_GATING_REG2 (SUNXI_CCM_BASE + 0x68) #define CCMU_BUS_CLK_GATING_REG3 (SUNXI_CCM_BASE + 0x6C) #define CCMU_BUS_CLK_GATING_REG4 (SUNXI_CCM_BASE + 0x70) /* module list */ #define CCMU_NAND0_CLK_REG (SUNXI_CCM_BASE + 0x80) #define CCMU_SDMMC0_CLK_REG (SUNXI_CCM_BASE + 0x88) #define CCMU_SDMMC1_CLK_REG (SUNXI_CCM_BASE + 0x8C) #define CCMU_SDMMC2_CLK_REG (SUNXI_CCM_BASE + 0x90) #define CCMU_CE_CLK_REG (SUNXI_CCM_BASE + 0x9C) #define CCMU_USBPHY_CLK_REG (SUNXI_CCM_BASE + 0xCC) #define CCMU_DRAM_CLK_REG (SUNXI_CCM_BASE + 0xF4) #define CCMU_PLL_DDR_CFG_REG (SUNXI_CCM_BASE + 0xF8) #define CCMU_MBUS_RST_REG (SUNXI_CCM_BASE + 0xFC) #define CCMU_DRAM_CLK_GATING_REG (SUNXI_CCM_BASE + 0x100) #define CCMU_AVS_CLK_REG (SUNXI_CCM_BASE + 0x144) #define CCMU_MBUS_CLK_REG (SUNXI_CCM_BASE + 0x15C) /*gate rst list*/ #define CCMU_BUS_SOFT_RST_REG0 (SUNXI_CCM_BASE + 0x2C0) #define CCMU_BUS_SOFT_RST_REG1 (SUNXI_CCM_BASE + 0x2C4) #define CCMU_BUS_SOFT_RST_REG2 (SUNXI_CCM_BASE + 0x2C8) #define CCMU_BUS_SOFT_RST_REG3 (SUNXI_CCM_BASE + 0x2D0) #define CCMU_BUS_SOFT_RST_REG4 (SUNXI_CCM_BASE + 0x2D8) #define CCMU_PLL_LOCK_CTRL_REG (SUNXI_CCM_BASE + 0x320) #define LOCK_EN_PLL_CPUX (1U << 0) #endif arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/include/plat_macros.S000066400000000000000000000056361322600646200250650ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "../sunxi_def.h" .section .rodata.gic_reg_name, "aS" gic_regs: .asciz "gic_hppir", "gic_ahppir", "gic_ctlr", "" gicd_pend_reg: .asciz "gicd_ispendr regs (Offsets 0x200 - 0x278)\n Offset:\t\t\tvalue\n" newline: .asciz "\n" spacer: .asciz ":\t\t0x" /* --------------------------------------------- * The below macro prints out relevant GIC * registers whenever an unhandled exception is * taken in BL3-1. * Clobbers: x0 - x10, x16, sp * --------------------------------------------- */ .macro plat_print_gic_regs adr x0, plat_config ldr w16, [x0, #CONFIG_GICC_BASE_OFFSET] cbz x16, exit_print_gic_regs /* gic base address is now in x16 */ adr x6, gic_regs /* Load the gic reg list to x6 */ /* Load the gic regs to gp regs used by str_in_crash_buf_print */ ldr w8, [x16, #GICC_HPPIR] ldr w9, [x16, #GICC_AHPPIR] ldr w10, [x16, #GICC_CTLR] /* Store to the crash buf and print to console */ bl str_in_crash_buf_print /* Print the GICD_ISPENDR regs */ add x7, x16, #GICD_ISPENDR adr x4, gicd_pend_reg bl asm_print_str gicd_ispendr_loop: sub x4, x7, x16 cmp x4, #0x280 b.eq exit_print_gic_regs bl asm_print_hex adr x4, spacer bl asm_print_str ldr x4, [x7], #8 bl asm_print_hex adr x4, newline bl asm_print_str b gicd_ispendr_loop exit_print_gic_regs: .endm .macro plat_print_interconnect_regs .endm arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/include/platform_def.h000066400000000000000000000105131322600646200252360ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLATFORM_DEF_H__ #define __PLATFORM_DEF_H__ #include #include "../sunxi_def.h" /******************************************************************************* * Platform binary types for linking ******************************************************************************/ #define PLATFORM_LINKER_FORMAT "elf64-littleaarch64" #define PLATFORM_LINKER_ARCH aarch64 /******************************************************************************* * Generic platform constants ******************************************************************************/ #define DEBUG_XLAT_TABLE 0 /* Size of cacheable stacks */ #if DEBUG_XLAT_TABLE #define PLATFORM_STACK_SIZE 0x800 #elif IMAGE_BL31 #define PLATFORM_STACK_SIZE 0x400 #endif #define FIRMWARE_WELCOME_STR "Booting Trusted Firmware\n" /* EL3 Runtime Firmware BL31 */ #define BL31_IMAGE_NAME "bl31.bin" /* Non-Trusted Firmware BL33 */ #define BL33_IMAGE_NAME "bl33.bin" /* e.g. UEFI */ #define PLATFORM_CACHE_LINE_SIZE 64 #define PLATFORM_CLUSTER_COUNT 1 #define PLATFORM_CORE_COUNT 4 #define PLATFORM_NUM_AFFS (PLATFORM_CLUSTER_COUNT + PLATFORM_CORE_COUNT) #define PLATFORM_MAX_CPUS_PER_CLUSTER 4 /******************************************************************************* * BL31 specific defines. ******************************************************************************/ /* * Put BL3-1 at the top of the Trusted SRAM (just below the shared memory, if * present). BL31_BASE is calculated using the current BL3-1 debug size plus a * little space for growth. */ #define BL31_BASE (SUNXI_TRUSTED_MONITOR_BASE) #define BL31_PROGBITS_LIMIT (SUNXI_TRUSTED_MONITOR_LIMIT - 0x6000) #define BL31_LIMIT SUNXI_TRUSTED_MONITOR_LIMIT /******************************************************************************* * Platform specific page table and MMU setup constants ******************************************************************************/ #define ADDR_SPACE_SIZE (1ull << 32) #define MAX_XLAT_TABLES 4 #define MAX_MMAP_REGIONS 16 /******************************************************************************* * Declarations and constants to access the mailboxes safely. Each mailbox is * aligned on the biggest cache line size in the platform. This is known only * to the platform as it might have a combination of integrated and external * caches. Such alignment ensures that two maiboxes do not sit on the same cache * line at any cache level. They could belong to different cpus/clusters & * get written while being protected by different locks causing corruption of * a valid mailbox address. ******************************************************************************/ #define CACHE_WRITEBACK_SHIFT 6 #define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT) #endif /* __PLATFORM_DEF_H__ */ arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/include/uart.h000066400000000000000000000024351322600646200235530ustar00rootroot00000000000000#ifndef _UART_H_ #define _UART_H_ #define CCM_UART_PORT_OFFSET 16 #define CCM_UART_ADDR_OFFSET 0x400 #define DW_UART_RBR 0x00 #define DW_UART_THR 0x00 #define DW_UART_DLL 0x00 #define DW_UART_IER 0x04 #define DW_UART_DLH 0x04 #define DW_UART_FCR 0x08 #define DW_UART_LCR 0x0c #define DW_UART_MCR 0x10 #define DW_UART_LSR 0x14 #define DW_UART_MSR 0x18 #define DW_UART_SCH 0x1c #define UART_BAUD 115200 // Baud rate for UART // Compute the divisor factor // UART Line Control Parameter #define PARITY 0 // Parity: 0,2 - no parity; 1 - odd parity; 3 - even parity #define STOP 0 // Number of Stop Bit: 0 - 1bit; 1 - 2(or 1.5)bits #define DLEN 3 // Data Length: 0 - 5bits; 1 - 6bits; 2 - 7bits; 3 - 8bits #if DEBUG void sunxi_serial_init(int uart_port); void sunxi_serial_exit(void); void sunxi_serial_putc (char c); char sunxi_serial_getc (void); int sunxi_serial_tstc (void); #else static inline void sunxi_serial_init(int uart_port) {} static inline void sunxi_serial_exit(void) {} static inline void sunxi_serial_putc(char c) {} static inline char sunxi_serial_getc(void) { return 0;} static inline int sunxi_serial_tstc(void) { return 0;} #endif #endif /* #ifndef _UART_H_ */ arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/plat_pm.c000066400000000000000000000261041322600646200226030ustar00rootroot00000000000000/* * Copyright (c) 2013, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "sunxi_def.h" #include "sunxi_private.h" #include "sunxi_cpu_ops.h" #include #include #include bakery_lock_t plat_console_lock __attribute__ ((section("tzfw_coherent_mem"))); /******************************************************************************* * Private Sunxi function which is used to determine if any platform actions * should be performed for the specified affinity instance given its * state. Nothing needs to be done if the 'state' is not off or if this is not * the highest affinity level which will enter the 'state'. ******************************************************************************/ static int32_t sunxi_do_plat_actions(uint32_t afflvl, uint32_t state) { uint32_t max_phys_off_afflvl; assert(afflvl <= MPIDR_MAX_AFFLVL); if (state != PSCI_STATE_OFF) return -EAGAIN; /* * Find the highest affinity level which will be suspended and postpone * all the platform specific actions until that level is hit. */ max_phys_off_afflvl = psci_get_max_phys_off_afflvl(); assert(max_phys_off_afflvl != PSCI_INVALID_DATA); assert(psci_get_suspend_afflvl() >= max_phys_off_afflvl); if (afflvl != max_phys_off_afflvl) return -EAGAIN; return 0; } /******************************************************************************* * Sunxi handler called when an affinity instance is about to be turned on. The * level and mpidr determine the affinity instance. ******************************************************************************/ int32_t sunxi_affinst_on(uint64_t mpidr, uint64_t sec_entrypoint, uint64_t ns_entrypoint, uint32_t afflvl, uint32_t state) { int cpu_nr = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK; int cluster_nr = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK; if (afflvl != MPIDR_AFFLVL0) return PSCI_E_SUCCESS; sun50i_set_secondary_entry(sec_entrypoint, cpu_nr); sun50i_cpu_power_up(cluster_nr, cpu_nr); return PSCI_E_SUCCESS; } /******************************************************************************* * Sunxi handler called when an affinity instance has just been powered on after * being turned off earlier. The level and mpidr determine the affinity * instance. The 'state' arg. allows the platform to decide whether the cluster * was turned off prior to wakeup and do what's necessary to setup it up * correctly. ******************************************************************************/ int32_t sunxi_affinst_on_finish(uint64_t mpidr, uint32_t afflvl, uint32_t state) { /* Determine if any platform actions need to be executed. */ if (sunxi_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; // set smp bit before cache enable platform_smp_init(); /* Enable the gic cpu interface */ arm_gic_cpuif_setup(); arm_gic_pcpu_distif_setup(); return PSCI_E_SUCCESS; } /******************************************************************************* * sunxi handler called when an affinity instance is about to enter standby. ******************************************************************************/ int sunxi_affinst_standby(unsigned int power_state) { unsigned int target_afflvl; uint64_t scr = 0; /* Sanity check the requested state */ target_afflvl = psci_get_pstate_afflvl(power_state); /* * It's possible to enter standby only on affinity level 0 i.e. a core. * Ignore any other affinity level. */ if (target_afflvl != MPIDR_AFFLVL0) return PSCI_E_INVALID_PARAMS; scr = read_scr_el3(); /* enable physical IRQ bit for NS world to wakeup the CPU */ write_scr_el3(scr | SCR_IRQ_BIT); isb(); /* * Enter standby state * dsb is good practice before using wfi to enter low power states */ dsb(); wfi(); /* * Restore SCR to the original value, sync of scr_el3 is done * by eret while el3_exit to save some execution cycles. */ write_scr_el3(scr); return PSCI_E_SUCCESS; } /******************************************************************************* * Common function called while turning a cpu off or suspending it. It is called * from sunxi_off() or sunxi_suspend() when these functions in turn are called for * the highest affinity level which will be powered down. It performs the * actions common to the OFF and SUSPEND calls. ******************************************************************************/ static int32_t sunxi_power_down_common(uint32_t afflvl, uint64_t mpidr, uint64_t sec_entrypoint) { /* Prevent interrupts from spuriously waking up this cpu */ arm_gic_cpuif_deactivate(); /* We can't turn ourselves off at this point, do this later. */ return PSCI_E_SUCCESS; } static void sunxi_core_power_down_wfi(uint64_t mpidr) { int cpu_nr = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK; int cluster_nr = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK; sun50i_cpu_power_down(cluster_nr, cpu_nr); } /******************************************************************************* * Handler called when an affinity instance is about to be turned off. The * level and mpidr determine the affinity instance. The 'state' arg. allows the * platform to decide whether the cluster is being turned off and take * appropriate actions. * * CAUTION: There is no guarantee that caches will remain turned on across calls * to this function as each affinity level is dealt with. So do not write & read * global variables across calls. It will be wise to do flush a write to the * global to prevent unpredictable results. ******************************************************************************/ static int32_t sunxi_affinst_off(uint64_t mpidr, uint32_t afflvl, uint32_t state) { /* Determine if any platform actions need to be executed */ if (sunxi_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; return sunxi_power_down_common(afflvl, mpidr, 0); } /******************************************************************************* * Handler called when an affinity instance is about to be suspended. The * level and mpidr determine the affinity instance. The 'state' arg. allows the * platform to decide whether the cluster is being turned off and take apt * actions. The 'sec_entrypoint' determines the address in BL3-1 from where * execution should resume. * * CAUTION: There is no guarantee that caches will remain turned on across calls * to this function as each affinity level is dealt with. So do not write & read * global variables across calls. It will be wise to do flush a write to the * global to prevent unpredictable results. ******************************************************************************/ static int32_t sunxi_affinst_suspend(uint64_t mpidr, uint64_t sec_entrypoint, uint64_t ns_entrypoint, uint32_t afflvl, uint32_t state) { /* Determine if any platform actions need to be executed */ if (sunxi_do_plat_actions(afflvl, state) == -EAGAIN) return PSCI_E_SUCCESS; if (afflvl == psci_get_suspend_afflvl()) console_exit(); return sunxi_power_down_common(afflvl, mpidr, sec_entrypoint); } /******************************************************************************* * Sunxi handler called when an affinity instance has just been powered on after * having been suspended earlier. The level and mpidr determine the affinity * instance. * TODO: At the moment we reuse the on finisher and reinitialize the secure * context. Need to implement a separate suspend finisher. ******************************************************************************/ static int32_t sunxi_affinst_suspend_finish(uint64_t mpidr, uint32_t afflvl, uint32_t state) { if ((afflvl == psci_get_suspend_afflvl()) && ((mpidr & 0xff) == 0x0)) { arm_gic_init(GICC_BASE, GICD_BASE, 0, NULL, 0); arm_gic_setup(); console_init(SUNXI_UART0_BASE, UART0_CLK_IN_HZ, UART0_BAUDRATE); } return sunxi_affinst_on_finish(mpidr, afflvl, state); } /******************************************************************************* * Sunxi handlers to shutdown/reboot the system ******************************************************************************/ static void __dead2 sunxi_system_off(void) { sunxi_pmic_write(0x32, sunxi_pmic_read(0x32) | 0x80); ERROR("PSCI system shutdown: still alive ...\n"); wfi(); panic(); } static void __dead2 sunxi_system_reset(void) { mmio_write_32(0x01c20cb4, 1); mmio_write_32(0x01c20cb8, 1); mmio_write_32(0x01c20cb0, (0xa57 << 1) | 0x01); wfi(); ERROR("Sunxi System Reset: operation not handled.\n"); panic(); } /******************************************************************************* * Export the platform handlers to enable psci to invoke them ******************************************************************************/ static const plat_pm_ops_t sunxi_ops = { .affinst_standby = sunxi_affinst_standby, .affinst_on = sunxi_affinst_on, .affinst_on_finish = sunxi_affinst_on_finish, .affinst_off = sunxi_affinst_off, .affinst_suspend = sunxi_affinst_suspend, .affinst_suspend_finish = sunxi_affinst_suspend_finish, .core_power_down_wfi = sunxi_core_power_down_wfi, .system_off = sunxi_system_off, .system_reset = sunxi_system_reset }; /******************************************************************************* * Export the platform specific power ops. ******************************************************************************/ int32_t platform_setup_pm(const plat_pm_ops_t **plat_ops) { *plat_ops = &sunxi_ops; bakery_lock_init(&plat_console_lock); return 0; } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/plat_topology.c000066400000000000000000000047251322600646200240500ustar00rootroot00000000000000/* * Copyright (c) 2016, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include unsigned int plat_get_aff_count(unsigned int aff_lvl, unsigned long mpidr) { /* Report 1 (absent) instance at levels higher that the cluster level */ if (aff_lvl > MPIDR_AFFLVL1) return 1; if (aff_lvl == MPIDR_AFFLVL1) return PLATFORM_CLUSTER_COUNT; return PLATFORM_MAX_CPUS_PER_CLUSTER; } unsigned int plat_get_aff_state(unsigned int aff_lvl, unsigned long mpidr) { #if (PLATFORM_CLUSTER_COUNT == 1) return aff_lvl <= MPIDR_AFFLVL0 ? PSCI_AFF_PRESENT : PSCI_AFF_ABSENT; #else return aff_lvl <= MPIDR_AFFLVL1 ? PSCI_AFF_PRESENT : PSCI_AFF_ABSENT; #endif } int plat_get_max_afflvl(void) { #if (PLATFORM_CLUSTER_COUNT == 1) return MPIDR_AFFLVL0; #else return MPIDR_AFFLVL1; #endif } int plat_setup_topology() { /* * Once we see multiple cluster SoCs appearing, we can read some * ID register here and set the number of clusters at runtime. * For now there is nothing to do. */ return 0; } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/platform.mk000066400000000000000000000044401322600646200231570ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # PLAT_INCLUDES := -Iplat/sun50iw1p1/include/ PLAT_BL_COMMON_SOURCES := lib/aarch64/xlat_tables.c \ plat/common/aarch64/plat_common.c \ plat/sun50iw1p1/drivers/uart/uart.c BL31_SOURCES += drivers/arm/gic/arm_gic.c \ drivers/arm/gic/gic_v2.c \ drivers/arm/gic/gic_v3.c \ lib/cpus/aarch64/cortex_a53.S \ plat/common/plat_gic.c \ plat/common/aarch64/platform_mp_stack.S \ plat/sun50iw1p1/bl31_sunxi_setup.c \ plat/sun50iw1p1/plat_pm.c \ plat/sun50iw1p1/sunxi_security.c \ plat/sun50iw1p1/sunxi_power.c \ plat/sun50iw1p1/sunxi_cpu_ops.c \ plat/sun50iw1p1/plat_topology.c \ plat/sun50iw1p1/aarch64/plat_helpers.S \ plat/sun50iw1p1/sunxi_clocks.c \ plat/sun50iw1p1/sunxi_sip_svc.c \ plat/sun50iw1p1/aarch64/sunxi_common.c arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/sunxi_clocks.c000066400000000000000000000071751322600646200236620ustar00rootroot00000000000000/* * Copyright (c) 2016, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "sunxi_private.h" #define PLL_CPUX_1008MHZ 0x1410 #define PLL_CPUX_816MHZ 0x1010 #define PLL_CPUX_408MHZ 0x1000 static void mmio_clrsetbits32(uintptr_t addr, uint32_t mask, uint32_t bits) { uint32_t regval = mmio_read_32(addr); regval &= ~mask; regval |= bits; mmio_write_32(addr, regval); } static void mmio_setbits32(uintptr_t addr, uint32_t bits) { uint32_t regval = mmio_read_32(addr); regval |= bits; mmio_write_32(addr, regval); } /* TODO (prt): we should have a timeout and return an error/success... */ static int pll_wait_until_stable(uintptr_t addr) { while ((mmio_read_32(addr) & PLL_STABLE_BIT) != PLL_STABLE_BIT) { /* spin */ } return 0; } int sunxi_setup_clocks(uint16_t socid, const char *dt_name) { uint32_t reg; /* Avoid reprogramming PERIPH0 if not necessary */ reg = mmio_read_32(CCMU_PLL_PERIPH0_CTRL_REG); if ((reg & 0x0fffffff) != 0x41811) /* is not at 600 MHz? */ mmio_write_32(CCMU_PLL_PERIPH0_CTRL_REG, 0x80041811); /* Set up dividers (suitable for the target clock frequency) and switch CPUX (and thus AXI & APB) to the LOSC24 clock */ mmio_write_32(CCMU_CPUX_AXI_CFG_REG, ( CPUX_SRCSEL_OSC24M | APB_CLKDIV(4) | AXI_CLKDIV(3) )); udelay(20); /* Set to 816MHz, but don't enable yet. */ mmio_write_32(CCMU_PLL_CPUX_CTRL_REG, PLL_CPUX_816MHZ); /* Enable PLL_CPUX again */ mmio_setbits32(CCMU_PLL_CPUX_CTRL_REG, PLL_ENABLE_BIT); /* Wait until the PLL_CPUX becomes stable */ pll_wait_until_stable(CCMU_PLL_CPUX_CTRL_REG); /* Wait another 20us, because Allwinner does so... */ udelay(20); /* Switch AXI clock back to PLL_CPUX, dividers are set up already. */ mmio_clrsetbits32(CCMU_CPUX_AXI_CFG_REG, CPUX_SRCSEL_MASK, CPUX_SRCSEL_PLLCPUX); /* Wait 1000us, because Allwiner does so... */ udelay(1000); /* AHB1 = PERIPH0 / (3 * 1) = 200MHz, APB1 = AHB1 / 2 */ mmio_write_32(CCMU_AHB1_APB1_CFG_REG, 0x00003180); mmio_write_32(CCMU_APB2_CFG_GREG, 0x01000000); /* APB2 => 24 MHz */ mmio_write_32(CCMU_AHB2_CFG_GREG, 0x00000001); /* AHB2 => 300 MHz */ return 0; } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/sunxi_cpu_ops.c000066400000000000000000000205561322600646200240520ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "sunxi_def.h" #include "sunxi_private.h" #define SUN50I_PRCM_PBASE (0x01F01400) #define SUN50I_CPUCFG_PBASE (0x01700000) #define SUN50I_RCPUCFG_PBASE (0x01F01C00) #define SUNXI_CPU_PWR_CLAMP(cluster, cpu) (0x140 + (cluster*4 + cpu)*0x04) #define SUNXI_CLUSTER_PWROFF_GATING(cluster) (0x100 + (cluster)*0x04) #define SUNXI_CLUSTER_PWRON_RESET(cluster) (0x30 + (cluster)*0x04) #define SUNXI_DBG_REG0 (0x20) #define SUNXI_CLUSTER_CPU_STATUS(cluster) (0x30 + (cluster)*0x4) #define SUNXI_CPU_RST_CTRL(cluster) (0x80 + (cluster)*0x4) #define SUNXI_CLUSTER_CTRL0(cluster) (0x00 + (cluster)*0x10) #define SUNXI_CPU_RVBA_L(cpu) (0xA0 + (cpu)*0x8) #define SUNXI_CPU_RVBA_H(cpu) (0xA4 + (cpu)*0x8) #define readl(x) mmio_read_32((x)) #define writel(v, a) mmio_write_32((a), (v)) typedef unsigned int bool; static unsigned int sun50i_cpucfg_base = SUN50I_CPUCFG_PBASE; static unsigned int sun50i_prcm_base = SUN50I_PRCM_PBASE; static unsigned int sun50i_r_cpucfg_base = SUN50I_RCPUCFG_PBASE; extern bakery_lock_t plat_console_lock; void udelay(unsigned int delay) { if (!delay) return; __asm__ volatile ( "1:\tsubs %0, %0, #1\n" "\tb.ne 1b" : "=r" (delay) : "0" (delay * 1000UL) : "cc" ); } #define CPU_DELAY_SHORT 10 #define CPU_DELAY_MEDIUM 20 #define CPU_DELAY_LONG 30 void sun50i_set_secondary_entry(unsigned long entry, unsigned int cpu) { mmio_write_32(sun50i_cpucfg_base + SUNXI_CPU_RVBA_L(cpu) ,entry); mmio_write_32(sun50i_cpucfg_base + SUNXI_CPU_RVBA_H(cpu), 0); } void sun50i_set_AA32nAA64(unsigned int cluster, unsigned int cpu, bool is_aa64) { volatile unsigned int value; value = readl(sun50i_cpucfg_base + SUNXI_CLUSTER_CTRL0(cluster)); value &= ~(1<<(cpu + 24)); value |= (is_aa64 <<(cpu + 24)); writel(value, sun50i_cpucfg_base + SUNXI_CLUSTER_CTRL0(cluster)); value = readl(sun50i_cpucfg_base + SUNXI_CLUSTER_CTRL0(cluster)); } int sun50i_power_switch_set(unsigned int cluster, unsigned int cpu, bool enable) { if (enable) { if (0x00 == readl(sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu))) return 0; /* de-active cpu power clamp */ writel(0xFE, sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu)); udelay(CPU_DELAY_MEDIUM); writel(0xF8, sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu)); udelay(CPU_DELAY_SHORT); writel(0xE0, sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu)); udelay(CPU_DELAY_SHORT); writel(0x80, sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu)); udelay(CPU_DELAY_SHORT); writel(0x00, sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu)); udelay(CPU_DELAY_MEDIUM); while (0x00 != readl(sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu))); } else { if (0xFF == readl(sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu))) return 0; writel(0xFF, sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu)); udelay(CPU_DELAY_LONG); while (0xFF != readl(sun50i_prcm_base + SUNXI_CPU_PWR_CLAMP(cluster, cpu))); } return 0; } void sun50i_cpu_power_up(unsigned int cluster, unsigned int cpu) { unsigned int value; /* Assert nCPUPORESET LOW */ value = readl(sun50i_cpucfg_base + SUNXI_CPU_RST_CTRL(cluster)); value &= (~(1< #include #include #include #include #include "sunxi_def.h" #include "sunxi_private.h" #define R_PRCM_BASE 0x1f01400ULL #define R_TWI_BASE 0x1f02400ULL #define R_PIO_BASE 0x1f02c00ULL #define RSB_BASE 0x1f03400ULL #define RSB_CTRL 0x00 #define RSB_CCR 0x04 #define RSB_INTE 0x08 #define RSB_STAT 0x0c #define RSB_DADDR0 0x10 #define RSB_DLEN 0x18 #define RSB_DATA0 0x1c #define RSB_LCR 0x24 #define RSB_PMCR 0x28 #define RSB_CMD 0x2c #define RSB_SADDR 0x30 #define RSBCMD_SRTA 0xE8 #define RSBCMD_RD8 0x8B #define RSBCMD_RD16 0x9C #define RSBCMD_RD32 0xA6 #define RSBCMD_WR8 0x4E #define RSBCMD_WR16 0x59 #define RSBCMD_WR32 0x63 #define BIT(n) (1U << (n)) #define RUNTIME_ADDR 0x2d #define AXP803_HW_ADDR 0x3a3 /* Initialize the RSB controller and its pins. */ static int init_rsb(void) { uint32_t reg; /* un-gate PIO clock */ reg = mmio_read_32(R_PRCM_BASE + 0x28); mmio_write_32(R_PRCM_BASE + 0x28, reg | 0x01); /* get currently configured function for pins PL0 and PL1 */ reg = mmio_read_32(R_PIO_BASE + 0x00); if ((reg & 0xff) == 0x33) { NOTICE("already configured for TWI\n"); return -EBUSY; } if ((reg & 0xff) == 0x22) { NOTICE("PMIC: already configured for RSB\n"); return -EEXIST; /* configured for RSB mode already */ } /* switch pins PL0 and PL1 to RSB */ mmio_write_32(R_PIO_BASE + 0, (reg & ~0xff) | 0x22); /* level 2 drive strength */ reg = mmio_read_32(R_PIO_BASE + 0x14); mmio_write_32(R_PIO_BASE + 0x14, (reg & ~0x0f) | 0xa); /* set both ports to pull-up */ reg = mmio_read_32(R_PIO_BASE + 0x1c); mmio_write_32(R_PIO_BASE + 0x1c, (reg & ~0x0f) | 0x5); /* assert & de-assert reset of RSB */ reg = mmio_read_32(R_PRCM_BASE + 0xb0); mmio_write_32(R_PRCM_BASE + 0xb0, reg & ~0x08); reg = mmio_read_32(R_PRCM_BASE + 0xb0); mmio_write_32(R_PRCM_BASE + 0xb0, reg | 0x08); /* un-gate RSB clock */ reg = mmio_read_32(R_PRCM_BASE + 0x28); mmio_write_32(R_PRCM_BASE + 0x28, reg | 0x08); mmio_write_32(RSB_BASE + RSB_CTRL, 0x01); /* soft reset */ mmio_write_32(RSB_BASE + RSB_CCR, 0x11d); /* clock to 400 KHz */ do { reg = mmio_read_32(RSB_BASE + RSB_CTRL); } while (reg & 1); /* transaction in progress */ return 0; } int sunxi_pmic_read(uint8_t address) { uint32_t reg; mmio_write_32(RSB_BASE + RSB_DLEN, 0x10); /* read a byte, snake oil? */ mmio_write_32(RSB_BASE + RSB_CMD, RSBCMD_RD8); /* read a byte */ mmio_write_32(RSB_BASE + RSB_DADDR0, address); mmio_write_32(RSB_BASE + RSB_CTRL, 0x80); /* start transaction */ do { reg = mmio_read_32(RSB_BASE + RSB_CTRL); } while (reg & 0x80); /* transaction in progress */ reg = mmio_read_32(RSB_BASE + RSB_STAT); if (reg == 0x01) { /* transaction complete */ reg = mmio_read_32(RSB_BASE + RSB_DATA0); /* result register */ return reg & 0xff; } return -reg; } int sunxi_pmic_write(uint8_t address, uint8_t value) { uint32_t reg; mmio_write_32(RSB_BASE + RSB_DLEN, 0x00); /* write a byte, snake oil? */ mmio_write_32(RSB_BASE + RSB_CMD, RSBCMD_WR8); /* write a byte */ mmio_write_32(RSB_BASE + RSB_DADDR0, address); mmio_write_32(RSB_BASE + RSB_DATA0, value); mmio_write_32(RSB_BASE + RSB_CTRL, 0x80); /* start transaction */ do { reg = mmio_read_32(RSB_BASE + RSB_CTRL); } while (reg & 0x80); /* transaction in progress */ reg = mmio_read_32(RSB_BASE + RSB_STAT); if (reg == 0x01) /* transaction complete */ return 0; return -reg; } static void rsb_wait(const char *desc) { uint32_t reg; int cnt = 0; do { reg = mmio_read_32(RSB_BASE + RSB_CTRL); cnt++; } while (reg & 0x80); /* transaction in progress */ reg = mmio_read_32(RSB_BASE + RSB_STAT); if (reg == 0x01) return; ERROR("%s: 0x%x\n", desc, reg); } /* Initialize the RSB PMIC connection. */ static int pmic_init(uint16_t hw_addr, uint8_t rt_addr) { int ret; /* Switch PMIC to RSB mode */ mmio_write_32(RSB_BASE + RSB_PMCR, 0x00 | (0x3e << 8) | (0x7c << 16) | BIT(31)); do { ret = mmio_read_32(RSB_BASE + RSB_PMCR); } while (ret & (1U << 31)); /* transaction in progress */ mmio_write_32(RSB_BASE + RSB_CCR, 0x103); /* 3 MHz */ mmio_write_32(RSB_BASE + RSB_SADDR, hw_addr | (rt_addr << 16)); mmio_write_32(RSB_BASE + RSB_CMD, RSBCMD_SRTA); mmio_write_32(RSB_BASE + RSB_CTRL, 0x80); rsb_wait("set run-time address"); /* Set slave runtime address */ mmio_write_32(RSB_BASE + RSB_SADDR, rt_addr << 16); ret = sunxi_pmic_read(0x03); if (ret < 0) { ERROR("PMIC: error %d reading PMIC type\n", ret); return -2; } if ((ret & 0xcf) != 0x41) { ERROR("PMIC: unknown PMIC type number 0x%x\n", ret); return -3; } return 0; } /* Setup the PMIC: DCDC1 to 3.3V, enable DC1SW and DLDO4 */ static int pmic_setup(const char *dt_name) { int ret; ret = sunxi_pmic_read(0x20); if (ret != 0x0e && ret != 0x11) { int voltage = (ret & 0x1f) * 10 + 16; NOTICE("PMIC: DCDC1 voltage is an unexpected %d.%dV\n", voltage / 10, voltage % 10); return -1; } if (ret != 0x11) { /* Set DCDC1 voltage to 3.3 Volts */ ret = sunxi_pmic_write(0x20, 0x11); if (ret < 0) { NOTICE("PMIC: error %d writing DCDC1 voltage\n", ret); return -2; } } ret = sunxi_pmic_read(0x12); if ((ret & 0x37) != 0x01) { NOTICE("PMIC: Output power control 2 is an unexpected 0x%x\n", ret); return -3; } if ((ret & 0xc9) != 0xc9) { /* Enable DC1SW to power PHY, DLDO4 for WiFi and DLDO1 for HDMI */ ret = sunxi_pmic_write(0x12, ret | 0xc8); if (ret < 0) { NOTICE("PMIC: error %d enabling DC1SW/DLDO4/DLDO1\n", ret); return -4; } } /* * On the Pine64 the AXP is wired wrongly: to reset DCDC5 to 1.24V. * However the DDR3L chips require 1.36V instead. Fix this up. Other * boards hopefully do the right thing here and don't require any * changes. This should be further confined once we are able to * reliably detect a Pine64 board. */ if (!strcmp(dt_name, "sun50i-a64-pine64-plus")) { ret = sunxi_pmic_read(0x24); /* read DCDC5 register */ if ((ret & 0x7f) == 0x26) { /* check for 1.24V value */ NOTICE("PMIC: fixing DRAM voltage from 1.24V to 1.36V\n"); sunxi_pmic_write(0x24, 0x2c); } } /* Enable the LCD power planes to get the display up early. */ if (!strcmp(dt_name, "sun50i-a64-pinebook")) { sunxi_pmic_write(0x16, 0x12); /* DLDO2 = VCC-MIPI = 2.5V */ ret = sunxi_pmic_read(0x12); sunxi_pmic_write(0x12, ret | 0x10); sunxi_pmic_write(0x1c, 0x0a); /* FLDO1 = HSIC = 1.2V */ ret = sunxi_pmic_read(0x13); sunxi_pmic_write(0x13, ret | 0x4); NOTICE("PMIC: enabled Pinebook display\n"); } sunxi_pmic_write(0x15, 0x1a); /* DLDO1 = VCC3V3_HDMI voltage = 3.3V */ return 0; } /* * Program the AXP803 via the RSB bus. */ int sunxi_pmic_setup(const char *dt_name) { int ret; NOTICE("Configuring AXP PMIC\n"); ret = init_rsb(); if (ret && ret != -EEXIST) { ERROR("Could not init RSB controller.\n"); return -1; } if (ret != -EEXIST) { ret = pmic_init(AXP803_HW_ADDR, RUNTIME_ADDR); if (ret) { ERROR("Could not connect to AXP PMIC.\n"); return -2; } } ret = pmic_setup(dt_name); if (!ret) NOTICE("PMIC: setup successful\n"); else ERROR("PMIC: setup failed: %d\n", ret); return ret; } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/sunxi_private.h000066400000000000000000000060461322600646200240570ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SUNXI_PRIVATE_H__ #define __SUNXI_PRIVATE_H__ #include #include /******************************************************************************* * Forward declarations ******************************************************************************/ struct meminfo; /******************************************************************************* * Function and variable prototypes ******************************************************************************/ void sunxi_configure_mmu_el1(unsigned long total_base, unsigned long total_size, unsigned long, unsigned long, unsigned long, unsigned long); void sunxi_configure_mmu_el3(unsigned long total_base, unsigned long total_size, unsigned long, unsigned long, unsigned long, unsigned long); int sunxi_config_setup(void); uint16_t sunxi_get_socid(void); const char *get_dt_name(void); /* Declarations for sunxi_topology.c */ int plat_setup_topology(void); /* Declarations for sunxi_io_storage.c */ void sunxi_io_setup(void); /* Declarations for sunxi_security.c */ void sunxi_security_setup(void); /* Declarations for sunxi_power.c */ int sunxi_pmic_setup(const char *dt_name); int sunxi_pmic_read(uint8_t address); int sunxi_pmic_write(uint8_t address, uint8_t value); void udelay(unsigned int delay); int sunxi_setup_clocks(uint16_t socid, const char *dt_name); /* Gets the SPSR for BL33 entry */ uint32_t sunxi_get_spsr_for_bl33_entry(int aarch); #endif /* __SUNXI_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/sunxi_security.c000066400000000000000000000051371322600646200242470ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "sunxi_def.h" #include "sunxi_private.h" #define SPC_BASE 0x1c23400ULL #define SPC_DECPORT_STA_REG(p) (SPC_BASE + ((p) * 0x0c) + 0x4) #define SPC_DECPORT_SET_REG(p) (SPC_BASE + ((p) * 0x0c) + 0x8) #define SPC_DECPORT_CLR_REG(p) (SPC_BASE + ((p) * 0x0c) + 0xc) /* * For the moment we assume that all security programming is done by the * primary core. * TODO: * Might want to enable interrupt on violations when supported? */ void sunxi_security_setup(void) { int i; NOTICE("Configuring SPC Controller\n"); /* set all devices to non-secure */ for (i = 0; i < 6; i++) mmio_write_32(SPC_DECPORT_SET_REG(i), 0xff); /* switch RSB to secure */ mmio_write_32(SPC_DECPORT_CLR_REG(3), 0x08); /* set CCMU mbus_sec, bus_sec, pll_sec to non-secure */ mmio_write_32(0x01c20000+0x2f0, 0x7); /* set R_PRCM power_sec, pll_sec, cpus_clk to non-secure */ mmio_write_32(0x01f01400+0x1d0, 0x7); /* Set DMA channels 0-7 to non-secure */ mmio_write_32(0x01c02000+0x20, 0xff); } arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/sunxi_sip_svc.c000066400000000000000000000071201322600646200240400ustar00rootroot00000000000000/* * Copyright (c) 2016,2017 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "sunxi_sip_svc.h" #include "sunxi_private.h" #include #include /* SiP Service UUID */ DEFINE_SVC_UUID(sunxi_sip_svc_uid, 0x06016e09, 0xd859, 0x4c24, 0xbb, 0x9d, 0x18, 0x92, 0xb4, 0x8d, 0xa5, 0x03); #pragma weak sunxi_plat_sip_handler uint64_t sunxi_plat_sip_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); SMC_RET1(handle, SMC_UNK); } /* * This function handles Allwinner defined SiP Calls */ uint64_t sunxi_sip_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { /* Determine which security state this SMC originated from */ if (!is_caller_non_secure(flags)) SMC_RET1(handle, SMC_UNK); /* SiP SMC service normal world's call */ switch (smc_fid) { case SUNXI_SIP_MBOX_TRIGGER: SMC_RET1(handle, SMC_UNK); } return sunxi_plat_sip_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags); } /* * This function is responsible for handling all SiP calls from the NS world */ uint64_t sip_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { switch (smc_fid) { case SIP_SVC_CALL_COUNT: /* Return the number of Allwinner SiP Service Calls. */ SMC_RET1(handle, SUNXI_COMMON_SIP_NUM_CALLS); case SIP_SVC_UID: /* Return UID to the caller */ SMC_UUID_RET(handle, sunxi_sip_svc_uid); case SIP_SVC_VERSION: /* Return the version of current implementation */ SMC_RET2(handle, SUNXI_SIP_SVC_VERSION_MAJOR, SUNXI_SIP_SVC_VERSION_MINOR); default: return sunxi_sip_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags); } } /* Define a runtime service descriptor for fast SMC calls */ DECLARE_RT_SVC( sunxi_sip_svc, OEN_SIP_START, OEN_SIP_END, SMC_TYPE_FAST, NULL, sip_smc_handler ); arm-trusted-firmware-1.0-aw-6/plat/sun50iw1p1/sunxi_sip_svc.h000066400000000000000000000042351322600646200240510ustar00rootroot00000000000000/* * Copyright (c) 2016,2017 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PLAT_SIP_SVC_H__ #define __PLAT_SIP_SVC_H__ #include /* SMC function IDs for SiP Service queries */ #define SIP_SVC_CALL_COUNT 0x8200ff00 #define SIP_SVC_UID 0x8200ff01 /* 0x8200ff02 is reserved */ #define SIP_SVC_VERSION 0x8200ff03 /* Allwinner SiP Service Calls version numbers */ #define SUNXI_SIP_SVC_VERSION_MAJOR 0x0 #define SUNXI_SIP_SVC_VERSION_MINOR 0x1 #define SMC_AARCH64_BIT 0x40000000 /* Number of Allwinner SiP Calls implemented */ #define SUNXI_COMMON_SIP_NUM_CALLS 1 /* Allwinner SiP Service Calls function IDs */ #define SUNXI_SIP_MBOX_TRIGGER 0x82000001 #endif /* __PLAT_SIP_SVC_H__ */ arm-trusted-firmware-1.0-aw-6/readme.md000066400000000000000000000153671322600646200177770ustar00rootroot00000000000000ARM Trusted Firmware - version 1.0 ================================== ARM Trusted Firmware provides a reference implementation of secure world software for [ARMv8-A], including Exception Level 3 (EL3) software. This release provides initial support for the [Juno ARM Development Platform] [Juno], complementing the existing support for the Base and Foundation [Fixed Virtual Platforms (FVPs)] [FVP] from ARM. The intent is to provide a reference implementation of various ARM interface standards, such as the Power State Coordination Interface ([PSCI]), Trusted Board Boot Requirements (TBBR) and [Secure Monitor] [TEE-SMC] code. As far as possible the code is designed for reuse or porting to other ARMv8-A model and hardware platforms. ARM will continue development in collaboration with interested parties to provide a full reference implementation of PSCI, TBBR and Secure Monitor code to the benefit of all developers working with ARMv8-A TrustZone technology. License ------- The software is provided under a BSD 3-Clause [license]. Certain source files are derived from FreeBSD code: the original license is included in these source files. This Release ------------ This release is a limited functionality implementation of the Trusted Firmware. It provides a suitable starting point for productization. Future versions will contain new features, optimizations and quality improvements. ### Functionality * Initial implementation of a subset of the Trusted Board Boot Requirements Platform Design Document (PDD). This includes packaging the various firmware images into a Firmware Image Package (FIP) to be loaded from non-volatile storage. * Initializes the secure world (for example, exception vectors, control registers, GIC and interrupts for the platform), before transitioning into the normal world. * Supports both GICv2 and GICv3 initialization for use by normal world software. * Starts the normal world at the Exception Level and Register Width provided by the platform port. Typically this is AArch64 EL2 if available. * Handles SMCs (Secure Monitor Calls) conforming to the [SMC Calling Convention PDD] [SMCCC] using an EL3 runtime services framework. * Handles SMCs relating to the [Power State Coordination Interface PDD] [PSCI] for the Secondary CPU Boot, CPU Hotplug, CPU Idle and System Shutdown/Reset use-cases. * A Test Secure-EL1 Payload and Dispatcher to demonstrate Secure Monitor functionality such as world switching, EL1 context management and interrupt routing. This also demonstrates Secure-EL1 interaction with PSCI. Some of this functionality is provided in library form for re-use by other Secure-EL1 Payload Dispatchers. * Support for alternative Trusted Boot Firmware. Some platforms have their own Trusted Boot implementation and only require the Secure Monitor functionality provided by ARM Trusted Firmware. * Isolation of memory accessible by the secure world from the normal world through programming of a TrustZone controller. * Support for CPU specific reset sequences, power down sequences and register dumping during crash reporting. The CPU specific reset sequences include support for errata workarounds. For a full description of functionality and implementation details, please see the [Firmware Design] and supporting documentation. The [Change Log] provides details of changes made since the last release. ### Platforms This release of the Trusted Firmware has been tested on Revision B of the [Juno ARM Development Platform] [Juno] with Version r0p0-00rel7 of the [ARM SCP Firmware] [SCP download]. The Trusted Firmware has also been tested on the 64-bit Linux versions of the following ARM [FVP]s: * `Foundation_v8` (Version 2.1, Build 9.0.24) * `FVP_Base_AEMv8A-AEMv8A` (Version 5.8, Build 0.8.5802) * `FVP_Base_Cortex-A57x4-A53x4` (Version 5.8, Build 0.8.5802) * `FVP_Base_Cortex-A57x1-A53x1` (Version 5.8, Build 0.8.5802) * `FVP_Base_Cortex-A57x2-A53x4` (Version 5.8, Build 0.8.5802) The Foundation FVP can be downloaded free of charge. The Base FVPs can be licensed from ARM: see [www.arm.com/fvp] [FVP]. ### Still to Come * Complete Trusted Boot implementation. * Complete implementation of the [PSCI] specification. * Support for alternative types of Secure-EL1 Payloads. * Completing the currently experimental GICv3 support. * Support for new System IP devices. For a full list of detailed issues in the current code, please see the [Change Log] and the [GitHub issue tracker]. Getting Started --------------- Get the Trusted Firmware source code from [GitHub](https://www.github.com/ARM-software/arm-trusted-firmware). See the [User Guide] for instructions on how to install, build and use the Trusted Firmware with the ARM [FVP]s. See the [Firmware Design] for information on how the ARM Trusted Firmware works. See the [Porting Guide] as well for information about how to use this software on another ARMv8-A platform. See the [Contributing Guidelines] for information on how to contribute to this project and the [Acknowledgments] file for a list of contributors to the project. ### Feedback and support ARM welcomes any feedback on the Trusted Firmware. Please send feedback using the [GitHub issue tracker]. ARM licensees may contact ARM directly via their partner managers. - - - - - - - - - - - - - - - - - - - - - - - - - - _Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved._ [License]: ./license.md "BSD license for ARM Trusted Firmware" [Contributing Guidelines]: ./contributing.md "Guidelines for contributors" [Acknowledgments]: ./acknowledgements.md "Contributor acknowledgments" [Change Log]: ./docs/change-log.md [User Guide]: ./docs/user-guide.md [Firmware Design]: ./docs/firmware-design.md [Porting Guide]: ./docs/porting-guide.md [ARMv8-A]: http://www.arm.com/products/processors/armv8-architecture.php "ARMv8-A Architecture" [FVP]: http://www.arm.com/fvp "ARM's Fixed Virtual Platforms" [Juno]: http://www.arm.com/products/tools/development-boards/versatile-express/juno-arm-development-platform.php "Juno ARM Development Platform" [SCP download]: https://silver.arm.com/download/download.tm?pv=1764630 [PSCI]: http://infocenter.arm.com/help/topic/com.arm.doc.den0022b/index.html "Power State Coordination Interface PDD (ARM DEN 0022B.b)" [SMCCC]: http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html "SMC Calling Convention PDD (ARM DEN 0028A)" [TEE-SMC]: http://www.arm.com/products/processors/technologies/trustzone/tee-smc.php "Secure Monitor and TEEs" [GitHub issue tracker]: https://github.com/ARM-software/tf-issues/issues arm-trusted-firmware-1.0-aw-6/services/000077500000000000000000000000001322600646200200275ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/services/spd/000077500000000000000000000000001322600646200206155ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/services/spd/tspd/000077500000000000000000000000001322600646200215675ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/services/spd/tspd/tspd.mk000066400000000000000000000045711322600646200231010ustar00rootroot00000000000000# # Copyright (c) 2013-2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # TSPD_DIR := services/spd/tspd SPD_INCLUDES := -Iinclude/bl32/tsp SPD_SOURCES := services/spd/tspd/tspd_common.c \ services/spd/tspd/tspd_helpers.S \ services/spd/tspd/tspd_main.c \ services/spd/tspd/tspd_pm.c # This dispatcher is paired with a Test Secure Payload source and we intend to # build the Test Secure Payload along with this dispatcher. # # In cases where an associated Secure Payload lies outside this build # system/source tree, the the dispatcher Makefile can either invoke an external # build command or assume it pre-built BL32_ROOT := bl32/tsp # Include SP's Makefile. The assumption is that the TSP's build system is # compatible with that of Trusted Firmware, and it'll add and populate necessary # build targets and variables include ${BL32_ROOT}/tsp.mk # Let the top-level Makefile know that we intend to build the SP from source NEED_BL32 := yes arm-trusted-firmware-1.0-aw-6/services/spd/tspd/tspd_common.c000066400000000000000000000117051322600646200242610ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "tspd_private.h" /******************************************************************************* * Given a secure payload entrypoint info pointer, entry point PC, register * width, cpu id & pointer to a context data structure, this function will * initialize tsp context and entry point info for the secure payload ******************************************************************************/ void tspd_init_tsp_ep_state(struct entry_point_info *tsp_entry_point, uint32_t rw, uint64_t pc, tsp_context_t *tsp_ctx) { uint32_t ep_attr; /* Passing a NULL context is a critical programming error */ assert(tsp_ctx); assert(tsp_entry_point); assert(pc); /* * We support AArch64 TSP for now. * TODO: Add support for AArch32 TSP */ assert(rw == TSP_AARCH64); /* Associate this context with the cpu specified */ tsp_ctx->mpidr = read_mpidr_el1(); tsp_ctx->state = 0; set_tsp_pstate(tsp_ctx->state, TSP_PSTATE_OFF); clr_std_smc_active_flag(tsp_ctx->state); cm_set_context(&tsp_ctx->cpu_ctx, SECURE); /* initialise an entrypoint to set up the CPU context */ ep_attr = SECURE | EP_ST_ENABLE; if (read_sctlr_el3() & SCTLR_EE_BIT) ep_attr |= EP_EE_BIG; SET_PARAM_HEAD(tsp_entry_point, PARAM_EP, VERSION_1, ep_attr); tsp_entry_point->pc = pc; tsp_entry_point->spsr = SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); memset(&tsp_entry_point->args, 0, sizeof(tsp_entry_point->args)); } /******************************************************************************* * This function takes an SP context pointer and: * 1. Applies the S-EL1 system register context from tsp_ctx->cpu_ctx. * 2. Saves the current C runtime state (callee saved registers) on the stack * frame and saves a reference to this state. * 3. Calls el3_exit() so that the EL3 system and general purpose registers * from the tsp_ctx->cpu_ctx are used to enter the secure payload image. ******************************************************************************/ uint64_t tspd_synchronous_sp_entry(tsp_context_t *tsp_ctx) { uint64_t rc; assert(tsp_ctx != NULL); assert(tsp_ctx->c_rt_ctx == 0); /* Apply the Secure EL1 system register context and switch to it */ assert(cm_get_context(SECURE) == &tsp_ctx->cpu_ctx); cm_el1_sysregs_context_restore(SECURE); cm_set_next_eret_context(SECURE); rc = tspd_enter_sp(&tsp_ctx->c_rt_ctx); #if DEBUG tsp_ctx->c_rt_ctx = 0; #endif return rc; } /******************************************************************************* * This function takes an SP context pointer and: * 1. Saves the S-EL1 system register context tp tsp_ctx->cpu_ctx. * 2. Restores the current C runtime state (callee saved registers) from the * stack frame using the reference to this state saved in tspd_enter_sp(). * 3. It does not need to save any general purpose or EL3 system register state * as the generic smc entry routine should have saved those. ******************************************************************************/ void tspd_synchronous_sp_exit(tsp_context_t *tsp_ctx, uint64_t ret) { assert(tsp_ctx != NULL); /* Save the Secure EL1 system register context */ assert(cm_get_context(SECURE) == &tsp_ctx->cpu_ctx); cm_el1_sysregs_context_save(SECURE); assert(tsp_ctx->c_rt_ctx != 0); tspd_exit_sp(tsp_ctx->c_rt_ctx, ret); /* Should never reach here */ assert(0); } arm-trusted-firmware-1.0-aw-6/services/spd/tspd/tspd_helpers.S000066400000000000000000000100211322600646200244010ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include "tspd_private.h" .global tspd_enter_sp /* --------------------------------------------- * This function is called with SP_EL0 as stack. * Here we stash our EL3 callee-saved registers * on to the stack as a part of saving the C * runtime and enter the secure payload. * 'x0' contains a pointer to the memory where * the address of the C runtime context is to be * saved. * --------------------------------------------- */ func tspd_enter_sp /* Make space for the registers that we're going to save */ mov x3, sp str x3, [x0, #0] sub sp, sp, #TSPD_C_RT_CTX_SIZE /* Save callee-saved registers on to the stack */ stp x19, x20, [sp, #TSPD_C_RT_CTX_X19] stp x21, x22, [sp, #TSPD_C_RT_CTX_X21] stp x23, x24, [sp, #TSPD_C_RT_CTX_X23] stp x25, x26, [sp, #TSPD_C_RT_CTX_X25] stp x27, x28, [sp, #TSPD_C_RT_CTX_X27] stp x29, x30, [sp, #TSPD_C_RT_CTX_X29] /* --------------------------------------------- * Everything is setup now. el3_exit() will * use the secure context to restore to the * general purpose and EL3 system registers to * ERET into the secure payload. * --------------------------------------------- */ b el3_exit /* --------------------------------------------- * This function is called 'x0' pointing to a C * runtime context saved in tspd_enter_sp(). It * restores the saved registers and jumps to * that runtime with 'x0' as the new sp. This * destroys the C runtime context that had been * built on the stack below the saved context by * the caller. Later the second parameter 'x1' * is passed as return value to the caller * --------------------------------------------- */ .global tspd_exit_sp func tspd_exit_sp /* Restore the previous stack */ mov sp, x0 /* Restore callee-saved registers on to the stack */ ldp x19, x20, [x0, #(TSPD_C_RT_CTX_X19 - TSPD_C_RT_CTX_SIZE)] ldp x21, x22, [x0, #(TSPD_C_RT_CTX_X21 - TSPD_C_RT_CTX_SIZE)] ldp x23, x24, [x0, #(TSPD_C_RT_CTX_X23 - TSPD_C_RT_CTX_SIZE)] ldp x25, x26, [x0, #(TSPD_C_RT_CTX_X25 - TSPD_C_RT_CTX_SIZE)] ldp x27, x28, [x0, #(TSPD_C_RT_CTX_X27 - TSPD_C_RT_CTX_SIZE)] ldp x29, x30, [x0, #(TSPD_C_RT_CTX_X29 - TSPD_C_RT_CTX_SIZE)] /* --------------------------------------------- * This should take us back to the instruction * after the call to the last tspd_enter_sp(). * Place the second parameter to x0 so that the * caller will see it as a return value from the * original entry call * --------------------------------------------- */ mov x0, x1 ret arm-trusted-firmware-1.0-aw-6/services/spd/tspd/tspd_main.c000066400000000000000000000465111322600646200237200ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /******************************************************************************* * This is the Secure Payload Dispatcher (SPD). The dispatcher is meant to be a * plug-in component to the Secure Monitor, registered as a runtime service. The * SPD is expected to be a functional extension of the Secure Payload (SP) that * executes in Secure EL1. The Secure Monitor will delegate all SMCs targeting * the Trusted OS/Applications range to the dispatcher. The SPD will either * handle the request locally or delegate it to the Secure Payload. It is also * responsible for initialising and maintaining communication with the SP. ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "tspd_private.h" /******************************************************************************* * Address of the entrypoint vector table in the Secure Payload. It is * initialised once on the primary core after a cold boot. ******************************************************************************/ tsp_vectors_t *tsp_vectors; /******************************************************************************* * Array to keep track of per-cpu Secure Payload state ******************************************************************************/ tsp_context_t tspd_sp_context[TSPD_CORE_COUNT]; /* TSP UID */ DEFINE_SVC_UUID(tsp_uuid, 0x5b3056a0, 0x3291, 0x427b, 0x98, 0x11, 0x71, 0x68, 0xca, 0x50, 0xf3, 0xfa); int32_t tspd_init(void); /******************************************************************************* * This function is the handler registered for S-EL1 interrupts by the TSPD. It * validates the interrupt and upon success arranges entry into the TSP at * 'tsp_fiq_entry()' for handling the interrupt. ******************************************************************************/ static uint64_t tspd_sel1_interrupt_handler(uint32_t id, uint32_t flags, void *handle, void *cookie) { uint32_t linear_id; uint64_t mpidr; tsp_context_t *tsp_ctx; /* Check the security state when the exception was generated */ assert(get_interrupt_src_ss(flags) == NON_SECURE); #if IMF_READ_INTERRUPT_ID /* Check the security status of the interrupt */ assert(plat_ic_get_interrupt_type(id) == INTR_TYPE_S_EL1); #endif /* Sanity check the pointer to this cpu's context */ mpidr = read_mpidr(); assert(handle == cm_get_context(NON_SECURE)); /* Save the non-secure context before entering the TSP */ cm_el1_sysregs_context_save(NON_SECURE); /* Get a reference to this cpu's TSP context */ linear_id = platform_get_core_pos(mpidr); tsp_ctx = &tspd_sp_context[linear_id]; assert(&tsp_ctx->cpu_ctx == cm_get_context(SECURE)); /* * Determine if the TSP was previously preempted. Its last known * context has to be preserved in this case. * The TSP should return control to the TSPD after handling this * FIQ. Preserve essential EL3 context to allow entry into the * TSP at the FIQ entry point using the 'cpu_context' structure. * There is no need to save the secure system register context * since the TSP is supposed to preserve it during S-EL1 interrupt * handling. */ if (get_std_smc_active_flag(tsp_ctx->state)) { tsp_ctx->saved_spsr_el3 = SMC_GET_EL3(&tsp_ctx->cpu_ctx, CTX_SPSR_EL3); tsp_ctx->saved_elr_el3 = SMC_GET_EL3(&tsp_ctx->cpu_ctx, CTX_ELR_EL3); } cm_el1_sysregs_context_restore(SECURE); cm_set_elr_spsr_el3(SECURE, (uint64_t) &tsp_vectors->fiq_entry, SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS)); cm_set_next_eret_context(SECURE); /* * Tell the TSP that it has to handle an FIQ synchronously. Also the * instruction in normal world where the interrupt was generated is * passed for debugging purposes. It is safe to retrieve this address * from ELR_EL3 as the secure context will not take effect until * el3_exit(). */ SMC_RET2(&tsp_ctx->cpu_ctx, TSP_HANDLE_FIQ_AND_RETURN, read_elr_el3()); } /******************************************************************************* * Secure Payload Dispatcher setup. The SPD finds out the SP entrypoint and type * (aarch32/aarch64) if not already known and initialises the context for entry * into the SP for its initialisation. ******************************************************************************/ int32_t tspd_setup(void) { entry_point_info_t *tsp_ep_info; uint64_t mpidr = read_mpidr(); uint32_t linear_id; linear_id = platform_get_core_pos(mpidr); /* * Get information about the Secure Payload (BL32) image. Its * absence is a critical failure. TODO: Add support to * conditionally include the SPD service */ tsp_ep_info = bl31_plat_get_next_image_ep_info(SECURE); if (!tsp_ep_info) { WARN("No TSP provided by BL2 boot loader, Booting device" " without TSP initialization. SMC`s destined for TSP" " will return SMC_UNK\n"); return 1; } /* * If there's no valid entry point for SP, we return a non-zero value * signalling failure initializing the service. We bail out without * registering any handlers */ if (!tsp_ep_info->pc) return 1; /* * We could inspect the SP image and determine it's execution * state i.e whether AArch32 or AArch64. Assuming it's AArch64 * for the time being. */ tspd_init_tsp_ep_state(tsp_ep_info, TSP_AARCH64, tsp_ep_info->pc, &tspd_sp_context[linear_id]); #if TSP_INIT_ASYNC bl31_set_next_image_type(SECURE); #else /* * All TSPD initialization done. Now register our init function with * BL31 for deferred invocation */ bl31_register_bl32_init(&tspd_init); #endif return 0; } /******************************************************************************* * This function passes control to the Secure Payload image (BL32) for the first * time on the primary cpu after a cold boot. It assumes that a valid secure * context has already been created by tspd_setup() which can be directly used. * It also assumes that a valid non-secure context has been initialised by PSCI * so it does not need to save and restore any non-secure state. This function * performs a synchronous entry into the Secure payload. The SP passes control * back to this routine through a SMC. ******************************************************************************/ int32_t tspd_init(void) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; entry_point_info_t *tsp_entry_point; uint64_t rc; /* * Get information about the Secure Payload (BL32) image. Its * absence is a critical failure. */ tsp_entry_point = bl31_plat_get_next_image_ep_info(SECURE); assert(tsp_entry_point); cm_init_context(mpidr, tsp_entry_point); /* * Arrange for an entry into the test secure payload. It will be * returned via TSP_ENTRY_DONE case */ rc = tspd_synchronous_sp_entry(tsp_ctx); assert(rc != 0); return rc; } /******************************************************************************* * This function is responsible for handling all SMCs in the Trusted OS/App * range from the non-secure state as defined in the SMC Calling Convention * Document. It is also responsible for communicating with the Secure payload * to delegate work and return results back to the non-secure state. Lastly it * will also return any information that the secure payload needs to do the * work assigned to it. ******************************************************************************/ uint64_t tspd_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { cpu_context_t *ns_cpu_context; unsigned long mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr), ns; tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; uint64_t rc; #if TSP_INIT_ASYNC entry_point_info_t *next_image_info; #endif WARN("tspd_smc_handler call\n"); /* Determine which security state this SMC originated from */ ns = is_caller_non_secure(flags); switch (smc_fid) { /* * This function ID is used by TSP to indicate that it was * preempted by a normal world IRQ. * */ case TSP_PREEMPTED: if (ns) SMC_RET1(handle, SMC_UNK); assert(handle == cm_get_context(SECURE)); cm_el1_sysregs_context_save(SECURE); /* Get a reference to the non-secure context */ ns_cpu_context = cm_get_context(NON_SECURE); assert(ns_cpu_context); /* * Restore non-secure state. There is no need to save the * secure system register context since the TSP was supposed * to preserve it during S-EL1 interrupt handling. */ cm_el1_sysregs_context_restore(NON_SECURE); cm_set_next_eret_context(NON_SECURE); SMC_RET1(ns_cpu_context, SMC_PREEMPTED); /* * This function ID is used only by the TSP to indicate that it has * finished handling a S-EL1 FIQ interrupt. Execution should resume * in the normal world. */ case TSP_HANDLED_S_EL1_FIQ: if (ns) SMC_RET1(handle, SMC_UNK); assert(handle == cm_get_context(SECURE)); /* * Restore the relevant EL3 state which saved to service * this SMC. */ if (get_std_smc_active_flag(tsp_ctx->state)) { SMC_SET_EL3(&tsp_ctx->cpu_ctx, CTX_SPSR_EL3, tsp_ctx->saved_spsr_el3); SMC_SET_EL3(&tsp_ctx->cpu_ctx, CTX_ELR_EL3, tsp_ctx->saved_elr_el3); } /* Get a reference to the non-secure context */ ns_cpu_context = cm_get_context(NON_SECURE); assert(ns_cpu_context); /* * Restore non-secure state. There is no need to save the * secure system register context since the TSP was supposed * to preserve it during S-EL1 interrupt handling. */ cm_el1_sysregs_context_restore(NON_SECURE); cm_set_next_eret_context(NON_SECURE); SMC_RET0((uint64_t) ns_cpu_context); /* * This function ID is used only by the TSP to indicate that it was * interrupted due to a EL3 FIQ interrupt. Execution should resume * in the normal world. */ case TSP_EL3_FIQ: if (ns) SMC_RET1(handle, SMC_UNK); assert(handle == cm_get_context(SECURE)); /* Assert that standard SMC execution has been preempted */ assert(get_std_smc_active_flag(tsp_ctx->state)); /* Save the secure system register state */ cm_el1_sysregs_context_save(SECURE); /* Get a reference to the non-secure context */ ns_cpu_context = cm_get_context(NON_SECURE); assert(ns_cpu_context); /* Restore non-secure state */ cm_el1_sysregs_context_restore(NON_SECURE); cm_set_next_eret_context(NON_SECURE); SMC_RET1(ns_cpu_context, TSP_EL3_FIQ); /* * This function ID is used only by the SP to indicate it has * finished initialising itself after a cold boot */ case TSP_ENTRY_DONE: WARN("tspd_smc_handler call:TSP_ENTRY_DONE\n"); if (ns) SMC_RET1(handle, SMC_UNK); /* * Stash the SP entry points information. This is done * only once on the primary cpu */ assert(tsp_vectors == NULL); tsp_vectors = (tsp_vectors_t *) x1; if (tsp_vectors) { set_tsp_pstate(tsp_ctx->state, TSP_PSTATE_ON); /* * TSP has been successfully initialized. Register power * managemnt hooks with PSCI */ psci_register_spd_pm_hook(&tspd_pm); /* * Register an interrupt handler for S-EL1 interrupts * when generated during code executing in the * non-secure state. */ flags = 0; set_interrupt_rm_flag(flags, NON_SECURE); rc = register_interrupt_type_handler(INTR_TYPE_S_EL1, tspd_sel1_interrupt_handler, flags); if (rc) panic(); } #if TSP_INIT_ASYNC /* Save the Secure EL1 system register context */ assert(cm_get_context(SECURE) == &tsp_ctx->cpu_ctx); cm_el1_sysregs_context_save(SECURE); /* Program EL3 registers to enable entry into the next EL */ next_image_info = bl31_plat_get_next_image_ep_info(NON_SECURE); assert(next_image_info); assert(NON_SECURE == GET_SECURITY_STATE(next_image_info->h.attr)); cm_init_context(read_mpidr_el1(), next_image_info); cm_prepare_el3_exit(NON_SECURE); SMC_RET0(cm_get_context(NON_SECURE)); #else /* * SP reports completion. The SPD must have initiated * the original request through a synchronous entry * into the SP. Jump back to the original C runtime * context. */ tspd_synchronous_sp_exit(tsp_ctx, x1); #endif /* * These function IDs is used only by the SP to indicate it has * finished: * 1. turning itself on in response to an earlier psci * cpu_on request * 2. resuming itself after an earlier psci cpu_suspend * request. */ case TSP_ON_DONE: case TSP_RESUME_DONE: /* * These function IDs is used only by the SP to indicate it has * finished: * 1. suspending itself after an earlier psci cpu_suspend * request. * 2. turning itself off in response to an earlier psci * cpu_off request. */ case TSP_OFF_DONE: case TSP_SUSPEND_DONE: case TSP_SYSTEM_OFF_DONE: case TSP_SYSTEM_RESET_DONE: if (ns) SMC_RET1(handle, SMC_UNK); /* * SP reports completion. The SPD must have initiated the * original request through a synchronous entry into the SP. * Jump back to the original C runtime context, and pass x1 as * return value to the caller */ tspd_synchronous_sp_exit(tsp_ctx, x1); /* * Request from non-secure client to perform an * arithmetic operation or response from secure * payload to an earlier request. */ case TSP_FAST_FID(TSP_ADD): case TSP_FAST_FID(TSP_SUB): case TSP_FAST_FID(TSP_MUL): case TSP_FAST_FID(TSP_DIV): case TSP_STD_FID(TSP_ADD): case TSP_STD_FID(TSP_SUB): case TSP_STD_FID(TSP_MUL): case TSP_STD_FID(TSP_DIV): if (ns) { /* * This is a fresh request from the non-secure client. * The parameters are in x1 and x2. Figure out which * registers need to be preserved, save the non-secure * state and send the request to the secure payload. */ assert(handle == cm_get_context(NON_SECURE)); /* Check if we are already preempted */ if (get_std_smc_active_flag(tsp_ctx->state)) SMC_RET1(handle, SMC_UNK); cm_el1_sysregs_context_save(NON_SECURE); /* Save x1 and x2 for use by TSP_GET_ARGS call below */ store_tsp_args(tsp_ctx, x1, x2); /* * We are done stashing the non-secure context. Ask the * secure payload to do the work now. */ /* * Verify if there is a valid context to use, copy the * operation type and parameters to the secure context * and jump to the fast smc entry point in the secure * payload. Entry into S-EL1 will take place upon exit * from this function. */ assert(&tsp_ctx->cpu_ctx == cm_get_context(SECURE)); /* Set appropriate entry for SMC. * We expect the TSP to manage the PSTATE.I and PSTATE.F * flags as appropriate. */ if (GET_SMC_TYPE(smc_fid) == SMC_TYPE_FAST) { cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->fast_smc_entry); } else { set_std_smc_active_flag(tsp_ctx->state); cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->std_smc_entry); } cm_el1_sysregs_context_restore(SECURE); cm_set_next_eret_context(SECURE); SMC_RET3(&tsp_ctx->cpu_ctx, smc_fid, x1, x2); } else { /* * This is the result from the secure client of an * earlier request. The results are in x1-x3. Copy it * into the non-secure context, save the secure state * and return to the non-secure state. */ assert(handle == cm_get_context(SECURE)); cm_el1_sysregs_context_save(SECURE); /* Get a reference to the non-secure context */ ns_cpu_context = cm_get_context(NON_SECURE); assert(ns_cpu_context); /* Restore non-secure state */ cm_el1_sysregs_context_restore(NON_SECURE); cm_set_next_eret_context(NON_SECURE); if (GET_SMC_TYPE(smc_fid) == SMC_TYPE_STD) clr_std_smc_active_flag(tsp_ctx->state); SMC_RET3(ns_cpu_context, x1, x2, x3); } break; /* * Request from non secure world to resume the preempted * Standard SMC call. */ case TSP_FID_RESUME: /* RESUME should be invoked only by normal world */ if (!ns) { assert(0); break; } /* * This is a resume request from the non-secure client. * save the non-secure state and send the request to * the secure payload. */ assert(handle == cm_get_context(NON_SECURE)); /* Check if we are already preempted before resume */ if (!get_std_smc_active_flag(tsp_ctx->state)) SMC_RET1(handle, SMC_UNK); cm_el1_sysregs_context_save(NON_SECURE); /* * We are done stashing the non-secure context. Ask the * secure payload to do the work now. */ /* We just need to return to the preempted point in * TSP and the execution will resume as normal. */ cm_el1_sysregs_context_restore(SECURE); cm_set_next_eret_context(SECURE); SMC_RET0(&tsp_ctx->cpu_ctx); /* * This is a request from the secure payload for more arguments * for an ongoing arithmetic operation requested by the * non-secure world. Simply return the arguments from the non- * secure client in the original call. */ case TSP_GET_ARGS: if (ns) SMC_RET1(handle, SMC_UNK); get_tsp_args(tsp_ctx, x1, x2); SMC_RET2(handle, x1, x2); case TOS_CALL_COUNT: /* * Return the number of service function IDs implemented to * provide service to non-secure */ SMC_RET1(handle, TSP_NUM_FID); case TOS_UID: /* Return TSP UID to the caller */ SMC_UUID_RET(handle, tsp_uuid); case TOS_CALL_VERSION: /* Return the version of current implementation */ SMC_RET2(handle, TSP_VERSION_MAJOR, TSP_VERSION_MINOR); default: break; } SMC_RET1(handle, SMC_UNK); } /* Define a SPD runtime service descriptor for fast SMC calls */ DECLARE_RT_SVC( tspd_fast, OEN_TOS_START, OEN_TOS_END, SMC_TYPE_FAST, tspd_setup, tspd_smc_handler ); /* Define a SPD runtime service descriptor for standard SMC calls */ DECLARE_RT_SVC( tspd_std, OEN_TOS_START, OEN_TOS_END, SMC_TYPE_STD, NULL, tspd_smc_handler ); arm-trusted-firmware-1.0-aw-6/services/spd/tspd/tspd_pm.c000066400000000000000000000222131322600646200234010ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "tspd_private.h" /******************************************************************************* * The target cpu is being turned on. Allow the TSPD/TSP to perform any actions * needed. Nothing at the moment. ******************************************************************************/ static void tspd_cpu_on_handler(uint64_t target_cpu) { } /******************************************************************************* * This cpu is being turned off. Allow the TSPD/TSP to perform any actions * needed ******************************************************************************/ static int32_t tspd_cpu_off_handler(uint64_t cookie) { int32_t rc = 0; uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_ON); /* Program the entry point and enter the TSP */ cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->cpu_off_entry); rc = tspd_synchronous_sp_entry(tsp_ctx); /* * Read the response from the TSP. A non-zero return means that * something went wrong while communicating with the TSP. */ if (rc != 0) panic(); /* * Reset TSP's context for a fresh start when this cpu is turned on * subsequently. */ set_tsp_pstate(tsp_ctx->state, TSP_PSTATE_OFF); return 0; } /******************************************************************************* * This cpu is being suspended. S-EL1 state must have been saved in the * resident cpu (mpidr format) if it is a UP/UP migratable TSP. ******************************************************************************/ static void tspd_cpu_suspend_handler(uint64_t power_state) { int32_t rc = 0; uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_ON); /* Program the entry point, power_state parameter and enter the TSP */ write_ctx_reg(get_gpregs_ctx(&tsp_ctx->cpu_ctx), CTX_GPREG_X0, power_state); cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->cpu_suspend_entry); rc = tspd_synchronous_sp_entry(tsp_ctx); /* * Read the response from the TSP. A non-zero return means that * something went wrong while communicating with the TSP. */ if (rc != 0) panic(); /* Update its context to reflect the state the TSP is in */ set_tsp_pstate(tsp_ctx->state, TSP_PSTATE_SUSPEND); } /******************************************************************************* * This cpu has been turned on. Enter the TSP to initialise S-EL1 and other bits * before passing control back to the Secure Monitor. Entry in S-El1 is done * after initialising minimal architectural state that guarantees safe * execution. ******************************************************************************/ static void tspd_cpu_on_finish_handler(uint64_t cookie) { int32_t rc = 0; uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; entry_point_info_t tsp_on_entrypoint; assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_OFF); tspd_init_tsp_ep_state(&tsp_on_entrypoint, TSP_AARCH64, (uint64_t) &tsp_vectors->cpu_on_entry, tsp_ctx); /* Initialise this cpu's secure context */ cm_init_context(mpidr, &tsp_on_entrypoint); /* Enter the TSP */ rc = tspd_synchronous_sp_entry(tsp_ctx); /* * Read the response from the TSP. A non-zero return means that * something went wrong while communicating with the SP. */ if (rc != 0) panic(); /* Update its context to reflect the state the SP is in */ set_tsp_pstate(tsp_ctx->state, TSP_PSTATE_ON); } /******************************************************************************* * This cpu has resumed from suspend. The SPD saved the TSP context when it * completed the preceding suspend call. Use that context to program an entry * into the TSP to allow it to do any remaining book keeping ******************************************************************************/ static void tspd_cpu_suspend_finish_handler(uint64_t suspend_level) { int32_t rc = 0; uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_SUSPEND); /* Program the entry point, suspend_level and enter the SP */ write_ctx_reg(get_gpregs_ctx(&tsp_ctx->cpu_ctx), CTX_GPREG_X0, suspend_level); cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->cpu_resume_entry); rc = tspd_synchronous_sp_entry(tsp_ctx); /* * Read the response from the TSP. A non-zero return means that * something went wrong while communicating with the TSP. */ if (rc != 0) panic(); /* Update its context to reflect the state the SP is in */ set_tsp_pstate(tsp_ctx->state, TSP_PSTATE_ON); } /******************************************************************************* * Return the type of TSP the TSPD is dealing with. Report the current resident * cpu (mpidr format) if it is a UP/UP migratable TSP. ******************************************************************************/ static int32_t tspd_cpu_migrate_info(uint64_t *resident_cpu) { return TSP_MIGRATE_INFO; } /******************************************************************************* * System is about to be switched off. Allow the TSPD/TSP to perform * any actions needed. ******************************************************************************/ static void tspd_system_off(void) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_ON); /* Program the entry point */ cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->system_off_entry); /* Enter the TSP. We do not care about the return value because we * must continue the shutdown anyway */ tspd_synchronous_sp_entry(tsp_ctx); } /******************************************************************************* * System is about to be reset. Allow the TSPD/TSP to perform * any actions needed. ******************************************************************************/ static void tspd_system_reset(void) { uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_ON); /* Program the entry point */ cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->system_reset_entry); /* Enter the TSP. We do not care about the return value because we * must continue the reset anyway */ tspd_synchronous_sp_entry(tsp_ctx); } /******************************************************************************* * Structure populated by the TSP Dispatcher to be given a chance to perform any * TSP bookkeeping before PSCI executes a power mgmt. operation. ******************************************************************************/ const spd_pm_ops_t tspd_pm = { .svc_on = tspd_cpu_on_handler, .svc_off = tspd_cpu_off_handler, .svc_suspend = tspd_cpu_suspend_handler, .svc_on_finish = tspd_cpu_on_finish_handler, .svc_suspend_finish = tspd_cpu_suspend_finish_handler, .svc_migrate = NULL, .svc_migrate_info = tspd_cpu_migrate_info, .svc_system_off = tspd_system_off, .svc_system_reset = tspd_system_reset }; arm-trusted-firmware-1.0-aw-6/services/spd/tspd/tspd_private.h000066400000000000000000000210271322600646200244460ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __TSPD_PRIVATE_H__ #define __TSPD_PRIVATE_H__ #include #include #include #include #include /******************************************************************************* * Secure Payload PM state information e.g. SP is suspended, uninitialised etc * and macros to access the state information in the per-cpu 'state' flags ******************************************************************************/ #define TSP_PSTATE_OFF 0 #define TSP_PSTATE_ON 1 #define TSP_PSTATE_SUSPEND 2 #define TSP_PSTATE_SHIFT 0 #define TSP_PSTATE_MASK 0x3 #define get_tsp_pstate(state) ((state >> TSP_PSTATE_SHIFT) & TSP_PSTATE_MASK) #define clr_tsp_pstate(state) (state &= ~(TSP_PSTATE_MASK \ << TSP_PSTATE_SHIFT)) #define set_tsp_pstate(st, pst) do { \ clr_tsp_pstate(st); \ st |= (pst & TSP_PSTATE_MASK) << \ TSP_PSTATE_SHIFT; \ } while (0); /* * This flag is used by the TSPD to determine if the TSP is servicing a standard * SMC request prior to programming the next entry into the TSP e.g. if TSP * execution is preempted by a non-secure interrupt and handed control to the * normal world. If another request which is distinct from what the TSP was * previously doing arrives, then this flag will be help the TSPD to either * reject the new request or service it while ensuring that the previous context * is not corrupted. */ #define STD_SMC_ACTIVE_FLAG_SHIFT 2 #define STD_SMC_ACTIVE_FLAG_MASK 1 #define get_std_smc_active_flag(state) ((state >> STD_SMC_ACTIVE_FLAG_SHIFT) \ & STD_SMC_ACTIVE_FLAG_MASK) #define set_std_smc_active_flag(state) (state |= \ 1 << STD_SMC_ACTIVE_FLAG_SHIFT) #define clr_std_smc_active_flag(state) (state &= \ ~(STD_SMC_ACTIVE_FLAG_MASK \ << STD_SMC_ACTIVE_FLAG_SHIFT)) /******************************************************************************* * Secure Payload execution state information i.e. aarch32 or aarch64 ******************************************************************************/ #define TSP_AARCH32 MODE_RW_32 #define TSP_AARCH64 MODE_RW_64 /******************************************************************************* * The SPD should know the type of Secure Payload. ******************************************************************************/ #define TSP_TYPE_UP PSCI_TOS_NOT_UP_MIG_CAP #define TSP_TYPE_UPM PSCI_TOS_UP_MIG_CAP #define TSP_TYPE_MP PSCI_TOS_NOT_PRESENT_MP /******************************************************************************* * Secure Payload migrate type information as known to the SPD. We assume that * the SPD is dealing with an MP Secure Payload. ******************************************************************************/ #define TSP_MIGRATE_INFO TSP_TYPE_MP /******************************************************************************* * Number of cpus that the present on this platform. TODO: Rely on a topology * tree to determine this in the future to avoid assumptions about mpidr * allocation ******************************************************************************/ #define TSPD_CORE_COUNT PLATFORM_CORE_COUNT /******************************************************************************* * Constants that allow assembler code to preserve callee-saved registers of the * C runtime context while performing a security state switch. ******************************************************************************/ #define TSPD_C_RT_CTX_X19 0x0 #define TSPD_C_RT_CTX_X20 0x8 #define TSPD_C_RT_CTX_X21 0x10 #define TSPD_C_RT_CTX_X22 0x18 #define TSPD_C_RT_CTX_X23 0x20 #define TSPD_C_RT_CTX_X24 0x28 #define TSPD_C_RT_CTX_X25 0x30 #define TSPD_C_RT_CTX_X26 0x38 #define TSPD_C_RT_CTX_X27 0x40 #define TSPD_C_RT_CTX_X28 0x48 #define TSPD_C_RT_CTX_X29 0x50 #define TSPD_C_RT_CTX_X30 0x58 #define TSPD_C_RT_CTX_SIZE 0x60 #define TSPD_C_RT_CTX_ENTRIES (TSPD_C_RT_CTX_SIZE >> DWORD_SHIFT) #ifndef __ASSEMBLY__ #include #include /* * The number of arguments to save during a SMC call for TSP. * Currently only x1 and x2 are used by TSP. */ #define TSP_NUM_ARGS 0x2 /* AArch64 callee saved general purpose register context structure. */ DEFINE_REG_STRUCT(c_rt_regs, TSPD_C_RT_CTX_ENTRIES); /* * Compile time assertion to ensure that both the compiler and linker * have the same double word aligned view of the size of the C runtime * register context. */ CASSERT(TSPD_C_RT_CTX_SIZE == sizeof(c_rt_regs_t), \ assert_spd_c_rt_regs_size_mismatch); /******************************************************************************* * Structure which helps the SPD to maintain the per-cpu state of the SP. * 'saved_spsr_el3' - temporary copy to allow FIQ handling when the TSP has been * preempted. * 'saved_elr_el3' - temporary copy to allow FIQ handling when the TSP has been * preempted. * 'state' - collection of flags to track SP state e.g. on/off * 'mpidr' - mpidr to associate a context with a cpu * 'c_rt_ctx' - stack address to restore C runtime context from after * returning from a synchronous entry into the SP. * 'cpu_ctx' - space to maintain SP architectural state * 'saved_tsp_args' - space to store arguments for TSP arithmetic operations * which will queried using the TSP_GET_ARGS SMC by TSP. ******************************************************************************/ typedef struct tsp_context { uint64_t saved_elr_el3; uint32_t saved_spsr_el3; uint32_t state; uint64_t mpidr; uint64_t c_rt_ctx; cpu_context_t cpu_ctx; uint64_t saved_tsp_args[TSP_NUM_ARGS]; } tsp_context_t; /* Helper macros to store and retrieve tsp args from tsp_context */ #define store_tsp_args(tsp_ctx, x1, x2) do {\ tsp_ctx->saved_tsp_args[0] = x1;\ tsp_ctx->saved_tsp_args[1] = x2;\ } while (0) #define get_tsp_args(tsp_ctx, x1, x2) do {\ x1 = tsp_ctx->saved_tsp_args[0];\ x2 = tsp_ctx->saved_tsp_args[1];\ } while (0) /* TSPD power management handlers */ extern const spd_pm_ops_t tspd_pm; /******************************************************************************* * Forward declarations ******************************************************************************/ struct tsp_vectors; /******************************************************************************* * Function & Data prototypes ******************************************************************************/ uint64_t tspd_enter_sp(uint64_t *c_rt_ctx); void __dead2 tspd_exit_sp(uint64_t c_rt_ctx, uint64_t ret); uint64_t tspd_synchronous_sp_entry(tsp_context_t *tsp_ctx); void __dead2 tspd_synchronous_sp_exit(tsp_context_t *tsp_ctx, uint64_t ret); void tspd_init_tsp_ep_state(struct entry_point_info *tsp_ep, uint32_t rw, uint64_t pc, tsp_context_t *tsp_ctx); extern tsp_context_t tspd_sp_context[TSPD_CORE_COUNT]; extern struct tsp_vectors *tsp_vectors; #endif /*__ASSEMBLY__*/ #endif /* __TSPD_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/services/std_svc/000077500000000000000000000000001322600646200214745ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/000077500000000000000000000000001322600646200224325ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_afflvl_off.c000066400000000000000000000210141322600646200257160ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "psci_private.h" typedef int (*afflvl_off_handler_t)(aff_map_node_t *); /******************************************************************************* * The next three functions implement a handler for each supported affinity * level which is called when that affinity level is turned off. ******************************************************************************/ static int psci_afflvl0_off(aff_map_node_t *cpu_node) { int rc; assert(cpu_node->level == MPIDR_AFFLVL0); /* * Generic management: Get the index for clearing any lingering re-entry * information and allow the secure world to switch itself off */ /* * Call the cpu off handler registered by the Secure Payload Dispatcher * to let it do any bookeeping. Assume that the SPD always reports an * E_DENIED error if SP refuse to power down */ if (psci_spd_pm && psci_spd_pm->svc_off) { rc = psci_spd_pm->svc_off(0); if (rc) return rc; } /* * Arch. management. Perform the necessary steps to flush all * cpu caches. */ psci_do_pwrdown_cache_maintenance(MPIDR_AFFLVL0); if (!psci_plat_pm_ops->affinst_off) return PSCI_E_SUCCESS; /* * Plat. management: Perform platform specific actions to turn this * cpu off e.g. exit cpu coherency, program the power controller etc. */ return psci_plat_pm_ops->affinst_off(read_mpidr_el1(), cpu_node->level, psci_get_phys_state(cpu_node)); } static int psci_afflvl1_off(aff_map_node_t *cluster_node) { /* Sanity check the cluster level */ assert(cluster_node->level == MPIDR_AFFLVL1); /* * Arch. Management. Flush all levels of caches to PoC if * the cluster is to be shutdown. */ psci_do_pwrdown_cache_maintenance(MPIDR_AFFLVL1); if (!psci_plat_pm_ops->affinst_off) return PSCI_E_SUCCESS; /* * Plat. Management. Allow the platform to do its cluster * specific bookeeping e.g. turn off interconnect coherency, * program the power controller etc. */ return psci_plat_pm_ops->affinst_off(read_mpidr_el1(), cluster_node->level, psci_get_phys_state(cluster_node)); } static int psci_afflvl2_off(aff_map_node_t *system_node) { /* Cannot go beyond this level */ assert(system_node->level == MPIDR_AFFLVL2); /* * Keep the physical state of the system handy to decide what * action needs to be taken */ /* * Arch. Management. Flush all levels of caches to PoC if * the system is to be shutdown. */ psci_do_pwrdown_cache_maintenance(MPIDR_AFFLVL2); if (!psci_plat_pm_ops->affinst_off) return PSCI_E_SUCCESS; /* * Plat. Management : Allow the platform to do its bookeeping * at this affinity level */ return psci_plat_pm_ops->affinst_off(read_mpidr_el1(), system_node->level, psci_get_phys_state(system_node)); } static const afflvl_off_handler_t psci_afflvl_off_handlers[] = { psci_afflvl0_off, psci_afflvl1_off, psci_afflvl2_off, }; /******************************************************************************* * This function takes an array of pointers to affinity instance nodes in the * topology tree and calls the off handler for the corresponding affinity * levels ******************************************************************************/ static int psci_call_off_handlers(aff_map_node_t *mpidr_nodes[], int start_afflvl, int end_afflvl) { int rc = PSCI_E_INVALID_PARAMS, level; aff_map_node_t *node; for (level = start_afflvl; level <= end_afflvl; level++) { node = mpidr_nodes[level]; if (node == NULL) continue; /* * TODO: In case of an error should there be a way * of restoring what we might have torn down at * lower affinity levels. */ rc = psci_afflvl_off_handlers[level](node); if (rc != PSCI_E_SUCCESS) break; } return rc; } /******************************************************************************* * Top level handler which is called when a cpu wants to power itself down. * It's assumed that along with turning the cpu off, higher affinity levels will * be turned off as far as possible. It traverses through all the affinity * levels performing generic, architectural, platform setup and state management * e.g. for a cluster that's to be powered off, it will call the platform * specific code which will disable coherency at the interconnect level if the * cpu is the last in the cluster. For a cpu it could mean programming the power * the power controller etc. * * The state of all the relevant affinity levels is changed prior to calling the * affinity level specific handlers as their actions would depend upon the state * the affinity level is about to enter. * * The affinity level specific handlers are called in ascending order i.e. from * the lowest to the highest affinity level implemented by the platform because * to turn off affinity level X it is neccesary to turn off affinity level X - 1 * first. ******************************************************************************/ int psci_afflvl_off(int start_afflvl, int end_afflvl) { int rc = PSCI_E_SUCCESS; mpidr_aff_map_nodes_t mpidr_nodes; unsigned int max_phys_off_afflvl; /* * Collect the pointers to the nodes in the topology tree for * each affinity instance in the mpidr. If this function does * not return successfully then either the mpidr or the affinity * levels are incorrect. In either case, we cannot return back * to the caller as it would not know what to do. */ rc = psci_get_aff_map_nodes(read_mpidr_el1() & MPIDR_AFFINITY_MASK, start_afflvl, end_afflvl, mpidr_nodes); assert (rc == PSCI_E_SUCCESS); /* * This function acquires the lock corresponding to each affinity * level so that by the time all locks are taken, the system topology * is snapshot and state management can be done safely. */ psci_acquire_afflvl_locks(start_afflvl, end_afflvl, mpidr_nodes); /* * This function updates the state of each affinity instance * corresponding to the mpidr in the range of affinity levels * specified. */ psci_do_afflvl_state_mgmt(start_afflvl, end_afflvl, mpidr_nodes, PSCI_STATE_OFF); max_phys_off_afflvl = psci_find_max_phys_off_afflvl(start_afflvl, end_afflvl, mpidr_nodes); assert(max_phys_off_afflvl != PSCI_INVALID_DATA); /* Stash the highest affinity level that will enter the OFF state. */ psci_set_max_phys_off_afflvl(max_phys_off_afflvl); /* Perform generic, architecture and platform specific handling */ rc = psci_call_off_handlers(mpidr_nodes, start_afflvl, end_afflvl); /* * Invalidate the entry for the highest affinity level stashed earlier. * This ensures that any reads of this variable outside the power * up/down sequences return PSCI_INVALID_DATA. * */ psci_set_max_phys_off_afflvl(PSCI_INVALID_DATA); /* * Release the locks corresponding to each affinity level in the * reverse order to which they were acquired. */ psci_release_afflvl_locks(start_afflvl, end_afflvl, mpidr_nodes); return rc; } arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_afflvl_on.c000066400000000000000000000341441322600646200255700ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "psci_private.h" typedef int (*afflvl_on_handler_t)(unsigned long, aff_map_node_t *, unsigned long, unsigned long); /******************************************************************************* * This function checks whether a cpu which has been requested to be turned on * is OFF to begin with. ******************************************************************************/ static int cpu_on_validate_state(aff_map_node_t *node) { unsigned int psci_state; /* Get the raw psci state */ psci_state = psci_get_state(node); if (psci_state == PSCI_STATE_ON || psci_state == PSCI_STATE_SUSPEND) return PSCI_E_ALREADY_ON; if (psci_state == PSCI_STATE_ON_PENDING) return PSCI_E_ON_PENDING; assert(psci_state == PSCI_STATE_OFF); return PSCI_E_SUCCESS; } /******************************************************************************* * Handler routine to turn a cpu on. It takes care of any generic, architectural * or platform specific setup required. * TODO: Split this code across separate handlers for each type of setup? ******************************************************************************/ static int psci_afflvl0_on(unsigned long target_cpu, aff_map_node_t *cpu_node, unsigned long ns_entrypoint, unsigned long context_id) { unsigned long psci_entrypoint; uint32_t ns_scr_el3 = read_scr_el3(); uint32_t ns_sctlr_el1 = read_sctlr_el1(); int rc; /* Sanity check to safeguard against data corruption */ assert(cpu_node->level == MPIDR_AFFLVL0); /* * Generic management: Ensure that the cpu is off to be * turned on */ rc = cpu_on_validate_state(cpu_node); if (rc != PSCI_E_SUCCESS) return rc; /* * Call the cpu on handler registered by the Secure Payload Dispatcher * to let it do any bookeeping. If the handler encounters an error, it's * expected to assert within */ if (psci_spd_pm && psci_spd_pm->svc_on) psci_spd_pm->svc_on(target_cpu); /* * Arch. management: Derive the re-entry information for * the non-secure world from the non-secure state from * where this call originated. */ rc = psci_save_ns_entry(target_cpu, ns_entrypoint, context_id, ns_scr_el3, ns_sctlr_el1); if (rc != PSCI_E_SUCCESS) return rc; /* Set the secure world (EL3) re-entry point after BL1 */ psci_entrypoint = (unsigned long) psci_aff_on_finish_entry; if (!psci_plat_pm_ops->affinst_on) return PSCI_E_SUCCESS; /* * Plat. management: Give the platform the current state * of the target cpu to allow it to perform the necessary * steps to power on. */ return psci_plat_pm_ops->affinst_on(target_cpu, psci_entrypoint, ns_entrypoint, cpu_node->level, psci_get_phys_state(cpu_node)); } /******************************************************************************* * Handler routine to turn a cluster on. It takes care or any generic, arch. * or platform specific setup required. * TODO: Split this code across separate handlers for each type of setup? ******************************************************************************/ static int psci_afflvl1_on(unsigned long target_cpu, aff_map_node_t *cluster_node, unsigned long ns_entrypoint, unsigned long context_id) { unsigned long psci_entrypoint; assert(cluster_node->level == MPIDR_AFFLVL1); /* * There is no generic and arch. specific cluster * management required */ /* State management: Is not required while turning a cluster on */ if (!psci_plat_pm_ops->affinst_on) return PSCI_E_SUCCESS; /* * Plat. management: Give the platform the current state * of the target cpu to allow it to perform the necessary * steps to power on. */ psci_entrypoint = (unsigned long) psci_aff_on_finish_entry; return psci_plat_pm_ops->affinst_on(target_cpu, psci_entrypoint, ns_entrypoint, cluster_node->level, psci_get_phys_state(cluster_node)); } /******************************************************************************* * Handler routine to turn a cluster of clusters on. It takes care or any * generic, arch. or platform specific setup required. * TODO: Split this code across separate handlers for each type of setup? ******************************************************************************/ static int psci_afflvl2_on(unsigned long target_cpu, aff_map_node_t *system_node, unsigned long ns_entrypoint, unsigned long context_id) { unsigned long psci_entrypoint; /* Cannot go beyond affinity level 2 in this psci imp. */ assert(system_node->level == MPIDR_AFFLVL2); /* * There is no generic and arch. specific system management * required */ /* State management: Is not required while turning a system on */ if (!psci_plat_pm_ops->affinst_on) return PSCI_E_SUCCESS; /* * Plat. management: Give the platform the current state * of the target cpu to allow it to perform the necessary * steps to power on. */ psci_entrypoint = (unsigned long) psci_aff_on_finish_entry; return psci_plat_pm_ops->affinst_on(target_cpu, psci_entrypoint, ns_entrypoint, system_node->level, psci_get_phys_state(system_node)); } /* Private data structure to make this handlers accessible through indexing */ static const afflvl_on_handler_t psci_afflvl_on_handlers[] = { psci_afflvl0_on, psci_afflvl1_on, psci_afflvl2_on, }; /******************************************************************************* * This function takes an array of pointers to affinity instance nodes in the * topology tree and calls the on handler for the corresponding affinity * levels ******************************************************************************/ static int psci_call_on_handlers(aff_map_node_t *target_cpu_nodes[], int start_afflvl, int end_afflvl, unsigned long target_cpu, unsigned long entrypoint, unsigned long context_id) { int rc = PSCI_E_INVALID_PARAMS, level; aff_map_node_t *node; for (level = end_afflvl; level >= start_afflvl; level--) { node = target_cpu_nodes[level]; if (node == NULL) continue; /* * TODO: In case of an error should there be a way * of undoing what we might have setup at higher * affinity levels. */ rc = psci_afflvl_on_handlers[level](target_cpu, node, entrypoint, context_id); if (rc != PSCI_E_SUCCESS) break; } return rc; } /******************************************************************************* * Generic handler which is called to physically power on a cpu identified by * its mpidr. It traverses through all the affinity levels performing generic, * architectural, platform setup and state management e.g. for a cpu that is * to be powered on, it will ensure that enough information is stashed for it * to resume execution in the non-secure security state. * * The state of all the relevant affinity levels is changed after calling the * affinity level specific handlers as their actions would depend upon the state * the affinity level is currently in. * * The affinity level specific handlers are called in descending order i.e. from * the highest to the lowest affinity level implemented by the platform because * to turn on affinity level X it is neccesary to turn on affinity level X + 1 * first. ******************************************************************************/ int psci_afflvl_on(unsigned long target_cpu, unsigned long entrypoint, unsigned long context_id, int start_afflvl, int end_afflvl) { int rc = PSCI_E_SUCCESS; mpidr_aff_map_nodes_t target_cpu_nodes; /* * Collect the pointers to the nodes in the topology tree for * each affinity instance in the mpidr. If this function does * not return successfully then either the mpidr or the affinity * levels are incorrect. */ rc = psci_get_aff_map_nodes(target_cpu, start_afflvl, end_afflvl, target_cpu_nodes); if (rc != PSCI_E_SUCCESS) return rc; /* * This function acquires the lock corresponding to each affinity * level so that by the time all locks are taken, the system topology * is snapshot and state management can be done safely. */ psci_acquire_afflvl_locks(start_afflvl, end_afflvl, target_cpu_nodes); /* Perform generic, architecture and platform specific handling. */ rc = psci_call_on_handlers(target_cpu_nodes, start_afflvl, end_afflvl, target_cpu, entrypoint, context_id); /* * This function updates the state of each affinity instance * corresponding to the mpidr in the range of affinity levels * specified. */ if (rc == PSCI_E_SUCCESS) psci_do_afflvl_state_mgmt(start_afflvl, end_afflvl, target_cpu_nodes, PSCI_STATE_ON_PENDING); /* * This loop releases the lock corresponding to each affinity level * in the reverse order to which they were acquired. */ psci_release_afflvl_locks(start_afflvl, end_afflvl, target_cpu_nodes); return rc; } /******************************************************************************* * The following functions finish an earlier affinity power on request. They * are called by the common finisher routine in psci_common.c. ******************************************************************************/ static unsigned int psci_afflvl0_on_finish(aff_map_node_t *cpu_node) { unsigned int plat_state, state, rc; assert(cpu_node->level == MPIDR_AFFLVL0); /* Ensure we have been explicitly woken up by another cpu */ state = psci_get_state(cpu_node); assert(state == PSCI_STATE_ON_PENDING); /* * Plat. management: Perform the platform specific actions * for this cpu e.g. enabling the gic or zeroing the mailbox * register. The actual state of this cpu has already been * changed. */ if (psci_plat_pm_ops->affinst_on_finish) { /* Get the physical state of this cpu */ plat_state = get_phys_state(state); rc = psci_plat_pm_ops->affinst_on_finish(read_mpidr_el1(), cpu_node->level, plat_state); assert(rc == PSCI_E_SUCCESS); } /* * Arch. management: Enable data cache and manage stack memory */ psci_do_pwrup_cache_maintenance(); /* * All the platform specific actions for turning this cpu * on have completed. Perform enough arch.initialization * to run in the non-secure address space. */ bl31_arch_setup(); /* * Call the cpu on finish handler registered by the Secure Payload * Dispatcher to let it do any bookeeping. If the handler encounters an * error, it's expected to assert within */ if (psci_spd_pm && psci_spd_pm->svc_on_finish) psci_spd_pm->svc_on_finish(0); /* * Generic management: Now we just need to retrieve the * information that we had stashed away during the cpu_on * call to set this cpu on its way. */ cm_prepare_el3_exit(NON_SECURE); /* Clean caches before re-entering normal world */ dcsw_op_louis(DCCSW); rc = PSCI_E_SUCCESS; return rc; } static unsigned int psci_afflvl1_on_finish(aff_map_node_t *cluster_node) { unsigned int plat_state; assert(cluster_node->level == MPIDR_AFFLVL1); if (!psci_plat_pm_ops->affinst_on_finish) return PSCI_E_SUCCESS; /* * Plat. management: Perform the platform specific actions * as per the old state of the cluster e.g. enabling * coherency at the interconnect depends upon the state with * which this cluster was powered up. If anything goes wrong * then assert as there is no way to recover from this * situation. */ plat_state = psci_get_phys_state(cluster_node); return psci_plat_pm_ops->affinst_on_finish(read_mpidr_el1(), cluster_node->level, plat_state); } static unsigned int psci_afflvl2_on_finish(aff_map_node_t *system_node) { unsigned int plat_state; /* Cannot go beyond this affinity level */ assert(system_node->level == MPIDR_AFFLVL2); if (!psci_plat_pm_ops->affinst_on_finish) return PSCI_E_SUCCESS; /* * Currently, there are no architectural actions to perform * at the system level. */ /* * Plat. management: Perform the platform specific actions * as per the old state of the cluster e.g. enabling * coherency at the interconnect depends upon the state with * which this cluster was powered up. If anything goes wrong * then assert as there is no way to recover from this * situation. */ plat_state = psci_get_phys_state(system_node); return psci_plat_pm_ops->affinst_on_finish(read_mpidr_el1(), system_node->level, plat_state); } const afflvl_power_on_finisher_t psci_afflvl_on_finishers[] = { psci_afflvl0_on_finish, psci_afflvl1_on_finish, psci_afflvl2_on_finish, }; arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_afflvl_suspend.c000066400000000000000000000423631322600646200266370ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "psci_private.h" typedef int (*afflvl_suspend_handler_t)(aff_map_node_t *, unsigned long, unsigned long, unsigned int); /******************************************************************************* * This function saves the power state parameter passed in the current PSCI * cpu_suspend call in the per-cpu data array. ******************************************************************************/ void psci_set_suspend_power_state(unsigned int power_state) { set_cpu_data(psci_svc_cpu_data.power_state, power_state); flush_cpu_data(psci_svc_cpu_data.power_state); } /******************************************************************************* * This function gets the affinity level till which the current cpu could be * powered down during a cpu_suspend call. Returns PSCI_INVALID_DATA if the * power state is invalid. ******************************************************************************/ int psci_get_suspend_afflvl() { unsigned int power_state; power_state = get_cpu_data(psci_svc_cpu_data.power_state); return ((power_state == PSCI_INVALID_DATA) ? power_state : psci_get_pstate_afflvl(power_state)); } /******************************************************************************* * This function gets the state id of the current cpu from the power state * parameter saved in the per-cpu data array. Returns PSCI_INVALID_DATA if the * power state saved is invalid. ******************************************************************************/ int psci_get_suspend_stateid() { unsigned int power_state; power_state = get_cpu_data(psci_svc_cpu_data.power_state); return ((power_state == PSCI_INVALID_DATA) ? power_state : psci_get_pstate_id(power_state)); } /******************************************************************************* * This function gets the state id of the cpu specified by the 'mpidr' parameter * from the power state parameter saved in the per-cpu data array. Returns * PSCI_INVALID_DATA if the power state saved is invalid. ******************************************************************************/ int psci_get_suspend_stateid_by_mpidr(unsigned long mpidr) { unsigned int power_state; power_state = get_cpu_data_by_mpidr(mpidr, psci_svc_cpu_data.power_state); return ((power_state == PSCI_INVALID_DATA) ? power_state : psci_get_pstate_id(power_state)); } /******************************************************************************* * The next three functions implement a handler for each supported affinity * level which is called when that affinity level is about to be suspended. ******************************************************************************/ static int psci_afflvl0_suspend(aff_map_node_t *cpu_node, unsigned long ns_entrypoint, unsigned long context_id, unsigned int power_state) { unsigned long psci_entrypoint; uint32_t ns_scr_el3 = read_scr_el3(); uint32_t ns_sctlr_el1 = read_sctlr_el1(); int rc; /* Sanity check to safeguard against data corruption */ assert(cpu_node->level == MPIDR_AFFLVL0); /* Save PSCI power state parameter for the core in suspend context */ psci_set_suspend_power_state(power_state); /* * Generic management: Store the re-entry information for the non-secure * world and allow the secure world to suspend itself */ /* * Call the cpu suspend handler registered by the Secure Payload * Dispatcher to let it do any bookeeping. If the handler encounters an * error, it's expected to assert within */ if (psci_spd_pm && psci_spd_pm->svc_suspend) psci_spd_pm->svc_suspend(power_state); /* * Generic management: Store the re-entry information for the * non-secure world */ rc = psci_save_ns_entry(read_mpidr_el1(), ns_entrypoint, context_id, ns_scr_el3, ns_sctlr_el1); if (rc != PSCI_E_SUCCESS) return rc; /* Set the secure world (EL3) re-entry point after BL1 */ psci_entrypoint = (unsigned long) psci_aff_suspend_finish_entry; /* * Arch. management. Perform the necessary steps to flush all * cpu caches. */ psci_do_pwrdown_cache_maintenance(MPIDR_AFFLVL0); if (!psci_plat_pm_ops->affinst_suspend) return PSCI_E_SUCCESS; /* * Plat. management: Allow the platform to perform the * necessary actions to turn off this cpu e.g. set the * platform defined mailbox with the psci entrypoint, * program the power controller etc. */ return psci_plat_pm_ops->affinst_suspend(read_mpidr_el1(), psci_entrypoint, ns_entrypoint, cpu_node->level, psci_get_phys_state(cpu_node)); } static int psci_afflvl1_suspend(aff_map_node_t *cluster_node, unsigned long ns_entrypoint, unsigned long context_id, unsigned int power_state) { unsigned int plat_state; unsigned long psci_entrypoint; /* Sanity check the cluster level */ assert(cluster_node->level == MPIDR_AFFLVL1); /* * Arch. management: Flush all levels of caches to PoC if the * cluster is to be shutdown. */ psci_do_pwrdown_cache_maintenance(MPIDR_AFFLVL1); if (!psci_plat_pm_ops->affinst_suspend) return PSCI_E_SUCCESS; /* * Plat. Management. Allow the platform to do its cluster specific * bookeeping e.g. turn off interconnect coherency, program the power * controller etc. Sending the psci entrypoint is currently redundant * beyond affinity level 0 but one never knows what a platform might * do. Also it allows us to keep the platform handler prototype the * same. */ plat_state = psci_get_phys_state(cluster_node); psci_entrypoint = (unsigned long) psci_aff_suspend_finish_entry; return psci_plat_pm_ops->affinst_suspend(read_mpidr_el1(), psci_entrypoint, ns_entrypoint, cluster_node->level, plat_state); } static int psci_afflvl2_suspend(aff_map_node_t *system_node, unsigned long ns_entrypoint, unsigned long context_id, unsigned int power_state) { unsigned int plat_state; unsigned long psci_entrypoint; /* Cannot go beyond this */ assert(system_node->level == MPIDR_AFFLVL2); /* * Keep the physical state of the system handy to decide what * action needs to be taken */ plat_state = psci_get_phys_state(system_node); /* * Arch. management: Flush all levels of caches to PoC if the * system is to be shutdown. */ psci_do_pwrdown_cache_maintenance(MPIDR_AFFLVL2); /* * Plat. Management : Allow the platform to do its bookeeping * at this affinity level */ if (!psci_plat_pm_ops->affinst_suspend) return PSCI_E_SUCCESS; /* * Sending the psci entrypoint is currently redundant * beyond affinity level 0 but one never knows what a * platform might do. Also it allows us to keep the * platform handler prototype the same. */ plat_state = psci_get_phys_state(system_node); psci_entrypoint = (unsigned long) psci_aff_suspend_finish_entry; return psci_plat_pm_ops->affinst_suspend(read_mpidr_el1(), psci_entrypoint, ns_entrypoint, system_node->level, plat_state); } static const afflvl_suspend_handler_t psci_afflvl_suspend_handlers[] = { psci_afflvl0_suspend, psci_afflvl1_suspend, psci_afflvl2_suspend, }; /******************************************************************************* * This function takes an array of pointers to affinity instance nodes in the * topology tree and calls the suspend handler for the corresponding affinity * levels ******************************************************************************/ static int psci_call_suspend_handlers(aff_map_node_t *mpidr_nodes[], int start_afflvl, int end_afflvl, unsigned long entrypoint, unsigned long context_id, unsigned int power_state) { int rc = PSCI_E_INVALID_PARAMS, level; aff_map_node_t *node; for (level = start_afflvl; level <= end_afflvl; level++) { node = mpidr_nodes[level]; if (node == NULL) continue; /* * TODO: In case of an error should there be a way * of restoring what we might have torn down at * lower affinity levels. */ rc = psci_afflvl_suspend_handlers[level](node, entrypoint, context_id, power_state); if (rc != PSCI_E_SUCCESS) break; } return rc; } /******************************************************************************* * Top level handler which is called when a cpu wants to suspend its execution. * It is assumed that along with turning the cpu off, higher affinity levels * until the target affinity level will be turned off as well. It traverses * through all the affinity levels performing generic, architectural, platform * setup and state management e.g. for a cluster that's to be suspended, it will * call the platform specific code which will disable coherency at the * interconnect level if the cpu is the last in the cluster. For a cpu it could * mean programming the power controller etc. * * The state of all the relevant affinity levels is changed prior to calling the * affinity level specific handlers as their actions would depend upon the state * the affinity level is about to enter. * * The affinity level specific handlers are called in ascending order i.e. from * the lowest to the highest affinity level implemented by the platform because * to turn off affinity level X it is neccesary to turn off affinity level X - 1 * first. ******************************************************************************/ int psci_afflvl_suspend(unsigned long entrypoint, unsigned long context_id, unsigned int power_state, int start_afflvl, int end_afflvl) { int rc = PSCI_E_SUCCESS; mpidr_aff_map_nodes_t mpidr_nodes; unsigned int max_phys_off_afflvl; /* * Collect the pointers to the nodes in the topology tree for * each affinity instance in the mpidr. If this function does * not return successfully then either the mpidr or the affinity * levels are incorrect. */ rc = psci_get_aff_map_nodes(read_mpidr_el1() & MPIDR_AFFINITY_MASK, start_afflvl, end_afflvl, mpidr_nodes); if (rc != PSCI_E_SUCCESS) return rc; /* * This function acquires the lock corresponding to each affinity * level so that by the time all locks are taken, the system topology * is snapshot and state management can be done safely. */ psci_acquire_afflvl_locks(start_afflvl, end_afflvl, mpidr_nodes); /* * This function updates the state of each affinity instance * corresponding to the mpidr in the range of affinity levels * specified. */ psci_do_afflvl_state_mgmt(start_afflvl, end_afflvl, mpidr_nodes, PSCI_STATE_SUSPEND); max_phys_off_afflvl = psci_find_max_phys_off_afflvl(start_afflvl, end_afflvl, mpidr_nodes); assert(max_phys_off_afflvl != PSCI_INVALID_DATA); /* Stash the highest affinity level that will be turned off */ psci_set_max_phys_off_afflvl(max_phys_off_afflvl); /* Perform generic, architecture and platform specific handling */ rc = psci_call_suspend_handlers(mpidr_nodes, start_afflvl, end_afflvl, entrypoint, context_id, power_state); /* * Invalidate the entry for the highest affinity level stashed earlier. * This ensures that any reads of this variable outside the power * up/down sequences return PSCI_INVALID_DATA. */ psci_set_max_phys_off_afflvl(PSCI_INVALID_DATA); /* * Release the locks corresponding to each affinity level in the * reverse order to which they were acquired. */ psci_release_afflvl_locks(start_afflvl, end_afflvl, mpidr_nodes); return rc; } /******************************************************************************* * The following functions finish an earlier affinity suspend request. They * are called by the common finisher routine in psci_common.c. ******************************************************************************/ static unsigned int psci_afflvl0_suspend_finish(aff_map_node_t *cpu_node) { unsigned int plat_state, state, rc; int32_t suspend_level; uint64_t counter_freq; assert(cpu_node->level == MPIDR_AFFLVL0); /* Ensure we have been woken up from a suspended state */ state = psci_get_state(cpu_node); assert(state == PSCI_STATE_SUSPEND); /* * Plat. management: Perform the platform specific actions * before we change the state of the cpu e.g. enabling the * gic or zeroing the mailbox register. If anything goes * wrong then assert as there is no way to recover from this * situation. */ if (psci_plat_pm_ops->affinst_suspend_finish) { /* Get the physical state of this cpu */ plat_state = get_phys_state(state); rc = psci_plat_pm_ops->affinst_suspend_finish(read_mpidr_el1(), cpu_node->level, plat_state); assert(rc == PSCI_E_SUCCESS); } /* Get the index for restoring the re-entry information */ /* * Arch. management: Enable the data cache, manage stack memory and * restore the stashed EL3 architectural context from the 'cpu_context' * structure for this cpu. */ psci_do_pwrup_cache_maintenance(); /* Re-init the cntfrq_el0 register */ counter_freq = plat_get_syscnt_freq(); write_cntfrq_el0(counter_freq); /* * Call the cpu suspend finish handler registered by the Secure Payload * Dispatcher to let it do any bookeeping. If the handler encounters an * error, it's expected to assert within */ if (psci_spd_pm && psci_spd_pm->svc_suspend) { suspend_level = psci_get_suspend_afflvl(); assert (suspend_level != PSCI_INVALID_DATA); psci_spd_pm->svc_suspend_finish(suspend_level); } /* Invalidate the suspend context for the node */ psci_set_suspend_power_state(PSCI_INVALID_DATA); /* * Generic management: Now we just need to retrieve the * information that we had stashed away during the suspend * call to set this cpu on its way. */ cm_prepare_el3_exit(NON_SECURE); /* Clean caches before re-entering normal world */ dcsw_op_louis(DCCSW); rc = PSCI_E_SUCCESS; return rc; } static unsigned int psci_afflvl1_suspend_finish(aff_map_node_t *cluster_node) { unsigned int plat_state, rc = PSCI_E_SUCCESS; assert(cluster_node->level == MPIDR_AFFLVL1); /* * Plat. management: Perform the platform specific actions * as per the old state of the cluster e.g. enabling * coherency at the interconnect depends upon the state with * which this cluster was powered up. If anything goes wrong * then assert as there is no way to recover from this * situation. */ if (psci_plat_pm_ops->affinst_suspend_finish) { /* Get the physical state of this cpu */ plat_state = psci_get_phys_state(cluster_node); rc = psci_plat_pm_ops->affinst_suspend_finish(read_mpidr_el1(), cluster_node->level, plat_state); assert(rc == PSCI_E_SUCCESS); } return rc; } static unsigned int psci_afflvl2_suspend_finish(aff_map_node_t *system_node) { unsigned int plat_state, rc = PSCI_E_SUCCESS;; /* Cannot go beyond this affinity level */ assert(system_node->level == MPIDR_AFFLVL2); /* * Currently, there are no architectural actions to perform * at the system level. */ /* * Plat. management: Perform the platform specific actions * as per the old state of the cluster e.g. enabling * coherency at the interconnect depends upon the state with * which this cluster was powered up. If anything goes wrong * then assert as there is no way to recover from this * situation. */ if (psci_plat_pm_ops->affinst_suspend_finish) { /* Get the physical state of the system */ plat_state = psci_get_phys_state(system_node); rc = psci_plat_pm_ops->affinst_suspend_finish(read_mpidr_el1(), system_node->level, plat_state); assert(rc == PSCI_E_SUCCESS); } return rc; } const afflvl_power_on_finisher_t psci_afflvl_suspend_finishers[] = { psci_afflvl0_suspend_finish, psci_afflvl1_suspend_finish, psci_afflvl2_suspend_finish, }; arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_common.c000066400000000000000000000504071322600646200251120ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "psci_private.h" /* * SPD power management operations, expected to be supplied by the registered * SPD on successful SP initialization */ const spd_pm_ops_t *psci_spd_pm; /******************************************************************************* * Grand array that holds the platform's topology information for state * management of affinity instances. Each node (aff_map_node) in the array * corresponds to an affinity instance e.g. cluster, cpu within an mpidr ******************************************************************************/ aff_map_node_t psci_aff_map[PSCI_NUM_AFFS] __attribute__ ((section("tzfw_coherent_mem"))); /******************************************************************************* * Pointer to functions exported by the platform to complete power mgmt. ops ******************************************************************************/ const plat_pm_ops_t *psci_plat_pm_ops; /******************************************************************************* * This function is passed an array of pointers to affinity level nodes in the * topology tree for an mpidr. It iterates through the nodes to find the highest * affinity level which is marked as physically powered off. ******************************************************************************/ uint32_t psci_find_max_phys_off_afflvl(uint32_t start_afflvl, uint32_t end_afflvl, aff_map_node_t *mpidr_nodes[]) { uint32_t max_afflvl = PSCI_INVALID_DATA; for (; start_afflvl <= end_afflvl; start_afflvl++) { if (mpidr_nodes[start_afflvl] == NULL) continue; if (psci_get_phys_state(mpidr_nodes[start_afflvl]) == PSCI_STATE_OFF) max_afflvl = start_afflvl; } return max_afflvl; } /******************************************************************************* * This function saves the highest affinity level which is in OFF state. The * affinity instance with which the level is associated is determined by the * caller. ******************************************************************************/ void psci_set_max_phys_off_afflvl(uint32_t afflvl) { set_cpu_data(psci_svc_cpu_data.max_phys_off_afflvl, afflvl); /* * Ensure that the saved value is flushed to main memory and any * speculatively pre-fetched stale copies are invalidated from the * caches of other cpus in the same coherency domain. This ensures that * the value can be safely read irrespective of the state of the data * cache. */ flush_cpu_data(psci_svc_cpu_data.max_phys_off_afflvl); } /******************************************************************************* * This function reads the saved highest affinity level which is in OFF * state. The affinity instance with which the level is associated is determined * by the caller. ******************************************************************************/ uint32_t psci_get_max_phys_off_afflvl(void) { /* * Ensure that the last update of this value in this cpu's cache is * flushed to main memory and any speculatively pre-fetched stale copies * are invalidated from the caches of other cpus in the same coherency * domain. This ensures that the value is always read from the main * memory when it was written before the data cache was enabled. */ flush_cpu_data(psci_svc_cpu_data.max_phys_off_afflvl); return get_cpu_data(psci_svc_cpu_data.max_phys_off_afflvl); } /******************************************************************************* * Routine to return the maximum affinity level to traverse to after a cpu has * been physically powered up. It is expected to be called immediately after * reset from assembler code. ******************************************************************************/ int get_power_on_target_afflvl() { int afflvl; #if DEBUG unsigned int state; aff_map_node_t *node; /* Retrieve our node from the topology tree */ node = psci_get_aff_map_node(read_mpidr_el1() & MPIDR_AFFINITY_MASK, MPIDR_AFFLVL0); assert(node); /* * Sanity check the state of the cpu. It should be either suspend or "on * pending" */ state = psci_get_state(node); assert(state == PSCI_STATE_SUSPEND || state == PSCI_STATE_ON_PENDING); #endif /* * Assume that this cpu was suspended and retrieve its target affinity * level. If it is invalid then it could only have been turned off * earlier. get_max_afflvl() will return the highest affinity level a * cpu can be turned off to. */ afflvl = psci_get_suspend_afflvl(); if (afflvl == PSCI_INVALID_DATA) afflvl = get_max_afflvl(); return afflvl; } /******************************************************************************* * Simple routine to retrieve the maximum affinity level supported by the * platform and check that it makes sense. ******************************************************************************/ int get_max_afflvl(void) { int aff_lvl; aff_lvl = plat_get_max_afflvl(); assert(aff_lvl <= MPIDR_MAX_AFFLVL && aff_lvl >= MPIDR_AFFLVL0); return aff_lvl; } /******************************************************************************* * Simple routine to set the id of an affinity instance at a given level in the * mpidr. ******************************************************************************/ unsigned long mpidr_set_aff_inst(unsigned long mpidr, unsigned char aff_inst, int aff_lvl) { unsigned long aff_shift; assert(aff_lvl <= MPIDR_AFFLVL3); /* * Decide the number of bits to shift by depending upon * the affinity level */ aff_shift = get_afflvl_shift(aff_lvl); /* Clear the existing affinity instance & set the new one*/ mpidr &= ~(MPIDR_AFFLVL_MASK << aff_shift); mpidr |= aff_inst << aff_shift; return mpidr; } /******************************************************************************* * This function sanity checks a range of affinity levels. ******************************************************************************/ int psci_check_afflvl_range(int start_afflvl, int end_afflvl) { /* Sanity check the parameters passed */ if (end_afflvl > MPIDR_MAX_AFFLVL) return PSCI_E_INVALID_PARAMS; if (start_afflvl < MPIDR_AFFLVL0) return PSCI_E_INVALID_PARAMS; if (end_afflvl < start_afflvl) return PSCI_E_INVALID_PARAMS; return PSCI_E_SUCCESS; } /******************************************************************************* * This function is passed an array of pointers to affinity level nodes in the * topology tree for an mpidr and the state which each node should transition * to. It updates the state of each node between the specified affinity levels. ******************************************************************************/ void psci_do_afflvl_state_mgmt(uint32_t start_afflvl, uint32_t end_afflvl, aff_map_node_t *mpidr_nodes[], uint32_t state) { uint32_t level; for (level = start_afflvl; level <= end_afflvl; level++) { if (mpidr_nodes[level] == NULL) continue; psci_set_state(mpidr_nodes[level], state); } } /******************************************************************************* * This function is passed an array of pointers to affinity level nodes in the * topology tree for an mpidr. It picks up locks for each affinity level bottom * up in the range specified. ******************************************************************************/ void psci_acquire_afflvl_locks(int start_afflvl, int end_afflvl, aff_map_node_t *mpidr_nodes[]) { int level; for (level = start_afflvl; level <= end_afflvl; level++) { if (mpidr_nodes[level] == NULL) continue; bakery_lock_get(&mpidr_nodes[level]->lock); } } /******************************************************************************* * This function is passed an array of pointers to affinity level nodes in the * topology tree for an mpidr. It releases the lock for each affinity level top * down in the range specified. ******************************************************************************/ void psci_release_afflvl_locks(int start_afflvl, int end_afflvl, aff_map_node_t *mpidr_nodes[]) { int level; for (level = end_afflvl; level >= start_afflvl; level--) { if (mpidr_nodes[level] == NULL) continue; bakery_lock_release(&mpidr_nodes[level]->lock); } } /******************************************************************************* * Simple routine to determine whether an affinity instance at a given level * in an mpidr exists or not. ******************************************************************************/ int psci_validate_mpidr(unsigned long mpidr, int level) { aff_map_node_t *node; node = psci_get_aff_map_node(mpidr, level); if (node && (node->state & PSCI_AFF_PRESENT)) return PSCI_E_SUCCESS; else return PSCI_E_INVALID_PARAMS; } /******************************************************************************* * This function determines the full entrypoint information for the requested * PSCI entrypoint on power on/resume and saves this in the non-secure CPU * cpu_context, ready for when the core boots. ******************************************************************************/ int psci_save_ns_entry(uint64_t mpidr, uint64_t entrypoint, uint64_t context_id, uint32_t ns_scr_el3, uint32_t ns_sctlr_el1) { uint32_t ep_attr, mode, sctlr, daif, ee; entry_point_info_t ep; sctlr = ns_scr_el3 & SCR_HCE_BIT ? read_sctlr_el2() : ns_sctlr_el1; ee = 0; ep_attr = NON_SECURE | EP_ST_DISABLE; if (sctlr & SCTLR_EE_BIT) { ep_attr |= EP_EE_BIG; ee = 1; } SET_PARAM_HEAD(&ep, PARAM_EP, VERSION_1, ep_attr); ep.pc = entrypoint; memset(&ep.args, 0, sizeof(ep.args)); ep.args.arg0 = context_id; /* * Figure out whether the cpu enters the non-secure address space * in aarch32 or aarch64 */ if (ns_scr_el3 & SCR_RW_BIT) { /* * Check whether a Thumb entry point has been provided for an * aarch64 EL */ if (entrypoint & 0x1) return PSCI_E_INVALID_PARAMS; mode = ns_scr_el3 & SCR_HCE_BIT ? MODE_EL2 : MODE_EL1; ep.spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); } else { mode = ns_scr_el3 & SCR_HCE_BIT ? MODE32_hyp : MODE32_svc; /* * TODO: Choose async. exception bits if HYP mode is not * implemented according to the values of SCR.{AW, FW} bits */ daif = DAIF_ABT_BIT | DAIF_IRQ_BIT | DAIF_FIQ_BIT; ep.spsr = SPSR_MODE32(mode, entrypoint & 0x1, ee, daif); } /* initialise an entrypoint to set up the CPU context */ cm_init_context(mpidr, &ep); return PSCI_E_SUCCESS; } /******************************************************************************* * This function takes a pointer to an affinity node in the topology tree and * returns its state. State of a non-leaf node needs to be calculated. ******************************************************************************/ unsigned short psci_get_state(aff_map_node_t *node) { assert(node->level >= MPIDR_AFFLVL0 && node->level <= MPIDR_MAX_AFFLVL); /* A cpu node just contains the state which can be directly returned */ if (node->level == MPIDR_AFFLVL0) return (node->state >> PSCI_STATE_SHIFT) & PSCI_STATE_MASK; /* * For an affinity level higher than a cpu, the state has to be * calculated. It depends upon the value of the reference count * which is managed by each node at the next lower affinity level * e.g. for a cluster, each cpu increments/decrements the reference * count. If the reference count is 0 then the affinity level is * OFF else ON. */ if (node->ref_count) return PSCI_STATE_ON; else return PSCI_STATE_OFF; } /******************************************************************************* * This function takes a pointer to an affinity node in the topology tree and * a target state. State of a non-leaf node needs to be converted to a reference * count. State of a leaf node can be set directly. ******************************************************************************/ void psci_set_state(aff_map_node_t *node, unsigned short state) { assert(node->level >= MPIDR_AFFLVL0 && node->level <= MPIDR_MAX_AFFLVL); /* * For an affinity level higher than a cpu, the state is used * to decide whether the reference count is incremented or * decremented. Entry into the ON_PENDING state does not have * effect. */ if (node->level > MPIDR_AFFLVL0) { switch (state) { case PSCI_STATE_ON: node->ref_count++; break; case PSCI_STATE_OFF: case PSCI_STATE_SUSPEND: node->ref_count--; break; case PSCI_STATE_ON_PENDING: /* * An affinity level higher than a cpu will not undergo * a state change when it is about to be turned on */ return; default: assert(0); } } else { node->state &= ~(PSCI_STATE_MASK << PSCI_STATE_SHIFT); node->state |= (state & PSCI_STATE_MASK) << PSCI_STATE_SHIFT; } } /******************************************************************************* * An affinity level could be on, on_pending, suspended or off. These are the * logical states it can be in. Physically either it is off or on. When it is in * the state on_pending then it is about to be turned on. It is not possible to * tell whether that's actually happenned or not. So we err on the side of * caution & treat the affinity level as being turned off. ******************************************************************************/ unsigned short psci_get_phys_state(aff_map_node_t *node) { unsigned int state; state = psci_get_state(node); return get_phys_state(state); } /******************************************************************************* * This function takes an array of pointers to affinity instance nodes in the * topology tree and calls the physical power on handler for the corresponding * affinity levels ******************************************************************************/ static int psci_call_power_on_handlers(aff_map_node_t *mpidr_nodes[], int start_afflvl, int end_afflvl, afflvl_power_on_finisher_t *pon_handlers) { int rc = PSCI_E_INVALID_PARAMS, level; aff_map_node_t *node; for (level = end_afflvl; level >= start_afflvl; level--) { node = mpidr_nodes[level]; if (node == NULL) continue; /* * If we run into any trouble while powering up an * affinity instance, then there is no recovery path * so simply return an error and let the caller take * care of the situation. */ rc = pon_handlers[level](node); if (rc != PSCI_E_SUCCESS) break; } return rc; } /******************************************************************************* * Generic handler which is called when a cpu is physically powered on. It * traverses through all the affinity levels performing generic, architectural, * platform setup and state management e.g. for a cluster that's been powered * on, it will call the platform specific code which will enable coherency at * the interconnect level. For a cpu it could mean turning on the MMU etc. * * The state of all the relevant affinity levels is changed after calling the * affinity level specific handlers as their actions would depend upon the state * the affinity level is exiting from. * * The affinity level specific handlers are called in descending order i.e. from * the highest to the lowest affinity level implemented by the platform because * to turn on affinity level X it is neccesary to turn on affinity level X + 1 * first. ******************************************************************************/ void psci_afflvl_power_on_finish(int start_afflvl, int end_afflvl, afflvl_power_on_finisher_t *pon_handlers) { mpidr_aff_map_nodes_t mpidr_nodes; int rc; unsigned int max_phys_off_afflvl; /* * Collect the pointers to the nodes in the topology tree for * each affinity instance in the mpidr. If this function does * not return successfully then either the mpidr or the affinity * levels are incorrect. Either case is an irrecoverable error. */ rc = psci_get_aff_map_nodes(read_mpidr_el1() & MPIDR_AFFINITY_MASK, start_afflvl, end_afflvl, mpidr_nodes); if (rc != PSCI_E_SUCCESS) panic(); /* * This function acquires the lock corresponding to each affinity * level so that by the time all locks are taken, the system topology * is snapshot and state management can be done safely. */ psci_acquire_afflvl_locks(start_afflvl, end_afflvl, mpidr_nodes); max_phys_off_afflvl = psci_find_max_phys_off_afflvl(start_afflvl, end_afflvl, mpidr_nodes); assert(max_phys_off_afflvl != PSCI_INVALID_DATA); /* * Stash the highest affinity level that will come out of the OFF or * SUSPEND states. */ psci_set_max_phys_off_afflvl(max_phys_off_afflvl); /* Perform generic, architecture and platform specific handling */ rc = psci_call_power_on_handlers(mpidr_nodes, start_afflvl, end_afflvl, pon_handlers); if (rc != PSCI_E_SUCCESS) panic(); /* * This function updates the state of each affinity instance * corresponding to the mpidr in the range of affinity levels * specified. */ psci_do_afflvl_state_mgmt(start_afflvl, end_afflvl, mpidr_nodes, PSCI_STATE_ON); /* * Invalidate the entry for the highest affinity level stashed earlier. * This ensures that any reads of this variable outside the power * up/down sequences return PSCI_INVALID_DATA */ psci_set_max_phys_off_afflvl(PSCI_INVALID_DATA); /* * This loop releases the lock corresponding to each affinity level * in the reverse order to which they were acquired. */ psci_release_afflvl_locks(start_afflvl, end_afflvl, mpidr_nodes); } /******************************************************************************* * This function initializes the set of hooks that PSCI invokes as part of power * management operation. The power management hooks are expected to be provided * by the SPD, after it finishes all its initialization ******************************************************************************/ void psci_register_spd_pm_hook(const spd_pm_ops_t *pm) { psci_spd_pm = pm; } /******************************************************************************* * This function prints the state of all affinity instances present in the * system ******************************************************************************/ void psci_print_affinity_map(void) { #if LOG_LEVEL >= LOG_LEVEL_INFO aff_map_node_t *node; unsigned int idx; /* This array maps to the PSCI_STATE_X definitions in psci.h */ static const char *psci_state_str[] = { "ON", "OFF", "ON_PENDING", "SUSPEND" }; INFO("PSCI Affinity Map:\n"); for (idx = 0; idx < PSCI_NUM_AFFS ; idx++) { node = &psci_aff_map[idx]; if (!(node->state & PSCI_AFF_PRESENT)) { continue; } INFO(" AffInst: Level %u, MPID 0x%lx, State %s\n", node->level, node->mpidr, psci_state_str[psci_get_state(node)]); } #endif } arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_entry.S000066400000000000000000000127111322600646200247370ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include .globl psci_aff_on_finish_entry .globl psci_aff_suspend_finish_entry .globl psci_power_down_wfi /* ----------------------------------------------------- * This cpu has been physically powered up. Depending * upon whether it was resumed from suspend or simply * turned on, call the common power on finisher with * the handlers (chosen depending upon original state). * ----------------------------------------------------- */ func psci_aff_on_finish_entry adr x23, psci_afflvl_on_finishers b psci_aff_common_finish_entry psci_aff_suspend_finish_entry: adr x23, psci_afflvl_suspend_finishers psci_aff_common_finish_entry: #if !RESET_TO_BL31 /* --------------------------------------------- * Enable the instruction cache, stack pointer * and data access alignment checks. Also, set * the EL3 exception endianess to little-endian. * It can be assumed that BL3-1 entrypoint code * will do this when RESET_TO_BL31 is set. The * same assumption cannot be made when another * boot loader executes before BL3-1 in the warm * boot path e.g. BL1. * --------------------------------------------- */ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT) mrs x0, sctlr_el3 orr x0, x0, x1 msr sctlr_el3, x0 isb #endif /* --------------------------------------------- * Initialise the pcpu cache pointer for the CPU * --------------------------------------------- */ bl init_cpu_data_ptr /* --------------------------------------------- * Initialize the cpu_ops pointer. * --------------------------------------------- */ bl init_cpu_ops /* --------------------------------------------- * Set the exception vectors * --------------------------------------------- */ adr x0, runtime_exceptions msr vbar_el3, x0 isb /* --------------------------------------------- * Enable the SError interrupt now that the * exception vectors have been setup. * --------------------------------------------- */ msr daifclr, #DAIF_ABT_BIT /* --------------------------------------------- * Use SP_EL0 for the C runtime stack. * --------------------------------------------- */ msr spsel, #0 /* -------------------------------------------- * Give ourselves a stack whose memory will be * marked as Normal-IS-WBWA when the MMU is * enabled. * -------------------------------------------- */ mrs x0, mpidr_el1 bl platform_set_stack /* -------------------------------------------- * Enable the MMU with the DCache disabled. It * is safe to use stacks allocated in normal * memory as a result. All memory accesses are * marked nGnRnE when the MMU is disabled. So * all the stack writes will make it to memory. * All memory accesses are marked Non-cacheable * when the MMU is enabled but D$ is disabled. * So used stack memory is guaranteed to be * visible immediately after the MMU is enabled * Enabling the DCache at the same time as the * MMU can lead to speculatively fetched and * possibly stale stack memory being read from * other caches. This can lead to coherency * issues. * -------------------------------------------- */ mov x0, #DISABLE_DCACHE bl bl31_plat_enable_mmu /* --------------------------------------------- * Call the finishers starting from affinity * level 0. * --------------------------------------------- */ bl get_power_on_target_afflvl mov x2, x23 mov x1, x0 mov x0, #MPIDR_AFFLVL0 bl psci_afflvl_power_on_finish b el3_exit /* -------------------------------------------- * This function is called to indicate to the * power controller that it is safe to power * down this cpu. It should not exit the wfi * and will be released from reset upon power * up. 'wfi_spill' is used to catch erroneous * exits from wfi. * -------------------------------------------- */ func psci_power_down_wfi dsb sy // ensure write buffer empty wfi_spill: wfi b wfi_spill arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_helpers.S000066400000000000000000000126531322600646200252450ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include .globl psci_do_pwrdown_cache_maintenance .globl psci_do_pwrup_cache_maintenance /* ----------------------------------------------------------------------- * void psci_do_pwrdown_cache_maintenance(uint32_t affinity level); * * This function performs cache maintenance if the specified affinity * level is the equal to the level of the highest affinity instance which * will be/is physically powered off. The levels of cache affected are * determined by the affinity level which is passed as the argument i.e. * level 0 results in a flush of the L1 cache. Both the L1 and L2 caches * are flushed for a higher affinity level. * * Additionally, this function also ensures that stack memory is correctly * flushed out to avoid coherency issues due to a change in its memory * attributes after the data cache is disabled. * ----------------------------------------------------------------------- */ func psci_do_pwrdown_cache_maintenance stp x29, x30, [sp,#-16]! stp x19, x20, [sp,#-16]! mov x19, x0 bl psci_get_max_phys_off_afflvl #if ASM_ASSERTION cmp x0, #PSCI_INVALID_DATA ASM_ASSERT(ne) #endif cmp x0, x19 b.ne 1f /* --------------------------------------------- * Determine to how many levels of cache will be * subject to cache maintenance. Affinity level * 0 implies that only the cpu is being powered * down. Only the L1 data cache needs to be * flushed to the PoU in this case. For a higher * affinity level we are assuming that a flush * of L1 data and L2 unified cache is enough. * This information should be provided by the * platform. * --------------------------------------------- */ cmp x0, #MPIDR_AFFLVL0 b.eq do_core_pwr_dwn bl prepare_cluster_pwr_dwn b do_stack_maintenance do_core_pwr_dwn: bl prepare_core_pwr_dwn /* --------------------------------------------- * Do stack maintenance by flushing the used * stack to the main memory and invalidating the * remainder. * --------------------------------------------- */ do_stack_maintenance: mrs x0, mpidr_el1 bl platform_get_stack /* --------------------------------------------- * Calculate and store the size of the used * stack memory in x1. * --------------------------------------------- */ mov x19, x0 mov x1, sp sub x1, x0, x1 mov x0, sp bl flush_dcache_range /* --------------------------------------------- * Calculate and store the size of the unused * stack memory in x1. Calculate and store the * stack base address in x0. * --------------------------------------------- */ sub x0, x19, #PLATFORM_STACK_SIZE sub x1, sp, x0 bl inv_dcache_range 1: ldp x19, x20, [sp], #16 ldp x29, x30, [sp], #16 ret /* ----------------------------------------------------------------------- * void psci_do_pwrup_cache_maintenance(void); * * This function performs cache maintenance after this cpu is powered up. * Currently, this involves managing the used stack memory before turning * on the data cache. * ----------------------------------------------------------------------- */ func psci_do_pwrup_cache_maintenance stp x29, x30, [sp,#-16]! /* --------------------------------------------- * Ensure any inflight stack writes have made it * to main memory. * --------------------------------------------- */ dmb st /* --------------------------------------------- * Calculate and store the size of the used * stack memory in x1. Calculate and store the * stack base address in x0. * --------------------------------------------- */ mrs x0, mpidr_el1 bl platform_get_stack mov x1, sp sub x1, x0, x1 mov x0, sp bl inv_dcache_range /* --------------------------------------------- * Enable the data cache. * --------------------------------------------- */ mrs x0, sctlr_el3 orr x0, x0, #SCTLR_C_BIT msr sctlr_el3, x0 isb ldp x29, x30, [sp], #16 ret arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_main.c000066400000000000000000000205131322600646200245410ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "psci_private.h" /******************************************************************************* * PSCI frontend api for servicing SMCs. Described in the PSCI spec. ******************************************************************************/ int psci_cpu_on(unsigned long target_cpu, unsigned long entrypoint, unsigned long context_id) { int rc; unsigned int start_afflvl, end_afflvl; /* Determine if the cpu exists of not */ rc = psci_validate_mpidr(target_cpu, MPIDR_AFFLVL0); if (rc != PSCI_E_SUCCESS) { goto exit; } /* * To turn this cpu on, specify which affinity * levels need to be turned on */ start_afflvl = MPIDR_AFFLVL0; end_afflvl = get_max_afflvl(); rc = psci_afflvl_on(target_cpu, entrypoint, context_id, start_afflvl, end_afflvl); exit: return rc; } unsigned int psci_version(void) { return PSCI_MAJOR_VER | PSCI_MINOR_VER; } int psci_cpu_suspend(unsigned int power_state, unsigned long entrypoint, unsigned long context_id) { int rc; unsigned int target_afflvl, pstate_type; /* Check SBZ bits in power state are zero */ if (psci_validate_power_state(power_state)) return PSCI_E_INVALID_PARAMS; /* Sanity check the requested state */ target_afflvl = psci_get_pstate_afflvl(power_state); if (target_afflvl > MPIDR_MAX_AFFLVL) return PSCI_E_INVALID_PARAMS; /* Determine the 'state type' in the 'power_state' parameter */ pstate_type = psci_get_pstate_type(power_state); /* * Ensure that we have a platform specific handler for entering * a standby state. */ if (pstate_type == PSTATE_TYPE_STANDBY) { if (!psci_plat_pm_ops->affinst_standby) return PSCI_E_INVALID_PARAMS; rc = psci_plat_pm_ops->affinst_standby(power_state); assert(rc == PSCI_E_INVALID_PARAMS || rc == PSCI_E_SUCCESS); return rc; } /* * Do what is needed to enter the power down state. Upon success, * enter the final wfi which will power down this cpu else return * an error. */ rc = psci_afflvl_suspend(entrypoint, context_id, power_state, MPIDR_AFFLVL0, target_afflvl); if (rc == PSCI_E_SUCCESS) { /* * Perform any platform specific, late power-down actions. * In case this ever returns (it does not need to), fall * through to the normal WFI sequence. */ if (psci_plat_pm_ops->core_power_down_wfi) { unsigned long mpidr = read_mpidr_el1(); psci_plat_pm_ops->core_power_down_wfi(mpidr); } psci_power_down_wfi(); } assert(rc == PSCI_E_INVALID_PARAMS); return rc; } int psci_cpu_off(void) { int rc; int target_afflvl = get_max_afflvl(); /* * Traverse from the highest to the lowest affinity level. When the * lowest affinity level is hit, all the locks are acquired. State * management is done immediately followed by cpu, cluster ... * ..target_afflvl specific actions as this function unwinds back. */ rc = psci_afflvl_off(MPIDR_AFFLVL0, target_afflvl); /* * Check if all actions needed to safely power down this cpu have * successfully completed. Enter a wfi loop which will allow the * power controller to physically power down this cpu. */ if (rc == PSCI_E_SUCCESS) { /* * Perform any platform specific, late power-down actions. * In case this ever returns (it does not need to), fall * through to the normal WFI sequence. */ if (psci_plat_pm_ops->core_power_down_wfi) { unsigned long mpidr = read_mpidr_el1(); psci_plat_pm_ops->core_power_down_wfi(mpidr); } psci_power_down_wfi(); } /* * The only error cpu_off can return is E_DENIED. So check if that's * indeed the case. */ assert (rc == PSCI_E_DENIED); return rc; } int psci_affinity_info(unsigned long target_affinity, unsigned int lowest_affinity_level) { int rc = PSCI_E_INVALID_PARAMS; unsigned int aff_state; aff_map_node_t *node; if (lowest_affinity_level > get_max_afflvl()) return rc; node = psci_get_aff_map_node(target_affinity, lowest_affinity_level); if (node && (node->state & PSCI_AFF_PRESENT)) { /* * TODO: For affinity levels higher than 0 i.e. cpu, the * state will always be either ON or OFF. Need to investigate * how critical is it to support ON_PENDING here. */ aff_state = psci_get_state(node); /* A suspended cpu is available & on for the OS */ if (aff_state == PSCI_STATE_SUSPEND) { aff_state = PSCI_STATE_ON; } rc = aff_state; } return rc; } /* Unimplemented */ int psci_migrate(unsigned int target_cpu) { return PSCI_E_NOT_SUPPORTED; } /* Unimplemented */ unsigned int psci_migrate_info_type(void) { return PSCI_TOS_NOT_PRESENT_MP; } unsigned long psci_migrate_info_up_cpu(void) { /* * Return value of this currently unsupported call depends upon * what psci_migrate_info_type() returns. */ return PSCI_E_SUCCESS; } /******************************************************************************* * PSCI top level handler for servicing SMCs. ******************************************************************************/ uint64_t psci_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { if (is_caller_secure(flags)) SMC_RET1(handle, SMC_UNK); if (((smc_fid >> FUNCID_CC_SHIFT) & FUNCID_CC_MASK) == SMC_32) { /* 32-bit PSCI function, clear top parameter bits */ x1 = (uint32_t)x1; x2 = (uint32_t)x2; x3 = (uint32_t)x3; switch (smc_fid) { case PSCI_VERSION: SMC_RET1(handle, psci_version()); case PSCI_CPU_OFF: SMC_RET1(handle, psci_cpu_off()); case PSCI_CPU_SUSPEND_AARCH32: SMC_RET1(handle, psci_cpu_suspend(x1, x2, x3)); case PSCI_CPU_ON_AARCH32: SMC_RET1(handle, psci_cpu_on(x1, x2, x3)); case PSCI_AFFINITY_INFO_AARCH32: SMC_RET1(handle, psci_affinity_info(x1, x2)); case PSCI_MIG_AARCH32: SMC_RET1(handle, psci_migrate(x1)); case PSCI_MIG_INFO_TYPE: SMC_RET1(handle, psci_migrate_info_type()); case PSCI_MIG_INFO_UP_CPU_AARCH32: SMC_RET1(handle, psci_migrate_info_up_cpu()); case PSCI_SYSTEM_OFF: psci_system_off(); /* We should never return from psci_system_off() */ case PSCI_SYSTEM_RESET: psci_system_reset(); /* We should never return from psci_system_reset() */ default: break; } } else { /* 64-bit PSCI function */ switch (smc_fid) { case PSCI_CPU_SUSPEND_AARCH64: SMC_RET1(handle, psci_cpu_suspend(x1, x2, x3)); case PSCI_CPU_ON_AARCH64: SMC_RET1(handle, psci_cpu_on(x1, x2, x3)); case PSCI_AFFINITY_INFO_AARCH64: SMC_RET1(handle, psci_affinity_info(x1, x2)); case PSCI_MIG_AARCH64: SMC_RET1(handle, psci_migrate(x1)); case PSCI_MIG_INFO_UP_CPU_AARCH64: SMC_RET1(handle, psci_migrate_info_up_cpu()); default: break; } } WARN("Unimplemented PSCI Call: 0x%x \n", smc_fid); SMC_RET1(handle, SMC_UNK); } arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_private.h000066400000000000000000000131341322600646200252750ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PSCI_PRIVATE_H__ #define __PSCI_PRIVATE_H__ #include #include #include /* for PLATFORM_NUM_AFFS */ #include /* Number of affinity instances whose state this psci imp. can track */ #ifdef PLATFORM_NUM_AFFS #define PSCI_NUM_AFFS PLATFORM_NUM_AFFS #else #define PSCI_NUM_AFFS (2 * PLATFORM_CORE_COUNT) #endif /******************************************************************************* * The following two data structures hold the topology tree which in turn tracks * the state of the all the affinity instances supported by the platform. ******************************************************************************/ typedef struct aff_map_node { unsigned long mpidr; unsigned short ref_count; unsigned char state; unsigned char level; bakery_lock_t lock; } aff_map_node_t; typedef struct aff_limits_node { int min; int max; } aff_limits_node_t; typedef aff_map_node_t (*mpidr_aff_map_nodes_t[MPIDR_MAX_AFFLVL + 1]); typedef unsigned int (*afflvl_power_on_finisher_t)(aff_map_node_t *); /******************************************************************************* * Data prototypes ******************************************************************************/ extern const plat_pm_ops_t *psci_plat_pm_ops; extern aff_map_node_t psci_aff_map[PSCI_NUM_AFFS]; /******************************************************************************* * SPD's power management hooks registered with PSCI ******************************************************************************/ extern const spd_pm_ops_t *psci_spd_pm; /******************************************************************************* * Function prototypes ******************************************************************************/ /* Private exported functions from psci_common.c */ int get_max_afflvl(void); unsigned short psci_get_state(aff_map_node_t *node); unsigned short psci_get_phys_state(aff_map_node_t *node); void psci_set_state(aff_map_node_t *node, unsigned short state); unsigned long mpidr_set_aff_inst(unsigned long, unsigned char, int); int psci_validate_mpidr(unsigned long, int); int get_power_on_target_afflvl(void); void psci_afflvl_power_on_finish(int, int, afflvl_power_on_finisher_t *); int psci_save_ns_entry(uint64_t mpidr, uint64_t entrypoint, uint64_t context_id, uint32_t caller_scr_el3, uint32_t caller_sctlr_el1); int psci_check_afflvl_range(int start_afflvl, int end_afflvl); void psci_do_afflvl_state_mgmt(uint32_t start_afflvl, uint32_t end_afflvl, aff_map_node_t *mpidr_nodes[], uint32_t state); void psci_acquire_afflvl_locks(int start_afflvl, int end_afflvl, aff_map_node_t *mpidr_nodes[]); void psci_release_afflvl_locks(int start_afflvl, int end_afflvl, mpidr_aff_map_nodes_t mpidr_nodes); void psci_print_affinity_map(void); void psci_set_max_phys_off_afflvl(uint32_t afflvl); uint32_t psci_find_max_phys_off_afflvl(uint32_t start_afflvl, uint32_t end_afflvl, aff_map_node_t *mpidr_nodes[]); /* Private exported functions from psci_setup.c */ int psci_get_aff_map_nodes(unsigned long mpidr, int start_afflvl, int end_afflvl, aff_map_node_t *mpidr_nodes[]); aff_map_node_t *psci_get_aff_map_node(unsigned long, int); /* Private exported functions from psci_affinity_on.c */ int psci_afflvl_on(unsigned long, unsigned long, unsigned long, int, int); /* Private exported functions from psci_affinity_off.c */ int psci_afflvl_off(int, int); /* Private exported functions from psci_affinity_suspend.c */ int psci_afflvl_suspend(unsigned long, unsigned long, unsigned int, int, int); unsigned int psci_afflvl_suspend_finish(int, int); void psci_set_suspend_power_state(unsigned int power_state); /* Private exported functions from psci_helpers.S */ void psci_do_pwrdown_cache_maintenance(uint32_t affinity_level); void psci_do_pwrup_cache_maintenance(void); /* Private exported functions from psci_system_off.c */ void __dead2 psci_system_off(void); void __dead2 psci_system_reset(void); #endif /* __PSCI_PRIVATE_H__ */ arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_setup.c000066400000000000000000000322521322600646200247600ustar00rootroot00000000000000/* * Copyright (c) 2013-2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "psci_private.h" /******************************************************************************* * Per cpu non-secure contexts used to program the architectural state prior * return to the normal world. * TODO: Use the memory allocator to set aside memory for the contexts instead * of relying on platform defined constants. Using PSCI_NUM_AFFS will be an * overkill. ******************************************************************************/ static cpu_context_t psci_ns_context[PLATFORM_CORE_COUNT]; /******************************************************************************* * In a system, a certain number of affinity instances are present at an * affinity level. The cumulative number of instances across all levels are * stored in 'psci_aff_map'. The topology tree has been flattenned into this * array. To retrieve nodes, information about the extents of each affinity * level i.e. start index and end index needs to be present. 'psci_aff_limits' * stores this information. ******************************************************************************/ static aff_limits_node_t psci_aff_limits[MPIDR_MAX_AFFLVL + 1]; /******************************************************************************* * Routines for retrieving the node corresponding to an affinity level instance * in the mpidr. The first one uses binary search to find the node corresponding * to the mpidr (key) at a particular affinity level. The second routine decides * extents of the binary search at each affinity level. ******************************************************************************/ static int psci_aff_map_get_idx(unsigned long key, int min_idx, int max_idx) { int mid; /* * Terminating condition: If the max and min indices have crossed paths * during the binary search then the key has not been found. */ if (max_idx < min_idx) return PSCI_E_INVALID_PARAMS; /* * Bisect the array around 'mid' and then recurse into the array chunk * where the key is likely to be found. The mpidrs in each node in the * 'psci_aff_map' for a given affinity level are stored in an ascending * order which makes the binary search possible. */ mid = min_idx + ((max_idx - min_idx) >> 1); /* Divide by 2 */ if (psci_aff_map[mid].mpidr > key) return psci_aff_map_get_idx(key, min_idx, mid - 1); else if (psci_aff_map[mid].mpidr < key) return psci_aff_map_get_idx(key, mid + 1, max_idx); else return mid; } aff_map_node_t *psci_get_aff_map_node(unsigned long mpidr, int aff_lvl) { int rc; /* Right shift the mpidr to the required affinity level */ mpidr = mpidr_mask_lower_afflvls(mpidr, aff_lvl); rc = psci_aff_map_get_idx(mpidr, psci_aff_limits[aff_lvl].min, psci_aff_limits[aff_lvl].max); if (rc >= 0) return &psci_aff_map[rc]; else return NULL; } /******************************************************************************* * This function populates an array with nodes corresponding to a given range of * affinity levels in an mpidr. It returns successfully only when the affinity * levels are correct, the mpidr is valid i.e. no affinity level is absent from * the topology tree & the affinity instance at level 0 is not absent. ******************************************************************************/ int psci_get_aff_map_nodes(unsigned long mpidr, int start_afflvl, int end_afflvl, aff_map_node_t *mpidr_nodes[]) { int rc = PSCI_E_INVALID_PARAMS, level; aff_map_node_t *node; rc = psci_check_afflvl_range(start_afflvl, end_afflvl); if (rc != PSCI_E_SUCCESS) return rc; for (level = start_afflvl; level <= end_afflvl; level++) { /* * Grab the node for each affinity level. No affinity level * can be missing as that would mean that the topology tree * is corrupted. */ node = psci_get_aff_map_node(mpidr, level); if (node == NULL) { rc = PSCI_E_INVALID_PARAMS; break; } /* * Skip absent affinity levels unless it's afffinity level 0. * An absent cpu means that the mpidr is invalid. Save the * pointer to the node for the present affinity level */ if (!(node->state & PSCI_AFF_PRESENT)) { if (level == MPIDR_AFFLVL0) { rc = PSCI_E_INVALID_PARAMS; break; } mpidr_nodes[level] = NULL; } else mpidr_nodes[level] = node; } return rc; } /******************************************************************************* * Function which initializes the 'aff_map_node' corresponding to an affinity * level instance. Each node has a unique mpidr, level and bakery lock. The data * field is opaque and holds affinity level specific data e.g. for affinity * level 0 it contains the index into arrays that hold the secure/non-secure * state for a cpu that's been turned on/off ******************************************************************************/ static void psci_init_aff_map_node(unsigned long mpidr, int level, unsigned int idx) { unsigned char state; uint32_t linear_id; psci_aff_map[idx].mpidr = mpidr; psci_aff_map[idx].level = level; bakery_lock_init(&psci_aff_map[idx].lock); /* * If an affinity instance is present then mark it as OFF to begin with. */ state = plat_get_aff_state(level, mpidr); psci_aff_map[idx].state = state; if (level == MPIDR_AFFLVL0) { /* * Mark the cpu as OFF. Higher affinity level reference counts * have already been memset to 0 */ if (state & PSCI_AFF_PRESENT) psci_set_state(&psci_aff_map[idx], PSCI_STATE_OFF); /* * Associate a non-secure context with this affinity * instance through the context management library. */ linear_id = platform_get_core_pos(mpidr); assert(linear_id < PLATFORM_CORE_COUNT); /* Invalidate the suspend context for the node */ set_cpu_data_by_index(linear_id, psci_svc_cpu_data.power_state, PSCI_INVALID_DATA); /* * There is no state associated with the current execution * context so ensure that any reads of the highest affinity * level in a powered down state return PSCI_INVALID_DATA. */ set_cpu_data_by_index(linear_id, psci_svc_cpu_data.max_phys_off_afflvl, PSCI_INVALID_DATA); cm_set_context_by_mpidr(mpidr, (void *) &psci_ns_context[linear_id], NON_SECURE); } return; } /******************************************************************************* * Core routine used by the Breadth-First-Search algorithm to populate the * affinity tree. Each level in the tree corresponds to an affinity level. This * routine's aim is to traverse to the target affinity level and populate nodes * in the 'psci_aff_map' for all the siblings at that level. It uses the current * affinity level to keep track of how many levels from the root of the tree * have been traversed. If the current affinity level != target affinity level, * then the platform is asked to return the number of children that each * affinity instance has at the current affinity level. Traversal is then done * for each child at the next lower level i.e. current affinity level - 1. * * CAUTION: This routine assumes that affinity instance ids are allocated in a * monotonically increasing manner at each affinity level in a mpidr starting * from 0. If the platform breaks this assumption then this code will have to * be reworked accordingly. ******************************************************************************/ static unsigned int psci_init_aff_map(unsigned long mpidr, unsigned int affmap_idx, int cur_afflvl, int tgt_afflvl) { unsigned int ctr, aff_count; assert(cur_afflvl >= tgt_afflvl); /* * Find the number of siblings at the current affinity level & * assert if there are none 'cause then we have been invoked with * an invalid mpidr. */ aff_count = plat_get_aff_count(cur_afflvl, mpidr); assert(aff_count); if (tgt_afflvl < cur_afflvl) { for (ctr = 0; ctr < aff_count; ctr++) { mpidr = mpidr_set_aff_inst(mpidr, ctr, cur_afflvl); affmap_idx = psci_init_aff_map(mpidr, affmap_idx, cur_afflvl - 1, tgt_afflvl); } } else { for (ctr = 0; ctr < aff_count; ctr++, affmap_idx++) { mpidr = mpidr_set_aff_inst(mpidr, ctr, cur_afflvl); psci_init_aff_map_node(mpidr, cur_afflvl, affmap_idx); } /* affmap_idx is 1 greater than the max index of cur_afflvl */ psci_aff_limits[cur_afflvl].max = affmap_idx - 1; } return affmap_idx; } /******************************************************************************* * This function initializes the topology tree by querying the platform. To do * so, it's helper routines implement a Breadth-First-Search. At each affinity * level the platform conveys the number of affinity instances that exist i.e. * the affinity count. The algorithm populates the psci_aff_map recursively * using this information. On a platform that implements two clusters of 4 cpus * each, the populated aff_map_array would look like this: * * <- cpus cluster0 -><- cpus cluster1 -> * --------------------------------------------------- * | 0 | 1 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 3 | * --------------------------------------------------- * ^ ^ * cluster __| cpu __| * limit limit * * The first 2 entries are of the cluster nodes. The next 4 entries are of cpus * within cluster 0. The last 4 entries are of cpus within cluster 1. * The 'psci_aff_limits' array contains the max & min index of each affinity * level within the 'psci_aff_map' array. This allows restricting search of a * node at an affinity level between the indices in the limits array. ******************************************************************************/ int32_t psci_setup(void) { unsigned long mpidr = read_mpidr(); int afflvl, affmap_idx, max_afflvl; aff_map_node_t *node; psci_plat_pm_ops = NULL; /* Find out the maximum affinity level that the platform implements */ max_afflvl = get_max_afflvl(); assert(max_afflvl <= MPIDR_MAX_AFFLVL); /* * This call traverses the topology tree with help from the platform and * populates the affinity map using a breadth-first-search recursively. * We assume that the platform allocates affinity instance ids from 0 * onwards at each affinity level in the mpidr. FIRST_MPIDR = 0.0.0.0 */ affmap_idx = 0; for (afflvl = max_afflvl; afflvl >= MPIDR_AFFLVL0; afflvl--) { affmap_idx = psci_init_aff_map(FIRST_MPIDR, affmap_idx, max_afflvl, afflvl); } /* * Set the bounds for the affinity counts of each level in the map. Also * flush out the entire array so that it's visible to subsequent power * management operations. The 'psci_aff_map' array is allocated in * coherent memory so does not need flushing. The 'psci_aff_limits' * array is allocated in normal memory. It will be accessed when the mmu * is off e.g. after reset. Hence it needs to be flushed. */ for (afflvl = MPIDR_AFFLVL0; afflvl < max_afflvl; afflvl++) { psci_aff_limits[afflvl].min = psci_aff_limits[afflvl + 1].max + 1; } flush_dcache_range((unsigned long) psci_aff_limits, sizeof(psci_aff_limits)); /* * Mark the affinity instances in our mpidr as ON. No need to lock as * this is the primary cpu. */ mpidr &= MPIDR_AFFINITY_MASK; for (afflvl = MPIDR_AFFLVL0; afflvl <= max_afflvl; afflvl++) { node = psci_get_aff_map_node(mpidr, afflvl); assert(node); /* Mark each present node as ON. */ if (node->state & PSCI_AFF_PRESENT) psci_set_state(node, PSCI_STATE_ON); } platform_setup_pm(&psci_plat_pm_ops); assert(psci_plat_pm_ops); return 0; } arm-trusted-firmware-1.0-aw-6/services/std_svc/psci/psci_system_off.c000066400000000000000000000051131322600646200257720ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "psci_private.h" void psci_system_off(void) { /* Check platform support */ if (!psci_plat_pm_ops->system_off) { ERROR("Platform has not exported a PSCI System Off hook.\n"); panic(); } psci_print_affinity_map(); /* Notify the Secure Payload Dispatcher */ if (psci_spd_pm && psci_spd_pm->svc_system_off) { psci_spd_pm->svc_system_off(); } /* Call the platform specific hook */ psci_plat_pm_ops->system_off(); /* This function does not return. We should never get here */ } void psci_system_reset(void) { /* Check platform support */ if (!psci_plat_pm_ops->system_reset) { ERROR("Platform has not exported a PSCI System Reset hook.\n"); panic(); } psci_print_affinity_map(); /* Notify the Secure Payload Dispatcher */ if (psci_spd_pm && psci_spd_pm->svc_system_reset) { psci_spd_pm->svc_system_reset(); } /* Call the platform specific hook */ psci_plat_pm_ops->system_reset(); /* This function does not return. We should never get here */ } arm-trusted-firmware-1.0-aw-6/services/std_svc/std_svc_setup.c000066400000000000000000000063351322600646200245340ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include /* Standard Service UUID */ DEFINE_SVC_UUID(std_svc_uid, 0x108d905b, 0xf863, 0x47e8, 0xae, 0x2d, 0xc0, 0xfb, 0x56, 0x41, 0xf6, 0xe2); /* Setup Standard Services */ static int32_t std_svc_setup(void) { /* * PSCI is the only specification implemented as a Standard Service. * Invoke PSCI setup from here */ return psci_setup(); } /* * Top-level Standard Service SMC handler. This handler will in turn dispatch * calls to PSCI SMC handler */ uint64_t std_svc_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags) { /* * Dispatch PSCI calls to PSCI SMC handler and return its return * value */ if (is_psci_fid(smc_fid)) { return psci_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags); } switch (smc_fid) { case ARM_STD_SVC_CALL_COUNT: /* * Return the number of Standard Service Calls. PSCI is the only * standard service implemented; so return number of PSCI calls */ SMC_RET1(handle, PSCI_NUM_CALLS); case ARM_STD_SVC_UID: /* Return UID to the caller */ SMC_UUID_RET(handle, std_svc_uid); case ARM_STD_SVC_VERSION: /* Return the version of current implementation */ SMC_RET2(handle, STD_SVC_VERSION_MAJOR, STD_SVC_VERSION_MINOR); default: WARN("Unimplemented Standard Service Call: 0x%x \n", smc_fid); SMC_RET1(handle, SMC_UNK); } } /* Register Standard Service Calls as runtime service */ DECLARE_RT_SVC( std_svc, OEN_STD_START, OEN_STD_END, SMC_TYPE_FAST, std_svc_setup, std_svc_smc_handler ); arm-trusted-firmware-1.0-aw-6/tools/000077500000000000000000000000001322600646200173445ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/tools/fip_create/000077500000000000000000000000001322600646200214455ustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/tools/fip_create/Makefile000066400000000000000000000041151322600646200231060ustar00rootroot00000000000000# # Copyright (c) 2014, 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: # # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # Neither the name of ARM nor the names of its contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # PROJECT = fip_create OBJECTS = fip_create.o CFLAGS = -Wall -Werror -pedantic -std=c99 ifeq (${DEBUG},1) CFLAGS += -g -O0 -DDEBUG else CFLAGS += -O2 endif # Make soft links and include from local directory otherwise wrong headers # could get pulled in from firmware tree. INCLUDE_PATHS = -I. CC := gcc RM := rm -rf .PHONY: all clean all: ${PROJECT} ${PROJECT}: ${OBJECTS} Makefile @echo " LD $@" ${Q}${CC} ${OBJECTS} -o $@ -static %.o: %.c %.h Makefile @echo " CC $<" ${Q}${CC} -c ${CFLAGS} ${INCLUDE_PATHS} $< -o $@ clean: ${Q}${RM} ${PROJECT} ${Q}${RM} ${OBJECTS} arm-trusted-firmware-1.0-aw-6/tools/fip_create/fip_create.c000066400000000000000000000433151322600646200237200ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include /* getopt_long() is a GNU extention */ #include #include #include #include #include #include "fip_create.h" #include "firmware_image_package.h" /* Values returned by getopt() as part of the command line parsing */ #define OPT_TOC_ENTRY 0 #define OPT_DUMP 1 #define OPT_HELP 2 file_info_t files[MAX_FILES]; unsigned file_info_count = 0; uuid_t uuid_null = {0}; /* * TODO: Add ability to specify and flag different file types. * Add flags to the toc_entry? * const char* format_type_str[] = { "RAW", "ELF", "PIC" }; */ /* The images used depends on the platform. */ static entry_lookup_list_t toc_entry_lookup_list[] = { { "Trusted Boot Firmware BL2", UUID_TRUSTED_BOOT_FIRMWARE_BL2, "bl2", NULL, FLAG_FILENAME }, { "SCP Firmware BL3-0", UUID_SCP_FIRMWARE_BL30, "bl30", NULL, FLAG_FILENAME}, { "EL3 Runtime Firmware BL3-1", UUID_EL3_RUNTIME_FIRMWARE_BL31, "bl31", NULL, FLAG_FILENAME}, { "Secure Payload BL3-2 (Trusted OS)", UUID_SECURE_PAYLOAD_BL32, "bl32", NULL, FLAG_FILENAME}, { "Non-Trusted Firmware BL3-3", UUID_NON_TRUSTED_FIRMWARE_BL33, "bl33", NULL, FLAG_FILENAME}, { NULL, {0}, 0 } }; /* Return 0 for equal uuids */ static inline int compare_uuids(const uuid_t *uuid1, const uuid_t *uuid2) { return memcmp(uuid1, uuid2, sizeof(uuid_t)); } static inline void copy_uuid(uuid_t *to_uuid, const uuid_t *from_uuid) { memcpy(to_uuid, from_uuid, sizeof(uuid_t)); } static void print_usage(void) { entry_lookup_list_t *entry = toc_entry_lookup_list; printf("Usage: fip_create [options] FIP_FILENAME\n\n"); printf("\tThis tool is used to create a Firmware Image Package.\n\n"); printf("Options:\n"); printf("\t--help: Print this help message and exit\n"); printf("\t--dump: Print contents of FIP\n\n"); printf("\tComponents that can be added/updated:\n"); for (; entry->command_line_name != NULL; entry++) { printf("\t--%s%s\t\t%s", entry->command_line_name, (entry->flags & FLAG_FILENAME) ? " FILENAME" : "", entry->name); printf("\n"); } } static entry_lookup_list_t *get_entry_lookup_from_uuid(const uuid_t *uuid) { unsigned int lookup_index = 0; while (toc_entry_lookup_list[lookup_index].command_line_name != NULL) { if (compare_uuids(&toc_entry_lookup_list[lookup_index].name_uuid, uuid) == 0) { return &toc_entry_lookup_list[lookup_index]; } lookup_index++; } return NULL; } static file_info_t *find_file_info_from_uuid(const uuid_t *uuid) { int index; for (index = 0; index < file_info_count; index++) { if (compare_uuids(&files[index].name_uuid, uuid) == 0) { return &files[index]; } } return NULL; } static int add_file_info_entry(entry_lookup_list_t *lookup_entry, char *filename) { file_info_t *file_info_entry; int error; struct stat file_status; bool is_new_entry = false; /* Check if the file already exists in the array */ file_info_entry = find_file_info_from_uuid(&lookup_entry->name_uuid); if (file_info_entry == NULL) { /* The file does not exist in the current list; take the next * one available in the file_info list. 'file_info_count' is * incremented in case of successful update at the end of the * function. */ file_info_entry = &files[file_info_count]; is_new_entry = true; /* Copy the uuid for the new entry */ copy_uuid(&file_info_entry->name_uuid, &lookup_entry->name_uuid); } /* Get the file information for entry */ error = stat(filename, &file_status); if (error != 0) { printf("Error: Cannot get information for file \"%s\": %s\n", filename, strerror(errno)); return errno; } file_info_entry->filename = filename; file_info_entry->size = (unsigned int)file_status.st_size; file_info_entry->entry = lookup_entry; /* Increment the file_info counter on success if it is new file entry */ if (is_new_entry) { file_info_count++; /* Ensure we do not overflow */ if (file_info_count > MAX_FILES) { printf("ERROR: Too many files in Package\n"); return 1; } } return 0; } static int write_memory_to_file(const uint8_t *start, const char *filename, unsigned int size) { FILE *stream; unsigned int bytes_written; /* Write the packed file out to the filesystem */ stream = fopen(filename, "r+"); if (stream == NULL) { stream = fopen(filename, "w"); if (stream == NULL) { printf("Error: Cannot create output file \"%s\": %s\n", filename, strerror(errno)); return errno; } else { printf("Creating \"%s\"\n", filename); } } else { printf("Updating \"%s\"\n", filename); } bytes_written = fwrite(start, sizeof(uint8_t), size, stream); fclose(stream); if (bytes_written != size) { printf("Error: Incorrect write for file \"%s\": Size=%u," "Written=%u bytes.\n", filename, size, bytes_written); return EIO; } return 0; } static int read_file_to_memory(void *memory, const file_info_t *info) { FILE *stream; unsigned int bytes_read; /* If the file_info is defined by its filename we need to load it */ if (info->filename) { /* Read image from filesystem */ stream = fopen(info->filename, "r"); if (stream == NULL) { printf("Error: Cannot open file \"%s\": %s\n", info->filename, strerror(errno)); return errno; } bytes_read = (unsigned int)fread(memory, sizeof(uint8_t), info->size, stream); fclose(stream); if (bytes_read != info->size) { printf("Error: Incomplete read for file \"%s\":" "Size=%u, Read=%u bytes.\n", info->filename, info->size, bytes_read); return EIO; } } else { if (info->image_buffer == NULL) { printf("ERROR: info->image_buffer = NULL\n"); return EIO; } /* Copy the file_info buffer (extracted from the existing * image package) into the new buffer. */ memcpy(memory, info->image_buffer, info->size); } return 0; } /* Create the image package file */ static int pack_images(const char *fip_filename) { int status; uint8_t *fip_base_address; void *entry_address; fip_toc_header_t *toc_header; fip_toc_entry_t *toc_entry; unsigned int entry_index; unsigned int toc_size; unsigned int fip_size; unsigned int entry_offset_address; unsigned int payload_size = 0; /* Validate filename */ if ((fip_filename == NULL) || (strcmp(fip_filename, "") == 0)) { return EINVAL; } /* Payload size calculation */ for (entry_index = 0; entry_index < file_info_count; entry_index++) { payload_size += files[entry_index].size; } /* Allocate memory for entire package, including the final null entry */ toc_size = (sizeof(fip_toc_header_t) + (sizeof(fip_toc_entry_t) * (file_info_count + 1))); fip_size = toc_size + payload_size; fip_base_address = malloc(fip_size); if (fip_base_address == NULL) { printf("Error: Can't allocate enough memory to create package." "Process aborted.\n"); return ENOMEM; } memset(fip_base_address, 0, fip_size); /* Create ToC Header */ toc_header = (fip_toc_header_t *)fip_base_address; toc_header->name = TOC_HEADER_NAME; toc_header->serial_number = TOC_HEADER_SERIAL_NUMBER; toc_header->flags = 0; toc_entry = (fip_toc_entry_t *)(fip_base_address + sizeof(fip_toc_header_t)); /* Calculate the starting address of the first image, right after the * toc header. */ entry_offset_address = toc_size; entry_index = 0; /* Create the package in memory. */ for (entry_index = 0; entry_index < file_info_count; entry_index++) { entry_address = (fip_base_address + entry_offset_address); status = read_file_to_memory(entry_address, &files[entry_index]); if (status != 0) { printf("Error: While reading \"%s\" from filesystem.\n", files[entry_index].filename); return status; } copy_uuid(&toc_entry->uuid, &files[entry_index].name_uuid); toc_entry->offset_address = entry_offset_address; toc_entry->size = files[entry_index].size; toc_entry->flags = 0; entry_offset_address += toc_entry->size; toc_entry++; } /* Add a null uuid entry to mark the end of toc entries */ copy_uuid(&toc_entry->uuid, &uuid_null); toc_entry->offset_address = entry_offset_address; toc_entry->size = 0; toc_entry->flags = 0; /* Save the package to file */ status = write_memory_to_file(fip_base_address, fip_filename, fip_size); if (status != 0) { printf("Error: Failed while writing package to file \"%s\" " "with status=%d.\n", fip_filename, status); return status; } return 0; } static void dump_toc(void) { unsigned int index = 0; unsigned int image_offset; unsigned int image_size = 0; image_offset = sizeof(fip_toc_header_t) + (sizeof(fip_toc_entry_t) * (file_info_count + 1)); printf("Firmware Image Package ToC:\n"); printf("---------------------------\n"); for (index = 0; index < file_info_count; index++) { if (files[index].entry) { printf("- %s: ", files[index].entry->name); } else { printf("- Unknown entry: "); } image_size = files[index].size; printf("offset=0x%X, size=0x%X\n", image_offset, image_size); image_offset += image_size; if (files[index].filename) { printf(" file: '%s'\n", files[index].filename); } } printf("---------------------------\n"); } /* Read and load existing package into memory. */ static int parse_fip(const char *fip_filename) { FILE *fip; char *fip_buffer; char *fip_buffer_end; int fip_size, read_fip_size; fip_toc_header_t *toc_header; fip_toc_entry_t *toc_entry; bool found_last_toc_entry = false; file_info_t *file_info_entry; int status = -1; struct stat st; fip = fopen(fip_filename, "r"); if (fip == NULL) { /* If the fip does not exist just return, it should not be * considered as an error. The package will be created later */ status = 0; goto parse_fip_return; } if (stat(fip_filename, &st) != 0) { status = errno; goto parse_fip_fclose; } else { fip_size = (int)st.st_size; } /* Allocate a buffer to read the package */ fip_buffer = (char *)malloc(fip_size); if (fip_buffer == NULL) { printf("ERROR: Cannot allocate %d bytes.\n", fip_size); status = errno; goto parse_fip_fclose; } fip_buffer_end = fip_buffer + fip_size; /* Read the file */ read_fip_size = fread(fip_buffer, sizeof(char), fip_size, fip); if (read_fip_size != fip_size) { printf("ERROR: Cannot read the FIP.\n"); status = EIO; goto parse_fip_free; } fclose(fip); fip = NULL; /* The package must at least contain the ToC Header */ if (fip_size < sizeof(fip_toc_header_t)) { printf("ERROR: Given FIP is smaller than the ToC header.\n"); status = EINVAL; goto parse_fip_free; } /* Set the ToC Header at the base of the buffer */ toc_header = (fip_toc_header_t *)fip_buffer; /* The first toc entry should be just after the ToC header */ toc_entry = (fip_toc_entry_t *)(toc_header + 1); /* While the ToC entry is contained into the buffer */ int cnt = 0; while (((char *)toc_entry + sizeof(fip_toc_entry_t)) < fip_buffer_end) { cnt++; /* Check if the ToC Entry is the last one */ if (compare_uuids(&toc_entry->uuid, &uuid_null) == 0) { found_last_toc_entry = true; status = 0; break; } /* Add the entry into file_info */ /* Get the new entry in the array and clear it */ file_info_entry = &files[file_info_count++]; memset(file_info_entry, 0, sizeof(file_info_t)); /* Copy the info from the ToC entry */ copy_uuid(&file_info_entry->name_uuid, &toc_entry->uuid); file_info_entry->image_buffer = fip_buffer + toc_entry->offset_address; file_info_entry->size = toc_entry->size; /* Check if there is a corresponding entry in lookup table */ file_info_entry->entry = get_entry_lookup_from_uuid(&toc_entry->uuid); /* Go to the next ToC entry */ toc_entry++; } if (!found_last_toc_entry) { printf("ERROR: Given FIP does not have an end ToC entry.\n"); status = EINVAL; goto parse_fip_free; } else { /* All is well, we should not free any of the loaded images */ goto parse_fip_fclose; } parse_fip_free: if (fip_buffer != NULL) { free(fip_buffer); fip_buffer = NULL; } parse_fip_fclose: if (fip != NULL) { fclose(fip); } parse_fip_return: return status; } /* Parse all command-line options and return the FIP name if present. */ static char *get_filename(int argc, char **argv, struct option *options) { int c; char *filename = NULL; /* Reset option pointer so we parse all args. starts at 1. * The filename is the only argument that does not have an option flag. */ optind = 1; while (1) { c = getopt_long(argc, argv, "", options, NULL); if (c == -1) break; if (c == '?') { /* Failed to parse an option. Fail. */ return NULL; } } /* Only one argument left then it is the filename. * We dont expect any other options */ if (optind + 1 == argc) filename = argv[optind]; return filename; } /* Work through command-line options */ static int parse_cmdline(int argc, char **argv, struct option *options, int *do_pack) { int c; int status = 0; int option_index = 0; entry_lookup_list_t *lookup_entry; int do_dump = 0; /* restart parse to process all options. starts at 1. */ optind = 1; while (1) { c = getopt_long(argc, argv, "", options, &option_index); if (c == -1) break; switch (c) { case OPT_TOC_ENTRY: if (optarg) { /* Does the option expect a filename. */ lookup_entry = &toc_entry_lookup_list[option_index]; if (lookup_entry->flags & FLAG_FILENAME) { status = add_file_info_entry(lookup_entry, optarg); if (status != 0) { printf("Failed to process %s\n", options[option_index].name); break; } else { /* Update package */ *do_pack = 1; } } } break; case OPT_DUMP: do_dump = 1; continue; case OPT_HELP: print_usage(); exit(0); default: /* Unrecognised options are caught in get_filename() */ break; } } /* Do not dump toc if we have an error as it could hide the error */ if ((status == 0) && (do_dump)) { dump_toc(); } return status; } int main(int argc, char **argv) { int i; int status; char *fip_filename; int do_pack = 0; /* Clear file list table. */ memset(files, 0, sizeof(files)); /* Initialise for getopt_long(). * Use image table as defined at top of file to get options. * Add 'dump' option, 'help' option and end marker. */ static struct option long_options[(sizeof(toc_entry_lookup_list)/ sizeof(entry_lookup_list_t)) + 2]; for (i = 0; /* -1 because we dont want to process end marker in toc table */ i < sizeof(toc_entry_lookup_list)/sizeof(entry_lookup_list_t) - 1; i++) { long_options[i].name = toc_entry_lookup_list[i].command_line_name; /* The only flag defined at the moment is for a FILENAME */ long_options[i].has_arg = toc_entry_lookup_list[i].flags ? 1 : 0; long_options[i].flag = 0; long_options[i].val = OPT_TOC_ENTRY; } /* Add '--dump' option */ long_options[i].name = "dump"; long_options[i].has_arg = 0; long_options[i].flag = 0; long_options[i].val = OPT_DUMP; /* Add '--help' option */ long_options[++i].name = "help"; long_options[i].has_arg = 0; long_options[i].flag = 0; long_options[i].val = OPT_HELP; /* Zero the last entry (required) */ long_options[++i].name = 0; long_options[i].has_arg = 0; long_options[i].flag = 0; long_options[i].val = 0; #ifdef DEBUG /* Print all supported options */ for (i = 0; i < sizeof(long_options)/sizeof(struct option); i++) { printf("long opt (%d) : name = %s\n", i, long_options[i].name); } #endif /* DEBUG */ /* As the package may already exist and is to be updated we need to get * the filename from the arguments and load from it. * NOTE: As this is the first function to look at the program arguments * it causes a failure if bad options were provided. */ fip_filename = get_filename(argc, argv, long_options); /* Try to open the file and load it into memory */ if (fip_filename != NULL) { status = parse_fip(fip_filename); if (status != 0) { return status; } } /* Work through provided program arguments and perform actions */ status = parse_cmdline(argc, argv, long_options, &do_pack); if (status != 0) { return status; }; if (fip_filename == NULL) { printf("ERROR: Missing FIP filename\n"); print_usage(); return 0; } /* Processed all command line options. Create/update the package if * required. */ if (do_pack) { status = pack_images(fip_filename); if (status != 0) { printf("Failed to create package (status = %d).\n", status); } } return status; } arm-trusted-firmware-1.0-aw-6/tools/fip_create/fip_create.h000066400000000000000000000041711322600646200237220ustar00rootroot00000000000000/* * Copyright (c) 2014, 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: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of ARM nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __FIP_CREATE_H__ #define __FIP_CREATE_H__ #include #include #define MAX_FILES 10 /* TODO: Update this number as required */ #define TOC_HEADER_SERIAL_NUMBER 0x12345678 #define FLAG_FILENAME (1 << 0) typedef struct entry_lookup_list { const char *name; uuid_t name_uuid; const char *command_line_name; struct file_info *info; unsigned int flags; } entry_lookup_list_t; typedef struct file_info { uuid_t name_uuid; const char *filename; unsigned int size; void *image_buffer; entry_lookup_list_t *entry; } file_info_t; #endif /* __FIP_CREATE_H__ */ arm-trusted-firmware-1.0-aw-6/tools/fip_create/firmware_image_package.h000077700000000000000000000000001322600646200364052../../include/common/firmware_image_package.hustar00rootroot00000000000000arm-trusted-firmware-1.0-aw-6/tools/fip_create/uuid.h000077700000000000000000000000001322600646200300462../../include/stdlib/sys/uuid.hustar00rootroot00000000000000