diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 45fe920c4..85aa19418 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -6,3 +6,4 @@ obj-y += ashrdi3.o obj-y += memory.o obj-$(CONFIG_CMD_MIPS_CPUINFO) += cpuinfo.o +obj-$(CONFIG_CMD_BOOTM) += bootm.o diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c new file mode 100644 index 000000000..3d6a4ce64 --- /dev/null +++ b/arch/mips/lib/bootm.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include + +#include + +static int do_bootm_barebox(struct image_data *data) +{ + void (*barebox)(void); + + barebox = read_file(data->os_file, NULL); + if (!barebox) + return -EINVAL; + + shutdown_barebox(); + + barebox(); + + reset_cpu(0); +} + +static struct image_handler barebox_handler = { + .name = "MIPS barebox", + .bootm = do_bootm_barebox, + .filetype = filetype_mips_barebox, +}; + +static struct binfmt_hook binfmt_barebox_hook = { + .type = filetype_mips_barebox, + .exec = "bootm", +}; + +static int mips_register_image_handler(void) +{ + register_image_handler(&barebox_handler); + binfmt_register(&binfmt_barebox_hook); + + return 0; +} +late_initcall(mips_register_image_handler); diff --git a/common/filetype.c b/common/filetype.c index 15a37325d..39c209886 100644 --- a/common/filetype.c +++ b/common/filetype.c @@ -78,6 +78,8 @@ enum filetype file_detect_type(void *_buf) return filetype_oftree; if (strncmp(buf8, "ANDROID!", 8) == 0) return filetype_aimage; + if (strncmp(buf8 + 0x10, "barebox", 7) == 0) + return filetype_mips_barebox; return filetype_unknown; } diff --git a/include/filetype.h b/include/filetype.h index 93387938b..f5de8ed2b 100644 --- a/include/filetype.h +++ b/include/filetype.h @@ -17,6 +17,7 @@ enum filetype { filetype_oftree, filetype_aimage, filetype_sh, + filetype_mips_barebox, }; const char *file_type_to_string(enum filetype f);