Annotation of Gnu-Mach/i386/i386at/boothdr.S, revision 1.1.1.3

1.1       root        1: 
                      2: #include <mach/machine/asm.h>
                      3: 
1.1.1.2   root        4: #include <i386/i386asm.h>
1.1       root        5: 
1.1.1.2   root        6:        /*
                      7:         * This section will be put first into .text.  See also i386/ldscript.
                      8:         */
                      9:        .section .text.start,"ax"
                     10:        
1.1       root       11:        /* We should never be entered this way.  */
                     12:        .globl  start,_start
                     13: start:
                     14: _start:
                     15:        jmp     boot_entry
                     16: 
                     17:        /* MultiBoot header - see multiboot.h.  */
                     18: #define        MULTIBOOT_MAGIC         0x1BADB002
                     19: #ifdef __ELF__
1.1.1.3 ! root       20: #define MULTIBOOT_FLAGS                0x00000003
1.1       root       21: #else  /* __ELF__ */
1.1.1.3 ! root       22: #define MULTIBOOT_FLAGS                0x00010003
1.1       root       23: #endif /* __ELF__ */
                     24:        P2ALIGN(2)
                     25: boot_hdr:
                     26:        .long   MULTIBOOT_MAGIC
                     27:        .long   MULTIBOOT_FLAGS
                     28:                /*
                     29:                 * The next item here is the checksum.
                     30:                 * XX this works OK until we need at least the 30th bit.
                     31:                 */
                     32:        .long   - (MULTIBOOT_MAGIC+MULTIBOOT_FLAGS)
                     33: #ifndef __ELF__        /* a.out kludge */
                     34:        .long   boot_hdr        /* header_addr */
                     35:        .long   _start          /* load_addr */
                     36:        .long   _edata          /* load_end_addr */
                     37:        .long   _end            /* bss_end_addr */
                     38:        .long   boot_entry      /* entry */
                     39: #endif /* __ELF__ */
                     40: 
                     41: boot_entry:
1.1.1.2   root       42:        /* use segmentation to offset ourself. */
                     43:        lgdt    boot_gdt_descr - KERNELBASE
                     44:        ljmp    $8,$0f
                     45: 0:
                     46:        movw    $0,%ax
                     47:        movw    %ax,%ds
                     48:        movw    %ax,%es
                     49:        movw    %ax,%fs
                     50:        movw    %ax,%gs
                     51:        movw    $16,%ax
                     52:        movw    %ax,%ds
                     53:        movw    %ax,%es
                     54:        movw    %ax,%ss
1.1       root       55: 
                     56:        /* Switch to our own interrupt stack.  */
                     57:        movl    $_intstack+INTSTACK_SIZE,%esp
                     58: 
                     59:        /* Reset EFLAGS to a known state.  */
                     60:        pushl   $0
                     61:        popf
                     62: 
                     63:        /* Clear uninitialized data.  */
                     64:        lea     _edata,%edi
                     65:        lea     _end,%ecx
                     66:        subl    %edi,%ecx
                     67:        xorl    %eax,%eax
                     68:        rep
                     69:        stosb
                     70: 
                     71:        /* Push the boot_info pointer to be the second argument.  */
                     72:        pushl   %ebx
                     73: 
1.1.1.2   root       74:        /* Fix ifunc entries */
                     75:        movl    $__rel_iplt_start,%esi
                     76:        movl    $__rel_iplt_end,%edi
                     77: iplt_cont:
                     78:        cmpl    %edi,%esi
                     79:        jae     iplt_done
                     80:        movl    (%esi),%ebx     /* r_offset */
                     81:        movb    4(%esi),%al     /* info */
                     82:        cmpb    $42,%al         /* IRELATIVE */
                     83:        jnz     iplt_next
                     84:        call    *(%ebx)         /* call ifunc */
                     85:        movl    %eax,(%ebx)     /* fixed address */
                     86: iplt_next:
                     87:        addl    $8,%esi
                     88:        jmp     iplt_cont
                     89: iplt_done:
                     90: 
1.1       root       91:        /* Jump into C code.  */
                     92:        call    EXT(c_boot_entry)
                     93: 
                     94:        .comm   _intstack,INTSTACK_SIZE
                     95: 
1.1.1.2   root       96: .align 16
                     97:        .word 0
                     98: boot_gdt_descr:
                     99:        .word 3*8+7
                    100:        .long boot_gdt - KERNELBASE
                    101: .align 16
                    102: boot_gdt:
                    103:        /* 0 */
                    104:        .quad 0
                    105:        /* boot CS = 8 */
                    106:        .word 0xffff
                    107:        .word (-KERNELBASE) & 0xffff
                    108:        .byte ((-KERNELBASE) >> 16) & 0xff
                    109:        .byte 0x9a
                    110:        .byte 0xcf
                    111:        .byte ((-KERNELBASE) >> 24) & 0xff
                    112:        /* boot DS = 8 */
                    113:        .word 0xffff
                    114:        .word (-KERNELBASE) & 0xffff
                    115:        .byte ((-KERNELBASE) >> 16) & 0xff
                    116:        .byte 0x92
                    117:        .byte 0xcf
                    118:        .byte ((-KERNELBASE) >> 24) & 0xff
                    119: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.