diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-06-09 15:42:36 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-06-12 08:01:58 +0200 |
commit | 7b0c74ffb085656d67554102857224223ee03f88 (patch) | |
tree | d2cf69f695da218e67c6c5cb7d26f82c3fc967be /c/src/lib | |
parent | i386: Move _CPU_Context_Initialize() (diff) | |
download | rtems-7b0c74ffb085656d67554102857224223ee03f88.tar.bz2 |
i386: Support thread-local storage (TLS)
Update #2468.
Diffstat (limited to 'c/src/lib')
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/include/tblsizes.h | 3 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/startup/ldsegs.S | 10 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/shared/irq/idt.c | 3 |
3 files changed, 11 insertions, 5 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/include/tblsizes.h b/c/src/lib/libbsp/i386/pc386/include/tblsizes.h index bd4e9896bf..cea8619c8f 100644 --- a/c/src/lib/libbsp/i386/pc386/include/tblsizes.h +++ b/c/src/lib/libbsp/i386/pc386/include/tblsizes.h @@ -20,4 +20,5 @@ #include <bspopts.h> #define IDT_SIZE (256) -#define GDT_SIZE (3 + NUM_APP_DRV_GDT_DESCRIPTORS) +#define NUM_SYSTEM_GDT_DESCRIPTORS 4 +#define GDT_SIZE (NUM_SYSTEM_GDT_DESCRIPTORS + NUM_APP_DRV_GDT_DESCRIPTORS) diff --git a/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S b/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S index ea41874a1b..626d5a02d4 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S +++ b/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S @@ -171,8 +171,8 @@ next_step: /*---------------------------------------------------------------------------+ | GDT itself +--------------------------------------------------------------------------*/ -#if GDT_SIZE < 3 -#error "GDT_SIZE must be at least 3" +#if GDT_SIZE < NUM_SYSTEM_GDT_DESCRIPTORS +#error "GDT_SIZE must be at least NUM_SYSTEM_GDT_DESCRIPTORS" #endif BEGIN_DATA @@ -193,8 +193,12 @@ SYM (_Global_descriptor_table): .word 0xffff, 0 .byte 0, 0x92, 0xcf, 0 + /* gs segment */ + .word 0xffff, 0 + .byte 0, 0x92, 0xcf, 0 + /* allocated space for user segments */ - .rept (GDT_SIZE - 3) + .rept (GDT_SIZE - NUM_SYSTEM_GDT_DESCRIPTORS) .word 0,0,0,0 .endr diff --git a/c/src/lib/libbsp/i386/shared/irq/idt.c b/c/src/lib/libbsp/i386/shared/irq/idt.c index ac79a97004..d3adbc4f05 100644 --- a/c/src/lib/libbsp/i386/shared/irq/idt.c +++ b/c/src/lib/libbsp/i386/shared/irq/idt.c @@ -18,6 +18,7 @@ #include <rtems/score/cpu.h> #include <bsp/irq.h> +#include <bsp/tblsizes.h> /* * This locking is not enough if IDT is changed at runtime @@ -331,7 +332,7 @@ uint16_t i386_next_empty_gdt_entry () uint16_t gdt_limit; segment_descriptors* gdt_entry_tbl; /* initial amount of filled descriptors */ - static uint16_t segment_selector_index = 2; + static uint16_t segment_selector_index = NUM_SYSTEM_GDT_DESCRIPTORS - 1; segment_selector_index += 1; i386_get_info_from_GDTR (&gdt_entry_tbl, &gdt_limit); |