Annotation of qemu/roms/openbios/arch/x86/entry.S, revision 1.1

1.1     ! root        1:        .globl  entry, __switch_context, __exit_context, halt, init_exceptions
        !             2: 
        !             3:        .text
        !             4:        .align  4
        !             5: 
        !             6: /*
        !             7:  * Entry point
        !             8:  * We start execution from here.
        !             9:  * It is assumed that CPU is in 32-bit protected mode and
        !            10:  * all segments are 4GB and base zero (flat model).
        !            11:  */
        !            12: entry:
        !            13:        /* Save boot context and switch to our main context.
        !            14:         * Main context is statically defined in C.
        !            15:         */
        !            16:        pushl   %cs
        !            17:        call    __switch_context
        !            18: 
        !            19:        /* We get here when the main context switches back to
        !            20:         * the boot context.
        !            21:         * Return to previous bootloader.
        !            22:         */
        !            23:        ret
        !            24: 
        !            25: /*
        !            26:  * Switch execution context
        !            27:  * This saves registers, segments, and GDT in the stack, then
        !            28:  * switches the stack, and restores everything from the new stack.
        !            29:  * This function takes no argument. New stack pointer is
        !            30:  * taken from global variable __context, and old stack pointer
        !            31:  * is also saved to __context. This way we can just jump to
        !            32:  * this routine to get back to the original context.
        !            33:  *
        !            34:  * Call this routine with lcall or pushl %cs; call.
        !            35:  */
        !            36: __switch_context:
        !            37:        /* Save everything in current stack */
        !            38:        pushfl              /* 56 */
        !            39:        pushl   %ds         /* 52 */
        !            40:        pushl   %es         /* 48 */
        !            41:        pushl   %fs         /* 44 */
        !            42:        pushl   %gs         /* 40 */
        !            43:        pushal              /* 8 */
        !            44:        subl    $8, %esp
        !            45:        movw    %ss, (%esp) /* 0 */
        !            46:        sgdt    2(%esp)     /* 2 */
        !            47: 
        !            48: #if 0
        !            49:        /* Swap %cs and %eip on the stack, so lret will work */
        !            50:        movl    60(%esp), %eax
        !            51:        xchgl   %eax, 64(%esp)
        !            52:        movl    %eax, 60(%esp)
        !            53: #endif
        !            54: 
        !            55:        /* At this point we don't know if we are on flat segment
        !            56:         * or relocated. So compute the address offset from %eip.
        !            57:         * Assuming CS.base==DS.base==SS.base.
        !            58:         */
        !            59:        call    1f
        !            60: 1:     popl    %ebx
        !            61:        subl    $1b, %ebx
        !            62: 
        !            63:        /* Interrupts are not allowed... */
        !            64:        cli
        !            65: 
        !            66:        /* Current context pointer is our stack pointer */
        !            67:        movl    %esp, %esi
        !            68: 
        !            69:        /* Normalize the ctx pointer */
        !            70:        subl    %ebx, %esi
        !            71: 
        !            72:        /* Swap it with new value */
        !            73:        xchgl   %esi, __context(%ebx)
        !            74: 
        !            75:        /* Adjust new ctx pointer for current address offset */
        !            76:        addl    %ebx, %esi
        !            77: 
        !            78:        /* Load new %ss and %esp to temporary */
        !            79:        movzwl  (%esi), %edx
        !            80:        movl    20(%esi), %eax
        !            81: 
        !            82:        /* Load new GDT */
        !            83:        lgdt    2(%esi)
        !            84: 
        !            85:        /* Load new stack segment with new GDT */
        !            86:        movl    %edx, %ss
        !            87: 
        !            88:        /* Set new stack pointer, but we have to adjust it because
        !            89:         * pushal saves %esp value before pushal, and we want the value
        !            90:         * after pushal.
        !            91:         */
        !            92:        leal    -32(%eax), %esp
        !            93: 
        !            94:        /* Load the rest from new stack */
        !            95:        popal
        !            96:        popl    %gs
        !            97:        popl    %fs
        !            98:        popl    %es
        !            99:        popl    %ds
        !           100:        popfl
        !           101: 
        !           102:        /* Finally, load new %cs and %eip */
        !           103:        lret
        !           104: 
        !           105: __exit_context:
        !           106:        /* Get back to the original context */
        !           107:        pushl   %cs
        !           108:        call    __switch_context
        !           109: 
        !           110:        /* We get here if the other context attempt to switch to this
        !           111:         * dead context. This should not happen. */
        !           112: 
        !           113: halt:
        !           114:        cli
        !           115:        hlt
        !           116:        jmp     halt
        !           117: 
        !           118: /*
        !           119:  * initialize exception handler. All exceptions end up in the same
        !           120:  * C function.
        !           121:  */
        !           122: 
        !           123: init_exceptions:
        !           124:        pushl   %ebx
        !           125:        pushl   %edi
        !           126: 
        !           127:         /* Initialize the Interrupt Descriptor table */
        !           128:         leal    _idt, %edi
        !           129:         leal    vec0, %ebx
        !           130:         movl    $(0x08 << 16), %eax     /* cs selector */
        !           131: 
        !           132: 1:      movw    %bx, %ax
        !           133:         movl    %ebx, %edx
        !           134:         movw    $0x8E00, %dx            /* Interrupt gate - dpl=0, present */
        !           135:         movl    %eax, 0(%edi)
        !           136:         movl    %edx, 4(%edi)
        !           137:         addl    $6, %ebx
        !           138:         addl    $8, %edi
        !           139:         cmpl    $_idt_end, %edi
        !           140:         jne     1b
        !           141: 
        !           142:         /* Load the Interrupt descriptor table */
        !           143:         lidt    idtarg
        !           144: 
        !           145:        movl    $0, %eax
        !           146:        popl    %edi
        !           147:        popl    %ebx
        !           148:        ret
        !           149: 
        !           150: vec0:
        !           151:         pushl   $0 /* error code */
        !           152:         pushl   $0 /* vector */
        !           153:         jmp int_hand
        !           154: vec1:
        !           155:         pushl   $0 /* error code */
        !           156:         pushl   $1 /* vector */
        !           157:         jmp int_hand
        !           158: 
        !           159: vec2:
        !           160:         pushl   $0 /* error code */
        !           161:         pushl   $2 /* vector */
        !           162:         jmp int_hand
        !           163: 
        !           164: vec3:
        !           165:         pushl   $0 /* error code */
        !           166:         pushl   $3 /* vector */
        !           167:         jmp     int_hand
        !           168: 
        !           169: vec4:
        !           170:         pushl   $0 /* error code */
        !           171:         pushl   $4 /* vector */
        !           172:         jmp     int_hand
        !           173: 
        !           174: vec5:
        !           175:         pushl   $0 /* error code */
        !           176:         pushl   $5 /* vector */
        !           177:         jmp     int_hand
        !           178: 
        !           179: vec6:
        !           180:         pushl   $0 /* error code */
        !           181:         pushl   $6 /* vector */
        !           182:         jmp     int_hand
        !           183: vec7:
        !           184:         pushl   $0 /* error code */
        !           185:         pushl   $7 /* vector */
        !           186:         jmp     int_hand
        !           187: 
        !           188: vec8:
        !           189:         /* error code */
        !           190:         pushl   $8 /* vector */
        !           191:         jmp     int_hand
        !           192:         .word   0x9090
        !           193: 
        !           194: vec9:
        !           195:         pushl   $0 /* error code */
        !           196:         pushl   $9 /* vector */
        !           197:         jmp int_hand
        !           198: 
        !           199: vec10:
        !           200:         /* error code */
        !           201:         pushl   $10 /* vector */
        !           202:         jmp     int_hand
        !           203:         .word   0x9090
        !           204: 
        !           205: vec11:
        !           206:         /* error code */
        !           207:         pushl   $11 /* vector */
        !           208:         jmp     int_hand
        !           209:         .word   0x9090
        !           210: 
        !           211: vec12:
        !           212:         /* error code */
        !           213:         pushl   $12 /* vector */
        !           214:         jmp     int_hand
        !           215:         .word   0x9090
        !           216: 
        !           217: vec13:
        !           218:         /* error code */
        !           219:         pushl   $13 /* vector */
        !           220:         jmp     int_hand
        !           221:         .word   0x9090
        !           222: 
        !           223: vec14:
        !           224:         /* error code */
        !           225:         pushl   $14 /* vector */
        !           226:         jmp     int_hand
        !           227:         .word   0x9090
        !           228: 
        !           229: vec15:
        !           230:         pushl   $0 /* error code */
        !           231:         pushl   $15 /* vector */
        !           232:         jmp     int_hand
        !           233: 
        !           234: vec16:
        !           235:         pushl   $0 /* error code */
        !           236:         pushl   $16 /* vector */
        !           237:         jmp     int_hand
        !           238: 
        !           239: vec17:
        !           240:         /* error code */
        !           241:         pushl   $17 /* vector */
        !           242:         jmp     int_hand
        !           243:         .word   0x9090
        !           244: 
        !           245: vec18:
        !           246:         pushl   $0 /* error code */
        !           247:         pushl   $18 /* vector */
        !           248:         jmp     int_hand
        !           249: 
        !           250: vec19:
        !           251:         pushl   $0 /* error code */
        !           252:         pushl   $19 /* vector */
        !           253:         jmp     int_hand
        !           254: 
        !           255: __divide_error:
        !           256:         pushl   $0 /* error code */
        !           257:         pushl   $20 /* vector */
        !           258:         jmp     int_hand
        !           259:         .global __divide_error
        !           260: 
        !           261: int_hand:
        !           262:         /* At this point on the stack there is:
        !           263:          *  0(%esp) vector
        !           264:          *  4(%esp) error code
        !           265:          *  8(%esp) eip
        !           266:          * 12(%esp) cs
        !           267:          * 16(%esp) eflags
        !           268:          */
        !           269:         pushl   %edi
        !           270:         pushl   %esi
        !           271:         pushl   %ebp
        !           272:         /* Original stack pointer */
        !           273:         leal    32(%esp), %ebp
        !           274:         pushl   %ebp
        !           275:         pushl   %ebx
        !           276:         pushl   %edx
        !           277:         pushl   %ecx
        !           278:         pushl   %eax
        !           279: 
        !           280:         pushl   %esp    /* Pointer to structure on the stack */
        !           281: 
        !           282:         call    x86_exception
        !           283:         pop     %eax    /* Drop the pointer */
        !           284: 
        !           285:         popl    %eax
        !           286:         popl    %ecx
        !           287:         popl    %edx
        !           288:         popl    %ebx
        !           289:         popl    %ebp /* Ignore saved %esp value */
        !           290:         popl    %ebp
        !           291:         popl    %esi
        !           292:         popl    %edi
        !           293: 
        !           294:         addl    $8, %esp /* pop of the vector and error code */
        !           295: 
        !           296:         iret
        !           297: 
        !           298: idtarg:
        !           299:         .word   _idt_end - _idt - 1     /* limit */
        !           300:         .long   _idt
        !           301:         .word   0
        !           302: _idt:
        !           303:         .fill   20, 8, 0        # idt is unitiailzed
        !           304: _idt_end:
        !           305: 
        !           306:         .globl  arch_nvram_size, arch_nvram_get, arch_nvram_put
        !           307: arch_nvram_size:
        !           308:         xor     %eax, %eax
        !           309:         ret
        !           310: 
        !           311: arch_nvram_get:
        !           312:         ret
        !           313: 
        !           314: arch_nvram_put:
        !           315:         ret

unix.superglobalmegacorp.com

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