found it!
the problem was the LBPB() to load byte 0 from the pvd for comparsion.
i loaded it into rBX instead of rBL. found this out after dumping the
buffer and noticed that the contents where the same on t23 and amd
machine.
it all works now. tested on t23, bochs, and amd machine and its
blazing fast :)
updated the tarballs:
/n/sources/contrib/cinap_lenrek/tuttleboot.tgz
http://9hal.ath.cx/usr/cinap_lenrek/tuttleboot.tgz
attached the file and the diff to this mail...
--
cinap
#include "x16.h"
#include "mem.h"
/*
* simple Plan 9 bootblock for ISO9660 that can load a uncompressed a.out kernel
* image. looks for 386/9pcload. if heres no 386 it searches 9pcload in the
root.
* this is a non floppy emulation el torito bootblock!
*
* Diagnostics are:
* ♥ alive!
* ? i/o error, will retry
* ! i/o error, giving up
* F bad a.out magic
* S could not find the file
*
*/
#define DATA32SEL SELECTOR(1, SELGDT, 0)
#define EXEC32SEL SELECTOR(2, SELGDT, 0)
#define EXEC16SEL SELECTOR(3, SELGDT, 0)
#define FARRET \
BYTE $0xCB
#define SWAPB(r) \
BYTE $0x0F; BYTE $(0xC8|r)
#define XORAL(i) \
BYTE $0x34; BYTE $i
/* 2048 byte sectors */
#define SECTSHIFT 0x0B
#define BY2SECT (1<<SECTSHIFT)
/*
* Data is kept on the stack, indexed by rBP.
*/
#define Xdap 0x00 /* disc address packet */
#define Xdrive 0x12 /* boot drive, passed by BIOS or MBR */
#define Xentry 0x14 /* a.out entry, text, data*/
#define Xtextsz 0x18
#define Xdatasz 0x1c
#define Xload 0x20 /* load pointer */
#define Xcount 0x24 /* # of sectors to load */
#define Xbuf 0x28
#define Xtotal (Xbuf+BY2SECT)
/* a.out header offsets */
#define Amagic 0x00
#define Atextsz 0x04
#define Adatasz 0x08
#define Aentry 0x14
#define Aouthdr 0x20
TEXT magic(SB), $0
/* jmp .+ 0x3E (_start0x40); nop; nop; nop; nop; nop; nop */
BYTE $0xEB; BYTE $0x3E; BYTE $0x90; BYTE $0x90
BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90
TEXT bipvd(SB), $0
LONG $0x00000000
TEXT bibootfile(SB), $0
LONG $0x00000000
TEXT bibootfilelen(SB), $0
LONG $0x00000000
TEXT bichecksum(SB), $0
LONG $0x00000000
TEXT bireserved(SB), $0
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
LONG $0x00000000
_start0x40:
CLI
/* be carefull! do not trash rDL until we reached start() */
LWI(magic-Xtotal(SB), rSP)
MW(rSP, rBP)
LWI(start(SB), rAX)
_farret16:
CLR(rCX)
MTSR(rCX, rDS)
MTSR(rCX, rES)
MTSR(rCX, rSS)
PUSHR(rCX)
PUSHR(rAX)
FARRET
TEXT return16(SB), $0
MFCR(rCR0, rAX)
XORAL(1)
MTCR(rAX, rCR0)
LWI(return16ret(SB), rAX)
JMP _farret16
TEXT return16ret(SB), $0
STI
RET
TEXT start(SB), $0
STI
SBPB(rDL, Xdrive)
/* alive! */
LWI(0x0E03, rAX)
BIOSCALL(0x10)
/* A20! we has to enable itt! */
LWI(0x2401, rAX)
BIOSCALL(0x15)
/* find the primary volume descriptor */
CLR(rDX)
LWI(0x0010, rAX)
LWI(0xFF, rCX)
CLR(rBX)
_nextpvd:
CALL16(BIOSread(SB))
LBPB(Xbuf, rBL)
CMPI(1, rBX)
JEQ _pvdfound
CLR(rBX)
ADDI(1, rAX)
ADC(rBX, rDX)
LOOP _nextpvd
CALL16(srcherror(SB))
_pvdfound:
/* load lba and length of root directory */
LBPW((Xbuf+156+2), rAX)
LBPW((Xbuf+156+4), rDX)
LBPW((Xbuf+156+10), rCX)
LBPW((Xbuf+156+12), rBX)
CALL16(walk(SB))
CALL16(srcherror(SB))
TEXT load(SB), $0
CLR(rCX)
SBPWI(0xFFFF, Xcount+0)
SBPWI(0xFFFF, Xcount+2)
CALL16(BIOSread(SB))
_loop:
PUSHA
CALL16(BIOSread(SB))
CALL16(movehigh(SB))
POPA
ADDI(1, rAX)
ADC(rCX, rDX)
JMP _loop
TEXT BIOSread(SB), $0
LWI(5, rDI) /* retry count (ATAPI ZIPs suck) */
_retry:
PUSHA
PUSHS(rDS)
PUSHS(rES)
PUSHS(rFS)
PUSHS(rGS)
SBPW(rAX, Xdap+8)
SBPW(rDX, Xdap+10)
SBPWI(0x0010, Xdap+0) /* reserved + packet size */
SBPWI(0x0001, Xdap+2) /* # of blocks to transfer */
MW(rBP, rSI)
ADDI(Xbuf, rSI)
SBPW(rSI, Xdap+4) /* transfer buffer :offset */
MFSR(rSS, rSI) /* transfer buffer seg: */
SBPW(rSI, Xdap+6)
MW(rBP, rSI) /* Xdap == BP */
LBPB(Xdrive, rDL)
LWI(0x4200, rAX)
BIOSCALL(0x13)
JCC _readok
_reset:
LWI((0x0E00+'?'), rAX)
BIOSCALL(0x10)
/* reset the drive */
LBPB(Xdrive, rDL)
CLR(rAX)
BIOSCALL(0x13)
POPS(rGS)
POPS(rFS)
POPS(rES)
POPS(rDS)
POPA
DEC(rDI)
JNE _retry
TEXT ioerror(SB), $0
LBI('!', rAL)
JMP _error
TEXT fmterror(SB), $0
LBI('F', rAL)
JMP _error
TEXT srcherror(SB), $0
LBI('S', rAL)
JMP _error
_error:
/* print error code */
LBI(0x0E, rAH)
BIOSCALL(0x10)
/* wait for almost any key */
CLR(rAX)
BIOSCALL(0x16)
/* reset */
LWI(0x0472, rBX) /* warm-start code address */
LWI(0x1234, rAX) /* warm-start code */
POKEW /* MOVW AX, ES:[BX] */
FARJUMP16(0xFFFF, 0x0000)
_readok:
POPS(rGS)
POPS(rFS)
POPS(rES)
POPS(rDS)
POPA
RET
TEXT walk(SB), $0
PUSHR(rAX)
PUSHR(rDX)
PUSHR(rCX)
PUSHR(rBX)
CALL16(BIOSread(SB))
MW(rBP, rBX)
ADDI(Xbuf, rBX)
MW(rBX, rDI)
TEXT walknext(SB), $0
MW(rDI, rSI)
MW(rSI, rAX)
SUB(rBX, rAX)
CMPI(BY2SECT, rAX)
JGE _nextsector
CLR(rCX)
LXB(0, xSI, rCL)
ORB(rCL, rCL)
JEQ _nextsector
ADD(rCX, rDI)
PUSHI(walktest(SB))
RET
_nextsector:
POPR(rBX)
POPR(rCX)
POPR(rDX)
POPR(rAX)
OR(rCX, rCX)
JNE _contwalk
OR(rBX, rBX)
JEQ _retwalk
DEC(rBX)
_contwalk:
SUBI(BY2SECT, rCX)
CLR(rDI)
ADDI(1, rAX)
ADC(rDI, rDX)
PUSHI(walk(SB))
_retwalk:
RET
TEXT walktest(SB), $0
PUSHA
LXW(2, xSI, rAX)
LXW(4, xSI, rDX)
LXW(10, xSI, rCX)
LXW(12, xSI, rBX)
PUSHA
CLR(rCX)
LXB(25, xSI, rCL)
ANDI(2, rCX)
POPA
JEQ _notdir
PUSHA
LWI(dirname(SB), rDX)
CALL16(cmpiname(SB))
POPA
JNE _skipdir
ADDI((2*12), rSP)
PUSHI(walk(SB))
RET
_notdir:
PUSHA
LWI(filename(SB), rDX)
CALL16(cmpiname(SB))
POPA
JNE _skipdir
CALL16(load(SB))
/* no return */
_skipdir:
POPA
PUSHI(walknext(SB))
RET
TEXT cmpiname(SB), $0
CLR(rBX)
CLR(rAX)
CLR(rCX)
LXB(32, xSI, rCL)
ADDI(33, rSI)
MW(rDX, rDI)
PUSHR(rDI)
PUSHR(rCX)
_lenloop:
LXB(0, xDI, rAL)
OR(rAX, rAX)
JEQ _endlen
DEC(rCX)
INC(rDI)
JMP _lenloop
_endlen:
OR(rCX, rCX)
POPR(rCX)
POPR(rDI)
JNE _ret
_cmploop:
LXB(0, xSI, rAL)
LXB(0, xDI, rBL)
CMPI('a', rAX)
JLT _nocasea
CMPI('z', rAX)
JGT _nocasea
ADDI(('A' - 'a'), rAX)
_nocasea:
CMPI('a', rBX)
JLT _nocaseb
CMPI('z', rBX)
JGT _nocaseb
ADDI(('A' - 'a'), rBX)
_nocaseb:
CMP(rAX, rBX)
JNE _ret
INC(rSI)
INC(rDI)
LOOP _cmploop
OR(rCX, rCX)
_ret:
RET
TEXT movehigh(SB), $0
CLI
LGDT(tgdtptr(SB))
MFCR(rCR0, rAX)
XORAL(1)
MTCR(rAX, rCR0)
FARJUMP32(EXEC32SEL, movehigh32(SB))
TEXT movehigh32(SB), $0
/* upper bits seem to be fucked */
ANDL $0xFFFF, BP
ANDL $0xFFFF, SP
MOVL $DATA32SEL, AX
MOVW AX, DS
MOVW AX, ES
MOVW AX, SS
MOVL Xload(BP), DI
MOVL Xcount(BP), BX
MOVL BP, SI
ADDL $Xbuf, SI
CMPL BX, $0
JEQ _boot
JGT _movedata
MOVL Amagic(SI), AX
CMPL AX, $0xeb010000
JNE _fmterror
MOVL Aentry(SI), DI
SWAPB(rDI)
ANDL $~0xF0000000, DI
MOVL DI, Xentry(BP)
SUBL $Aouthdr, DI
MOVL Atextsz(SI), BX
SWAPB(rBX)
MOVL BX, Xtextsz(BP)
MOVL Adatasz(SI), CX
SWAPB(rCX)
MOVL CX, Xdatasz(BP)
ADDL CX, BX
ADDL $(BY2SECT-1), BX
SHRL $SECTSHIFT, BX
_movedata:
MOVL $BY2SECT, CX
REP; MOVSB
DECL BX
MOVL DI, Xload(BP)
MOVL BX, Xcount(BP)
_return:
/* Move back to 16 bit code segment from protected mode */
BYTE $0xEA; LONG $return16(SB); WORD $EXEC16SEL
_fmterror:
/* patch the 16 bit caller pc to point to the error function */
MOVL $fmterror(SB), AX
MOVW AX, 0(SP)
JMP _return
_boot:
/*
* we have to move the data segment to a page aligned
* address.
*/
MOVL Xentry(BP), SI
MOVL SI, AX
ADDL Xtextsz(BP), SI
MOVL SI, DI
ADDL $(BY2PG-1), DI
ANDL $(~(BY2PG-1)), DI
MOVL Xdatasz(BP), CX
DECL CX
ADDL CX, SI
ADDL CX, DI
INCL CX
STD
REP; MOVSB
JMP *AX
TEXT tgdt(SB),$0
/* null descriptor */
LONG $0
LONG $0
/* data segment descriptor for 4 gigabytes (PL 0) */
LONG $(0xFFFF)
LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
/* exec segment descriptor for 4 gigabytes (PL 0) */
LONG $(0xFFFF)
LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
/* exec segment descriptor for 4 gigabytes (PL 0) 16-bit */
LONG $(0xFFFF)
LONG $(SEGG|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
TEXT tgdtptr(SB),$0
WORD $(4*8)
LONG $tgdt(SB)
TEXT dirname(SB), $0
BYTE $'3'; BYTE $'8'; BYTE $'6'; BYTE $'\z'
TEXT filename(SB), $0
BYTE $'9'; BYTE $'p'; BYTE $'c'; BYTE $'l'
BYTE $'o'; BYTE $'a'; BYTE $'d'; BYTE $'\z'
/n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:120,133
- bootiso.s:120,135
CLR(rDX)
LWI(0x0010, rAX)
- LWI(100, rCX)
+ LWI(0xFF, rCX)
+ CLR(rBX)
_nextpvd:
CALL16(BIOSread(SB))
- LBPB(Xbuf, rBX)
+ LBPB(Xbuf, rBL)
CMPI(1, rBX)
JEQ _pvdfound
+ CLR(rBX)
ADDI(1, rAX)
- ADC(rCX, rDX)
+ ADC(rBX, rDX)
LOOP _nextpvd
CALL16(srcherror(SB))
/n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:158,167
- bootiso.s:160,174
JMP _loop
TEXT BIOSread(SB), $0
+
LWI(5, rDI) /* retry count (ATAPI ZIPs suck) */
_retry:
PUSHA
+ PUSHS(rDS)
+ PUSHS(rES)
+ PUSHS(rFS)
+ PUSHS(rGS)
SBPW(rAX, Xdap+8)
SBPW(rDX, Xdap+10)
/n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:170,187
- bootiso.s:177,195
MW(rBP, rSI)
ADDI(Xbuf, rSI)
SBPW(rSI, Xdap+4) /* transfer buffer :offset */
- MFSR(rES, rSI) /* transfer buffer seg: */
+ MFSR(rSS, rSI) /* transfer buffer seg: */
SBPW(rSI, Xdap+6)
MW(rBP, rSI) /* Xdap == BP */
LBPB(Xdrive, rDL)
- LBI(0x42, rAH)
+ LWI(0x4200, rAX)
+
BIOSCALL(0x13)
- JCC _popret
+ JCC _readok
_reset:
LWI((0x0E00+'?'), rAX)
- BIOSCALL(0x10)
+ BIOSCALL(0x10)
/* reset the drive */
LBPB(Xdrive, rDL)
/n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:188,194
- bootiso.s:196,207
CLR(rAX)
BIOSCALL(0x13)
+ POPS(rGS)
+ POPS(rFS)
+ POPS(rES)
+ POPS(rDS)
POPA
+
DEC(rDI)
JNE _retry
/n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:219,226
- bootiso.s:232,244
POKEW /* MOVW AX, ES:[BX] */
FARJUMP16(0xFFFF, 0x0000)
- _popret:
+ _readok:
+ POPS(rGS)
+ POPS(rFS)
+ POPS(rES)
+ POPS(rDS)
POPA
+
RET
TEXT walk(SB), $0