| /* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */ | |
| #include "util.h" | |
| static int var; | |
| static void breakpoint(void) { | |
| int break_here = 1; | |
| (void)break_here; | |
| } | |
| void mutate_var(void) { | |
| var = 22; | |
| atomic_printf("var is %d\n", var); | |
| } | |
| void print_nums(void) { | |
| int i; | |
| for (i = 1; i <= 5; ++i) { | |
| atomic_printf("%d ", i); | |
| } | |
| atomic_puts(""); | |
| } | |
| void alloc_and_print(void) { | |
| static const int num_bytes = 4096; | |
| char* str = mmap(NULL, num_bytes, PROT_WRITE | PROT_READ, | |
| MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); | |
| snprintf(str, num_bytes, "Hello %d", var); | |
| atomic_puts(str); | |
| munmap(str, num_bytes); | |
| } | |
| void make_unhandled_syscall(void) { | |
| ssize_t ret = kill(getpid(), SIGKILL); | |
| /* XXX the error return is somewhat arbitrary here, but as | |
| * long as |splice()| remains unimplemented in experiment | |
| * mode, it's reasonable to assume that the libc wrapper will | |
| * return -1 back to us. */ | |
| atomic_printf("return from kill: %zd\n", ret); | |
| } | |
| void print_time(void) { | |
| struct timespec ts = { -1, -1 }; | |
| double now_sec; | |
| clock_gettime(CLOCK_MONOTONIC, &ts); | |
| now_sec = (double)ts.tv_sec + (double)ts.tv_nsec / 1e9; | |
| atomic_printf("now is %g sec\n", now_sec); | |
| } | |
| static void make_stack_executable(void) { | |
| int v = 0; | |
| size_t page_size = sysconf(_SC_PAGESIZE); | |
| void* p = (void*)((uintptr_t)&v & ~((uintptr_t)page_size - 1)); | |
| int ret = mprotect(p, page_size, PROT_READ | PROT_WRITE | PROT_EXEC); | |
| test_assert(ret == 0 || errno == EACCES); | |
| } | |
| double xmm_arg(double d) { | |
| return d * 2; | |
| } | |
| int main(void) { | |
| var = -42; | |
| breakpoint(); | |
| atomic_printf("var is %d\n", var); | |
| test_assert(var == -42); | |
| make_stack_executable(); | |
| breakpoint(); | |
| atomic_puts("EXIT-SUCCESS"); | |
| return 0; | |
| /* not reached */ | |
| mutate_var(); | |
| print_nums(); | |
| alloc_and_print(); | |
| make_unhandled_syscall(); | |
| print_time(); | |
| xmm_arg(0); | |
| } |