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 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,
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,
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/// \brief SVC handler -- immediately returns
137static void
141 uint32_t arg1,
142 uint32_t arg2
143 )
144 {
146
148
149 switch (svcRequest)
150 {
152 {
153 uint32_t ** const pResult = (uint32_t **)arg1;
154 McciBootloaderBoard_CatenaAbz_Eeprom_t * const pEeprom =
156
157 /* return pointer to user */
158 if (pResult != NULL)
159 *pResult = &pEeprom->fUpdateRequest;
160 else
162 }
163 break;
164
166 {
167 mcci_tweetnacl_sha512_t * const pHash = (void *)arg1;
168
169 mcci_tweetnacl_hashblocks_sha512_init(pHash);
170 }
171 break;
172
174 {
176 pArg = (void *)arg1;
177
178 if (arg1 == 0 || (arg1 & 3) != 0)
180 else
181 {
182 mcci_tweetnacl_sha512_t * const pHash = pArg->pHash;
183 pArg->nMessage = mcci_tweetnacl_hashblocks_sha512(
184 pHash,
185 pArg->pMessage,
186 pArg->nMessage
187 );
188 }
189 }
190 break;
191
193 {
195 pArg = (void *)arg1;
196
197 if (arg1 == 0 || (arg1 & 3) != 0)
199 else
200 {
201 mcci_tweetnacl_sha512_t * const pHash = pArg->pHash;
202 mcci_tweetnacl_hashblocks_sha512_finish(
203 pHash,
204 pArg->pMessage,
205 pArg->nMessage,
206 pArg->nOverall
207 );
208 }
209 }
210 break;
211
213 {
214 const mcci_tweetnacl_sha512_t * const
215 pArg1 = (void *)arg1;
216 const mcci_tweetnacl_sha512_t * const
217 pArg2 = (void *)arg2;
218
219 mcci_tweetnacl_result_t const r = mcci_tweetnacl_verify_64(pArg1->bytes, pArg2->bytes);
220 err = mcci_tweetnacl_result_is_success(r)
223 ;
224 }
225 break;
226
227 default:
229 break;
230 }
231
232 // return result
233 *pErrorCode = err;
234 }
235
236/**** end of mccibootloaderboard_catenaabz_vectors.c ****/
const void * gk_McciBootloader_ImageSize
void * g_McciBootloader_StackTop
#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