Index: emcore/trunk/init.c |
— | — | @@ -86,6 +86,7 @@ |
87 | 87 | {
|
88 | 88 | struct scheduler_thread initthread;
|
89 | 89 | uint32_t initstack[0x400];
|
| 90 | + void* bootalloc;
|
90 | 91 | #ifdef HAVE_STORAGE
|
91 | 92 | struct scheduler_thread storagethread;
|
92 | 93 | uint32_t storagestack[0x400];
|
— | — | @@ -234,6 +235,7 @@ |
235 | 236 | cprintf(CONSOLE_BOOT, unknownboottypestr, option->type);
|
236 | 237 | }
|
237 | 238 | cputs(CONSOLE_BOOT, nobootoptionsstr);
|
| 239 | + free(ib->bootalloc);
|
238 | 240 | }
|
239 | 241 |
|
240 | 242 | void init() INITCODE_ATTR;
|
— | — | @@ -251,7 +253,6 @@ |
252 | 254 | #ifdef HAVE_TARGETINIT_EARLY
|
253 | 255 | targetinit_early();
|
254 | 256 | #endif
|
255 | | - interrupt_init();
|
256 | 257 | malloc_init();
|
257 | 258 | size_t size = (size_t)(&bootinfo) - (size_t)(&_poolstart) + bootinfo.totalsize;
|
258 | 259 | void* bootalloc = malloc(size);
|
— | — | @@ -260,6 +261,8 @@ |
261 | 262 | ib = (struct initbss*)malloc(sizeof(struct initbss));
|
262 | 263 | reownalloc(ib, &(ib->initthread));
|
263 | 264 | reownalloc(bootalloc, &(ib->initthread));
|
| 265 | + ib->bootalloc = bootalloc;
|
264 | 266 | thread_create(&(ib->initthread), initthreadname, initthread, ib->initstack,
|
265 | 267 | sizeof(ib->initstack), USER_THREAD, 127, true);
|
| 268 | + interrupt_init();
|
266 | 269 | }
|
Index: emcore/trunk/target/ipodnano2g/ls.x |
— | — | @@ -56,11 +56,18 @@ |
57 | 57 | *(.initcode*)
|
58 | 58 | *(.initrodata*)
|
59 | 59 | *(.initdata*)
|
60 | | - *(.inittail*)
|
61 | 60 | . = ALIGN(0x4);
|
62 | 61 | _initend = .;
|
63 | 62 | } > INIT
|
64 | 63 |
|
| 64 | + .inittail :
|
| 65 | + {
|
| 66 | + _inittailstart = .;
|
| 67 | + *(.inittail*)
|
| 68 | + . = ALIGN(0x4);
|
| 69 | + _inittailend = .;
|
| 70 | + } > INIT
|
| 71 | +
|
65 | 72 | .ibss (NOLOAD) :
|
66 | 73 | {
|
67 | 74 | _ibssstart = .;
|
Index: emcore/trunk/target/ipodnano2g/crt0.S |
— | — | @@ -62,6 +62,7 @@ |
63 | 63 | bhi .copysdram
|
64 | 64 | ldr r0, =_ibssstart
|
65 | 65 | ldr r1, =_ibssend
|
| 66 | + mov r2, #0
|
66 | 67 | .clearibss:
|
67 | 68 | cmp r1, r0
|
68 | 69 | strhi r2, [r0], #4
|
Index: emcore/trunk/target/ipodnano3g/ls.x |
— | — | @@ -56,11 +56,18 @@ |
57 | 57 | *(.initcode*)
|
58 | 58 | *(.initrodata*)
|
59 | 59 | *(.initdata*)
|
60 | | - *(.inittail*)
|
61 | 60 | . = ALIGN(0x4);
|
62 | 61 | _initend = .;
|
63 | 62 | } > INIT
|
64 | 63 |
|
| 64 | + .inittail :
|
| 65 | + {
|
| 66 | + _inittailstart = .;
|
| 67 | + *(.inittail*)
|
| 68 | + . = ALIGN(0x4);
|
| 69 | + _inittailend = .;
|
| 70 | + } > INIT
|
| 71 | +
|
65 | 72 | .ibss (NOLOAD) :
|
66 | 73 | {
|
67 | 74 | _ibssstart = .;
|
Index: emcore/trunk/target/ipodnano3g/crt0.S |
— | — | @@ -62,6 +62,7 @@ |
63 | 63 | bhi .copysdram
|
64 | 64 | ldr r0, =_ibssstart
|
65 | 65 | ldr r1, =_ibssend
|
| 66 | + mov r2, #0
|
66 | 67 | .clearibss:
|
67 | 68 | cmp r1, r0
|
68 | 69 | strhi r2, [r0], #4
|
Index: emcore/trunk/target/ipodnano4g/ls.x |
— | — | @@ -56,11 +56,18 @@ |
57 | 57 | *(.initcode*)
|
58 | 58 | *(.initrodata*)
|
59 | 59 | *(.initdata*)
|
60 | | - *(.inittail*)
|
61 | 60 | . = ALIGN(0x4);
|
62 | 61 | _initend = .;
|
63 | 62 | } > INIT
|
64 | 63 |
|
| 64 | + .inittail :
|
| 65 | + {
|
| 66 | + _inittailstart = .;
|
| 67 | + *(.inittail*)
|
| 68 | + . = ALIGN(0x4);
|
| 69 | + _inittailend = .;
|
| 70 | + } > INIT
|
| 71 | +
|
65 | 72 | .ibss (NOLOAD) :
|
66 | 73 | {
|
67 | 74 | _ibssstart = .;
|
Index: emcore/trunk/target/ipodnano4g/crt0.S |
— | — | @@ -61,6 +61,7 @@ |
62 | 62 | bhi .copysdram
|
63 | 63 | ldr r0, =_ibssstart
|
64 | 64 | ldr r1, =_ibssend
|
| 65 | + mov r2, #0
|
65 | 66 | .clearibss:
|
66 | 67 | cmp r1, r0
|
67 | 68 | strhi r2, [r0], #4
|
Index: emcore/trunk/target/ipodclassic/ls.x |
— | — | @@ -56,11 +56,18 @@ |
57 | 57 | *(.initcode*)
|
58 | 58 | *(.initrodata*)
|
59 | 59 | *(.initdata*)
|
60 | | - *(.inittail*)
|
61 | 60 | . = ALIGN(0x4);
|
62 | 61 | _initend = .;
|
63 | 62 | } > INIT
|
64 | 63 |
|
| 64 | + .inittail :
|
| 65 | + {
|
| 66 | + _inittailstart = .;
|
| 67 | + *(.inittail*)
|
| 68 | + . = ALIGN(0x4);
|
| 69 | + _inittailend = .;
|
| 70 | + } > INIT
|
| 71 | +
|
65 | 72 | .ibss (NOLOAD) :
|
66 | 73 | {
|
67 | 74 | _ibssstart = .;
|
Index: emcore/trunk/target/ipodclassic/crt0.S |
— | — | @@ -62,6 +62,7 @@ |
63 | 63 | bhi .copysdram
|
64 | 64 | ldr r0, =_ibssstart
|
65 | 65 | ldr r1, =_ibssend
|
| 66 | + mov r2, #0
|
66 | 67 | .clearibss:
|
67 | 68 | cmp r1, r0
|
68 | 69 | strhi r2, [r0], #4
|
Index: emcore/trunk/target/ipodclassic/storage_ata.c |
— | — | @@ -556,6 +556,7 @@ |
557 | 557 | else ata_virtual_sectors = ata_total_sectors;
|
558 | 558 | free(buf);
|
559 | 559 | }
|
| 560 | + else ata_virtual_sectors = ata_total_sectors;
|
560 | 561 | mutex_unlock(&ata_mutex);
|
561 | 562 | #endif
|
562 | 563 | thread_create(&ata_thread_handle, "ATA idle monitor", ata_thread, ata_stack,
|
Index: emcore/trunk/thread.c |
— | — | @@ -283,7 +283,7 @@ |
284 | 284 | }
|
285 | 285 | }
|
286 | 286 |
|
287 | | - if (scheduler_frozen) thread = 0;
|
| 287 | + if (scheduler_frozen) thread = &idle_thread;
|
288 | 288 | else
|
289 | 289 | {
|
290 | 290 | for (t = head_thread; t; t = t->thread_next)
|
— | — | @@ -301,7 +301,7 @@ |
302 | 302 | if (thread && thread->state == THREAD_READY) current_thread = thread;
|
303 | 303 | else
|
304 | 304 | {
|
305 | | - thread = NULL;
|
| 305 | + thread = &idle_thread;
|
306 | 306 | best = 0xffffffff;
|
307 | 307 | for (t = head_thread; t; t = t->thread_next)
|
308 | 308 | if (t->state == THREAD_READY && t->priority)
|
— | — | @@ -325,6 +325,7 @@ |
326 | 326 | enum thread_type type, int priority, bool run)
|
327 | 327 | {
|
328 | 328 | bool stack_alloced = false;
|
| 329 | + bool thread_alloced = false;
|
329 | 330 | if (!stack)
|
330 | 331 | {
|
331 | 332 | stack = malloc(stacksize);
|
— | — | @@ -331,14 +332,18 @@ |
332 | 333 | stack_alloced = true;
|
333 | 334 | }
|
334 | 335 | if (!stack) return NULL;
|
335 | | - if (!thread) thread = (struct scheduler_thread*)malloc(sizeof(struct scheduler_thread));
|
336 | 336 | if (!thread)
|
337 | 337 | {
|
| 338 | + thread = (struct scheduler_thread*)malloc(sizeof(struct scheduler_thread));
|
| 339 | + thread_alloced = true;
|
| 340 | + }
|
| 341 | + if (!thread)
|
| 342 | + {
|
338 | 343 | if (stack_alloced) free(stack);
|
339 | 344 | return NULL;
|
340 | 345 | }
|
341 | | - reownalloc(thread, thread);
|
342 | | - reownalloc(stack, thread);
|
| 346 | + if (thread_alloced) reownalloc(thread, thread);
|
| 347 | + if (stack_alloced) reownalloc(stack, thread);
|
343 | 348 |
|
344 | 349 | int i;
|
345 | 350 | for (i = 0; i < stacksize >> 2; i ++) ((uint32_t*)stack)[i] = 0xaffebeaf;
|