Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									5925b2af52
								
							
						
					
					
						commit
						69d68cc839
					
				
							
								
								
									
										148
									
								
								kernel/x86.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								kernel/x86.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,148 @@ | ||||||
|  | /*
 | ||||||
|  | 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 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user