mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-07-02 10:59:15 +00:00
kernel: add aarch64 architecture support
Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
@ -40,6 +40,15 @@ static inline scarg syscall0(scarg syscall)
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0");
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(x0)
|
||||
: "r"(x8)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
@ -65,6 +74,15 @@ static inline scarg syscall1(scarg syscall, scarg arg1)
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0") = arg1;
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(ret)
|
||||
: "r"(x8), "0"(x0)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
@ -91,6 +109,16 @@ static inline scarg syscall2(scarg syscall, scarg arg1, scarg arg2)
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0") = arg1;
|
||||
register long x1 __asm__("x1") = arg2;
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(ret)
|
||||
: "r"(x8), "0"(x0), "r"(x1)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
@ -118,6 +146,17 @@ static inline scarg syscall3(scarg syscall, scarg arg1, scarg arg2, scarg arg3)
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0") = arg1;
|
||||
register long x1 __asm__("x1") = arg2;
|
||||
register long x2 __asm__("x2") = arg3;
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(ret)
|
||||
: "r"(x8), "0"(x0), "r"(x1), "r"(x2)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
@ -147,6 +186,18 @@ static inline scarg syscall4(scarg syscall, scarg arg1, scarg arg2, scarg arg3,
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0") = arg1;
|
||||
register long x1 __asm__("x1") = arg2;
|
||||
register long x2 __asm__("x2") = arg3;
|
||||
register long x3 __asm__("x3") = arg4;
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(ret)
|
||||
: "r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
@ -178,6 +229,19 @@ static inline scarg syscall5(scarg syscall, scarg arg1, scarg arg2, scarg arg3,
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0") = arg1;
|
||||
register long x1 __asm__("x1") = arg2;
|
||||
register long x2 __asm__("x2") = arg3;
|
||||
register long x3 __asm__("x3") = arg4;
|
||||
register long x4 __asm__("x4") = arg5;
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(ret)
|
||||
: "r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
@ -211,6 +275,20 @@ static inline scarg syscall6(scarg syscall, scarg arg1, scarg arg2, scarg arg3,
|
||||
: "rcx", "r11", "memory");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 syscall wrapper not implemented"
|
||||
#elif defined(__arm__)
|
||||
#warning "arm syscall wrapper not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
register long x8 __asm__("x8") = syscall;
|
||||
register long x0 __asm__("x0") = arg1;
|
||||
register long x1 __asm__("x1") = arg2;
|
||||
register long x2 __asm__("x2") = arg3;
|
||||
register long x3 __asm__("x3") = arg4;
|
||||
register long x4 __asm__("x4") = arg5;
|
||||
register long x5 __asm__("x5") = arg6;
|
||||
__asm__ __volatile__("svc 0"
|
||||
: "=r"(ret)
|
||||
: "r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
|
@ -182,6 +182,13 @@ enum RelocationTypes
|
||||
R_X86_64_REX_GOTPCRELX = 42,
|
||||
R_X86_64_NUM = 43,
|
||||
|
||||
R_AARCH64_NONE = 0,
|
||||
R_AARCH64_COPY = 1024,
|
||||
R_AARCH64_GLOB_DAT = 1025,
|
||||
R_AARCH64_JUMP_SLOT = 1026,
|
||||
R_AARCH64_RELATIVE = 1027,
|
||||
R_AARCH64_TLS_DTPMOD64 = 1028,
|
||||
|
||||
#if defined(__x86_64__)
|
||||
R_NONE = R_X86_64_NONE,
|
||||
R_COPY = R_X86_64_COPY,
|
||||
@ -200,6 +207,15 @@ enum RelocationTypes
|
||||
R_DTPMOD64 = R_386_NONE,
|
||||
R_DTPOFF64 = R_386_NONE,
|
||||
R_TPOFF64 = R_386_NONE,
|
||||
#elif defined(__aarch64__)
|
||||
R_NONE = R_AARCH64_NONE,
|
||||
R_COPY = R_AARCH64_COPY,
|
||||
R_GLOB_DAT = R_AARCH64_GLOB_DAT,
|
||||
R_JMP_SLOT = R_AARCH64_JUMP_SLOT,
|
||||
R_RELATIVE = R_AARCH64_RELATIVE,
|
||||
R_DTPMOD64 = R_AARCH64_TLS_DTPMOD64,
|
||||
R_DTPOFF64 = R_AARCH64_NONE,
|
||||
R_TPOFF64 = R_AARCH64_NONE,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -151,8 +151,8 @@ __attribute__((naked, used, no_stack_protector)) void _dl_runtime_resolve()
|
||||
"jmp *%r11\n"); /* Jump to the return value */
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 _dl_runtime_resolve not implemented"
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#elif defined(__aarch64__)
|
||||
#warning "aarch64 not implemented"
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -817,6 +817,7 @@ int RelocateHelper(ElfInfo *Info, Elf_Rela *Rela, short IsRel, void **Relocated)
|
||||
reloc = Info->BaseAddress;
|
||||
break;
|
||||
}
|
||||
#if defined(__amd64__)
|
||||
case R_DTPOFF64:
|
||||
{
|
||||
printf("dl: i don't know what to do with DTPOFF64\n");
|
||||
@ -829,6 +830,7 @@ int RelocateHelper(ElfInfo *Info, Elf_Rela *Rela, short IsRel, void **Relocated)
|
||||
reloc = symAddress + Rela->r_addend;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#endif // __LP64__
|
||||
default:
|
||||
{
|
||||
|
@ -128,6 +128,8 @@ __attribute__((naked, used, no_stack_protector)) void _start()
|
||||
"call _exit\n"); /* Call _exit */
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 _start not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
#warning "aarch64 _start not implemented"
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
|
@ -17,7 +17,7 @@ build: $(OBJ)
|
||||
|
||||
%.o: %.c
|
||||
$(info Compiling $<)
|
||||
$(CC) -nostdlib -mno-red-zone -std=c17 -DLIBC_GIT_COMMIT='"$(shell git rev-parse HEAD)"' -c $< -o $@
|
||||
$(CC) -nostdlib -std=c17 -DLIBC_GIT_COMMIT='"$(shell git rev-parse HEAD)"' -c $< -o $@
|
||||
|
||||
%.o: %.S
|
||||
$(info Compiling $<)
|
||||
|
@ -68,6 +68,8 @@ __attribute__((naked, used, no_stack_protector, section(".text"))) void _start()
|
||||
"call _exit\n");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 _start not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
#warning "aarch64 _start not implemented"
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
|
@ -68,6 +68,8 @@ __attribute__((naked, used, no_stack_protector, section(".text"))) void _start()
|
||||
"call _exit\n");
|
||||
#elif defined(__i386__)
|
||||
#warning "i386 _start not implemented"
|
||||
#elif defined(__aarch64__)
|
||||
#warning "aarch64 _start not implemented"
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
|
21
Userspace/libc/src/softfloat.c
Normal file
21
Userspace/libc/src/softfloat.c
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
This file is part of Fennix C Library.
|
||||
|
||||
Fennix C Library is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix C Library. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
double __trunctfdf2(long double a)
|
||||
{
|
||||
return (double)a;
|
||||
}
|
@ -108,8 +108,12 @@ export int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
|
||||
export pthread_t pthread_self(void)
|
||||
{
|
||||
pthread_t tid;
|
||||
#if defined(__amd64__) || defined(__i386__)
|
||||
__asm__ __volatile__("mov %%fs:0, %0"
|
||||
: "=r"(tid));
|
||||
#elif defined(__aarch64__)
|
||||
tid = 0;
|
||||
#endif
|
||||
return tid;
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,10 @@
|
||||
|
||||
export __attribute__((naked, used, no_stack_protector)) void *__tls_get_addr(void *__data)
|
||||
{
|
||||
#warning "__tls_get_addr not implemented"
|
||||
#if defined(__amd64__) || defined(__i386__)
|
||||
__asm__("ud2");
|
||||
#endif
|
||||
}
|
||||
|
||||
int __init_pthread(void)
|
||||
|
Reference in New Issue
Block a user