1#include <os.h>
2#include <arch_limits.h>
3#include <xen/arch-x86_32.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_boot_page_entry_lo:
19        .long 0
20_boot_page_entry_hi:
21        .long 0
22
23/* mmuext_op structure */
24/* Set new page directory */
25_boot_mmuext:
26        /* Op # */
27        .long MMUEXT_NEW_BASEPTR
28
29        /* MFN of target page table directory */
30.globl _boot_pdmfn
31_boot_pdmfn:
32        .long 0
33
34        /* Unused */
35        .long 0
36
37/* Unpin old page directory */
38        /* Op # */
39        .long MMUEXT_UNPIN_TABLE
40
41        /* MFN of old page table directory */
42.globl _boot_oldpdmfn
43_boot_oldpdmfn:
44        .long 0
45
46        /* Unused */
47        .long 0
48
49/* Target stack address, also target virtual address of this page */
50.globl _boot_stack
51_boot_stack:
52        .long 0
53        .long __KERNEL_SS
54.globl _boot_target
55_boot_target:
56        .long 0
57
58/* Target start info */
59.globl _boot_start_info
60_boot_start_info:
61        .long 0
62
63/* Target start address */
64.globl _boot_start
65_boot_start:
66        .long 0
67
68/*
69 * Boot target OS, does not return
70 */
71.globl _boot
72_boot:
73        /* Project ourselves at the target place. */
74        movl    _boot_target, %ebx
75        movl    %ebx, %ebp     /* also keep it in ebp for relative addressing */
76        movl    _boot_page_entry_lo, %ecx
77        movl    _boot_page_entry_hi, %edx
78        movl    $2, %esi /* UVMF_INVLPG */
79        movl    $__HYPERVISOR_update_va_mapping, %eax
80        int     $0x82
81        testl   %eax, %eax
82        jz      0f
83        ud2
84
850:
86        /* Go there. */
87        movl    $(0f - _boot_page), %eax
88        movl    _boot_target, %ebx
89        addl    %ebx, %eax
90        jmpl    *%eax
910:
92
93        /* Load target page table and unpin old page table.  */
94        /* We shouldn't have any problem since in the new page table our page is
95           mapped at the same place.  */
96        leal    (_boot_mmuext-_boot_page)(%ebp), %ebx
97        movl    $2, %ecx
98        xorl    %edx, %edx
99        movl    $0x7FF0, %esi /* DOMID_SELF */
100        movl    $__HYPERVISOR_mmuext_op, %eax
101        int     $0x82
102        testl   %eax, %eax
103        jns     0f
104        ud2
105
1060:
107        /* Initialize registers.  */
108        lss     (_boot_stack-_boot_page)(%ebp), %esp
109        movl    (_boot_start_info-_boot_page)(%ebp), %esi
110
111        /* Jump!  */
112        jmpl    *(_boot_start-_boot_page)(%ebp)
113