libpayload: Add support for arm64 in libpayload
Basic support for arm64 is enabled in libpayload. Features added: 1) mem* operations in assembly. 2) Basic exception handling and support for testing exceptions. 3) Caching support. Tested with arm64-generic board compilation. BUG=None BRANCH=None TEST=Compilation successful Original-Change-Id: I4e86301f9c6383abc078e2b70071fb84bd6e4741 Original-Signed-off-by: Furquan Shaikh <furquan@google.com> Original-Reviewed-on: https://chromium-review.googlesource.com/187067 Original-Tested-by: Furquan Shaikh <furquan@chromium.org> Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org> (cherry picked from commit a70d13f3d225535843ab352290eab2e1ec7a9b4b) Signed-off-by: Marc Jones <marc.jones@se-eng.com> Change-Id: Ie3affe6a2bdd4fed3058de739d4c6aa573e5b251 Reviewed-on: http://review.coreboot.org/8063 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
		
				
					committed by
					
						 Marc Jones
						Marc Jones
					
				
			
			
				
	
			
			
			
						parent
						
							2445274347
						
					
				
				
					commit
					8c8c377584
				
			| @@ -77,6 +77,11 @@ config ARCH_X86 | |||||||
|         help |         help | ||||||
|           Support the x86 architecture |           Support the x86 architecture | ||||||
|  |  | ||||||
|  | config ARCH_ARM64 | ||||||
|  |         bool "ARM64" | ||||||
|  |         help | ||||||
|  |           Support the ARM64 architecture | ||||||
|  |  | ||||||
| endchoice | endchoice | ||||||
|  |  | ||||||
| config MEMMAP_RAM_ONLY | config MEMMAP_RAM_ONLY | ||||||
|   | |||||||
| @@ -92,6 +92,7 @@ include util/kconfig/Makefile | |||||||
| include $(HAVE_DOTCONFIG) | include $(HAVE_DOTCONFIG) | ||||||
|  |  | ||||||
| ARCHDIR-$(CONFIG_LP_ARCH_ARM)     := arm | ARCHDIR-$(CONFIG_LP_ARCH_ARM)     := arm | ||||||
|  | ARCHDIR-$(CONFIG_LP_ARCH_ARM64)   := arm64 | ||||||
| ARCHDIR-$(CONFIG_LP_ARCH_X86)     := x86 | ARCHDIR-$(CONFIG_LP_ARCH_X86)     := x86 | ||||||
|  |  | ||||||
| ARCH-y := $(ARCHDIR-y) | ARCH-y := $(ARCHDIR-y) | ||||||
| @@ -99,6 +100,7 @@ ARCH-y := $(ARCHDIR-y) | |||||||
| # If architecture folder name is different from GCC binutils architecture name, | # If architecture folder name is different from GCC binutils architecture name, | ||||||
| # override here. | # override here. | ||||||
| ARCH-$(CONFIG_LP_ARCH_ARM)     := arm | ARCH-$(CONFIG_LP_ARCH_ARM)     := arm | ||||||
|  | ARCH-$(CONFIG_LP_ARCH_ARM64)   := arm64 | ||||||
| ARCH-$(CONFIG_LP_ARCH_X86)     := i386 | ARCH-$(CONFIG_LP_ARCH_X86)     := i386 | ||||||
|  |  | ||||||
| CC := $(CC_$(ARCH-y)) | CC := $(CC_$(ARCH-y)) | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ | |||||||
| export KERNELVERSION      := 0.2.0 | export KERNELVERSION      := 0.2.0 | ||||||
|  |  | ||||||
| ARCHDIR-$(CONFIG_LP_ARCH_ARM)     := arm | ARCHDIR-$(CONFIG_LP_ARCH_ARM)     := arm | ||||||
|  | ARCHDIR-$(CONFIG_LP_ARCH_ARM64)   := arm64 | ||||||
| ARCHDIR-$(CONFIG_LP_ARCH_X86)     := x86 | ARCHDIR-$(CONFIG_LP_ARCH_X86)     := x86 | ||||||
| DESTDIR ?= install | DESTDIR ?= install | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,3 +29,4 @@ | |||||||
|  |  | ||||||
| source "arch/arm/Config.in" | source "arch/arm/Config.in" | ||||||
| source "arch/x86/Config.in" | source "arch/x86/Config.in" | ||||||
|  | source "arch/arm64/Config.in" | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								payloads/libpayload/arch/arm64/Config.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								payloads/libpayload/arch/arm64/Config.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | ## | ||||||
|  | ## This file is part of the libpayload project. | ||||||
|  | ## | ||||||
|  | ## Copyright (c) 2012 Google 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. The name of the author may not 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. | ||||||
|  | ## | ||||||
|  |  | ||||||
|  | if ARCH_ARM64 | ||||||
|  |  | ||||||
|  | config ARCH_SPECIFIC_OPTIONS # dummy | ||||||
|  | 	def_bool y | ||||||
|  | 	select LITTLE_ENDIAN | ||||||
|  |  | ||||||
|  | endif | ||||||
							
								
								
									
										43
									
								
								payloads/libpayload/arch/arm64/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								payloads/libpayload/arch/arm64/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | ## | ||||||
|  | ## This file is part of the libpayload project. | ||||||
|  | ## | ||||||
|  | ## Copyright (C) 2008 Advanced Micro Devices, 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. The name of the author may not 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. | ||||||
|  | ## | ||||||
|  |  | ||||||
|  | CFLAGS += -march=armv8-a | ||||||
|  | arm64_asm_flags = | ||||||
|  |  | ||||||
|  | head.o-y += head.S | ||||||
|  | libc-y += main.c sysinfo.c | ||||||
|  | libc-y += timer.c coreboot.c util.S | ||||||
|  | libc-y += virtual.c | ||||||
|  | libc-y += memcpy.S memset.S memmove.S | ||||||
|  | libc-y += exception_asm.S exception.c | ||||||
|  | libc-y += cache.c cpu.S | ||||||
|  |  | ||||||
|  | # Add other classes here when you put assembly files into them! | ||||||
|  |  head.o-S-ccopts += $(arm64_asm_flags) | ||||||
|  |  libc-S-ccopts += $(arm64_asm_flags) | ||||||
							
								
								
									
										149
									
								
								payloads/libpayload/arch/arm64/cache.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								payloads/libpayload/arch/arm64/cache.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the coreboot project. | ||||||
|  |  * | ||||||
|  |  * Copyright 2013 Google 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. The name of the author may not 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. | ||||||
|  |  * | ||||||
|  |  * cache.c: Cache maintenance routines for ARM64-A and ARM64-R | ||||||
|  |  * | ||||||
|  |  * Reference: ARM64 Architecture Reference Manual, ARM64-A and ARM64-R edition | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | #include <arch/cache.h> | ||||||
|  |  | ||||||
|  | void tlb_invalidate_all(void) | ||||||
|  | { | ||||||
|  | 	/* TLBIALL includes dTLB and iTLB on systems that have them. */ | ||||||
|  | 	tlbiall_el3(); | ||||||
|  | 	dsb(); | ||||||
|  | 	isb(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | enum dcache_op { | ||||||
|  | 	OP_DCCSW, | ||||||
|  | 	OP_DCCISW, | ||||||
|  | 	OP_DCISW, | ||||||
|  | 	OP_DCCIVAC, | ||||||
|  | 	OP_DCCVAC, | ||||||
|  | 	OP_DCIVAC, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | unsigned int dcache_line_bytes(void) | ||||||
|  | { | ||||||
|  | 	uint32_t ccsidr; | ||||||
|  | 	static unsigned int line_bytes = 0; | ||||||
|  |  | ||||||
|  | 	if (line_bytes) | ||||||
|  | 		return line_bytes; | ||||||
|  |  | ||||||
|  | 	ccsidr = read_ccsidr(); | ||||||
|  | 	/* [2:0] - Indicates (Log2(number of words in cache line)) - 2 */ | ||||||
|  | 	line_bytes = 1 << ((ccsidr & 0x7) + 2);	/* words per line */ | ||||||
|  | 	line_bytes *= sizeof(unsigned int);	/* bytes per word */ | ||||||
|  |  | ||||||
|  | 	return line_bytes; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Do a dcache operation by virtual address. This is useful for | ||||||
|  |  * maintaining coherency in drivers which do DMA transfers and only need to | ||||||
|  |  * perform cache maintenance on a particular memory range rather than the | ||||||
|  |  * entire cache. | ||||||
|  |  */ | ||||||
|  | static void dcache_op_va(void const *addr, size_t len, enum dcache_op op) | ||||||
|  | { | ||||||
|  | 	unsigned long line, linesize; | ||||||
|  |  | ||||||
|  | 	linesize = dcache_line_bytes(); | ||||||
|  | 	line = (uintptr_t)addr & ~(linesize - 1); | ||||||
|  |  | ||||||
|  | 	dsb(); | ||||||
|  | 	while (line < (uintptr_t)addr + len) { | ||||||
|  | 		switch(op) { | ||||||
|  | 		case OP_DCCIVAC: | ||||||
|  | 			dccivac(line); | ||||||
|  | 			break; | ||||||
|  | 		case OP_DCCVAC: | ||||||
|  | 			dccvac(line); | ||||||
|  | 			break; | ||||||
|  | 		case OP_DCIVAC: | ||||||
|  | 			dcivac(line); | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		line += linesize; | ||||||
|  | 	} | ||||||
|  | 	isb(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void dcache_clean_by_va(void const *addr, size_t len) | ||||||
|  | { | ||||||
|  | 	dcache_op_va(addr, len, OP_DCCVAC); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void dcache_clean_invalidate_by_va(void const *addr, size_t len) | ||||||
|  | { | ||||||
|  | 	dcache_op_va(addr, len, OP_DCCIVAC); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void dcache_invalidate_by_va(void const *addr, size_t len) | ||||||
|  | { | ||||||
|  | 	dcache_op_va(addr, len, OP_DCIVAC); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * CAUTION: This implementation assumes that coreboot never uses non-identity | ||||||
|  |  * page tables for pages containing executed code. If you ever want to violate | ||||||
|  |  * this assumption, have fun figuring out the associated problems on your own. | ||||||
|  |  */ | ||||||
|  | void dcache_mmu_disable(void) | ||||||
|  | { | ||||||
|  | 	uint32_t sctlr; | ||||||
|  |  | ||||||
|  | 	dcache_clean_invalidate_all(); | ||||||
|  | 	sctlr = read_sctlr_el3(); | ||||||
|  | 	sctlr &= ~(SCTLR_C | SCTLR_M); | ||||||
|  | 	write_sctlr_el3(sctlr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void dcache_mmu_enable(void) | ||||||
|  | { | ||||||
|  | 	uint32_t sctlr; | ||||||
|  |  | ||||||
|  | 	sctlr = read_sctlr_el3(); | ||||||
|  | 	sctlr |= SCTLR_C | SCTLR_M; | ||||||
|  | 	write_sctlr_el3(sctlr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void cache_sync_instructions(void) | ||||||
|  | { | ||||||
|  | 	dcache_clean_all();	/* includes trailing DSB (in assembly) */ | ||||||
|  | 	iciallu();		/* includes BPIALLU (architecturally) */ | ||||||
|  | 	dsb(); | ||||||
|  | 	isb(); | ||||||
|  | } | ||||||
							
								
								
									
										307
									
								
								payloads/libpayload/arch/arm64/coreboot.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								payloads/libpayload/arch/arm64/coreboot.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,307 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, Inc. | ||||||
|  |  * Copyright (C) 2009 coresystems GmbH | ||||||
|  |  * | ||||||
|  |  * 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <libpayload-config.h> | ||||||
|  | #include <libpayload.h> | ||||||
|  | #include <coreboot_tables.h> | ||||||
|  |  | ||||||
|  | /* This pointer gets set in head.S and is passed in from coreboot. */ | ||||||
|  | void *cb_header_ptr; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Some of this is x86 specific, and the rest of it is generic. Right now, | ||||||
|  |  * since we only support x86, we'll avoid trying to make lots of infrastructure | ||||||
|  |  * we don't need. If in the future, we want to use coreboot on some other | ||||||
|  |  * architecture, then take out the generic parsing code and move it elsewhere. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* === Parsing code === */ | ||||||
|  | /* This is the generic parsing code. */ | ||||||
|  |  | ||||||
|  | static void cb_parse_memory(void *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct cb_memory *mem = ptr; | ||||||
|  | 	int count = MEM_RANGE_COUNT(mem); | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	if (count > SYSINFO_MAX_MEM_RANGES) | ||||||
|  | 		count = SYSINFO_MAX_MEM_RANGES; | ||||||
|  |  | ||||||
|  | 	info->n_memranges = 0; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < count; i++) { | ||||||
|  | 		struct cb_memory_range *range = MEM_RANGE_PTR(mem, i); | ||||||
|  |  | ||||||
|  | #ifdef CONFIG_LP_MEMMAP_RAM_ONLY | ||||||
|  | 		if (range->type != CB_MEM_RAM) | ||||||
|  | 			continue; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | 		info->memrange[info->n_memranges].base = | ||||||
|  | 		    cb_unpack64(range->start); | ||||||
|  |  | ||||||
|  | 		info->memrange[info->n_memranges].size = | ||||||
|  | 		    cb_unpack64(range->size); | ||||||
|  |  | ||||||
|  | 		info->memrange[info->n_memranges].type = range->type; | ||||||
|  |  | ||||||
|  | 		info->n_memranges++; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_serial(void *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	info->serial = ((struct cb_serial *)ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef CONFIG_LP_CHROMEOS | ||||||
|  | static void cb_parse_vboot_handoff(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct lb_range *vbho = (struct lb_range *)ptr; | ||||||
|  |  | ||||||
|  | 	info->vboot_handoff = (void *)(uintptr_t)vbho->range_start; | ||||||
|  | 	info->vboot_handoff_size = vbho->range_size; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_vbnv(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct lb_range *vbnv = (struct lb_range *)ptr; | ||||||
|  |  | ||||||
|  | 	info->vbnv_start = vbnv->range_start; | ||||||
|  | 	info->vbnv_size = vbnv->range_size; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_gpios(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	struct cb_gpios *gpios = (struct cb_gpios *)ptr; | ||||||
|  |  | ||||||
|  | 	info->num_gpios = (gpios->count < SYSINFO_MAX_GPIOS) ? | ||||||
|  | 				(gpios->count) : SYSINFO_MAX_GPIOS; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < info->num_gpios; i++) | ||||||
|  | 		info->gpios[i] = gpios->gpios[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_vdat(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct lb_range *vdat = (struct lb_range *)ptr; | ||||||
|  |  | ||||||
|  | 	info->vdat_addr = phys_to_virt(vdat->range_start); | ||||||
|  | 	info->vdat_size = vdat->range_size; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | static void cb_parse_dma(unsigned char *ptr) | ||||||
|  | { | ||||||
|  | 	struct lb_range *dma = (struct lb_range *)ptr; | ||||||
|  | 	init_dma_memory(phys_to_virt(dma->range_start), dma->range_size); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_tstamp(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct cb_cbmem_tab *const cbmem = (struct cb_cbmem_tab *)ptr; | ||||||
|  | 	info->tstamp_table = phys_to_virt(cbmem->cbmem_tab); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_cbmem_cons(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct cb_cbmem_tab *const cbmem = (struct cb_cbmem_tab *)ptr; | ||||||
|  | 	info->cbmem_cons = phys_to_virt(cbmem->cbmem_tab); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_mrc_cache(unsigned char *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct cb_cbmem_tab *const cbmem = (struct cb_cbmem_tab *)ptr; | ||||||
|  | 	info->mrc_cache = phys_to_virt(cbmem->cbmem_tab); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef CONFIG_LP_NVRAM | ||||||
|  | static void cb_parse_optiontable(void *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	/* ptr points to a coreboot table entry and is already virtual */ | ||||||
|  | 	info->option_table = ptr; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void cb_parse_checksum(void *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct cb_cmos_checksum *cmos_cksum = ptr; | ||||||
|  | 	info->cmos_range_start = cmos_cksum->range_start; | ||||||
|  | 	info->cmos_range_end = cmos_cksum->range_end; | ||||||
|  | 	info->cmos_checksum_location = cmos_cksum->location; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef CONFIG_LP_COREBOOT_VIDEO_CONSOLE | ||||||
|  | static void cb_parse_framebuffer(void *ptr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	/* ptr points to a coreboot table entry and is already virtual */ | ||||||
|  | 	info->framebuffer = ptr; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | static void cb_parse_string(unsigned char *ptr, char **info) | ||||||
|  | { | ||||||
|  | 	*info = (char *)((struct cb_string *)ptr)->string; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int cb_parse_header(void *addr, struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	struct cb_header *header = addr; | ||||||
|  | 	unsigned char *ptr = addr; | ||||||
|  | 	void *forward; | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	/* No signature found. */ | ||||||
|  | 	if (strncmp((const char *)header->signature, "LBIO", 4)) | ||||||
|  | 			return -1; | ||||||
|  |  | ||||||
|  | 	if (!header->table_bytes) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	/* Make sure the checksums match. */ | ||||||
|  | 	if (ipchksum((u16 *) header, sizeof(*header)) != 0) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	if (ipchksum((u16 *) (ptr + sizeof(*header)), | ||||||
|  | 		     header->table_bytes) != header->table_checksum) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	info->header = header; | ||||||
|  |  | ||||||
|  | 	/* Now, walk the tables. */ | ||||||
|  | 	ptr += header->header_bytes; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < header->table_entries; i++) { | ||||||
|  | 		struct cb_record *rec = (struct cb_record *)ptr; | ||||||
|  |  | ||||||
|  | 		/* We only care about a few tags here (maybe more later). */ | ||||||
|  | 		switch (rec->tag) { | ||||||
|  | 		case CB_TAG_FORWARD: | ||||||
|  | 			forward = phys_to_virt((void *)(unsigned long)((struct cb_forward *)rec)->forward); | ||||||
|  | 			return cb_parse_header(forward, info); | ||||||
|  | 			continue; | ||||||
|  | 		case CB_TAG_MEMORY: | ||||||
|  | 			cb_parse_memory(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_SERIAL: | ||||||
|  | 			cb_parse_serial(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_VERSION: | ||||||
|  | 			cb_parse_string(ptr, &info->cb_version); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_EXTRA_VERSION: | ||||||
|  | 			cb_parse_string(ptr, &info->extra_version); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_BUILD: | ||||||
|  | 			cb_parse_string(ptr, &info->build); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_COMPILE_TIME: | ||||||
|  | 			cb_parse_string(ptr, &info->compile_time); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_COMPILE_BY: | ||||||
|  | 			cb_parse_string(ptr, &info->compile_by); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_COMPILE_HOST: | ||||||
|  | 			cb_parse_string(ptr, &info->compile_host); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_COMPILE_DOMAIN: | ||||||
|  | 			cb_parse_string(ptr, &info->compile_domain); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_COMPILER: | ||||||
|  | 			cb_parse_string(ptr, &info->compiler); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_LINKER: | ||||||
|  | 			cb_parse_string(ptr, &info->linker); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_ASSEMBLER: | ||||||
|  | 			cb_parse_string(ptr, &info->assembler); | ||||||
|  | 			break; | ||||||
|  | #ifdef CONFIG_LP_NVRAM | ||||||
|  | 		case CB_TAG_CMOS_OPTION_TABLE: | ||||||
|  | 			cb_parse_optiontable(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_OPTION_CHECKSUM: | ||||||
|  | 			cb_parse_checksum(ptr, info); | ||||||
|  | 			break; | ||||||
|  | #endif | ||||||
|  | #ifdef CONFIG_LP_COREBOOT_VIDEO_CONSOLE | ||||||
|  | 		// FIXME we should warn on serial if coreboot set up a | ||||||
|  | 		// framebuffer buf the payload does not know about it. | ||||||
|  | 		case CB_TAG_FRAMEBUFFER: | ||||||
|  | 			cb_parse_framebuffer(ptr, info); | ||||||
|  | 			break; | ||||||
|  | #endif | ||||||
|  | 		case CB_TAG_MAINBOARD: | ||||||
|  | 			info->mainboard = (struct cb_mainboard *)ptr; | ||||||
|  | 			break; | ||||||
|  | #ifdef CONFIG_LP_CHROMEOS | ||||||
|  | 		case CB_TAG_GPIO: | ||||||
|  | 			cb_parse_gpios(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_VDAT: | ||||||
|  | 			cb_parse_vdat(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_VBNV: | ||||||
|  | 			cb_parse_vbnv(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_VBOOT_HANDOFF: | ||||||
|  | 			cb_parse_vboot_handoff(ptr, info); | ||||||
|  | 			break; | ||||||
|  | #endif | ||||||
|  | 		case CB_TAG_DMA: | ||||||
|  | 			cb_parse_dma(ptr); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_TIMESTAMPS: | ||||||
|  | 			cb_parse_tstamp(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_CBMEM_CONSOLE: | ||||||
|  | 			cb_parse_cbmem_cons(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		case CB_TAG_MRC_CACHE: | ||||||
|  | 			cb_parse_mrc_cache(ptr, info); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		ptr += rec->size; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* == Architecture specific == */ | ||||||
|  | /* FIXME put in actual address range */ | ||||||
|  |  | ||||||
|  | int get_coreboot_info(struct sysinfo_t *info) | ||||||
|  | { | ||||||
|  | 	int ret = cb_parse_header(cb_header_ptr, info); | ||||||
|  |  | ||||||
|  | 	return (ret == 1) ? 0 : -1; | ||||||
|  | } | ||||||
							
								
								
									
										98
									
								
								payloads/libpayload/arch/arm64/cpu.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								payloads/libpayload/arch/arm64/cpu.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | |||||||
|  | /* | ||||||
|  |  * Optimized assembly for low-level CPU operations on ARM64 processors. | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2010 Per Odlund <per.odlund@armagedon.se> | ||||||
|  |  * Copyright (c) 2014 Google 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <arch/asm.h> | ||||||
|  |  | ||||||
|  | .macro	dcache_apply_all crm | ||||||
|  | 	dsb	sy | ||||||
|  | 	mrs	x0, clidr_el1			// read CLIDR | ||||||
|  | 	and	w3, w0, #0x07000000		// narrow to LoC | ||||||
|  | 	lsr	w3, w3, #23			// left align LoC (low 4 bits) | ||||||
|  | 	cbz	w3, 5f //done | ||||||
|  |  | ||||||
|  | 	mov	w10, #0				// w10 = 2 * cache level | ||||||
|  | 	mov	w8, #1				// w8 = constant 0b1 | ||||||
|  |  | ||||||
|  | 1:	//next_level | ||||||
|  | 	add	w2, w10, w10, lsr #1		// calculate 3 * cache level | ||||||
|  | 	lsr	w1, w0, w2			// extract 3-bit cache type for this level | ||||||
|  | 	and	w1, w1, #0x7			// w1 = cache type | ||||||
|  | 	cmp	w1, #2				// is it data or i&d? | ||||||
|  | 	b.lt	4f //skip | ||||||
|  | 	msr	csselr_el1, x10			// select current cache level | ||||||
|  | 	isb					// sync change of csselr | ||||||
|  | 	mrs	x1, ccsidr_el1			// w1 = read ccsidr | ||||||
|  | 	and	w2, w1, #7			// w2 = log2(linelen_bytes) - 4 | ||||||
|  | 	add	w2, w2, #4			// w2 = log2(linelen_bytes) | ||||||
|  | 	ubfx	w4, w1, #3, #10			// w4 = associativity - 1 (also | ||||||
|  | 						// max way number) | ||||||
|  | 	clz	w5, w4				// w5 = 32 - log2(ways) | ||||||
|  | 						// (bit position of way in DC) | ||||||
|  | 	lsl	w9, w4, w5			// w9 = max way number | ||||||
|  | 						// (aligned for DC) | ||||||
|  | 	lsl	w16, w8, w5			// w16 = amount to decrement (way | ||||||
|  | 						// number per iteration) | ||||||
|  | 2:	//next_way | ||||||
|  | 	ubfx	w7, w1, #13, #15		// w7 = max set #, right aligned | ||||||
|  | 	lsl	w7, w7, w2			// w7 = max set #, DC aligned | ||||||
|  | 	lsl	w17, w8, w2			// w17 = amount to decrement (set | ||||||
|  | 						// number per iteration) | ||||||
|  |  | ||||||
|  | 3:	//next_set | ||||||
|  | 	orr	w11, w10, w9			// w11 = combine way # & cache # | ||||||
|  | 	orr	w11, w11, w7			// ... and set # | ||||||
|  | 	dc	\crm, x11			// clean and/or invalidate line | ||||||
|  | 	subs	w7, w7, w17			// decrement set number | ||||||
|  | 	b.ge	3b //next_set | ||||||
|  | 	subs	x9, x9, x16			// decrement way number | ||||||
|  | 	b.ge	2b //next_way | ||||||
|  |  | ||||||
|  | 4:	//skip | ||||||
|  | 	add	w10, w10, #2			// increment 2 *cache level | ||||||
|  | 	cmp	w3, w10				// Went beyond LoC? | ||||||
|  | 	b.gt	1b //next_level | ||||||
|  |  | ||||||
|  | 5:	//done | ||||||
|  | 	dsb	sy | ||||||
|  | 	isb | ||||||
|  | 	ret | ||||||
|  | .endm | ||||||
|  |  | ||||||
|  | ENTRY(dcache_invalidate_all) | ||||||
|  | 	dcache_apply_all crm=isw | ||||||
|  | ENDPROC(dcache_invalidate_all) | ||||||
|  |  | ||||||
|  | ENTRY(dcache_clean_all) | ||||||
|  | 	dcache_apply_all crm=csw | ||||||
|  | ENDPROC(dcache_clean_all) | ||||||
|  |  | ||||||
|  | ENTRY(dcache_clean_invalidate_all) | ||||||
|  | 	dcache_apply_all crm=cisw | ||||||
|  | ENDPROC(dcache_clean_invalidate_all) | ||||||
							
								
								
									
										42
									
								
								payloads/libpayload/arch/arm64/dummy_media.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								payloads/libpayload/arch/arm64/dummy_media.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2013 Google, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  | #define LIBPAYLOAD | ||||||
|  |  | ||||||
|  | #include <cbfs.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | /* The generic cbfs code relies on the libpayload_init_default_cbfs_media | ||||||
|  |  * symbol. Therefore, provide an implementation that just throws an error. */ | ||||||
|  |  | ||||||
|  | int libpayload_init_default_cbfs_media(struct cbfs_media *media); | ||||||
|  |  | ||||||
|  | int libpayload_init_default_cbfs_media(struct cbfs_media *media) | ||||||
|  | { | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
							
								
								
									
										96
									
								
								payloads/libpayload/arch/arm64/exception.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								payloads/libpayload/arch/arm64/exception.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright 2014 Google 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <exception.h> | ||||||
|  | #include <libpayload.h> | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | extern unsigned int test_exc; | ||||||
|  |  | ||||||
|  | struct exception_handler_info | ||||||
|  | { | ||||||
|  | 	const char *name; | ||||||
|  | 	exception_hook hook; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static struct exception_handler_info exceptions[EXC_COUNT] = { | ||||||
|  | 	[EXC_INV]  = { "_invalid_exception" }, | ||||||
|  | 	[EXC_SYNC] = { "_sync" }, | ||||||
|  | 	[EXC_IRQ]  = { "_irq" }, | ||||||
|  | 	[EXC_FIQ]  = { "_fiq" }, | ||||||
|  | 	[EXC_SERROR] = {"_serror"} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static void print_regs(struct exception_state *state) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	printf("ELR = 0x%016llx        ",state->elr); | ||||||
|  | 	printf("ESR = 0x%08llx         ",state->esr); | ||||||
|  | 	for (i = 0; i < 31; i++) { | ||||||
|  | 		printf("X%02d = 0x%016llx        ", i, state->regs[i]); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void exception_dispatch(struct exception_state *state, int idx); | ||||||
|  | void exception_dispatch(struct exception_state *state, int idx) | ||||||
|  | { | ||||||
|  | 	if (idx >= EXC_COUNT) { | ||||||
|  | 		printf("Bad exception index %d.\n", idx); | ||||||
|  | 	} else { | ||||||
|  | 		struct exception_handler_info *info = &exceptions[idx]; | ||||||
|  | 		if (info->hook) { | ||||||
|  | 			info->hook(idx, state); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (info->name) | ||||||
|  | 			printf("exception %s\n", info->name); | ||||||
|  | 		else | ||||||
|  | 			printf("exception _not_used.\n"); | ||||||
|  | 	} | ||||||
|  | 	print_regs(state); | ||||||
|  |  | ||||||
|  | 	if (test_exc) | ||||||
|  | 		test_exc = 0; | ||||||
|  | 	else | ||||||
|  | 		halt(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void exception_init(void) | ||||||
|  | { | ||||||
|  | 	extern void* exception_table; | ||||||
|  | 	set_vbar(exception_table); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void exception_install_hook(int type, exception_hook hook) | ||||||
|  | { | ||||||
|  | 	die_if(type >= EXC_COUNT, "Out of bounds exception index %d.\n", type); | ||||||
|  | 	exceptions[type].hook = hook; | ||||||
|  | } | ||||||
							
								
								
									
										146
									
								
								payloads/libpayload/arch/arm64/exception_asm.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								payloads/libpayload/arch/arm64/exception_asm.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright 2014 Google 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | 	.text | ||||||
|  |  | ||||||
|  | 	/* Macro for exception entry | ||||||
|  | 	 * Store x30 before any branch | ||||||
|  | 	 * Branch to exception_prologue to save rest of the registers | ||||||
|  | 	 * Move exception id into x1 | ||||||
|  | 	 * Branch to exception_handler | ||||||
|  | 	 */ | ||||||
|  | .macro eentry id | ||||||
|  | 	stp     x30, xzr, [sp, #-16]! | ||||||
|  | 	bl      exception_prologue | ||||||
|  | 	mov     x1, \id | ||||||
|  | 	bl      exception_handler | ||||||
|  | .endm | ||||||
|  |  | ||||||
|  | 	/* Exception table has 16 entries and each of 128 bytes | ||||||
|  | 	 * Hence, 16 * 128 = 2048. Thus, 11 passed as parameter | ||||||
|  | 	 * to align | ||||||
|  | 	 */ | ||||||
|  |  | ||||||
|  | 	.align  11 | ||||||
|  | 	.global exception_table | ||||||
|  | exception_table: | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | sync_el0: | ||||||
|  | 	eentry #0 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | irq_el0: | ||||||
|  | 	eentry #0 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | fiq_el0: | ||||||
|  | 	eentry #0 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | serror_el0: | ||||||
|  | 	eentry #0 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | sync_elx: | ||||||
|  | 	eentry #1 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | irq_elx: | ||||||
|  | 	eentry #2 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | fiq_elx: | ||||||
|  | 	eentry #3 | ||||||
|  |  | ||||||
|  | 	.align  7 | ||||||
|  | serror_elx: | ||||||
|  | 	eentry #4 | ||||||
|  |  | ||||||
|  | exception_prologue: | ||||||
|  | 	/* Save all registers x0-x29 */ | ||||||
|  | 	stp     x28, x29, [sp, #-16]! | ||||||
|  | 	stp     x26, x27, [sp, #-16]! | ||||||
|  | 	stp     x24, x25, [sp, #-16]! | ||||||
|  | 	stp     x22, x23, [sp, #-16]! | ||||||
|  | 	stp     x20, x21, [sp, #-16]! | ||||||
|  | 	stp     x18, x19, [sp, #-16]! | ||||||
|  | 	stp     x16, x17, [sp, #-16]! | ||||||
|  | 	stp     x14, x15, [sp, #-16]! | ||||||
|  | 	stp     x12, x13, [sp, #-16]! | ||||||
|  | 	stp     x10, x11, [sp, #-16]! | ||||||
|  | 	stp     x8, x9, [sp, #-16]! | ||||||
|  | 	stp     x6, x7, [sp, #-16]! | ||||||
|  | 	stp     x4, x5, [sp, #-16]! | ||||||
|  | 	stp     x2, x3, [sp, #-16]! | ||||||
|  | 	stp     x0, x1, [sp, #-16]! | ||||||
|  |  | ||||||
|  | 	/* Save the exception reason on stack */ | ||||||
|  | 	mrs     x1,  esr_el3 | ||||||
|  |  | ||||||
|  | 	/* Save the return address on stack */ | ||||||
|  | 	mrs     x0, elr_el3 | ||||||
|  | 	stp     x0, x1, [sp, #-16]! | ||||||
|  |  | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | exception_handler: | ||||||
|  | 	/* Save address of saved registers into x0 | ||||||
|  | 	 * This acts as first argument to exception_dispatch | ||||||
|  | 	 */ | ||||||
|  | 	mov     x0, sp | ||||||
|  | 	bl      exception_dispatch | ||||||
|  |  | ||||||
|  | 	/* Pop return address saved on stack */ | ||||||
|  | 	ldp     x0, x1, [sp], #16 | ||||||
|  | 	/* Pop exception reason saved on stack, followed by regs x0-x30 */ | ||||||
|  | 	ldp     x0, x1, [sp], #16 | ||||||
|  | 	ldp     x2, x3, [sp], #16 | ||||||
|  | 	ldp     x4, x5, [sp], #16 | ||||||
|  | 	ldp     x6, x7, [sp], #16 | ||||||
|  | 	ldp     x8, x9, [sp], #16 | ||||||
|  | 	ldp     x10, x11, [sp], #16 | ||||||
|  | 	ldp     x12, x13, [sp], #16 | ||||||
|  | 	ldp     x14, x15, [sp], #16 | ||||||
|  | 	ldp     x16, x17, [sp], #16 | ||||||
|  | 	ldp     x18, x19, [sp], #16 | ||||||
|  | 	ldp     x20, x21, [sp], #16 | ||||||
|  | 	ldp     x22, x23, [sp], #16 | ||||||
|  | 	ldp     x24, x25, [sp], #16 | ||||||
|  | 	ldp     x26, x27, [sp], #16 | ||||||
|  | 	ldp     x28, x29, [sp], #16 | ||||||
|  | 	ldp     x30, xzr, [sp], #16 | ||||||
|  | 	eret | ||||||
|  |  | ||||||
|  | 	.global set_vbar | ||||||
|  | set_vbar: | ||||||
|  | 	/* Initialize the exception table address in vbar for EL3 */ | ||||||
|  | 	/* FIXME: Do we need to initialize for other levels too? EL1/EL2 */ | ||||||
|  | 	msr     vbar_el3, x0 | ||||||
|  | 	ret | ||||||
							
								
								
									
										66
									
								
								payloads/libpayload/arch/arm64/head.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								payloads/libpayload/arch/arm64/head.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <arch/asm.h> | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Our entry point | ||||||
|  |  */ | ||||||
|  | ENTRY(_entry) | ||||||
|  |  | ||||||
|  | 	/* Save off the location of the coreboot tables */ | ||||||
|  | 	ldr x1, 1f | ||||||
|  | 	str x0, [x1] | ||||||
|  |  | ||||||
|  | 	/* TODO: disable interrupts */ | ||||||
|  |  | ||||||
|  | 	/* TODO: Clear BSS */ | ||||||
|  |  | ||||||
|  | 	/* Setup new stack */ | ||||||
|  | 	ldr x1, 2f | ||||||
|  | 	mov sp, x1 | ||||||
|  |  | ||||||
|  | 	/* TODO: Save old stack pointer and link register */ | ||||||
|  |  | ||||||
|  | 	/* Let's rock. */ | ||||||
|  | 	bl start_main | ||||||
|  |  | ||||||
|  | 	/* %r0 has the return value - pass it on unmolested */ | ||||||
|  |  | ||||||
|  | 	/* TODO: restore old stack pointer and link register */ | ||||||
|  |  | ||||||
|  | 	/* Return to the original context. */ | ||||||
|  | 	ret | ||||||
|  | ENDPROC(_entry) | ||||||
|  |  | ||||||
|  | .align 4 | ||||||
|  | 1: | ||||||
|  | .quad	cb_header_ptr | ||||||
|  | 2: | ||||||
|  | .quad	_stack | ||||||
							
								
								
									
										93
									
								
								payloads/libpayload/arch/arm64/libpayload.ldscript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								payloads/libpayload/arch/arm64/libpayload.ldscript
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2013 Google, Inc. | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | BASE_ADDRESS = 0x80100000; | ||||||
|  |  | ||||||
|  | OUTPUT_FORMAT("elf64-littleaarch64","elf64-littleaarch64", "elf64-littleaarch64") | ||||||
|  | OUTPUT_ARCH(arm64) | ||||||
|  |  | ||||||
|  | ENTRY(_entry) | ||||||
|  |  | ||||||
|  | HEAP_SIZE = 2*64*1024; | ||||||
|  | STACK_SIZE = 16384; | ||||||
|  |  | ||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  | 	. = BASE_ADDRESS; | ||||||
|  |  | ||||||
|  | 	. = ALIGN(16); | ||||||
|  | 	_start = .; | ||||||
|  |  | ||||||
|  | 	.text : { | ||||||
|  | 		*(.text._entry) | ||||||
|  | 		*(.text) | ||||||
|  | 		*(.text.*) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	.rodata : { | ||||||
|  | 		*(.rodata) | ||||||
|  | 		*(.rodata.*) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	.data : { | ||||||
|  | 		*(.data) | ||||||
|  | 		*(.data.*) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_edata = .; | ||||||
|  |  | ||||||
|  | 	.bss : { | ||||||
|  | 		*(.sbss) | ||||||
|  | 		*(.sbss.*) | ||||||
|  | 		*(.bss) | ||||||
|  | 		*(.bss.*) | ||||||
|  | 		*(COMMON) | ||||||
|  |  | ||||||
|  | 		/* Stack and heap */ | ||||||
|  |  | ||||||
|  | 		. = ALIGN(16); | ||||||
|  | 		_heap = .; | ||||||
|  | 		. += HEAP_SIZE; | ||||||
|  | 		. = ALIGN(16); | ||||||
|  | 		_eheap = .; | ||||||
|  |  | ||||||
|  | 		_estack = .; | ||||||
|  | 		. += STACK_SIZE; | ||||||
|  | 		. = ALIGN(16); | ||||||
|  | 		_stack = .; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_end = .; | ||||||
|  |  | ||||||
|  | 	/DISCARD/ : { | ||||||
|  | 		*(.comment) | ||||||
|  | 		*(.note*) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										82
									
								
								payloads/libpayload/arch/arm64/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								payloads/libpayload/arch/arm64/main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <exception.h> | ||||||
|  | #include <libpayload.h> | ||||||
|  |  | ||||||
|  | unsigned int main_argc;    /**< The argc value to pass to main() */ | ||||||
|  |  | ||||||
|  | /** The argv value to pass to main() */ | ||||||
|  | char *main_argv[MAX_ARGC_COUNT]; | ||||||
|  |  | ||||||
|  | unsigned int test_exc; | ||||||
|  |  | ||||||
|  | int test_exception(void); | ||||||
|  | int test_exception(void) | ||||||
|  | { | ||||||
|  | 	int a = 1; | ||||||
|  | 	int b = 0; | ||||||
|  | 	test_exc = 1; | ||||||
|  | 	return a/b; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * This is our C entry function - set up the system | ||||||
|  |  * and jump into the payload entry point. | ||||||
|  |  */ | ||||||
|  | void start_main(void); | ||||||
|  | void start_main(void) | ||||||
|  | { | ||||||
|  | 	extern int main(int argc, char **argv); | ||||||
|  |  | ||||||
|  | 	printf("hello libpayload world"); | ||||||
|  | 	/* Gather system information. */ | ||||||
|  | 	lib_get_sysinfo(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	exception_init(); | ||||||
|  |  | ||||||
|  | 	test_exception(); | ||||||
|  | 	/* | ||||||
|  | 	 * Any other system init that has to happen before the | ||||||
|  | 	 * user gets control goes here. | ||||||
|  | 	 */ | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * Go to the entry point. | ||||||
|  | 	 * In the future we may care about the return value. | ||||||
|  | 	 */ | ||||||
|  |  | ||||||
|  | 	(void) main(main_argc, (main_argc != 0) ? main_argv : NULL); | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * Returning here will go to the _leave function to return | ||||||
|  | 	 * us to the original context. | ||||||
|  | 	 */ | ||||||
|  | } | ||||||
							
								
								
									
										189
									
								
								payloads/libpayload/arch/arm64/memcpy.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								payloads/libpayload/arch/arm64/memcpy.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,189 @@ | |||||||
|  | /* Copyright (c) 2012-2013, Linaro Limited | ||||||
|  |    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 Linaro 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. */ | ||||||
|  |  | ||||||
|  | /* Assumptions: | ||||||
|  |  * | ||||||
|  |  * ARMv8-a, AArch64 | ||||||
|  |  * Unaligned accesses | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define dstin	x0 | ||||||
|  | #define src	x1 | ||||||
|  | #define count	x2 | ||||||
|  | #define tmp1	x3 | ||||||
|  | #define tmp1w	w3 | ||||||
|  | #define tmp2	x4 | ||||||
|  | #define tmp2w	w4 | ||||||
|  | #define tmp3	x5 | ||||||
|  | #define tmp3w	w5 | ||||||
|  | #define dst	x6 | ||||||
|  |  | ||||||
|  | #define A_l	x7 | ||||||
|  | #define A_h	x8 | ||||||
|  | #define B_l	x9 | ||||||
|  | #define B_h	x10 | ||||||
|  | #define C_l	x11 | ||||||
|  | #define C_h	x12 | ||||||
|  | #define D_l	x13 | ||||||
|  | #define D_h	x14 | ||||||
|  |  | ||||||
|  | .macro def_fn f p2align=0 | ||||||
|  | .text | ||||||
|  | .p2align \p2align | ||||||
|  | .global \f | ||||||
|  | .type \f, %function | ||||||
|  | \f: | ||||||
|  | .endm | ||||||
|  |  | ||||||
|  | def_fn memcpy p2align=6 | ||||||
|  |  | ||||||
|  | 	mov	dst, dstin | ||||||
|  | 	cmp	count, #64 | ||||||
|  | 	b.ge	.Lcpy_not_short | ||||||
|  | 	cmp	count, #15 | ||||||
|  | 	b.le	.Ltail15tiny | ||||||
|  |  | ||||||
|  | 	/* Deal with small copies quickly by dropping straight into the | ||||||
|  | 	 * exit block.  */ | ||||||
|  | .Ltail63: | ||||||
|  | 	/* Copy up to 48 bytes of data.  At this point we only need the | ||||||
|  | 	 * bottom 6 bits of count to be accurate.  */ | ||||||
|  | 	ands	tmp1, count, #0x30 | ||||||
|  | 	b.eq	.Ltail15 | ||||||
|  | 	add	dst, dst, tmp1 | ||||||
|  | 	add	src, src, tmp1 | ||||||
|  | 	cmp	tmp1w, #0x20 | ||||||
|  | 	b.eq	1f | ||||||
|  | 	b.lt	2f | ||||||
|  | 	ldp	A_l, A_h, [src, #-48] | ||||||
|  | 	stp	A_l, A_h, [dst, #-48] | ||||||
|  | 1: | ||||||
|  | 	ldp	A_l, A_h, [src, #-32] | ||||||
|  | 	stp	A_l, A_h, [dst, #-32] | ||||||
|  | 2: | ||||||
|  | 	ldp	A_l, A_h, [src, #-16] | ||||||
|  | 	stp	A_l, A_h, [dst, #-16] | ||||||
|  |  | ||||||
|  | .Ltail15: | ||||||
|  | 	ands	count, count, #15 | ||||||
|  | 	beq	1f | ||||||
|  | 	add	src, src, count | ||||||
|  | 	ldp	A_l, A_h, [src, #-16] | ||||||
|  | 	add	dst, dst, count | ||||||
|  | 	stp	A_l, A_h, [dst, #-16] | ||||||
|  | 1: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | .Ltail15tiny: | ||||||
|  | 	/* Copy up to 15 bytes of data.  Does not assume additional data | ||||||
|  | 	   being copied.  */ | ||||||
|  | 	tbz	count, #3, 1f | ||||||
|  | 	ldr	tmp1, [src], #8 | ||||||
|  | 	str	tmp1, [dst], #8 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #2, 1f | ||||||
|  | 	ldr	tmp1w, [src], #4 | ||||||
|  | 	str	tmp1w, [dst], #4 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #1, 1f | ||||||
|  | 	ldrh	tmp1w, [src], #2 | ||||||
|  | 	strh	tmp1w, [dst], #2 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #0, 1f | ||||||
|  | 	ldrb	tmp1w, [src] | ||||||
|  | 	strb	tmp1w, [dst] | ||||||
|  | 1: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | .Lcpy_not_short: | ||||||
|  | 	/* We don't much care about the alignment of DST, but we want SRC | ||||||
|  | 	 * to be 128-bit (16 byte) aligned so that we don't cross cache line | ||||||
|  | 	 * boundaries on both loads and stores.  */ | ||||||
|  | 	neg	tmp2, src | ||||||
|  | 	ands	tmp2, tmp2, #15		/* Bytes to reach alignment.  */ | ||||||
|  | 	b.eq	2f | ||||||
|  | 	sub	count, count, tmp2 | ||||||
|  | 	/* Copy more data than needed; it's faster than jumping | ||||||
|  | 	 * around copying sub-Quadword quantities.  We know that | ||||||
|  | 	 * it can't overrun.  */ | ||||||
|  | 	ldp	A_l, A_h, [src] | ||||||
|  | 	add	src, src, tmp2 | ||||||
|  | 	stp	A_l, A_h, [dst] | ||||||
|  | 	add	dst, dst, tmp2 | ||||||
|  | 	/* There may be less than 63 bytes to go now.  */ | ||||||
|  | 	cmp	count, #63 | ||||||
|  | 	b.le	.Ltail63 | ||||||
|  | 2: | ||||||
|  | 	subs	count, count, #128 | ||||||
|  | 	b.ge	.Lcpy_body_large | ||||||
|  | 	/* Less than 128 bytes to copy, so handle 64 here and then jump | ||||||
|  | 	 * to the tail.  */ | ||||||
|  | 	ldp	A_l, A_h, [src] | ||||||
|  | 	ldp	B_l, B_h, [src, #16] | ||||||
|  | 	ldp	C_l, C_h, [src, #32] | ||||||
|  | 	ldp	D_l, D_h, [src, #48] | ||||||
|  | 	stp	A_l, A_h, [dst] | ||||||
|  | 	stp	B_l, B_h, [dst, #16] | ||||||
|  | 	stp	C_l, C_h, [dst, #32] | ||||||
|  | 	stp	D_l, D_h, [dst, #48] | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	add	src, src, #64 | ||||||
|  | 	add	dst, dst, #64 | ||||||
|  | 	b.ne	.Ltail63 | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | 	/* Critical loop.  Start at a new cache line boundary.  Assuming | ||||||
|  | 	 * 64 bytes per line this ensures the entire loop is in one line.  */ | ||||||
|  | 	.p2align 6 | ||||||
|  | .Lcpy_body_large: | ||||||
|  | 	/* There are at least 128 bytes to copy.  */ | ||||||
|  | 	ldp	A_l, A_h, [src, #0] | ||||||
|  | 	sub	dst, dst, #16		/* Pre-bias.  */ | ||||||
|  | 	ldp	B_l, B_h, [src, #16] | ||||||
|  | 	ldp	C_l, C_h, [src, #32] | ||||||
|  | 	ldp	D_l, D_h, [src, #48]!	/* src += 64 - Pre-bias.  */ | ||||||
|  | 1: | ||||||
|  | 	stp	A_l, A_h, [dst, #16] | ||||||
|  | 	ldp	A_l, A_h, [src, #16] | ||||||
|  | 	stp	B_l, B_h, [dst, #32] | ||||||
|  | 	ldp	B_l, B_h, [src, #32] | ||||||
|  | 	stp	C_l, C_h, [dst, #48] | ||||||
|  | 	ldp	C_l, C_h, [src, #48] | ||||||
|  | 	stp	D_l, D_h, [dst, #64]! | ||||||
|  | 	ldp	D_l, D_h, [src, #64]! | ||||||
|  | 	subs	count, count, #64 | ||||||
|  | 	b.ge	1b | ||||||
|  | 	stp	A_l, A_h, [dst, #16] | ||||||
|  | 	stp	B_l, B_h, [dst, #32] | ||||||
|  | 	stp	C_l, C_h, [dst, #48] | ||||||
|  | 	stp	D_l, D_h, [dst, #64] | ||||||
|  | 	add	src, src, #16 | ||||||
|  | 	add	dst, dst, #64 + 16 | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	b.ne	.Ltail63 | ||||||
|  | 	ret | ||||||
|  | 	.size	memcpy, .-memcpy | ||||||
							
								
								
									
										324
									
								
								payloads/libpayload/arch/arm64/memmove.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								payloads/libpayload/arch/arm64/memmove.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,324 @@ | |||||||
|  | /* Copyright (c) 2013, Linaro Limited | ||||||
|  |    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 Linaro 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. */ | ||||||
|  |  | ||||||
|  | /* Assumptions: | ||||||
|  |  * | ||||||
|  |  * ARMv8-a, AArch64 | ||||||
|  |  * Unaligned accesses | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | .macro def_fn f p2align=0 | ||||||
|  | .text | ||||||
|  | .p2align \p2align | ||||||
|  | .global \f | ||||||
|  | .type \f, %function | ||||||
|  | \f: | ||||||
|  | .endm | ||||||
|  |  | ||||||
|  | /* Parameters and result.  */ | ||||||
|  | #define dstin	x0 | ||||||
|  | #define src	x1 | ||||||
|  | #define count	x2 | ||||||
|  | #define tmp1	x3 | ||||||
|  | #define tmp1w	w3 | ||||||
|  | #define tmp2	x4 | ||||||
|  | #define tmp2w	w4 | ||||||
|  | #define tmp3	x5 | ||||||
|  | #define tmp3w	w5 | ||||||
|  | #define dst	x6 | ||||||
|  |  | ||||||
|  | #define A_l	x7 | ||||||
|  | #define A_h	x8 | ||||||
|  | #define B_l	x9 | ||||||
|  | #define B_h	x10 | ||||||
|  | #define C_l	x11 | ||||||
|  | #define C_h	x12 | ||||||
|  | #define D_l	x13 | ||||||
|  | #define D_h	x14 | ||||||
|  |  | ||||||
|  | def_fn memmove, 6 | ||||||
|  | 	cmp	dstin, src | ||||||
|  | 	b.lo	.Ldownwards | ||||||
|  | 	add	tmp1, src, count | ||||||
|  | 	cmp	dstin, tmp1 | ||||||
|  | 	b.hs	memcpy		/* No overlap.  */ | ||||||
|  |  | ||||||
|  | 	/* Upwards move with potential overlap. | ||||||
|  | 	 * Need to move from the tail backwards.  SRC and DST point one | ||||||
|  | 	 * byte beyond the remaining data to move.  */ | ||||||
|  | 	add	dst, dstin, count | ||||||
|  | 	add	src, src, count | ||||||
|  | 	cmp	count, #64 | ||||||
|  | 	b.ge	.Lmov_not_short_up | ||||||
|  |  | ||||||
|  | 	/* Deal with small moves quickly by dropping straight into the | ||||||
|  | 	 * exit block.  */ | ||||||
|  | .Ltail63up: | ||||||
|  | 	/* Move up to 48 bytes of data.  At this point we only need the | ||||||
|  | 	 * bottom 6 bits of count to be accurate.  */ | ||||||
|  | 	ands	tmp1, count, #0x30 | ||||||
|  | 	b.eq	.Ltail15up | ||||||
|  | 	sub	dst, dst, tmp1 | ||||||
|  | 	sub	src, src, tmp1 | ||||||
|  | 	cmp	tmp1w, #0x20 | ||||||
|  | 	b.eq	1f | ||||||
|  | 	b.lt	2f | ||||||
|  | 	ldp	A_l, A_h, [src, #32] | ||||||
|  | 	stp	A_l, A_h, [dst, #32] | ||||||
|  | 1: | ||||||
|  | 	ldp	A_l, A_h, [src, #16] | ||||||
|  | 	stp	A_l, A_h, [dst, #16] | ||||||
|  | 2: | ||||||
|  | 	ldp	A_l, A_h, [src] | ||||||
|  | 	stp	A_l, A_h, [dst] | ||||||
|  | .Ltail15up: | ||||||
|  | 	/* Move up to 15 bytes of data.  Does not assume additional data | ||||||
|  | 	 * being moved.  */ | ||||||
|  | 	tbz	count, #3, 1f | ||||||
|  | 	ldr	tmp1, [src, #-8]! | ||||||
|  | 	str	tmp1, [dst, #-8]! | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #2, 1f | ||||||
|  | 	ldr	tmp1w, [src, #-4]! | ||||||
|  | 	str	tmp1w, [dst, #-4]! | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #1, 1f | ||||||
|  | 	ldrh	tmp1w, [src, #-2]! | ||||||
|  | 	strh	tmp1w, [dst, #-2]! | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #0, 1f | ||||||
|  | 	ldrb	tmp1w, [src, #-1] | ||||||
|  | 	strb	tmp1w, [dst, #-1] | ||||||
|  | 1: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | .Lmov_not_short_up: | ||||||
|  | 	/* We don't much care about the alignment of DST, but we want SRC | ||||||
|  | 	 * to be 128-bit (16 byte) aligned so that we don't cross cache line | ||||||
|  | 	 * boundaries on both loads and stores.  */ | ||||||
|  | 	ands	tmp2, src, #15		/* Bytes to reach alignment.  */ | ||||||
|  | 	b.eq	2f | ||||||
|  | 	sub	count, count, tmp2 | ||||||
|  | 	/* Move enough data to reach alignment; unlike memcpy, we have to | ||||||
|  | 	 * be aware of the overlap, which means we can't move data twice.  */ | ||||||
|  | 	tbz	tmp2, #3, 1f | ||||||
|  | 	ldr	tmp1, [src, #-8]! | ||||||
|  | 	str	tmp1, [dst, #-8]! | ||||||
|  | 1: | ||||||
|  | 	tbz	tmp2, #2, 1f | ||||||
|  | 	ldr	tmp1w, [src, #-4]! | ||||||
|  | 	str	tmp1w, [dst, #-4]! | ||||||
|  | 1: | ||||||
|  | 	tbz	tmp2, #1, 1f | ||||||
|  | 	ldrh	tmp1w, [src, #-2]! | ||||||
|  | 	strh	tmp1w, [dst, #-2]! | ||||||
|  | 1: | ||||||
|  | 	tbz	tmp2, #0, 1f | ||||||
|  | 	ldrb	tmp1w, [src, #-1]! | ||||||
|  | 	strb	tmp1w, [dst, #-1]! | ||||||
|  | 1: | ||||||
|  |  | ||||||
|  | 	/* There may be less than 63 bytes to go now.  */ | ||||||
|  | 	cmp	count, #63 | ||||||
|  | 	b.le	.Ltail63up | ||||||
|  | 2: | ||||||
|  | 	subs	count, count, #128 | ||||||
|  | 	b.ge	.Lmov_body_large_up | ||||||
|  | 	/* Less than 128 bytes to move, so handle 64 here and then jump | ||||||
|  | 	 * to the tail.  */ | ||||||
|  | 	ldp	A_l, A_h, [src, #-64]! | ||||||
|  | 	ldp	B_l, B_h, [src, #16] | ||||||
|  | 	ldp	C_l, C_h, [src, #32] | ||||||
|  | 	ldp	D_l, D_h, [src, #48] | ||||||
|  | 	stp	A_l, A_h, [dst, #-64]! | ||||||
|  | 	stp	B_l, B_h, [dst, #16] | ||||||
|  | 	stp	C_l, C_h, [dst, #32] | ||||||
|  | 	stp	D_l, D_h, [dst, #48] | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	b.ne	.Ltail63up | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | 	/* Critical loop.  Start at a new Icache line boundary.  Assuming | ||||||
|  | 	 * 64 bytes per line this ensures the entire loop is in one line.  */ | ||||||
|  | 	.p2align 6 | ||||||
|  | .Lmov_body_large_up: | ||||||
|  | 	/* There are at least 128 bytes to move.  */ | ||||||
|  | 	ldp	A_l, A_h, [src, #-16] | ||||||
|  | 	ldp	B_l, B_h, [src, #-32] | ||||||
|  | 	ldp	C_l, C_h, [src, #-48] | ||||||
|  | 	ldp	D_l, D_h, [src, #-64]! | ||||||
|  | 1: | ||||||
|  | 	stp	A_l, A_h, [dst, #-16] | ||||||
|  | 	ldp	A_l, A_h, [src, #-16] | ||||||
|  | 	stp	B_l, B_h, [dst, #-32] | ||||||
|  | 	ldp	B_l, B_h, [src, #-32] | ||||||
|  | 	stp	C_l, C_h, [dst, #-48] | ||||||
|  | 	ldp	C_l, C_h, [src, #-48] | ||||||
|  | 	stp	D_l, D_h, [dst, #-64]! | ||||||
|  | 	ldp	D_l, D_h, [src, #-64]! | ||||||
|  | 	subs	count, count, #64 | ||||||
|  | 	b.ge	1b | ||||||
|  | 	stp	A_l, A_h, [dst, #-16] | ||||||
|  | 	stp	B_l, B_h, [dst, #-32] | ||||||
|  | 	stp	C_l, C_h, [dst, #-48] | ||||||
|  | 	stp	D_l, D_h, [dst, #-64]! | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	b.ne	.Ltail63up | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  |  | ||||||
|  | .Ldownwards: | ||||||
|  | 	/* For a downwards move we can safely use memcpy provided that | ||||||
|  | 	 * DST is more than 16 bytes away from SRC.  */ | ||||||
|  | 	sub	tmp1, src, #16 | ||||||
|  | 	cmp	dstin, tmp1 | ||||||
|  | 	b.ls	memcpy		/* May overlap, but not critically.  */ | ||||||
|  |  | ||||||
|  | 	mov	dst, dstin	/* Preserve DSTIN for return value.  */ | ||||||
|  | 	cmp	count, #64 | ||||||
|  | 	b.ge	.Lmov_not_short_down | ||||||
|  |  | ||||||
|  | 	/* Deal with small moves quickly by dropping straight into the | ||||||
|  | 	 * exit block.  */ | ||||||
|  | .Ltail63down: | ||||||
|  | 	/* Move up to 48 bytes of data.  At this point we only need the | ||||||
|  | 	 * bottom 6 bits of count to be accurate.  */ | ||||||
|  | 	ands	tmp1, count, #0x30 | ||||||
|  | 	b.eq	.Ltail15down | ||||||
|  | 	add	dst, dst, tmp1 | ||||||
|  | 	add	src, src, tmp1 | ||||||
|  | 	cmp	tmp1w, #0x20 | ||||||
|  | 	b.eq	1f | ||||||
|  | 	b.lt	2f | ||||||
|  | 	ldp	A_l, A_h, [src, #-48] | ||||||
|  | 	stp	A_l, A_h, [dst, #-48] | ||||||
|  | 1: | ||||||
|  | 	ldp	A_l, A_h, [src, #-32] | ||||||
|  | 	stp	A_l, A_h, [dst, #-32] | ||||||
|  | 2: | ||||||
|  | 	ldp	A_l, A_h, [src, #-16] | ||||||
|  | 	stp	A_l, A_h, [dst, #-16] | ||||||
|  | .Ltail15down: | ||||||
|  | 	/* Move up to 15 bytes of data.  Does not assume additional data | ||||||
|  | 	   being moved.  */ | ||||||
|  | 	tbz	count, #3, 1f | ||||||
|  | 	ldr	tmp1, [src], #8 | ||||||
|  | 	str	tmp1, [dst], #8 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #2, 1f | ||||||
|  | 	ldr	tmp1w, [src], #4 | ||||||
|  | 	str	tmp1w, [dst], #4 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #1, 1f | ||||||
|  | 	ldrh	tmp1w, [src], #2 | ||||||
|  | 	strh	tmp1w, [dst], #2 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #0, 1f | ||||||
|  | 	ldrb	tmp1w, [src] | ||||||
|  | 	strb	tmp1w, [dst] | ||||||
|  | 1: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | .Lmov_not_short_down: | ||||||
|  | 	/* We don't much care about the alignment of DST, but we want SRC | ||||||
|  | 	 * to be 128-bit (16 byte) aligned so that we don't cross cache line | ||||||
|  | 	 * boundaries on both loads and stores.  */ | ||||||
|  | 	neg	tmp2, src | ||||||
|  | 	ands	tmp2, tmp2, #15		/* Bytes to reach alignment.  */ | ||||||
|  | 	b.eq	2f | ||||||
|  | 	sub	count, count, tmp2 | ||||||
|  | 	/* Move enough data to reach alignment; unlike memcpy, we have to | ||||||
|  | 	 * be aware of the overlap, which means we can't move data twice.  */ | ||||||
|  | 	tbz	tmp2, #3, 1f | ||||||
|  | 	ldr	tmp1, [src], #8 | ||||||
|  | 	str	tmp1, [dst], #8 | ||||||
|  | 1: | ||||||
|  | 	tbz	tmp2, #2, 1f | ||||||
|  | 	ldr	tmp1w, [src], #4 | ||||||
|  | 	str	tmp1w, [dst], #4 | ||||||
|  | 1: | ||||||
|  | 	tbz	tmp2, #1, 1f | ||||||
|  | 	ldrh	tmp1w, [src], #2 | ||||||
|  | 	strh	tmp1w, [dst], #2 | ||||||
|  | 1: | ||||||
|  | 	tbz	tmp2, #0, 1f | ||||||
|  | 	ldrb	tmp1w, [src], #1 | ||||||
|  | 	strb	tmp1w, [dst], #1 | ||||||
|  | 1: | ||||||
|  |  | ||||||
|  | 	/* There may be less than 63 bytes to go now.  */ | ||||||
|  | 	cmp	count, #63 | ||||||
|  | 	b.le	.Ltail63down | ||||||
|  | 2: | ||||||
|  | 	subs	count, count, #128 | ||||||
|  | 	b.ge	.Lmov_body_large_down | ||||||
|  | 	/* Less than 128 bytes to move, so handle 64 here and then jump | ||||||
|  | 	 * to the tail.  */ | ||||||
|  | 	ldp	A_l, A_h, [src] | ||||||
|  | 	ldp	B_l, B_h, [src, #16] | ||||||
|  | 	ldp	C_l, C_h, [src, #32] | ||||||
|  | 	ldp	D_l, D_h, [src, #48] | ||||||
|  | 	stp	A_l, A_h, [dst] | ||||||
|  | 	stp	B_l, B_h, [dst, #16] | ||||||
|  | 	stp	C_l, C_h, [dst, #32] | ||||||
|  | 	stp	D_l, D_h, [dst, #48] | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	add	src, src, #64 | ||||||
|  | 	add	dst, dst, #64 | ||||||
|  | 	b.ne	.Ltail63down | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | 	/* Critical loop.  Start at a new cache line boundary.  Assuming | ||||||
|  | 	 * 64 bytes per line this ensures the entire loop is in one line.  */ | ||||||
|  | 	.p2align 6 | ||||||
|  | .Lmov_body_large_down: | ||||||
|  | 	/* There are at least 128 bytes to move.  */ | ||||||
|  | 	ldp	A_l, A_h, [src, #0] | ||||||
|  | 	sub	dst, dst, #16		/* Pre-bias.  */ | ||||||
|  | 	ldp	B_l, B_h, [src, #16] | ||||||
|  | 	ldp	C_l, C_h, [src, #32] | ||||||
|  | 	ldp	D_l, D_h, [src, #48]!	/* src += 64 - Pre-bias.  */ | ||||||
|  | 1: | ||||||
|  | 	stp	A_l, A_h, [dst, #16] | ||||||
|  | 	ldp	A_l, A_h, [src, #16] | ||||||
|  | 	stp	B_l, B_h, [dst, #32] | ||||||
|  | 	ldp	B_l, B_h, [src, #32] | ||||||
|  | 	stp	C_l, C_h, [dst, #48] | ||||||
|  | 	ldp	C_l, C_h, [src, #48] | ||||||
|  | 	stp	D_l, D_h, [dst, #64]! | ||||||
|  | 	ldp	D_l, D_h, [src, #64]! | ||||||
|  | 	subs	count, count, #64 | ||||||
|  | 	b.ge	1b | ||||||
|  | 	stp	A_l, A_h, [dst, #16] | ||||||
|  | 	stp	B_l, B_h, [dst, #32] | ||||||
|  | 	stp	C_l, C_h, [dst, #48] | ||||||
|  | 	stp	D_l, D_h, [dst, #64] | ||||||
|  | 	add	src, src, #16 | ||||||
|  | 	add	dst, dst, #64 + 16 | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	b.ne	.Ltail63down | ||||||
|  | 	ret | ||||||
|  | 	.size memmove, . - memmove | ||||||
							
								
								
									
										242
									
								
								payloads/libpayload/arch/arm64/memset.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								payloads/libpayload/arch/arm64/memset.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,242 @@ | |||||||
|  | /* Copyright (c) 2012-2013, Linaro Limited | ||||||
|  |    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 Linaro 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. */ | ||||||
|  |  | ||||||
|  | /* Assumptions: | ||||||
|  |  * | ||||||
|  |  * ARMv8-a, AArch64 | ||||||
|  |  * Unaligned accesses | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* By default we assume that the DC instruction can be used to zero | ||||||
|  |    data blocks more efficiently.  In some circumstances this might be | ||||||
|  |    unsafe, for example in an asymmetric multiprocessor environment with | ||||||
|  |    different DC clear lengths (neither the upper nor lower lengths are | ||||||
|  |    safe to use).  The feature can be disabled by defining DONT_USE_DC. | ||||||
|  |  | ||||||
|  |    If code may be run in a virtualized environment, then define | ||||||
|  |    MAYBE_VIRT.  This will cause the code to cache the system register | ||||||
|  |    values rather than re-reading them each call.  */ | ||||||
|  |  | ||||||
|  | #define dstin		x0 | ||||||
|  | #define val		w1 | ||||||
|  | #define count		x2 | ||||||
|  | #define tmp1		x3 | ||||||
|  | #define tmp1w		w3 | ||||||
|  | #define tmp2		x4 | ||||||
|  | #define tmp2w		w4 | ||||||
|  | #define zva_len_x	x5 | ||||||
|  | #define zva_len		w5 | ||||||
|  | #define zva_bits_x	x6 | ||||||
|  |  | ||||||
|  | #define A_l		x7 | ||||||
|  | #define A_lw		w7 | ||||||
|  | #define dst		x8 | ||||||
|  | #define tmp3w		w9 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | .macro def_fn f p2align=0 | ||||||
|  | .text | ||||||
|  | .p2align \p2align | ||||||
|  | .global \f | ||||||
|  | .type \f, %function | ||||||
|  | \f: | ||||||
|  | .endm | ||||||
|  |  | ||||||
|  | def_fn memset p2align=6 | ||||||
|  |  | ||||||
|  | 	mov	dst, dstin		/* Preserve return value.  */ | ||||||
|  | 	ands	A_lw, val, #255 | ||||||
|  | #ifndef DONT_USE_DC | ||||||
|  | 	b.eq	.Lzero_mem | ||||||
|  | #endif | ||||||
|  | 	orr	A_lw, A_lw, A_lw, lsl #8 | ||||||
|  | 	orr	A_lw, A_lw, A_lw, lsl #16 | ||||||
|  | 	orr	A_l, A_l, A_l, lsl #32 | ||||||
|  | .Ltail_maybe_long: | ||||||
|  | 	cmp	count, #64 | ||||||
|  | 	b.ge	.Lnot_short | ||||||
|  | .Ltail_maybe_tiny: | ||||||
|  | 	cmp	count, #15 | ||||||
|  | 	b.le	.Ltail15tiny | ||||||
|  | .Ltail63: | ||||||
|  | 	ands	tmp1, count, #0x30 | ||||||
|  | 	b.eq	.Ltail15 | ||||||
|  | 	add	dst, dst, tmp1 | ||||||
|  | 	cmp	tmp1w, #0x20 | ||||||
|  | 	b.eq	1f | ||||||
|  | 	b.lt	2f | ||||||
|  | 	stp	A_l, A_l, [dst, #-48] | ||||||
|  | 1: | ||||||
|  | 	stp	A_l, A_l, [dst, #-32] | ||||||
|  | 2: | ||||||
|  | 	stp	A_l, A_l, [dst, #-16] | ||||||
|  |  | ||||||
|  | .Ltail15: | ||||||
|  | 	and	count, count, #15 | ||||||
|  | 	add	dst, dst, count | ||||||
|  | 	stp	A_l, A_l, [dst, #-16]	/* Repeat some/all of last store. */ | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | .Ltail15tiny: | ||||||
|  | 	/* Set up to 15 bytes.  Does not assume earlier memory | ||||||
|  | 	   being set.  */ | ||||||
|  | 	tbz	count, #3, 1f | ||||||
|  | 	str	A_l, [dst], #8 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #2, 1f | ||||||
|  | 	str	A_lw, [dst], #4 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #1, 1f | ||||||
|  | 	strh	A_lw, [dst], #2 | ||||||
|  | 1: | ||||||
|  | 	tbz	count, #0, 1f | ||||||
|  | 	strb	A_lw, [dst] | ||||||
|  | 1: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | 	/* Critical loop.  Start at a new cache line boundary.  Assuming | ||||||
|  | 	 * 64 bytes per line, this ensures the entire loop is in one line.  */ | ||||||
|  | 	.p2align 6 | ||||||
|  | .Lnot_short: | ||||||
|  | 	neg	tmp2, dst | ||||||
|  | 	ands	tmp2, tmp2, #15 | ||||||
|  | 	b.eq	2f | ||||||
|  | 	/* Bring DST to 128-bit (16-byte) alignment.  We know that there's | ||||||
|  | 	 * more than that to set, so we simply store 16 bytes and advance by | ||||||
|  | 	 * the amount required to reach alignment.  */ | ||||||
|  | 	sub	count, count, tmp2 | ||||||
|  | 	stp	A_l, A_l, [dst] | ||||||
|  | 	add	dst, dst, tmp2 | ||||||
|  | 	/* There may be less than 63 bytes to go now.  */ | ||||||
|  | 	cmp	count, #63 | ||||||
|  | 	b.le	.Ltail63 | ||||||
|  | 2: | ||||||
|  | 	sub	dst, dst, #16		/* Pre-bias.  */ | ||||||
|  | 	sub	count, count, #64 | ||||||
|  | 1: | ||||||
|  | 	stp	A_l, A_l, [dst, #16] | ||||||
|  | 	stp	A_l, A_l, [dst, #32] | ||||||
|  | 	stp	A_l, A_l, [dst, #48] | ||||||
|  | 	stp	A_l, A_l, [dst, #64]! | ||||||
|  | 	subs	count, count, #64 | ||||||
|  | 	b.ge	1b | ||||||
|  | 	tst	count, #0x3f | ||||||
|  | 	add	dst, dst, #16 | ||||||
|  | 	b.ne	.Ltail63 | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | #ifndef DONT_USE_DC | ||||||
|  | 	/* For zeroing memory, check to see if we can use the ZVA feature to | ||||||
|  | 	 * zero entire 'cache' lines.  */ | ||||||
|  | .Lzero_mem: | ||||||
|  | 	mov	A_l, #0 | ||||||
|  | 	cmp	count, #63 | ||||||
|  | 	b.le	.Ltail_maybe_tiny | ||||||
|  | 	neg	tmp2, dst | ||||||
|  | 	ands	tmp2, tmp2, #15 | ||||||
|  | 	b.eq	1f | ||||||
|  | 	sub	count, count, tmp2 | ||||||
|  | 	stp	A_l, A_l, [dst] | ||||||
|  | 	add	dst, dst, tmp2 | ||||||
|  | 	cmp	count, #63 | ||||||
|  | 	b.le	.Ltail63 | ||||||
|  | 1: | ||||||
|  | 	/* For zeroing small amounts of memory, it's not worth setting up | ||||||
|  | 	 * the line-clear code.  */ | ||||||
|  | 	cmp	count, #128 | ||||||
|  | 	b.lt	.Lnot_short | ||||||
|  | #ifdef MAYBE_VIRT | ||||||
|  | 	/* For efficiency when virtualized, we cache the ZVA capability.  */ | ||||||
|  | 	adrp	tmp2, .Lcache_clear | ||||||
|  | 	ldr	zva_len, [tmp2, #:lo12:.Lcache_clear] | ||||||
|  | 	tbnz	zva_len, #31, .Lnot_short | ||||||
|  | 	cbnz	zva_len, .Lzero_by_line | ||||||
|  | 	mrs	tmp1, dczid_el0 | ||||||
|  | 	tbz	tmp1, #4, 1f | ||||||
|  | 	/* ZVA not available.  Remember this for next time.  */ | ||||||
|  | 	mov	zva_len, #~0 | ||||||
|  | 	str	zva_len, [tmp2, #:lo12:.Lcache_clear] | ||||||
|  | 	b	.Lnot_short | ||||||
|  | 1: | ||||||
|  | 	mov	tmp3w, #4 | ||||||
|  | 	and	zva_len, tmp1w, #15	/* Safety: other bits reserved.  */ | ||||||
|  | 	lsl	zva_len, tmp3w, zva_len | ||||||
|  | 	str	zva_len, [tmp2, #:lo12:.Lcache_clear] | ||||||
|  | #else | ||||||
|  | 	mrs	tmp1, dczid_el0 | ||||||
|  | 	tbnz	tmp1, #4, .Lnot_short | ||||||
|  | 	mov	tmp3w, #4 | ||||||
|  | 	and	zva_len, tmp1w, #15	/* Safety: other bits reserved.  */ | ||||||
|  | 	lsl	zva_len, tmp3w, zva_len | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | .Lzero_by_line: | ||||||
|  | 	/* Compute how far we need to go to become suitably aligned.  We're | ||||||
|  | 	 * already at quad-word alignment.  */ | ||||||
|  | 	cmp	count, zva_len_x | ||||||
|  | 	b.lt	.Lnot_short		/* Not enough to reach alignment.  */ | ||||||
|  | 	sub	zva_bits_x, zva_len_x, #1 | ||||||
|  | 	neg	tmp2, dst | ||||||
|  | 	ands	tmp2, tmp2, zva_bits_x | ||||||
|  | 	b.eq	1f			/* Already aligned.  */ | ||||||
|  | 	/* Not aligned, check that there's enough to copy after alignment.  */ | ||||||
|  | 	sub	tmp1, count, tmp2 | ||||||
|  | 	cmp	tmp1, #64 | ||||||
|  | 	ccmp	tmp1, zva_len_x, #8, ge	/* NZCV=0b1000 */ | ||||||
|  | 	b.lt	.Lnot_short | ||||||
|  | 	/* We know that there's at least 64 bytes to zero and that it's safe | ||||||
|  | 	 * to overrun by 64 bytes.  */ | ||||||
|  | 	mov	count, tmp1 | ||||||
|  | 2: | ||||||
|  | 	stp	A_l, A_l, [dst] | ||||||
|  | 	stp	A_l, A_l, [dst, #16] | ||||||
|  | 	stp	A_l, A_l, [dst, #32] | ||||||
|  | 	subs	tmp2, tmp2, #64 | ||||||
|  | 	stp	A_l, A_l, [dst, #48] | ||||||
|  | 	add	dst, dst, #64 | ||||||
|  | 	b.ge	2b | ||||||
|  | 	/* We've overrun a bit, so adjust dst downwards.  */ | ||||||
|  | 	add	dst, dst, tmp2 | ||||||
|  | 1: | ||||||
|  | 	sub	count, count, zva_len_x | ||||||
|  | 3: | ||||||
|  | 	dc	zva, dst | ||||||
|  | 	add	dst, dst, zva_len_x | ||||||
|  | 	subs	count, count, zva_len_x | ||||||
|  | 	b.ge	3b | ||||||
|  | 	ands	count, count, zva_bits_x | ||||||
|  | 	b.ne	.Ltail_maybe_long | ||||||
|  | 	ret | ||||||
|  | 	.size	memset, .-memset | ||||||
|  | #ifdef MAYBE_VIRT | ||||||
|  | 	.bss | ||||||
|  | 	.p2align 2 | ||||||
|  | 	.Lcache_clear: | ||||||
|  | 	.space 4 | ||||||
|  | #endif | ||||||
|  | #endif /* DONT_USE_DC */ | ||||||
|  |  | ||||||
							
								
								
									
										64
									
								
								payloads/libpayload/arch/arm64/sysinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								payloads/libpayload/arch/arm64/sysinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <libpayload-config.h> | ||||||
|  | #include <libpayload.h> | ||||||
|  | #include <coreboot_tables.h> | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * This is a global structure that is used through the library - we set it | ||||||
|  |  * up initially with some dummy values - hopefully they will be overridden. | ||||||
|  |  */ | ||||||
|  | struct sysinfo_t lib_sysinfo = { | ||||||
|  | 	.cpu_khz = 200, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int lib_get_sysinfo(void) | ||||||
|  | { | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
|  | 	/* Get the CPU speed (for delays). */ | ||||||
|  | 	lib_sysinfo.cpu_khz = get_cpu_speed(); | ||||||
|  |  | ||||||
|  | 	/* Get information from the coreboot tables, | ||||||
|  | 	 * if they exist */ | ||||||
|  |  | ||||||
|  | 	ret = get_coreboot_info(&lib_sysinfo); | ||||||
|  |  | ||||||
|  | 	if (!lib_sysinfo.n_memranges) { | ||||||
|  | 		/* If we can't get a good memory range, use the default. */ | ||||||
|  | 		lib_sysinfo.n_memranges = 1; | ||||||
|  |  | ||||||
|  | 		lib_sysinfo.memrange[0].base = 0; | ||||||
|  | 		lib_sysinfo.memrange[0].size = 1024 * 1024; | ||||||
|  | 		lib_sysinfo.memrange[0].type = CB_MEM_RAM; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								payloads/libpayload/arch/arm64/timer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								payloads/libpayload/arch/arm64/timer.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @file arm64/timer.c | ||||||
|  |  * ARM64 specific timer routines | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <libpayload.h> | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @ingroup arch | ||||||
|  |  * Global variable containing the speed of the processor in KHz. | ||||||
|  |  */ | ||||||
|  | u32 cpu_khz; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Calculate the speed of the processor for use in delays. | ||||||
|  |  * | ||||||
|  |  * @return The CPU speed in kHz. | ||||||
|  |  */ | ||||||
|  | unsigned int get_cpu_speed(void) | ||||||
|  | { | ||||||
|  | 	/* FIXME */ | ||||||
|  | 	cpu_khz = 1000000U; | ||||||
|  |  | ||||||
|  | 	return cpu_khz; | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								payloads/libpayload/arch/arm64/util.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								payloads/libpayload/arch/arm64/util.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2012 Google, 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <arch/asm.h> | ||||||
|  |  | ||||||
|  | /* This function puts the system into a halt. */ | ||||||
|  | ENTRY(halt) | ||||||
|  | 	b halt | ||||||
|  | ENDPROC(halt) | ||||||
							
								
								
									
										38
									
								
								payloads/libpayload/arch/arm64/virtual.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								payloads/libpayload/arch/arm64/virtual.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 coresystems GmbH | ||||||
|  |  * | ||||||
|  |  * 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | unsigned long virtual_offset = 0; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int getpagesize(void) | ||||||
|  | { | ||||||
|  | 	return 4096; | ||||||
|  | } | ||||||
| @@ -74,7 +74,12 @@ if [ "$CONFIG_LP_ARCH_ARM" = "y" ]; then | |||||||
|   _ARCHEXTRA="" |   _ARCHEXTRA="" | ||||||
|   _ARCH=arm |   _ARCH=arm | ||||||
| fi | fi | ||||||
|  | if [ "$CONFIG_LP_ARCH_ARM64" = "y" ]; then | ||||||
|  |   _ARCHINCDIR=$_INCDIR/arm64 | ||||||
|  |   _ARCHLIBDIR=$_LIBDIR/arm64 | ||||||
|  |   _ARCHEXTRA="" | ||||||
|  |   _ARCH=arm64 | ||||||
|  | fi | ||||||
| if [ "$CONFIG_LP_ARCH_X86" = "y" ]; then | if [ "$CONFIG_LP_ARCH_X86" = "y" ]; then | ||||||
|   _ARCHINCDIR=$_INCDIR/x86 |   _ARCHINCDIR=$_INCDIR/x86 | ||||||
|   _ARCHLIBDIR=$_LIBDIR/x86 |   _ARCHLIBDIR=$_LIBDIR/x86 | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								payloads/libpayload/configs/config.arm64-generic
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								payloads/libpayload/configs/config.arm64-generic
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | # | ||||||
|  | # Automatically generated make config: don't edit | ||||||
|  | # libpayload version: 0.2.0 | ||||||
|  | # Wed Dec 31 11:29:14 2014 | ||||||
|  | # | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Generic Options | ||||||
|  | # | ||||||
|  | # CONFIG_LP_EXPERIMENTAL is not set | ||||||
|  | # CONFIG_LP_OBSOLETE is not set | ||||||
|  | # CONFIG_LP_DEVELOPER is not set | ||||||
|  | CONFIG_LP_CHROMEOS=y | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Architecture Options | ||||||
|  | # | ||||||
|  | # CONFIG_LP_ARCH_ARM is not set | ||||||
|  | # CONFIG_LP_ARCH_X86 is not set | ||||||
|  | CONFIG_LP_ARCH_ARM64=y | ||||||
|  | # CONFIG_LP_MEMMAP_RAM_ONLY is not set | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Standard Libraries | ||||||
|  | # | ||||||
|  | CONFIG_LP_LIBC=y | ||||||
|  | # CONFIG_LP_CURSES is not set | ||||||
|  | CONFIG_LP_CBFS=y | ||||||
|  | CONFIG_LP_LZMA=y | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Console Options | ||||||
|  | # | ||||||
|  | CONFIG_LP_SKIP_CONSOLE_INIT=y | ||||||
|  | CONFIG_LP_CBMEM_CONSOLE=y | ||||||
|  | # CONFIG_LP_SERIAL_CONSOLE is not set | ||||||
|  | CONFIG_LP_VIDEO_CONSOLE=y | ||||||
|  | CONFIG_LP_COREBOOT_VIDEO_CONSOLE=y | ||||||
|  | # CONFIG_LP_PC_KEYBOARD is not set | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Drivers | ||||||
|  | # | ||||||
|  | # CONFIG_LP_RTC_PORT_EXTENDED_VIA is not set | ||||||
|  | # CONFIG_LP_STORAGE is not set | ||||||
|  | CONFIG_LP_TIMER_NONE=y | ||||||
|  | # CONFIG_LP_TIMER_MCT is not set | ||||||
|  | # CONFIG_LP_TIMER_TEGRA_1US is not set | ||||||
|  | # CONFIG_LP_TIMER_IPQ806X is not set | ||||||
|  | CONFIG_LP_USB=y | ||||||
|  | # CONFIG_LP_USB_OHCI is not set | ||||||
|  | CONFIG_LP_USB_EHCI=y | ||||||
|  | CONFIG_LP_USB_XHCI=y | ||||||
|  | CONFIG_LP_USB_HID=y | ||||||
|  | CONFIG_LP_USB_HUB=y | ||||||
|  | CONFIG_LP_USB_MSC=y | ||||||
|  | CONFIG_LP_USB_GEN_HUB=y | ||||||
|  | # CONFIG_LP_USB_PCI is not set | ||||||
|  | # CONFIG_LP_BIG_ENDIAN is not set | ||||||
|  | CONFIG_LP_LITTLE_ENDIAN=y | ||||||
|  | # CONFIG_LP_IO_ADDRESS_SPACE is not set | ||||||
|  | CONFIG_LP_ARCH_SPECIFIC_OPTIONS=y | ||||||
| @@ -16,6 +16,7 @@ | |||||||
| # Architecture Options | # Architecture Options | ||||||
| # | # | ||||||
| # CONFIG_LP_ARCH_ARM is not set | # CONFIG_LP_ARCH_ARM is not set | ||||||
|  | # CONFIG_LP_ARCH_ARM64 is not set | ||||||
| CONFIG_LP_ARCH_X86=y | CONFIG_LP_ARCH_X86=y | ||||||
| # CONFIG_LP_MEMMAP_RAM_ONLY is not set | # CONFIG_LP_MEMMAP_RAM_ONLY is not set | ||||||
| # CONFIG_LP_MULTIBOOT is not set | # CONFIG_LP_MULTIBOOT is not set | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| # | # | ||||||
| # Automatically generated make config: don't edit | # Automatically generated make config: don't edit | ||||||
| # libpayload version: 0.2.0 | # libpayload version: 0.2.0 | ||||||
| # Wed Dec 31 11:37:12 2014 | # Wed Dec 31 11:39:10 2014 | ||||||
| # | # | ||||||
|  |  | ||||||
| # | # | ||||||
| @@ -17,6 +17,7 @@ | |||||||
| # | # | ||||||
| CONFIG_LP_ARCH_ARM=y | CONFIG_LP_ARCH_ARM=y | ||||||
| # CONFIG_LP_ARCH_X86 is not set | # CONFIG_LP_ARCH_X86 is not set | ||||||
|  | # CONFIG_LP_ARCH_ARM64 is not set | ||||||
| # CONFIG_LP_MEMMAP_RAM_ONLY is not set | # CONFIG_LP_MEMMAP_RAM_ONLY is not set | ||||||
|  |  | ||||||
| # | # | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								payloads/libpayload/include/arm64/arch/asm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								payloads/libpayload/include/arm64/arch/asm.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the coreboot project. | ||||||
|  |  * | ||||||
|  |  * Copyright 2013 Google Inc. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef __ARM64_ASM_H | ||||||
|  | #define __ARM64_ASM_H | ||||||
|  |  | ||||||
|  | #  define ARM64(x...)	x | ||||||
|  | #  define W(instr)	instr | ||||||
|  |  | ||||||
|  | #define ALIGN .align 2 | ||||||
|  |  | ||||||
|  | #define ENDPROC(name) \ | ||||||
|  | 	.type name, %function; \ | ||||||
|  | 	END(name) | ||||||
|  |  | ||||||
|  | #define ENTRY(name) \ | ||||||
|  | 	.section .text.name, "ax", %progbits; \ | ||||||
|  | 	.global name; \ | ||||||
|  | 	ALIGN; \ | ||||||
|  | 	name: | ||||||
|  |  | ||||||
|  | #define END(name) \ | ||||||
|  | 	.size name, .-name | ||||||
|  |  | ||||||
|  | #endif	/* __ARM64_ASM_H */ | ||||||
							
								
								
									
										259
									
								
								payloads/libpayload/include/arm64/arch/cache.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								payloads/libpayload/include/arm64/arch/cache.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,259 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the coreboot project. | ||||||
|  |  * | ||||||
|  |  * Copyright 2013 Google 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. The name of the author may not 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. | ||||||
|  |  * | ||||||
|  |  * cache.h: Cache maintenance API for ARM64 | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef ARM64_CACHE_H | ||||||
|  | #define ARM64_CACHE_H | ||||||
|  |  | ||||||
|  | #include <stddef.h> | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | /* SCTLR bits */ | ||||||
|  | #define SCTLR_M		(1 << 0)	/* MMU enable			*/ | ||||||
|  | #define SCTLR_A		(1 << 1)	/* Alignment check enable	*/ | ||||||
|  | #define SCTLR_C		(1 << 2)	/* Data/unified cache enable	*/ | ||||||
|  | /* Bits 4:3 are reserved */ | ||||||
|  | #define SCTLR_CP15BEN	(1 << 5)	/* CP15 barrier enable		*/ | ||||||
|  | /* Bit 6 is reserved */ | ||||||
|  | #define SCTLR_B		(1 << 7)	/* Endianness			*/ | ||||||
|  | /* Bits 9:8 */ | ||||||
|  | #define SCTLR_SW	(1 << 10)	/* SWP and SWPB enable		*/ | ||||||
|  | #define SCTLR_Z		(1 << 11)	/* Branch prediction enable	*/ | ||||||
|  | #define SCTLR_I		(1 << 12)	/* Instruction cache enable	*/ | ||||||
|  | #define SCTLR_V		(1 << 13)	/* Low/high exception vectors 	*/ | ||||||
|  | #define SCTLR_RR  	(1 << 14)	/* Round Robin select		*/ | ||||||
|  | /* Bits 16:15 are reserved */ | ||||||
|  | #define SCTLR_HA	(1 << 17)	/* Hardware Access flag enable	*/ | ||||||
|  | /* Bit 18 is reserved */ | ||||||
|  | /* Bits 20:19 reserved virtualization not supported */ | ||||||
|  | #define SCTLR_WXN	(1 << 19)	/* Write permission implies XN	*/ | ||||||
|  | #define SCTLR_UWXN	(1 << 20)	/* Unprivileged write permission | ||||||
|  | 					   implies PL1 XN		*/ | ||||||
|  | #define SCTLR_FI	(1 << 21)	/* Fast interrupt config enable	*/ | ||||||
|  | #define SCTLR_U		(1 << 22)	/* Unaligned access behavior	*/ | ||||||
|  | #define SCTLR_VE	(1 << 24)	/* Interrupt vectors enable	*/ | ||||||
|  | #define SCTLR_EE	(1 << 25)	/* Exception endianness		*/ | ||||||
|  | /* Bit 26 is reserved */ | ||||||
|  | #define SCTLR_NMFI	(1 << 27)	/* Non-maskable FIQ support	*/ | ||||||
|  | #define SCTLR_TRE	(1 << 28)	/* TEX remap enable		*/ | ||||||
|  | #define SCTLR_AFE	(1 << 29)	/* Access flag enable		*/ | ||||||
|  | #define SCTLR_TE	(1 << 30)	/* Thumb exception enable	*/ | ||||||
|  | /* Bit 31 is reserved */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Sync primitives | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* data memory barrier */ | ||||||
|  | static inline void dmb(void) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dmb sy" : : : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* data sync barrier */ | ||||||
|  | static inline void dsb(void) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dsb sy" : : : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* instruction sync barrier */ | ||||||
|  | static inline void isb(void) | ||||||
|  | { | ||||||
|  | 	asm volatile ("isb" : : : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Low-level TLB maintenance operations | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* invalidate entire unified TLB */ | ||||||
|  | static inline void tlbiall_el3(void) | ||||||
|  | { | ||||||
|  | 	asm volatile ("tlbi alle3" : : : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* invalidate unified TLB by VA, all ASID */ | ||||||
|  | static inline void tlbivaa(unsigned long va) | ||||||
|  | { | ||||||
|  | 	asm volatile ("tlbi vaae1, %0" : : "r" (va) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Low-level cache maintenance operations | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* data cache clean and invalidate by VA to PoC */ | ||||||
|  | static inline void dccivac(unsigned long va) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dc civac, %0" : : "r" (va) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* data cache invalidate by set/way */ | ||||||
|  | static inline void dccisw(uint32_t val) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dc cisw, %0" : : "r" (val) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* data cache clean by VA to PoC */ | ||||||
|  | static inline void dccvac(unsigned long va) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dc cvac, %0" : : "r" (va) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* data cache clean by set/way */ | ||||||
|  | static inline void dccsw(uint32_t val) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dc csw, %0" : : "r" (val) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* data cache invalidate by VA to PoC */ | ||||||
|  | static inline void dcivac(unsigned long va) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dc ivac, %0" : : "r" (va) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* data cache invalidate by set/way */ | ||||||
|  | static inline void dcisw(uint32_t val) | ||||||
|  | { | ||||||
|  | 	asm volatile ("dc isw, %0" : : "r" (val) : "memory"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* instruction cache invalidate all by PoU */ | ||||||
|  | static inline void iciallu(void) | ||||||
|  | { | ||||||
|  | 	asm volatile ("ic iallu" : : "r" (0)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* read cache level ID register (CLIDR) */ | ||||||
|  | static inline uint32_t read_clidr(void) | ||||||
|  | { | ||||||
|  | 	uint32_t val = 0; | ||||||
|  | 	asm volatile ("mrs %0, clidr_el1" : "=r" (val)); | ||||||
|  | 	return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* read cache size ID register register (CCSIDR) */ | ||||||
|  | static inline uint32_t read_ccsidr(void) | ||||||
|  | { | ||||||
|  | 	uint32_t val = 0; | ||||||
|  | 	asm volatile ("mrs %0, ccsidr_el1" : "=r" (val)); | ||||||
|  | 	return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* read cache size selection register (CSSELR) */ | ||||||
|  | static inline uint32_t read_csselr(void) | ||||||
|  | { | ||||||
|  | 	uint32_t val = 0; | ||||||
|  | 	asm volatile ("mrs %0, csselr_el1" : "=r" (val)); | ||||||
|  | 	return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* write to cache size selection register (CSSELR) */ | ||||||
|  | static inline void write_csselr(uint32_t val) | ||||||
|  | { | ||||||
|  | 	/* | ||||||
|  | 	 * Bits [3:1] - Cache level + 1 (0b000 = L1, 0b110 = L7, 0b111 is rsvd) | ||||||
|  | 	 * Bit 0 - 0 = data or unified cache, 1 = instruction cache | ||||||
|  | 	 */ | ||||||
|  | 	asm volatile ("msr csselr_el1, %0" : : "r" (val)); | ||||||
|  | 	isb();	/* ISB to sync the change to CCSIDR */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* read system control register (SCTLR) */ | ||||||
|  | static inline uint32_t read_sctlr_el3(void) | ||||||
|  | { | ||||||
|  | 	uint32_t val; | ||||||
|  | 	asm volatile ("mrs %0, sctlr_el3" : "=r" (val)); | ||||||
|  | 	return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* write system control register (SCTLR) */ | ||||||
|  | static inline void write_sctlr_el3(uint32_t val) | ||||||
|  | { | ||||||
|  | 	asm volatile ("msr sctlr_el3, %0" : : "r" (val) : "cc"); | ||||||
|  | 	isb(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Cache maintenance API | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* dcache clean and invalidate all (on current level given by CCSELR) */ | ||||||
|  | void dcache_clean_invalidate_all(void); | ||||||
|  |  | ||||||
|  | /* dcache clean by virtual address to PoC */ | ||||||
|  | void dcache_clean_by_va(void const *addr, size_t len); | ||||||
|  |  | ||||||
|  | /* dcache clean and invalidate by virtual address to PoC */ | ||||||
|  | void dcache_clean_invalidate_by_va(void const *addr, size_t len); | ||||||
|  |  | ||||||
|  | /* dcache invalidate by virtual address to PoC */ | ||||||
|  | void dcache_invalidate_by_va(void const *addr, size_t len); | ||||||
|  |  | ||||||
|  | void dcache_clean_all(void); | ||||||
|  |  | ||||||
|  | /* dcache invalidate all (on current level given by CCSELR) */ | ||||||
|  | void dcache_invalidate_all(void); | ||||||
|  |  | ||||||
|  | /* returns number of bytes per cache line */ | ||||||
|  | unsigned int dcache_line_bytes(void); | ||||||
|  |  | ||||||
|  | /* dcache and MMU disable */ | ||||||
|  | void dcache_mmu_disable(void); | ||||||
|  |  | ||||||
|  | /* dcache and MMU enable */ | ||||||
|  | void dcache_mmu_enable(void); | ||||||
|  |  | ||||||
|  | /* perform all icache/dcache maintenance needed after loading new code */ | ||||||
|  | void cache_sync_instructions(void); | ||||||
|  |  | ||||||
|  | /* tlb invalidate all */ | ||||||
|  | void tlb_invalidate_all(void); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Generalized setup/init functions | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* mmu initialization (set page table address, set permissions, etc) */ | ||||||
|  | void mmu_init(void); | ||||||
|  |  | ||||||
|  | enum dcache_policy { | ||||||
|  | 	DCACHE_OFF, | ||||||
|  | 	DCACHE_WRITEBACK, | ||||||
|  | 	DCACHE_WRITETHROUGH, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* disable the mmu for a range. Primarily useful to lock out address 0. */ | ||||||
|  | void mmu_disable_range(unsigned long start_mb, unsigned long size_mb); | ||||||
|  | /* mmu range configuration (set dcache policy) */ | ||||||
|  | void mmu_config_range(unsigned long start_mb, unsigned long size_mb, | ||||||
|  | 						enum dcache_policy policy); | ||||||
|  |  | ||||||
|  | #endif /* ARM64_CACHE_H */ | ||||||
							
								
								
									
										53
									
								
								payloads/libpayload/include/arm64/arch/exception.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								payloads/libpayload/include/arm64/arch/exception.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright 2014 Google 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _ARCH_EXCEPTION_H | ||||||
|  | #define _ARCH_EXCEPTION_H | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | void set_vbar(void* vbar); | ||||||
|  |  | ||||||
|  | struct exception_state | ||||||
|  | { | ||||||
|  | 	uint64_t elr; | ||||||
|  | 	uint64_t esr; | ||||||
|  | 	uint64_t regs[31]; | ||||||
|  | } __attribute__((packed)); | ||||||
|  |  | ||||||
|  | enum { | ||||||
|  | 	EXC_INV = 0, | ||||||
|  | 	EXC_SYNC = 1, | ||||||
|  | 	EXC_IRQ = 2, | ||||||
|  | 	EXC_FIQ = 3, | ||||||
|  | 	EXC_SERROR = 4, | ||||||
|  | 	EXC_COUNT | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										76
									
								
								payloads/libpayload/include/arm64/arch/io.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								payloads/libpayload/include/arm64/arch/io.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 Advanced Micro Devices, Inc. | ||||||
|  |  * Copyright (C) 2008 coresystems GmbH | ||||||
|  |  * | ||||||
|  |  * 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _ARCH_IO_H | ||||||
|  | #define _ARCH_IO_H | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <arch/cache.h> | ||||||
|  |  | ||||||
|  | static inline uint8_t readb(volatile void *_a) | ||||||
|  | { | ||||||
|  | 	dmb(); | ||||||
|  | 	return *(volatile uint8_t *)_a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline uint16_t readw(volatile void *_a) | ||||||
|  | { | ||||||
|  | 	dmb(); | ||||||
|  | 	return *(volatile uint16_t *)_a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline uint32_t readl(volatile void *_a) | ||||||
|  | { | ||||||
|  | 	dmb(); | ||||||
|  | 	return *(volatile uint32_t *)_a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline void writeb(uint8_t _v, volatile void *_a) | ||||||
|  | { | ||||||
|  | 	dmb(); | ||||||
|  | 	*(volatile uint8_t *)_a = _v; | ||||||
|  | 	dmb(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline void writew(uint16_t _v, volatile void *_a) | ||||||
|  | { | ||||||
|  | 	dmb(); | ||||||
|  | 	*(volatile uint16_t *)_a = _v; | ||||||
|  | 	dmb(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline void writel(uint32_t _v, volatile void *_a) | ||||||
|  | { | ||||||
|  | 	dmb(); | ||||||
|  | 	*(volatile uint32_t *)_a = _v; | ||||||
|  | 	dmb(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										60
									
								
								payloads/libpayload/include/arm64/arch/types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								payloads/libpayload/include/arm64/arch/types.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de> | ||||||
|  |  * | ||||||
|  |  * 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _ARCH_TYPES_H | ||||||
|  | #define _ARCH_TYPES_H | ||||||
|  |  | ||||||
|  | typedef unsigned char uint8_t; | ||||||
|  | typedef unsigned char u8; | ||||||
|  | typedef signed char int8_t; | ||||||
|  | typedef signed char s8; | ||||||
|  |  | ||||||
|  | typedef unsigned short uint16_t; | ||||||
|  | typedef unsigned short u16; | ||||||
|  | typedef signed short int16_t; | ||||||
|  | typedef signed short s16; | ||||||
|  |  | ||||||
|  | typedef unsigned int uint32_t; | ||||||
|  | typedef unsigned int u32; | ||||||
|  | typedef signed int int32_t; | ||||||
|  | typedef signed int s32; | ||||||
|  |  | ||||||
|  | typedef unsigned long long uint64_t; | ||||||
|  | typedef unsigned long long u64; | ||||||
|  | typedef signed long long int64_t; | ||||||
|  | typedef signed long long s64; | ||||||
|  |  | ||||||
|  | typedef long time_t; | ||||||
|  | typedef long suseconds_t; | ||||||
|  |  | ||||||
|  | #ifndef NULL | ||||||
|  | #define NULL ((void *)0) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										41
									
								
								payloads/libpayload/include/arm64/arch/virtual.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								payloads/libpayload/include/arm64/arch/virtual.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of the libpayload project. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008 coresystems GmbH | ||||||
|  |  * | ||||||
|  |  * 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. The name of the author may not 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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _ARCH_VIRTUAL_H | ||||||
|  | #define _ARCH_VIRTUAL_H | ||||||
|  |  | ||||||
|  | extern unsigned long virtual_offset; | ||||||
|  |  | ||||||
|  | #define virt_to_phys(virt) ((unsigned long) (virt) + virtual_offset) | ||||||
|  | #define phys_to_virt(phys) ((void *) ((unsigned long) (phys) - virtual_offset)) | ||||||
|  |  | ||||||
|  | #define virt_to_bus(addr) virt_to_phys(addr) | ||||||
|  | #define bus_to_virt(addr) phys_to_virt(addr) | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -107,6 +107,7 @@ struct cbfs_header { | |||||||
| #define CBFS_ARCHITECTURE_UNKNOWN  0xFFFFFFFF | #define CBFS_ARCHITECTURE_UNKNOWN  0xFFFFFFFF | ||||||
| #define CBFS_ARCHITECTURE_X86      0x00000001 | #define CBFS_ARCHITECTURE_X86      0x00000001 | ||||||
| #define CBFS_ARCHITECTURE_ARM      0x00000010 | #define CBFS_ARCHITECTURE_ARM      0x00000010 | ||||||
|  | #define CBFS_ARCHITECTURE_ARM64    0x00000011 | ||||||
|  |  | ||||||
| /** This is a component header - every entry in the CBFS | /** This is a component header - every entry in the CBFS | ||||||
|     will have this header. |     will have this header. | ||||||
|   | |||||||
| @@ -111,6 +111,11 @@ detect_special_flags() { | |||||||
| 			#	CFLAGS="$CFLAGS -mcpu=cortex-a9" | 			#	CFLAGS="$CFLAGS -mcpu=cortex-a9" | ||||||
| 			;; | 			;; | ||||||
| 	esac | 	esac | ||||||
|  |  | ||||||
|  | 	case "$architecture" in | ||||||
|  | 		arm64-generic ) | ||||||
|  | 			;; | ||||||
|  | 	esac | ||||||
| } | } | ||||||
|  |  | ||||||
| report_arch_toolchain() { | report_arch_toolchain() { | ||||||
| @@ -135,7 +140,7 @@ touch "$TMPFILE" | |||||||
| trap clean_up EXIT | trap clean_up EXIT | ||||||
|  |  | ||||||
| # Architecture definition | # Architecture definition | ||||||
| SUPPORTED_ARCHITECTURE="x86 arm" | SUPPORTED_ARCHITECTURE="x86 arm arm64" | ||||||
|  |  | ||||||
| # ARM Architecture | # ARM Architecture | ||||||
| TARCH_arm="arm" | TARCH_arm="arm" | ||||||
| @@ -143,6 +148,12 @@ TBFDARCH_arm="littlearm" | |||||||
| TCLIST_arm="armv7a armv7-a" | TCLIST_arm="armv7a armv7-a" | ||||||
| TWIDTH_arm="32" | TWIDTH_arm="32" | ||||||
|  |  | ||||||
|  | # ARM64 Architecture | ||||||
|  | TARCH_arm64="arm64" | ||||||
|  | TBFDARCH_arm64="littleaarch64" | ||||||
|  | TCLIST_arm64="aarch64" | ||||||
|  | TWIDTH_arm64="64" | ||||||
|  |  | ||||||
| # X86 Architecture | # X86 Architecture | ||||||
| TARCH_x86="i386" | TARCH_x86="i386" | ||||||
| TBFDARCH_x86="i386" | TBFDARCH_x86="i386" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user