plan 9 kernel history: overview | file list | diff list

1998/0430/pc/l.s (diff list | history)

1991/0614/sys/src/9/pc/l.s:1,61991/0619/sys/src/9/pc/l.s:1,6 (short | long)
1991/0614    
 
/* 
 * Boot first processor 
1991/0619    
 *  boot first processor 
1991/0614    
 */ 
TEXT	start(SB),$0 
 
1991/0614/sys/src/9/pc/l.s:9,141991/0619/sys/src/9/pc/l.s:9,17
1991/0614    
	/* never returns */ 
 
 
1991/0619    
/* 
 *  trap vector, each instruction is 4 bytes long 
 */ 
1991/0614    
TEXT	traptab(SB),$0 
 
	CALL	noerrcode(SB)	/* divide */ 
1991/0614/sys/src/9/pc/l.s:270,2921991/0619/sys/src/9/pc/l.s:273,317
1991/0614    
	CALL	noerrcode(SB) 
 
TEXT	noerrcode(SB),$0 
	PUSH	EAX 
	/* drop through */ 
1991/0619    
 
	PUSHL	EAX 
	MOVL	4(ESP),EAX 
/*	JMP	george /**/ 
 
1991/0614    
TEXT	errcode(SB),$0 
	PUSH	EAX 
	PUSH	EBX 
	PUSH	ECX 
	PUSH	EDX 
	PUSH	EBP 
	PUSH	ESI 
	PUSH	EDI 
1991/0619    
 
	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 */ 
1991/0614    
	CALL	trap(SB) 
	POP	EDI 
	POP	ESI 
	POP	EBP 
	POP	EDX 
	POP	ECX 
	POP	EBX 
	POP	EAX 
	ADD	$8,ESP	/* jump over error code + return addr */ 
1991/0619    
	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 */ 
1991/0614    
	IRET 
1991/0619    
 
TEXT	trap(SB),$0 
 
	RET 
 
TEXT	main(SB),$0 
 
	RET 
1991/0619/sys/src/9/pc/l.s:10,341991/0620/sys/src/9/pc/l.s:10,76 (short | long)
1991/0614    
 
 
1991/0619    
/* 
 *  trap vector, each instruction is 4 bytes long 
1991/0620    
 *  standard traps 
1991/0619    
 */ 
1991/0614    
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 */ 
1991/0620    
divtrap: 
	PUSHL	$0 
	PUSHL	$0 
	JMP	alltrap 
debtrap: 
	PUSHL	$0 
	PUSHL	$1 
	JMP	alltrap 
nmitrap: 
	PUSHL	$0 
	PUSHL	$2 
	JMP	alltrap 
bptrap: 
	PUSHL	$0 
	PUSHL	$3 
	JMP	alltrap 
oftrap: 
	PUSHL	$0 
	PUSHL	$4 
	JMP	alltrap 
boundtrap: 
	PUSHL	$0 
	PUSHL	$5 
	JMP	alltrap 
invtrap: 
	PUSHL	$0 
	PUSHL	$6 
	JMP	alltrap 
nocotrap: 
	PUSHL	$0 
	PUSHL	$7 
	JMP	alltrap 
dfault: 
	PUSHL	$8 
	JMP	alltrap 
csotrap: 
	PUSHL	$0 
	PUSHL	$9 
	JMP	alltrap 
tsstrap: 
	PUSHL	$0 
	PUSHL	$10 
	JMP	alltrap 
segtrap: 
	PUSHL	$11 
	JMP	alltrap 
stacktrap: 
	PUSHL	$12 
	JMP	alltrap 
prottrap: 
	PUSHL	$13 
	JMP	alltrap 
pagefault: 
	PUSHL	$14 
	JMP	alltrap 
cetrap: 
	PUSHL	$0 
	PUSHL	$15 
	JMP	alltrap 
1991/0614    
	CALL	noerrcode(SB)	/* coprocessor error */ 
	CALL	noerrcode(SB) 
	CALL	noerrcode(SB) 
1991/0620/sys/src/9/pc/l.s:1,61991/0622/sys/src/9/pc/l.s:1,6 (short | long)
1991/0614    
 
/* 
1991/0619    
 *  boot first processor 
1991/0622    
 *  boot processor 
1991/0614    
 */ 
TEXT	start(SB),$0 
 
1991/0620/sys/src/9/pc/l.s:8,3581991/0622/sys/src/9/pc/l.s:8,119
1991/0614    
	CALL	main(SB) 
	/* never returns */ 
 
                 
1991/0619    
/* 
1991/0620    
 *  standard traps 
1991/0619    
 */ 
1991/0620    
divtrap: 
1991/0622    
 
TEXT	trap0(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$0 
	JMP	alltrap 
debtrap: 
1991/0622    
 
TEXT	trap1(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$1 
	JMP	alltrap 
nmitrap: 
1991/0622    
 
TEXT	trap2(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$2 
	JMP	alltrap 
bptrap: 
1991/0622    
 
TEXT	trap3(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$3 
	JMP	alltrap 
oftrap: 
1991/0622    
 
TEXT	trap4(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$4 
	JMP	alltrap 
boundtrap: 
1991/0622    
 
TEXT	trap5(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$5 
	JMP	alltrap 
invtrap: 
1991/0622    
 
TEXT	trap6(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$6 
	JMP	alltrap 
nocotrap: 
1991/0622    
 
TEXT	trap7(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$7 
	JMP	alltrap 
dfault: 
1991/0622    
 
TEXT	trap8(SB),$0 
 
1991/0620    
	PUSHL	$8 
	JMP	alltrap 
csotrap: 
1991/0622    
 
TEXT	trap9(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$9 
	JMP	alltrap 
tsstrap: 
1991/0622    
 
TEXT	trap10(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$10 
	JMP	alltrap 
segtrap: 
1991/0622    
 
TEXT	trap11(SB),$0 
 
1991/0620    
	PUSHL	$11 
	JMP	alltrap 
stacktrap: 
1991/0622    
 
TEXT	trap12(SB),$0 
 
1991/0620    
	PUSHL	$12 
	JMP	alltrap 
prottrap: 
1991/0622    
 
TEXT	trap13(SB),$0 
 
1991/0620    
	PUSHL	$13 
	JMP	alltrap 
pagefault: 
1991/0622    
 
TEXT	trap14(SB),$0 
 
1991/0620    
	PUSHL	$14 
	JMP	alltrap 
cetrap: 
1991/0622    
 
TEXT	trap15(SB),$0 
 
1991/0620    
	PUSHL	$0 
	PUSHL	$15 
	JMP	alltrap 
1991/0614    
	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 
1991/0622    
TEXT	invtrap(SB),$0 
1991/0619    
 
	PUSHL	EAX 
	MOVL	4(ESP),EAX 
/*	JMP	george /**/ 
1991/0622    
	PUSHL	$0 
	PUSHL	$16 
	JMP	alltrap 
1991/0619    
 
1991/0614    
TEXT	errcode(SB),$0 
1991/0619    
                 
	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 */ 
1991/0622    
alltrap: 
	PUSHAL 
1991/0614    
	CALL	trap(SB) 
1991/0619    
	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 */ 
1991/0614    
	IRET 
1991/0619    
                 
TEXT	trap(SB),$0 
                 
	RET 
1991/0622    
	POPAL 
	IRETL 
1991/0619    
 
TEXT	main(SB),$0 
 
1991/0622/sys/src/9/pc/l.s:9,621991/0623/sys/src/9/pc/l.s:9,61 (short | long)
1991/0614    
	/* never returns */ 
 
1991/0619    
/* 
1991/0620    
 *  standard traps 
1991/0623    
 *  first 16 ``standard'' traps 
1991/0619    
 */ 
1991/0622    
                 
TEXT	trap0(SB),$0 
 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$0 
	PUSHL	$0 
	JMP	alltrap 
1991/0622    
 
TEXT	trap1(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$1 
	JMP	alltrap 
1991/0622    
 
TEXT	trap2(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$2 
	JMP	alltrap 
1991/0622    
 
TEXT	trap3(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$3 
	JMP	alltrap 
1991/0622    
 
TEXT	trap4(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$4 
	JMP	alltrap 
1991/0622    
 
TEXT	trap5(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$5 
	JMP	alltrap 
1991/0622    
 
TEXT	trap6(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$6 
	JMP	alltrap 
1991/0622    
 
TEXT	trap7(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$7 
	JMP	alltrap 
1991/0622    
 
1991/0622/sys/src/9/pc/l.s:67,791991/0623/sys/src/9/pc/l.s:66,78
1991/0622    
 
TEXT	trap9(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$9 
	JMP	alltrap 
1991/0622    
 
TEXT	trap10(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$10 
	JMP	alltrap 
1991/0622    
 
1991/0622/sys/src/9/pc/l.s:99,1201991/0623/sys/src/9/pc/l.s:98,134
1991/0622    
 
TEXT	trap15(SB),$0 
 
1991/0620    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$15 
	JMP	alltrap 
1991/0614    
 
1991/0623    
/* 
 *  invalid trap 
 */ 
1991/0622    
TEXT	invtrap(SB),$0 
1991/0619    
 
1991/0622    
	PUSHL	$0 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0622    
	PUSHL	$16 
	JMP	alltrap 
1991/0619    
 
1991/0623    
/* 
 *  common trap code 
 */ 
1991/0622    
alltrap: 
1991/0623    
 
1991/0622    
	PUSHAL 
1991/0614    
	CALL	trap(SB) 
1991/0622    
	POPAL 
1991/0623    
	ADDL	$#8,SP		/* pop the trap and error codes */ 
1991/0622    
	IRETL 
1991/0619    
 
1991/0623    
/* 
 *  stubs 
 */ 
1991/0619    
TEXT	main(SB),$0 
1991/0623    
 
	RET 
 
TEXT	trap(SB),$0 
1991/0619    
 
	RET 
1991/0623/sys/src/9/pc/l.s:1,101991/0625/sys/src/9/pc/l.s:1,26 (short | long)
1991/0625    
#include "mem.h" 
1991/0614    
 
1991/0625    
GLOBL	gdtptr(SB),$6 
 
	DATA	gdtptr+0(SB)/2, $(6*8) 
	DATA	gdtptr+2(SB)/4, $gdt(SB) 
 
1991/0614    
/* 
1991/0622    
 *  boot processor 
1991/0614    
 */ 
TEXT	start(SB),$0 
 
	/* clear bss */ 
1991/0625    
	CLI			/* disable interrupts */ 
	MOVW	$NULLSEL,IDTR	/* force shutdown on error */ 
 
	/* point data segment at low memory */ 
	XORL	AX,AX 
	MOVW	AX,DS 
 
	/* load gdt address (valid after paging) */ 
	LEAL	gdtptr(SB),AX 
	MOVL	-KZERO(AX),GDTR 
 
1991/0614    
	CALL	main(SB) 
	/* never returns */ 
 
1991/0623/sys/src/9/pc/l.s:116,1341991/0625/sys/src/9/pc/l.s:132,143
1991/0623    
 */ 
1991/0622    
alltrap: 
1991/0623    
 
1991/0625    
	PUSHL	DS 
1991/0622    
	PUSHAL 
1991/0625    
	MOVL	$KDSEL, AX 
	MOVW	AX, DS 
1991/0614    
	CALL	trap(SB) 
1991/0622    
	POPAL 
1991/0623    
	ADDL	$#8,SP		/* pop the trap and error codes */ 
1991/0625    
	POPL	DS 
	ADDL	$8,SP		/* pop the trap and error codes */ 
1991/0622    
	IRETL 
1991/0619    
                 
1991/0623    
/* 
 *  stubs 
 */ 
1991/0619    
TEXT	main(SB),$0 
1991/0623    
                 
	RET 
                 
TEXT	trap(SB),$0 
1991/0619    
                 
	RET 
1991/0625/sys/src/9/pc/l.s:1,251991/0626/sys/src/9/pc/l.s:1,39 (short | long)
1991/0625    
#include "mem.h" 
1991/0614    
 
1991/0626    
/* 
 *  pointer to initial gdt (must be in first 64K of program) 
 */ 
1991/0625    
GLOBL	gdtptr(SB),$6 
 
	DATA	gdtptr+0(SB)/2, $(6*8) 
1991/0626    
	DATA	gdtptr+0(SB)/2, $(5*8) 
1991/0625    
	DATA	gdtptr+2(SB)/4, $gdt(SB) 
 
1991/0614    
/* 
1991/0626    
 *  pointer to idt (must be in first 64K of program) 
 */ 
GLOBL	idtptr(SB),$6 
 
	DATA	idtptr+0(SB)/2, $(6*8) 
	DATA	idtptr+2(SB)/4, $idt(SB) 
 
/* 
1991/0622    
 *  boot processor 
1991/0614    
 */ 
TEXT	start(SB),$0 
 
1991/0625    
	CLI			/* disable interrupts */ 
	MOVW	$NULLSEL,IDTR	/* force shutdown on error */ 
 
1991/0626    
	/* point CPU at the interrupt/trap table */ 
	LEAL	idtptr(SB),AX 
/*	MOVL	(AX),IDTR /**/ 
 
1991/0625    
	/* point data segment at low memory */ 
	XORL	AX,AX 
	MOVW	AX,DS 
1991/0626    
/*	MOVW	AX,DS /**/ 
1991/0625    
 
	/* load gdt address (valid after paging) */ 
1991/0626    
	/* point CPU at the interrupt/trap table */ 
1991/0625    
	LEAL	gdtptr(SB),AX 
	MOVL	-KZERO(AX),GDTR 
1991/0626    
/*	MOVL	(AX),GDTR /**/ 
1991/0625    
 
1991/0614    
	CALL	main(SB) 
	/* never returns */ 
1991/0625/sys/src/9/pc/l.s:132,1431991/0626/sys/src/9/pc/l.s:146,157
1991/0623    
 */ 
1991/0622    
alltrap: 
1991/0623    
 
1991/0625    
	PUSHL	DS 
1991/0626    
/*	PUSHL	DS	/**/ 
1991/0622    
	PUSHAL 
1991/0625    
	MOVL	$KDSEL, AX 
	MOVW	AX, DS 
1991/0626    
/*	MOVW	AX, DS /**/ 
1991/0614    
	CALL	trap(SB) 
1991/0622    
	POPAL 
1991/0625    
	POPL	DS 
1991/0626    
/*	POPL	DS	/**/ 
1991/0625    
	ADDL	$8,SP		/* pop the trap and error codes */ 
1991/0622    
	IRETL 
1991/0626/sys/src/9/pc/l.s:1,411991/0627/sys/src/9/pc/l.s:1,97 (short | long)
1991/0625    
#include "mem.h" 
1991/0614    
 
1991/0627    
TEXT	start(SB),$0 
 
	JMP	start16 
 
1991/0626    
/* 
 *  pointer to initial gdt (must be in first 64K of program) 
1991/0627    
 *  gdt to get us to 32-bit/segmented/unpaged mode 
1991/0626    
 */ 
1991/0625    
GLOBL	gdtptr(SB),$6 
1991/0627    
TEXT	tgdt(SB),$0 
1991/0625    
 
1991/0626    
	DATA	gdtptr+0(SB)/2, $(5*8) 
1991/0625    
	DATA	gdtptr+2(SB)/4, $gdt(SB) 
1991/0627    
	/* null descriptor */ 
	LONG	$0 
	LONG	$0 
1991/0625    
 
1991/0627    
	/* data segment descriptor for 4 gigabytes (PL 0) */ 
	LONG	SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW 
	LONG	0xFFFF 
 
	/* exec segment descriptor for 4 gigabytes (PL 0) */ 
	LONG	SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR 
	LONG	0xFFFF 
 
1991/0614    
/* 
1991/0626    
 *  pointer to idt (must be in first 64K of program) 
1991/0627    
 *  pointer to initial gdt 
1991/0626    
 */ 
GLOBL	idtptr(SB),$6 
1991/0627    
TEXT	tgdtptr(SB),$0 
1991/0626    
 
	DATA	idtptr+0(SB)/2, $(6*8) 
	DATA	idtptr+2(SB)/4, $idt(SB) 
1991/0627    
	WORD	$(3*8) 
	LONG	$tgdt(SB) 
1991/0626    
 
/* 
1991/0622    
 *  boot processor 
1991/0627    
 *  come here in (16bit) real-address mode 
1991/0614    
 */ 
TEXT	start(SB),$0 
                 
1991/0627    
start16: 
1991/0625    
	CLI			/* disable interrupts */ 
 
1991/0626    
	/* point CPU at the interrupt/trap table */ 
	LEAL	idtptr(SB),AX 
/*	MOVL	(AX),IDTR /**/ 
                 
1991/0625    
	/* point data segment at low memory */ 
	XORL	AX,AX 
1991/0626    
/*	MOVW	AX,DS /**/ 
1991/0627    
	MOVW	AX,DS 
1991/0625    
 
1991/0626    
	/* point CPU at the interrupt/trap table */ 
1991/0625    
	LEAL	gdtptr(SB),AX 
1991/0626    
/*	MOVL	(AX),GDTR /**/ 
1991/0627    
	/* point CPU at the interrupt descriptor table */ 
	MOVL	tgdt(SB),IDTR 
1991/0625    
 
1991/0614    
	CALL	main(SB) 
1991/0627    
	/* point CPU at the global descriptor table */ 
	MOVL	gdtptr(SB),GDTR 
 
	/* switch to protected mode */ 
	MOVL	CR0,AX 
	ORL	$1,AX 
	MOVL	AX,CR0 
 
	/* clear prefetch buffer */ 
	JMP	flush 
 
/* 
 *  come here in USE16 protected mode 
 */ 
flush: 
	/* map data and stack address to physical memory */ 
	MOVW	$SELECTOR(1, SELGDT, 0),AX 
	MOVW	AX,DS 
	MOVW	AX,ES 
	MOVW	AX,SS 
 
	/* switch to 32 bit code */ 
	JMPFAR	SELECTOR(2, SELGDT, 0):start32 
 
/* 
 *  come here in USE32 protected mode 
 */ 
TEXT	start32(SB),$0 
 
	/* clear bss (should use REP) */ 
	MOVL	$edata(SB),SI 
	MOVL	$edata+4(SB),DI 
	MOVL	$end(SB),CX 
	SUBL	DI,CX 
	SHRL	$2,CX 
	XORL	AX,AX 
	MOVL	AX,edata(SB) 
	CLD 
	REP 
	MOVSL	(SI),(DI) 
 
	/* set up stack */ 
	MOVL	$mach0(SB),AX 
	MOVL	A0, m(SB) 
	MOVL	$0, 0(A0) 
	MOVL	A0, A7 
	ADDL	$(MACHSIZE-4), A7	/* start stack under machine struct */ 
	MOVL	$0, u(SB) 
 
	CALL	main(SB),$0 
1991/0614    
	/* never returns */ 
 
1991/0619    
/* 
1991/0627/sys/src/9/pc/l.s:1,71991/0628/sys/src/9/pc/l.s:1,6 (short | long)
1991/0625    
#include "mem.h" 
1991/0614    
 
1991/0627    
TEXT	start(SB),$0 
                 
	JMP	start16 
 
1991/0626    
/* 
1991/0627/sys/src/9/pc/l.s:14,251991/0628/sys/src/9/pc/l.s:13,24
1991/0627    
	LONG	$0 
1991/0625    
 
1991/0627    
	/* data segment descriptor for 4 gigabytes (PL 0) */ 
	LONG	SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW 
	LONG	0xFFFF 
1991/0628    
	LONG	$(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) 
	LONG	$(0xFFFF) 
1991/0627    
 
	/* exec segment descriptor for 4 gigabytes (PL 0) */ 
	LONG	SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR 
	LONG	0xFFFF 
1991/0628    
	LONG	$(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) 
	LONG	$(0xFFFF) 
1991/0627    
 
1991/0614    
/* 
1991/0627    
 *  pointer to initial gdt 
1991/0627/sys/src/9/pc/l.s:27,331991/0628/sys/src/9/pc/l.s:26,32
1991/0627    
TEXT	tgdtptr(SB),$0 
1991/0626    
 
1991/0627    
	WORD	$(3*8) 
	LONG	$tgdt(SB) 
1991/0628    
	LONG	tgdt(SB) 
1991/0626    
 
/* 
1991/0627    
 *  come here in (16bit) real-address mode 
1991/0627/sys/src/9/pc/l.s:64,701991/0628/sys/src/9/pc/l.s:63,69
1991/0627    
	MOVW	AX,SS 
 
	/* switch to 32 bit code */ 
	JMPFAR	SELECTOR(2, SELGDT, 0):start32 
1991/0628    
/*	JMPFAR	SELECTOR(2, SELGDT, 0):start32 /**/ 
1991/0627    
 
/* 
 *  come here in USE32 protected mode 
1991/0627/sys/src/9/pc/l.s:85,941991/0628/sys/src/9/pc/l.s:84,93
1991/0627    
 
	/* set up stack */ 
	MOVL	$mach0(SB),AX 
	MOVL	A0, m(SB) 
	MOVL	$0, 0(A0) 
	MOVL	A0, A7 
	ADDL	$(MACHSIZE-4), A7	/* start stack under machine struct */ 
1991/0628    
	MOVL	AX, m(SB) 
	MOVL	$0, 0(AX) 
	MOVL	AX, SP 
	ADDL	$(MACHSIZE-4), AX	/* start stack under machine struct */ 
1991/0627    
	MOVL	$0, u(SB) 
 
	CALL	main(SB),$0 
1991/0628/sys/src/9/pc/l.s:1,2121991/0629/sys/src/9/pc/l.s:1,177 (short | long)
1991/0625    
#include "mem.h" 
1991/0614    
 
1991/0627    
TEXT	start(SB),$0 
	JMP	start16 
                 
1991/0626    
/* 
1991/0627    
 *  gdt to get us to 32-bit/segmented/unpaged mode 
1991/0626    
 */ 
1991/0627    
TEXT	tgdt(SB),$0 
1991/0629    
GLOBL	tgdt(SB),$(6*4) 
1991/0625    
 
1991/0627    
	/* null descriptor */ 
	LONG	$0 
	LONG	$0 
1991/0629    
	DATA tgdt+0(SB)/4, $0 
	DATA tgdt+4(SB)/4, $0 
1991/0625    
 
1991/0627    
	/* data segment descriptor for 4 gigabytes (PL 0) */ 
1991/0628    
	LONG	$(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) 
	LONG	$(0xFFFF) 
1991/0629    
	DATA tgdt+8(SB)/4, $(0xFFFF) 
	DATA tgdt+12(SB)/4, $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) 
1991/0627    
 
	/* exec segment descriptor for 4 gigabytes (PL 0) */ 
1991/0628    
	LONG	$(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) 
	LONG	$(0xFFFF) 
1991/0629    
	DATA tgdt+16(SB)/4, $(0xFFFF) 
	DATA tgdt+20(SB)/4, $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) 
1991/0627    
 
1991/0614    
/* 
1991/0627    
 *  pointer to initial gdt 
1991/0626    
 */ 
1991/0627    
TEXT	tgdtptr(SB),$0 
1991/0629    
GLOBL	tgdtptr(SB),$6 
1991/0626    
 
1991/0627    
	WORD	$(3*8) 
1991/0628    
	LONG	tgdt(SB) 
1991/0629    
	DATA tgdtptr+0(SB)/2, $(3*8) 
	DATA tgdtptr+2(SB)/4, $tgdt(SB) 
1991/0626    
 
1991/0629    
TEXT	start(SB),$0 
 
1991/0626    
/* 
1991/0627    
 *  come here in (16bit) real-address mode 
1991/0629    
 *	about to walk all over ms/dos - turn off interrupts 
1991/0614    
 */ 
1991/0627    
start16: 
1991/0625    
	CLI			/* disable interrupts */ 
1991/0629    
	CLI 
1991/0625    
 
	/* point data segment at low memory */ 
	XORL	AX,AX 
1991/0627    
	MOVW	AX,DS 
1991/0629    
/* 
 *	move the first 1k bytes down to low core and jump to them 
 *	- looks wierd because it is being assembled by a 32 bit 
 *	  assembler for a 16 bit world 
 */ 
	MOVL	$0,BX 
	INCL	BX 
	SHLL	$(10-1),BX 
	MOVL	BX,CX 
	MOVL	$0,SI 
	MOVW	SI,ES 
	MOVL	SI,DI 
	CLD 
	REP 
	MOVSL 
/*	JMPFAR*	00:$lowcore(SB) /**/ 
	 BYTE	$0xEA 
	 WORD	$lowcore(SB) 
	 WORD	$0 
1991/0625    
 
1991/0627    
	/* point CPU at the interrupt descriptor table */ 
	MOVL	tgdt(SB),IDTR 
1991/0629    
TEXT	lowcore(SB),$0 
1991/0625    
 
1991/0627    
	/* point CPU at the global descriptor table */ 
	MOVL	gdtptr(SB),GDTR 
1991/0629    
/* 
 *	move the next 63K down 
 */ 
	MOVL	$0,CX 
	INCL	CX 
	SHLL	$(15-1),CX 
	SUBL	BX,CX 
	SHLL	$1,BX 
	MOVL	BX,SI 
	MOVL	BX,DI 
	REP 
	MOVSL 
1991/0627    
 
	/* switch to protected mode */ 
1991/0629    
/* 
 *	now that we're in low core, update the DS 
 */ 
 
	MOVL	$0,BX 
	MOVW	BX,DS 
 
/* 
 * 	goto protected mode 
 */ 
/*	MOVL	tgdtptr(SB),GDTR /**/ 
	 BYTE	$0x0f 
	 BYTE	$0x01 
	 BYTE	$0x16 
	 WORD	$tgdtptr(SB) 
1991/0627    
	MOVL	CR0,AX 
	ORL	$1,AX 
	MOVL	AX,CR0 
 
	/* clear prefetch buffer */ 
	JMP	flush 
                 
/* 
 *  come here in USE16 protected mode 
1991/0629    
 *	clear prefetch queue (wierd code to avoid optimizations) 
1991/0627    
 */ 
1991/0629    
	CLC 
	JCC	flush 
	MOVL	AX,AX 
1991/0627    
flush: 
	/* map data and stack address to physical memory */ 
	MOVW	$SELECTOR(1, SELGDT, 0),AX 
1991/0629    
 
/* 
 *	set all segs 
 */ 
/*	MOVW	$SELECTOR(1, SELGDT, 0),AX	/**/ 
	 BYTE	$0xc7 
	 BYTE	$0xc0 
	 WORD	$SELECTOR(1, SELGDT, 0) 
1991/0627    
	MOVW	AX,DS 
	MOVW	AX,ES 
	MOVW	AX,SS 
1991/0629    
	MOVW	AX,ES 
1991/0627    
 
	/* switch to 32 bit code */ 
1991/0628    
/*	JMPFAR	SELECTOR(2, SELGDT, 0):start32 /**/ 
1991/0629    
/*	JMPFAR*	SELECTOR(2, SELGDT, 0):$protected(SB) /**/ 
	 BYTE	$0xEA 
	 WORD	$mode32bit(SB) 
	 WORD	$SELECTOR(2, SELGDT, 0) 
1991/0627    
 
1991/0629    
TEXT	mode32bit(SB),$0 
 
1991/0627    
/* 
 *  come here in USE32 protected mode 
1991/0629    
 *	print a blue 3 on a red background 
1991/0627    
 */ 
TEXT	start32(SB),$0 
1991/0629    
	MOVL	$0xb8100,BX 
	MOVB	$0x33,AL 
	MOVB	AL,(BX) 
	INCW	BX 
	MOVB	$0x43,AL 
	MOVB	AL,(BX) 
1991/0627    
 
	/* clear bss (should use REP) */ 
	MOVL	$edata(SB),SI 
	MOVL	$edata+4(SB),DI 
	MOVL	$end(SB),CX 
1991/0629    
	/* 
	 * Clear BSS 
	 */ 
	LEAL	edata(SB),SI 
	LEAL	edata+4(SB),DI 
	MOVL	$0,AX 
	MOVL	AX,(SI) 
	LEAL	end(SB),CX 
1991/0627    
	SUBL	DI,CX 
	SHRL	$2,CX 
	XORL	AX,AX 
	MOVL	AX,edata(SB) 
	CLD 
	REP 
	MOVSL	(SI),(DI) 
1991/0629    
	MOVSL 
1991/0627    
 
	/* set up stack */ 
	MOVL	$mach0(SB),AX 
1991/0628    
	MOVL	AX, m(SB) 
	MOVL	$0, 0(AX) 
	MOVL	AX, SP 
	ADDL	$(MACHSIZE-4), AX	/* start stack under machine struct */ 
1991/0627    
	MOVL	$0, u(SB) 
 
	CALL	main(SB),$0 
1991/0614    
	/* never returns */ 
                 
1991/0619    
/* 
1991/0623    
 *  first 16 ``standard'' traps 
1991/0629    
 *	print a blue 4 on a red background 
1991/0619    
 */ 
1991/0622    
TEXT	trap0(SB),$0 
1991/0629    
	MOVL	$0xb8100,BX 
	MOVB	$0x34,AL 
	MOVB	AL,(BX) 
	INCW	BX 
	MOVB	$0x43,AL 
	MOVB	AL,(BX) 
here: 
	JMP	here 
1991/0622    
 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$0 
	JMP	alltrap 
1991/0622    
 
TEXT	trap1(SB),$0 
1991/0629    
	/* 
	 *  stack and mach 
	 */ 
	MOVL	$mach0(SB),SP 
	MOVL	SP,m(SB) 
	MOVL	$0,0(SP) 
	ADDL	$(MACHSIZE-4),SP	/* start stack under machine struct */ 
	MOVL	$0, u(SB) 
1991/0622    
 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$1 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap2(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$2 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap3(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$3 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap4(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$4 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap5(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$5 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap6(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$6 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap7(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$7 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap8(SB),$0 
                 
1991/0620    
	PUSHL	$8 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap9(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$9 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap10(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$10 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap11(SB),$0 
                 
1991/0620    
	PUSHL	$11 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap12(SB),$0 
                 
1991/0620    
	PUSHL	$12 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap13(SB),$0 
                 
1991/0620    
	PUSHL	$13 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap14(SB),$0 
                 
1991/0620    
	PUSHL	$14 
	JMP	alltrap 
1991/0622    
                 
TEXT	trap15(SB),$0 
                 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0620    
	PUSHL	$15 
	JMP	alltrap 
1991/0614    
                 
1991/0629    
	CALL	main(SB) 
1991/0623    
/* 
 *  invalid trap 
1991/0629    
 *	print a blue 4 on a red background 
1991/0623    
 */ 
1991/0622    
TEXT	invtrap(SB),$0 
1991/0629    
	MOVL	$0xb8100,BX 
	MOVB	$0x34,AL 
	MOVB	AL,(BX) 
	INCW	BX 
	MOVB	$0x43,AL 
	MOVB	AL,(BX) 
1991/0619    
 
1991/0623    
	PUSHL	$0	/* put on an error code */ 
1991/0622    
	PUSHL	$16 
	JMP	alltrap 
1991/0629    
loop: 
	JMP	loop 
1991/0619    
 
1991/0623    
/* 
 *  common trap code 
 */ 
1991/0622    
alltrap: 
1991/0623    
                 
1991/0626    
/*	PUSHL	DS	/**/ 
1991/0622    
	PUSHAL 
1991/0625    
	MOVL	$KDSEL, AX 
1991/0626    
/*	MOVW	AX, DS /**/ 
1991/0614    
	CALL	trap(SB) 
1991/0622    
	POPAL 
1991/0626    
/*	POPL	DS	/**/ 
1991/0625    
	ADDL	$8,SP		/* pop the trap and error codes */ 
1991/0622    
	IRETL 
1991/0629    
GLOBL	mach0+0(SB), $MACHSIZE 
GLOBL	u(SB), $4 
GLOBL	m(SB), $4 
1991/0629/sys/src/9/pc/l.s:1,351991/0702/sys/src/9/pc/l.s:1,10 (short | long)
1991/0625    
#include "mem.h" 
1991/0614    
 
1991/0626    
/* 
1991/0627    
 *  gdt to get us to 32-bit/segmented/unpaged mode 
1991/0626    
 */ 
1991/0629    
GLOBL	tgdt(SB),$(6*4) 
1991/0625    
                 
1991/0627    
	/* null descriptor */ 
1991/0629    
	DATA tgdt+0(SB)/4, $0 
	DATA tgdt+4(SB)/4, $0 
1991/0625    
                 
1991/0627    
	/* data segment descriptor for 4 gigabytes (PL 0) */ 
1991/0629    
	DATA tgdt+8(SB)/4, $(0xFFFF) 
	DATA tgdt+12(SB)/4, $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) 
1991/0627    
                 
	/* exec segment descriptor for 4 gigabytes (PL 0) */ 
1991/0629    
	DATA tgdt+16(SB)/4, $(0xFFFF) 
	DATA tgdt+20(SB)/4, $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) 
1991/0627    
                 
1991/0614    
/* 
1991/0627    
 *  pointer to initial gdt 
1991/0626    
 */ 
1991/0629    
GLOBL	tgdtptr(SB),$6 
1991/0626    
                 
1991/0629    
	DATA tgdtptr+0(SB)/2, $(3*8) 
	DATA tgdtptr+2(SB)/4, $tgdt(SB) 
1991/0626    
                 
1991/0629    
TEXT	start(SB),$0 
                 
1991/0626    
/* 
1991/0629    
 *	about to walk all over ms/dos - turn off interrupts 
1991/0614    
 */ 
1991/0702    
TEXT	origin(SB),$0 
 
1991/0629    
	CLI 
1991/0625    
 
1991/0629    
/* 
1991/0629/sys/src/9/pc/l.s:47,531991/0702/sys/src/9/pc/l.s:22,28
1991/0629    
	CLD 
	REP 
	MOVSL 
/*	JMPFAR*	00:$lowcore(SB) /**/ 
1991/0702    
/*	JMPFAR	00:$lowcore(SB) /**/ 
1991/0629    
	 BYTE	$0xEA 
	 WORD	$lowcore(SB) 
	 WORD	$0 
1991/0629/sys/src/9/pc/l.s:112,1271991/0702/sys/src/9/pc/l.s:87,92
1991/0627    
 
1991/0629    
TEXT	mode32bit(SB),$0 
 
1991/0627    
/* 
1991/0629    
 *	print a blue 3 on a red background 
1991/0627    
 */ 
1991/0629    
	MOVL	$0xb8100,BX 
	MOVB	$0x33,AL 
	MOVB	AL,(BX) 
	INCW	BX 
	MOVB	$0x43,AL 
	MOVB	AL,(BX) 
1991/0627    
                 
1991/0629    
	/* 
	 * Clear BSS 
	 */ 
1991/0629/sys/src/9/pc/l.s:135,1541991/0702/sys/src/9/pc/l.s:100,105
1991/0627    
	REP 
1991/0629    
	MOVSL 
1991/0627    
 
                 
1991/0619    
/* 
1991/0629    
 *	print a blue 4 on a red background 
1991/0619    
 */ 
1991/0629    
	MOVL	$0xb8100,BX 
	MOVB	$0x34,AL 
	MOVB	AL,(BX) 
	INCW	BX 
	MOVB	$0x43,AL 
	MOVB	AL,(BX) 
here: 
	JMP	here 
1991/0622    
                 
                 
1991/0629    
	/* 
	 *  stack and mach 
	 */ 
1991/0629/sys/src/9/pc/l.s:159,1731991/0702/sys/src/9/pc/l.s:110,115
1991/0629    
	MOVL	$0, u(SB) 
1991/0622    
 
1991/0629    
	CALL	main(SB) 
1991/0623    
/* 
1991/0629    
 *	print a blue 4 on a red background 
1991/0623    
 */ 
1991/0629    
	MOVL	$0xb8100,BX 
	MOVB	$0x34,AL 
	MOVB	AL,(BX) 
	INCW	BX 
	MOVB	$0x43,AL 
	MOVB	AL,(BX) 
1991/0619    
 
1991/0629    
loop: 
	JMP	loop 
1991/0629/sys/src/9/pc/l.s:175,1771991/0702/sys/src/9/pc/l.s:117,164
1991/0629    
GLOBL	mach0+0(SB), $MACHSIZE 
GLOBL	u(SB), $4 
GLOBL	m(SB), $4 
1991/0702    
 
/* 
 *  gdt to get us to 32-bit/segmented/unpaged mode 
 */ 
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) 
 
/* 
 *  pointer to initial gdt 
 */ 
TEXT	tgdtptr(SB),$0 
 
	WORD	$(3*8) 
	LONG	$tgdt(SB) 
 
/* 
 *  input a byte 
 */ 
TEXT	inb(SB),$0 
 
	MOVL	p+0(FP),DX 
	XORL	AX,AX 
	INB 
	RET 
 
/* 
 *  output a byte 
 */ 
TEXT	outb(SB),$0 
 
	MOVL	p+0(FP),DX 
	MOVL	b+4(FP),AX 
	OUTB 
	RET 
1991/0702/sys/src/9/pc/l.s:162,1641991/0703/sys/src/9/pc/l.s:162,300 (short | long)
1991/0702    
	MOVL	b+4(FP),AX 
	OUTB 
	RET 
1991/0703    
 
/* 
 *  test and set 
 */ 
TEXT	tas(SB),$0 
	MOVL	$0xdeadead,AX 
	MOVL	l+0(FP),BX 
	XCHGL	AX,(BX) 
	RET 
 
/* 
 *  load the idt 
 */ 
GLOBL	idtptr(SB),$6 
TEXT	lidt(SB),$0 
	MOVL	t+0(FP),AX 
	MOVL	AX,idtptr+2(SB) 
	MOVL	l+4(FP),AX 
	MOVW	AX,idtptr(SB) 
	MOVL	idtptr(SB),IDTR 
	RET 
 
/* 
 *  load the gdt 
 */ 
GLOBL	gdtptr(SB),$6 
TEXT	lgdt(SB),$0 
	MOVL	t+0(FP),AX 
	MOVL	AX,gdtptr+2(SB) 
	MOVL	l+4(FP),AX 
	MOVW	AX,gdtptr(SB) 
	MOVL	gdtptr(SB),GDTR 
	RET 
 
/* 
 *  special traps 
 */ 
TEXT	intr0(SB),$0 
	PUSHL	$0 
	PUSHL	$0 
	JMP	intrcommon 
TEXT	intr1(SB),$0 
	PUSHL	$0 
	PUSHL	$1 
	JMP	intrcommon 
TEXT	intr2(SB),$0 
	PUSHL	$0 
	PUSHL	$2 
	JMP	intrcommon 
TEXT	intr3(SB),$0 
	PUSHL	$0 
	PUSHL	$3 
	JMP	intrcommon 
TEXT	intr4(SB),$0 
	PUSHL	$0 
	PUSHL	$4 
	JMP	intrcommon 
TEXT	intr5(SB),$0 
	PUSHL	$0 
	PUSHL	$5 
	JMP	intrcommon 
TEXT	intr6(SB),$0 
	PUSHL	$0 
	PUSHL	$6 
	JMP	intrcommon 
TEXT	intr7(SB),$0 
	PUSHL	$0 
	PUSHL	$7 
	JMP	intrcommon 
TEXT	intr8(SB),$0 
	PUSHL	$8 
	JMP	intrscommon 
TEXT	intr9(SB),$0 
	PUSHL	$0 
	PUSHL	$9 
	JMP	intrcommon 
TEXT	intr10(SB),$0 
	PUSHL	$10 
	JMP	intrscommon 
TEXT	intr11(SB),$0 
	PUSHL	$11 
	JMP	intrscommon 
TEXT	intr12(SB),$0 
	PUSHL	$12 
	JMP	intrscommon 
TEXT	intr13(SB),$0 
	PUSHL	$13 
	JMP	intrscommon 
TEXT	intr14(SB),$0 
	PUSHL	$14 
	JMP	intrscommon 
TEXT	intr15(SB),$0 
	PUSHL	$0 
	PUSHL	$15 
	JMP	intrcommon 
TEXT	intr16(SB),$0 
	PUSHL	$0 
	PUSHL	$16 
	JMP	intrcommon 
TEXT	intrbad(SB),$0 
	PUSHL	$0 
	PUSHL	$0x1ff 
	JMP	intrcommon 
 
intrcommon: 
	PUSHL	DS 
	PUSHAL 
	LEAL	0(SP),AX 
	PUSHL	AX 
	CALL	trap(SB) 
	POPL	AX 
	POPAL 
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
	RET 
 
intrscommon: 
	PUSHL	DS 
	PUSHAL 
	LEAL	0(SP),AX 
	PUSHL	AX 
	CALL	trap(SB) 
	POPL	AX 
	POPAL 
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
	RET 
 
/* 
 *  turn on interrupts 
 */ 
TEXT	sti(SB),$0 
	STI 
	RET 
1991/0703/sys/src/9/pc/l.s:293,3001991/0704/sys/src/9/pc/l.s:293,307 (short | long)
1991/0703    
	RET 
 
/* 
 *  turn on interrupts 
1991/0704    
 *  turn interrupts and traps on 
1991/0703    
 */ 
TEXT	sti(SB),$0 
1991/0704    
TEXT	spllo(SB),$0 
1991/0703    
	STI 
1991/0704    
	RET 
 
/* 
 *  turn interrupts and traps off 
 */ 
TEXT	splhi(SB),$0 
	CLI 
1991/0703    
	RET 
1991/0704/sys/src/9/pc/l.s:305,3071991/0705/sys/src/9/pc/l.s:305,313 (short | long)
1991/0704    
TEXT	splhi(SB),$0 
	CLI 
1991/0703    
	RET 
1991/0705    
 
/* 
 *  set interrupt level 
 */ 
TEXT	splx(SB),$0 
	RET 
1991/0705/sys/src/9/pc/l.s:80,861991/0706/sys/src/9/pc/l.s:80,86 (short | long)
1991/0627    
	MOVW	AX,SS 
1991/0629    
	MOVW	AX,ES 
1991/0627    
 
1991/0629    
/*	JMPFAR*	SELECTOR(2, SELGDT, 0):$protected(SB) /**/ 
1991/0706    
/*	JMPFAR	SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/ 
1991/0629    
	 BYTE	$0xEA 
	 WORD	$mode32bit(SB) 
	 WORD	$SELECTOR(2, SELGDT, 0) 
1991/0705/sys/src/9/pc/l.s:261,2661991/0706/sys/src/9/pc/l.s:261,294
1991/0703    
	PUSHL	$0 
	PUSHL	$16 
	JMP	intrcommon 
1991/0706    
TEXT	intr17(SB),$0 
	PUSHL	$0 
	PUSHL	$17 
	JMP	intrcommon 
TEXT	intr18(SB),$0 
	PUSHL	$0 
	PUSHL	$18 
	JMP	intrcommon 
TEXT	intr19(SB),$0 
	PUSHL	$0 
	PUSHL	$19 
	JMP	intrcommon 
TEXT	intr20(SB),$0 
	PUSHL	$0 
	PUSHL	$20 
	JMP	intrcommon 
TEXT	intr21(SB),$0 
	PUSHL	$0 
	PUSHL	$21 
	JMP	intrcommon 
TEXT	intr22(SB),$0 
	PUSHL	$0 
	PUSHL	$22 
	JMP	intrcommon 
TEXT	intr23(SB),$0 
	PUSHL	$0 
	PUSHL	$23 
	JMP	intrcommon 
1991/0703    
TEXT	intrbad(SB),$0 
	PUSHL	$0 
	PUSHL	$0x1ff 
1991/0705/sys/src/9/pc/l.s:311,3131991/0706/sys/src/9/pc/l.s:339,347
1991/0705    
 */ 
TEXT	splx(SB),$0 
	RET 
1991/0706    
 
/* 
 *	 
 */ 
TEXT	idle(SB),$0 
	HLT 
1991/0706/sys/src/9/pc/l.s:24,301991/0710/sys/src/9/pc/l.s:24,30 (short | long)
1991/0629    
	MOVSL 
1991/0702    
/*	JMPFAR	00:$lowcore(SB) /**/ 
1991/0629    
	 BYTE	$0xEA 
	 WORD	$lowcore(SB) 
1991/0710    
	 WORD	$lowcore-KZERO(SB) 
1991/0629    
	 WORD	$0 
1991/0625    
 
1991/0629    
TEXT	lowcore(SB),$0 
1991/0706/sys/src/9/pc/l.s:56,621991/0710/sys/src/9/pc/l.s:56,62
1991/0629    
	 BYTE	$0x0f 
	 BYTE	$0x01 
	 BYTE	$0x16 
	 WORD	$tgdtptr(SB) 
1991/0710    
	 WORD	$tgdtptr-KZERO(SB) 
1991/0627    
	MOVL	CR0,AX 
	ORL	$1,AX 
	MOVL	AX,CR0 
1991/0706/sys/src/9/pc/l.s:82,881991/0710/sys/src/9/pc/l.s:82,88
1991/0627    
 
1991/0706    
/*	JMPFAR	SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/ 
1991/0629    
	 BYTE	$0xEA 
	 WORD	$mode32bit(SB) 
1991/0710    
	 WORD	$mode32bit-KZERO(SB) 
1991/0629    
	 WORD	$SELECTOR(2, SELGDT, 0) 
1991/0627    
 
1991/0629    
TEXT	mode32bit(SB),$0 
1991/0706/sys/src/9/pc/l.s:90,1001991/0710/sys/src/9/pc/l.s:90,101
1991/0629    
	/* 
	 * Clear BSS 
	 */ 
	LEAL	edata(SB),SI 
	LEAL	edata+4(SB),DI 
1991/0710    
	LEAL	edata-KZERO(SB),SI 
	MOVL	SI,DI 
	ADDL	$4,DI 
1991/0629    
	MOVL	$0,AX 
	MOVL	AX,(SI) 
	LEAL	end(SB),CX 
1991/0710    
	LEAL	end-KZERO(SB),CX 
1991/0627    
	SUBL	DI,CX 
	SHRL	$2,CX 
	REP 
1991/0706/sys/src/9/pc/l.s:101,1061991/0710/sys/src/9/pc/l.s:102,138
1991/0629    
	MOVSL 
1991/0627    
 
1991/0629    
	/* 
1991/0710    
	 *  make a bottom level page table page that maps the first 
	 *  4 meg of physical memory 
	 */ 
	LEAL	tpt-KZERO(SB),AX	/* get phys addr of temporary page table */ 
	ADDL	$(BY2PG-1),AX		/* must be page alligned */ 
	ANDL	$(~(BY2PG-1)),AX	/* ... */ 
	MOVL	$1024,CX		/* pte's per page */ 
	MOVL	$(((1024-1)<<12)|PTEVALID|PTEKERNEL|PTEWRITE),BX 
setpte: 
	MOVL	BX,-4(AX)(CX*4) 
	SUBL	$(1<<12),BX 
	LOOP	setpte 
 
	/* 
	 *  make a top level page table page that maps the first 
	 *  4 meg of memory to 0 thru 4meg and to KZERO thru KZERO+4meg 
	 */ 
	MOVL	AX,BX 
	ADDL	$BY2PG,AX 
	MOVL	BX,0(AX) 
	MOVL	BX,((KZERO>>22)&(BY2PG-1))(AX) 
 
	/* 
	 *  point processor to top level page & turn on paging 
	 */ 
	MOVL	AX,CR3 
	MOVL	CR0,AX 
	ORL	$1,AX 
	MOVL	AX,CR0 
 
	/* 
1991/0629    
	 *  stack and mach 
	 */ 
	MOVL	$mach0(SB),SP 
1991/0706/sys/src/9/pc/l.s:117,1221991/0710/sys/src/9/pc/l.s:149,155
1991/0629    
GLOBL	mach0+0(SB), $MACHSIZE 
GLOBL	u(SB), $4 
GLOBL	m(SB), $4 
1991/0710    
GLOBL	tpt(SB), $(BY2PG*3) 
1991/0702    
 
/* 
 *  gdt to get us to 32-bit/segmented/unpaged mode 
1991/0706/sys/src/9/pc/l.s:141,1471991/0710/sys/src/9/pc/l.s:174,180
1991/0702    
TEXT	tgdtptr(SB),$0 
 
	WORD	$(3*8) 
	LONG	$tgdt(SB) 
1991/0710    
	LONG	$tgdt-KZERO(SB) 
1991/0702    
 
/* 
 *  input a byte 
1991/0706/sys/src/9/pc/l.s:289,2941991/0710/sys/src/9/pc/l.s:322,331
1991/0706    
	PUSHL	$0 
	PUSHL	$23 
	JMP	intrcommon 
1991/0710    
TEXT	intr64(SB),$0 
	PUSHL	$0 
	PUSHL	$64 
	JMP	intrcommon 
1991/0703    
TEXT	intrbad(SB),$0 
	PUSHL	$0 
	PUSHL	$0x1ff 
1991/0706/sys/src/9/pc/l.s:324,3291991/0710/sys/src/9/pc/l.s:361,368
1991/0704    
 *  turn interrupts and traps on 
1991/0703    
 */ 
1991/0704    
TEXT	spllo(SB),$0 
1991/0710    
	PUSHFL 
	POPL	AX 
1991/0703    
	STI 
1991/0704    
	RET 
 
1991/0706/sys/src/9/pc/l.s:331,3361991/0710/sys/src/9/pc/l.s:370,377
1991/0704    
 *  turn interrupts and traps off 
 */ 
TEXT	splhi(SB),$0 
1991/0710    
	PUSHFL 
	POPL	AX 
1991/0704    
	CLI 
1991/0703    
	RET 
1991/0705    
 
1991/0706/sys/src/9/pc/l.s:338,3471991/0710/sys/src/9/pc/l.s:379,409
1991/0705    
 *  set interrupt level 
 */ 
TEXT	splx(SB),$0 
1991/0710    
	MOVL	s+0(FP),AX 
	PUSHL	AX 
	POPFL 
1991/0705    
	RET 
1991/0706    
 
/* 
 *	 
1991/0710    
 *  do nothing whatsoever till interrupt happens 
1991/0706    
 */ 
TEXT	idle(SB),$0 
	HLT 
1991/0710    
	RET 
 
/* 
 *  label consists of a stack pointer and a PC 
 */ 
TEXT	gotolabel(SB),$0 
	MOVL	l+0(FP),AX 
	MOVL	0(AX),SP	/* restore sp */ 
	MOVL	4(AX),AX	/* put return pc on the stack */ 
	MOVL	AX,0(SP) 
	RET 
 
TEXT	setlabel(SB),$0 
	MOVL	l+0(FP),AX 
	MOVL	SP,0(AX)	/* store sp */ 
	MOVL	0(SP),BX	/* store return pc */ 
	MOVL	BX,4(AX) 
	RET 
1991/0710/sys/src/9/pc/l.s:103,1281991/0711/sys/src/9/pc/l.s:103,138 (short | long)
1991/0627    
 
1991/0629    
	/* 
1991/0710    
	 *  make a bottom level page table page that maps the first 
	 *  4 meg of physical memory 
1991/0711    
	 *  16 meg of physical memory 
1991/0710    
	 */ 
	LEAL	tpt-KZERO(SB),AX	/* get phys addr of temporary page table */ 
	ADDL	$(BY2PG-1),AX		/* must be page alligned */ 
	ANDL	$(~(BY2PG-1)),AX	/* ... */ 
	MOVL	$1024,CX		/* pte's per page */ 
	MOVL	$(((1024-1)<<12)|PTEVALID|PTEKERNEL|PTEWRITE),BX 
1991/0711    
	MOVL	$(4*1024),CX		/* pte's per page */ 
	MOVL	$((((4*1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX 
1991/0710    
setpte: 
	MOVL	BX,-4(AX)(CX*4) 
	SUBL	$(1<<12),BX 
1991/0711    
	SUBL	$(1<<PGSHIFT),BX 
1991/0710    
	LOOP	setpte 
 
	/* 
	 *  make a top level page table page that maps the first 
	 *  4 meg of memory to 0 thru 4meg and to KZERO thru KZERO+4meg 
1991/0711    
	 *  16 meg of memory to 0 thru 16meg and to KZERO thru KZERO+16meg 
1991/0710    
	 */ 
	MOVL	AX,BX 
	ADDL	$BY2PG,AX 
1991/0711    
	ADDL	$(4*BY2PG),AX 
	ADDL	$(PTEVALID|PTEKERNEL|PTEWRITE),BX 
1991/0710    
	MOVL	BX,0(AX) 
	MOVL	BX,((KZERO>>22)&(BY2PG-1))(AX) 
1991/0711    
	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+0)(AX) 
	ADDL	$BY2PG,BX 
	MOVL	BX,4(AX) 
	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+4)(AX) 
	ADDL	$BY2PG,BX 
	MOVL	BX,8(AX) 
	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+8)(AX) 
	ADDL	$BY2PG,BX 
	MOVL	BX,12(AX) 
	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+12)(AX) 
1991/0710    
 
	/* 
	 *  point processor to top level page & turn on paging 
1991/0710/sys/src/9/pc/l.s:129,1351991/0711/sys/src/9/pc/l.s:139,145
1991/0710    
	 */ 
	MOVL	AX,CR3 
	MOVL	CR0,AX 
	ORL	$1,AX 
1991/0711    
	ORL	$0X80000000,AX 
1991/0710    
	MOVL	AX,CR0 
 
	/* 
1991/0710/sys/src/9/pc/l.s:149,1551991/0711/sys/src/9/pc/l.s:159,165
1991/0629    
GLOBL	mach0+0(SB), $MACHSIZE 
GLOBL	u(SB), $4 
GLOBL	m(SB), $4 
1991/0710    
GLOBL	tpt(SB), $(BY2PG*3) 
1991/0711    
GLOBL	tpt(SB), $(BY2PG*6) 
1991/0702    
 
/* 
 *  gdt to get us to 32-bit/segmented/unpaged mode 
1991/0710/sys/src/9/pc/l.s:406,4091991/0711/sys/src/9/pc/l.s:416,422
1991/0710    
	MOVL	SP,0(AX)	/* store sp */ 
	MOVL	0(SP),BX	/* store return pc */ 
	MOVL	BX,4(AX) 
1991/0711    
	RET 
 
TEXT	touser(SB),$0 
1991/0710    
	RET 
1991/0711/sys/src/9/pc/l.s:7,521991/0715/sys/src/9/pc/l.s:7,39 (short | long)
1991/0702    
 
1991/0629    
	CLI 
1991/0625    
 
1991/0715    
#ifdef BOOT 
1991/0629    
/* 
 *	move the first 1k bytes down to low core and jump to them 
1991/0715    
 *	relocate everything to a half meg and jump there 
1991/0629    
 *	- looks wierd because it is being assembled by a 32 bit 
 *	  assembler for a 16 bit world 
 */ 
	MOVL	$0,BX 
	INCL	BX 
	SHLL	$(10-1),BX 
1991/0715    
	SHLL	$15,BX 
1991/0629    
	MOVL	BX,CX 
1991/0715    
	MOVW	BX,ES 
1991/0629    
	MOVL	$0,SI 
	MOVW	SI,ES 
	MOVL	SI,DI 
	CLD 
	REP 
	MOVSL 
1991/0702    
/*	JMPFAR	00:$lowcore(SB) /**/ 
1991/0715    
/*	JMPFAR	0X8000:$lowcore(SB) /**/ 
1991/0629    
	 BYTE	$0xEA 
1991/0710    
	 WORD	$lowcore-KZERO(SB) 
1991/0629    
	 WORD	$0 
1991/0715    
	 WORD	$lowcore(SB) 
	 WORD	$0X8000 
1991/0625    
 
1991/0629    
TEXT	lowcore(SB),$0 
1991/0625    
 
1991/0629    
/* 
 *	move the next 63K down 
 */ 
	MOVL	$0,CX 
	INCL	CX 
	SHLL	$(15-1),CX 
	SUBL	BX,CX 
	SHLL	$1,BX 
	MOVL	BX,SI 
	MOVL	BX,DI 
	REP 
	MOVSL 
1991/0627    
                 
1991/0629    
/* 
 *	now that we're in low core, update the DS 
 */ 
 
	MOVL	$0,BX 
	MOVW	BX,DS 
 
/* 
1991/0711/sys/src/9/pc/l.s:56,621991/0715/sys/src/9/pc/l.s:43,49
1991/0629    
	 BYTE	$0x0f 
	 BYTE	$0x01 
	 BYTE	$0x16 
1991/0710    
	 WORD	$tgdtptr-KZERO(SB) 
1991/0715    
	 WORD	$tgdtptr(SB) 
1991/0627    
	MOVL	CR0,AX 
	ORL	$1,AX 
	MOVL	AX,CR0 
1991/0711/sys/src/9/pc/l.s:81,911991/0715/sys/src/9/pc/l.s:68,81
1991/0629    
	MOVW	AX,ES 
1991/0627    
 
1991/0706    
/*	JMPFAR	SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/ 
1991/0715    
	 BYTE	$0x66 
1991/0629    
	 BYTE	$0xEA 
1991/0710    
	 WORD	$mode32bit-KZERO(SB) 
1991/0715    
	 LONG	$mode32bit-KZERO(SB) 
1991/0629    
	 WORD	$SELECTOR(2, SELGDT, 0) 
1991/0627    
 
1991/0629    
TEXT	mode32bit(SB),$0 
1991/0715    
 
#endif BOOT 
1991/0629    
 
	/* 
	 * Clear BSS 
1991/0715/sys/src/9/pc/l.s:342,3481991/0716/sys/src/9/pc/l.s:342,348 (short | long)
1991/0703    
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
	RET 
1991/0716    
	RET		/* this has to be here because of ken */ 
1991/0703    
 
intrscommon: 
	PUSHL	DS 
1991/0715/sys/src/9/pc/l.s:355,3641991/0716/sys/src/9/pc/l.s:355,364
1991/0703    
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
	RET 
1991/0716    
	RET		/* this has to be here because of ken */ 
1991/0703    
 
/* 
1991/0704    
 *  turn interrupts and traps on 
1991/0716    
 *  interrupt level is interrupts on or off 
1991/0703    
 */ 
1991/0704    
TEXT	spllo(SB),$0 
1991/0710    
	PUSHFL 
1991/0715/sys/src/9/pc/l.s:366,3741991/0716/sys/src/9/pc/l.s:366,371
1991/0703    
	STI 
1991/0704    
	RET 
 
/* 
 *  turn interrupts and traps off 
 */ 
TEXT	splhi(SB),$0 
1991/0710    
	PUSHFL 
	POPL	AX 
1991/0715/sys/src/9/pc/l.s:375,3831991/0716/sys/src/9/pc/l.s:372,377
1991/0704    
	CLI 
1991/0703    
	RET 
1991/0705    
 
/* 
 *  set interrupt level 
 */ 
TEXT	splx(SB),$0 
1991/0710    
	MOVL	s+0(FP),AX 
	PUSHL	AX 
1991/0715/sys/src/9/pc/l.s:409,4121991/0716/sys/src/9/pc/l.s:403,424
1991/0711    
	RET 
 
TEXT	touser(SB),$0 
1991/0716    
	MOVL	$(USERADDR+BY2PG-5*BY2WD),AX 
	MOVL	$(UTZERO+32),0(AX)	/* header is in text */ 
	MOVL	$(UESEL),4(AX) 
	MOVL	$(IFLAG|2),8(AX) 
	MOVL	$(USTKTOP-4*BY2WD),12(AX) 
	MOVL	$(UDSEL),16(AX) 
	MOVL	AX,SP 
	IRETL 
 
/* 
 *  save/restore floating point 
 *	- to be filled in at some future time 
 */ 
TEXT	fpsave(SB),$0 
1991/0710    
	RET 
1991/0716    
 
TEXT	fprestore(SB),$0 
	RET 
 
1991/0716/sys/src/9/pc/l.s:133,1381991/0717/sys/src/9/pc/l.s:133,147 (short | long)
1991/0710    
	MOVL	AX,CR0 
 
	/* 
1991/0717    
	 *  use a jump to an absolute location to get the PC into 
	 *  KZERO. 
	 */ 
	LEAL	tokzero(SB),AX 
	JMP*	AX 
 
TEXT	tokzero(SB),$0 
 
	/* 
1991/0629    
	 *  stack and mach 
	 */ 
	MOVL	$mach0(SB),SP 
1991/0716/sys/src/9/pc/l.s:206,2121991/0717/sys/src/9/pc/l.s:215,221
1991/0703    
	RET 
 
/* 
 *  load the idt 
1991/0717    
 *  routines to load various system registers 
1991/0703    
 */ 
GLOBL	idtptr(SB),$6 
TEXT	lidt(SB),$0 
1991/0716/sys/src/9/pc/l.s:217,2251991/0717/sys/src/9/pc/l.s:226,231
1991/0703    
	MOVL	idtptr(SB),IDTR 
	RET 
 
/* 
 *  load the gdt 
 */ 
GLOBL	gdtptr(SB),$6 
TEXT	lgdt(SB),$0 
	MOVL	t+0(FP),AX 
1991/0716/sys/src/9/pc/l.s:229,2341991/0717/sys/src/9/pc/l.s:235,250
1991/0703    
	MOVL	gdtptr(SB),GDTR 
	RET 
 
1991/0717    
TEXT	lcr3(SB),$0 
	MOVL	t+0(FP),AX 
	MOVL	AX,CR3 
	RET 
 
TEXT	ltr(SB),$0 
	MOVL	t+0(FP),AX 
	MOVW	AX,TASK 
	RET 
 
1991/0703    
/* 
 *  special traps 
 */ 
1991/0716/sys/src/9/pc/l.s:403,4091991/0717/sys/src/9/pc/l.s:419,425
1991/0711    
	RET 
 
TEXT	touser(SB),$0 
1991/0716    
	MOVL	$(USERADDR+BY2PG-5*BY2WD),AX 
1991/0717    
	MOVL	$(USERADDR+BY2PG-6*BY2WD),AX 
1991/0716    
	MOVL	$(UTZERO+32),0(AX)	/* header is in text */ 
	MOVL	$(UESEL),4(AX) 
	MOVL	$(IFLAG|2),8(AX) 
1991/0716/sys/src/9/pc/l.s:410,4151991/0717/sys/src/9/pc/l.s:426,433
1991/0716    
	MOVL	$(USTKTOP-4*BY2WD),12(AX) 
	MOVL	$(UDSEL),16(AX) 
	MOVL	AX,SP 
1991/0717    
	MOVL	$(UDSEL),AX		/* set up data segment */ 
	MOVW	AX,DS 
1991/0716    
	IRETL 
 
/* 
1991/0717/sys/src/9/pc/l.s:215,2241991/0718/sys/src/9/pc/l.s:215,224 (short | long)
1991/0703    
	RET 
 
/* 
1991/0717    
 *  routines to load various system registers 
1991/0718    
 *  routines to load/read various system registers 
1991/0703    
 */ 
GLOBL	idtptr(SB),$6 
TEXT	lidt(SB),$0 
1991/0718    
TEXT	putidt(SB),$0		/* interrupt descriptor table */ 
1991/0703    
	MOVL	t+0(FP),AX 
	MOVL	AX,idtptr+2(SB) 
	MOVL	l+4(FP),AX 
1991/0717/sys/src/9/pc/l.s:227,2331991/0718/sys/src/9/pc/l.s:227,233
1991/0703    
	RET 
 
GLOBL	gdtptr(SB),$6 
TEXT	lgdt(SB),$0 
1991/0718    
TEXT	putgdt(SB),$0		/* global descriptor table */ 
1991/0703    
	MOVL	t+0(FP),AX 
	MOVL	AX,gdtptr+2(SB) 
	MOVL	l+4(FP),AX 
1991/0717/sys/src/9/pc/l.s:235,2501991/0718/sys/src/9/pc/l.s:235,254
1991/0703    
	MOVL	gdtptr(SB),GDTR 
	RET 
 
1991/0717    
TEXT	lcr3(SB),$0 
1991/0718    
TEXT	putcr3(SB),$0		/* top level page table pointer */ 
1991/0717    
	MOVL	t+0(FP),AX 
	MOVL	AX,CR3 
	RET 
 
TEXT	ltr(SB),$0 
1991/0718    
TEXT	puttr(SB),$0		/* task register */ 
1991/0717    
	MOVL	t+0(FP),AX 
	MOVW	AX,TASK 
	RET 
 
1991/0718    
TEXT	getcr2(SB),$0		/* fault address */ 
	MOVL	CR2,AX 
	RET 
 
1991/0703    
/* 
 *  special traps 
 */ 
1991/0717/sys/src/9/pc/l.s:350,3551991/0718/sys/src/9/pc/l.s:354,361
1991/0703    
intrcommon: 
	PUSHL	DS 
	PUSHAL 
1991/0718    
	MOVL	$(KDSEL),AX 
	MOVW	AX,DS 
1991/0703    
	LEAL	0(SP),AX 
	PUSHL	AX 
	CALL	trap(SB) 
1991/0717/sys/src/9/pc/l.s:358,3681991/0718/sys/src/9/pc/l.s:364,375
1991/0703    
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
1991/0716    
	RET		/* this has to be here because of ken */ 
1991/0703    
 
intrscommon: 
	PUSHL	DS 
	PUSHAL 
1991/0718    
	MOVL	$(KDSEL),AX 
	MOVW	AX,DS 
1991/0703    
	LEAL	0(SP),AX 
	PUSHL	AX 
	CALL	trap(SB) 
1991/0717/sys/src/9/pc/l.s:371,3771991/0718/sys/src/9/pc/l.s:378,383
1991/0703    
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
1991/0716    
	RET		/* this has to be here because of ken */ 
1991/0703    
 
/* 
1991/0716    
 *  interrupt level is interrupts on or off 
1991/0717/sys/src/9/pc/l.s:409,4141991/0718/sys/src/9/pc/l.s:415,421
1991/0710    
	MOVL	0(AX),SP	/* restore sp */ 
	MOVL	4(AX),AX	/* put return pc on the stack */ 
	MOVL	AX,0(SP) 
1991/0718    
	MOVL	$1,AX		/* return 1 */ 
1991/0710    
	RET 
 
TEXT	setlabel(SB),$0 
1991/0717/sys/src/9/pc/l.s:416,4321991/0718/sys/src/9/pc/l.s:423,442
1991/0710    
	MOVL	SP,0(AX)	/* store sp */ 
	MOVL	0(SP),BX	/* store return pc */ 
	MOVL	BX,4(AX) 
1991/0718    
	MOVL	$0,AX		/* return 0 */ 
1991/0711    
	RET 
 
1991/0718    
/* 
 *  Used to get to the first process. 
 *  Set up an interrupt return frame and IRET to user level. 
 */ 
1991/0711    
TEXT	touser(SB),$0 
1991/0717    
	MOVL	$(USERADDR+BY2PG-6*BY2WD),AX 
1991/0716    
	MOVL	$(UTZERO+32),0(AX)	/* header is in text */ 
	MOVL	$(UESEL),4(AX) 
	MOVL	$(IFLAG|2),8(AX) 
	MOVL	$(USTKTOP-4*BY2WD),12(AX) 
	MOVL	$(UDSEL),16(AX) 
	MOVL	AX,SP 
1991/0717    
	MOVL	$(UDSEL),AX		/* set up data segment */ 
1991/0718    
	PUSHL	$(UDSEL)			/* old ss */ 
	PUSHL	$(USTKTOP-4*BY2WD)		/* old sp */ 
	PUSHFL					/* old flags */ 
	PUSHL	$(UESEL)			/* old cs */ 
	PUSHL	$(UTZERO+32)			/* old pc */ 
	MOVL	$(UDSEL),AX		/* set up user's data segment */ 
1991/0717    
	MOVW	AX,DS 
1991/0716    
	IRETL 
 
1991/0718/sys/src/9/pc/l.s:432,4431991/0719/sys/src/9/pc/l.s:432,444 (short | long)
1991/0718    
 */ 
1991/0711    
TEXT	touser(SB),$0 
1991/0718    
	PUSHL	$(UDSEL)			/* old ss */ 
	PUSHL	$(USTKTOP-4*BY2WD)		/* old sp */ 
1991/0719    
	PUSHL	$(USTKTOP-16)			/* old sp */ 
1991/0718    
	PUSHFL					/* old flags */ 
	PUSHL	$(UESEL)			/* old cs */ 
	PUSHL	$(UTZERO+32)			/* old pc */ 
	MOVL	$(UDSEL),AX		/* set up user's data segment */ 
1991/0719    
	MOVL	$(UDSEL),AX 
1991/0717    
	MOVW	AX,DS 
1991/0719    
	MOVW	AX,ES 
1991/0716    
	IRETL 
 
/* 
1991/0719/sys/src/9/pc/l.s:9,141991/0720/sys/src/9/pc/l.s:9,19 (short | long)
1991/0625    
 
1991/0715    
#ifdef BOOT 
1991/0629    
/* 
1991/0720    
 *	This part of l.s is used only in the boot kernel. 
 *	It assumes that we are in real address mode, i.e., 
 *	that we look like an 8086. 
 */ 
/* 
1991/0715    
 *	relocate everything to a half meg and jump there 
1991/0629    
 *	- looks wierd because it is being assembled by a 32 bit 
 *	  assembler for a 16 bit world 
1991/0719/sys/src/9/pc/l.s:431,4411991/0720/sys/src/9/pc/l.s:436,446
1991/0718    
 *  Set up an interrupt return frame and IRET to user level. 
 */ 
1991/0711    
TEXT	touser(SB),$0 
1991/0718    
	PUSHL	$(UDSEL)			/* old ss */ 
1991/0719    
	PUSHL	$(USTKTOP-16)			/* old sp */ 
1991/0718    
	PUSHFL					/* old flags */ 
	PUSHL	$(UESEL)			/* old cs */ 
	PUSHL	$(UTZERO+32)			/* old pc */ 
1991/0720    
	PUSHL	$(UDSEL)		/* old ss */ 
	PUSHL	$(USTKTOP)		/* old sp */ 
	PUSHFL				/* old flags */ 
	PUSHL	$(UESEL)		/* old cs */ 
	PUSHL	$(UTZERO+32)		/* old pc */ 
1991/0719    
	MOVL	$(UDSEL),AX 
1991/0717    
	MOVW	AX,DS 
1991/0719    
	MOVW	AX,ES 
1991/0720/sys/src/9/pc/l.s:347,3521991/0731/sys/src/9/pc/l.s:347,384 (short | long)
1991/0706    
	PUSHL	$0 
	PUSHL	$23 
	JMP	intrcommon 
1991/0731    
TEXT	intr24(SB),$0 
	PUSHL	$0 
	PUSHL	$24 
	JMP	intrcommon 
TEXT	intr25(SB),$0 
	PUSHL	$0 
	PUSHL	$25 
	JMP	intrcommon 
TEXT	intr26(SB),$0 
	PUSHL	$0 
	PUSHL	$26 
	JMP	intrcommon 
TEXT	intr27(SB),$0 
	PUSHL	$0 
	PUSHL	$27 
	JMP	intrcommon 
TEXT	intr28(SB),$0 
	PUSHL	$0 
	PUSHL	$28 
	JMP	intrcommon 
TEXT	intr29(SB),$0 
	PUSHL	$0 
	PUSHL	$29 
	JMP	intrcommon 
TEXT	intr30(SB),$0 
	PUSHL	$0 
	PUSHL	$30 
	JMP	intrcommon 
TEXT	intr31(SB),$0 
	PUSHL	$0 
	PUSHL	$31 
	JMP	intrcommon 
1991/0710    
TEXT	intr64(SB),$0 
	PUSHL	$0 
	PUSHL	$64 
1991/0731/sys/src/9/pc/l.s:488,4901991/0806/sys/src/9/pc/l.s:488,500 (short | long)
1991/0716    
TEXT	fprestore(SB),$0 
	RET 
 
1991/0806    
 
/* 
 *  set configuration register 
 */ 
TEXT	config(SB),$0 
	MOVL	l+0(FP),AX 
	MOVL	$0x3F3,DX 
	OUTB 
	OUTB 
	RET 
1991/0806/sys/src/9/pc/l.s:390,4031991/0807/sys/src/9/pc/l.s:390,406 (short | long)
1991/0703    
 
intrcommon: 
	PUSHL	DS 
1991/0807    
	PUSHL	ES 
1991/0703    
	PUSHAL 
1991/0718    
	MOVL	$(KDSEL),AX 
	MOVW	AX,DS 
1991/0807    
	MOVW	AX,ES 
1991/0703    
	LEAL	0(SP),AX 
	PUSHL	AX 
	CALL	trap(SB) 
	POPL	AX 
	POPAL 
1991/0807    
	POPL	ES 
1991/0703    
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
1991/0806/sys/src/9/pc/l.s:404,4171991/0807/sys/src/9/pc/l.s:407,423
1991/0703    
 
intrscommon: 
	PUSHL	DS 
1991/0807    
	PUSHL	ES 
1991/0703    
	PUSHAL 
1991/0718    
	MOVL	$(KDSEL),AX 
	MOVW	AX,DS 
1991/0807    
	MOVW	AX,ES 
1991/0703    
	LEAL	0(SP),AX 
	PUSHL	AX 
	CALL	trap(SB) 
	POPL	AX 
	POPAL 
1991/0807    
	POPL	ES 
1991/0703    
	POPL	DS 
	ADDL	$8,SP	/* error code and trap type */ 
	IRETL 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)