summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-06-09 15:42:36 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-06-12 08:01:58 +0200
commit7b0c74ffb085656d67554102857224223ee03f88 (patch)
treed2cf69f695da218e67c6c5cb7d26f82c3fc967be /c
parenti386: Move _CPU_Context_Initialize() (diff)
downloadrtems-7b0c74ffb085656d67554102857224223ee03f88.tar.bz2
i386: Support thread-local storage (TLS)
Update #2468.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/i386/pc386/include/tblsizes.h3
-rw-r--r--c/src/lib/libbsp/i386/pc386/startup/ldsegs.S10
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/idt.c3
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);