mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 02:05:57 +01:00
Split userland/arch/<arch>/c/ into inline_asm and intrinsics, and move programs that don't match either up.
40 lines
1.0 KiB
C
40 lines
1.0 KiB
C
/* aarch64 freestanding C inline assemby Linux hello world
|
|
* https://github.com/cirosantilli/linux-kernel-module-cheat#linux-system-calls
|
|
*/
|
|
|
|
#include <inttypes.h>
|
|
|
|
void _start(void) {
|
|
uint64_t exit_status;
|
|
|
|
/* write */
|
|
{
|
|
char msg[] = "hello\n";
|
|
uint64_t syscall_return;
|
|
register uint64_t x0 __asm__ ("x0") = 1; /* stdout */
|
|
register char *x1 __asm__ ("x1") = msg;
|
|
register uint64_t x2 __asm__ ("x2") = sizeof(msg);
|
|
register uint64_t x8 __asm__ ("x8") = 64; /* syscall number */
|
|
__asm__ __volatile__ (
|
|
"svc 0;"
|
|
: "+r" (x0)
|
|
: "r" (x1), "r" (x2), "r" (x8)
|
|
: "memory"
|
|
);
|
|
syscall_return = x0;
|
|
exit_status = (syscall_return != sizeof(msg));
|
|
}
|
|
|
|
/* exit */
|
|
{
|
|
register uint64_t x0 __asm__ ("x0") = exit_status;
|
|
register uint64_t x8 __asm__ ("x8") = 93;
|
|
__asm__ __volatile__ (
|
|
"svc 0;"
|
|
: "+r" (x0)
|
|
: "r" (x8)
|
|
:
|
|
);
|
|
}
|
|
}
|