Subversion Repositories freemyipod

Rev

Rev 116 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 116 Rev 299
Line 1... Line 1...
1
#include "syscallwrappers.h"
1
#include "syscallwrappers.h"
2
 
2
 
3
 
3
 
4
#define EMBIOS_APP_HEADER(threadnamestr, stacksizebytes, mainfunc, threadprio)                    \
4
#define EMBIOS_APP_HEADER(threadnamestr, stacksizebytes, mainfunc, threadprio)                    \
-
 
5
    extern char __bss_start;                                                                      \
-
 
6
    extern char __bss_end;                                                                        \
5
    void __embios_init()                                                                          \
7
    void __embios_init()                                                                          \
6
    {                                                                                             \
8
    {                                                                                             \
7
        asm volatile("swi\t2\n\tldr\tr3,\t=__embios_required_version\nldr\tr3,\t[r3]\n\t"         \
9
        asm volatile("swi\t2\n\tldr\tr3, =__embios_required_version\nldr\tr3, [r3]\n\t"           \
8
                     "ldr\tr2,\t[r0]\n\tcmp\tr3,\tr2\n\tldrls\tr1,\t[r0,#4]\n\tcmpls\tr1,\tr3\n\t"\
10
                     "ldr\tr2, [r0]\n\tcmp\tr3, r2\n\tldrls\tr1, [r0,#4]\n\tcmpls\tr1, r3\n\t"    \
9
                     "movhi\tr0,\t#0\n\tldrhi\tr1,\t=__embios_incompatible_api_str\n\t"           \
11
                     "movhi\tr0, #0\n\tldrhi\tr1, =__embios_incompatible_api_str\n\t"             \
10
                     "swihi\t1\n\tldr\tr1,\t=__embios_syscall\n\tstr\tr0,\t[r1]\n\t"              \
12
                     "swihi\t1\n\tldr\tr1, =__embios_syscall\n\tstr\tr0, [r1]\n\t"                \
11
                 ::: "r0", "r1", "r2", "r3", "r12", "lr", "cc", "memory");                        \
13
                 ::: "r0", "r1", "r2", "r3", "r12", "lr", "cc", "memory");                        \
-
 
14
        memset(&__bss_start, 0, (&__bss_end) - (&__bss_start));                                   \
12
        mainfunc();                                                                               \
15
        mainfunc();                                                                               \
13
    }                                                                                             \
16
    }                                                                                             \
14
    uint32_t __embios_thread_stack[stacksizebytes >> 2];                                          \
17
    uint32_t __embios_thread_stack[stacksizebytes >> 2] __attribute__((section(".stack")));       \
15
    const char __embios_thread_name[] = threadnamestr;                                            \
18
    const char __embios_thread_name[] = threadnamestr;                                            \
16
    struct embios_app_header                                                                      \
19
    struct embios_app_header                                                                      \
17
    {                                                                                             \
20
    {                                                                                             \
18
        char signature[8];                                                                        \
21
        char signature[8];                                                                        \
19
        int version;                                                                              \
22
        int version;                                                                              \
Line 38... Line 41...
38
        .entrypoint = __embios_init,                                                              \
41
        .entrypoint = __embios_init,                                                              \
39
        .threadname = __embios_thread_name,                                                       \
42
        .threadname = __embios_thread_name,                                                       \
40
        .threadtype = 0,                                                                          \
43
        .threadtype = 0,                                                                          \
41
        .threadpriority = threadprio                                                              \
44
        .threadpriority = threadprio                                                              \
42
    };                                                                                            \
45
    };                                                                                            \
43
    struct embios_syscall_table* __embios_syscall;                                                \
46
    struct embios_syscall_table* __embios_syscall __attribute__((section(".stack")));             \
44
    const uint32_t __embios_required_version = EMBIOS_API_VERSION;                                \
47
    const uint32_t __embios_required_version = EMBIOS_API_VERSION;                                \
45
    const char __embios_incompatible_api_str[] = "Incompatible API version!\nGot %d, need %d";
48
    const char __embios_incompatible_api_str[] = "Incompatible API version!\nGot %d, need %d";