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

📄 xenitp.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 4 页
字号:
                if (virt_to_phys (*b == 'i', vaddr, res) != 0) {                    printf ("cannot find vaddr %016lx in tr\n", vaddr);                    return -1;                }                return 0;            }            else {                printf ("unknown symbol\n");                return -1;            }            *buf = e;        }        break;    case '(':        (*buf)++;        if (parse_expr (buf, res, EXPR_BASE) != 0)            return -1;        if (next_char (buf) != ')') {            printf ("missing ')'\n");            return -1;        }        else            (*buf)++;        break;    default:        printf ("unknown operand '%c' in expression\n", c);        return -1;    }    return 0;}int parse_expr (char **buf, unsigned long *res, enum prio_expr prio){    unsigned long val = 0;    unsigned long val1;    char c;    if (parse_unary (buf, &val) != 0)        return -1;    while (1) {        c = next_char (buf);        switch (c) {        case '+':        case '-':            if (prio > EXPR_SUM)                return 0;            (*buf)++;            if (parse_expr (buf, &val1, EXPR_SUM) < 0)                return -1;            if (c == '+')                val += val1;            else                val -= val1;            break;        case '*':            if (prio > EXPR_PROD)                return 0;            (*buf)++;            if (parse_expr (buf, &val1, EXPR_SUM) < 0)                return -1;            val *= val1;            break;        default:            *res = val;            return 0;        }    }}char *parse_arg (char **buf){    char *res;    char *b = *buf;    /* Eat leading spaces.  */    while (isspace ((unsigned char)*b))        b++;    res = b;    while (*b && !isspace ((unsigned char)*b))        b++;    /* Set the NUL terminator.  */    if (*b)        *b++ = 0;    *buf = b;    return res;}vcpu_guest_context_any_t vcpu_ctx_any[MAX_VIRT_CPUS];int vcpu_setcontext (int vcpu){    int ret;    ret = xc_vcpu_setcontext (xc_handle, domid, vcpu, &vcpu_ctx_any[vcpu]);    if (ret < 0)        perror ("xc_vcpu_setcontext");    return ret;}enum cmd_status { CMD_ERROR, CMD_OK, CMD_REPEAT, CMD_QUIT };struct command_desc{    const char *name;    const char *help;    enum cmd_status (*cmd)(char *line);};static enum cmd_statuscmd_registers (char *line){    print_ctx (cur_ctx);    return CMD_OK;}static enum cmd_statuscmd_sstep (char *line){    /* Set psr.dd and psr.id to skip over current breakpoint.  */    cur_ctx->regs.psr |= PSR_SS | PSR_DD | PSR_ID;    cur_ctx->regs.psr &= ~PSR_TB;    if (vcpu_setcontext (cur_vcpu) < 0)        return CMD_ERROR;    if (wait_domain (cur_vcpu, cur_ctx) < 0) {        perror ("wait_domain");        return CMD_ERROR;    }    print_ctx (cur_ctx);    return CMD_REPEAT;}static enum cmd_statuscmd_go (char *line){    unsigned long n = 1;    if (*line != 0) {        if (parse_expr (&line, &n, 0) < 0)            return CMD_ERROR;    }    while (n > 0) {        /* Set psr.dd and psr.id to skip over current breakpoint.  */        if ((cur_ctx->regs.psr & (PSR_SS | PSR_TB | PSR_DB)) != 0) {            cur_ctx->regs.psr &= ~(PSR_SS | PSR_TB);            cur_ctx->regs.psr |= PSR_DD | PSR_ID;            if (vcpu_setcontext (cur_vcpu) < 0)                return CMD_ERROR;        }        if (wait_domain (cur_vcpu, cur_ctx) < 0) {            perror ("wait_domain");            return CMD_ERROR;        }        print_ctx (cur_ctx);        n--;    }    return CMD_REPEAT;}static enum cmd_statuscmd_cb (char *line){    if ((cur_ctx->regs.psr & (PSR_SS | PSR_TB)) != PSR_TB) {        cur_ctx->regs.psr &= ~PSR_SS;        cur_ctx->regs.psr |= PSR_TB;        if (vcpu_setcontext (cur_vcpu) < 0)            return CMD_ERROR;    }    if (wait_domain (cur_vcpu, cur_ctx) < 0) {        perror ("wait_domain");        return CMD_ERROR;    }    print_ctx (cur_ctx);    return CMD_REPEAT;}static int quit_paused;static enum cmd_statuscmd_quit (char *line){    if (!strcmp (line, "paused"))        quit_paused = 1;    return CMD_QUIT;}static enum cmd_statuscmd_echo (char *line){    printf ("%s", line);    return CMD_OK;}static enum cmd_statuscmd_disassemble (char *args){    static unsigned long addr;    unsigned long end_addr = addr + 16;    if (*args != 0) {        if (parse_expr (&args, &addr, 0) < 0)            return CMD_ERROR;        if (*args != 0) {            if (parse_expr (&args, &end_addr, 0) < 0)                return CMD_ERROR;        }        else             end_addr = addr + 16;    }    target_disas (stdout, addr, end_addr - addr);    addr = end_addr;    return CMD_REPEAT;}static enum cmd_statuscmd_dump (char *args){    static unsigned long addr;    unsigned long end_addr = addr + 256;    unsigned long p;    if (*args != 0) {        if (parse_expr (&args, &addr, 0) < 0)            return CMD_ERROR;        if (*args != 0) {            if (parse_expr (&args, &end_addr, 0) < 0)                return CMD_ERROR;        }        else             end_addr = addr + 256;    }    for (p = addr; p < end_addr; p += 16) {        int i;        printf ("%016lx:", p);        for (i = 0; i < 16; i++) {            unsigned char *m = target_map_memory (p + i);            printf ("%c%02x", i == 8 ? '-' : ' ', *m);        }        printf ("\n");    }    addr = end_addr;    return CMD_REPEAT;}static enum cmd_statuscmd_break (char *args){    unsigned long addr;    int i;    for (i = 0; i < 4; i++)        if (cur_ctx->regs.ibr[2 * i] == 0 && cur_ctx->regs.ibr[2 * i + 1] == 0)            break;    if (i == 4) {        printf ("no availabe break points\n");        return CMD_ERROR;    }    if (parse_expr (&args, &addr, 0) < 0)        return CMD_ERROR;    cur_ctx->regs.ibr[2 * i] = addr;    cur_ctx->regs.ibr[2 * i + 1] = 0x87fffffffffffff0UL;    cur_ctx->regs.psr |= PSR_DB;    if (vcpu_setcontext (cur_vcpu) < 0)        return CMD_ERROR;    else        return CMD_OK;}static enum cmd_statuscmd_watch (char *args){    unsigned long addr;    unsigned long mask;    int i;    for (i = 0; i < 4; i++)        if (cur_ctx->regs.dbr[2 * i] == 0 && cur_ctx->regs.dbr[2 * i + 1] == 0)            break;    if (i == 4) {        printf ("no availabe watch points\n");        return CMD_ERROR;    }    if (parse_expr (&args, &addr, 0) < 0)        return CMD_ERROR;    if (*args == 0)        mask = 3;    else if (parse_expr (&args, &mask, 0) < 0)        return CMD_ERROR;    cur_ctx->regs.dbr[2 * i] = addr;    cur_ctx->regs.dbr[2 * i + 1] = ~((1UL << mask) - 1) | (0xc7UL << 56);    cur_ctx->regs.psr |= PSR_DB;    if (vcpu_setcontext (cur_vcpu) < 0)        return CMD_ERROR;    else {        printf ("Watchpoint %d set\n", i);        return CMD_OK;    }}static enum cmd_statuscmd_delete (char *args){    unsigned long num;    if (parse_expr (&args, &num, 0) < 0)        return CMD_ERROR;    if (num < 4) {        cur_ctx->regs.ibr[2 * num] = 0;        cur_ctx->regs.ibr[2 * num + 1] = 0;    }    else if (num < 8) {        num -= 4;        cur_ctx->regs.dbr[2 * num] = 0;        cur_ctx->regs.dbr[2 * num + 1] = 0;    }    else {        printf ("breakpoint out of range\n");        return CMD_ERROR;    }    cur_ctx->regs.psr |= PSR_DB;    if (vcpu_setcontext (cur_vcpu) < 0)        return CMD_ERROR;    else        return CMD_OK;}static enum cmd_statuscmd_disable (char *args){    unsigned long num;    if (parse_expr (&args, &num, 0) < 0)        return CMD_ERROR;    if (num >= 4) {        printf ("breakpoint out of range\n");        return CMD_ERROR;    }    cur_ctx->regs.ibr[2 * num + 1] &= ~(1UL << 63);    if (vcpu_setcontext (cur_vcpu) < 0)        return CMD_ERROR;    else        return CMD_OK;}static enum cmd_statuscmd_enable (char *args){    unsigned long num;    if (parse_expr (&args, &num, 0) < 0)        return CMD_ERROR;    if (num >= 4) {        printf ("breakpoint out of range\n");        return CMD_ERROR;    }    cur_ctx->regs.ibr[2 * num + 1] |= 1UL << 63;    if (vcpu_setcontext (cur_vcpu) < 0)        return CMD_ERROR;    else        return CMD_OK;}static enum cmd_statuscmd_print (char *args){    unsigned long addr;    if (parse_expr (&args, &addr, 0) < 0)        return CMD_ERROR;    printf ("res: 0x%016lx = %ld\n", addr, addr);    return CMD_OK;}struct bit_xlat {    unsigned int bit;    const char *name;};static const struct bit_xlat debug_flags[] = {    { XEN_IA64_DEBUG_ON_KERN_SSTEP, "sstep" },    { XEN_IA64_DEBUG_ON_KERN_DEBUG, "debug" },    { XEN_IA64_DEBUG_ON_KERN_TBRANCH, "tbranch" },    { XEN_IA64_DEBUG_ON_EXTINT, "extint" },    { XEN_IA64_DEBUG_ON_EXCEPT, "except" },    { XEN_IA64_DEBUG_ON_EVENT, "event" },    { XEN_IA64_DEBUG_ON_PRIVOP, "privop" },    { XEN_IA64_DEBUG_ON_PAL, "pal" },    { XEN_IA64_DEBUG_ON_SAL, "sal" },    { XEN_IA64_DEBUG_ON_EFI, "efi" },    { XEN_IA64_DEBUG_ON_RFI, "rfi" },    { XEN_IA64_DEBUG_ON_MMU, "mmu" },    { XEN_IA64_DEBUG_ON_BAD_MPA, "mpa" },    { XEN_IA64_DEBUG_FORCE_SS, "ss" },    { XEN_IA64_DEBUG_FORCE_DB, "db" },    { XEN_IA64_DEBUG_ON_TR, "tr" },

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -