123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- /*++
- Copyright (c) 2012 Minoca Corp. All Rights Reserved
- Module Name:
- x86.inc
- Abstract:
- This module contains common definitions for the x86 architecture.
- Author:
- Evan Green 18-Jul-2012
- Environment:
- Kernel mode
- --*/
- ##
- ## --------------------------------------------------------------- Definitions
- ##
- ##
- ## Processor flags
- ##
- #define IA32_EFLAG_TF 0x00000100
- #define IA32_EFLAG_IF 0x00000200
- #define IA32_EFLAG_IOPL_MASK 0x00003000
- #define IA32_EFLAG_VM 0x00020000
- #define IA32_EFLAG_VIF 0x00080000
- #define SEGMENT_PRIVILEGE_MASK 0x0003
- ##
- ## CR0 flags
- ##
- #define CR0_PAGING_ENABLE 0x80000000
- #define CR0_CACHE_DISABLE 0x40000000
- #define CR0_NOT_WRITE_THROUGH 0x20000000
- #define CR0_WRITE_PROTECT_ENABLE 0x00010000
- #define CR0_X87_EXCEPTIONS 0x00000020
- #define CR0_TASK_SWITCHED 0x00000008
- #define CR0_EMULATE_FPU 0x00000004
- #define CR0_MONITOR_COPROCESSOR 0x00000002
- #define CR0_PROTECTED_MODE 0x00000001
- #define CR0_OR_MASK 0x8001002B
- #define CR0_AND_MASK ~(0x60000004)
- ##
- ## Basic constants.
- ##
- #define FALSE 0
- #define TRUE 1
- #define NULL 0
- ##
- ## Kernel constants.
- ##
- #define KERNEL_CS 0x08
- #define KERNEL_DS 0x10
- #define USER_CS (0x18 | 3)
- #define USER_DS (0x20 | 3)
- #define GDT_PROCESSOR 0x28
- #define GDT_THREAD (0x30 | 3)
- #define KERNEL_TSS 0x38
- #define DOUBLE_FAULT_TSS 0x40
- #define NMI_TSS 0x48
- #define GDT_ENTRIES 10
- #define EXCEPTION_NMI 0x02
- #define EXCEPTION_BREAK 0x03
- #define EXCEPTION_SINGLE_STEP 0x04
- #define EXCEPTION_ACCESS_VIOLATION 0x05
- #define EXCEPTION_ASSERTION_FAILURE 0x07
- #define EXCEPTION_DOUBLE_FAULT 0x0C
- #define CONTEXT_SWAP_MAGIC 0x5A4A3A2A
- ##
- ## Relevant TSS structure definitions.
- ##
- #define TSS_ESP0 0x04
- ##
- ## Processor block offsets.
- ##
- #define PROCESSOR_BLOCK_TSS 0x0C
- #define PROCESSOR_BLOCK_GDT 0x10
- ##
- ## Definition for the TRAP_FRAME structure and the exception stack directly
- ## above it.
- ##
- #define TRAP_DS 0
- #define TRAP_ES 4
- #define TRAP_FS 8
- #define TRAP_GS 12
- #define TRAP_SS 16
- #define TRAP_EAX 20
- #define TRAP_EBX 24
- #define TRAP_ECX 28
- #define TRAP_EDX 32
- #define TRAP_ESI 36
- #define TRAP_EDI 40
- #define TRAP_EBP 44
- #define TRAP_ERRORCODE 48
- #define TRAP_EIP 52
- #define TRAP_CS 56
- #define TRAP_EFLAGS 60
- #define TRAP_ESP 64
- #define TRAP_RET_ERRORCODE 68
- #define TRAP_RET_EIP 72
- #define TRAP_RET_CS 76
- #define TRAP_RET_EFLAGS 80
- #define TRAP_RET_ESP 84
- #define TRAP_RET_SS 88
- #define TRAP_RET_ES 92
- #define TRAP_RET_DS 96
- #define TRAP_RET_FS 100
- #define TRAP_RET_GS 104
- #define TRAP_FRAME_SIZE 68
- #define PROCESSOR_CONTEXT_SIZE 0x60
- #define SIGNAL_CONTEXT_SIZE 32
- ##
- ## Define the minimum and maximum external interrupt vectors.
- ##
- #define MINIMUM_VECTOR 0x30
- #define MAXIMUM_VECTOR 0xFF
- ##
- ## APIC End Of Interrupt Offset.
- ##
- #define APIC_EOI_OFFSET 0xB
- ##
- ## Define the system call number for resuming after a signal.
- ##
- #define SystemCallRestoreContext 1
- #define SIGNAL_PARAMETERS_SIZE 24
- ##
- ## -------------------------------------------------------------------- Macros
- ##
- ##
- ## This macro switches the DS and ES data segments to the kernel's data
- ## segments.
- ##
- .macro LoadKernelDataSegments
- movw $KERNEL_DS, %ax # Get the data segment selector,
- mov %ax, %ds # and save it into the data segments.
- mov %ax, %es #
- mov $GDT_PROCESSOR, %ax # Get the processor segment.
- mov %ax, %fs # Load it.
- .endm
- #if defined(__ELF__)
- ##
- ## This macro defines a function, callable from C code in any module and
- ## capable of being overridden by other functions.
- ##
- #define EXPORTED_FUNCTION(_Name) \
- .func _Name ; \
- .type _Name, %function ; \
- .cfi_startproc ; \
- .global _Name ; \
- _Name:
- ##
- ## This macro defines a function, callable from C code in the current module
- ## only.
- ##
- #define FUNCTION(_Name) \
- .hidden _Name ; \
- EXPORTED_FUNCTION(_Name)
- ##
- ## This macro defines a function, callable from C code in any module but always
- ## called locally in the current module.
- ##
- #define PROTECTED_FUNCTION(_Name) \
- .protected _Name ; \
- EXPORTED_FUNCTION(_Name)
- #define END_FUNCTION(_Name) \
- .size _Name, .-_Name ; \
- .endfunc ; \
- .cfi_endproc
- #else
- #define FUNCTION(_Name) \
- _Name: \
- .def _##_Name; .scl 2; .type 32; .endef ; \
- .global _##_Name ; \
- _##_Name:
- #define PROTECTED_FUNCTION(_Name) FUNCTION(_Name)
- #define EXPORTED_FUNCTION(_Name) FUNCTION(_Name)
- #define END_FUNCTION(_Name)
- #endif
|