head.s

来自「xen虚拟机源代码安装包」· S 代码 · 共 208 行

S
208
字号
#include <xen/config.h>#include <xen/multiboot.h>#include <public/xen.h>#include <asm/asm_defns.h>#include <asm/desc.h>#include <asm/page.h>#include <asm/msr.h>        .text        .code32#undef bootsym_phys#define sym_phys(sym)     ((sym) - __XEN_VIRT_START)#define bootsym_phys(sym) ((sym) - trampoline_start + BOOT_TRAMPOLINE)#define BOOT_CS32        0x0008#define BOOT_CS64        0x0010#define BOOT_DS          0x0018#define BOOT_PSEUDORM_CS 0x0020#define BOOT_PSEUDORM_DS 0x0028ENTRY(start)        jmp     __start        .align 4/*** MULTIBOOT HEADER ****/#define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_HEADER_MODS_ALIGNED | \                                MULTIBOOT_HEADER_WANT_MEMORY)        /* Magic number indicating a Multiboot header. */        .long   MULTIBOOT_HEADER_MAGIC        /* Flags to bootloader (see Multiboot spec). */        .long   MULTIBOOT_HEADER_FLAGS        /* Checksum: must be the negated sum of the first two fields. */        .long   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)        .section .init.text.Lbad_cpu_msg: .asciz "ERR: Not a 64-bit CPU!".Lbad_ldr_msg: .asciz "ERR: Not a Multiboot bootloader!"bad_cpu:        mov     $(sym_phys(.Lbad_cpu_msg)),%esi # Error message        jmp     print_errnot_multiboot:        mov     $(sym_phys(.Lbad_ldr_msg)),%esi # Error messageprint_err:        mov     $0xB8000,%edi  # VGA framebuffer1:      mov     (%esi),%bl        test    %bl,%bl        # Terminate on '\0' sentinel2:      je      2b        mov     $0x3f8+5,%dx   # UART Line Status Register3:      in      %dx,%al        test    $0x20,%al      # Test THR Empty flag        je      3b        mov     $0x3f8+0,%dx   # UART Transmit Holding Register        mov     %bl,%al        out     %al,%dx        # Send a character over the serial line        movsb                  # Write a character to the VGA framebuffer        mov     $7,%al        stosb                  # Write an attribute to the VGA framebuffer        jmp     1bgdt_boot_descr:        .word   6*8-1        .long   sym_phys(trampoline_gdt)__start:        cld        cli        /* Initialise GDT and basic data segments. */        lgdt    %cs:sym_phys(gdt_boot_descr)        mov     $BOOT_DS,%ecx        mov     %ecx,%ds        mov     %ecx,%es        mov     %ecx,%ss        /* Check for Multiboot bootloader */        cmp     $0x2BADB002,%eax        jne     not_multiboot        /* Save the Multiboot info structure for later use. */        mov     %ebx,sym_phys(multiboot_ptr)        /* Initialize BSS (no nasty surprises!) */        mov     $sym_phys(__bss_start),%edi        mov     $sym_phys(_end),%ecx        sub     %edi,%ecx        xor     %eax,%eax        rep     stosb        /* Interrogate CPU extended features via CPUID. */        mov     $0x80000000,%eax        cpuid        xor     %edx,%edx        cmp     $0x80000000,%eax    # any function > 0x80000000?        jbe     1f        mov     $0x80000001,%eax        cpuid1:      mov     %edx,sym_phys(cpuid_ext_features)        mov     %edx,sym_phys(boot_cpu_data)+CPUINFO_ext_features#if defined(__x86_64__)        /* Check for availability of long mode. */        bt      $29,%edx        jnc     bad_cpu        /* Initialise L2 identity-map and xen page table entries (16MB). */        mov     $sym_phys(l2_identmap),%edi        mov     $sym_phys(l2_xenmap),%esi        mov     $0x1e3,%eax                  /* PRESENT+RW+A+D+2MB+GLOBAL */        mov     $8,%ecx1:      mov     %eax,(%edi)        add     $8,%edi        mov     %eax,(%esi)        add     $8,%esi        add     $(1<<L2_PAGETABLE_SHIFT),%eax        loop    1b        /* Initialise L3 identity-map page directory entries. */        mov     $sym_phys(l3_identmap),%edi        mov     $(sym_phys(l2_identmap)+7),%eax        mov     $4,%ecx1:      mov     %eax,(%edi)        add     $8,%edi        add     $PAGE_SIZE,%eax        loop    1b        /* Initialise L3 xen-map page directory entry. */        mov     $(sym_phys(l2_xenmap)+7),%eax        mov     %eax,sym_phys(l3_xenmap) + (50*8)        /* Hook identity-map and xen-map L3 tables into PML4. */        mov     $(sym_phys(l3_identmap)+7),%eax        mov     %eax,sym_phys(idle_pg_table) + (  0*8) /* PML4[  0]: 1:1 map */        mov     %eax,sym_phys(idle_pg_table) + (262*8) /* PML4[262]: 1:1 map */        mov     $(sym_phys(l3_xenmap)+7),%eax        mov     %eax,sym_phys(idle_pg_table) + (261*8) /* PML4[261]: xen map */#else        /* Initialize low and high mappings of memory with 2MB pages */        mov     $sym_phys(idle_pg_table_l2),%edi        mov     $0xe3,%eax                   /* PRESENT+RW+A+D+2MB */1:      mov     %eax,__PAGE_OFFSET>>18(%edi) /* high mapping */        stosl                                /* low mapping */        add     $4,%edi        add     $(1<<L2_PAGETABLE_SHIFT),%eax        cmp     $DIRECTMAP_PHYS_END+0xe3,%eax        jne     1b1:      stosl   /* low mappings cover up to 16MB */        add     $4,%edi        add     $(1<<L2_PAGETABLE_SHIFT),%eax        cmp     $(16<<20)+0xe3,%eax        jne     1b#endif        /* Initialize 4kB mappings of first 2MB or 4MB of memory. */        mov     $sym_phys(l1_identmap),%edi        mov     $0x263,%eax                  /* PRESENT+RW+A+D+SMALL_PAGES */#if defined(__x86_64__)        or      $0x100,%eax                  /* GLOBAL */#endif        xor     %ecx,%ecx1:      stosl        add     $4,%edi        add     $PAGE_SIZE,%eax        inc     %ecx        /* VGA hole (0xa0000-0xc0000) should be mapped UC. */        cmp     $0xa0,%ecx        jne     2f        or      $0x10,%eax                   /* +PCD */2:      cmp     $0xc0,%ecx        jne     2f        and     $~0x10,%eax                  /* -PCD */2:      cmp     $L1_PAGETABLE_ENTRIES,%ecx        jne     1b        sub     $(PAGE_SIZE-0x63),%edi#if defined(__x86_64__)        mov     %edi,sym_phys(l2_identmap)        mov     %edi,sym_phys(l2_xenmap)#else        mov     %edi,sym_phys(idle_pg_table_l2)        mov     %edi,sym_phys(idle_pg_table_l2) + (__PAGE_OFFSET>>18)#endif        /* Copy bootstrap trampoline to low memory, below 1MB. */        mov     $sym_phys(trampoline_start),%esi        mov     $bootsym_phys(trampoline_start),%edi        mov     $trampoline_end - trampoline_start,%ecx        rep     movsb        mov     $bootsym_phys(early_stack),%esp        call    cmdline_parse_early        /* Jump into the relocated trampoline. */        jmp     $BOOT_CS32,$bootsym_phys(trampoline_boot_cpu_entry)#include "cmdline.S"        .align 16        .globl trampoline_start, trampoline_endtrampoline_start:#include "trampoline.S"trampoline_end:        .text__high_start:#ifdef __x86_64__#include "x86_64.S"#else#include "x86_32.S"#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?