freemyipod r453 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r452‎ | r453 | r454 >
Date:19:29, 19 January 2011
Author:theseven
Status:new
Tags:
Comment:
emCORE: Switch to new executable format
Modified paths:
  • /emcore/trunk/execimage.c (modified) (history)
  • /emcore/trunk/execimage.h (modified) (history)
  • /emcore/trunk/export/emcoreapp.h (modified) (history)
  • /emcore/trunk/export/syscallapi.h (modified) (history)
  • /emcore/trunk/export/syscallwrappers.h (modified) (history)
  • /emcore/trunk/init.c (modified) (history)
  • /emcore/trunk/syscallapi.c (modified) (history)
  • /emcore/trunk/thread.c (modified) (history)
  • /emcore/trunk/thread.h (modified) (history)
  • /emcore/trunk/usb/usb.c (modified) (history)

Diff [purge]

Index: emcore/trunk/init.c
@@ -180,7 +180,7 @@
181181 switch (option->type)
182182 {
183183 case BOOTTYPE_PIGGYBACKED:
184 - done = execimage(option->source, true) > 0;
 184+ done = execimage(option->source, true) != NULL;
185185 break;
186186
187187 #ifdef HAVE_BOOTFLASH
@@ -195,7 +195,7 @@
196196 free(buffer);
197197 break;
198198 }
199 - done = execimage(buffer, false);
 199+ done = execimage(buffer, false) != NULL;
200200 if (!done) free(buffer);
201201 break;
202202 }
@@ -225,7 +225,7 @@
226226 break;
227227 }
228228 close(fd);
229 - done = execimage(buffer, false);
 229+ done = execimage(buffer, false) != NULL;
230230 if (!done) free(buffer);
231231 break;
232232 }
Index: emcore/trunk/execimage.c
@@ -27,31 +27,92 @@
2828 #include "mmu.h"
2929
3030
31 -int execimage(void* image, bool nomalloc)
 31+struct scheduler_thread* execimage(void* image, bool copy)
3232 {
33 - struct execimage_header* header = (struct execimage_header*)image;
34 - if (memcmp(header, "emBIexec", 8))
 33+ struct emcoreapp_header* header = (struct emcoreapp_header*)image;
 34+ if (memcmp(header, "emCOexec", 8))
3535 {
36 - cprintf(CONSOLE_BOOT, "execimage: Bad signature!\n"
 36+ cprintf(CONSOLE_BOOT, "execimage: Bad signature: "
3737 "%02X %02X %02X %02X %02X %02X %02X %02X\n",
3838 header->signature[0], header->signature[1], header->signature[2],
3939 header->signature[3], header->signature[4], header->signature[5],
4040 header->signature[6], header->signature[7]);
41 - return -1;
 41+ return NULL;
4242 }
43 - if (header->version > 0)
 43+ if (header->version != EMCOREAPP_HEADER_VERSION)
4444 {
4545 cprintf(CONSOLE_BOOT, "execimage: Unsupported version! (%08X)\n", header->version);
46 - return -2;
 46+ return NULL;
4747 }
48 - if (header->baseaddr != image)
 48+ off_t offset = header->textstart;
 49+ size_t textsize = header->textsize;
 50+ size_t bsssize = header->bsssize;
 51+ size_t stacksize = header->stacksize;
 52+ off_t entrypoint = header->entrypoint;
 53+ off_t relocstart = header->relocstart - offset;
 54+ uint32_t reloccount = header->reloccount;
 55+ bool compressed = header->flags & EMCOREAPP_FLAG_COMPRESSED;
 56+ size_t finalsize = textsize + bsssize + stacksize;
 57+ size_t datasize = relocstart + reloccount * 4;
 58+ size_t tempsize = MAX(finalsize, datasize);
 59+ if (compressed)
4960 {
50 - cprintf(CONSOLE_BOOT, "execimage: Image loaded to wrong address! "
51 - "(expected: %08X, got: %08X)\n", header->baseaddr, image);
52 - return -3;
 61+ void* alloc = malloc(tempsize);
 62+ if (!alloc)
 63+ {
 64+ cprintf(CONSOLE_BOOT, "execimage: Out of memory!\n");
 65+ return NULL;
 66+ }
 67+ uint32_t decompsize;
 68+ if (ucl_decompress(image + offset, datasize, alloc, &decompsize))
 69+ {
 70+ cprintf(CONSOLE_BOOT, "execimage: Decompression failed!\n");
 71+ free(alloc);
 72+ return NULL;
 73+ }
 74+ if (datasize != decompsize)
 75+ {
 76+ cprintf(CONSOLE_BOOT, "execimage: Decompressed size mismatch!\n");
 77+ free(alloc);
 78+ return NULL;
 79+ }
 80+ if (!copy) free(image);
 81+ image = alloc;
5382 }
 83+ else if (copy)
 84+ {
 85+ void* alloc = malloc(tempsize);
 86+ if (!alloc)
 87+ {
 88+ cprintf(CONSOLE_BOOT, "execimage: Out of memory!\n");
 89+ return NULL;
 90+ }
 91+ memcpy(alloc, image + offset, datasize);
 92+ image = alloc;
 93+ }
 94+ else
 95+ {
 96+ memcpy(image, image + offset, datasize);
 97+ image = realloc(image, tempsize);
 98+ if (!image)
 99+ {
 100+ cprintf(CONSOLE_BOOT, "execimage: Out of memory!\n");
 101+ return NULL;
 102+ }
 103+ }
 104+ for (; reloccount; reloccount--, relocstart += 4)
 105+ {
 106+ off_t reloc = *((off_t*)(image + relocstart));
 107+ uint32_t data = *((uint32_t*)(image + reloc));
 108+ *((void**)(image + reloc)) = image + data;
 109+ }
 110+ if (tempsize != finalsize) realloc(image, finalsize); /* Can only shrink => safe */
54111 clean_dcache();
55112 invalidate_icache();
56 - return thread_create(header->threadname, header->entrypoint, header->stackaddr,
57 - header->stacksize, header->threadtype, header->threadpriority, true);
 113+ struct scheduler_thread* thread = thread_create(NULL, NULL, image + entrypoint,
 114+ image + textsize + bsssize, stacksize,
 115+ USER_THREAD, 127, false);
 116+ reownalloc(image, thread);
 117+ thread_resume(thread);
 118+ return thread;
58119 }
Index: emcore/trunk/execimage.h
@@ -1,6 +1,6 @@
22 //
33 //
4 -// Copyright 2010 TheSeven
 4+// Copyright 2011 TheSeven
55 //
66 //
77 // This file is part of emCORE.
@@ -25,26 +25,36 @@
2626 #define __EXECIMAGE_H__
2727
2828
 29+#ifdef _TOOL
 30+#include <stdint.h>
 31+#else
2932 #include "global.h"
 33+#include "thread.h"
 34+#endif
3035
3136
32 -struct execimage_header
 37+#define EMCOREAPP_HEADER_VERSION 1
 38+struct emcoreapp_header
3339 {
34 - char signature[8];
35 - int version;
36 - void* baseaddr;
37 - int size;
38 - uint32_t crc32;
39 - void* stackaddr;
40 - int stacksize;
41 - void* entrypoint;
42 - char* threadname;
43 - int threadtype;
44 - int threadpriority;
 40+ char signature[8];
 41+ uint32_t version;
 42+ off_t textstart;
 43+ size_t textsize;
 44+ size_t bsssize;
 45+ size_t stacksize;
 46+ off_t entrypoint;
 47+ off_t relocstart;
 48+ uint32_t reloccount;
 49+ uint32_t flags;
 50+ uint32_t creationtime;
4551 };
4652
 53+#define EMCOREAPP_FLAG_COMPRESSED 0x00000001
4754
48 -int execimage(void* image, bool nomalloc);
4955
 56+#ifndef _TOOL
 57+struct scheduler_thread* execimage(void* image, bool copy);
 58+#endif
5059
 60+
5161 #endif
Index: emcore/trunk/export/emcoreapp.h
@@ -1,10 +1,8 @@
22 #include "syscallwrappers.h"
33
44
5 -#define EMCORE_APP_HEADER(threadnamestr, stacksizebytes, mainfunc, threadprio) \
6 - extern char __bss_start; \
7 - extern char __bss_end; \
8 - void __emcore_init() \
 5+#define EMCORE_APP_HEADER(threadnamestr, mainfunc, threadprio) \
 6+ void __attribute__((section(".emcoreentrypoint"))) __emcore_entrypoint() \
97 { \
108 asm volatile("swi\t2\n\tldr\tr3, =__emcore_required_version\nldr\tr3, [r3]\n\t" \
119 "ldr\tr2, [r0]\n\tcmp\tr3, r2\n\tldrls\tr1, [r0,#4]\n\tcmpls\tr1, r3\n\t" \
@@ -11,38 +9,10 @@
1210 "movhi\tr0, #0\n\tldrhi\tr1, =__emcore_incompatible_api_str\n\t" \
1311 "swihi\t1\n\tldr\tr1, =__emcore_syscall\n\tstr\tr0, [r1]\n\t" \
1412 ::: "r0", "r1", "r2", "r3", "r12", "lr", "cc", "memory"); \
15 - memset(&__bss_start, 0, (&__bss_end) - (&__bss_start)); \
 13+ thread_set_name(NULL, threadnamestr); \
 14+ thread_set_priority(NULL, threadprio); \
1615 mainfunc(); \
1716 } \
18 - uint32_t __emcore_thread_stack[stacksizebytes >> 2] __attribute__((section(".stack"))); \
19 - const char __emcore_thread_name[] = threadnamestr; \
20 - struct emcore_app_header \
21 - { \
22 - char signature[8]; \
23 - int version; \
24 - void* baseaddr; \
25 - int size; \
26 - uint32_t crc32; \
27 - void* stackaddr; \
28 - int stacksize; \
29 - void* entrypoint; \
30 - const char* threadname; \
31 - int threadtype; \
32 - int threadpriority; \
33 - } __emcore_executable_hdr __attribute__((section(".execheader"))) = \
34 - { \
35 - .signature = "emBIexec", \
36 - .version = 0, \
37 - .baseaddr = &__emcore_executable_hdr, \
38 - .size = -1, \
39 - .crc32 = 0, \
40 - .stackaddr = __emcore_thread_stack, \
41 - .stacksize = stacksizebytes, \
42 - .entrypoint = __emcore_init, \
43 - .threadname = __emcore_thread_name, \
44 - .threadtype = 0, \
45 - .threadpriority = threadprio \
46 - }; \
47 - struct emcore_syscall_table* __emcore_syscall __attribute__((section(".stack"))); \
 17+ struct emcore_syscall_table* __emcore_syscall; \
4818 const uint32_t __emcore_required_version = EMCORE_API_VERSION; \
4919 const char __emcore_incompatible_api_str[] = "Incompatible API version!\nGot %d, need %d";
Index: emcore/trunk/export/syscallwrappers.h
@@ -32,159 +32,161 @@
3333 extern struct emcore_syscall_table* __emcore_syscall;
3434
3535
36 -#define panic(args...) __emcore_syscall->panic(args)
37 -#define panicf(args...) __emcore_syscall->panicf(args)
38 -#define cprintf(args...) __emcore_syscall->cprintf(args)
39 -#define cvprintf(args...) __emcore_syscall->cvprintf(args)
40 -#define cputc(args...) __emcore_syscall->cputc(args)
41 -#define cputs(args...) __emcore_syscall->cputs(args)
42 -#define cwrite(args...) __emcore_syscall->cwrite(args)
43 -#define cflush(args...) __emcore_syscall->cflush(args)
44 -#define cgetc(args...) __emcore_syscall->cgetc(args)
45 -#define cread(args...) __emcore_syscall->cread(args)
46 -#define creada(args...) __emcore_syscall->creada(args)
47 -#define opendir(args...) __emcore_syscall->opendir(args)
48 -#define closedir(args...) __emcore_syscall->closedir(args)
49 -#define readdir(args...) __emcore_syscall->readdir(args)
50 -#define mkdir(args...) __emcore_syscall->mkdir(args)
51 -#define rmdir(args...) __emcore_syscall->rmdir(args)
52 -#define renderbmp(args...) __emcore_syscall->renderbmp(args)
53 -#define renderchar(args...) __emcore_syscall->renderchar(args)
54 -#define rendertext(args...) __emcore_syscall->rendertext(args)
55 -#define renderfillrect(args...) __emcore_syscall->renderfillrect(args)
56 -#define get_font_width(args...) __emcore_syscall->get_font_width(args)
57 -#define get_font_height(args...) __emcore_syscall->get_font_height(args)
58 -#define execimage(args...) __emcore_syscall->execimage(args)
59 -#define ftruncate(args...) __emcore_syscall->ftruncate(args)
60 -#define fsync(args...) __emcore_syscall->fsync(args)
61 -#define close(args...) __emcore_syscall->close(args)
62 -#define write(args...) __emcore_syscall->write(args)
63 -#define read(args...) __emcore_syscall->read(args)
64 -#define lseek(args...) __emcore_syscall->lseek(args)
65 -#define remove(args...) __emcore_syscall->remove(args)
66 -#define file_open(args...) __emcore_syscall->file_open(args)
67 -#define rename(args...) __emcore_syscall->rename(args)
68 -#define file_creat(args...) __emcore_syscall->file_creat(args)
69 -#define filesize(args...) __emcore_syscall->filesize(args)
70 -#define format(args...) __emcore_syscall->format(args)
71 -#define vuprintf(args...) __emcore_syscall->vuprintf(args)
72 -#define lcdconsole_putc_noblit(args...) __emcore_syscall->lcdconsole_putc_noblit(args)
73 -#define lcdconsole_puts_noblit(args...) __emcore_syscall->lcdconsole_puts_noblit(args)
74 -#define lcdconsole_write_noblit(args...) __emcore_syscall->lcdconsole_write_noblit(args)
75 -#define lcdconsole_update(args...) __emcore_syscall->lcdconsole_update(args)
76 -#define lcdconsole_putc(args...) __emcore_syscall->lcdconsole_putc(args)
77 -#define lcdconsole_puts(args...) __emcore_syscall->lcdconsole_puts(args)
78 -#define lcdconsole_write(args...) __emcore_syscall->lcdconsole_write(args)
79 -#define lcdconsole_get_current_x(args...) __emcore_syscall->lcdconsole_get_current_x(args)
80 -#define lcdconsole_get_current_y(args...) __emcore_syscall->lcdconsole_get_current_y(args)
81 -#define lcdconsole_get_lineend_x(args...) __emcore_syscall->lcdconsole_get_lineend_x(args)
82 -#define lcdconsole_get_lineend_y(args...) __emcore_syscall->lcdconsole_get_lineend_y(args)
83 -#define lcdconsole_progressbar(args...) __emcore_syscall->lcdconsole_progressbar(args)
84 -#define progressbar_init(args...) __emcore_syscall->progressbar_init(args)
85 -#define progressbar_setpos(args...) __emcore_syscall->progressbar_setpos(args)
86 -#define shutdown(args...) __emcore_syscall->shutdown(args)
87 -#define storage_read_sectors_md(args...) __emcore_syscall->storage_read_sectors_md(args)
88 -#define storage_write_sectors_md(args...) __emcore_syscall->storage_write_sectors_md(args)
89 -#define storage_get_info(args...) __emcore_syscall->storage_get_info(args)
90 -#define strcasecmp(args...) __emcore_syscall->strcasecmp(args)
91 -#define strncasecmp(args...) __emcore_syscall->strncasecmp(args)
92 -#define strcasestr(args...) __emcore_syscall->strcasestr(args)
93 -#define strlcat(args...) __emcore_syscall->strlcat(args)
94 -#define strlcpy(args...) __emcore_syscall->strlcpy(args)
95 -#define mutex_init(args...) __emcore_syscall->mutex_init(args)
96 -#define mutex_lock(args...) __emcore_syscall->mutex_lock(args)
97 -#define mutex_unlock(args...) __emcore_syscall->mutex_unlock(args)
98 -#define wakeup_init(args...) __emcore_syscall->wakeup_init(args)
99 -#define wakeup_wait(args...) __emcore_syscall->wakeup_wait(args)
100 -#define wakeup_signal(args...) __emcore_syscall->wakeup_signal(args)
101 -#define sleep(args...) __emcore_syscall->sleep(args)
102 -#define thread_create(args...) __emcore_syscall->thread_create(args)
103 -#define thread_exit(args...) __emcore_syscall->thread_exit(args)
104 -#define thread_suspend(args...) __emcore_syscall->thread_suspend(args)
105 -#define thread_resume(args...) __emcore_syscall->thread_resume(args)
106 -#define thread_terminate(args...) __emcore_syscall->thread_terminate(args)
107 -#define __errno(args...) __emcore_syscall->__errno(args)
108 -#define ucl_decompress(args...) __emcore_syscall->ucl_decompress(args)
109 -#define bootflash_filesize(args...) __emcore_syscall->bootflash_filesize(args)
110 -#define bootflash_attributes(args...) __emcore_syscall->bootflash_attributes(args)
111 -#define bootflash_getaddr(args...) __emcore_syscall->bootflash_getaddr(args)
112 -#define bootflash_read(args...) __emcore_syscall->bootflash_read(args)
113 -#define bootflash_readraw(args...) __emcore_syscall->bootflash_readraw(args)
114 -#define bootflash_writeraw(args...) __emcore_syscall->bootflash_writeraw(args)
115 -#define bootflash_getrawaddr(args...) __emcore_syscall->bootflash_getrawaddr(args)
116 -#define bootflash_is_memmapped(args...) __emcore_syscall->bootflash_is_memmapped(args)
117 -#define read_native_timer(args...) __emcore_syscall->read_native_timer(args)
118 -#define read_usec_timer(args...) __emcore_syscall->read_usec_timer(args)
119 -#define i2c_send(args...) __emcore_syscall->i2c_send(args)
120 -#define i2c_recv(args...) __emcore_syscall->i2c_recv(args)
121 -#define i2c_sendbyte(args...) __emcore_syscall->i2c_sendbyte(args)
122 -#define i2c_recvbyte(args...) __emcore_syscall->i2c_recvbyte(args)
123 -#define interrupt_enable(args...) __emcore_syscall->interrupt_enable(args)
124 -#define interrupt_set_handler(args...) __emcore_syscall->interrupt_set_handler(args)
125 -#define int_timer_set_handler(args...) __emcore_syscall->int_timer_set_handler(args)
126 -#define displaylcd(args...) __emcore_syscall->displaylcd(args)
127 -#define displaylcd_sync(args...) __emcore_syscall->displaylcd_sync(args)
128 -#define displaylcd_busy(args...) __emcore_syscall->displaylcd_busy(args)
129 -#define displaylcd_safe(args...) __emcore_syscall->displaylcd_safe(args)
130 -#define lcd_get_width(args...) __emcore_syscall->lcd_get_width(args)
131 -#define lcd_get_height(args...) __emcore_syscall->lcd_get_height(args)
132 -#define lcd_get_bytes_per_pixel(args...) __emcore_syscall->lcd_get_bytes_per_pixel(args)
133 -#define lcd_translate_color(args...) __emcore_syscall->lcd_translate_color(args)
134 -#define clean_dcache(args...) __emcore_syscall->clean_dcache(args)
135 -#define invalidate_dcache(args...) __emcore_syscall->invalidate_dcache(args)
136 -#define invalidate_icache(args...) __emcore_syscall->invalidate_icache(args)
137 -#define power_off(args...) __emcore_syscall->power_off(args)
138 -#define charging_state(args...) __emcore_syscall->charging_state(args)
139 -#define atoi(args...) __emcore_syscall->atoi(args)
140 -#define memchr(args...) __emcore_syscall->memchr(args)
141 -#define memcmp(args...) __emcore_syscall->memcmp(args)
142 -#define memcpy(args...) __emcore_syscall->memcpy(args)
143 -#define memmove(args...) __emcore_syscall->memmove(args)
144 -#define memset(args...) __emcore_syscall->memset(args)
145 -#define qsort(args...) __emcore_syscall->qsort(args)
146 -#define srand(args...) __emcore_syscall->srand(args)
147 -#define rand(args...) __emcore_syscall->rand(args)
148 -#define snprintf(args...) __emcore_syscall->snprintf(args)
149 -#define vsnprintf(args...) __emcore_syscall->vsnprintf(args)
150 -#define isspace(args...) __emcore_syscall->isspace(args)
151 -#define isdigit(args...) __emcore_syscall->isdigit(args)
152 -#define isxdigit(args...) __emcore_syscall->isxdigit(args)
153 -#define sscanf(args...) __emcore_syscall->sscanf(args)
154 -#define strcat(args...) __emcore_syscall->strcat(args)
155 -#define strchr(args...) __emcore_syscall->strchr(args)
156 -#define strcmp(args...) __emcore_syscall->strcmp(args)
157 -#define strcpy(args...) __emcore_syscall->strcpy(args)
158 -#define strlen(args...) __emcore_syscall->strlen(args)
159 -#define strncmp(args...) __emcore_syscall->strncmp(args)
160 -#define strrchr(args...) __emcore_syscall->strrchr(args)
161 -#define strstr(args...) __emcore_syscall->strstr(args)
162 -#define strtok_r(args...) __emcore_syscall->strtok_r(args)
163 -#define backlight_on(args...) __emcore_syscall->backlight_on(args)
164 -#define backlight_set_fade(args...) __emcore_syscall->backlight_set_fade(args)
165 -#define backlight_set_brightness(args...) __emcore_syscall->backlight_set_brightness(args)
166 -#define get_platform_id(args...) __emcore_syscall->get_platform_id(args)
167 -#define tlsf_create(args...) __emcore_syscall->tlsf_create(args)
168 -#define tlsf_destroy(args...) __emcore_syscall->tlsf_destroy(args)
169 -#define tlsf_malloc(args...) __emcore_syscall->tlsf_malloc(args)
170 -#define tlsf_memalign(args...) __emcore_syscall->tlsf_memalign(args)
171 -#define tlsf_realloc(args...) __emcore_syscall->tlsf_realloc(args)
172 -#define tlsf_free(args...) __emcore_syscall->tlsf_free(args)
173 -#define tlsf_walk_heap(args...) __emcore_syscall->tlsf_walk_heap(args)
174 -#define tlsf_check_heap(args...) __emcore_syscall->tlsf_check_heap(args)
175 -#define tlsf_block_size(args...) __emcore_syscall->tlsf_block_size(args)
176 -#define tlsf_overhead(args...) __emcore_syscall->tlsf_overhead(args)
177 -#define execfirmware(args...) __emcore_syscall->execfirmware(args)
178 -#define button_register_handler(args...) __emcore_syscall->button_register_handler(args)
179 -#define button_unregister_handler(args...) __emcore_syscall->button_unregister_handler(args)
180 -#define clickwheel_get_state(args...) __emcore_syscall->clickwheel_get_state(args)
181 -#define clockgate_enable(args...) __emcore_syscall->clockgate_enable(args)
182 -#define context_switch(args...) __emcore_syscall->context_switch(args)
183 -#define disk_mount(args...) __emcore_syscall->disk_mount(args)
184 -#define disk_unmount(args...) __emcore_syscall->disk_unmount(args)
185 -#define hwkeyaes(args...) __emcore_syscall->hwkeyaes(args)
186 -#define hmacsha1(args...) __emcore_syscall->hmacsha1(args)
187 -#define reset(args...) __emcore_syscall->reset(args)
188 -#define int_dma_set_handler(args...) __emcore_syscall->int_dma_set_handler(args)
 36+#define panic __emcore_syscall->panic
 37+#define panicf __emcore_syscall->panicf
 38+#define cprintf __emcore_syscall->cprintf
 39+#define cvprintf __emcore_syscall->cvprintf
 40+#define cputc __emcore_syscall->cputc
 41+#define cputs __emcore_syscall->cputs
 42+#define cwrite __emcore_syscall->cwrite
 43+#define cflush __emcore_syscall->cflush
 44+#define cgetc __emcore_syscall->cgetc
 45+#define cread __emcore_syscall->cread
 46+#define creada __emcore_syscall->creada
 47+#define opendir __emcore_syscall->opendir
 48+#define closedir __emcore_syscall->closedir
 49+#define readdir __emcore_syscall->readdir
 50+#define mkdir __emcore_syscall->mkdir
 51+#define rmdir __emcore_syscall->rmdir
 52+#define renderbmp __emcore_syscall->renderbmp
 53+#define renderchar __emcore_syscall->renderchar
 54+#define rendertext __emcore_syscall->rendertext
 55+#define renderfillrect __emcore_syscall->renderfillrect
 56+#define get_font_width __emcore_syscall->get_font_width
 57+#define get_font_height __emcore_syscall->get_font_height
 58+#define execimage __emcore_syscall->execimage
 59+#define ftruncate __emcore_syscall->ftruncate
 60+#define fsync __emcore_syscall->fsync
 61+#define close __emcore_syscall->close
 62+#define write __emcore_syscall->write
 63+#define read __emcore_syscall->read
 64+#define lseek __emcore_syscall->lseek
 65+#define remove __emcore_syscall->remove
 66+#define file_open __emcore_syscall->file_open
 67+#define rename __emcore_syscall->rename
 68+#define file_creat __emcore_syscall->file_creat
 69+#define filesize __emcore_syscall->filesize
 70+#define format __emcore_syscall->format
 71+#define vuprintf __emcore_syscall->vuprintf
 72+#define lcdconsole_putc_noblit __emcore_syscall->lcdconsole_putc_noblit
 73+#define lcdconsole_puts_noblit __emcore_syscall->lcdconsole_puts_noblit
 74+#define lcdconsole_write_noblit __emcore_syscall->lcdconsole_write_noblit
 75+#define lcdconsole_update __emcore_syscall->lcdconsole_update
 76+#define lcdconsole_putc __emcore_syscall->lcdconsole_putc
 77+#define lcdconsole_puts __emcore_syscall->lcdconsole_puts
 78+#define lcdconsole_write __emcore_syscall->lcdconsole_write
 79+#define lcdconsole_get_current_x __emcore_syscall->lcdconsole_get_current_x
 80+#define lcdconsole_get_current_y __emcore_syscall->lcdconsole_get_current_y
 81+#define lcdconsole_get_lineend_x __emcore_syscall->lcdconsole_get_lineend_x
 82+#define lcdconsole_get_lineend_y __emcore_syscall->lcdconsole_get_lineend_y
 83+#define lcdconsole_progressbar __emcore_syscall->lcdconsole_progressbar
 84+#define progressbar_init __emcore_syscall->progressbar_init
 85+#define progressbar_setpos __emcore_syscall->progressbar_setpos
 86+#define shutdown __emcore_syscall->shutdown
 87+#define storage_read_sectors_md __emcore_syscall->storage_read_sectors_md
 88+#define storage_write_sectors_md __emcore_syscall->storage_write_sectors_md
 89+#define storage_get_info __emcore_syscall->storage_get_info
 90+#define strcasecmp __emcore_syscall->strcasecmp
 91+#define strncasecmp __emcore_syscall->strncasecmp
 92+#define strcasestr __emcore_syscall->strcasestr
 93+#define strlcat __emcore_syscall->strlcat
 94+#define strlcpy __emcore_syscall->strlcpy
 95+#define mutex_init __emcore_syscall->mutex_init
 96+#define mutex_lock __emcore_syscall->mutex_lock
 97+#define mutex_unlock __emcore_syscall->mutex_unlock
 98+#define wakeup_init __emcore_syscall->wakeup_init
 99+#define wakeup_wait __emcore_syscall->wakeup_wait
 100+#define wakeup_signal __emcore_syscall->wakeup_signal
 101+#define sleep __emcore_syscall->sleep
 102+#define thread_create __emcore_syscall->thread_create
 103+#define thread_exit __emcore_syscall->thread_exit
 104+#define thread_suspend __emcore_syscall->thread_suspend
 105+#define thread_resume __emcore_syscall->thread_resume
 106+#define thread_terminate __emcore_syscall->thread_terminate
 107+#define __errno __emcore_syscall->__errno
 108+#define ucl_decompress __emcore_syscall->ucl_decompress
 109+#define bootflash_filesize __emcore_syscall->bootflash_filesize
 110+#define bootflash_attributes __emcore_syscall->bootflash_attributes
 111+#define bootflash_getaddr __emcore_syscall->bootflash_getaddr
 112+#define bootflash_read __emcore_syscall->bootflash_read
 113+#define bootflash_readraw __emcore_syscall->bootflash_readraw
 114+#define bootflash_writeraw __emcore_syscall->bootflash_writeraw
 115+#define bootflash_getrawaddr __emcore_syscall->bootflash_getrawaddr
 116+#define bootflash_is_memmapped __emcore_syscall->bootflash_is_memmapped
 117+#define read_native_timer __emcore_syscall->read_native_timer
 118+#define read_usec_timer __emcore_syscall->read_usec_timer
 119+#define i2c_send __emcore_syscall->i2c_send
 120+#define i2c_recv __emcore_syscall->i2c_recv
 121+#define i2c_sendbyte __emcore_syscall->i2c_sendbyte
 122+#define i2c_recvbyte __emcore_syscall->i2c_recvbyte
 123+#define interrupt_enable __emcore_syscall->interrupt_enable
 124+#define interrupt_set_handler __emcore_syscall->interrupt_set_handler
 125+#define int_timer_set_handler __emcore_syscall->int_timer_set_handler
 126+#define displaylcd __emcore_syscall->displaylcd
 127+#define displaylcd_sync __emcore_syscall->displaylcd_sync
 128+#define displaylcd_busy __emcore_syscall->displaylcd_busy
 129+#define displaylcd_safe __emcore_syscall->displaylcd_safe
 130+#define lcd_get_width __emcore_syscall->lcd_get_width
 131+#define lcd_get_height __emcore_syscall->lcd_get_height
 132+#define lcd_get_bytes_per_pixel __emcore_syscall->lcd_get_bytes_per_pixel
 133+#define lcd_translate_color __emcore_syscall->lcd_translate_color
 134+#define clean_dcache __emcore_syscall->clean_dcache
 135+#define invalidate_dcache __emcore_syscall->invalidate_dcache
 136+#define invalidate_icache __emcore_syscall->invalidate_icache
 137+#define power_off __emcore_syscall->power_off
 138+#define charging_state __emcore_syscall->charging_state
 139+#define atoi __emcore_syscall->atoi
 140+#define memchr __emcore_syscall->memchr
 141+#define memcmp __emcore_syscall->memcmp
 142+#define memcpy __emcore_syscall->memcpy
 143+#define memmove __emcore_syscall->memmove
 144+#define memset __emcore_syscall->memset
 145+#define qsort __emcore_syscall->qsort
 146+#define srand __emcore_syscall->srand
 147+#define rand __emcore_syscall->rand
 148+#define snprintf __emcore_syscall->snprintf
 149+#define vsnprintf __emcore_syscall->vsnprintf
 150+#define isspace __emcore_syscall->isspace
 151+#define isdigit __emcore_syscall->isdigit
 152+#define isxdigit __emcore_syscall->isxdigit
 153+#define sscanf __emcore_syscall->sscanf
 154+#define strcat __emcore_syscall->strcat
 155+#define strchr __emcore_syscall->strchr
 156+#define strcmp __emcore_syscall->strcmp
 157+#define strcpy __emcore_syscall->strcpy
 158+#define strlen __emcore_syscall->strlen
 159+#define strncmp __emcore_syscall->strncmp
 160+#define strrchr __emcore_syscall->strrchr
 161+#define strstr __emcore_syscall->strstr
 162+#define strtok_r __emcore_syscall->strtok_r
 163+#define backlight_on __emcore_syscall->backlight_on
 164+#define backlight_set_fade __emcore_syscall->backlight_set_fade
 165+#define backlight_set_brightness __emcore_syscall->backlight_set_brightness
 166+#define get_platform_id __emcore_syscall->get_platform_id
 167+#define tlsf_create __emcore_syscall->tlsf_create
 168+#define tlsf_destroy __emcore_syscall->tlsf_destroy
 169+#define tlsf_malloc __emcore_syscall->tlsf_malloc
 170+#define tlsf_memalign __emcore_syscall->tlsf_memalign
 171+#define tlsf_realloc __emcore_syscall->tlsf_realloc
 172+#define tlsf_free __emcore_syscall->tlsf_free
 173+#define tlsf_walk_heap __emcore_syscall->tlsf_walk_heap
 174+#define tlsf_check_heap __emcore_syscall->tlsf_check_heap
 175+#define tlsf_block_size __emcore_syscall->tlsf_block_size
 176+#define tlsf_overhead __emcore_syscall->tlsf_overhead
 177+#define execfirmware __emcore_syscall->execfirmware
 178+#define button_register_handler __emcore_syscall->button_register_handler
 179+#define button_unregister_handler __emcore_syscall->button_unregister_handler
 180+#define clickwheel_get_state __emcore_syscall->clickwheel_get_state
 181+#define clockgate_enable __emcore_syscall->clockgate_enable
 182+#define context_switch __emcore_syscall->context_switch
 183+#define disk_mount __emcore_syscall->disk_mount
 184+#define disk_unmount __emcore_syscall->disk_unmount
 185+#define hwkeyaes __emcore_syscall->hwkeyaes
 186+#define hmacsha1 __emcore_syscall->hmacsha1
 187+#define reset __emcore_syscall->reset
 188+#define int_dma_set_handler __emcore_syscall->int_dma_set_handler
 189+#define thread_set_name __emcore_syscall->thread_set_name
 190+#define thread_set_priority __emcore_syscall->thread_set_priority
189191
190192
191193 #endif
Index: emcore/trunk/export/syscallapi.h
@@ -68,7 +68,7 @@
6969 /* update this to latest version if a change to the api struct breaks
7070 backwards compatibility (and please take the opportunity to sort in any
7171 new function which are "waiting" at the end of the function table) */
72 -#define EMCORE_MIN_API_VERSION 0
 72+#define EMCORE_MIN_API_VERSION 1
7373
7474 /* NOTE: To support backwards compatibility, only add new functions at
7575 the end of the structure. Every time you add a new function,
@@ -229,6 +229,8 @@
230230 typeof(hmacsha1) *hmacsha1;
231231 typeof(reset) *reset;
232232 typeof(int_dma_set_handler) *int_dma_set_handler;
 233+ typeof(thread_set_name) *thread_set_name;
 234+ typeof(thread_set_priority) *thread_set_priority;
233235 };
234236
235237
Index: emcore/trunk/syscallapi.c
@@ -196,5 +196,7 @@
197197 #ifdef HAVE_HMACSHA1
198198 .hmacsha1 = hmacsha1,
199199 #endif
200 - .int_dma_set_handler = int_dma_set_handler
 200+ .int_dma_set_handler = int_dma_set_handler,
 201+ .thread_set_name = thread_set_name,
 202+ .thread_set_priority = thread_set_priority
201203 };
Index: emcore/trunk/thread.c
@@ -434,6 +434,22 @@
435435 return ret;
436436 }
437437
 438+void thread_set_name(struct scheduler_thread* thread, char* name)
 439+{
 440+ uint32_t mode = enter_critical_section();
 441+ if (!thread) thread = current_thread;
 442+ thread->name = name;
 443+ leave_critical_section(mode);
 444+}
 445+
 446+void thread_set_priority(struct scheduler_thread* thread, int priority)
 447+{
 448+ uint32_t mode = enter_critical_section();
 449+ if (!thread) thread = current_thread;
 450+ thread->priority = priority;
 451+ leave_critical_section(mode);
 452+}
 453+
438454 int thread_terminate(struct scheduler_thread* thread)
439455 {
440456 struct scheduler_thread* t;
Index: emcore/trunk/usb/usb.c
@@ -560,6 +560,7 @@
561561 case 21: // EXECIMAGE
562562 if (set_dbgaction(DBGACTION_EXECIMAGE, 0)) break;
563563 dbgactionaddr = dbgrecvbuf[1];
 564+ dbgactiontype = dbgrecvbuf[2];
564565 break;
565566 #ifdef HAVE_BOOTFLASH
566567 case 22: // READ BOOT FLASH
@@ -735,7 +736,7 @@
736737 break;
737738 case DBGACTION_EXECIMAGE:
738739 dbgasyncsendbuf[0] = 1;
739 - dbgasyncsendbuf[1] = execimage((void*)dbgactionaddr, false);
 740+ dbgasyncsendbuf[1] = (uint32_t)execimage((void*)dbgactionaddr, dbgactiontype);
740741 usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
741742 break;
742743 case DBGACTION_EXECFIRMWARE:
Index: emcore/trunk/thread.h
@@ -120,6 +120,8 @@
121121 enum thread_type type, int priority, bool run);
122122 int thread_suspend(struct scheduler_thread* thread);
123123 int thread_resume(struct scheduler_thread* thread);
 124+void thread_set_name(struct scheduler_thread* thread, char* name);
 125+void thread_set_priority(struct scheduler_thread* thread, int priority);
124126 int thread_terminate(struct scheduler_thread* thread);
125127 int thread_killlevel(enum thread_type type, bool killself);
126128 enum thread_state thread_get_state(struct scheduler_thread* thread);