[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V2 05/46] xen: arm64: initial build + config changes, start of day code
At 16:03 +0000 on 21 Feb (1361462587), Ian Campbell wrote: > On Thu, 2013-02-21 at 15:26 +0000, Ian Campbell wrote: > > On Thu, 2013-02-21 at 14:56 +0000, Tim Deegan wrote: > > > At 16:47 +0000 on 14 Feb (1360860439), Ian Campbell wrote: > > > > +2: PRINT("- Started in Hyp mode -\r\n") > > > > + > > > > +hyp: > > > > > > I though we were going to use "EL3" instead of "Hyp". > > > > Sorry, looks like I missed a few comments when I went through this one. > > s/EL3/EL2/g > > This is what I have now: > > 8<----------------------------------------- > > From e4587a06df0d04ccbfd04ec7cc371900fe7dabf4 Mon Sep 17 00:00:00 2001 > From: Ian Campbell <ian.campbell@xxxxxxxxxx> > Date: Mon, 10 Dec 2012 14:19:00 +0000 > Subject: [PATCH] xen: arm64: initial build + config changes, start of day code > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> > --- > v3: - s/hyp/el2/ > - remove dead code > - fix comment formatting > v2: - Add PSR_MODE definitions for 64-bit to arch-arm.h and use instead of > defining in head.S > - Nuke hard tabs in head.S and mode_switch.S with expand(1) > --- > Config.mk | 2 +- > config/arm64.mk | 12 ++ > xen/arch/arm/Makefile | 1 + > xen/arch/arm/Rules.mk | 6 + > xen/arch/arm/arm64/Makefile | 1 + > xen/arch/arm/arm64/head.S | 393 > ++++++++++++++++++++++++++++++++++++++ > xen/arch/arm/arm64/mode_switch.S | 83 ++++++++ > xen/arch/arm/xen.lds.S | 8 +- > xen/include/asm-arm/page.h | 1 + > xen/include/public/arch-arm.h | 14 ++ > xen/include/public/hvm/save.h | 2 +- > xen/include/public/xen.h | 2 +- > xen/include/xen/libelf.h | 2 +- > 13 files changed, 522 insertions(+), 5 deletions(-) > create mode 100644 config/arm64.mk > create mode 100644 xen/arch/arm/arm64/Makefile > create mode 100644 xen/arch/arm/arm64/head.S > create mode 100644 xen/arch/arm/arm64/mode_switch.S > > diff --git a/Config.mk b/Config.mk > index 64541c8..ea64925 100644 > --- a/Config.mk > +++ b/Config.mk > @@ -15,7 +15,7 @@ debug_symbols ?= $(debug) > > XEN_COMPILE_ARCH ?= $(shell uname -m | sed -e s/i.86/x86_32/ \ > -e s/i86pc/x86_32/ -e s/amd64/x86_64/ \ > - -e s/armv7.*/arm32/) > + -e s/armv7.*/arm32/ -e s/armv8.*/arm64/) > > XEN_TARGET_ARCH ?= $(XEN_COMPILE_ARCH) > XEN_OS ?= $(shell uname -s) > diff --git a/config/arm64.mk b/config/arm64.mk > new file mode 100644 > index 0000000..b2457eb > --- /dev/null > +++ b/config/arm64.mk > @@ -0,0 +1,12 @@ > +CONFIG_ARM := y > +CONFIG_ARM_64 := y > +CONFIG_ARM_$(XEN_OS) := y > + > +CFLAGS += #-marm -march= -mcpu= etc > + > +HAS_PL011 := y > + > +# Use only if calling $(LD) directly. > +LDFLAGS_DIRECT += -maarch64elf > + > +CONFIG_LOAD_ADDRESS ?= 0x80000000 > diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile > index f2822f2..7ff67c7 100644 > --- a/xen/arch/arm/Makefile > +++ b/xen/arch/arm/Makefile > @@ -1,4 +1,5 @@ > subdir-$(arm32) += arm32 > +subdir-$(arm64) += arm64 > > obj-y += early_printk.o > obj-y += domain.o > diff --git a/xen/arch/arm/Rules.mk b/xen/arch/arm/Rules.mk > index 5b5768a..29b605d 100644 > --- a/xen/arch/arm/Rules.mk > +++ b/xen/arch/arm/Rules.mk > @@ -26,6 +26,12 @@ arm32 := y > arm64 := n > endif > > +ifeq ($(TARGET_SUBARCH),arm64) > +CFLAGS += -mcpu=generic > +arm32 := n > +arm64 := y > +endif > + > ifneq ($(call cc-option,$(CC),-fvisibility=hidden,n),n) > CFLAGS += -DGCC_HAS_VISIBILITY_ATTRIBUTE > endif > diff --git a/xen/arch/arm/arm64/Makefile b/xen/arch/arm/arm64/Makefile > new file mode 100644 > index 0000000..dffbeb1 > --- /dev/null > +++ b/xen/arch/arm/arm64/Makefile > @@ -0,0 +1 @@ > +obj-y += mode_switch.o > diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S > new file mode 100644 > index 0000000..b7ab251 > --- /dev/null > +++ b/xen/arch/arm/arm64/head.S > @@ -0,0 +1,393 @@ > +/* > + * xen/arch/arm/head.S > + * > + * Start-of-day code for an ARMv8. > + * > + * Ian Campbell <ian.campbell@xxxxxxxxxx> > + * Copyright (c) 2012 Citrix Systems. > + * > + * Based on ARMv7-A head.S by > + * Tim Deegan <tim@xxxxxxx> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <asm/config.h> > +#include <asm/page.h> > +#include <asm/asm_defns.h> > + > +#define PT_PT 0xe7f /* nG=1 AF=1 SH=10 AP=01 NS=1 ATTR=111 T=1 P=1 */ > +#define PT_MEM 0xe7d /* nG=1 AF=1 SH=10 AP=01 NS=1 ATTR=111 T=0 P=1 */ > +#define PT_DEV 0xe71 /* nG=1 AF=1 SH=10 AP=01 NS=1 ATTR=100 T=0 P=1 */ > +#define PT_DEV_L3 0xe73 /* nG=1 AF=1 SH=10 AP=01 NS=1 ATTR=100 T=1 P=1 */ > + > +/* Macro to print a string to the UART, if there is one. > + * Clobbers r0-r3. */ > +#ifdef EARLY_UART_ADDRESS > +#define PRINT(_s) \ > + adr x0, 98f ; \ > + bl puts ; \ > + b 99f ; \ > +98: .asciz _s ; \ > + .align 2 ; \ > +99: > +#else > +#define PRINT(s) > +#endif > + > + /*.aarch64*/ > + > + /* > + * Kernel startup entry point. > + * --------------------------- > + * > + * The requirements are: > + * MMU = off, D-cache = off, I-cache = on or off, > + * x0 = physical address to the FDT blob. > + * > + * This must be the very first address in the loaded image. > + * It should be linked at XEN_VIRT_START, and loaded at any > + * 2MB-aligned address. All of text+data+bss must fit in 2MB, > + * or the initial pagetable code below will need adjustment. > + */ > + > + .global start > +start: > + /* > + * DO NOT MODIFY. Image header expected by Linux boot-loaders. > + */ > + b real_start /* branch to kernel start, magic */ > + .long 0 /* reserved */ > + .quad 0 /* Image load offset from start of RAM > */ > + .quad 0 /* reserved */ > + .quad 0 /* reserved */ > + > +real_start: > + msr DAIFSet, 0xf /* Disable all interrupts */ > + > + /* Save the bootloader arguments in less-clobberable registers */ > + mov x21, x0 /* x21 := DTB, physical address */ > + > + /* Find out where we are */ > + ldr x0, =start > + adr x19, start /* x19 := paddr (start) */ > + sub x20, x19, x0 /* x20 := phys-offset */ > + > + /* Using the DTB in the .dtb section? */ > +#ifdef CONFIG_DTB_FILE > + ldr x21, =_sdtb > + add x21, x21, x20 /* x21 := paddr(DTB) */ > +#endif > + > + /* Are we the boot CPU? */ > + mov x22, #0 /* x22 := CPU ID */ > + mrs x0, mpidr_el1 > + tbz x0, 31, boot_cpu /* Multiprocessor extension supported? > */ > + tbnz x0, 30, boot_cpu /* Uniprocessor system? */ > + > + mov x13, #(0xff << 24) > + bics x22, x0, x13 /* Mask out flags to get CPU ID */ > + b.eq boot_cpu /* If we're CPU 0, boot now */ > + > + /* Non-boot CPUs wait here to be woken up one at a time. */ > +1: dsb sy > + ldr x0, =smp_up_cpu /* VA of gate */ > + add x0, x0, x20 /* PA of gate */ > + ldr x1, [x0] /* Which CPU is being booted? */ > + cmp x1, x22 /* Is it us? */ > + b.eq 2f > + wfe > + b 1b > +2: > + > +boot_cpu: > +#ifdef EARLY_UART_ADDRESS > + ldr x23, =EARLY_UART_ADDRESS /* x23 := UART base address */ > + cbnz x22, 1f > + bl init_uart /* CPU 0 sets up the UART too */ > +1: PRINT("- CPU ") > + mov x0, x22 > + bl putn > + PRINT(" booting -\r\n") > +#endif > + > + PRINT("- Current EL ") > + mrs x0, CurrentEL > + bl putn > + PRINT(" -\r\n") > + > + /* Are we in EL3 */ > + mrs x0, CurrentEL > + cmp x0, #PSR_MODE_EL3t > + ccmp x0, #PSR_MODE_EL3h, #0x4, ne > + b.eq 1f /* Yes */ > + > + /* Are we in EL2 */ > + cmp x0, #PSR_MODE_EL2t > + ccmp x0, #PSR_MODE_EL2h, #0x4, ne > + b.eq 2f /* Yes */ > + > + /* Otherwise, it must have been EL0 or EL1 */ > + PRINT("- CPU is not in EL3 or EL2 -\r\n") > + b fail > + > +1: PRINT("- Started in EL3 -\r\n- Entering EL2 -\r\n") > + ldr x1, =enter_el2_mode /* VA of function */ > + add x1, x1, x20 /* PA of function */ > + adr x30, el2 /* Set return address for call */ > + br x1 /* Call function */ > + > +2: PRINT("- Started in EL2 mode -\r\n") > + > +el2: > + /* Zero BSS On the boot CPU to avoid nasty surprises */ > + cbnz x22, skip_bss > + > + PRINT("- Zero BSS -\r\n") > + ldr x0, =__bss_start /* Load start & end of bss */ > + ldr x1, =__bss_end > + add x0, x0, x20 /* Apply physical offset */ > + add x1, x1, x20 > + > +1: str xzr, [x0], #8 > + cmp x0, x1 > + b.lo 1b > + > +skip_bss: > + > + PRINT("- Setting up control registers -\r\n") > + > + /* Set up memory attribute type tables */ > + ldr x0, =MAIRVAL > + msr mair_el2, x0 > + > + /* Set up the HTCR: > + * PASize -- 4G > + * Top byte is used > + * PT walks use Outer-Shareable accesses, > + * PT walks are write-back, no-write-allocate in both cache levels, > + * Full 64-bit address space goes through this table. */ > + ldr x0, =0x80802500 > + msr tcr_el2, x0 > + > + /* Set up the HSCTLR: > + * Exceptions in LE ARM, > + * Low-latency IRQs disabled, > + * Write-implies-XN disabled (for now), > + * D-cache disabled (for now), > + * I-cache enabled, > + * Alignment checking enabled, > + * MMU translation disabled (for now). */ > + ldr x0, =(HSCTLR_BASE|SCTLR_A) > + msr SCTLR_EL2, x0 > + > + /* Write Xen's PT's paddr into the HTTBR */ > + ldr x4, =xen_pgtable > + add x4, x4, x20 /* x4 := paddr (xen_pagetable) */ > + msr TTBR0_EL2, x4 > + > + /* Non-boot CPUs don't need to rebuild the pagetable */ > + cbnz x22, pt_ready > + > + ldr x1, =xen_first > + add x1, x1, x20 /* x1 := paddr (xen_first) */ > + mov x3, #PT_PT /* x2 := table map of xen_first */ > + orr x2, x1, x3 /* (+ rights for linear PT) */ > + str x2, [x4, #0] /* Map it in slot 0 */ > + > + mov x4, x1 /* Next level into xen_first */ > + > + /* console fixmap */ > +#ifdef EARLY_UART_ADDRESS > + ldr x1, =xen_fixmap > + add x1, x1, x20 /* x1 := paddr (xen_fixmap) */ > + lsr x2, x23, #12 > + lsl x2, x2, #12 /* 4K aligned paddr of UART */ > + mov x3, #PT_DEV_L3 > + orr x2, x2, x3 /* x2 := 4K dev map including UART */ > + str x2, [x1, #(FIXMAP_CONSOLE*8)] /* Map it in the first fixmap's > slot */ > +#endif > + > + /* Build the baseline idle pagetable's first-level entries */ > + ldr x1, =xen_second > + add x1, x1, x20 /* x1 := paddr (xen_second) */ > + mov x3, #PT_PT /* x2 := table map of xen_second */ > + orr x2, x1, x3 /* (+ rights for linear PT) */ > + str x2, [x4, #0] /* Map it in slot 0 */ > + add x2, x2, #0x1000 > + str x2, [x4, #8] /* Map 2nd page in slot 1 */ > + add x2, x2, #0x1000 > + str x2, [x4, #16] /* Map 3rd page in slot 2 */ > + add x2, x2, #0x1000 > + str x2, [x4, #24] /* Map 4th page in slot 3 */ > + > + /* Now set up the second-level entries */ > + mov x3, #PT_MEM > + orr x2, x19, x3 /* x2 := 2MB normal map of Xen */ > + orr x4, xzr, x19, lsr #18 > + str x2, [x1, x4] /* Map Xen there */ > + ldr x4, =start > + lsr x4, x4, #18 /* Slot for vaddr(start) */ > + str x2, [x1, x4] /* Map Xen there too */ > + > + /* xen_fixmap pagetable */ > + ldr x2, =xen_fixmap > + add x2, x2, x20 /* x2 := paddr (xen_fixmap) */ > + mov x3, #PT_PT > + orr x2, x2, x3 /* x2 := table map of xen_fixmap */ > + add x4, x4, #8 > + str x2, [x1, x4] /* Map it in the fixmap's slot */ > + > + lsr x2, x21, #21 > + lsl x2, x2, #21 /* 2MB-aligned paddr of DTB */ > + mov x3, #PT_MEM /* x2 := 2MB RAM incl. DTB */ > + orr x2, x2, x3 > + add x4, x4, #8 > + str x2, [x1, x4] /* Map it in the early boot slot */ > + > +pt_ready: > + PRINT("- Turning on paging -\r\n") > + > + ldr x1, =paging /* Explicit vaddr, not RIP-relative */ > + mrs x0, SCTLR_EL2 > + orr x0, x0, #SCTLR_M /* Enable MMU */ > + orr x0, x0, #SCTLR_C /* Enable D-cache */ > + dsb sy /* Flush PTE writes and finish reads */ > + msr SCTLR_EL2, x0 /* now paging is enabled */ > + isb /* Now, flush the icache */ > + br x1 /* Get a proper vaddr into PC */ > +paging: > + > +#ifdef EARLY_UART_ADDRESS > + /* Use a virtual address to access the UART. */ > + ldr x23, =FIXMAP_ADDR(FIXMAP_CONSOLE) > +#endif > + > + PRINT("- Ready -\r\n") > + > + /* The boot CPU should go straight into C now */ > + cbz x22, launch > + > + /* Non-boot CPUs need to move on to the relocated pagetables */ > + ldr x4, =boot_ttbr /* VA of TTBR0_EL2 stashed by CPU 0 */ > + add x4, x4, x20 /* PA of it */ > + ldr x4, [x4] /* Actual value */ > + dsb sy > + msr TTBR0_EL2, x4 > + dsb sy > + isb > + tlbi alle2 > + dsb sy /* Ensure completion of TLB flush */ > + isb > + > + /* Non-boot CPUs report that they've got this far */ > + ldr x0, =ready_cpus > +1: ldaxr x1, [x0] /* { read # of ready CPUs } > */ > + add x1, x1, #1 /* Atomically { ++ } > */ > + stlxr w2, x1, [x0] /* { writeback } > */ > + cbnz w2, 1b > + dsb sy > + dc cvac, x0 /* Flush D-Cache */ > + dsb sy > + > + /* Here, the non-boot CPUs must wait again -- they're now running on > + * the boot CPU's pagetables so it's safe for the boot CPU to > + * overwrite the non-relocated copy of Xen. Once it's done that, > + * and brought up the memory allocator, non-boot CPUs can get their > + * own stacks and enter C. */ > +1: wfe > + dsb sy > + ldr x0, =smp_up_cpu > + ldr x1, [x0] /* Which CPU is being booted? */ > + cmp x1, x12 /* Is it us? */ > + b.ne 1b > + > +launch: > + ldr x0, =init_stack /* Find the boot-time stack */ > + ldr x0, [x0] > + add x0, x0, #STACK_SIZE /* (which grows down from the top). */ > + sub x0, x0, #CPUINFO_sizeof /* Make room for CPU save record */ > + mov sp, x0 > + > + mov x0, x20 /* Marshal args: - phys_offset */ > + mov x1, x21 /* - FDT */ > + mov x2, x22 /* - CPU ID */ > + cbz x22, start_xen /* and disappear into the land of C */ > + b start_secondary /* (to the appropriate entry point) */ > + > +/* Fail-stop > + * r0: string explaining why */ > +fail: PRINT("- Boot failed -\r\n") > +1: wfe > + b 1b > + > +#ifdef EARLY_UART_ADDRESS > + > +/* Bring up the UART. Specific to the PL011 UART. > + * Clobbers r0-r2 */ > +init_uart: > + mov x1, #0x0 > + strh w1, [x23, #0x24] /* -> UARTIBRD (Baud divisor fraction) > */ > + mov x1, #0x4 /* 7.3728MHz / 0x4 == 16 * 115200 */ > + strh w1, [x23, #0x24] /* -> UARTIBRD (Baud divisor integer) */ > + mov x1, #0x60 /* 8n1 */ > + strh w1, [x23, #0x24] /* -> UARTLCR_H (Line control) */ > + ldr x1, =0x00000301 /* RXE | TXE | UARTEN */ > + strh w1, [x23, #0x30] /* -> UARTCR (Control Register) */ > + adr x0, 1f > + b puts > +1: .asciz "- UART enabled -\r\n" > + .align 4 > + > +/* Print early debug messages. Specific to the PL011 UART. > + * r0: Nul-terminated string to print. > + * Clobbers r0-r2 */ > +puts: > + ldrh w2, [x23, #0x18] /* <- UARTFR (Flag register) */ > + tst w2, #0x8 /* Check BUSY bit */ > + b.ne puts /* Wait for the UART to be ready */ > + ldrb w2, [x0], #1 /* Load next char */ > + cbz w2, 1f /* Exit on nul */ > + str w2, [x23] /* -> UARTDR (Data Register) */ > + b puts > +1: > + ret > + > +/* Print a 32-bit number in hex. Specific to the PL011 UART. > + * r0: Number to print. > + * clobbers r0-r3 */ > +putn: > + adr x1, hex > + mov x3, #8 > +1: ldrh w2, [x23, #0x18] /* <- UARTFR (Flag register) */ > + tst w2, #0x8 /* Check BUSY bit */ > + b.ne 1b /* Wait for the UART to be ready */ > + and x2, x0, #0xf0000000 /* Mask off the top nybble */ > + lsr x2, x2, #28 > + ldrb w2, [x1, x2] /* Convert to a char */ > + strb w2, [x23] /* -> UARTDR (Data Register) */ > + lsl x0, x0, #4 /* Roll it through one nybble at a time > */ > + subs x3, x3, #1 > + b.ne 1b > + ret > + > +hex: .ascii "0123456789abcdef" > + .align 2 > + > +#else /* EARLY_UART_ADDRESS */ > + > +init_uart: > +.global early_puts > +early_puts: > +puts: > +putn: mov pc, lr > + > +#endif /* EARLY_UART_ADDRESS */ > diff --git a/xen/arch/arm/arm64/mode_switch.S > b/xen/arch/arm/arm64/mode_switch.S > new file mode 100644 > index 0000000..4c38181 > --- /dev/null > +++ b/xen/arch/arm/arm64/mode_switch.S > @@ -0,0 +1,83 @@ > +/* > + * xen/arch/arm/arm64/mode_switch.S > + * > + * Start-of day code to take a CPU from EL3 to EL2. Largely taken from > + * bootwrapper. > + * > + * Ian Campbell <ian.campbell@xxxxxxxxxx> > + * Copyright (c) 2012 Citrix Systems. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <asm/config.h> > +#include <asm/page.h> > +#include <asm/asm_defns.h> > + > +/* Get up a CPU into EL2. Clobbers x0-x3. > + * > + * Expects x22 == CPU number > + * Expects x30 == EL2 entry point > + * > + * This code is specific to the VE model, and not intended to be used > + * on production systems. As such it's a bit hackier than the main > + * boot code in head.S. In future it will be replaced by better > + * integration with the bootloader/firmware so that Xen always starts > + * at EL2. > + */ > + > +.globl enter_el2_mode > +enter_el2_mode: > + mov x0, #0x30 // RES1 > + orr x0, x0, #(1 << 0) // Non-secure EL1 > + orr x0, x0, #(1 << 8) // HVC enable > + orr x0, x0, #(1 << 10) // 64-bit EL2 > + msr scr_el3, x0 > + > + msr cptr_el3, xzr // Disable copro. traps to > EL3 > + > + ldr x0, =0x01800000 // 24Mhz > + msr cntfrq_el0, x0 > + > + /* > + * Check for the primary CPU to avoid a race on the distributor > + * registers. > + */ > + cbnz x22, 1f > + > + ldr x1, =(GIC_BASE_ADDRESS+GIC_DR_OFFSET) // GICD_CTLR > + mov w0, #3 // EnableGrp0 | EnableGrp1 > + str w0, [x1] > + > +1: ldr x1, =(GIC_BASE_ADDRESS+GIC_DR_OFFSET+0x80) // GICD_IGROUPR > + mov w0, #~0 // Grp1 interrupts > + str w0, [x1], #4 > + b.ne 2f // Only local interrupts for > secondary CPUs > + str w0, [x1], #4 > + str w0, [x1], #4 > + > +2: ldr x1, =(GIC_BASE_ADDRESS+GIC_CR_OFFSET) // GICC_CTLR > + ldr w0, [x1] > + mov w0, #3 // EnableGrp0 | EnableGrp1 > + str w0, [x1] > + > + mov w0, #1 << 7 // allow NS access to > GICC_PMR > + str w0, [x1, #4] // GICC_PMR > + > + msr sctlr_el2, xzr > + > + /* > + * Prepare the switch to the EL2_SP1 mode from EL3 > + */ > + msr elr_el3, x30 // Return to desired function > + mov x1, #0x3c9 // EL2_SP1 | D | A | I | F > + msr spsr_el3, x1 > + eret > diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S > index 410d7db..b1f0a78 100644 > --- a/xen/arch/arm/xen.lds.S > +++ b/xen/arch/arm/xen.lds.S > @@ -11,7 +11,13 @@ > > ENTRY(start) > > -OUTPUT_ARCH(arm) > +#if defined(__arm__) > +#define FORMAT arm > +#elif defined(__aarch64__) > +#define FORMAT aarch64 > +#endif > + > +OUTPUT_ARCH(FORMAT) > > PHDRS > { > diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h > index 9acd0af..e0a636f 100644 > --- a/xen/include/asm-arm/page.h > +++ b/xen/include/asm-arm/page.h > @@ -38,6 +38,7 @@ > */ > #define MAIR0VAL 0xeeaa4400 > #define MAIR1VAL 0xff000004 > +#define MAIRVAL (MAIR0VAL|MAIR1VAL<<32) > > /* > * Attribute Indexes. > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > index 8dd9062..dc12524 100644 > --- a/xen/include/public/arch-arm.h > +++ b/xen/include/public/arch-arm.h > @@ -174,6 +174,8 @@ typedef uint64_t xen_callback_t; > > /* 0-4: Mode */ > #define PSR_MODE_MASK 0x1f > + > +/* 32 bit modes */ > #define PSR_MODE_USR 0x10 > #define PSR_MODE_FIQ 0x11 > #define PSR_MODE_IRQ 0x12 > @@ -184,6 +186,18 @@ typedef uint64_t xen_callback_t; > #define PSR_MODE_UND 0x1b > #define PSR_MODE_SYS 0x1f > > +/* 64 bit modes */ > +#ifdef CONFIG_ARM_64 > +#define PSR_MODE_BIT 0x10 /* Set iff AArch32 */ > +#define PSR_MODE_EL3h 0x0d > +#define PSR_MODE_EL3t 0x0c > +#define PSR_MODE_EL2h 0x09 > +#define PSR_MODE_EL2t 0x08 > +#define PSR_MODE_EL1h 0x05 > +#define PSR_MODE_EL1t 0x04 > +#define PSR_MODE_EL0t 0x00 > +#endif > + > #define PSR_THUMB (1<<5) /* Thumb Mode enable */ > #define PSR_FIQ_MASK (1<<6) /* Fast Interrupt mask */ > #define PSR_IRQ_MASK (1<<7) /* Interrupt mask */ > diff --git a/xen/include/public/hvm/save.h b/xen/include/public/hvm/save.h > index 5538d8e..cc8b5fd 100644 > --- a/xen/include/public/hvm/save.h > +++ b/xen/include/public/hvm/save.h > @@ -102,7 +102,7 @@ DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end); > > #if defined(__i386__) || defined(__x86_64__) > #include "../arch-x86/hvm/save.h" > -#elif defined(__arm__) > +#elif defined(__arm__) || defined(__aarch64__) > #include "../arch-arm/hvm/save.h" > #else > #error "unsupported architecture" > diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h > index 846f446..a1927c0 100644 > --- a/xen/include/public/xen.h > +++ b/xen/include/public/xen.h > @@ -31,7 +31,7 @@ > > #if defined(__i386__) || defined(__x86_64__) > #include "arch-x86/xen.h" > -#elif defined(__arm__) > +#elif defined(__arm__) || defined (__aarch64__) > #include "arch-arm.h" > #else > #error "Unsupported architecture" > diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h > index e8f6508..218bb18 100644 > --- a/xen/include/xen/libelf.h > +++ b/xen/include/xen/libelf.h > @@ -23,7 +23,7 @@ > #ifndef __XEN_LIBELF_H__ > #define __XEN_LIBELF_H__ > > -#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) > +#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || > defined(__aarch64__) > #define XEN_ELF_LITTLE_ENDIAN > #else > #error define architectural endianness > -- > 1.7.2.5 > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |