summaryrefslogtreecommitdiffstats
path: root/arch/sandbox
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sandbox')
-rw-r--r--arch/sandbox/board/Makefile1
-rw-r--r--arch/sandbox/board/restart.c17
-rw-r--r--arch/sandbox/mach-sandbox/include/mach/linux.h1
-rw-r--r--arch/sandbox/os/common.c6
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);