Annotation of coherent/b/kernel/i386/ndpas.s, revision 1.1.1.1

1.1       root        1: / ndpas.s - assembler support for COH386 ndp
                      2:        .unixorder
                      3:        .globl  ndpSave
                      4:        .globl  ndpRestore
                      5:        .globl  ndpInit
                      6:        .globl  ndpSense
                      7: 
                      8: / void ndpInit(short cw);
                      9: ndpInit:
                     10:        fninit
                     11:        fldcw   4(%esp);
                     12:        fwait
                     13:        ret
                     14: 
                     15: / void ndpSave(char * bp);
                     16: ndpSave:
                     17:        mov     4(%esp),%eax
                     18:        fsetpm
                     19:        fnsave  (%eax)
                     20:        fwait
                     21:        ret
                     22: 
                     23: / void ndpRestore(char * bp);
                     24: ndpRestore:
                     25:        mov     4(%esp),%eax
                     26:        fsetpm
                     27:        frstor  (%eax)
                     28:        ret
                     29: 
                     30: / int ndpSense(void)
                     31: / call this with EM bit of CR0 off!
                     32: / return values according to NDP_TYPE_* in ndp.c
                     33: ndpSense:
                     34:        enter   $0,$4                   / reserve 4 bytes of auto storage
                     35:        movl    $1,%eax                 / ret = 1 (NDP_TYPE_NONE)
                     36:        movw    $0xffff,-4(%ebp)        / write 2 bytes of f's
                     37:        fninit                          / reset FP status word, if any
                     38:        fnstsw  -4(%ebp)                / write SW to memory (should be zero)
                     39:        cmpw    $0,-4(%ebp)             / did we clear memory?
                     40:        jnz     x01                     / if not, NDP_TYPE_NONE
                     41:        fnstcw  -4(%ebp)                / now try to write a control word
                     42:        andw    $0x103f,-4(%ebp)        / mask bits not to be checked
                     43:        cmpw    $0x003f,-4(%ebp)
                     44:        jne     x01                     / didn't get expected bits - no NDP
                     45: 
                     46: / At this point, we know there is an NDP.
                     47: 
                     48: / Is there a 486? if so, ndp type is 486DX/487SX
                     49:        mov     %esp,%ecx               / save esp in ecx
                     50:        andl    $~3,%esp                / round esp down to 4-byte boundary
                     51:        pushfl
                     52:        popl    %eax                    / get PSW into eax
                     53:        mov     %eax,%edx               / save original PSW to edx
                     54:        xorl    $0x40000,%eax           / flip AC bit (only exists in 486)
                     55:        andw    $~0x0200,%ax            / interrupts off for this!
                     56: 
                     57:        pushl   %eax                    / put back into flags reg
                     58:        popfl
                     59:        pushfl                          / get flags again.  ho hum.
                     60:        popl    %eax
                     61: 
                     62:        pushl   %edx                    / restore old PSW
                     63:        popfl
                     64:        mov     %ecx,%esp               / restore old esp
                     65: 
                     66:        xor     %edx,%eax               / compare old and new PSW's
                     67:        and     $0x40000,%eax           / only care about AC bit
                     68:        movl    $4,%eax                 / ret = NDP_TYPE_486DX
                     69:        jne     x01
                     70: 
                     71: / By elimination, system consists of 386 plus either 287 or 387.
                     72: / Find out which.  Remember, exceptions are now masked.
                     73:        fld1
                     74:        fldz
                     75:        fdivr                           / leave 1.0/0.0 on FP stack
                     76:        fld     %st                     / duplicate infinity
                     77:        fchs                            / negate
                     78:        fcompp                          / compare and pop FP
                     79:        fstsw   -4(%ebp)                / write FP flags
                     80:        movw    -4(%ebp),%ax
                     81:        sahf                            / FP flags to PSW
                     82:        movl    $3,%eax                 / ret = NDP_TYPE_387
                     83:        jne     x01
                     84:        dec     %eax                    / ret = NDP_TYPE_286
                     85: 
                     86: x01:
                     87:        leave
                     88:        ret

unix.superglobalmegacorp.com

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