Beispiel #1
0
void
load_tr(UINT16 selector)
{
    selector_t task_sel;
    int rv;
#if defined(IA32_SUPPORT_DEBUG_REGISTER)
    int i;
#endif
    UINT16 iobase;

    rv = parse_selector(&task_sel, selector);
    if (rv < 0 || task_sel.ldt || task_sel.desc.s) {
        EXCEPTION(GP_EXCEPTION, task_sel.idx);
    }

    /* check descriptor type & stack room size */
    switch (task_sel.desc.type) {
    case CPU_SYSDESC_TYPE_TSS_16:
        if (task_sel.desc.u.seg.limit < 0x2b) {
            EXCEPTION(TS_EXCEPTION, task_sel.idx);
        }
        iobase = 0;
        break;

    case CPU_SYSDESC_TYPE_TSS_32:
        if (task_sel.desc.u.seg.limit < 0x67) {
            EXCEPTION(TS_EXCEPTION, task_sel.idx);
        }
        iobase = cpu_kmemoryread_w(task_sel.desc.u.seg.segbase + 102);
        break;

    default:
        EXCEPTION(GP_EXCEPTION, task_sel.idx);
        return;
    }

    /* not present */
    rv = selector_is_not_present(&task_sel);
    if (rv < 0) {
        EXCEPTION(NP_EXCEPTION, task_sel.idx);
    }

#if defined(MORE_DEBUG)
    tr_dump(task_sel.selector, task_sel.desc.u.seg.segbase, task_sel.desc.u.seg.limit);
#endif

    CPU_SET_TASK_BUSY(task_sel.selector, &task_sel.desc);
    CPU_TR = task_sel.selector;
    CPU_TR_DESC = task_sel.desc;

    /* I/O deny bitmap */
    if (task_sel.desc.type == CPU_SYSDESC_TYPE_TSS_BUSY_32) {
        if (iobase != 0 && iobase < task_sel.desc.u.seg.limit) {
            CPU_STAT_IOLIMIT = (UINT16)(task_sel.desc.u.seg.limit - iobase);
            CPU_STAT_IOADDR = task_sel.desc.u.seg.segbase + iobase;
        } else {
            CPU_STAT_IOLIMIT = 0;
        }
    } else {
        CPU_STAT_IOLIMIT = 0;
    }

#if defined(IA32_SUPPORT_DEBUG_REGISTER)
    /* clear local break point flags */
    CPU_DR7 &= ~(CPU_DR7_L(0)|CPU_DR7_L(1)|CPU_DR7_L(2)|CPU_DR7_L(3)|CPU_DR7_LE);
    CPU_STAT_BP = 0;
    for (i = 0; i < CPU_DEBUG_REG_INDEX_NUM; i++) {
        if (CPU_DR7 & CPU_DR7_G(i)) {
            CPU_STAT_BP |= (1 << i);
        }
    }
#endif
}
Beispiel #2
0
int main()
{
    //-------------------------------------------------------
    // init, destroy tests 
    // test, where memory allocation is not successful
    
    root_t *root = tr_init();
    tr_destroy(root);
    tr_destroy(root);
    tr_destroy(NULL);
    
    //-------------------------------------------------------
    
    //-------------------------------------------------------
    // insert & delete & dump tests
    // test, where memory allocation is not successful
    
    root = tr_init();
    
    tr_insert(root, 0);
    tr_insert(root, 10);
    tr_insert(root, -10);
    tr_insert(root, 5);
    tr_insert(root, 15);
    tr_insert(root, 3);

    tr_delete(root, 13);
    tr_delete(root, 15);
    tr_delete(root, 0);

    tr_insert(root, 5);
    tr_insert(root, 6);
    tr_insert(root, 7);
    tr_insert(root, 8);
    tr_insert(root, 9);

    tr_fdump(root, stdout);

    tr_delete(root, 2);
    tr_delete(root, 7);
    tr_delete(root, 5);
    tr_delete(root, 6);
    tr_delete(root, 8);
    tr_delete(root, 9);

    tr_destroy(root);
    tr_insert(root, 0);
    tr_delete(root, 0);
    tr_insert(NULL, 0);
    tr_delete(NULL, 0);
    //-------------------------------------------------------

    //-------------------------------------------------------
    // height & elem & ok tests

    root = tr_init();

    tr_dump(root);

    tr_insert(root, 0);
    tr_elem(root, -1);
    tr_elem(root, 1);
    tr_elem(root, 0);


    tr_dump(NULL);
    tr_dump(root);
    tr_nok(root);
    tr_nok(NULL);

    tr_destroy(root);
    tr_elem(root, 0);
    tr_elem(NULL, 0);
     //-------------------------------------------------------
    

    //-------------------------------------------------------
    //iterator test 
    root = tr_init();
    tr_insert(root, 0);
    tr_insert(root, 10);
    tr_insert(root, -10);
    tr_insert(root, 5);
    tr_insert(root, 15);
    tr_insert(root, 3);


    int status;
    void *node = tr_itfirst(root, NULL);
    node = tr_itfirst(NULL, &status);
    node = tr_itfirst (NULL, NULL);
    node = tr_itfirst(root, &status);

    while (!tr_itislast(root, node, &status)) 
        node = tr_itnext (node);

    while (node != tr_itfirst(root, NULL)) 
        node = tr_itprev (node);


    node = tr_itleft(node);
    node = tr_itright(node);
    printf("%d\n", tr_itgetheight(node));
    printf("%d\n", tr_itgetkey(NULL, &status));

    printf("%d\n", tr_itgetkey(node, &status));

    tr_itleft(NULL);
    tr_itright(NULL);

    tr_itislast(NULL, node, NULL);
    tr_itnext (NULL);
    tr_itprev (NULL);



    tr_destroy(root);

    //-------------------------------------------------------
    return 0;
}