Annotation of Gnu-Mach/i386/xen/xen_boothdr.S, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  Copyright (C) 2006-2011 Free Software Foundation
                      3:  *
                      4:  * This program is free software ; you can redistribute it and/or modify
                      5:  * it under the terms of the GNU General Public License as published by
                      6:  * the Free Software Foundation ; either version 2 of the License, or
                      7:  * (at your option) any later version.
                      8:  *
                      9:  * This program is distributed in the hope that it will be useful,
                     10:  * but WITHOUT ANY WARRANTY ; without even the implied warranty of
                     11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
                     12:  * GNU General Public License for more details.
                     13:  *
                     14:  * You should have received a copy of the GNU General Public License
                     15:  * along with the program ; if not, write to the Free Software
                     16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     17:  */
                     18: 
                     19: #include <xen/public/elfnote.h>
                     20: 
                     21: .section __xen_guest
                     22:        .ascii  "GUEST_OS=GNU Mach"
                     23:        .ascii  ",GUEST_VERSION=1.3"
                     24:        .ascii  ",XEN_VER=xen-3.0"
                     25:        .ascii  ",VIRT_BASE=0xC0000000"
                     26:        .ascii  ",ELF_PADDR_OFFSET=0xC0000000"
                     27:        .ascii  ",HYPERCALL_PAGE=0x2"
                     28: #if PAE
                     29:        .ascii  ",PAE=yes[extended-cr3]"
                     30: #else
                     31:        .ascii  ",PAE=no"
                     32: #endif
                     33:        .ascii  ",LOADER=generic"
                     34: #ifdef MACH_PSEUDO_PHYS
                     35:        .ascii  ",FEATURES=pae_pgdir_above_4gb"
                     36: #else  /* MACH_PSEUDO_PHYS */
                     37:        .ascii  ",FEATURES=!auto_translated_physmap"
                     38: #endif
                     39: #ifndef        MACH_PV_PAGETABLES
                     40:        .ascii  "|!writable_page_tables"
                     41: #endif /* MACH_PV_PAGETABLES */
                     42: #ifndef        MACH_PV_DESCRIPTORS
                     43:        .ascii  "|!writable_descriptor_tables"
                     44: #endif /* MACH_PV_DESCRIPTORS */
                     45: #ifndef        MACH_RING1
                     46:        .ascii  "|!supervisor_mode_kernel"
                     47: #endif /* MACH_PV_DESCRIPTORS */
                     48:        .byte   0
                     49: 
                     50: /* Macro taken from linux/include/linux/elfnote.h */
                     51: #define ELFNOTE(name, type, desctype, descdata)        \
                     52: .pushsection .note.name                        ;       \
                     53:   .align 4                             ;       \
                     54:   .long 2f - 1f                /* namesz */    ;       \
                     55:   .long 4f - 3f                /* descsz */    ;       \
                     56:   .long type                           ;       \
                     57: 1:.asciz "name"                                ;       \
                     58: 2:.align 4                             ;       \
                     59: 3:desctype descdata                    ;       \
                     60: 4:.align 4                             ;       \
                     61: .popsection                            ;
                     62: 
                     63:        ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,              .asciz, "GNU Mach")
                     64:        ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,         .asciz, "1.3")
                     65:        ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,           .asciz, "xen-3.0")
                     66:        ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,             .long,  _START)
                     67:        ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,          .long,  _START)
                     68:        ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,                 .long,  start)
                     69:        ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE,        .long,  hypcalls)
                     70: #if PAE
                     71:        ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,              .asciz, "yes[extended-cr3]")
                     72: #else
                     73:        ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,              .asciz, "no")
                     74: #endif
                     75:        ELFNOTE(Xen, XEN_ELFNOTE_LOADER,                .asciz, "generic")
                     76:        ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,              .asciz, ""
                     77: #ifdef MACH_PSEUDO_PHYS
                     78:                                                "pae_pgdir_above_4gb"
                     79: #else /* MACH_PSEUDO_PHYS */
                     80:                                                "!auto_translated_physmap"
                     81: #endif
                     82: #ifndef        MACH_PV_PAGETABLES
                     83:                                                "|!writable_page_tables"
                     84: #endif /* MACH_PV_PAGETABLES */
                     85: #ifndef        MACH_PV_DESCRIPTORS
                     86:                                                "|!writable_descriptor_tables"
                     87: #endif /* MACH_PV_DESCRIPTORS */
                     88: #ifndef        MACH_RING1
                     89:                                                "|!supervisor_mode_kernel"
                     90: #endif /* MACH_RING1 */
                     91:        )
                     92: 
                     93: #include <mach/machine/asm.h>
                     94: 
                     95: #include <i386/i386/i386asm.h>
                     96: 
                     97:        .text
                     98:        .globl  gdt, ldt
                     99:        .globl  start, _start, gdt
                    100: start:
                    101: _start:
                    102: 
                    103:        /* Switch to our own interrupt stack.  */
                    104:        movl    $(_intstack+INTSTACK_SIZE),%eax
                    105:        movl    %eax,%esp
                    106: 
                    107:        /* Reset EFLAGS to a known state.  */
                    108:        pushl   $0
                    109:        popf
                    110: 
                    111:        /* Push the start_info pointer to be the second argument.  */
                    112:        subl    $KERNELBASE,%esi
                    113:        pushl   %esi
                    114: 
                    115:        /* Fix ifunc entries */
                    116:        movl    $__rel_iplt_start,%esi
                    117:        movl    $__rel_iplt_end,%edi
                    118: iplt_cont:
                    119:        cmpl    %edi,%esi
                    120:        jae     iplt_done
                    121:        movl    (%esi),%ebx     /* r_offset */
                    122:        movb    4(%esi),%al     /* info */
                    123:        cmpb    $42,%al         /* IRELATIVE */
                    124:        jnz     iplt_next
                    125:        call    *(%ebx)         /* call ifunc */
                    126:        movl    %eax,(%ebx)     /* fixed address */
                    127: iplt_next:
                    128:        addl    $8,%esi
                    129:        jmp     iplt_cont
                    130: iplt_done:
                    131: 
                    132:        /* Jump into C code.  */
                    133:        call    EXT(c_boot_entry)
                    134: 
                    135: /* Those need to be aligned on page boundaries.  */
                    136: .global hyp_shared_info, hypcalls
                    137: 
                    138:        .org    (start + 0x1000)
                    139: hyp_shared_info:
                    140:        .org    hyp_shared_info + 0x1000
                    141: 
                    142: /* Labels just for debuggers */
                    143: #define hypcall(name, n) \
                    144:        .org    hypcalls + n*32 ; \
                    145: .globl __hyp_##name ; \
                    146: __hyp_##name:
                    147: 
                    148: hypcalls:
                    149:        hypcall(set_trap_table, 0)
                    150:        hypcall(mmu_update, 1)
                    151:        hypcall(set_gdt, 2)
                    152:        hypcall(stack_switch, 3)
                    153:        hypcall(set_callbacks, 4)
                    154:        hypcall(fpu_taskswitch, 5)
                    155:        hypcall(sched_op_compat, 6)
                    156:        hypcall(platform_op, 7)
                    157:        hypcall(set_debugreg, 8)
                    158:        hypcall(get_debugreg, 9)
                    159:        hypcall(update_descriptor, 10)
                    160:        hypcall(memory_op, 12)
                    161:        hypcall(multicall, 13)
                    162:        hypcall(update_va_mapping, 14)
                    163:        hypcall(set_timer_op, 15)
                    164:        hypcall(event_channel_op_compat, 16)
                    165:        hypcall(xen_version, 17)
                    166:        hypcall(console_io, 18)
                    167:        hypcall(physdev_op_compat, 19)
                    168:        hypcall(grant_table_op, 20)
                    169:        hypcall(vm_assist, 21)
                    170:        hypcall(update_va_mapping_otherdomain, 22)
                    171:        hypcall(iret, 23)
                    172:        hypcall(vcpu_op, 24)
                    173:        hypcall(set_segment_base, 25)
                    174:        hypcall(mmuext_op, 26)
                    175:        hypcall(acm_op, 27)
                    176:        hypcall(nmi_op, 28)
                    177:        hypcall(sched_op, 29)
                    178:        hypcall(callback_op, 30)
                    179:        hypcall(xenoprof_op, 31)
                    180:        hypcall(event_channel_op, 32)
                    181:        hypcall(physdev_op, 33)
                    182:        hypcall(hvm_op, 34)
                    183:        hypcall(sysctl, 35)
                    184:        hypcall(domctl, 36)
                    185:        hypcall(kexec_op, 37)
                    186: 
                    187:        hypcall(arch_0, 48)
                    188:        hypcall(arch_1, 49)
                    189:        hypcall(arch_2, 50)
                    190:        hypcall(arch_3, 51)
                    191:        hypcall(arch_4, 52)
                    192:        hypcall(arch_5, 53)
                    193:        hypcall(arch_6, 54)
                    194:        hypcall(arch_7, 55)
                    195: 
                    196:        .org    hypcalls + 0x1000
                    197: 
                    198: gdt:
                    199:        .org    gdt + 0x1000
                    200: 
                    201: ldt:
                    202:        .org    ldt + 0x1000
                    203: 
                    204: stack:
                    205:        .long   _intstack+INTSTACK_SIZE,0xe021
                    206:        .comm   _intstack,INTSTACK_SIZE
                    207: 

unix.superglobalmegacorp.com

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