/*
* boot first processor
*/
TEXT start(SB),$0
/* clear bss */
CALL main(SB)
/* never returns */
/*
* trap vector, each instruction is 4 bytes long
*/
TEXT traptab(SB),$0
CALL noerrcode(SB) /* divide */
CALL noerrcode(SB) /* debug */
CALL noerrcode(SB) /* non maskable interrupt */
CALL noerrcode(SB) /* breakpoint */
CALL noerrcode(SB) /* overflow */
CALL noerrcode(SB) /* bounds check */
CALL noerrcode(SB) /* invalid opcode */
CALL noerrcode(SB) /* coprocessor not available */
CALL errcode(SB) /* double fault */
CALL noerrcode(SB) /* coprocessor segment overrun */
CALL errcode(SB) /* invalid tss */
CALL errcode(SB) /* segment not present */
CALL errcode(SB) /* stack exception */
CALL errcode(SB) /* general protection exception */
CALL errcode(SB) /* page fault */
CALL noerrcode(SB) /* coprocessor error */
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
CALL noerrcode(SB)
TEXT noerrcode(SB),$0
PUSHL EAX
MOVL 4(ESP),EAX
/* JMP george /**/
TEXT errcode(SB),$0
XCHGL (ESP),EAX
/* fall through */
TEXT saveregs(SB),$0
george:
PUSHL EBX
MOVL $noerrcode(SB),EBX /* calculate trap number */
SUBL EAX,EBX /* ... */
SHRL $1,EBX /* ... */
PUSHL ECX
PUSHL EDX
PUSHL EBP
PUSHL ESI
PUSHL EDI
PUSHL EBX /* save trap number */
CALL trap(SB)
ADDL $4,ESP /* drop trap number */
POPL EDI
POPL ESI
POPL EBP
POPL EDX
POPL ECX
POPL EBX
POPL EAX
ADDL $4,ESP /* drop error code */
IRET
TEXT trap(SB),$0
RET
TEXT main(SB),$0
RET