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:
Jérôme Duval
2018-05-15 10:27:02 +00:00
parent 6692e4c87f
commit 27b32ee02c
7 changed files with 81 additions and 17 deletions
@@ -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__
+4 -1
View File
@@ -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 */
+1
View File
@@ -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,