📄 parser.y
字号:
| TOK_STDOUT error end { printf("print on | off\n"); };com_hlt: TOK_HLT val end { add_hlt($2); } | TOK_HLT TOK_DEL val end { del_hlt($3); } | TOK_HLT TOK_DEL end { del_hlt(21); } | TOK_HLT '?' end { list_hlt(); } | TOK_HLT error end { printf( "hlt val | del [val] | ?\n"); };ioperm: TOK_IOPERM val val val end { int i,max; if ($2 >= 0) { max = $2 + $3 - 1; if (max > IOPERM_BITS) max = IOPERM_BITS; for (i = $2;i <= max; i++) ioperm_list[i] = $4>0 ? 1 : 0; } } | TOK_IOPERM '?' end { int i,start; for (i=0; i <= IOPERM_BITS; i++) { if (ioperm_list[i]) { start = i; for (; i <= IOPERM_BITS; i++) if (!ioperm_list[i]) { printf("ioperm on in " "0x%x+0x%x\n", start,i-start); break; } } } } | TOK_IOPERM error end { printf("ioperm start len val\n"); };list_pci: TOK_DUMP_PCI end { list_pci(); } | TOK_DUMP_PCI error end { list_pci(); };boot_bios: TOK_BOOT_BIOS '?' end { if (!BootBios) printf("No Boot BIOS\n"); else printf("BootBIOS from: %i:%i:%i\n", BootBios->bus, BootBios->dev, BootBios->func); } | TOK_BOOT_BIOS error end { printf ("bootbios bus:dev:num\n"); };hlp: '?' { printf("Command list:\n"); printf(" select isa | pci bus:dev:func\n"); printf(" boot\n"); printf(" seg:reg val | reg val \n"); printf(" $x val | $mem val\n"); printf(" setmem addr list; addr := val\n"); printf(" dumpmem addr len; addr,len := val\n"); printf(" do [val]\n"); printf(" quit\n"); printf(" ?\n"); printf(" seg := ds | es;" " reg := ax | bx | cx | dx | si \n"); printf(" val := var | <hex-number> | seg:reg | seg\n"); printf(" var := $x | $mem; x := 0..20\n"); printf(" list := byte val | word val | long val " "| \"string\"\n"); printf(" pport on | off | ?\n"); printf(" ppci on | off | ?\n"); printf(" pirq on | off | ?\n"); printf(" pip on | off | ?\n"); printf(" trace on | off | ?\n"); printf(" iostat on | off | ?\n"); printf(" verbose val\n"); printf(" log \"<filename>\" | off | ?\n"); printf(" print on | off\n"); printf(" hlt val | del [val] | ?\n"); printf(" clstat\n"); printf(" lpci\n"); printf ("bootbios ?\n");};%%static voiddump_mem(CARD32 addr, int len){ dprint(addr,len);}static voidexec_int(int num){ if (num == 0x10) { /* video interrupt */ if (Device.type == NONE) { CurrentPci = PciList; while (CurrentPci) { if (CurrentPci->active) break; CurrentPci = CurrentPci->next; } if (!CurrentPci) Device.type = ISA; else { Device.type = PCI; Device.loc.pci.dev = CurrentPci->dev; Device.loc.pci.bus = CurrentPci->bus; Device.loc.pci.func = CurrentPci->func; } } if (Device.type != ISA) { if (!Device.booted) { if (!CurrentPci || (Device.type == PCI && (!CurrentPci->active && (Device.loc.pci.dev != CurrentPci->dev || Device.loc.pci.bus != CurrentPci->bus || Device.loc.pci.func != CurrentPci->func)))) { printf("boot the device fist\n"); return; } } } else CurrentPci = NULL; } else { Device.booted = FALSE; /* we need this for sanity! */ } runINT(num,®s);}static voidboot(void){ if (Device.type == NONE) { printf("select a device fist\n"); return; } call_boot(&Device);}static void *add_to_list(enum mem_type type, union mem_val *rec, void *next){ struct mem *mem_rec = (struct mem *) malloc(sizeof(mem_rec)); mem_rec->type = type; mem_rec->next = next; switch (type) { case BYTE: case WORD: case LONG: mem_rec->val.integer = rec->integer; break; case STRING: mem_rec->val.ptr = normalize_string(rec->ptr); break; } return mem_rec;}static intvalidRange(int addr,int len){ int end = addr + len; if (addr < 0x1000 || end > 0xc0000) return 0; return 1;}static voiddo_list(struct mem *list, memType addr){ struct mem *prev; int len; while (list) { switch (list->type) { case BYTE: if (!validRange(addr,1)) goto error; *(CARD8*)addr = list->val.integer; addr =+ 1; break; case WORD: if (!validRange(addr,2)) goto error; *(CARD16*)addr = list->val.integer; addr =+ 2; break; case LONG: if (!validRange(addr,4)) goto error; *(CARD32*)addr = list->val.integer; addr =+ 4; break; case STRING: len = strlen((char*)list->val.ptr); if (!validRange(addr,len)) goto error; memcpy((CARD8*)addr,(void*)list->val.ptr,len); addr =+ len; free(list->val.ptr); break; } prev = list; list = list->next; free(prev); continue; error: printf("address out of range\n"); while (list) { prev = list; list = list->next; free(prev); } break; }}static char *normalize_string(char *ptr){ int i = 0, j = 0, c = 0, esc= 0; int size; char *mem_ptr; size = strlen(ptr); mem_ptr = malloc(size); while (1) { switch (*(ptr + i)) { case '\\': if (esc) { *(mem_ptr + j++) = *(ptr + i); esc = 0; } else esc = 1; break; case '\"': if (esc) { *(mem_ptr + j++) = *(ptr + i); esc = 0; } else c++; break; default: *(mem_ptr + j++) = *(ptr + i); break; } if (c > 1) { *(mem_ptr + j) = '\0'; break; } i++; } return mem_ptr;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -