summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-03-04 00:59:39 +0000
committerAidan MacDonald <amachronic@protonmail.com>2022-03-12 18:25:10 +0000
commita87f93d8ffc6cf224947e88aee9cb912b8ec6f50 (patch)
tree5a7d51aaf50294a66140545af756ffa48f67bd55
parente6c2f26e8239a1d9e3db75fdb9d0fed05af992fa (diff)
downloadrockbox-a87f93d8ff.tar.gz
rockbox-a87f93d8ff.zip
x1000: add function for booting linux kernels
Change-Id: I0750b084fe88d21a8686daf0681b32b1dcba8fec
-rw-r--r--firmware/target/mips/ingenic_x1000/boot-x1000.c29
-rw-r--r--firmware/target/mips/ingenic_x1000/boot-x1000.h3
2 files changed, 32 insertions, 0 deletions
diff --git a/firmware/target/mips/ingenic_x1000/boot-x1000.c b/firmware/target/mips/ingenic_x1000/boot-x1000.c
index d3e6eb35d7..3ba060ffc4 100644
--- a/firmware/target/mips/ingenic_x1000/boot-x1000.c
+++ b/firmware/target/mips/ingenic_x1000/boot-x1000.c
@@ -102,6 +102,35 @@ void x1000_boot_rockbox(const void* source, size_t length)
while(1);
}
+void x1000_boot_linux(const void* source, size_t length,
+ void* load, void* entry, const char* args)
+{
+ size_t args_len = strlen(args);
+
+ disable_irq();
+
+ /* --- Beyond this point, do not call into DRAM --- */
+
+ void* safe_mem = (void*)X1000_IRAM_END;
+
+ /* copy argument string to a safe location */
+ char* args_copy = safe_mem + 32;
+ iram_memmove(args_copy, args, args_len);
+
+ /* generate argv array */
+ char** argv = safe_mem;
+ argv[0] = NULL;
+ argv[1] = args_copy;
+
+ iram_memmove(load, source, length);
+ commit_discard_idcache();
+
+ typedef void(*entry_fn)(long, char**, long, long);
+ entry_fn fn = (entry_fn)entry;
+ fn(2, argv, 0, 0);
+ while(1);
+}
+
void rolo_restart(const unsigned char* source, unsigned char* dest, int length)
{
(void)dest;
diff --git a/firmware/target/mips/ingenic_x1000/boot-x1000.h b/firmware/target/mips/ingenic_x1000/boot-x1000.h
index 620d7de89a..9faba649b5 100644
--- a/firmware/target/mips/ingenic_x1000/boot-x1000.h
+++ b/firmware/target/mips/ingenic_x1000/boot-x1000.h
@@ -47,6 +47,9 @@ enum {
void x1000_boot_rockbox(const void* source, size_t length)
__attribute__((section(".icode")));
+void x1000_boot_linux(const void* source, size_t length,
+ void* load, void* entry, const char* args)
+ __attribute__((section(".icode")));
/* Note: these functions are inlined to minimize SPL code size.
* They are private to the X1000 early boot code anyway... */