xref: /plan9/sys/src/cmd/8a/l.s (revision 6520663fb7ebac8d17e4a1dbc55d10bf525f7b14)
13e12c5d1SDavid du Colombier/*
23e12c5d1SDavid du Colombier * Memory and machine-specific definitions.  Used in C and assembler.
33e12c5d1SDavid du Colombier */
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier/*
63e12c5d1SDavid du Colombier * Sizes
73e12c5d1SDavid du Colombier */
83e12c5d1SDavid du Colombier#define	BI2BY		8			/* bits per byte */
93e12c5d1SDavid du Colombier#define BI2WD		32			/* bits per word */
103e12c5d1SDavid du Colombier#define	BY2WD		4			/* bytes per word */
113e12c5d1SDavid du Colombier#define	BY2PG		4096			/* bytes per page */
123e12c5d1SDavid du Colombier#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
133e12c5d1SDavid du Colombier#define	PGSHIFT		12			/* log(BY2PG) */
143e12c5d1SDavid du Colombier#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
153e12c5d1SDavid du Colombier
163e12c5d1SDavid du Colombier#define	MAXMACH		1			/* max # cpus system can run */
173e12c5d1SDavid du Colombier
183e12c5d1SDavid du Colombier/*
193e12c5d1SDavid du Colombier * Time
203e12c5d1SDavid du Colombier */
213e12c5d1SDavid du Colombier#define	HZ		(20)			/* clock frequency */
223e12c5d1SDavid du Colombier#define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
233e12c5d1SDavid du Colombier#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
243e12c5d1SDavid du Colombier#define	TK2MS(t)	((((ulong)(t))*1000)/HZ)	/* ticks to milliseconds */
253e12c5d1SDavid du Colombier#define	MS2TK(t)	((((ulong)(t))*HZ)/1000)	/* milliseconds to ticks */
263e12c5d1SDavid du Colombier
273e12c5d1SDavid du Colombier/*
283e12c5d1SDavid du Colombier * Fundamental addresses
293e12c5d1SDavid du Colombier */
303e12c5d1SDavid du Colombier
313e12c5d1SDavid du Colombier/*
323e12c5d1SDavid du Colombier *  Address spaces
333e12c5d1SDavid du Colombier *
343e12c5d1SDavid du Colombier *  User is at 0-2GB
353e12c5d1SDavid du Colombier *  Kernel is at 2GB-4GB
363e12c5d1SDavid du Colombier *
373e12c5d1SDavid du Colombier *  To avoid an extra page map, both the user stack (USTKTOP) and
383e12c5d1SDavid du Colombier *  the temporary user stack (TSTKTOP) should be in the the same
393e12c5d1SDavid du Colombier *  4 meg.
403e12c5d1SDavid du Colombier */
413e12c5d1SDavid du Colombier#define	UZERO		0			/* base of user address space */
423e12c5d1SDavid du Colombier#define	UTZERO		(UZERO+BY2PG)		/* first address in user text */
433e12c5d1SDavid du Colombier#define	KZERO		0x80000000		/* base of kernel address space */
443e12c5d1SDavid du Colombier#define	KTZERO		KZERO			/* first address in kernel text */
453e12c5d1SDavid du Colombier#define	USERADDR	0xC0000000		/* struct User */
463e12c5d1SDavid du Colombier#define	UREGADDR	(USERADDR+BY2PG-4*19)
473e12c5d1SDavid du Colombier#define	TSTKTOP		USERADDR		/* end of new stack in sysexec */
483e12c5d1SDavid du Colombier#define TSTKSIZ 10
493e12c5d1SDavid du Colombier#define	USTKTOP		(TSTKTOP-TSTKSIZ*BY2PG)	/* byte just beyond user stack */
503e12c5d1SDavid du Colombier#define	USTKSIZE	(16*1024*1024 - TSTKSIZ*BY2PG)	/* size of user stack */
513e12c5d1SDavid du Colombier#define ROMBIOS		(KZERO|0xF0000)
523e12c5d1SDavid du Colombier
533e12c5d1SDavid du Colombier#define	MACHSIZE	4096
543e12c5d1SDavid du Colombier
553e12c5d1SDavid du Colombier#define isphys(x) (((ulong)x)&KZERO)
563e12c5d1SDavid du Colombier
573e12c5d1SDavid du Colombier/*
583e12c5d1SDavid du Colombier *  known 80386 segments (in GDT) and their selectors
593e12c5d1SDavid du Colombier */
603e12c5d1SDavid du Colombier#define	NULLSEG	0	/* null segment */
613e12c5d1SDavid du Colombier#define	KDSEG	1	/* kernel data/stack */
623e12c5d1SDavid du Colombier#define	KESEG	2	/* kernel executable */
633e12c5d1SDavid du Colombier#define	UDSEG	3	/* user data/stack */
643e12c5d1SDavid du Colombier#define	UESEG	4	/* user executable */
653e12c5d1SDavid du Colombier#define TSSSEG	5	/* task segment */
663e12c5d1SDavid du Colombier
673e12c5d1SDavid du Colombier#define SELGDT	(0<<3)	/* selector is in gdt */
683e12c5d1SDavid du Colombier#define	SELLDT	(1<<3)	/* selector is in ldt */
693e12c5d1SDavid du Colombier
703e12c5d1SDavid du Colombier#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
713e12c5d1SDavid du Colombier
723e12c5d1SDavid du Colombier#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
733e12c5d1SDavid du Colombier#define KESEL	SELECTOR(KESEG, SELGDT, 0)
743e12c5d1SDavid du Colombier#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
753e12c5d1SDavid du Colombier#define UESEL	SELECTOR(UESEG, SELGDT, 3)
763e12c5d1SDavid du Colombier#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
773e12c5d1SDavid du Colombier#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
783e12c5d1SDavid du Colombier
793e12c5d1SDavid du Colombier/*
803e12c5d1SDavid du Colombier *  fields in segment descriptors
813e12c5d1SDavid du Colombier */
823e12c5d1SDavid du Colombier#define SEGDATA	(0x10<<8)	/* data/stack segment */
833e12c5d1SDavid du Colombier#define SEGEXEC	(0x18<<8)	/* executable segment */
843e12c5d1SDavid du Colombier#define	SEGTSS	(0x9<<8)	/* TSS segment */
853e12c5d1SDavid du Colombier#define SEGCG	(0x0C<<8)	/* call gate */
863e12c5d1SDavid du Colombier#define	SEGIG	(0x0E<<8)	/* interrupt gate */
873e12c5d1SDavid du Colombier#define SEGTG	(0x0F<<8)	/* task gate */
883e12c5d1SDavid du Colombier#define SEGTYPE	(0x1F<<8)
893e12c5d1SDavid du Colombier
903e12c5d1SDavid du Colombier#define SEGP	(1<<15)		/* segment present */
913e12c5d1SDavid du Colombier#define SEGPL(x) ((x)<<13)	/* priority level */
923e12c5d1SDavid du Colombier#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
933e12c5d1SDavid du Colombier#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
943e12c5d1SDavid du Colombier#define SEGE	(1<<10)		/* expand down */
953e12c5d1SDavid du Colombier#define SEGW	(1<<9)		/* writable (for data/stack) */
963e12c5d1SDavid du Colombier#define	SEGR	(1<<9)		/* readable (for code) */
973e12c5d1SDavid du Colombier#define SEGD	(1<<22)		/* default 1==32bit (for code) */
983e12c5d1SDavid du Colombier
993e12c5d1SDavid du Colombier/*
1003e12c5d1SDavid du Colombier *  virtual MMU
1013e12c5d1SDavid du Colombier */
1023e12c5d1SDavid du Colombier#define PTEMAPMEM	(1024*1024)	/* ??? */
1033e12c5d1SDavid du Colombier#define SEGMAPSIZE	16		/* ??? */
1043e12c5d1SDavid du Colombier#define	PTEPERTAB	(PTEMAPMEM/BY2PG)	/* ??? */
1053e12c5d1SDavid du Colombier#define PPN(x)		((x)&~(BY2PG-1))
1063e12c5d1SDavid du Colombier
1073e12c5d1SDavid du Colombier/*
1083e12c5d1SDavid du Colombier *  physical MMU
1093e12c5d1SDavid du Colombier */
1103e12c5d1SDavid du Colombier#define	PTEVALID	(1<<0)
1113e12c5d1SDavid du Colombier#define	PTEUNCACHED	0		/* everything is uncached */
1123e12c5d1SDavid du Colombier#define PTEWRITE	(1<<1)
1133e12c5d1SDavid du Colombier#define	PTERONLY	(0<<1)
1143e12c5d1SDavid du Colombier#define	PTEKERNEL	(0<<2)
1153e12c5d1SDavid du Colombier#define	PTEUSER		(1<<2)
1163e12c5d1SDavid du Colombier
1173e12c5d1SDavid du Colombier/*
1183e12c5d1SDavid du Colombier *  flag register bits that we care about
1193e12c5d1SDavid du Colombier */
1203e12c5d1SDavid du Colombier#define IFLAG	0x200
1213e12c5d1SDavid du Colombier
1223e12c5d1SDavid du Colombier#define OP16	BYTE	$0x66
1233e12c5d1SDavid du Colombier
1243e12c5d1SDavid du Colombier/*
1253e12c5d1SDavid du Colombier *	about to walk all over ms/dos - turn off interrupts
1263e12c5d1SDavid du Colombier */
1273e12c5d1SDavid du ColombierTEXT	origin(SB),$0
1283e12c5d1SDavid du Colombier
1293e12c5d1SDavid du Colombier	CLI
1303e12c5d1SDavid du Colombier
1313e12c5d1SDavid du Colombier#ifdef BOOT
1323e12c5d1SDavid du Colombier/*
1333e12c5d1SDavid du Colombier *	This part of l.s is used only in the boot kernel.
1343e12c5d1SDavid du Colombier *	It assumes that we are in real address mode, i.e.,
1353e12c5d1SDavid du Colombier *	that we look like an 8086.
1363e12c5d1SDavid du Colombier */
1373e12c5d1SDavid du Colombier/*
1383e12c5d1SDavid du Colombier *	relocate everything to a half meg and jump there
1393e12c5d1SDavid du Colombier *	- looks wierd because it is being assembled by a 32 bit
1403e12c5d1SDavid du Colombier *	  assembler for a 16 bit world
1413e12c5d1SDavid du Colombier */
1423e12c5d1SDavid du Colombier	MOVL	$0,BX
1433e12c5d1SDavid du Colombier	INCL	BX
1443e12c5d1SDavid du Colombier	SHLL	$15,BX
1453e12c5d1SDavid du Colombier	MOVL	BX,CX
1463e12c5d1SDavid du Colombier	MOVW	BX,ES
1473e12c5d1SDavid du Colombier	MOVL	$0,SI
1483e12c5d1SDavid du Colombier	MOVL	SI,DI
1493e12c5d1SDavid du Colombier	CLD; REP; MOVSL
1503e12c5d1SDavid du Colombier/*	JMPFAR	0X8000:$lowcore(SB) /**/
1513e12c5d1SDavid du Colombier	 BYTE	$0xEA
1523e12c5d1SDavid du Colombier	 WORD	$lowcore(SB)
1533e12c5d1SDavid du Colombier	 WORD	$0X8000
1543e12c5d1SDavid du Colombier
1553e12c5d1SDavid du ColombierTEXT	lowcore(SB),$0
1563e12c5d1SDavid du Colombier
1573e12c5d1SDavid du Colombier/*
1583e12c5d1SDavid du Colombier *	now that we're in low core, update the DS
1593e12c5d1SDavid du Colombier */
1603e12c5d1SDavid du Colombier
1613e12c5d1SDavid du Colombier	MOVW	BX,DS
1623e12c5d1SDavid du Colombier
1633e12c5d1SDavid du Colombier/*
1643e12c5d1SDavid du Colombier * 	goto protected mode
1653e12c5d1SDavid du Colombier */
1663e12c5d1SDavid du Colombier/*	MOVL	tgdtptr(SB),GDTR /**/
1673e12c5d1SDavid du Colombier	 BYTE	$0x0f
1683e12c5d1SDavid du Colombier	 BYTE	$0x01
1693e12c5d1SDavid du Colombier	 BYTE	$0x16
1703e12c5d1SDavid du Colombier	 WORD	$tgdtptr(SB)
1713e12c5d1SDavid du Colombier	MOVL	CR0,AX
1723e12c5d1SDavid du Colombier	ORL	$1,AX
1733e12c5d1SDavid du Colombier	MOVL	AX,CR0
1743e12c5d1SDavid du Colombier
1753e12c5d1SDavid du Colombier/*
1763e12c5d1SDavid du Colombier *	clear prefetch queue (wierd code to avoid optimizations)
1773e12c5d1SDavid du Colombier */
1783e12c5d1SDavid du Colombier	CLC
1793e12c5d1SDavid du Colombier	JCC	flush
1803e12c5d1SDavid du Colombier	MOVL	AX,AX
1813e12c5d1SDavid du Colombierflush:
1823e12c5d1SDavid du Colombier
1833e12c5d1SDavid du Colombier/*
1843e12c5d1SDavid du Colombier *	set all segs
1853e12c5d1SDavid du Colombier */
1863e12c5d1SDavid du Colombier/*	MOVW	$SELECTOR(1, SELGDT, 0),AX	/**/
1873e12c5d1SDavid du Colombier	 BYTE	$0xc7
1883e12c5d1SDavid du Colombier	 BYTE	$0xc0
1893e12c5d1SDavid du Colombier	 WORD	$SELECTOR(1, SELGDT, 0)
1903e12c5d1SDavid du Colombier	MOVW	AX,DS
1913e12c5d1SDavid du Colombier	MOVW	AX,SS
1923e12c5d1SDavid du Colombier	MOVW	AX,ES
1933e12c5d1SDavid du Colombier	MOVW	AX,FS
1943e12c5d1SDavid du Colombier	MOVW	AX,GS
1953e12c5d1SDavid du Colombier
1963e12c5d1SDavid du Colombier/*	JMPFAR	SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/
1973e12c5d1SDavid du Colombier	 BYTE	$0x66
1983e12c5d1SDavid du Colombier	 BYTE	$0xEA
1993e12c5d1SDavid du Colombier	 LONG	$mode32bit-KZERO(SB)
2003e12c5d1SDavid du Colombier	 WORD	$SELECTOR(2, SELGDT, 0)
2013e12c5d1SDavid du Colombier
2023e12c5d1SDavid du ColombierTEXT	mode32bit(SB),$0
2033e12c5d1SDavid du Colombier
2043e12c5d1SDavid du Colombier#endif BOOT
2053e12c5d1SDavid du Colombier
2063e12c5d1SDavid du Colombier	/*
2073e12c5d1SDavid du Colombier	 * Clear BSS
2083e12c5d1SDavid du Colombier	 */
2093e12c5d1SDavid du Colombier	LEAL	edata-KZERO(SB),SI
2103e12c5d1SDavid du Colombier	MOVL	SI,DI
2113e12c5d1SDavid du Colombier	ADDL	$4,DI
2123e12c5d1SDavid du Colombier	MOVL	$0,AX
2133e12c5d1SDavid du Colombier	MOVL	AX,(SI)
2143e12c5d1SDavid du Colombier	LEAL	end-KZERO(SB),CX
2153e12c5d1SDavid du Colombier	SUBL	DI,CX
2163e12c5d1SDavid du Colombier	SHRL	$2,CX
2173e12c5d1SDavid du Colombier	CLD; REP; MOVSL
2183e12c5d1SDavid du Colombier
2193e12c5d1SDavid du Colombier	/*
2203e12c5d1SDavid du Colombier	 *  make a bottom level page table page that maps the first
2213e12c5d1SDavid du Colombier	 *  16 meg of physical memory
2223e12c5d1SDavid du Colombier	 */
2233e12c5d1SDavid du Colombier	LEAL	tpt-KZERO(SB),AX	/* get phys addr of temporary page table */
224*6520663fSDavid du Colombier	ADDL	$(BY2PG-1),AX		/* must be page aligned */
2253e12c5d1SDavid du Colombier	ANDL	$(~(BY2PG-1)),AX	/* ... */
2263e12c5d1SDavid du Colombier	MOVL	$(4*1024),CX		/* pte's per page */
2273e12c5d1SDavid du Colombier	MOVL	$((((4*1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX
2283e12c5d1SDavid du Colombiersetpte:
2293e12c5d1SDavid du Colombier	MOVL	BX,-4(AX)(CX*4)
2303e12c5d1SDavid du Colombier	SUBL	$(1<<PGSHIFT),BX
2313e12c5d1SDavid du Colombier	LOOP	setpte
2323e12c5d1SDavid du Colombier
2333e12c5d1SDavid du Colombier	/*
2343e12c5d1SDavid du Colombier	 *  make a top level page table page that maps the first
2353e12c5d1SDavid du Colombier	 *  16 meg of memory to 0 thru 16meg and to KZERO thru KZERO+16meg
2363e12c5d1SDavid du Colombier	 */
2373e12c5d1SDavid du Colombier	MOVL	AX,BX
2383e12c5d1SDavid du Colombier	ADDL	$(4*BY2PG),AX
2393e12c5d1SDavid du Colombier	ADDL	$(PTEVALID|PTEKERNEL|PTEWRITE),BX
2403e12c5d1SDavid du Colombier	MOVL	BX,0(AX)
2413e12c5d1SDavid du Colombier	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+0)(AX)
2423e12c5d1SDavid du Colombier	ADDL	$BY2PG,BX
2433e12c5d1SDavid du Colombier	MOVL	BX,4(AX)
2443e12c5d1SDavid du Colombier	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+4)(AX)
2453e12c5d1SDavid du Colombier	ADDL	$BY2PG,BX
2463e12c5d1SDavid du Colombier	MOVL	BX,8(AX)
2473e12c5d1SDavid du Colombier	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+8)(AX)
2483e12c5d1SDavid du Colombier	ADDL	$BY2PG,BX
2493e12c5d1SDavid du Colombier	MOVL	BX,12(AX)
2503e12c5d1SDavid du Colombier	MOVL	BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+12)(AX)
2513e12c5d1SDavid du Colombier
2523e12c5d1SDavid du Colombier	/*
2533e12c5d1SDavid du Colombier	 *  point processor to top level page & turn on paging
2543e12c5d1SDavid du Colombier	 */
2553e12c5d1SDavid du Colombier	MOVL	AX,CR3
2563e12c5d1SDavid du Colombier	MOVL	CR0,AX
2573e12c5d1SDavid du Colombier	ORL	$0X80000000,AX
2583e12c5d1SDavid du Colombier	ANDL	$~(0x8|0x2),AX	/* TS=0, MP=0 */
2593e12c5d1SDavid du Colombier	MOVL	AX,CR0
2603e12c5d1SDavid du Colombier
2613e12c5d1SDavid du Colombier	/*
2623e12c5d1SDavid du Colombier	 *  use a jump to an absolute location to get the PC into
2633e12c5d1SDavid du Colombier	 *  KZERO.
2643e12c5d1SDavid du Colombier	 */
2653e12c5d1SDavid du Colombier	LEAL	tokzero(SB),AX
2663e12c5d1SDavid du Colombier	JMP*	AX
2673e12c5d1SDavid du Colombier
2683e12c5d1SDavid du ColombierTEXT	tokzero(SB),$0
2693e12c5d1SDavid du Colombier
2703e12c5d1SDavid du Colombier	/*
2713e12c5d1SDavid du Colombier	 *  stack and mach
2723e12c5d1SDavid du Colombier	 */
2733e12c5d1SDavid du Colombier	MOVL	$mach0(SB),SP
2743e12c5d1SDavid du Colombier	MOVL	SP,m(SB)
2753e12c5d1SDavid du Colombier	MOVL	$0,0(SP)
2763e12c5d1SDavid du Colombier	ADDL	$(MACHSIZE-4),SP	/* start stack under machine struct */
2773e12c5d1SDavid du Colombier	MOVL	$0, u(SB)
2783e12c5d1SDavid du Colombier
2793e12c5d1SDavid du Colombier	/*
2803e12c5d1SDavid du Colombier	 *  clear flags
2813e12c5d1SDavid du Colombier	 */
2823e12c5d1SDavid du Colombier	MOVL	$0,AX
2833e12c5d1SDavid du Colombier	PUSHL	AX
2843e12c5d1SDavid du Colombier	POPFL
2853e12c5d1SDavid du Colombier
2863e12c5d1SDavid du Colombier	CALL	main(SB)
2873e12c5d1SDavid du Colombier
2883e12c5d1SDavid du Colombierloop:
2893e12c5d1SDavid du Colombier	JMP	loop
2903e12c5d1SDavid du Colombier
2913e12c5d1SDavid du ColombierGLOBL	mach0+0(SB), $MACHSIZE
2923e12c5d1SDavid du ColombierGLOBL	u(SB), $4
2933e12c5d1SDavid du ColombierGLOBL	m(SB), $4
2943e12c5d1SDavid du ColombierGLOBL	tpt(SB), $(BY2PG*6)
2953e12c5d1SDavid du Colombier
2963e12c5d1SDavid du Colombier/*
2973e12c5d1SDavid du Colombier *  gdt to get us to 32-bit/segmented/unpaged mode
2983e12c5d1SDavid du Colombier */
2993e12c5d1SDavid du ColombierTEXT	tgdt(SB),$0
3003e12c5d1SDavid du Colombier
3013e12c5d1SDavid du Colombier	/* null descriptor */
3023e12c5d1SDavid du Colombier	LONG	$0
3033e12c5d1SDavid du Colombier	LONG	$0
3043e12c5d1SDavid du Colombier
3053e12c5d1SDavid du Colombier	/* data segment descriptor for 4 gigabytes (PL 0) */
3063e12c5d1SDavid du Colombier	LONG	$(0xFFFF)
3073e12c5d1SDavid du Colombier	LONG	$(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
3083e12c5d1SDavid du Colombier
3093e12c5d1SDavid du Colombier	/* exec segment descriptor for 4 gigabytes (PL 0) */
3103e12c5d1SDavid du Colombier	LONG	$(0xFFFF)
3113e12c5d1SDavid du Colombier	LONG	$(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
3123e12c5d1SDavid du Colombier
3133e12c5d1SDavid du Colombier/*
3143e12c5d1SDavid du Colombier *  pointer to initial gdt
3153e12c5d1SDavid du Colombier */
3163e12c5d1SDavid du ColombierTEXT	tgdtptr(SB),$0
3173e12c5d1SDavid du Colombier
3183e12c5d1SDavid du Colombier	WORD	$(3*8)
3193e12c5d1SDavid du Colombier	LONG	$tgdt-KZERO(SB)
3203e12c5d1SDavid du Colombier
3213e12c5d1SDavid du Colombier/*
3223e12c5d1SDavid du Colombier *  input a byte
3233e12c5d1SDavid du Colombier */
3243e12c5d1SDavid du ColombierTEXT	inb(SB),$0
3253e12c5d1SDavid du Colombier
3263e12c5d1SDavid du Colombier	MOVL	p+0(FP),DX
3273e12c5d1SDavid du Colombier	XORL	AX,AX
3283e12c5d1SDavid du Colombier	INB
3293e12c5d1SDavid du Colombier	RET
3303e12c5d1SDavid du Colombier
3313e12c5d1SDavid du Colombier/*
3323e12c5d1SDavid du Colombier *  output a byte
3333e12c5d1SDavid du Colombier */
3343e12c5d1SDavid du ColombierTEXT	outb(SB),$0
3353e12c5d1SDavid du Colombier
3363e12c5d1SDavid du Colombier	MOVL	p+0(FP),DX
3373e12c5d1SDavid du Colombier	MOVL	b+4(FP),AX
3383e12c5d1SDavid du Colombier	OUTB
3393e12c5d1SDavid du Colombier	RET
3403e12c5d1SDavid du Colombier
3413e12c5d1SDavid du Colombier/*
3423e12c5d1SDavid du Colombier *  input a string of shorts from a port
3433e12c5d1SDavid du Colombier */
3443e12c5d1SDavid du ColombierTEXT	inss(SB),$0
3453e12c5d1SDavid du Colombier	MOVL	p+0(FP),DX
3463e12c5d1SDavid du Colombier	MOVL	a+4(FP),DI
3473e12c5d1SDavid du Colombier	MOVL	c+8(FP),CX
3483e12c5d1SDavid du Colombier	CLD; REP; OP16; INSL
3493e12c5d1SDavid du Colombier	RET
3503e12c5d1SDavid du Colombier
3513e12c5d1SDavid du Colombier/*
3523e12c5d1SDavid du Colombier *  output a string of shorts to a port
3533e12c5d1SDavid du Colombier */
3543e12c5d1SDavid du ColombierTEXT	outss(SB),$0
3553e12c5d1SDavid du Colombier	MOVL	p+0(FP),DX
3563e12c5d1SDavid du Colombier	MOVL	a+4(FP),SI
3573e12c5d1SDavid du Colombier	MOVL	c+8(FP),CX
3583e12c5d1SDavid du Colombier	CLD; REP; OP16; OUTSL
3593e12c5d1SDavid du Colombier	RET
3603e12c5d1SDavid du Colombier
3613e12c5d1SDavid du Colombier/*
3623e12c5d1SDavid du Colombier *  test and set
3633e12c5d1SDavid du Colombier */
3643e12c5d1SDavid du ColombierTEXT	tas(SB),$0
3653e12c5d1SDavid du Colombier	MOVL	$0xdeadead,AX
3663e12c5d1SDavid du Colombier	MOVL	l+0(FP),BX
3673e12c5d1SDavid du Colombier	XCHGL	AX,(BX)
3683e12c5d1SDavid du Colombier	RET
3693e12c5d1SDavid du Colombier
3703e12c5d1SDavid du Colombier/*
3713e12c5d1SDavid du Colombier *  routines to load/read various system registers
3723e12c5d1SDavid du Colombier */
3733e12c5d1SDavid du ColombierGLOBL	idtptr(SB),$6
3743e12c5d1SDavid du ColombierTEXT	putidt(SB),$0		/* interrupt descriptor table */
3753e12c5d1SDavid du Colombier	MOVL	t+0(FP),AX
3763e12c5d1SDavid du Colombier	MOVL	AX,idtptr+2(SB)
3773e12c5d1SDavid du Colombier	MOVL	l+4(FP),AX
3783e12c5d1SDavid du Colombier	MOVW	AX,idtptr(SB)
3793e12c5d1SDavid du Colombier	MOVL	idtptr(SB),IDTR
3803e12c5d1SDavid du Colombier	RET
3813e12c5d1SDavid du Colombier
3823e12c5d1SDavid du ColombierGLOBL	gdtptr(SB),$6
3833e12c5d1SDavid du ColombierTEXT	putgdt(SB),$0		/* global descriptor table */
3843e12c5d1SDavid du Colombier	MOVL	t+0(FP),AX
3853e12c5d1SDavid du Colombier	MOVL	AX,gdtptr+2(SB)
3863e12c5d1SDavid du Colombier	MOVL	l+4(FP),AX
3873e12c5d1SDavid du Colombier	MOVW	AX,gdtptr(SB)
3883e12c5d1SDavid du Colombier	MOVL	gdtptr(SB),GDTR
3893e12c5d1SDavid du Colombier	RET
3903e12c5d1SDavid du Colombier
3913e12c5d1SDavid du ColombierTEXT	putcr3(SB),$0		/* top level page table pointer */
3923e12c5d1SDavid du Colombier	MOVL	t+0(FP),AX
3933e12c5d1SDavid du Colombier	MOVL	AX,CR3
3943e12c5d1SDavid du Colombier	RET
3953e12c5d1SDavid du Colombier
3963e12c5d1SDavid du ColombierTEXT	puttr(SB),$0		/* task register */
3973e12c5d1SDavid du Colombier	MOVL	t+0(FP),AX
3983e12c5d1SDavid du Colombier	MOVW	AX,TASK
3993e12c5d1SDavid du Colombier	RET
4003e12c5d1SDavid du Colombier
4013e12c5d1SDavid du ColombierTEXT	getcr0(SB),$0		/* coprocessor bits */
4023e12c5d1SDavid du Colombier	MOVL	CR0,AX
4033e12c5d1SDavid du Colombier	RET
4043e12c5d1SDavid du Colombier
4053e12c5d1SDavid du ColombierTEXT	getcr2(SB),$0		/* fault address */
4063e12c5d1SDavid du Colombier	MOVL	CR2,AX
4073e12c5d1SDavid du Colombier	RET
4083e12c5d1SDavid du Colombier
4093e12c5d1SDavid du Colombier#define	FPOFF\
4103e12c5d1SDavid du Colombier	WAIT;\
4113e12c5d1SDavid du Colombier	MOVL	CR0,AX;\
4123e12c5d1SDavid du Colombier	ORL	$0x4,AX		/* EM=1 */;\
4133e12c5d1SDavid du Colombier	MOVL	AX,CR0
4143e12c5d1SDavid du Colombier
4153e12c5d1SDavid du Colombier#define	FPON\
4163e12c5d1SDavid du Colombier	MOVL	CR0,AX;\
4173e12c5d1SDavid du Colombier	ANDL	$~0x4,AX	/* EM=0 */;\
4183e12c5d1SDavid du Colombier	MOVL	AX,CR0
4193e12c5d1SDavid du Colombier
4203e12c5d1SDavid du ColombierTEXT	fpoff(SB),$0		/* turn off floating point */
4213e12c5d1SDavid du Colombier	FPOFF
4223e12c5d1SDavid du Colombier	RET
4233e12c5d1SDavid du Colombier
4243e12c5d1SDavid du ColombierTEXT	fpinit(SB),$0		/* turn on & init the floating point */
4253e12c5d1SDavid du Colombier	FPON
4263e12c5d1SDavid du Colombier	FINIT
4273e12c5d1SDavid du Colombier	WAIT
4283e12c5d1SDavid du Colombier	PUSHW	$0x0330
4293e12c5d1SDavid du Colombier	FLDCW	0(SP)		/* ignore underflow/precision, signal others */
4303e12c5d1SDavid du Colombier	POPW	AX
4313e12c5d1SDavid du Colombier	WAIT
4323e12c5d1SDavid du Colombier	RET
4333e12c5d1SDavid du Colombier
4343e12c5d1SDavid du ColombierTEXT	fpsave(SB),$0		/* save floating point state and turn off */
4353e12c5d1SDavid du Colombier	MOVL	p+0(FP),AX
4363e12c5d1SDavid du Colombier	WAIT
4373e12c5d1SDavid du Colombier	FSAVE	0(AX)
4383e12c5d1SDavid du Colombier	FPOFF
4393e12c5d1SDavid du Colombier	RET
4403e12c5d1SDavid du Colombier
4413e12c5d1SDavid du ColombierTEXT	fprestore(SB),$0	/* turn on floating point and restore regs */
4423e12c5d1SDavid du Colombier	FPON
4433e12c5d1SDavid du Colombier	MOVL	p+0(FP),AX
4443e12c5d1SDavid du Colombier	FRSTOR	0(AX)
4453e12c5d1SDavid du Colombier	WAIT
4463e12c5d1SDavid du Colombier	RET
4473e12c5d1SDavid du Colombier
4483e12c5d1SDavid du ColombierTEXT	fpstatus(SB),$0		/* get floating point status */
4493e12c5d1SDavid du Colombier	FSTSW	AX
4503e12c5d1SDavid du Colombier	RET
4513e12c5d1SDavid du Colombier
4523e12c5d1SDavid du Colombier/*
4533e12c5d1SDavid du Colombier *  special traps
4543e12c5d1SDavid du Colombier */
4553e12c5d1SDavid du ColombierTEXT	intr0(SB),$0
4563e12c5d1SDavid du Colombier	PUSHL	$0
4573e12c5d1SDavid du Colombier	PUSHL	$0
4583e12c5d1SDavid du Colombier	JMP	intrcommon
4593e12c5d1SDavid du ColombierTEXT	intr1(SB),$0
4603e12c5d1SDavid du Colombier	PUSHL	$0
4613e12c5d1SDavid du Colombier	PUSHL	$1
4623e12c5d1SDavid du Colombier	JMP	intrcommon
4633e12c5d1SDavid du ColombierTEXT	intr2(SB),$0
4643e12c5d1SDavid du Colombier	PUSHL	$0
4653e12c5d1SDavid du Colombier	PUSHL	$2
4663e12c5d1SDavid du Colombier	JMP	intrcommon
4673e12c5d1SDavid du ColombierTEXT	intr3(SB),$0
4683e12c5d1SDavid du Colombier	PUSHL	$0
4693e12c5d1SDavid du Colombier	PUSHL	$3
4703e12c5d1SDavid du Colombier	JMP	intrcommon
4713e12c5d1SDavid du ColombierTEXT	intr4(SB),$0
4723e12c5d1SDavid du Colombier	PUSHL	$0
4733e12c5d1SDavid du Colombier	PUSHL	$4
4743e12c5d1SDavid du Colombier	JMP	intrcommon
4753e12c5d1SDavid du ColombierTEXT	intr5(SB),$0
4763e12c5d1SDavid du Colombier	PUSHL	$0
4773e12c5d1SDavid du Colombier	PUSHL	$5
4783e12c5d1SDavid du Colombier	JMP	intrcommon
4793e12c5d1SDavid du ColombierTEXT	intr6(SB),$0
4803e12c5d1SDavid du Colombier	PUSHL	$0
4813e12c5d1SDavid du Colombier	PUSHL	$6
4823e12c5d1SDavid du Colombier	JMP	intrcommon
4833e12c5d1SDavid du ColombierTEXT	intr7(SB),$0
4843e12c5d1SDavid du Colombier	PUSHL	$0
4853e12c5d1SDavid du Colombier	PUSHL	$7
4863e12c5d1SDavid du Colombier	JMP	intrcommon
4873e12c5d1SDavid du ColombierTEXT	intr8(SB),$0
4883e12c5d1SDavid du Colombier	PUSHL	$8
4893e12c5d1SDavid du Colombier	JMP	intrscommon
4903e12c5d1SDavid du ColombierTEXT	intr9(SB),$0
4913e12c5d1SDavid du Colombier	PUSHL	$0
4923e12c5d1SDavid du Colombier	PUSHL	$9
4933e12c5d1SDavid du Colombier	JMP	intrcommon
4943e12c5d1SDavid du ColombierTEXT	intr10(SB),$0
4953e12c5d1SDavid du Colombier	PUSHL	$10
4963e12c5d1SDavid du Colombier	JMP	intrscommon
4973e12c5d1SDavid du ColombierTEXT	intr11(SB),$0
4983e12c5d1SDavid du Colombier	PUSHL	$11
4993e12c5d1SDavid du Colombier	JMP	intrscommon
5003e12c5d1SDavid du ColombierTEXT	intr12(SB),$0
5013e12c5d1SDavid du Colombier	PUSHL	$12
5023e12c5d1SDavid du Colombier	JMP	intrscommon
5033e12c5d1SDavid du ColombierTEXT	intr13(SB),$0
5043e12c5d1SDavid du Colombier	PUSHL	$13
5053e12c5d1SDavid du Colombier	JMP	intrscommon
5063e12c5d1SDavid du ColombierTEXT	intr14(SB),$0
5073e12c5d1SDavid du Colombier	PUSHL	$14
5083e12c5d1SDavid du Colombier	JMP	intrscommon
5093e12c5d1SDavid du ColombierTEXT	intr15(SB),$0
5103e12c5d1SDavid du Colombier	PUSHL	$0
5113e12c5d1SDavid du Colombier	PUSHL	$15
5123e12c5d1SDavid du Colombier	JMP	intrcommon
5133e12c5d1SDavid du ColombierTEXT	intr16(SB),$0
5143e12c5d1SDavid du Colombier	PUSHL	$0
5153e12c5d1SDavid du Colombier	PUSHL	$16
5163e12c5d1SDavid du Colombier	JMP	intrcommon
5173e12c5d1SDavid du ColombierTEXT	intr24(SB),$0
5183e12c5d1SDavid du Colombier	PUSHL	$0
5193e12c5d1SDavid du Colombier	PUSHL	$24
5203e12c5d1SDavid du Colombier	JMP	intrcommon
5213e12c5d1SDavid du ColombierTEXT	intr25(SB),$0
5223e12c5d1SDavid du Colombier	PUSHL	$0
5233e12c5d1SDavid du Colombier	PUSHL	$25
5243e12c5d1SDavid du Colombier	JMP	intrcommon
5253e12c5d1SDavid du ColombierTEXT	intr26(SB),$0
5263e12c5d1SDavid du Colombier	PUSHL	$0
5273e12c5d1SDavid du Colombier	PUSHL	$26
5283e12c5d1SDavid du Colombier	JMP	intrcommon
5293e12c5d1SDavid du ColombierTEXT	intr27(SB),$0
5303e12c5d1SDavid du Colombier	PUSHL	$0
5313e12c5d1SDavid du Colombier	PUSHL	$27
5323e12c5d1SDavid du Colombier	JMP	intrcommon
5333e12c5d1SDavid du ColombierTEXT	intr28(SB),$0
5343e12c5d1SDavid du Colombier	PUSHL	$0
5353e12c5d1SDavid du Colombier	PUSHL	$28
5363e12c5d1SDavid du Colombier	JMP	intrcommon
5373e12c5d1SDavid du ColombierTEXT	intr29(SB),$0
5383e12c5d1SDavid du Colombier	PUSHL	$0
5393e12c5d1SDavid du Colombier	PUSHL	$29
5403e12c5d1SDavid du Colombier	JMP	intrcommon
5413e12c5d1SDavid du ColombierTEXT	intr30(SB),$0
5423e12c5d1SDavid du Colombier	PUSHL	$0
5433e12c5d1SDavid du Colombier	PUSHL	$30
5443e12c5d1SDavid du Colombier	JMP	intrcommon
5453e12c5d1SDavid du ColombierTEXT	intr31(SB),$0
5463e12c5d1SDavid du Colombier	PUSHL	$0
5473e12c5d1SDavid du Colombier	PUSHL	$31
5483e12c5d1SDavid du Colombier	JMP	intrcommon
5493e12c5d1SDavid du ColombierTEXT	intr32(SB),$0
5503e12c5d1SDavid du Colombier	PUSHL	$0
5513e12c5d1SDavid du Colombier	PUSHL	$16
5523e12c5d1SDavid du Colombier	JMP	intrcommon
5533e12c5d1SDavid du ColombierTEXT	intr33(SB),$0
5543e12c5d1SDavid du Colombier	PUSHL	$0
5553e12c5d1SDavid du Colombier	PUSHL	$33
5563e12c5d1SDavid du Colombier	JMP	intrcommon
5573e12c5d1SDavid du ColombierTEXT	intr34(SB),$0
5583e12c5d1SDavid du Colombier	PUSHL	$0
5593e12c5d1SDavid du Colombier	PUSHL	$34
5603e12c5d1SDavid du Colombier	JMP	intrcommon
5613e12c5d1SDavid du ColombierTEXT	intr35(SB),$0
5623e12c5d1SDavid du Colombier	PUSHL	$0
5633e12c5d1SDavid du Colombier	PUSHL	$35
5643e12c5d1SDavid du Colombier	JMP	intrcommon
5653e12c5d1SDavid du ColombierTEXT	intr36(SB),$0
5663e12c5d1SDavid du Colombier	PUSHL	$0
5673e12c5d1SDavid du Colombier	PUSHL	$36
5683e12c5d1SDavid du Colombier	JMP	intrcommon
5693e12c5d1SDavid du ColombierTEXT	intr37(SB),$0
5703e12c5d1SDavid du Colombier	PUSHL	$0
5713e12c5d1SDavid du Colombier	PUSHL	$37
5723e12c5d1SDavid du Colombier	JMP	intrcommon
5733e12c5d1SDavid du ColombierTEXT	intr38(SB),$0
5743e12c5d1SDavid du Colombier	PUSHL	$0
5753e12c5d1SDavid du Colombier	PUSHL	$38
5763e12c5d1SDavid du Colombier	JMP	intrcommon
5773e12c5d1SDavid du ColombierTEXT	intr39(SB),$0
5783e12c5d1SDavid du Colombier	PUSHL	$0
5793e12c5d1SDavid du Colombier	PUSHL	$39
5803e12c5d1SDavid du Colombier	JMP	intrcommon
5813e12c5d1SDavid du ColombierTEXT	intr64(SB),$0
5823e12c5d1SDavid du Colombier	PUSHL	$0
5833e12c5d1SDavid du Colombier	PUSHL	$64
5843e12c5d1SDavid du Colombier	JMP	intrcommon
5853e12c5d1SDavid du ColombierTEXT	intrbad(SB),$0
5863e12c5d1SDavid du Colombier	PUSHL	$0
5873e12c5d1SDavid du Colombier	PUSHL	$0x1ff
5883e12c5d1SDavid du Colombier	JMP	intrcommon
5893e12c5d1SDavid du Colombier
5903e12c5d1SDavid du Colombierintrcommon:
5913e12c5d1SDavid du Colombier	PUSHL	DS
5923e12c5d1SDavid du Colombier	PUSHL	ES
5933e12c5d1SDavid du Colombier	PUSHL	FS
5943e12c5d1SDavid du Colombier	PUSHL	GS
5953e12c5d1SDavid du Colombier	PUSHAL
5963e12c5d1SDavid du Colombier	MOVL	$(KDSEL),AX
5973e12c5d1SDavid du Colombier	MOVW	AX,DS
5983e12c5d1SDavid du Colombier	MOVW	AX,ES
5993e12c5d1SDavid du Colombier	LEAL	0(SP),AX
6003e12c5d1SDavid du Colombier	PUSHL	AX
6013e12c5d1SDavid du Colombier	CALL	trap(SB)
6023e12c5d1SDavid du Colombier	POPL	AX
6033e12c5d1SDavid du Colombier	POPAL
6043e12c5d1SDavid du Colombier	POPL	GS
6053e12c5d1SDavid du Colombier	POPL	FS
6063e12c5d1SDavid du Colombier	POPL	ES
6073e12c5d1SDavid du Colombier	POPL	DS
6083e12c5d1SDavid du Colombier	ADDL	$8,SP	/* error code and trap type */
6093e12c5d1SDavid du Colombier	IRETL
6103e12c5d1SDavid du Colombier
6113e12c5d1SDavid du Colombierintrscommon:
6123e12c5d1SDavid du Colombier	PUSHL	DS
6133e12c5d1SDavid du Colombier	PUSHL	ES
6143e12c5d1SDavid du Colombier	PUSHL	FS
6153e12c5d1SDavid du Colombier	PUSHL	GS
6163e12c5d1SDavid du Colombier	PUSHAL
6173e12c5d1SDavid du Colombier	MOVL	$(KDSEL),AX
6183e12c5d1SDavid du Colombier	MOVW	AX,DS
6193e12c5d1SDavid du Colombier	MOVW	AX,ES
6203e12c5d1SDavid du Colombier	LEAL	0(SP),AX
6213e12c5d1SDavid du Colombier	PUSHL	AX
6223e12c5d1SDavid du Colombier	CALL	trap(SB)
6233e12c5d1SDavid du Colombier	POPL	AX
6243e12c5d1SDavid du Colombier	POPAL
6253e12c5d1SDavid du Colombier	POPL	GS
6263e12c5d1SDavid du Colombier	POPL	FS
6273e12c5d1SDavid du Colombier	POPL	ES
6283e12c5d1SDavid du Colombier	POPL	DS
6293e12c5d1SDavid du Colombier	ADDL	$8,SP	/* error code and trap type */
6303e12c5d1SDavid du Colombier	IRETL
6313e12c5d1SDavid du Colombier
6323e12c5d1SDavid du Colombier/*
6333e12c5d1SDavid du Colombier *  interrupt level is interrupts on or off
6343e12c5d1SDavid du Colombier */
6353e12c5d1SDavid du ColombierTEXT	spllo(SB),$0
6363e12c5d1SDavid du Colombier	PUSHFL
6373e12c5d1SDavid du Colombier	POPL	AX
6383e12c5d1SDavid du Colombier	STI
6393e12c5d1SDavid du Colombier	RET
6403e12c5d1SDavid du Colombier
6413e12c5d1SDavid du ColombierTEXT	splhi(SB),$0
6423e12c5d1SDavid du Colombier	PUSHFL
6433e12c5d1SDavid du Colombier	POPL	AX
6443e12c5d1SDavid du Colombier	CLI
6453e12c5d1SDavid du Colombier	RET
6463e12c5d1SDavid du Colombier
6473e12c5d1SDavid du ColombierTEXT	splx(SB),$0
6483e12c5d1SDavid du Colombier	MOVL	s+0(FP),AX
6493e12c5d1SDavid du Colombier	PUSHL	AX
6503e12c5d1SDavid du Colombier	POPFL
6513e12c5d1SDavid du Colombier	RET
6523e12c5d1SDavid du Colombier
6533e12c5d1SDavid du Colombier/*
6543e12c5d1SDavid du Colombier *  do nothing whatsoever till interrupt happens
6553e12c5d1SDavid du Colombier */
6563e12c5d1SDavid du ColombierTEXT	idle(SB),$0
6573e12c5d1SDavid du Colombier	HLT
6583e12c5d1SDavid du Colombier	RET
6593e12c5d1SDavid du Colombier
6603e12c5d1SDavid du Colombier/*
6613e12c5d1SDavid du Colombier *  label consists of a stack pointer and a PC
6623e12c5d1SDavid du Colombier */
6633e12c5d1SDavid du ColombierTEXT	gotolabel(SB),$0
6643e12c5d1SDavid du Colombier	MOVL	l+0(FP),AX
6653e12c5d1SDavid du Colombier	MOVL	0(AX),SP	/* restore sp */
6663e12c5d1SDavid du Colombier	MOVL	4(AX),AX	/* put return pc on the stack */
6673e12c5d1SDavid du Colombier	MOVL	AX,0(SP)
6683e12c5d1SDavid du Colombier	MOVL	$1,AX		/* return 1 */
6693e12c5d1SDavid du Colombier	RET
6703e12c5d1SDavid du Colombier
6713e12c5d1SDavid du ColombierTEXT	setlabel(SB),$0
6723e12c5d1SDavid du Colombier	MOVL	l+0(FP),AX
6733e12c5d1SDavid du Colombier	MOVL	SP,0(AX)	/* store sp */
6743e12c5d1SDavid du Colombier	MOVL	0(SP),BX	/* store return pc */
6753e12c5d1SDavid du Colombier	MOVL	BX,4(AX)
6763e12c5d1SDavid du Colombier	MOVL	$0,AX		/* return 0 */
6773e12c5d1SDavid du Colombier	RET
6783e12c5d1SDavid du Colombier
6793e12c5d1SDavid du Colombier/*
6803e12c5d1SDavid du Colombier *  Used to get to the first process.
6813e12c5d1SDavid du Colombier *  Set up an interrupt return frame and IRET to user level.
6823e12c5d1SDavid du Colombier */
6833e12c5d1SDavid du ColombierTEXT	touser(SB),$0
6843e12c5d1SDavid du Colombier	PUSHL	$(UDSEL)		/* old ss */
6853e12c5d1SDavid du Colombier	PUSHL	$(USTKTOP)		/* old sp */
6863e12c5d1SDavid du Colombier	PUSHFL				/* old flags */
6873e12c5d1SDavid du Colombier	PUSHL	$(UESEL)		/* old cs */
6883e12c5d1SDavid du Colombier	PUSHL	$(UTZERO+32)		/* old pc */
6893e12c5d1SDavid du Colombier	MOVL	$(UDSEL),AX
6903e12c5d1SDavid du Colombier	MOVW	AX,DS
6913e12c5d1SDavid du Colombier	MOVW	AX,ES
6923e12c5d1SDavid du Colombier	MOVW	AX,GS
6933e12c5d1SDavid du Colombier	MOVW	AX,FS
6943e12c5d1SDavid du Colombier	IRETL
6953e12c5d1SDavid du Colombier
6963e12c5d1SDavid du Colombier/*
6973e12c5d1SDavid du Colombier *  set configuration register
6983e12c5d1SDavid du Colombier */
6993e12c5d1SDavid du ColombierTEXT	config(SB),$0
7003e12c5d1SDavid du Colombier	MOVL	l+0(FP),AX
7013e12c5d1SDavid du Colombier	MOVL	$0x3F3,DX
7023e12c5d1SDavid du Colombier	OUTB
7033e12c5d1SDavid du Colombier	OUTB
7043e12c5d1SDavid du Colombier	RET
705