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
 |