From f98b95ac4a4ce59c46b7c4a9c88dddba0fa24518 Mon Sep 17 00:00:00 2001 From: Lucas Schumacher Date: Tue, 29 Apr 2025 13:19:40 -0400 Subject: [PATCH] Add socket support for aarch64 --- arch/aarch64.c | 167 +++++++++++++++++++++++++++++++++++++++++++++++++ socktest.c | 2 +- 2 files changed, 168 insertions(+), 1 deletion(-) diff --git a/arch/aarch64.c b/arch/aarch64.c index 68a81a3..7b94a33 100644 --- a/arch/aarch64.c +++ b/arch/aarch64.c @@ -127,4 +127,171 @@ int fsync(unsigned int fd){ 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 diff --git a/socktest.c b/socktest.c index 8555713..5e46dd7 100644 --- a/socktest.c +++ b/socktest.c @@ -13,7 +13,7 @@ int main() { server.sin_port = 0x391b; // Create the socket - socket_fd = socket(AF_INET, SOCK_STREAM, 0); + socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (socket_fd < 0) { write(STDERR, "Socket error\n", 13); close(socket_fd);