Add socket support for aarch64
This commit is contained in:
parent
abbace3df4
commit
f98b95ac4a
167
arch/aarch64.c
167
arch/aarch64.c
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user