mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/ppc: Relocate kernel to physical address 0 on boot
Introduce a small assembly loop in `start` to copy the kernel to physical address 0 before continuing. This ensures that the physical address lines up with XEN_VIRT_START (0xc000000000000000) and allows us to identity map the kernel when the MMU is set up in the next patch. We are also able to start execution at XEN_VIRT_START after the copy since hardware will ignore the top 4 address bits when operating in Real Mode (MMU off). Signed-off-by: Shawn Anastasio <sanastasio@raptorengineering.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
2115b443ab
commit
18b4f7e1e1
2 files changed
+28
-1
No files matched your search
@@ -39,7 +39,7 @@
|
||||
name:
|
||||
#endif
|
||||
|
||||
#define XEN_VIRT_START _AT(UL, 0xc000000000000000)
|
||||
#define XEN_VIRT_START _AC(0xc000000000000000, UL)
|
||||
|
||||
#define SMP_CACHE_BYTES (1 << 6)
|
||||
|
||||
|
||||
@@ -17,6 +17,33 @@ ENTRY(start)
|
||||
addis %r2, %r12, .TOC.-1b@ha
|
||||
addi %r2, %r2, .TOC.-1b@l
|
||||
|
||||
/*
|
||||
* Copy Xen to physical address zero and jump to XEN_VIRT_START
|
||||
* (0xc000000000000000). This works because the hardware will ignore the top
|
||||
* four address bits when the MMU is off.
|
||||
*/
|
||||
LOAD_REG_ADDR(%r14, _start)
|
||||
LOAD_IMM64(%r12, XEN_VIRT_START)
|
||||
|
||||
/* If we're at the correct address, skip copy */
|
||||
cmpld %r14, %r12
|
||||
beq .L_correct_address
|
||||
|
||||
/* Copy bytes until _end */
|
||||
LOAD_REG_ADDR(%r11, _end)
|
||||
addi %r14, %r14, -8
|
||||
li %r13, -8
|
||||
.L_copy_xen:
|
||||
ldu %r10, 8(%r14)
|
||||
stdu %r10, 8(%r13)
|
||||
cmpld %r14, %r11
|
||||
blt .L_copy_xen
|
||||
|
||||
/* Jump to XEN_VIRT_START */
|
||||
mtctr %r12
|
||||
bctr
|
||||
.L_correct_address:
|
||||
|
||||
/* set up the initial stack */
|
||||
LOAD_REG_ADDR(%r1, cpu0_boot_stack)
|
||||
li %r11, 0
|
||||
|
||||