Bladeren bron

More x86 fixes

Jeremy Soller 2 jaren geleden
bovenliggende
commit
a1d0b8fc35
3 gewijzigde bestanden met toevoegingen van 58 en 4 verwijderingen
  1. 22 0
      src/crti/src/lib.rs
  2. 18 0
      src/crtn/src/lib.rs
  3. 18 4
      src/ld_so/tcb.rs

+ 22 - 0
src/crti/src/lib.rs

@@ -5,6 +5,27 @@
 
 use core::arch::global_asm;
 
+#[cfg(target_arch = "x86_64")]
+global_asm!(
+    r#"
+    .section .init
+    .global _init
+    _init:
+        push ebp
+        mov ebp, esp
+        // Created a new stack frame and updated the stack pointer
+        // Body will be filled in by gcc and ended by crtn.o
+
+    .section .fini
+    .global _fini
+    _fini:
+        push ebp
+        mov ebp, esp
+        // Created a new stack frame and updated the stack pointer
+        // Body will be filled in by gcc and ended by crtn.o
+"#
+);
+
 // https://wiki.osdev.org/Creating_a_C_Library#crtbegin.o.2C_crtend.o.2C_crti.o.2C_and_crtn.o
 #[cfg(target_arch = "x86_64")]
 global_asm!(
@@ -26,6 +47,7 @@ global_asm!(
         // Body will be filled in by gcc and ended by crtn.o
 "#
 );
+
 // https://git.musl-libc.org/cgit/musl/tree/crt/aarch64/crti.s
 #[cfg(target_arch = "aarch64")]
 global_asm!(

+ 18 - 0
src/crtn/src/lib.rs

@@ -5,6 +5,23 @@
 
 use core::arch::global_asm;
 
+#[cfg(target_arch = "x86")]
+global_asm!(
+    r#"
+    .section .init
+        // This happens after crti.o and gcc has inserted code
+        // Pop the stack frame
+        pop ebp
+        ret
+
+    .section .fini
+        // This happens after crti.o and gcc has inserted code
+        // Pop the stack frame
+        pop ebp
+        ret
+"#
+);
+
 // https://wiki.osdev.org/Creating_a_C_Library#crtbegin.o.2C_crtend.o.2C_crti.o.2C_and_crtn.o
 #[cfg(target_arch = "x86_64")]
 global_asm!(
@@ -22,6 +39,7 @@ global_asm!(
         ret
 "#
 );
+
 // https://git.musl-libc.org/cgit/musl/tree/crt/aarch64/crtn.s
 #[cfg(target_arch = "aarch64")]
 global_asm!(

+ 18 - 4
src/ld_so/tcb.rs

@@ -195,11 +195,10 @@ impl Tcb {
         Ok(tls_tcb.split_at_mut(size))
     }
 
-    /// Architecture specific code to read a usize from the TCB - x86_64
+    /// Architecture specific code to read a usize from the TCB - aarch64
     #[inline(always)]
     #[cfg(target_arch = "aarch64")]
     unsafe fn arch_read(offset: usize) -> usize {
-        // TODO: s/llvm_asm/asm/g
         let tp: usize;
         asm!(
             "mrs {}, tpidr_el0",
@@ -209,9 +208,24 @@ impl Tcb {
         *((tp + offset) as *const usize)
     }
 
+    /// Architecture specific code to read a usize from the TCB - x86
+    #[inline(always)]
+    #[cfg(any(target_arch = "x86")]
+    unsafe fn arch_read(offset: usize) -> usize {
+        let value;
+        asm!(
+            "
+            mov {}, gs:[{}]
+            ",
+            out(reg) value,
+            in(reg) offset,
+        );
+        value
+    }
+
     /// Architecture specific code to read a usize from the TCB - x86_64
     #[inline(always)]
-    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    #[cfg(any(target_arch = "x86_64")]
     unsafe fn arch_read(offset: usize) -> usize {
         let value;
         asm!(
@@ -248,7 +262,7 @@ impl Tcb {
         let _ = syscall::read(file, &mut env)
             .expect_notls("failed to read fsbase");
 
-        env.fsbase = tp as u32;
+        env.gsbase = tp as u32;
 
         let _ = syscall::write(file, &env)
             .expect_notls("failed to write fsbase");