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:
Shawn Anastasio authored and Jan Beulich committed 2023-08-23 09:28:02 +02:00
1 parent 2115b443ab
commit 18b4f7e1e1
2 files changed
+28 -1

No files matched your search

+1 -1
View File
@@ -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)
+27
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.