Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions aarch64/aarch64_defs.M1
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ DEFINE SET_X8_TO_SYS_UNAME 081480d2
DEFINE SET_X8_TO_SYS_WAIT4 882080d2
DEFINE SET_X8_TO_SYS_WRITE 080880d2
DEFINE SET_X8_TO_SYS_UNLINK 488080d2
DEFINE SET_X8_TO_SYS_SYMLINKAT 880480d2
DEFINE SET_X8_TO_SYS_UMASK c81480d2
DEFINE SET_X8_TO_SYS_UNSHARE 280c80d2
DEFINE SET_X8_TO_SYS_GETEUID e81580d2
Expand Down
9 changes: 9 additions & 0 deletions aarch64/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,15 @@ int unlink (char* filename)
"SYSCALL");
}

int symlink(const char *path1, const char *path2)
{
asm("SET_X0_FROM_BP" "SUB_X0_16" "DEREF_X0"
"SET_X2_FROM_X0"
"SET_X1_TO_FCNTL_H_AT_FDCWD"
"SET_X0_FROM_BP" "SUB_X0_8" "DEREF_X0"
"SET_X8_TO_SYS_SYMLINKAT"
"SYSCALL");
}

int _getcwd(char* buf, int size)
{
Expand Down
9 changes: 9 additions & 0 deletions amd64/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,15 @@ int unlink (char* filename)
"syscall");
}

int symlink(const char *path1, const char *path2)
{
asm("lea_rdi,[rsp+DWORD] %16"
"mov_rdi,[rdi]"
"lea_rsi,[rsp+DWORD] %8"
"mov_rsi,[rsi]"
"mov_rax, %88"
"syscall");
}

int _getcwd(char* buf, int size)
{
Expand Down
9 changes: 9 additions & 0 deletions armv7l/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,15 @@ int unlink (char* filename)
"SYSCALL_ALWAYS");
}

int symlink(const char *path1, const char *path2)
{
asm("!4 R0 SUB R12 ARITH_ALWAYS"
"!0 R0 LOAD32 R0 MEMORY"
"!8 R1 SUB R12 ARITH_ALWAYS"
"!0 R1 LOAD32 R1 MEMORY"
"!21 R7 LOADI8_ALWAYS"
"SYSCALL_ALWAYS");
}

int _getcwd(char* buf, int size)
{
Expand Down
5 changes: 5 additions & 0 deletions knight/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@ int unlink (char* filename)
"SYS_UNLINK");
}

int symlink(const char *path1, const char *path2)
{
/* not implemented */
return(-1);
}

int _getcwd(char* buf, int size)
{
Expand Down
5 changes: 5 additions & 0 deletions knight/native/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ int unlink (char* filename)
return 0;
}

int symlink(const char *path1, const char *path2)
{
/* Completely meaningless in bare metal */
return 0;
}

int _getcwd(char* buf, int size)
{
Expand Down
9 changes: 9 additions & 0 deletions riscv32/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,15 @@ int unlink (char* filename)
"ecall");
}

/* XXX: UNTESTED */
int symlink(const char *path1, const char *path2)
{
asm("rd_a0 rs1_fp !-4 lw"
"rd_a1 !-100 addi" /* AT_FDCWD */
"rd_a2 rs1_fp !-8 lw"
"rd_a7 !36 addi" /* symlinkat */
"ecall");
}

int _getcwd(char* buf, int size)
{
Expand Down
10 changes: 10 additions & 0 deletions riscv64/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,16 @@ int unlink (char* filename)
"ecall");
}

/* XXX: UNTESTED */
int symlink(const char *path1, const char *path2)
{
asm("rd_a0 rs1_fp !-8 ld"
"rd_a1 !-100 addi" /* AT_FDCWD */
"rd_a2 rs1_fp !-16 ld"
"rd_a7 !36 addi" /* symlinkat */
"ecall");
}


int _getcwd(char* buf, int size)
{
Expand Down
5 changes: 5 additions & 0 deletions uefi/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,11 @@ int unlink(char* filename)
__uefi_1(fd, fd->delete);
}

int symlink(const char *path1, const char *path2)
{
/* This does not make sense in UEFI, where there are no symlinks */
return -1;
}

char* getcwd(char* buf, unsigned size)
{
Expand Down
1 change: 1 addition & 0 deletions unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ int write(int fd, char* buf, unsigned count);
int lseek(int fd, int offset, int whence);
int close(int fd);
int unlink (char *filename);
int symlink(const char *path1, const char *path2);
int _getcwd(char* buf, int size);
char* getcwd(char* buf, unsigned size);
char* getwd(char* buf);
Expand Down
9 changes: 9 additions & 0 deletions x86/linux/unistd.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,15 @@ int unlink (char *filename)
"int !0x80");
}

int symlink(const char *path1, const char *path2)
{
asm("lea_ebx,[esp+DWORD] %8"
"mov_ebx,[ebx]"
"lea_ecx,[esp+DWORD] %4"
"mov_ecx,[ecx]"
"mov_eax, %83"
"int !0x80");
}

int _getcwd(char* buf, int size)
{
Expand Down