diff --git a/apps/c/suicide/Makefile b/apps/c/suicide/Makefile new file mode 100644 index 0000000..15c2430 --- /dev/null +++ b/apps/c/suicide/Makefile @@ -0,0 +1,21 @@ +SRC_LIBSEL4 ?= $(ROOTDIR)/kata/kernel/libsel4 +OUT_KATA ?= $(OUT)/kata/riscv32-unknown-elf/release +OUT_TMP ?= $(OUT)/tmp/suicide + +INCLUDES += -I$(SRC_LIBSEL4)/arch_include/riscv +INCLUDES += -I$(SRC_LIBSEL4)/include +INCLUDES += -I$(SRC_LIBSEL4)/mode_include/32 +INCLUDES += -I$(SRC_LIBSEL4)/sel4_arch_include/riscv32/ +INCLUDES += -I$(OUT_KATA)/kernel/gen_config +INCLUDES += -I$(OUT_KATA)/libsel4/autoconf +INCLUDES += -I$(OUT_KATA)/libsel4/gen_config/ +INCLUDES += -I$(OUT_KATA)/libsel4/include +INCLUDES += -I$(OUT_KATA)/libsel4/sel4_arch_include/riscv32 + +OPT:=-O0 +DBG:=-g + +$(OUT_TMP)/suicide.elf: suicide.c + mkdir -p $(OUT_TMP) + riscv32-unknown-elf-gcc $(DBG) $(OPT) $(INCLUDES) -march=rv32imac -mabi=ilp32 -std=gnu11 -c suicide.c -o $(OUT_TMP)/suicide.o + riscv32-unknown-elf-gcc $(DBG) -static -nostdlib $(OUT_TMP)/suicide.o -o $(OUT_TMP)/suicide.elf diff --git a/apps/c/suicide/suicide.c b/apps/c/suicide/suicide.c new file mode 100644 index 0000000..0245537 --- /dev/null +++ b/apps/c/suicide/suicide.c @@ -0,0 +1,41 @@ +/* + * Copyright 2021, Google LLC + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// This file is a barebones, minimal-dependency test application that simply +// derefrences a null pointer to kill itself. It's primary use case is to test +// out KataOS' fault handlers. + +#include +#include +#include +#include + +__thread seL4_IPCBuffer *__sel4_ipc_buffer; + +char minisel_tls[4096] __attribute__((__aligned__(4096))); + +__attribute__((naked)) void _start() { + asm volatile( + ".option push \n" + ".option norelax \n" + "la gp, __global_pointer$ \n" + "la x4, minisel_tls \n" + "addi sp,sp,-16 \n" + "sw a0, 12(sp) \n" + "sw a1, 8(sp) \n" + "sw a2, 4(sp) \n" + "sw a3, 0(sp) \n" + ".option pop \n" + "j main \n"); +} + +int main(int a0, int a1, int a2, int a3) { + seL4_DebugPutString("Goodbye, cruel world!\n"); + while (1) { + char *p = 0x0; + *p = 'g'; + } +}