aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/arm/early_printk.c5
-rw-r--r--xen/arch/arm/head.S40
-rw-r--r--xen/arch/arm/mm.c2
-rw-r--r--xen/arch/arm/setup.c2
4 files changed, 26 insertions, 23 deletions
diff --git a/xen/arch/arm/early_printk.c b/xen/arch/arm/early_printk.c
index 3e51252dc1..bdf4c0e623 100644
--- a/xen/arch/arm/early_printk.c
+++ b/xen/arch/arm/early_printk.c
@@ -17,12 +17,11 @@
#ifdef EARLY_UART_ADDRESS
-static void __init early_putch(char c)
+void __init early_putch(char c)
{
volatile uint32_t *r;
- r = (uint32_t *)((EARLY_UART_ADDRESS & 0x001fffff)
- + XEN_VIRT_START + (1 << 21));
+ r = (uint32_t *)(XEN_VIRT_START + (1 << 21));
/* XXX: assuming a PL011 UART. */
while(*(r + 0x6) & 0x8)
diff --git a/xen/arch/arm/head.S b/xen/arch/arm/head.S
index 9fdeda7c56..e8b1cc697a 100644
--- a/xen/arch/arm/head.S
+++ b/xen/arch/arm/head.S
@@ -24,6 +24,7 @@
#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 /* lev3: nG=1, AF=1, SH=10, AP=01, NS=1, ATTR=100, T=1, P=1 */
#define PT_UPPER(x) (PT_##x & 0xf00)
#define PT_LOWER(x) (PT_##x & 0x0ff)
@@ -183,6 +184,18 @@ skip_bss:
teq r12, #0
bne pt_ready
+ /* console fixmap */
+#ifdef EARLY_UART_ADDRESS
+ ldr r1, =xen_fixmap
+ add r1, r1, r10 /* r1 := paddr (xen_fixmap) */
+ mov r3, #0
+ lsr r2, r11, #12
+ lsl r2, r2, #12 /* 4K aligned paddr of UART */
+ orr r2, r2, #PT_UPPER(DEV_L3)
+ orr r2, r2, #PT_LOWER(DEV_L3) /* r2:r3 := 4K dev map including UART */
+ strd r2, r3, [r1, #(FIXMAP_CONSOLE*8)] /* Map it in the first fixmap's slot */
+#endif
+
/* Build the baseline idle pagetable's first-level entries */
ldr r1, =xen_second
add r1, r1, r10 /* r1 := paddr (xen_second) */
@@ -205,17 +218,15 @@ skip_bss:
ldr r4, =start
lsr r4, #18 /* Slot for vaddr(start) */
strd r2, r3, [r1, r4] /* Map Xen there too */
-#ifdef EARLY_UART_ADDRESS
- ldr r3, =(1<<(54-32)) /* NS for device mapping */
- lsr r2, r11, #21
- lsl r2, r2, #21 /* 2MB-aligned paddr of UART */
- orr r2, r2, #PT_UPPER(DEV)
- orr r2, r2, #PT_LOWER(DEV) /* r2:r3 := 2MB dev map including UART */
+
+ /* xen_fixmap pagetable */
+ ldr r2, =xen_fixmap
+ add r2, r2, r10 /* r2 := paddr (xen_fixmap) */
+ orr r2, r2, #PT_UPPER(PT)
+ orr r2, r2, #PT_LOWER(PT) /* r2:r3 := table map of xen_fixmap */
add r4, r4, #8
strd r2, r3, [r1, r4] /* Map it in the fixmap's slot */
-#else
- add r4, r4, #8 /* Skip over unused fixmap slot */
-#endif
+
mov r3, #0x0
lsr r2, r8, #21
lsl r2, r2, #21 /* 2MB-aligned paddr of DTB */
@@ -236,13 +247,10 @@ pt_ready:
mov pc, r1 /* Get a proper vaddr into PC */
paging:
+
#ifdef EARLY_UART_ADDRESS
- /* Recover the UART address in the new address space. */
- lsl r11, #11
- lsr r11, #11 /* UART base's offset from 2MB base */
- adr r0, start
- add r0, r0, #0x200000 /* vaddr of the fixmap's 2MB slot */
- add r11, r11, r0 /* r11 := vaddr (UART base address) */
+ /* Use a virtual address to access the UART. */
+ ldr r11, =FIXMAP_ADDR(FIXMAP_CONSOLE)
#endif
PRINT("- Ready -\r\n")
@@ -261,8 +269,6 @@ paging:
mcr CP32(r0, BPIALL) /* Flush branch predictor */
dsb /* Ensure completion of TLB+BP flush */
isb
- /* Now, the UART is in its proper fixmap address */
- ldrne r11, =FIXMAP_ADDR(FIXMAP_CONSOLE)
/* Non-boot CPUs report that they've got this far */
ldr r0, =ready_cpus
diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index e8fff8f6c7..c34161cb1c 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -40,7 +40,7 @@ struct domain *dom_xen, *dom_io;
/* Static start-of-day pagetables that we use before the allocators are up */
lpae_t xen_pgtable[LPAE_ENTRIES] __attribute__((__aligned__(4096)));
lpae_t xen_second[LPAE_ENTRIES*4] __attribute__((__aligned__(4096*4)));
-static lpae_t xen_fixmap[LPAE_ENTRIES] __attribute__((__aligned__(4096)));
+lpae_t xen_fixmap[LPAE_ENTRIES] __attribute__((__aligned__(4096)));
static lpae_t xen_xenmap[LPAE_ENTRIES] __attribute__((__aligned__(4096)));
/* Non-boot CPUs use this to find the correct pagetables. */
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index b0b30d60bf..0328394179 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -194,9 +194,7 @@ void __init start_xen(unsigned long boot_phys_offset,
setup_pagetables(boot_phys_offset, get_xen_paddr());
#ifdef EARLY_UART_ADDRESS
- /* Map the UART */
/* TODO Need to get device tree or command line for UART address */
- set_fixmap(FIXMAP_CONSOLE, EARLY_UART_ADDRESS >> PAGE_SHIFT, DEV_SHARED);
pl011_init(0, FIXMAP_ADDR(FIXMAP_CONSOLE));
console_init_preirq();
#endif