static int getArg32(unsigned int *res) { unsigned char b1 = 0; unsigned char b2 = 0; unsigned char b3 = 0; unsigned char b4 = 0; if (getDecodedChar(&b1)) { return 1; } if (getDecodedChar(&b2)) { return 1; } if (getDecodedChar(&b3)) { return 1; } if (getDecodedChar(&b4)) { return 1; } *res = (b1 << 24 ) | (b2 << 16) | (b3 << 8) | b4; return 0; }
static int getArg(unsigned long *res) { unsigned long i; unsigned char byte; *res = 0; for (i = 0; i < sizeof(unsigned long); i++) { if (getDecodedChar(&byte)) { return 1; } (*res) = ((*res) << 8) | byte; } return 0; }
void capDL(void) { int result; int done = 0; while (done == 0) { unsigned char c; do { c = getDebugChar(); } while (c != START); do { result = getDecodedChar(&c); if (result) { continue; } switch (c) { case PD_COMMAND: { /*pgdir */ unsigned long arg; result = getArg(&arg); if (result) { continue; } sendPD(arg); putDebugChar(END); } break; case PT_COMMAND: { /*pg table */ unsigned long arg; result = getArg(&arg); if (result) { continue; } sendPT(arg); putDebugChar(END); } break; case ASID_POOL_COMMAND: { /*asid pool */ unsigned long arg; result = getArg(&arg); if (result) { continue; } sendASIDPool(arg); putDebugChar(END); } break; case IO_PT_COMMAND: { /*io pt table */ unsigned long address, level; result = getArg(&address); if (result) { continue; } result = getArg(&level); if (result) { continue; } sendIOPT(address, level); putDebugChar(END); } break; case IO_SPACE_COMMAND: { /*io space */ unsigned long arg; result = getArg(&arg); if (result) { continue; } sendIOSpace(arg); putDebugChar(END); } break; case RQ_COMMAND: { /*runqueues */ sendRunqueues(); putDebugChar(END); result = 0; } break; case EP_COMMAND: { /*endpoint waiters */ unsigned long arg; result = getArg(&arg); if (result) { continue; } sendEPQueue(arg); putDebugChar(END); } break; case CN_COMMAND: { /*cnode */ unsigned long address, sizebits; result = getArg(&address); if (result) { continue; } result = getArg(&sizebits); if (result) { continue; } sendCNode(address, sizebits); putDebugChar(END); } break; case IRQ_COMMAND: { sendIRQNode(); putDebugChar(END); result = 0; } break; case VERSION_COMMAND: { sendVersion(); putDebugChar(END); } break; case DONE: { done = 1; putDebugChar(END); } default: result = 0; break; } } while (result); } }