forked from len0rd/rockbox
v1 passes the drive and partition number of the boot volume instead of using the volume number. The volume number isn't reliable because the same filesystem might get a different volume number once the firmware is loaded, which will cause the firmware to use the wrong root volume and fail to locate the correct .rockbox directory. Using drive and partition numbers avoids this issue because drive numbering is fixed and determined by the target. Change-Id: I7e68b892d9424a1f686197a6122e139b438e5f7e
94 lines
3 KiB
C
94 lines
3 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
*
|
|
* Copyright (C) 2017 by Amaury Pouly
|
|
*
|
|
* 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 __RB_BOOTDATA__
|
|
#define __RB_BOOTDATA__
|
|
|
|
#ifndef __ASSEMBLER__
|
|
#include <stdint.h>
|
|
#include "system.h"
|
|
#endif
|
|
|
|
/* /!\ This file can be included in assembly files /!\ */
|
|
|
|
/** The boot data will be filled by the bootloader with information that might
|
|
* be relevant for Rockbox. The bootloader will search for the structure using
|
|
* the magic header within the first BOOT_DATA_SEARCH_SIZE bytes of the binary.
|
|
* Typically, this structure should be as close as possible to the entry point */
|
|
|
|
/* Search size for the data structure after entry point */
|
|
#define BOOT_DATA_SEARCH_SIZE 1024
|
|
|
|
#define BOOT_DATA_MAGIC0 ('r' | 'b' << 8 | 'm' << 16 | 'a' << 24)
|
|
#define BOOT_DATA_MAGIC1 ('g' | 'i' << 8 | 'c' << 16 | '!' << 24)
|
|
#define BOOT_DATA_VERSION 1
|
|
|
|
/* maximum size of payload */
|
|
#define BOOT_DATA_PAYLOAD_SIZE 4
|
|
|
|
#ifndef __ASSEMBLER__
|
|
/* This is the C structure */
|
|
struct boot_data_t
|
|
{
|
|
union
|
|
{
|
|
uint32_t crc; /* crc of payload data (CRC32 with 0xffffffff for initial value) */
|
|
uint32_t magic[2]; /* BOOT_DATA_MAGIC0/1 */
|
|
};
|
|
|
|
uint32_t length; /* length of the payload */
|
|
|
|
/* add fields here */
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
uint8_t _boot_volume; /* IGNORED */
|
|
uint8_t version;
|
|
uint8_t boot_drive;
|
|
uint8_t boot_partition;
|
|
};
|
|
uint8_t payload[BOOT_DATA_PAYLOAD_SIZE];
|
|
};
|
|
} __attribute__((packed));
|
|
|
|
#if !defined(BOOTLOADER)
|
|
extern struct boot_data_t boot_data;
|
|
extern bool boot_data_valid;
|
|
|
|
void verify_boot_data(void) INIT_ATTR;
|
|
#endif
|
|
#else /* __ASSEMBLER__ */
|
|
|
|
/* This assembler macro implements an empty boot structure with just the magic
|
|
* string */
|
|
.macro put_boot_data_here
|
|
.global boot_data
|
|
boot_data:
|
|
.word BOOT_DATA_MAGIC0
|
|
.word BOOT_DATA_MAGIC1
|
|
.word BOOT_DATA_PAYLOAD_SIZE
|
|
.byte 0xff /* boot volume */
|
|
.byte BOOT_DATA_VERSION /* maximum supported boot protocol version */
|
|
.space (BOOT_DATA_PAYLOAD_SIZE - 2), 0xff /* remainder of payload */
|
|
.endm
|
|
|
|
#endif
|
|
|
|
#endif /* __RB_BOOTDATA__ */
|