mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-03 15:38:22 +00:00
Get hello.com working on metal again (#529)
* Fix deterministic startup stack setup, especially for bare metal * Implement __enable_tls() on bare metal * Get __get_tls_privileged() working on bare metal
This commit is contained in:
parent
ad775a75b8
commit
62ca1b0902
3 changed files with 14 additions and 4 deletions
|
@ -27,7 +27,7 @@ static noasan inline char *__get_tls(void) {
|
|||
*/
|
||||
static noasan inline char *__get_tls_privileged(void) {
|
||||
char *tib, *lin = (char *)0x30;
|
||||
if (IsLinux() || IsFreebsd() || IsNetbsd() || IsOpenbsd()) {
|
||||
if (IsLinux() || IsFreebsd() || IsNetbsd() || IsOpenbsd() || IsMetal()) {
|
||||
asm("mov\t%%fs:(%1),%0" : "=a"(tib) : "r"(lin) : "memory");
|
||||
} else {
|
||||
asm("mov\t%%gs:(%1),%0" : "=a"(tib) : "r"(lin) : "memory");
|
||||
|
|
|
@ -99,6 +99,8 @@ cosmo: push %rbp
|
|||
.init.start 304,_init_stack
|
||||
testb IsWindows()
|
||||
jnz 9f
|
||||
testb IsMetal()
|
||||
jnz 9f
|
||||
push %rdi
|
||||
push %rsi
|
||||
// allocate stack
|
||||
|
@ -120,8 +122,9 @@ cosmo: push %rbp
|
|||
leave
|
||||
pop %rcx
|
||||
lea (%rax,%r8),%rsp
|
||||
sub $ape_stack_align,%rsp # openbsd:stackbound
|
||||
mov %rbp,(%rsp)
|
||||
mov $ape_stack_align,%eax # openbsd:stackbound
|
||||
neg %rax
|
||||
and %rax,%rsp
|
||||
push %rcx
|
||||
push %rbp
|
||||
mov %rsp,%rbp
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/log/libfatal.internal.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/nexgen32e/msr.h"
|
||||
#include "libc/nexgen32e/threaded.h"
|
||||
#include "libc/nt/thread.h"
|
||||
#include "libc/runtime/internal.h"
|
||||
|
@ -158,11 +159,17 @@ privileged void __enable_tls(void) {
|
|||
: "=a"(ax)
|
||||
: "0"(__NR___set_tcb), "D"(tib)
|
||||
: "rcx", "r11", "memory", "cc");
|
||||
} else {
|
||||
} else if (IsLinux()) {
|
||||
asm volatile("syscall"
|
||||
: "=a"(ax)
|
||||
: "0"(__NR_linux_arch_prctl), "D"(ARCH_SET_FS), "S"(tib)
|
||||
: "rcx", "r11", "memory");
|
||||
} else {
|
||||
uint64_t val = (uint64_t)tib;
|
||||
asm volatile("wrmsr"
|
||||
: /* no outputs */
|
||||
: "c"(MSR_IA32_FS_BASE), "a"((uint32_t)val),
|
||||
"d"((uint32_t)(val >> 32)));
|
||||
}
|
||||
|
||||
// We need to rewrite SysV _Thread_local code. You MUST use the
|
||||
|
|
Loading…
Add table
Reference in a new issue