Subversion Repositories freemyipod

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
99 theseven 1
#include <stdint.h>
2
#include <stdarg.h>
3
#include <stdbool.h>
4
#include "syscallapi.h"
5
#include "syscallwrappers.h"
6
 
7
 
8
#define EMBIOS_APP_HEADER(threadnamestr, stacksizebytes, mainfunc, threadprio)                    \
9
    uint32_t __embios_thread_stack[stacksizebytes >> 2];                                          \
100 theseven 10
    const char __embios_thread_name[] = threadnamestr;                                            \
99 theseven 11
    struct embios_app_header                                                                      \
12
    {                                                                                             \
13
        char signature[8];                                                                        \
14
        int version;                                                                              \
15
        void* baseaddr;                                                                           \
16
        int size;                                                                                 \
17
        uint32_t crc32;                                                                           \
18
        void* stackaddr;                                                                          \
19
        int stacksize;                                                                            \
20
        void* entrypoint;                                                                         \
100 theseven 21
        const char* threadname;                                                                   \
99 theseven 22
        int threadtype;                                                                           \
23
        int threadpriority;                                                                       \
24
    } __embios_executable_hdr __attribute__((section(".execheader"))) =                           \
25
    {                                                                                             \
26
        .signature = "emBIexec",                                                                  \
27
        .version = 0,                                                                             \
28
        .baseaddr = &__embios_executable_hdr,                                                     \
29
        .size = -1,                                                                               \
30
        .crc32 = 0,                                                                               \
31
        .stackaddr = __embios_thread_stack,                                                       \
32
        .stacksize = stacksizebytes,                                                              \
33
        .entrypoint = mainfunc,                                                                   \
34
        .threadname = __embios_thread_name,                                                       \
35
        .threadtype = 0,                                                                          \
36
        .threadpriority = threadprio                                                              \
37
    };                                                                                            \
100 theseven 38
    struct embios_syscall_table* __embios_syscall;                                                \
39
    const uint32_t __embios_required_version = EMBIOS_API_VERSION;                                \
40
    const char __embios_incompatible_api_str[] = "Incompatible API version!\nGot %d, need %d";
99 theseven 41
 
42
 
43
#define embios_init()                                                                             \
100 theseven 44
    asm volatile("swi\t2\n\tldr\tr3,\t=__embios_required_version\nldr\tr3,\t[r3]\n\t"             \
45
                 "ldr\tr2,\t[r0]\n\tcmp\tr3,\tr2\n\tldrls\tr1,\t[r0,#4]\n\tcmpls\tr1,\tr3\n\t"    \
46
                 "movhi\tr0,\t#0\n\tldrhi\tr1,\t=__embios_incompatible_api_str\n\t"               \
47
                 "swihi\t1\n\tldr\tr1,\t=__embios_syscall\n\tstr\tr0,\t[r1]\n\t"                  \
99 theseven 48
             ::: "r0", "r1", "r2", "r3", "r12", "lr", "cc", "memory");
49