kernel/x86_64: adjust descriptors tables for compatibility mode.
* also adjust BOOT_GDT_SEGMENT_COUNT for x86, the definition is used by the boot loader. * add some 32-bit definitions. * add a UserTLSDescriptor class, this will be used by 32-bit threads. Change-Id: I5b1d978969a1ce97091a16c9ec2ad7c0ca831656
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
#define USER_CODE_SEGMENT 3
|
||||
#define USER_DATA_SEGMENT 4
|
||||
|
||||
#define BOOT_GDT_SEGMENT_COUNT (USER_DATA_SEGMENT + 1)
|
||||
#define BOOT_GDT_SEGMENT_COUNT (USER_DATA_SEGMENT + 2) // match x86_64
|
||||
|
||||
#define APM_CODE32_SEGMENT 5
|
||||
#define APM_CODE16_SEGMENT 6
|
||||
|
||||
@@ -10,16 +10,18 @@
|
||||
// Note that the ordering of these is important to SYSCALL/SYSRET.
|
||||
#define KERNEL_CODE_SEGMENT 1
|
||||
#define KERNEL_DATA_SEGMENT 2
|
||||
#define USER_DATA_SEGMENT 3
|
||||
#define USER_CODE_SEGMENT 4
|
||||
#define USER32_CODE_SEGMENT 3
|
||||
#define USER_DATA_SEGMENT 4
|
||||
#define USER_CODE_SEGMENT 5
|
||||
|
||||
#define BOOT_GDT_SEGMENT_COUNT (USER_CODE_SEGMENT + 1)
|
||||
|
||||
#define KERNEL_CODE_SELECTOR ((KERNEL_CODE_SEGMENT << 3) | DPL_KERNEL)
|
||||
#define KERNEL_DATA_SELECTOR ((KERNEL_DATA_SEGMENT << 3) | DPL_KERNEL)
|
||||
|
||||
#define USER_CODE_SELECTOR ((USER_CODE_SEGMENT << 3) | DPL_USER)
|
||||
#define USER_DATA_SELECTOR ((USER_DATA_SEGMENT << 3) | DPL_USER)
|
||||
#define USER32_CODE_SELECTOR ((USER32_CODE_SEGMENT << 3) | DPL_USER)
|
||||
#define USER_CODE_SELECTOR ((USER_CODE_SEGMENT << 3) | DPL_USER)
|
||||
#define USER_DATA_SELECTOR ((USER_DATA_SEGMENT << 3) | DPL_USER)
|
||||
|
||||
|
||||
#ifndef _ASSEMBLER
|
||||
@@ -90,6 +92,9 @@ set_segment_descriptor(segment_descriptor* desc, uint8 type, uint8 dpl)
|
||||
}
|
||||
|
||||
|
||||
unsigned x86_64_set_user_tls_segment_base(int cpu, addr_t base);
|
||||
|
||||
|
||||
#endif /* _ASSEMBLER */
|
||||
|
||||
#endif /* _KERNEL_ARCH_X86_64_DESCRIPTORS_H */
|
||||
|
||||
@@ -54,6 +54,18 @@
|
||||
#define USER_STACK_REGION 0x7f0000000000
|
||||
#define USER_STACK_REGION_SIZE ((USER_TOP - USER_STACK_REGION) + 1)
|
||||
|
||||
#ifdef _COMPAT_MODE
|
||||
|
||||
#define USER32_SIZE 0x100000000
|
||||
#define USER32_TOP (USER_BASE + (USER32_SIZE - 1))
|
||||
|
||||
#define KERNEL_USER32_DATA_BASE 0x60000000
|
||||
|
||||
#define USER32_STACK_REGION 0x70000000
|
||||
#define USER32_STACK_REGION_SIZE ((USER32_TOP - USER32_STACK_REGION) + 1)
|
||||
|
||||
#endif // _COMPAT_MODE
|
||||
|
||||
|
||||
#else // __x86_64__
|
||||
|
||||
|
||||
@@ -837,6 +837,9 @@ using BKernel::ProcessGroupList;
|
||||
#define THREAD_FLAGS_TRAP_FOR_CORE_DUMP 0x1000
|
||||
// core dump in progress; the thread shall not exit the kernel to userland,
|
||||
// but shall invoke core_dump_trap_thread() instead.
|
||||
|
||||
#ifdef _COMPAT_MODE
|
||||
#define THREAD_FLAGS_COMPAT_MODE 0x2000
|
||||
// the thread runs a compatibility mode (for instance IA32 on x86_64).
|
||||
#endif
|
||||
|
||||
#endif /* _KERNEL_THREAD_TYPES_H */
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
|
||||
#define TLS_SIZE (TLS_MAX_KEYS * sizeof(void *))
|
||||
#define TLS_COMPAT_SIZE (TLS_MAX_KEYS * sizeof(uint32))
|
||||
|
||||
enum {
|
||||
TLS_BASE_ADDRESS_SLOT = 0,
|
||||
|
||||
Reference in New Issue
Block a user