user: implement mlibc as the libc, finally.

It's finally done..

Signed-off-by: kaguya <vpshinomiya@protonmail.com>
This commit is contained in:
kaguya
2026-05-02 03:31:49 -04:00
parent 2fa39ad85a
commit 9a9b91c940
2387 changed files with 152741 additions and 315 deletions
@@ -0,0 +1,102 @@
# The functions below are taken from musl.
.global feclearexcept
.type feclearexcept,@function
feclearexcept:
# maintain exceptions in the sse mxcsr, clear x87 exceptions
mov %edi,%ecx
and $0x3f,%ecx
fnstsw %ax
test %eax,%ecx
jz 1f
fnclex
1: stmxcsr -8(%rsp)
and $0x3f,%eax
or %eax,-8(%rsp)
test %ecx,-8(%rsp)
jz 1f
not %ecx
and %ecx,-8(%rsp)
ldmxcsr -8(%rsp)
1: xor %eax,%eax
ret
.global feraiseexcept
.type feraiseexcept,@function
feraiseexcept:
and $0x3f,%edi
stmxcsr -8(%rsp)
or %edi,-8(%rsp)
ldmxcsr -8(%rsp)
xor %eax,%eax
ret
.global __fesetround
.hidden __fesetround
.type __fesetround,@function
__fesetround:
push %rax
xor %eax,%eax
mov %edi,%ecx
fnstcw (%rsp)
andb $0xf3,1(%rsp)
or %ch,1(%rsp)
fldcw (%rsp)
stmxcsr (%rsp)
shl $3,%ch
andb $0x9f,1(%rsp)
or %ch,1(%rsp)
ldmxcsr (%rsp)
pop %rcx
ret
.global fegetround
.type fegetround,@function
fegetround:
push %rax
stmxcsr (%rsp)
pop %rax
shr $3,%eax
and $0xc00,%eax
ret
.global fegetenv
.type fegetenv,@function
fegetenv:
xor %eax,%eax
fnstenv (%rdi)
stmxcsr 28(%rdi)
ret
.global fesetenv
.type fesetenv,@function
fesetenv:
xor %eax,%eax
inc %rdi
jz 1f
fldenv -1(%rdi)
ldmxcsr 27(%rdi)
ret
1: push %rax
push %rax
pushq $0xffff
pushq $0x37f
fldenv (%rsp)
pushq $0x1f80
ldmxcsr (%rsp)
add $40,%rsp
ret
.global fetestexcept
.type fetestexcept,@function
fetestexcept:
and $0x3f,%edi
push %rax
stmxcsr (%rsp)
pop %rsi
fnstsw %ax
or %esi,%eax
and %edi,%eax
ret
.section .note.GNU-stack,"",%progbits
@@ -0,0 +1,60 @@
.type __setjmp, "function"
__setjmp:
mov %rbx, 0x00(%rdi)
mov %rbp, 0x08(%rdi)
mov %r12, 0x10(%rdi)
mov %r13, 0x18(%rdi)
mov %r14, 0x20(%rdi)
mov %r15, 0x28(%rdi)
lea 8(%rsp), %rax # rsp before return rip is pushed
mov %rax, 0x30(%rdi)
mov (%rsp), %rax # return rip
mov %rax, 0x38(%rdi)
test %rdx, %rdx
jnz 1f
xor %rax, %rax
ret
1:
jmp __sigsetjmp
.global setjmp
.type setjmp, "function"
.global _setjmp
.type _setjmp, "function"
setjmp:
_setjmp:
xor %rdx, %rdx
jmp __setjmp
.global sigsetjmp
.type sigsetjmp, "function"
sigsetjmp:
mov $1, %rdx
jmp __setjmp
.global longjmp
.type longjmp, "function"
.global _longjmp
.type _longjmp, "function"
longjmp:
_longjmp:
mov 0x00(%rdi), %rbx
mov 0x08(%rdi), %rbp
mov 0x10(%rdi), %r12
mov 0x18(%rdi), %r13
mov 0x20(%rdi), %r14
mov 0x28(%rdi), %r15
mov %rsi, %rax
test %rax, %rax
jnz 1f
inc %rax
1:
mov 0x30(%rdi), %rsp
jmp *0x38(%rdi)
.section .note.GNU-stack,"",%progbits