summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2015-03-23 16:08:53 -0700
committerAndy Lutomirski <luto@kernel.org>2015-03-23 16:09:45 -0700
commit5f8fcc3d10bcecbe92eeef6f4d7ef5064fa0789b (patch)
tree4d2dcc2343ac309ec3a83fab444e6f634b47d176
parentf00f9e0df47ddde1c86b81aad444febab4c254af (diff)
downloadmisc-tests-5f8fcc3d10bcecbe92eeef6f4d7ef5064fa0789b.tar.gz
sigreturn: Offset LDT entries by 6 for Solaris LX zone compatibility
Signed-off-by: Andy Lutomirski <luto@kernel.org>
-rw-r--r--sigreturn.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sigreturn.c b/sigreturn.c
index a205494..5c8cace 100644
--- a/sigreturn.c
+++ b/sigreturn.c
@@ -19,6 +19,8 @@
#include <sys/ptrace.h>
#include <sys/user.h>
+#define LDT_OFFSET 6 /* Solaris reserves LDT entries 0-5 for internal use. */
+
struct selectors {
unsigned short cs, gs, fs, ss;
};
@@ -86,10 +88,10 @@ static void setup_ldt(void)
if ((unsigned long)int3 > (1ULL << 32) - sizeof(int3))
errx(1, "int3 is too high\n");
- ldt_nonexistent_sel = LDT3(2);
+ ldt_nonexistent_sel = LDT3(LDT_OFFSET + 2);
const struct user_desc code16_desc = {
- .entry_number = 0,
+ .entry_number = LDT_OFFSET + 0,
.base_addr = (unsigned long)int3,
.limit = 4095,
.seg_32bit = 0,
@@ -102,7 +104,7 @@ static void setup_ldt(void)
add_ldt(&code16_desc, &code16_sel, "code16");
const struct user_desc data16_desc = {
- .entry_number = 1,
+ .entry_number = LDT_OFFSET + 1,
.base_addr = (unsigned long)stack16,
.limit = 0xffff,
.seg_32bit = 0,
@@ -115,7 +117,7 @@ static void setup_ldt(void)
add_ldt(&data16_desc, &data16_sel, "data16");
const struct user_desc npcode32_desc = {
- .entry_number = 3,
+ .entry_number = LDT_OFFSET + 3,
.base_addr = (unsigned long)int3,
.limit = 4095,
.seg_32bit = 1,
@@ -128,7 +130,7 @@ static void setup_ldt(void)
add_ldt(&npcode32_desc, &npcode32_sel, "npcode32");
const struct user_desc npdata32_desc = {
- .entry_number = 4,
+ .entry_number = LDT_OFFSET + 4,
.base_addr = (unsigned long)stack16,
.limit = 0xffff,
.seg_32bit = 1,