Index: apps/embiosapp.h |
— | — | @@ -7,7 +7,7 @@ |
8 | 8 |
|
9 | 9 | #define EMBIOS_APP_HEADER(threadnamestr, stacksizebytes, mainfunc, threadprio) \
|
10 | 10 | uint32_t __embios_thread_stack[stacksizebytes >> 2]; \
|
11 | | - char __embios_thread_name[] = threadnamestr; \
|
| 11 | + const char __embios_thread_name[] = threadnamestr; \
|
12 | 12 | struct embios_app_header \
|
13 | 13 | { \
|
14 | 14 | char signature[8]; \
|
— | — | @@ -18,7 +18,7 @@ |
19 | 19 | void* stackaddr; \
|
20 | 20 | int stacksize; \
|
21 | 21 | void* entrypoint; \
|
22 | | - char* threadname; \
|
| 22 | + const char* threadname; \
|
23 | 23 | int threadtype; \
|
24 | 24 | int threadpriority; \
|
25 | 25 | } __embios_executable_hdr __attribute__((section(".execheader"))) = \
|
— | — | @@ -35,10 +35,15 @@ |
36 | 36 | .threadtype = 0, \
|
37 | 37 | .threadpriority = threadprio \
|
38 | 38 | }; \
|
39 | | - struct embios_syscall_table* __embios_syscall;
|
| 39 | + struct embios_syscall_table* __embios_syscall; \
|
| 40 | + const uint32_t __embios_required_version = EMBIOS_API_VERSION; \
|
| 41 | + const char __embios_incompatible_api_str[] = "Incompatible API version!\nGot %d, need %d";
|
40 | 42 |
|
41 | 43 |
|
42 | 44 | #define embios_init() \
|
43 | | - asm volatile("swi\t2\n\tldr\tr1,\t=__embios_syscall\n\tstr\tr0,\t[r1]\n\t" \
|
| 45 | + asm volatile("swi\t2\n\tldr\tr3,\t=__embios_required_version\nldr\tr3,\t[r3]\n\t" \
|
| 46 | + "ldr\tr2,\t[r0]\n\tcmp\tr3,\tr2\n\tldrls\tr1,\t[r0,#4]\n\tcmpls\tr1,\tr3\n\t" \
|
| 47 | + "movhi\tr0,\t#0\n\tldrhi\tr1,\t=__embios_incompatible_api_str\n\t" \
|
| 48 | + "swihi\t1\n\tldr\tr1,\t=__embios_syscall\n\tstr\tr0,\t[r1]\n\t" \
|
44 | 49 | ::: "r0", "r1", "r2", "r3", "r12", "lr", "cc", "memory");
|
45 | 50 |
|
Index: apps/syscallapi.h |
— | — | @@ -56,6 +56,8 @@ |
57 | 57 |
|
58 | 58 | struct embios_syscall_table
|
59 | 59 | {
|
| 60 | + uint32_t table_version;
|
| 61 | + uint32_t table_minversion;
|
60 | 62 | void (*panic) (enum panic_severity severity, const char* string);
|
61 | 63 | void (*panicf) (enum panic_severity severity, const char* fmt, ...);
|
62 | 64 | };
|
Index: embios/trunk/syscallapi.c |
— | — | @@ -28,6 +28,8 @@ |
29 | 29 |
|
30 | 30 | struct embios_syscall_table syscall_table ICONST_ATTR =
|
31 | 31 | {
|
| 32 | + .table_version = EMBIOS_API_VERSION,
|
| 33 | + .table_minversion = EMBIOS_MIN_API_VERSION,
|
32 | 34 | .panic = panic,
|
33 | 35 | .panicf = panicf
|
34 | 36 | };
|
Index: embios/trunk/syscallapi.h |
— | — | @@ -56,6 +56,8 @@ |
57 | 57 |
|
58 | 58 | struct embios_syscall_table
|
59 | 59 | {
|
| 60 | + uint32_t table_version;
|
| 61 | + uint32_t table_minversion;
|
60 | 62 | void (*panic) (enum panic_severity severity, const char* string);
|
61 | 63 | void (*panicf) (enum panic_severity severity, const char* fmt, ...);
|
62 | 64 | };
|