diff options
Diffstat (limited to 'arch/sandbox')
-rw-r--r-- | arch/sandbox/board/Makefile | 1 | ||||
-rw-r--r-- | arch/sandbox/board/restart.c | 17 | ||||
-rw-r--r-- | arch/sandbox/mach-sandbox/include/mach/linux.h | 1 | ||||
-rw-r--r-- | arch/sandbox/os/common.c | 6 |
4 files changed, 22 insertions, 3 deletions
diff --git a/arch/sandbox/board/Makefile b/arch/sandbox/board/Makefile index 460116332d..333638ced6 100644 --- a/arch/sandbox/board/Makefile +++ b/arch/sandbox/board/Makefile @@ -4,5 +4,6 @@ obj-y += hostfile.o obj-y += console.o obj-y += devices.o obj-y += dtb.o +obj-y += restart.o extra-y += barebox.lds diff --git a/arch/sandbox/board/restart.c b/arch/sandbox/board/restart.c new file mode 100644 index 0000000000..79bf79a556 --- /dev/null +++ b/arch/sandbox/board/restart.c @@ -0,0 +1,17 @@ +#include <common.h> +#include <init.h> +#include <restart.h> +#include <mach/linux.h> + +static void sandbox_restart_cpu(struct restart_handler *restart) +{ + linux_exit(); +} + +static int restart_register_feature(void) +{ + restart_handler_register_fn(sandbox_restart_cpu); + + return 0; +} +coredevice_initcall(restart_register_feature); diff --git a/arch/sandbox/mach-sandbox/include/mach/linux.h b/arch/sandbox/mach-sandbox/include/mach/linux.h index 990173e10b..1e53f69ad7 100644 --- a/arch/sandbox/mach-sandbox/include/mach/linux.h +++ b/arch/sandbox/mach-sandbox/include/mach/linux.h @@ -15,6 +15,7 @@ int linux_read_nonblock(int fd, void *buf, size_t count); ssize_t linux_write(int fd, const void *buf, size_t count); off_t linux_lseek(int fildes, off_t offset); int linux_tstc(int fd); +void __attribute__((noreturn)) linux_exit(void); int linux_execve(const char * filename, char *const argv[], char *const envp[]); diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c index d627391890..67667d40da 100644 --- a/arch/sandbox/os/common.c +++ b/arch/sandbox/os/common.c @@ -115,7 +115,7 @@ uint64_t linux_get_time(void) return now; } -void __attribute__((noreturn)) reset_cpu(unsigned long addr) +void __attribute__((noreturn)) linux_exit(void) { cookmode(); exit(0); @@ -133,7 +133,7 @@ int linux_read(int fd, void *buf, size_t count) if (ret == 0) { printf("read on fd %d returned 0, device gone? - exiting\n", fd); - reset_cpu(0); + linux_exit(); } else if (ret == -1) { if (errno == EAGAIN) return -errno; @@ -141,7 +141,7 @@ int linux_read(int fd, void *buf, size_t count) continue; else { printf("read on fd %d returned -1, errno %d - exiting\n", fd, errno); - reset_cpu(0); + linux_exit(); } } } while (ret <= 0); |