Print this page
Rearrange multiboot2_entry.S so all data is first, code64 is second,
code32 is third. (No more dual code64 sections.)

Split Close
Expand all
Collapse all
          --- old/src/arch/x86/image/multiboot2_entry.S
          +++ new/src/arch/x86/image/multiboot2_entry.S
   1    1  /*
   2    2   * Parts copyright Michael Brown <mbrown@fensystems.co.uk>
   3    3   *
   4      - * Copyright (c) 2019, Joyent, Inc.
        4 + * Copyright 2020, Joyent, Inc.
   5    5   */
   6    6  
   7    7  FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
   8    8  
   9    9  /* CR0: protection enabled */
  10   10  #define CR0_PE ( 1 << 0 )
  11   11  
  12   12  /* CR0: paging */
  13   13  #define CR0_PG ( 1 << 31 )
  14   14  
↓ open down ↓ 8 lines elided ↑ open up ↑
  23   23  /* EFER: long mode enable */
  24   24  #define EFER_LME ( 1 << 8 )
  25   25  
  26   26  #define GDTSEL_CODE 0x8
  27   27  #define GDTSEL_DATA 0x10
  28   28  
  29   29  #if defined(PXE_EFI) && defined(__x86_64__)
  30   30  
  31   31          .section ".text", "ax", @progbits
  32   32  
       33 +        .data
       34 +
       35 +newcs_vector:
       36 +        .long   newcs, GDTSEL_CODE
       37 +
       38 +entry_gdt:
       39 +        /* null entry */
       40 +        .word   0x0, 0x0
       41 +        .byte   0x0, 0x0, 0x0, 0x0
       42 +
       43 +        /* 32 bit protected mode code segment */
       44 +        .word   0xffff, 0x0
       45 +        .byte   0x0, 0x9f, 0xcf, 0x0
       46 +
       47 +        /* 32 bit protected mode data segment */
       48 +        .word   0xffff, 0x0
       49 +        .byte   0x0, 0x93, 0xcf, 0x0
       50 +
       51 +entry_gdt_end:
       52 +        .equ    entry_gdt_length, entry_gdt_end - entry_gdt
       53 +
       54 +entry_gdtr:
       55 +        .word entry_gdt_length - 1
       56 +entry_gdt_base:
       57 +        .quad 0
       58 +
  33   59          /*
       60 +         * %rdi -> struct mb2 *
       61 +         * %rsi -> stack pointer to switch to
       62 +         * %rdx -> &multiboot2_enter_kernel
       63 +         */
       64 +        .code64
       65 +        .globl multiboot2_bounce
       66 +
       67 +multiboot2_bounce:
       68 +        movq    %rsi, %rsp
       69 +        jmp     *%rdx
       70 +
       71 +        /*
  34   72           * %rdi -> multiboot2 magic
  35   73           * %rsi -> multiboot info pointer
  36   74           * %rdx -> entry address (32 bits)
  37   75           *
  38   76           *
  39   77           * We need to transition from our 64-bit environment into the one
  40   78           * defined by the multiboot2 spec, section 3.3. Namely, drop down to
  41   79           * 32-bit protected mode with a basic GDT, paging disabled, interrupts
  42   80           * off, and
  43   81           *
  44   82           * %eax -> multiboot2 magic
  45   83           * %ebx -> multiboot info pointer (physical)
  46   84           */
  47      -        .align 16
  48   85          .globl multiboot2_entry
  49   86  
  50   87  multiboot2_entry:
  51   88          cli
  52   89  
  53   90          movq    %rsi, %rbx /* mb2 infop */
  54   91          movq    %rdx, %rsi /* entry address */
  55   92  
  56   93          /* Load the mb2-mandated code and data segments.  */
  57   94          leaq    entry_gdt_base(%rip), %rcx
↓ open down ↓ 28 lines elided ↑ open up ↑
  86  123          /* Disable long mode (clobbers %eax, %edx) */
  87  124          movl    $MSR_EFER, %ecx
  88  125          rdmsr
  89  126          andw    $~EFER_LME, %ax
  90  127          wrmsr
  91  128  
  92  129          /* %ebx still has our infop */
  93  130          movl    %edi, %eax
  94  131          jmp     *%esi
  95  132  
  96      -        /*
  97      -         * %rdi -> struct mb2 *
  98      -         * %rsi -> stack pointer to switch to
  99      -         * %rdx -> &multiboot2_enter_kernel
 100      -         */
 101      -        .align 16
 102      -        .code64
 103      -        .globl multiboot2_bounce
 104      -
 105      -multiboot2_bounce:
 106      -        movq    %rsi, %rsp
 107      -        jmp     *%rdx
 108      -
 109      -        .data
 110      -
 111      -newcs_vector:
 112      -        .long   newcs, GDTSEL_CODE
 113      -
 114      -        .align 16
 115      -entry_gdt:
 116      -        /* null entry */
 117      -        .word   0x0, 0x0
 118      -        .byte   0x0, 0x0, 0x0, 0x0
 119      -
 120      -        /* 32 bit protected mode code segment */
 121      -        .word   0xffff, 0x0
 122      -        .byte   0x0, 0x9f, 0xcf, 0x0
 123      -
 124      -        /* 32 bit protected mode data segment */
 125      -        .word   0xffff, 0x0
 126      -        .byte   0x0, 0x93, 0xcf, 0x0
 127      -
 128      -entry_gdt_end:
 129      -        .equ    entry_gdt_length, entry_gdt_end - entry_gdt
 130      -
 131      -        .align 16
 132      -entry_gdtr:
 133      -        .word entry_gdt_length - 1
 134      -entry_gdt_base:
 135      -        .quad 0
 136      -
 137  133  #endif /* PXE_EFI && __x86_64__ */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX