⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.y

📁 gumstiz u-boot loader in linux
💻 Y
📖 第 1 页 / 共 2 页
字号:
          | 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,&regs);}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 + -