Skip to content

Commit

Permalink
baremetal: aarch64 semihosting exit
Browse files Browse the repository at this point in the history
  • Loading branch information
cirosantilli committed Sep 23, 2018
1 parent f90e690 commit c53ccb0
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 20 deletions.
5 changes: 5 additions & 0 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,11 @@ auto_reset_addr_64 = True

That patch breaks `--arch arm`, so don't forget to remove it if you want to go back to it.

When doing bare metal programming, it is likely that you will want to learn assembly language basics. Have a look at these tutorials for the userland part:

* https://github.com/cirosantilli/x86-assembly-cheat
* https://github.com/cirosantilli/arm-assembly-cheat

For more information on baremetal, see the section: <<baremetal>>. The following subjects are particularly important:

* <<tracing>>
Expand Down
20 changes: 20 additions & 0 deletions baremetal/arch/aarch64/semihost_exit.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
.global main
main:
/* 0x20026 == ADP_Stopped_ApplicationExit */
mov x1, #0x26
movk x1, #2, lsl #16
str x1, [sp,#0]

/* Exit status code. Host QEMU process exits with that status. */
mov x0, #0
str x0, [sp,#8]

/* x1 contains the address of parameter block.
* Any memory address could be used. */
mov x1, sp

/* SYS_EXIT */
mov w0, #0x18

/* Do the semihosting call on A64. */
hlt 0xf000
3 changes: 3 additions & 0 deletions baremetal/arch/arm/semihost_exit.S
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
.global main
main:
/* SYS_EXIT */
mov r0, #0x18
/* ADP_Stopped_ApplicationExit */
ldr r1, =#0x20026
/* Do the semihosting call on A32. */
svc 0x00123456
13 changes: 13 additions & 0 deletions baremetal/lib/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,21 @@ int _write(int file, char *ptr, int len) {
return len;
}

/* Only 0 is supported for now, arm semihosting cannot handle it. */
void _exit(int status) {
#if defined(__arm__)
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
#elif defined(__aarch64__)
/* TODO actually use the exit value here, just for fun. */
__asm__ __volatile__ (
"mov x1, #0x26\n" \
"movk x1, #2, lsl #16\n" \
"str x1, [sp,#0]\n" \
"mov x0, #0\n" \
"str x0, [sp,#8]\n" \
"mov x1, sp\n" \
"mov w0, #0x18\n" \
"hlt 0xf000\n"
);
#endif
}
4 changes: 2 additions & 2 deletions build-all
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ for arch in $archs; do
if [ ! "$arch" = x86_64 ]; then
./build-crosstool-ng --arch "$arch"
./build-baremetal --arch "$arch"
./build-baremetal --arch "$arch" -g
./build-baremetal --arch "$arch" -g --machine RealViewPBX
./build-baremetal --arch "$arch" --gem5
./build-baremetal --arch "$arch" --gem5 --machine RealViewPBX
fi
done
38 changes: 21 additions & 17 deletions build-baremetal
Original file line number Diff line number Diff line change
Expand Up @@ -119,23 +119,27 @@ def main(args, extra_args=None):
bootloader_obj=bootloader_obj,
common_obj=common_obj,
)
build_dir(
os.path.join('arch', args.arch),
gcc=gcc,
cflags=cflags,
entry_address=entry_address,
bootloader_obj=bootloader_obj,
common_obj=common_obj,
)
build_dir(
os.path.join('arch', args.arch, 'no_bootloader'),
gcc=gcc,
cflags=cflags,
entry_address=entry_address,
bootloader_obj=bootloader_obj,
common_obj=common_obj,
bootloader=False,
)
arch_dir = os.path.join('arch', args.arch)
if os.path.isdir(os.path.join(common.baremetal_src_dir, arch_dir)):
build_dir(
arch_dir,
gcc=gcc,
cflags=cflags,
entry_address=entry_address,
bootloader_obj=bootloader_obj,
common_obj=common_obj,
)
arch_dir = os.path.join('arch', args.arch, 'no_bootloader')
if os.path.isdir(os.path.join(common.baremetal_src_dir, arch_dir)):
build_dir(
arch_dir,
gcc=gcc,
cflags=cflags,
entry_address=entry_address,
bootloader_obj=bootloader_obj,
common_obj=common_obj,
bootloader=False,
)
return 0

if __name__ == '__main__':
Expand Down
2 changes: 1 addition & 1 deletion run
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ def main(args, extra_args=None):
'-device', 'edu',
])
elif args.arch == 'arm' or args.arch == 'aarch64':
extra_qemu_args.append('-semihosting')
extra_emulator_args.append('-semihosting')
if args.kgdb:
kernel_cli += ' kgdboc=ttyAMA0,115200'
if args.arch == 'arm':
Expand Down

0 comments on commit c53ccb0

Please sign in to comment.