1
0
Fork 0
forked from len0rd/rockbox
foxbox/bootloader/x1000/x1000bootloader.h
Aidan MacDonald f7a341555d fiiom3k: trim OF kernel arguments to fix boot hangs
The M3K's kernel has an incredibly stupid function that mangles the
kernel args and copies them to a 100-byte buffer without any kind of
bounds checking. So, if the kernel arguments are more than 99 chars
the stack may be corrupted, sometimes crashing the kernel.

Fortunately, most of the arguments the OF uses are useless, and the
truly necessary arguments fit within the absurd 99-char limit.

Change-Id: I01ef4513298f79d3c08538239802c21e88509631
2022-03-24 23:40:07 +00:00

174 lines
5.3 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2021-2022 Aidan MacDonald
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef __X1000BOOTLOADER_H__
#define __X1000BOOTLOADER_H__
#include "config.h"
#include "lcd.h"
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
struct uimage_header;
#if defined(FIIO_M3K)
# define BL_RECOVERY BUTTON_VOL_UP
# define BL_UP BUTTON_VOL_UP
# define BL_DOWN BUTTON_VOL_DOWN
# define BL_SELECT BUTTON_PLAY
# define BL_QUIT BUTTON_POWER
# define BL_UP_NAME "VOL+"
# define BL_DOWN_NAME "VOL-"
# define BL_SELECT_NAME "PLAY"
# define BL_QUIT_NAME "POWER"
# define BOOTBACKUP_FILE "/fiiom3k-boot.bin"
# define OF_PLAYER_NAME "FiiO player"
# define OF_PLAYER_ADDR 0x20000
# define OF_PLAYER_LENGTH (4 * 1024 * 1024)
/* WARNING: The length of kernel arguments cannot exceed 99 bytes on the M3K
* due to an Ingenic kernel bug: plat_mem_setup() calls ddr_param_change() and
* that function tries to copy the command line to an 100-char buffer without
* any bounds checking. Overflowing the buffer typically leads to disaster.
* It seems ddr_param_change() is not present on all Ingenic kernels and the
* bug may not affect the Q1. */
# define OF_PLAYER_ARGS OF_RECOVERY_ARGS \
" init=/linuxrc ubi.mtd=3 root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs rw"
# define OF_RECOVERY_NAME "FiiO recovery"
# define OF_RECOVERY_ADDR 0x420000
# define OF_RECOVERY_LENGTH (5 * 1024 * 1024)
# define OF_RECOVERY_ARGS \
"mem=64M console=ttyS2"
#elif defined(SHANLING_Q1)
# define BL_RECOVERY BUTTON_NEXT
# define BL_UP BUTTON_PREV
# define BL_DOWN BUTTON_NEXT
# define BL_SELECT BUTTON_PLAY
# define BL_QUIT BUTTON_POWER
# define BL_UP_NAME "PREV"
# define BL_DOWN_NAME "NEXT"
# define BL_SELECT_NAME "PLAY"
# define BL_QUIT_NAME "POWER"
# define BOOTBACKUP_FILE "/shanlingq1-boot.bin"
# define OF_PLAYER_NAME "Shanling player"
# define OF_PLAYER_ADDR 0x140000
# define OF_PLAYER_LENGTH (8 * 1024 * 1024)
# define OF_PLAYER_ARGS OF_RECOVERY_ARGS \
" init=/linuxrc ubi.mtd=5 root=ubi0:rootfs ubi.mtd=6 rootfstype=ubifs rw"
# define OF_RECOVERY_NAME "Shanling recovery"
# define OF_RECOVERY_ADDR 0x940000
# define OF_RECOVERY_LENGTH (10 * 1024 * 1024)
# define OF_RECOVERY_ARGS \
"mem=64M@0x0 no_console_suspend console=ttyS2,115200n8 lpj=5009408 ip=off"
#elif defined(EROS_QN)
# define BL_RECOVERY BUTTON_VOL_UP
# define BL_UP BUTTON_SCROLL_BACK
# define BL_DOWN BUTTON_SCROLL_FWD
# define BL_SELECT BUTTON_PLAY
# define BL_QUIT BUTTON_POWER
# define BL_UP_NAME "Up"
# define BL_DOWN_NAME "Scroll Down"
# define BL_SELECT_NAME "PLAY"
# define BL_QUIT_NAME "POWER"
# define BOOTBACKUP_FILE "/erosqnative-boot.bin"
#else
# error "Missing keymap!"
#endif
/*
* GUI stuff
*/
struct bl_listitem {
struct bl_list* list;
int index;
int x, y, width, height;
};
struct bl_list {
struct viewport* vp;
int num_items;
int selected_item;
int top_item;
int item_height;
void(*draw_item)(const struct bl_listitem* item);
};
void clearscreen(void);
void putversion(void);
void putcenter_y(int y, const char* msg);
void putcenter_line(int line, const char* msg);
void splash2(long delay, const char* msg, const char* msg2);
void splash(long delay, const char* msg);
int get_button(int timeout);
void init_lcd(void);
void gui_shutdown(void);
void gui_list_init(struct bl_list* list, struct viewport* vp);
void gui_list_draw(struct bl_list* list);
void gui_list_select(struct bl_list* list, int item_index);
void gui_list_scroll(struct bl_list* list, int delta);
/*
* Installer
*/
void bootloader_install(void);
void bootloader_backup(void);
void bootloader_restore(void);
/*
* Boot code
*/
void boot_rockbox(void);
void boot_of_player(void);
void boot_of_recovery(void);
void boot_linux(void);
void shutdown(void);
void reboot(void);
/*
* Misc
*/
enum {
DISK_PRESENT = 0,
DISK_ABSENT = -1,
DISK_CANCELED = -2,
};
int check_disk(bool wait);
void usb_mode(void);
int load_rockbox(const char* filename, size_t* sizep);
int load_uimage_file(const char* filename,
struct uimage_header* uh, size_t* sizep);
int load_uimage_flash(uint32_t addr, uint32_t length,
struct uimage_header* uh, size_t* sizep);
void recovery_menu(void) __attribute__((noreturn));
#endif /* __X1000BOOTLOADER_H__ */