Subversion Repositories freemyipod

Rev

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

Rev 427 Rev 429
Line 82... Line 82...
82
    DBGACTION_HMACSHA1,
82
    DBGACTION_HMACSHA1,
83
    DBGACTION_TARGETSPECIFIC,
83
    DBGACTION_TARGETSPECIFIC,
84
    DBGACTION_STORAGE
84
    DBGACTION_STORAGE
85
};
85
};
86
 
86
 
-
 
87
static struct scheduler_thread dbgthread_handle IBSS_ATTR;
87
static uint32_t dbgstack[0x200] STACK_ATTR;
88
static uint32_t dbgstack[0x200] STACK_ATTR;
88
struct wakeup dbgwakeup IBSS_ATTR;
89
struct wakeup dbgwakeup IBSS_ATTR;
89
extern struct scheduler_thread* scheduler_threads;
-
 
90
extern struct scheduler_thread* current_thread;
-
 
91
static enum dbgaction_t dbgaction IBSS_ATTR;
90
static enum dbgaction_t dbgaction IBSS_ATTR;
92
static int dbgi2cbus;
91
static int dbgi2cbus;
93
static int dbgi2cslave;
92
static int dbgi2cslave;
94
static int dbgactionaddr;
93
static int dbgactionaddr;
95
static int dbgactionoffset;
94
static int dbgactionoffset;
Line 363... Line 362...
363
            switch (dbgrecvbuf[1])
362
            switch (dbgrecvbuf[1])
364
            {
363
            {
365
            case 0:  // GET VERSION INFO
364
            case 0:  // GET VERSION INFO
366
                dbgsendbuf[1] = VERSION_SVN_INT;
365
                dbgsendbuf[1] = VERSION_SVN_INT;
367
                dbgsendbuf[2] = VERSION_MAJOR | (VERSION_MINOR << 8)
366
                dbgsendbuf[2] = VERSION_MAJOR | (VERSION_MINOR << 8)
368
                              | (VERSION_PATCH << 16) | (1 << 24);
367
                              | (VERSION_PATCH << 16) | (2 << 24);
369
                dbgsendbuf[3] = PLATFORM_ID;
368
                dbgsendbuf[3] = PLATFORM_ID;
370
                break;
369
                break;
371
            case 1:  // GET PACKET SIZE INFO
370
            case 1:  // GET PACKET SIZE INFO
372
                dbgsendbuf[1] = 0x02000200;
371
                dbgsendbuf[1] = 0x02000200;
373
                dbgsendbuf[2] = usb_drv_get_max_out_size();
372
                dbgsendbuf[2] = usb_drv_get_max_out_size();
Line 506... Line 505...
506
            dbgactionconsoles = dbgrecvbuf[1];
505
            dbgactionconsoles = dbgrecvbuf[1];
507
            break;
506
            break;
508
        case 15:  // GET PROCESS INFO
507
        case 15:  // GET PROCESS INFO
509
            dbgsendbuf[0] = 1;
508
            dbgsendbuf[0] = 1;
510
            dbgsendbuf[1] = SCHEDULER_THREAD_INFO_VERSION;
509
            dbgsendbuf[1] = SCHEDULER_THREAD_INFO_VERSION;
511
            dbgsendbuf[2] = MAX_THREADS * sizeof(struct scheduler_thread);
510
            dbgsendbuf[2] = (uint32_t)head_thread;
512
            memcpy(&dbgsendbuf[4], (void*)(((uint32_t)&scheduler_threads) + dbgrecvbuf[1]),
-
 
513
                   dbgrecvbuf[2]);
-
 
514
            size = dbgrecvbuf[2] + 16;
511
            size = 16;
515
            break;
512
            break;
516
        case 16:  // FREEZE SCHEDULER
513
        case 16:  // FREEZE SCHEDULER
517
            dbgsendbuf[1] = scheduler_freeze(dbgrecvbuf[1]);
514
            dbgsendbuf[1] = scheduler_freeze(dbgrecvbuf[1]);
518
            scheduler_switch(-1);
515
            scheduler_switch(NULL);
519
            dbgsendbuf[0] = 1;
516
            dbgsendbuf[0] = 1;
520
            size = 16;
517
            size = 16;
521
            break;
518
            break;
522
        case 17:  // SUSPEND THREAD
519
        case 17:  // SUSPEND THREAD
523
            if (dbgrecvbuf[1])
520
            if (dbgrecvbuf[1])
524
            {
521
            {
525
                if (thread_suspend(dbgrecvbuf[2]) == -4) dbgsendbuf[1] = 1;
522
                if (thread_suspend((struct scheduler_thread*)(dbgrecvbuf[2])) == ALREADY_SUSPENDED)
-
 
523
                    dbgsendbuf[1] = 1;
526
                else dbgsendbuf[1] = 0;
524
                else dbgsendbuf[1] = 0;
527
            }
525
            }
528
            else
526
            else
529
            {
527
            {
530
                if (thread_resume(dbgrecvbuf[2]) == -5) dbgsendbuf[1] = 0;
528
                if (thread_resume((struct scheduler_thread*)(dbgrecvbuf[2])) == ALREADY_RESUMED)
-
 
529
                    dbgsendbuf[1] = 0;
531
                else dbgsendbuf[1] = 1;
530
                else dbgsendbuf[1] = 1;
532
            }
531
            }
533
            dbgsendbuf[0] = 1;
532
            dbgsendbuf[0] = 1;
534
            size = 16;
533
            size = 16;
535
            break;
534
            break;
536
        case 18:  // KILL THREAD
535
        case 18:  // KILL THREAD
537
            thread_terminate(dbgrecvbuf[1]);
536
            thread_terminate((struct scheduler_thread*)(dbgrecvbuf[1]));
538
            dbgsendbuf[0] = 1;
537
            dbgsendbuf[0] = 1;
539
            size = 16;
538
            size = 16;
540
            break;
539
            break;
541
        case 19:  // KILL THREAD
540
        case 19:  // KILL THREAD
542
            dbgsendbuf[0] = 1;
541
            dbgsendbuf[0] = 1;
543
            dbgsendbuf[1] = thread_create((const char*)dbgsendbuf[1], (const void*)dbgsendbuf[2],
542
            dbgsendbuf[1] = (uint32_t)thread_create(NULL, (const char*)(dbgsendbuf[1]),
-
 
543
                                                    (const void*)(dbgsendbuf[2]),
-
 
544
                                                    (char*)(dbgsendbuf[3]),
544
                                          (char*)dbgsendbuf[3], dbgsendbuf[4], dbgsendbuf[5],
545
                                                    dbgsendbuf[4], (enum thread_type)dbgsendbuf[5],
545
                                          dbgsendbuf[6], dbgsendbuf[7]);
546
                                                    dbgsendbuf[6], dbgsendbuf[7]);
546
            size = 16;
547
            size = 16;
547
            break;
548
            break;
548
        case 20:  // FLUSH CACHE
549
        case 20:  // FLUSH CACHE
549
            clean_dcache();
550
            clean_dcache();
550
            invalidate_icache();
551
            invalidate_icache();
Line 644... Line 645...
644
    usb_setup_dbg_listener();
645
    usb_setup_dbg_listener();
645
}
646
}
646
 
647
 
647
void dbgthread(void)
648
void dbgthread(void)
648
{
649
{
649
    int i;
-
 
650
    int t;
650
    struct scheduler_thread* t;
651
    while (1)
651
    while (1)
652
    {
652
    {
653
        wakeup_wait(&dbgwakeup, TIMEOUT_BLOCK);
653
        wakeup_wait(&dbgwakeup, TIMEOUT_BLOCK);
654
        for (i = 0; i < MAX_THREADS; i++)
654
        for (t = head_thread; t; t = t->thread_next)
655
            if (scheduler_threads[i].state == THREAD_DEFUNCT)
655
            if (t->state == THREAD_DEFUNCT)
656
            {
656
            {
657
                if (scheduler_threads[i].block_type == THREAD_DEFUNCT_STKOV)
657
                if (t->block_type == THREAD_DEFUNCT_STKOV)
658
                {
658
                {
659
                    if (scheduler_threads[i].name)
-
 
660
                        cprintf(1, "\n*PANIC*\nStack overflow! (%s)\n",
659
                    if (t->name) cprintf(1, "\n*PANIC*\nStack overflow! (%s)\n", t->name);
661
                                scheduler_threads[i].name);
-
 
662
                    else cprintf(1, "\n*PANIC*\nStack overflow! (ID %d)\n", i);
660
                    else cprintf(1, "\n*PANIC*\nStack overflow! (%08X)\n", t);
663
                }
661
                }
664
                scheduler_threads[i].state = THREAD_DEFUNCT_ACK;
662
                t->state = THREAD_DEFUNCT_ACK;
665
            }
663
            }
666
        if (dbgaction != DBGACTION_IDLE)
664
        if (dbgaction != DBGACTION_IDLE)
667
        {
665
        {
668
            switch (dbgaction)
666
            switch (dbgaction)
669
            {
667
            {
Line 929... Line 927...
929
    dbgconrecvreadidx = 0;
927
    dbgconrecvreadidx = 0;
930
    dbgconrecvwriteidx = 0;
928
    dbgconrecvwriteidx = 0;
931
    wakeup_init(&dbgconsendwakeup);
929
    wakeup_init(&dbgconsendwakeup);
932
    wakeup_init(&dbgconrecvwakeup);
930
    wakeup_init(&dbgconrecvwakeup);
933
    dbgconsoleattached = false;
931
    dbgconsoleattached = false;
-
 
932
    thread_create(&dbgthread_handle, "monitor worker", dbgthread, dbgstack,
934
    thread_create("monitor worker", dbgthread, dbgstack, sizeof(dbgstack), CORE_THREAD, 255, true);
933
                  sizeof(dbgstack), CORE_THREAD, 255, true);
935
    usb_drv_init();
934
    usb_drv_init();
936
}
935
}
937
 
936
 
938
int dbgconsole_getfree() ICODE_ATTR;
937
int dbgconsole_getfree() ICODE_ATTR;
939
int dbgconsole_getfree()
938
int dbgconsole_getfree()