aboutsummaryrefslogtreecommitdiffstats
path: root/stubdom/grub/boot-x86_64.S
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-06-18 09:36:47 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-06-18 09:36:47 +0100
commita2c7db64f561821fd528614e68c4d92718210126 (patch)
tree79c7e1c3ef49b5b4272fd12d36420e6fb8d23cd1 /stubdom/grub/boot-x86_64.S
parent7074b13cee246f09b3b0a2a6da139b2e047cf4a4 (diff)
downloadxen-a2c7db64f561821fd528614e68c4d92718210126.tar.gz
xen-a2c7db64f561821fd528614e68c4d92718210126.tar.bz2
xen-a2c7db64f561821fd528614e68c4d92718210126.zip
Add PV-GRUB
This fetches GRUB1 sources, applies the {graphical, print function, save default, and ext3_256byte} patches from debian, and applies a patch to make it work on x86_64 and port it to Mini-OS. By using libxc, PV-GRUB can then "kexec" the loaded kernel from inside the domain itself, hence permitting to avoid the security-concerned pygrub. Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'stubdom/grub/boot-x86_64.S')
-rw-r--r--stubdom/grub/boot-x86_64.S108
1 files changed, 108 insertions, 0 deletions
diff --git a/stubdom/grub/boot-x86_64.S b/stubdom/grub/boot-x86_64.S
new file mode 100644
index 0000000000..2eae6c3437
--- /dev/null
+++ b/stubdom/grub/boot-x86_64.S
@@ -0,0 +1,108 @@
+#include <os.h>
+#include <arch_limits.h>
+#include <xen/arch-x86_64.h>
+
+/* For simplicity, we keep all of this into just one data page */
+.data
+.globl _boot_page
+_boot_page:
+ .align __PAGE_SIZE
+
+/*
+ * The following data is initialized from C code
+ */
+
+/* Pte of this page */
+.globl _boot_page_entry
+_boot_page_entry:
+ .quad 0
+
+/* mmuext_op structure */
+/* Set new page directory */
+_boot_mmuext:
+ /* Op # */
+ .long MMUEXT_NEW_BASEPTR
+ .long 0 /* pad */
+
+ /* MFN of target page table directory */
+.globl _boot_pdmfn
+_boot_pdmfn:
+ .quad 0
+
+ /* Unused */
+ .quad 0
+
+/* Unpin old page directory */
+ /* Op # */
+ .long MMUEXT_UNPIN_TABLE
+ .long 0 /* pad */
+
+ /* MFN of old page table directory */
+.globl _boot_oldpdmfn
+_boot_oldpdmfn:
+ .quad 0
+
+ /* Unused */
+ .quad 0
+
+/* Target stack address, also target virtual address of this page */
+.globl _boot_stack
+_boot_stack:
+ .quad 0
+.globl _boot_target
+_boot_target:
+ .quad 0
+
+/* Target start info */
+.globl _boot_start_info
+_boot_start_info:
+ .quad 0
+
+/* Target start address */
+.globl _boot_start
+_boot_start:
+ .quad 0
+
+/*
+ * Boot target OS, does not return
+ */
+.globl _boot
+_boot:
+ /* Project ourselves at the target place. */
+ movq _boot_target, %rdi
+ movq _boot_page_entry, %rsi
+ movq $2, %rdx /* UVMF_INVLPG */
+ movq $__HYPERVISOR_update_va_mapping, %rax
+ syscall
+ testq %rax, %rax
+ jz 0f
+ ud2
+
+0:
+ /* Go there. */
+ movq $(0f - _boot_page), %rax
+ movq _boot_target, %rbx
+ addq %rbx, %rax
+ jmpq *%rax
+0:
+
+ /* Load target page table and unpin old page table. */
+ /* We shouldn't have any problem since in the new page table our page is
+ mapped at the same place. */
+ leaq _boot_mmuext(%rip), %rdi
+ movq $2, %rsi
+ xorq %rdx, %rdx
+ movq $0x7FF0, %r10 /* DOMID_SELF */
+ movq $__HYPERVISOR_mmuext_op, %rax
+ syscall
+ testq %rax, %rax
+ jns 0f
+ ud2
+
+0:
+ /* Initialize registers. */
+ movq _boot_stack(%rip), %rsp
+ movq _boot_start_info(%rip), %rsi
+
+ /* Jump! */
+ jmpq *_boot_start(%rip)