Menu Toggle
v2.3.1 (RP2350)
Toggle main menu visibility
Loading...
Searching...
No Matches
picobin.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3
*
4
* SPDX-License-Identifier: BSD-3-Clause
5
*/
6
7
#ifndef _BOOT_PICOBIN_H
8
#define _BOOT_PICOBIN_H
9
10
#ifndef _u
11
#ifdef __ASSEMBLER__
12
#define _u(x) x
13
#else
14
#define _u(x) x ## u
15
#endif
16
#endif
17
23
24
// these are designed to not look like (likely) 16/32-bit ARM or RISC-V instructions or look like valid pointers
25
#define PICOBIN_BLOCK_MARKER_START _u(0xffffded3)
26
#define PICOBIN_BLOCK_MARKER_END _u(0xab123579)
27
28
#define PICOBIN_MAX_BLOCK_SIZE _u(0x280)
29
#define PICOBIN_MAX_IMAGE_DEF_BLOCK_SIZE _u(0x180)
30
#define PICOBIN_MAX_PARTITION_TABLE_BLOCK_SIZE _u(0x280)
31
32
// note bit 6 is used to make parity even
33
#define PICOBIN_BLOCK_ITEM_1BS_NEXT_BLOCK_OFFSET _u(0x41)
34
#define PICOBIN_BLOCK_ITEM_1BS_IMAGE_TYPE _u(0x42)
35
#define PICOBIN_BLOCK_ITEM_1BS_VECTOR_TABLE _u(0x03)
36
#define PICOBIN_BLOCK_ITEM_1BS_ENTRY_POINT _u(0x44)
37
#define PICOBIN_BLOCK_ITEM_1BS_ROLLING_WINDOW_DELTA _u(0x05)
38
#define PICOBIN_BLOCK_ITEM_LOAD_MAP _u(0x06)
39
#define PICOBIN_BLOCK_ITEM_1BS_HASH_DEF _u(0x47)
40
#define PICOBIN_BLOCK_ITEM_1BS_VERSION _u(0x48)
41
#define PICOBIN_BLOCK_ITEM_SIGNATURE _u(0x09)
42
#define PICOBIN_BLOCK_ITEM_PARTITION_TABLE _u(0x0a)
43
#define PICOBIN_BLOCK_ITEM_HASH_VALUE _u(0x4b)
44
#define PICOBIN_BLOCK_ITEM_SALT _u(0x0c)
45
46
#define PICOBIN_BLOCK_ITEM_2BS_IGNORED (_u(0x80) | _u(0x7e))
47
#define PICOBIN_BLOCK_ITEM_2BS_LAST (_u(0x80) | _u(0x7f))
48
49
// ----
50
51
#define _PICOBIN_INDEX_TO_BITS(y, x) (y ## x << y ## _LSB)
52
#define PICOBIN_INDEX_TO_BITS(y, x) (y ## _ ## x << y ## _LSB)
53
54
#define PICOBIN_IMAGE_TYPE_IMAGE_TYPE_LSB _u(0)
55
#define PICOBIN_IMAGE_TYPE_IMAGE_TYPE_BITS _u(0x000f)
56
#define PICOBIN_IMAGE_TYPE_IMAGE_TYPE_INVALID _u(0x0)
57
#define PICOBIN_IMAGE_TYPE_IMAGE_TYPE_EXE _u(0x1)
58
#define PICOBIN_IMAGE_TYPE_IMAGE_TYPE_DATA _u(0x2)
59
#define PICOBIN_IMAGE_TYPE_IMAGE_TYPE_AS_BITS(x) _PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_IMAGE_TYPE, _ ## x)
60
61
#define PICOBIN_IMAGE_TYPE_EXE_SECURITY_LSB _u(4)
62
#define PICOBIN_IMAGE_TYPE_EXE_SECURITY_BITS _u(0x0030)
63
#define PICOBIN_IMAGE_TYPE_EXE_SECURITY_UNSPECIFIED _u(0x0)
64
#define PICOBIN_IMAGE_TYPE_EXE_SECURITY_NS _u(0x1)
65
#define PICOBIN_IMAGE_TYPE_EXE_SECURITY_S _u(0x2)
66
#define PICOBIN_IMAGE_TYPE_EXE_SECURITY_AS_BITS(x) _PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_EXE_SECURITY, _ ## x)
67
68
#define PICOBIN_IMAGE_TYPE_EXE_CPU_LSB _u(8)
69
#define PICOBIN_IMAGE_TYPE_EXE_CPU_BITS _u(0x0700)
70
#define PICOBIN_IMAGE_TYPE_EXE_CPU_ARM _u(0)
71
#define PICOBIN_IMAGE_TYPE_EXE_CPU_RISCV _u(1)
72
#define PICOBIN_IMAGE_TYPE_EXE_CPU_VARMULET _u(2)
73
#define PICOBIN_IMAGE_TYPE_EXE_CPU_AS_BITS(x) _PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_EXE_CPU, _ ## x)
74
75
#define PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_LSB _u(11)
76
#define PICOBIN_IMAGE_TYPE_EXE_EXTRA_SECURITY_BITS _u(0x0800)
77
78
#define PICOBIN_IMAGE_TYPE_EXE_CHIP_LSB _u(12)
79
#define PICOBIN_IMAGE_TYPE_EXE_CHIP_BITS _u(0x7000)
80
#define PICOBIN_IMAGE_TYPE_EXE_CHIP_RP2040 _u(0)
81
#define PICOBIN_IMAGE_TYPE_EXE_CHIP_RP2350 _u(1)
82
#define PICOBIN_IMAGE_TYPE_EXE_CHIP_AS_BITS(x) _PICOBIN_INDEX_TO_BITS(PICOBIN_IMAGE_TYPE_EXE_CHIP, _ ## x)
83
84
#define PICOBIN_IMAGE_TYPE_EXE_TBYB_BITS _u(0x8000)
85
86
// todo assert no overlap ^
87
88
#define PICOBIN_PARTITION_PERMISSIONS_LSB _u(26)
89
#define PICOBIN_PARTITION_PERMISSIONS_BITS _u(0xfc000000)
90
91
#define PICOBIN_PARTITION_PERMISSION_S_R_BITS _u(0x04000000)
92
#define PICOBIN_PARTITION_PERMISSION_S_W_BITS _u(0x08000000)
93
#define PICOBIN_PARTITION_PERMISSION_NS_R_BITS _u(0x10000000)
94
#define PICOBIN_PARTITION_PERMISSION_NS_W_BITS _u(0x20000000)
95
#define PICOBIN_PARTITION_PERMISSION_NSBOOT_R_BITS _u(0x40000000)
96
#define PICOBIN_PARTITION_PERMISSION_NSBOOT_W_BITS _u(0x80000000)
97
98
#define PICOBIN_PARTITION_LOCATION_FIRST_SECTOR_LSB _u(0)
99
#define PICOBIN_PARTITION_LOCATION_FIRST_SECTOR_BITS _u(0x00001fff)
100
#define PICOBIN_PARTITION_LOCATION_LAST_SECTOR_LSB _u(13)
101
#define PICOBIN_PARTITION_LOCATION_LAST_SECTOR_BITS _u(0x03ffe000)
102
103
#define PICOBIN_PARTITION_FLAGS_HAS_ID_BITS _u(0x00000001)
104
#define PICOBIN_PARTITION_FLAGS_LINK_TYPE_LSB _u(1)
105
#define PICOBIN_PARTITION_FLAGS_LINK_TYPE_BITS _u(0x00000006)
106
#define PICOBIN_PARTITION_FLAGS_LINK_VALUE_LSB _u(3)
107
#define PICOBIN_PARTITION_FLAGS_LINK_VALUE_BITS _u(0x00000078)
108
109
#define PICOBIN_PARTITION_MAX_EXTRA_FAMILIES _u(3)
110
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_NUM_EXTRA_FAMILIES_LSB _u(7)
111
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_NUM_EXTRA_FAMILIES_BITS _u(0x00000180)
112
// these are an optimization when booting in either ARM or RISC-V, to avoid looking at partitions
113
// which are known not to contain the right sort of binary, OR as a way to prevent
114
// auto-architecture-switch. NOTE: the first partition that can be booted, will be,
115
// so if you have a RISC-V binary in the first partition, and auto-arhcitecture-switch enabled, then
116
// even if booting under ARM, with an ARM binary in a later partition, the RISC-V binary
117
// will be booted by default; setting PICOBIN_PARTITION_FLAGS_IGNORED_DURING_ARM_BOOT_BITS
118
// on the partition, will have the RISC-V binary containing partition ignored under ARM
119
// boot
120
#define PICOBIN_PARTITION_FLAGS_IGNORED_DURING_ARM_BOOT_BITS _u(0x00000200)
121
#define PICOBIN_PARTITION_FLAGS_IGNORED_DURING_RISCV_BOOT_BITS _u(0x00000400)
122
#define PICOBIN_PARTITION_FLAGS_UF2_DOWNLOAD_AB_NON_BOOTABLE_OWNER_AFFINITY _u(0x00000800)
123
#define PICOBIN_PARTITION_FLAGS_HAS_NAME_BITS _u(0x00001000)
124
#define PICOBIN_PARTITION_FLAGS_UF2_DOWNLOAD_NO_REBOOT_BITS _u(0x00002000)
125
// we have a bit for each well known family-id .. note we expect there to be more in the future with new chips,
126
// but we have plenty of space for now.
127
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILIES_LSB _u(14)
128
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2040_BITS _u(0x00004000)
129
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_ABSOLUTE_BITS _u(0x00008000)
130
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_DATA_BITS _u(0x00010000)
131
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2350_ARM_S_BITS _u(0x00020000)
132
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2350_RISCV_BITS _u(0x00040000)
133
#define PICOBIN_PARTITION_FLAGS_ACCEPTS_DEFAULT_FAMILY_RP2350_ARM_NS_BITS _u(0x00080000)
134
135
#define PICOBIN_PARTITION_FLAGS_LINK_TYPE_NONE _u(0)
136
#define PICOBIN_PARTITION_FLAGS_LINK_TYPE_A_PARTITION _u(1)
137
#define PICOBIN_PARTITION_FLAGS_LINK_TYPE_OWNER_PARTITION _u(2)
138
#define PICOBIN_PARTITION_FLAGS_LINK_TYPE_AS_BITS(x) _PICOBIN_INDEX_TO_BITS(PICOBIN_PARTITION_FLAGS_LINK_TYPE, _ ## x)
139
140
141
#define PICOBIN_HASH_SHA256 _u(0x01)
142
143
#define PICOBIN_SIGNATURE_SECP256K1 _u(0x01)
144
145
#ifndef __ASSEMBLER__
146
147
#include <stdbool.h>
148
#include <stdint.h>
149
155
typedef
struct
{
156
// these must all be word aligned
157
uint32_t
storage_address_rel
;
158
uint32_t
runtime_address
;
159
uint32_t
size
;
160
}
picobin_load_map_entry
;
161
167
typedef
struct
{
168
uint32_t
header
;
169
picobin_load_map_entry
entries
[];
170
}
picobin_load_map
;
171
172
static
inline
unsigned
int
picobin_load_map_entry_count(
const
picobin_load_map
*lm) {
173
return
(lm->
header
<< 1) >> 25;
174
}
175
176
static
inline
bool
picobin_load_map_is_relative(
const
picobin_load_map
*lm) {
177
return
(int32_t)lm->
header
>= 0;
178
}
179
180
#endif
181
182
#endif
picobin_load_map_entry
A single entry in a PICOBIN load map.
Definition
picobin.h:155
picobin_load_map_entry::runtime_address
uint32_t runtime_address
Target runtime address to which the region is loaded.
Definition
picobin.h:158
picobin_load_map_entry::size
uint32_t size
If absolute then the end of the runtime address region, otherwise the size of the region in bytes.
Definition
picobin.h:159
picobin_load_map_entry::storage_address_rel
uint32_t storage_address_rel
Storage address of the region - if absolute then an absolute address, otherwise relative to the addre...
Definition
picobin.h:157
picobin_load_map
PICOBIN load map describing regions to copy from storage to RAM.
Definition
picobin.h:167
picobin_load_map::entries
picobin_load_map_entry entries[]
Array of load map entries.
Definition
picobin.h:169
picobin_load_map::header
uint32_t header
Encodes the item type, item size, entry count, and whether addresses are absolute or relative.
Definition
picobin.h:168