]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/boot/pc/a20.s
kernel: implement portable userinit() and simplify process creation
[plan9front.git] / sys / src / boot / pc / a20.s
index 0455a595294cf28e41d0d1ba1a942795fb943b06..70933110e65af9c92ee7199f158cce7791ccd15c 100644 (file)
@@ -2,69 +2,83 @@
 
 #undef ORB
 
+TEXT a20test(SB), $0
+       LONG $1234567
+
+TEXT a20check(SB), $0
+       MOVL $10000, CX
+_loop:
+       LEAL a20test(SB), AX
+       MOVL (AX), BX
+       ADDL $12345, BX
+       MOVL BX, (AX)
+       ORL $(1<<20), AX
+       MOVL (AX), AX
+       CMPL AX, BX
+       JNZ _done
+       LOOP _loop
+       RET
+_done:
+       /* return directly to caller of a20() */
+       ADDL $4, SP
+       XORL AX, AX
+       RET
+
 TEXT a20(SB), $0
+       CALL a20check(SB)
+
+       /* try bios */
        CALL rmode16(SB)
-       CALL16(spllo(SB))
+       STI
        LWI(0x2401, rAX)
        BIOSCALL(0x15)
-       JC _biosfail
        CALL16(pmode32(SB))
-       RET
 
-_biosfail:
-       CALL16(pmode32(SB))
+       CALL a20check(SB)
 
-       /* fast a20 */
+       /* try fast a20 */
        MOVL $0x92, DX
        INB
-       ANDB $0xFE, AX
-       ORB $0x02, AX
-       OUTB
-
-       /* slow a20 */
-       CALL a20wait(SB)
-       MOVL $0x64, DX
-       MOVB $0xAD, AL
+       TESTB $2, AL
+       JNZ _no92
+       ORB $2, AL
+       ANDB $0xfe, AL
        OUTB
+_no92:
+       CALL a20check(SB)
 
-       CALL a20wait(SB)
+       /* try keyboard */
+       CALL kbdempty(SB)
        MOVL $0x64, DX
-       MOVB $0xD0, AL
+       MOVB $0xd1, AL  /* command write */
        OUTB
-
-       CALL a20wait2(SB)
+       CALL kbdempty(SB)
        MOVL $0x60, DX
-       INB
-       PUSHL AX
-
-       CALL a20wait(SB)
+       MOVB $0xdf, AL  /* a20 on */
+       OUTB
+       CALL kbdempty(SB)
        MOVL $0x64, DX
-       MOVB $0xD1, AL
+       MOVB $0xff, AL  /* magic */
        OUTB
+       CALL kbdempty(SB)
 
-       CALL a20wait(SB)
-       MOVL $0x60, DX
-       POPL AX
-       ORB $2, AL
-       OUTB
+       CALL a20check(SB)
 
-       CALL a20wait(SB)
-       MOVL $0x64, DX
-       MOVB $0xAE, AL
-       OUTB
+       /* fail */
+       XORL AX, AX
+       DECL AX
+       RET
 
-TEXT a20wait(SB), $0
-_a20wait:
+TEXT kbdempty(SB), $0
+_kbdwait:
        MOVL $0x64, DX
        INB
        TESTB $1, AL
-       JZ _a20wait2
-       RET
-
-TEXT a20wait2(SB), $0
-_a20wait2:
-       MOVL $0x64, DX
+       JZ _kbdempty
+       MOVL $0x60, DX
        INB
+       JMP _kbdwait
+_kbdempty:
        TESTB $2, AL
-       JNZ _a20wait
+       JNZ _kbdwait
        RET