Add socket support for aarch64

This commit is contained in:
Lucas Schumacher 2025-04-29 13:19:40 -04:00
parent abbace3df4
commit f98b95ac4a
2 changed files with 168 additions and 1 deletions

View File

@ -127,4 +127,171 @@ int fsync(unsigned int fd){
return (int)rtn; return (int)rtn;
} }
int socket(int domain, int type, int protocol) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #198\n" // Syscall number for 'socket' is 198 in AArch64
"mov x0, %1\n" // domain
"mov x1, %2\n" // type
"mov x2, %3\n" // protocol
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)domain), "r"((int64_t)type), "r"((int64_t)protocol)
// Clobbered registers
: "x0", "x1", "x2", "x8"
);
return (int32_t)rtn;
}
int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t optlen) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #208\n" // Syscall number for 'setsockopt' is 208 in AArch64
"mov x0, %1\n" // sockfd
"mov x1, %2\n" // level
"mov x2, %3\n" // optname
"mov x3, %4\n" // optval
"mov x4, %5\n" // optlen
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)sockfd), "r"((int64_t)level), "r"((int64_t)optname), "r"(optval), "r"(optlen)
// Clobbered registers
: "x0", "x1", "x2", "x3", "x4", "x8"
);
return (int32_t)rtn;
}
int bind(int sockfd, const void* sockaddr, uint64_t addrlen) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #200\n" // Syscall number for 'bind' is 200 in AArch64
"mov x0, %1\n" // sockfd
"mov x1, %2\n" // sockaddr
"mov x2, %3\n" // addrlen
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)sockfd), "r"(sockaddr), "r"(addrlen)
// Clobbered registers
: "x0", "x1", "x2", "x8"
);
return (int32_t)rtn;
}
int listen(int fd, int backlog) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #201\n" // Syscall number for 'listen' is 201 in AArch64
"mov x0, %1\n" // fd
"mov x1, %2\n" // backlog
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)fd), "r"((int64_t)backlog)
// Clobbered registers
: "x0", "x1", "x8"
);
return (int32_t)rtn;
}
int accept(int sockfd, void* addr, uint64_t* addrlen) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #202\n" // Syscall number for 'accept' is 202 in AArch64
"mov x0, %1\n" // sockfd
"mov x1, %2\n" // addr
"mov x2, %3\n" // addrlen
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)sockfd), "r"(addr), "r"(addrlen)
// Clobbered registers
: "x0", "x1", "x2", "x8"
);
return (int32_t)rtn;
}
int connect(int sockfd, void* addr, uint64_t addrlen) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #203\n" // Syscall number for 'connect' is 203 in AArch64
"mov x0, %1\n" // sockfd
"mov x1, %2\n" // addr
"mov x2, %3\n" // addrlen
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)sockfd), "r"(addr), "r"(addrlen)
// Clobbered registers
: "x0", "x1", "x2", "x8"
);
return (int32_t)rtn;
}
int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #206\n" // Syscall number for 'sendto' is 206 in AArch64
"mov x0, %1\n" //
"mov x1, %2\n" //
"mov x2, %3\n" //
"mov x3, %4\n" //
"mov x4, %5\n"
"mov x5, %6\n"
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
// Clobbered registers
: "x0", "x1", "x2", "x3", "x4", "x5", "x8"
);
return rtn;
}
int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
long int rtn;
asm volatile (
// Assembly Instructions
"mov x8, #207\n" // Syscall number for 'recvfrom' is 207 in AArch64
"mov x0, %1\n" //
"mov x1, %2\n" //
"mov x2, %3\n" //
"mov x3, %4\n" //
"mov x4, %5\n"
"mov x5, %6\n"
"svc #0\n" // Make the syscall
"mov %0, x0\n" // save return value
// Output operands
: "=r" (rtn)
// Input operand
: "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
// Clobbered registers
: "x0", "x1", "x2", "x3", "x4", "x5", "x8"
);
return rtn;
}
#endif #endif

View File

@ -13,7 +13,7 @@ int main() {
server.sin_port = 0x391b; server.sin_port = 0x391b;
// Create the socket // Create the socket
socket_fd = socket(AF_INET, SOCK_STREAM, 0); socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (socket_fd < 0) { if (socket_fd < 0) {
write(STDERR, "Socket error\n", 13); write(STDERR, "Socket error\n", 13);
close(socket_fd); close(socket_fd);