1#include <os.h> 2#include <arch_limits.h> 3#include <xen/arch-x86_64.h> 4 5/* For simplicity, we keep all of this into just one data page */ 6.data 7.globl _boot_page 8_boot_page: 9 .align __PAGE_SIZE 10 11/* 12 * The following data is initialized from C code 13 */ 14 15/* Pte of this page */ 16.globl _boot_page_entry 17_boot_page_entry: 18 .quad 0 19 20/* mmuext_op structure */ 21/* Set new page directory */ 22_boot_mmuext: 23 /* Op # */ 24 .long MMUEXT_NEW_BASEPTR 25 .long 0 /* pad */ 26 27 /* MFN of target page table directory */ 28.globl _boot_pdmfn 29_boot_pdmfn: 30 .quad 0 31 32 /* Unused */ 33 .quad 0 34 35/* Unpin old page directory */ 36 /* Op # */ 37 .long MMUEXT_UNPIN_TABLE 38 .long 0 /* pad */ 39 40 /* MFN of old page table directory */ 41.globl _boot_oldpdmfn 42_boot_oldpdmfn: 43 .quad 0 44 45 /* Unused */ 46 .quad 0 47 48/* Target stack address, also target virtual address of this page */ 49.globl _boot_stack 50_boot_stack: 51 .quad 0 52.globl _boot_target 53_boot_target: 54 .quad 0 55 56/* Target start info */ 57.globl _boot_start_info 58_boot_start_info: 59 .quad 0 60 61/* Target start address */ 62.globl _boot_start 63_boot_start: 64 .quad 0 65 66/* 67 * Boot target OS, does not return 68 */ 69.globl _boot 70_boot: 71 /* Project ourselves at the target place. */ 72 movq _boot_target, %rdi 73 movq _boot_page_entry, %rsi 74 movq $2, %rdx /* UVMF_INVLPG */ 75 movq $__HYPERVISOR_update_va_mapping, %rax 76 syscall 77 testq %rax, %rax 78 jz 0f 79 ud2 80 810: 82 /* Go there. */ 83 movq $(0f - _boot_page), %rax 84 movq _boot_target, %rbx 85 addq %rbx, %rax 86 jmpq *%rax 870: 88 89 /* Load target page table and unpin old page table. */ 90 /* We shouldn't have any problem since in the new page table our page is 91 mapped at the same place. */ 92 leaq _boot_mmuext(%rip), %rdi 93 movq $2, %rsi 94 xorq %rdx, %rdx 95 movq $0x7FF0, %r10 /* DOMID_SELF */ 96 movq $__HYPERVISOR_mmuext_op, %rax 97 syscall 98 testq %rax, %rax 99 jns 0f 100 ud2 101 1020: 103 /* Initialize registers. */ 104 movq _boot_stack(%rip), %rsp 105 movq _boot_start_info(%rip), %rsi 106 107 /* Jump! */ 108 jmpq *_boot_start(%rip) 109