File:  [MW Coherent from dump] / coherent / b / kernel / i386 / xdt.s
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:37 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

	.unixorder
	.llen	132
	.include	as.inc
	.text
	.alignoff
	.align	4

/	the init gdt is in the text segment since the data segment
/	is relocated after we switch into 386 mode (when a
/	valid gdt is required)

gdtinit:				/ used before turning on paging
	.value	gdtend-gdt-1		/ limit of gdt
					/ gdt physical addr is 0x0040_2000+gdt
	.long	[[[-SBASE]+PBASE]<<BPCSHIFT]+gdt
	.value	0
gdtmap:					/ used after paging is enabled
	.value	gdtend-gdt-1		/ limit of gdt
	.long	gdt
	.value	0

idtmap:					/ used after paging is enabled
	.value	2047
	.long	idt
	.value	0

////
/
/ Macro MEM_SEG specifies a memory segment descriptor.
/ base is 32 bits
/ limit is 20 bits
/ type is 4 bits
/ dpl is 2 bits
/ flags is the 4 high bits of byte at descriptor + 6
/   8's bit of flags is limit granularity (0:byte 1:click)
/   4's bit of flags is default op size (0:16 bit 1:32 bit)
/
////

MEM_SEG	.macro	base,limit,type,dpl,flags
	.value	limit
	.value	base
	.byte	[base] >> 16
	.byte	0x90 | [[[dpl] & 3] << 5] | [[type] & 0xF]
	.byte	[[[flags] << 4] & 0xF0] | [[[limit] >> 16] & 0xF]
	.byte	[base] >> 24
	.endm

////
/
/ Macro TSS_SEG specifies a tss segment descriptor.
/ base is 32 bits
/ limit is 20 bits
/ [type is 0x9]
/ [dpl is 0]
/ gran is limit granularity (0:byte 1:click)
/
////

TSS_SEG	.macro	base,limit,gran
	.value	limit
	.value	base
	.byte	[base] >> 16
	.byte	0x89
	.byte	[[[gran] << 7] & 0x80] | [[[limit] >> 16] & 0xF]
	.byte	[base] >> 24
	.endm

////
/
/ Macro LDT_SEG specifies a tss segment descriptor.
/ base is 32 bits
/ limit is 20 bits
/ [type is 0x2]
/ [dpl is 0]
/ gran is limit granularity (0:byte 1:click)
/
////

LDT_SEG	.macro	base,limit,gran
	.value	limit
	.value	base
	.byte	[base] >> 16
	.byte	0x82
	.byte	[[[gran] << 7] & 0x80] | [[[limit] >> 16] & 0xF]
	.byte	[base] >> 24
	.endm

////
/
/ Macro CALL_GATE specifies a call gate descriptor.
/ selector is 16 bits
/ offset is 32 bits
/ dwdcount is 5 bits
/ dpl is 2 bits
/
/ Would like the following, but can't shift offset since it's a symbol.
/	.value	offset
/	.value	selector
/	.value	0x8C00 | [[dwdcount] & 0x1F] | [[[dpl] & 3] << 13]
/	.value	[offset] >> 16
/
/ IMPORTANT!!!
/ This macro does not create a proper call gate.  
/ Count on idtinit() to swap 16-bit words at macro+2, macro+6.
/
////

CALL_GATE	.macro	selector,offset,dwdcount,dpl

	.long	offset
	.value	0x8C00 | [[dwdcount] & 0x1F] | [[[dpl] & 3] << 13]
	.value	selector
	.endm

////
/
/ "segment xxxx" below gives the value in a segment register corresponding
/ to the given descriptor.  The low 3 bits in a segment register are not
/ used in indexing into the descriptor table.
/
////

	.set	DPL_0,0
	.set	DPL_1,1
	.set	DPL_2,2
	.set	DPL_3,3

gdt:
	/ segment 0000
	.long	0,0			/ null entry

	/ segment 0008 - SEG_386_UI
	MEM_SEG	0,0xFFFFF,0xB,DPL_3,0xC

	/ segment 0010 - SEG_386_UD
	MEM_SEG	0,0xFFFFF,0x3,DPL_3,0xC

	/ segment 0018 - SEG_RNG0_TXT/SEG_386_KI
	MEM_SEG	0,0xFFFFF,0xB,DPL_0,0xC

	/ segment 0020 - SEG_386_KD
	MEM_SEG	0,0xFFFFF,0x3,DPL_1,0xC

	/ segment 0028 - SEG_286_UI
	MEM_SEG	0,0xF,0xB,DPL_3,0x8

	/ segment 0030 - SEG_286_UD
	MEM_SEG	0,0xF,0x3,DPL_3,0x8

	/ segment 0038 - SEG_TSS
	/ limit is 0x68 + (number of bytes in iomap)
	/ This allows the required filler byte beyond desired addressing.
	TSS_SEG	0xFFC00000,TSS_IOMAP_OFF+[TSS_IOMAP_LEN .div 8]+3,0

	/ segment 0040 - SEG_ROM
	MEM_SEG	0xFFFC0000,0xF,0x3,DPL_0,0x8

	/ segment 0048 - SEG_VIDEOa
	MEM_SEG	0xFFFB0000,0xF,0x3,DPL_1,0x8

	/ segment 0050 - SEG_VIDEOb
	MEM_SEG	0xFFFA0000,0xF,0x3,DPL_1,0x8

	/ segment 0058 - SEG_386_II	/ init code (text)
	MEM_SEG	0x400000+[PBASE<<BPCSHIFT],0xFFFFF,0xB,DPL_0,0xC

	/ segment 0060 - SEG_386_ID	/ init code (data)
	MEM_SEG	0x400000+[PBASE<<BPCSHIFT],0xFFFFF,0x3,DPL_0,0xC

	/ segment 0068 - SEG_286_UII
	MEM_SEG	0x400000,0xF,0xB,DPL_3,0x8

	/ segment 0070 - SEG_LDT
	LDT_SEG	0xFFC00000,0xF,0

	/ segment 0078 - SEG_RNG0_STK
	MEM_SEG	0,0xFFBFF,0x7,DPL_0,0xC

	/ segment 0080 - SEG_RNG1_TXT
	MEM_SEG	0,0xFFFFF,0xB,DPL_1,0xC

	/ segment 0088 - SEG_RNG1_STK
	MEM_SEG	0,0xFFFFE,0x7,DPL_1,0xC

	/ Call gates need idtinit() to fix them before they can be used.
	.globl	gdtFixBegin
	.globl	gdtFixEnd
gdtFixBegin:
	/ segment 0090 - SEG_MMUUPD - Call gate for mmu update
	CALL_GATE	SEG_RNG0_TXT,mmuupdfR0,0,DPL_1

	/ segment 0098 - SEG_SET_EM - Call gate for writing CR0 EM bit
	CALL_GATE	SEG_RNG0_TXT,setEmfR0,1,DPL_1
gdtFixEnd:
gdtend:

/	The two entries in the ldt are call gates whose format is somewhat
/	different from the other segment descriptors
/
/	BCS compatibility requires an LDT

ldt:
	/ ldt + 0000
	CALL_GATE	SEG_RNG1_TXT,syc32,1,DPL_3
/	.long	syc32				/ call gate for system call
/	.long	0xFFC0EC01

	/ ldt + 0008
/	.long	sig32				/ call gate for signal return
/	.long	0xFFC0EC01
	CALL_GATE	SEG_RNG1_TXT,sig32,1,DPL_3
ldtend:

////
/
/ Macro IRPT_GATE specifies a call gate descriptor.
/ selector is 16 bits
/ offset is 32 bits
/ dwdcount is 5 bits
/ dpl is 2 bits
/
/ Would like the following, but can't shift offset since it's a symbol.
/	.value	offset
/	.value	selector
/	.value	0x8E00 | [[dwdcount] & 0x1F] | [[[dpl] & 3] << 13]
/	.value	[offset] >> 16
/
/ IMPORTANT!!!
/ This macro does not create a proper interrupt gate.  
/ Count on idtinit() to swap 16-bit words at macro+2, macro+6.
/
////

IRPT_GATE	.macro	selector,offset,dwdcount,dpl

	.long	offset
	.value	0x8E00 | [[dwdcount] & 0x1F] | [[[dpl] & 3] << 13]
	.value	selector
	.endm

idt:
	IRPT_GATE	SEG_RNG1_TXT,trap0,0,DPL_3
/	IRPT_GATE	SEG_RNG0_TXT,trap1_ker,0,DPL_3	/ Ring 0
	IRPT_GATE	SEG_RNG1_TXT,trap1_usr,0,DPL_3	/ Ring 1
	IRPT_GATE	SEG_RNG1_TXT,trap2,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap3,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap4,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap5,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap6,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap7,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap8,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap9,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap10,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap11,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,trap12,0,DPL_3
	IRPT_GATE	SEG_RNG0_TXT,trap13,0,DPL_3	/ Ring 0!
	IRPT_GATE	SEG_RNG1_TXT,trap14,0,DPL_3
	.long	0,0
	IRPT_GATE	SEG_RNG1_TXT,trap16,0,DPL_3
	.org	.+0x78
	IRPT_GATE	SEG_RNG1_TXT,clk,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev1,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev9,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev3,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev4,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev5,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev6,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev7,0,DPL_3
	.org	.+0x240
	IRPT_GATE	SEG_RNG1_TXT,dev8,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev9,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev10,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev11,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev12,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev13,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev14,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,dev15,0,DPL_3
	.org	.+0x40
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	IRPT_GATE	SEG_RNG1_TXT,syc,0,DPL_3
	.long	0
idtend:
	.align	4
	.long	0,0,0,0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.