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 }
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; }