Browse Source

Use GS for i686 thread pointer

Jeremy Soller 2 years ago
parent
commit
c547f9677f
2 changed files with 16 additions and 2 deletions
  1. 14 0
      src/ld_so/mod.rs
  2. 2 2
      src/ld_so/tcb.rs

+ 14 - 0
src/ld_so/mod.rs

@@ -144,6 +144,20 @@ pub unsafe fn init(sp: &'static Stack) {
         const ARCH_GET_FS: usize = 0x1003;
         syscall!(ARCH_PRCTL, ARCH_GET_FS, &mut tp as *mut usize);
     }
+    #[cfg(all(target_os = "redox", target_arch = "x86"))]
+    {
+        let mut env = syscall::EnvRegisters::default();
+
+        let file = syscall::open("thisproc:current/regs/env", syscall::O_CLOEXEC | syscall::O_RDONLY)
+            .expect_notls("failed to open handle for process registers");
+
+        let _ = syscall::read(file, &mut env)
+            .expect_notls("failed to read gsbase");
+
+        let _ = syscall::close(file);
+
+        tp = env.gsbase as usize;
+    }
     #[cfg(all(target_os = "redox", target_arch = "x86_64"))]
     {
         let mut env = syscall::EnvRegisters::default();

+ 2 - 2
src/ld_so/tcb.rs

@@ -260,12 +260,12 @@ impl Tcb {
             .expect_notls("failed to open handle for process registers");
 
         let _ = syscall::read(file, &mut env)
-            .expect_notls("failed to read fsbase");
+            .expect_notls("failed to read gsbase");
 
         env.gsbase = tp as u32;
 
         let _ = syscall::write(file, &env)
-            .expect_notls("failed to write fsbase");
+            .expect_notls("failed to write gsbase");
 
         let _ = syscall::close(file);
     }