149 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			149 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  | Copyright (C) 2015-2019 The University of Notre Dame | ||
|  | This software is distributed under the GNU General Public License. | ||
|  | See the file LICENSE for details. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef X86_H
 | ||
|  | #define X86_H
 | ||
|  | 
 | ||
|  | #include "kernel/types.h"
 | ||
|  | 
 | ||
|  | #define X86_SEGMENT_SELECTOR( seg, rpl )  (((seg)<<3)+(rpl))
 | ||
|  | 
 | ||
|  | #define X86_SEGMENT_KERNEL_CODE  X86_SEGMENT_SELECTOR(1,0)
 | ||
|  | #define X86_SEGMENT_KERNEL_DATA  X86_SEGMENT_SELECTOR(2,0)
 | ||
|  | #define X86_SEGMENT_USER_CODE    X86_SEGMENT_SELECTOR(3,3)
 | ||
|  | #define X86_SEGMENT_USER_DATA    X86_SEGMENT_SELECTOR(4,3)
 | ||
|  | #define X86_SEGMENT_TSS          X86_SEGMENT_SELECTOR(5,0)
 | ||
|  | 
 | ||
|  | struct x86_eflags { | ||
|  | 	unsigned carry:1; | ||
|  | 	unsigned reserved0:1; | ||
|  | 	unsigned parity:1; | ||
|  | 	unsigned reserved1:1; | ||
|  | 
 | ||
|  | 	unsigned auxcarry:1; | ||
|  | 	unsigned reserved2:1; | ||
|  | 	unsigned zero:1; | ||
|  | 	unsigned sign:1; | ||
|  | 
 | ||
|  | 	unsigned trap:1; | ||
|  | 	unsigned interrupt:1; | ||
|  | 	unsigned direction:1; | ||
|  | 	unsigned overflow:1; | ||
|  | 
 | ||
|  | 	unsigned iopl:2; | ||
|  | 	unsigned nested:1; | ||
|  | 	unsigned reserved3:1; | ||
|  | 
 | ||
|  | 	unsigned resume:1; | ||
|  | 	unsigned v86:1; | ||
|  | 	unsigned align:1; | ||
|  | 	unsigned vinterrupt:1; | ||
|  | 
 | ||
|  | 	unsigned vpending:1; | ||
|  | 	unsigned id:1; | ||
|  | }; | ||
|  | 
 | ||
|  | struct x86_regs { | ||
|  | 	int32_t eax; | ||
|  | 	int32_t ebx; | ||
|  | 	int32_t ecx; | ||
|  | 	int32_t edx; | ||
|  | 	int32_t esi; | ||
|  | 	int32_t edi; | ||
|  | 	int32_t ebp; | ||
|  | }; | ||
|  | 
 | ||
|  | struct x86_stack { | ||
|  | 	/* Registers saved by process_switch */ | ||
|  | 	struct x86_regs regs2; | ||
|  | 	/* Stack frame of process_switch */ | ||
|  | 	int32_t old_ebp; | ||
|  | 	int32_t old_eip; | ||
|  | 	/* Pushed by intr_handler in kernelcore */ | ||
|  | 	struct x86_regs regs1; | ||
|  | 	int32_t gs; | ||
|  | 	int32_t fs; | ||
|  | 	int32_t es; | ||
|  | 	int32_t ds; | ||
|  | 	/* Pushed by intrXX in kernelcore. */ | ||
|  | 	int32_t intr_num; | ||
|  | 	int32_t intr_code; | ||
|  | 	/* Pushed by X86 CPU Hardware. */ | ||
|  | 	int32_t eip; | ||
|  | 	int32_t cs; | ||
|  | 	struct x86_eflags eflags; | ||
|  | 	int32_t esp; | ||
|  | 	int32_t ss; | ||
|  | }; | ||
|  | 
 | ||
|  | struct x86_segment { | ||
|  | 	uint16_t limit0; | ||
|  | 	uint16_t base0; | ||
|  | 
 | ||
|  | 	uint8_t base1; | ||
|  | 
 | ||
|  | 	unsigned type:4; | ||
|  | 	unsigned stype:1; | ||
|  | 	unsigned dpl:2; | ||
|  | 	unsigned present:1; | ||
|  | 
 | ||
|  | 	unsigned limit1:4; | ||
|  | 	unsigned avail:1; | ||
|  | 	unsigned zero:1; | ||
|  | 	unsigned size:1; | ||
|  | 	unsigned granularity:1; | ||
|  | 
 | ||
|  | 	uint8_t base2; | ||
|  | }; | ||
|  | 
 | ||
|  | struct x86_tss { | ||
|  | 	int16_t prev; | ||
|  | 	int16_t reserved; | ||
|  | 	int32_t esp0; | ||
|  | 	int16_t ss0; | ||
|  | 	int16_t reserved0; | ||
|  | 	int32_t esp1; | ||
|  | 	int16_t ss1; | ||
|  | 	int16_t reserved1; | ||
|  | 	int32_t esp2; | ||
|  | 	int16_t ss2; | ||
|  | 	int16_t reserved2; | ||
|  | 	int32_t cr3; | ||
|  | 	int32_t eip; | ||
|  | 	int32_t eflags; | ||
|  | 	int32_t eax; | ||
|  | 	int32_t ecx; | ||
|  | 	int32_t edx; | ||
|  | 	int32_t ebx; | ||
|  | 	int32_t esp; | ||
|  | 	int32_t ebp; | ||
|  | 	int32_t esi; | ||
|  | 	int32_t edi; | ||
|  | 	int16_t es; | ||
|  | 	int16_t reserved3; | ||
|  | 	int16_t cs; | ||
|  | 	int16_t reserved4; | ||
|  | 	int16_t ss; | ||
|  | 	int16_t reserved5; | ||
|  | 	int16_t ds; | ||
|  | 	int16_t reserved6; | ||
|  | 	int16_t fs; | ||
|  | 	int16_t reserved7; | ||
|  | 	int16_t gs; | ||
|  | 	int16_t reserved8; | ||
|  | 	int16_t ldt; | ||
|  | 	int16_t reserved9; | ||
|  | 	int16_t t; | ||
|  | 	int16_t iomap; | ||
|  | }; | ||
|  | 
 | ||
|  | struct x86_gdt_init { | ||
|  | 	int16_t size; | ||
|  | 	struct x86_segment *base; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif
 |