99
1010#include "loadable_binaries.h"
1111
12-
13- #define FLASH_BUFFER_SIZE 4096
14- #define RETURNCODE_SUCCESS 0
15-
16- static bool setup_done = false; // to check if setup is done
17- static bool write_done = false; // to check if writing to flash is done
18- static bool finalize_done = false; // to check if the kernel is done finalizing the process binary
19- static bool load_done = false; // to check if the process was loaded successfully
20- static bool abort_done = false; // to check if the process binary writing
21- // was aborted successfully
12+ /******************************************************************************************************
13+ * Callback Tracking Flags
14+ ******************************************************************************************************/
15+ static bool setup_done = false; // to check if setup is done
16+ static bool abort_done = false; // to check if write abort was successful
2217
2318/******************************************************************************************************
2419* Function Prototypes
@@ -28,9 +23,8 @@ void abort_test(void);
2823/******************************************************************************************************
2924 * Callback functions
3025 *
31- * 1. Callback to let us know when the capsule is done writing data to flash
32- * 2. Set callback to initiate the dynamic app load process on receiving command from console
33- *
26+ * 1. Set callback to initiate the dynamic app load process
27+ * 2. Set callback to call `abort()` with a timer
3428 *******************************************************************************************************/
3529
3630static void app_setup_done_callback (__attribute__((unused )) int arg0 ,
@@ -40,48 +34,43 @@ static void app_setup_done_callback(__attribute__((unused)) int arg0,
4034 setup_done = true;
4135}
4236
43- static void app_write_done_callback (__attribute__((unused )) int arg0 ,
37+ static void app_abort_done_callback (__attribute__((unused )) int arg0 ,
4438 __attribute__((unused )) int arg1 ,
4539 __attribute__((unused )) int arg2 ,
4640 __attribute__((unused )) void * ud ) {
47- write_done = true;
48- }
49-
50- static void app_finalize_done_callback (__attribute__((unused )) int arg0 ,
51- __attribute__((unused )) int arg1 ,
52- __attribute__((unused )) int arg2 ,
53- __attribute__((unused )) void * ud ) {
54- finalize_done = true;
41+ abort_done = true;
5542}
5643
57- static void app_load_done_callback (int arg0 ,
58- __attribute__((unused )) int arg1 ,
59- __attribute__((unused )) int arg2 ,
60- __attribute__((unused )) void * ud ) {
61-
62- if (arg0 != RETURNCODE_SUCCESS ) {
63- printf ("[Error] Process creation failed: %d.\n" , arg0 );
64- } else {
65- printf ("[Success] Process created successfully.\n" );
44+ static void abort_alarm_cb (__attribute__ ((unused )) uint32_t now ,
45+ __attribute__ ((unused )) uint32_t scheduled ,
46+ __attribute__ ((unused )) void * opaque ) {
47+ printf ("[Timer] Triggering abort now.\n" );
48+ int ret = libtock_app_loader_abort (app_abort_done_callback );
49+ if (ret != RETURNCODE_SUCCESS ) {
50+ printf ("[Error] Abort Failed: %d.\n" , ret );
6651 }
67- load_done = true;
68- }
6952
70- static void app_abort_done_callback (__attribute__((unused )) int arg0 ,
71- __attribute__((unused )) int arg1 ,
72- __attribute__((unused )) int arg2 ,
73- __attribute__((unused )) void * ud ) {
74- abort_done = true;
53+ // wait on abort done callback
54+ yield_for (& abort_done );
55+ abort_done = false;
56+ printf ("[Success] Abort Successful.\n" );
7557}
7658
77- // Callback for console commands.
59+ /******************************************************************************************************
60+ * Function to test the abort functionality of Tock's dynamic app loading feature set
61+ *
62+ * Takes callback function as argument
63+ ******************************************************************************************************/
64+
7865void abort_test (void ) {
7966
67+ libtock_alarm_t abort_alarm ;
68+
8069 unsigned char * app_data = (uint8_t * )(uintptr_t )binaries [0 ];
8170 size_t app_size = binary_sizes [0 ];
8271 size_t binary_size = actual_sizes [0 ];
8372
84- int ret = libtock_app_loader_setup (app_size );
73+ int ret = libtock_app_loader_setup (app_size , app_setup_done_callback );
8574 if (ret != RETURNCODE_SUCCESS ) {
8675 printf ("[Error] Setup Failed: %d.\n" , ret );
8776 tock_exit (ret );
@@ -91,79 +80,18 @@ void abort_test(void) {
9180 yield_for (& setup_done );
9281 setup_done = false;
9382
83+ libtock_alarm_in_ms (150 , abort_alarm_cb , NULL , & abort_alarm );
84+
9485 printf ("[Success] Setup successful. Writing app to flash.\n" );
95- int ret1 = write_app (binary_size , app_data );
86+ int ret1 = libtock_app_loader_write (binary_size , app_data );
9687 if (ret1 != RETURNCODE_SUCCESS ) {
9788 printf ("[Error] App flash write unsuccessful: %d.\n" , ret1 );
9889 tock_exit (ret1 );
9990 }
10091}
10192
102-
10393/******************************************************************************************************
104- *
105- * Function to write the app into the flash
106- *
107- * Takes app size and the app binary as arguments
108- ******************************************************************************************************/
109-
110- int write_app (double size , uint8_t binary []) {
111-
112- uint32_t write_count = 0 ;
113- static uint8_t write_buffer [FLASH_BUFFER_SIZE ];
114- uint32_t flash_offset = 0 ;
115-
116- // This value can be changed to different sizes
117- // to mimic different bus widths.
118- uint32_t write_buffer_size = FLASH_BUFFER_SIZE ;
119-
120- // set the write buffer
121- int ret = libtock_app_loader_set_buffer (write_buffer , FLASH_BUFFER_SIZE );
122- if (ret != RETURNCODE_SUCCESS ) {
123- printf ("[Error] Failed to set the write buffer: %d.\n" , ret );
124- return -1 ;
125- }
126-
127- write_count = (size + write_buffer_size - 1 ) / write_buffer_size ;
128-
129- for (uint32_t offset = 0 ; offset < write_count ; offset ++ ) {
130-
131- memset (write_buffer , 0 , write_buffer_size );
132- // copy binary to write buffer
133- flash_offset = (offset * write_buffer_size );
134- size_t bytes_left = size - flash_offset ;
135- size_t chunk = bytes_left < write_buffer_size ? bytes_left : write_buffer_size ;
136- memcpy (write_buffer , & binary [write_buffer_size * offset ], chunk );
137- int ret1 = libtock_app_loader_write (flash_offset , write_buffer_size );
138- if (ret1 != 0 ) {
139- printf ("[Error] Failed writing data to flash at address: 0x%lx\n" , flash_offset );
140- printf ("[Error] Error nature: %d\n" , ret1 );
141- return -1 ;
142- }
143- // wait on write done callback
144- yield_for (& write_done );
145- write_done = false;
146- }
147-
148- printf ("[Log] Aborting Setup/Write.\n" );
149- int ret0 = libtock_app_loader_abort ();
150- if (ret0 != RETURNCODE_SUCCESS ) {
151- printf ("[Error] Abort Failed: %d.\n" , ret0 );
152- }
153-
154- // wait on abort done callback
155- yield_for (& abort_done );
156- abort_done = false;
157- printf ("[Success] Abort Successful.\n" );
158-
159- return 0 ;
160- }
161-
162-
163- /******************************************************************************************************
164- *
16594* Main
166- *
16795******************************************************************************************************/
16896
16997int main (void ) {
@@ -175,41 +103,6 @@ int main(void) {
175103 return -1 ;
176104 }
177105
178- // set up the setup done callback
179- int err1 = libtock_app_loader_set_setup_upcall (app_setup_done_callback , NULL );
180- if (err1 != 0 ) {
181- printf ("[Error] Failed to set setup done callback: %d\n" , err1 );
182- return err1 ;
183- }
184-
185- // set up the write done callback
186- int err2 = libtock_app_loader_set_write_upcall (app_write_done_callback , NULL );
187- if (err2 != 0 ) {
188- printf ("[Error] Failed to set flash write done callback: %d\n" , err2 );
189- return err2 ;
190- }
191-
192- // set up the finalize done callback
193- int err3 = libtock_app_loader_set_finalize_upcall (app_finalize_done_callback , NULL );
194- if (err3 != 0 ) {
195- printf ("[Error] Failed to set finalize done callback: %d\n" , err3 );
196- return err3 ;
197- }
198-
199- // set up the load done callback
200- int err4 = libtock_app_loader_set_load_upcall (app_load_done_callback , NULL );
201- if (err4 != 0 ) {
202- printf ("[Error] Failed to set load done callback: %d\n" , err4 );
203- return err4 ;
204- }
205-
206- // set up the abort done callback
207- int err5 = libtock_app_loader_set_abort_upcall (app_abort_done_callback , NULL );
208- if (err5 != 0 ) {
209- printf ("[Error] Failed to set abort done callback: %d\n" , err5 );
210- return err5 ;
211- }
212-
213106 libtocksync_alarm_delay_ms (5000 );
214107
215108 printf ("[Log] Initiating Abort Test.\n" );
0 commit comments