-
Notifications
You must be signed in to change notification settings - Fork 31
/
main.c
65 lines (53 loc) · 1.34 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <malloc.h>
#include "loader.h"
#include "app/sysent.h"
#define APP_PATH
#define APP_NAME "app-striped.elf"
#define APP_STACK_SIZE 2048
extern int open(const char *path, int mode, ...);
static const sysent_t sysentries = { /* */
open, /* */
close, /* */
write, /* */
read, /* */
printf, /* */
scanf /* */
};
static const ELFSymbol_t exports[] = { { "syscalls", (void*) &sysentries } };
static const ELFEnv_t env = { exports, sizeof(exports) / sizeof(*exports) };
int main(void)
{
exec_elf(APP_PATH APP_NAME, &env);
puts("Done");
return 0;
}
void *do_alloc(size_t size, size_t align, ELFSecPerm_t perm)
{
(void) perm;
/* TODO Change perms with MPU */
return memalign(align, size);
}
void arch_jumpTo(entry_t entry)
{
void *stack = do_alloc(APP_STACK_SIZE, 8, ELF_SEC_READ | ELF_SEC_WRITE);
if (stack) {
register uint32_t saved = 0;
void *tos = stack + APP_STACK_SIZE;
/* s->saved */
__asm__ volatile("MOV %0, sp\n\t" : : "r"(saved));
/* tos->MSP */
__asm__ volatile("MOV sp, %0\n\t" : : "r"(tos));
/* push saved */
__asm__ volatile("PUSH {%0}\n\t" : : "r"(saved));
entry();
/* pop saved */
__asm__ volatile("POP {%0}\n\t" : : "r"(saved));
/* saved->sp */
__asm__ volatile("MOV sp, %0\n\t" : : "r"(saved));
free(stack);
} else
perror("Stack alloc");
}