zephyr/arch/x86/core/gdt.c

41 lines
1.1 KiB
C
Raw Normal View History

/*
* Copyright (c) 2011-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Global Descriptor Table support
*
* This module contains routines for updating the global descriptor table (GDT)
* for the IA-32 architecture.
*/
#include <linker-defs.h>
#include <toolchain.h>
#include <sections.h>
kernel/arch: consolidate tTCS and TNANO definitions There was a lot of duplication between architectures for the definition of threads and the "nanokernel" guts. These have been consolidated. Now, a common file kernel/unified/include/kernel_structs.h holds the common definitions. Architectures provide two files to complement it: kernel_arch_data.h and kernel_arch_func.h. The first one contains at least the struct _thread_arch and struct _kernel_arch data structures, as well as the struct _callee_saved and struct _caller_saved register layouts. The second file contains anything that needs what is provided by the common stuff in kernel_structs.h. Those two files are only meant to be included in kernel_structs.h in very specific locations. The thread data structure has been separated into three major parts: common struct _thread_base and struct k_thread, and arch-specific struct _thread_arch. The first and third ones are included in the second. The struct s_NANO data structure has been split into two: common struct _kernel and arch-specific struct _kernel_arch. The latter is included in the former. Offsets files have also changed: nano_offsets.h has been renamed kernel_offsets.h and is still included by the arch-specific offsets.c. Also, since the thread and kernel data structures are now made of sub-structures, offsets have to be added to make up the full offset. Some of these additions have been consolidated in shorter symbols, available from kernel/unified/include/offsets_short.h, which includes an arch-specific offsets_arch_short.h. Most of the code include offsets_short.h now instead of offsets.h. Change-Id: I084645cb7e6db8db69aeaaf162963fe157045d5a Signed-off-by: Benjamin Walsh <benjamin.walsh@windriver.com>
2016-11-08 23:36:50 +08:00
#include <kernel_structs.h>
#include <arch/cpu.h>
#include <arch/x86/segmentation.h>
/*
* The RAM based global descriptor table. It is aligned on an 8 byte boundary
* as the Intel manuals recommend this for best performance, see
* Section 3.5.1 of IA architecture SW developer manual, Vol 3.
*
* TODO: CPU never looks at the 8-byte zero entry at all. Save a few bytes by
* stuffing the 6-byte pseudo descriptor there.
*/
static struct segment_descriptor _gdt_entries[] __aligned(8) = {
DT_ZERO_ENTRY,
DT_CODE_SEG_ENTRY(0, 0xFFFFF, DT_GRAN_PAGE, 0, DT_READABLE,
DT_NONCONFORM),
DT_DATA_SEG_ENTRY(0, 0xFFFFF, DT_GRAN_PAGE, 0, DT_WRITABLE,
DT_EXPAND_UP)
};
struct pseudo_descriptor _gdt = DT_INIT(_gdt_entries);