MCCI Trusted Bootloader
Simple trusted bootloader and tools for small embedded systems
mccibootloaderboard_catenaabz_vectors.c
Go to the documentation of this file.
1/*
2
3Module: mccibootloaderboard_catenaabz_vectors.c
4
5Function:
6 Vectors for bootloader for Catenas based on Murata type-ABZ module.
7
8Copyright and License:
9 This file copyright (C) 2021, 2026 by
10
11 MCCI Corporation
12 3520 Krums Corners Road
13 Ithaca, NY 14850
14
15 See accompanying LICENSE file for copyright and license information.
16
17Author:
18 Terry Moore, MCCI Corporation March 2021
19
20*/
21
23#include "mcci_bootloader.h"
26␌
27/****************************************************************************\
28|
29| Manifest constants & typedefs.
30|
31\****************************************************************************/
32
34
37
38/****************************************************************************\
39|
40| Read-only data.
41|
42\****************************************************************************/
43
46 {
47 .PageZero =
48 {
50 {
51 [0] = /* stack pointer */ (uint32_t) &g_McciBootloader_StackTop[0],
52 [1] = /* entry point */ (uint32_t) McciBootloader_main,
53 [2] = /* NMI */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
54 [3] = /* HardFault */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
55 [4] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
56 [5] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
57 [6] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
58 [7] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
59 [8] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
60 [9] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
61 [10] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
62 [11] = /* SVCall */ (uint32_t) McciBootloaderBoard_CatenaAbz_SvcHandler,
63 [12] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
64 [13] = /* reserved */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
65 [14] = /* PendSV */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
66 [15] = /* SysTick */ (uint32_t) McciBootloaderBoard_CatenaAbz_handleSysTick,
67 [16] = /* ExtInt(0) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
68 [17] = /* ExtInt(1) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
69 [18] = /* ExtInt(2) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
70 [19] = /* ExtInt(3) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
71 [20] = /* ExtInt(4) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
72 [21] = /* ExtInt(5) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
73 [22] = /* ExtInt(6) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
74 [23] = /* ExtInt(7) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
75 [24] = /* ExtInt(8) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
76 [25] = /* ExtInt(9) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
77 [26] = /* ExtInt(10) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
78 [27] = /* ExtInt(11) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
79 [28] = /* ExtInt(12) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
80 [29] = /* ExtInt(13) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
81 [30] = /* ExtInt(14) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
82 [31] = /* ExtInt(15) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
83 [32] = /* ExtInt(16) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
84 [33] = /* ExtInt(17) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
85 [34] = /* ExtInt(18) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
86 [35] = /* ExtInt(19) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
87 [36] = /* ExtInt(20) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
88 [37] = /* ExtInt(21) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
89 [38] = /* ExtInt(22) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
90 [39] = /* ExtInt(23) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
91 [40] = /* ExtInt(24) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
92 [41] = /* ExtInt(25) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
93 [42] = /* ExtInt(26) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
94 [43] = /* ExtInt(27) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
95 [44] = /* ExtInt(28) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
96 [45] = /* ExtInt(29) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
97 [46] = /* ExtInt(30) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
98 [47] = /* ExtInt(31) */ (uint32_t) McciBootloaderBoard_CatenaAbz_NotHandled,
99 },
100 .AppInfo =
101 {
103 .size = sizeof(McciBootloader_AppInfo_t),
104 .targetAddress = (uint32_t) &gk_McciBootloader_CortexVectors,
105 .imagesize = (uint32_t) &gk_McciBootloader_ImageSize[0],
106 .authsize = sizeof(McciBootloader_SignatureBlock_t),
107 }
108 }
109 };
110
111// instantiate the signature block.
112const McciBootloader_SignatureBlock_t
114
115/****************************************************************************\
116|
117| Variables.
118|
119\****************************************************************************/
120
121
122/****************************************************************************\
123|
124| Code
125|
126\****************************************************************************/
127
128/// \brief interrupt not handled; loop.
129static void
131 {
132 while (true)
133 ;
134 }
135
136///
137/// \brief SVC handler -- provides very limited facilities to the application
138/// after boot.
139///
140/// \details
141/// * McciBootloaderPlatform_ARMv6M_SvcRq_GetUpdatePointer: gets the address
142/// used by this bootloader for the EEPROM update flag.
143///
144/// * McciBootloaderPlatform_ARMv6M_SvcRq_HashInit: initializes a hash calculation.
145/// arg1 points to a 64 byte buffer that is filled with the initial
146/// hash value.
147///
148/// * McciBootloaderPlatform_ARMv6M_SvcRq_HashBlocks: accumulates hash.
149/// arg1 points to McciBootloaderPlatform_ARMv6M_SvcRq_HashBlocks_Arg_t
150/// object.
151///
152/// * McciBootloaderPlatform_ARMv6M_SvcRq_HashFinish: finishes a hash calculation.
153/// arg1 points to McciBootloaderPlatform_ARMv6M_SvcRq_HashFinish_Arg_t.
154///
155/// * McciBootloaderPlatform_ARMv6M_SvcRq_Verify64: does a time-invariant comparison
156/// of two 64-byte buffers.
157///
158/// TODO(tmm@mcci.com): this should be refactored because it's essentially portable.
159/// The board specific SVC handler should delegate to a portable common block of logic.
160///
161static void
165 uint32_t arg1,
166 uint32_t arg2
167 )
168 {
170
172
173 switch (svcRequest)
174 {
176 {
177 uint32_t ** const pResult = (uint32_t **)arg1;
178 McciBootloaderBoard_CatenaAbz_Eeprom_t * const pEeprom =
180
181 /* return pointer to user */
182 if (pResult != NULL)
183 *pResult = &pEeprom->fUpdateRequest;
184 else
186 }
187 break;
188
190 {
191 mcci_tweetnacl_sha512_t * const pHash = (void *)arg1;
192
193 mcci_tweetnacl_hashblocks_sha512_init(pHash);
194 }
195 break;
196
198 {
200 pArg = (void *)arg1;
201
202 if (arg1 == 0 || (arg1 & 3) != 0)
204 else
205 {
206 mcci_tweetnacl_sha512_t * const pHash = pArg->pHash;
207 pArg->nMessage = mcci_tweetnacl_hashblocks_sha512(
208 pHash,
209 pArg->pMessage,
210 pArg->nMessage
211 );
212 }
213 }
214 break;
215
217 {
219 pArg = (void *)arg1;
220
221 if (arg1 == 0 || (arg1 & 3) != 0)
223 else
224 {
225 mcci_tweetnacl_sha512_t * const pHash = pArg->pHash;
226 mcci_tweetnacl_hashblocks_sha512_finish(
227 pHash,
228 pArg->pMessage,
229 pArg->nMessage,
230 pArg->nOverall
231 );
232 }
233 }
234 break;
235
237 {
238 const mcci_tweetnacl_sha512_t * const
239 pArg1 = (void *)arg1;
240 const mcci_tweetnacl_sha512_t * const
241 pArg2 = (void *)arg2;
242
243 mcci_tweetnacl_result_t const r = mcci_tweetnacl_verify_64(pArg1->bytes, pArg2->bytes);
244 err = mcci_tweetnacl_result_is_success(r)
247 ;
248 }
249 break;
250
251 default:
253 break;
254 }
255
256 // return result
257 *pErrorCode = err;
258 }
259
260/**** end of mccibootloaderboard_catenaabz_vectors.c ****/
const uint8_t gk_McciBootloader_ImageSize[]
bootloader image size in bytes (linker-computed integer; use as (uint32_t) &gk_McciBootloader_ImageSi...
uint8_t g_McciBootloader_StackTop[]
initial stack pointer value (top of stack, linker-defined).
#define MCCI_BOOTLOADER_APP_INFO_MAGIC
McciBootloaderBoard_CatenaAbz_Eeprom_t * McciBootloaderBoard_CatenaAbz_getEepromPointer(void)
void McciBootloaderBoard_CatenaAbz_handleSysTick(void)
void() McciBootloaderPlatform_ARMv6M_SvcHandlerFn_t(McciBootloaderPlatform_ARMv6M_SvcRq_t svcRequest, McciBootloaderPlatform_ARMv6M_SvcError_t *pErrorCode, uint32_t arg1, uint32_t arg2)
SVC function interface.
McciBootloaderPlatform_ARMv6M_SvcRq_t
SVC request codes for boot loader on ARMv6-M systems & such like.
@ McciBootloaderPlatform_ARMv6M_SvcRq_HashFinish
Call mcci_tweetnacl_hashblocks_finish().
@ McciBootloaderPlatform_ARMv6M_SvcRq_HashBlocks
Call mcci_tweetnacl_hashblocks_sha512().
@ McciBootloaderPlatform_ARMv6M_SvcRq_GetUpdatePointer
Fetch pointer to uint32_t "update" flag in EEPROM.
@ McciBootloaderPlatform_ARMv6M_SvcRq_HashInit
Call mcci_tweetnacl_hashblocks_sha512_init(). arg1 is pointer to hash block.
@ McciBootloaderPlatform_ARMv6M_SvcRq_Verify64
Call mcci_tweetnacl_verify64().
McciBootloaderPlatform_ARMv6M_SvcError_t
error codes from SVC handler on ARMv6-M systems & such like
@ McciBootloaderPlatform_SvcError_VerifyFailure
error: verify failure
@ McciBootloaderPlatform_SvcError_OK
successful processing
@ McciBootloaderPlatform_SvcError_InvalidParameter
error: invalid parameter to SVC
@ McciBootloaderPlatform_SvcError_Unclaimed
error: SVC isn't just unimplemented, it's unkown to the bootloader
void McciBootloader_main(void)
static void McciBootloaderBoard_CatenaAbz_NotHandled(void)
interrupt not handled; loop.
const McciBootloader_SignatureBlock_t gk_McciBootloader_SignatureBlock
the application signature block
static McciBootloaderPlatform_ARMv6M_SvcHandlerFn_t McciBootloaderBoard_CatenaAbz_SvcHandler
const McciBootloader_CortexPageZero_t gk_McciBootloader_CortexVectors
the CortexM0 vectors for the boot loader.
argument to McciBootloaderPlatform_ARMv6M_SvcRq_HashBlocks
argument to McciBootloaderPlatform_ARMv6M_SvcRq_HashFinish
McciBootloader_CortexPageZeroContents_t PageZero