📄 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 void
dump_mem(CARD32 addr, int len)
{
dprint(addr,len);
}
static void
exec_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 void
boot(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 int
validRange(int addr,int len)
{
int end = addr + len;
if (addr < 0x1000 || end > 0xc0000)
return 0;
return 1;
}
static void
do_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 + -