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

📄 libelf-dominfo.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * parse xen-specific informations out of elf kernel binaries. */#include "libelf-private.h"/* ------------------------------------------------------------------------ *//* xen features                                                             */const char *elf_xen_feature_names[] = {    [XENFEAT_writable_page_tables] = "writable_page_tables",    [XENFEAT_writable_descriptor_tables] = "writable_descriptor_tables",    [XENFEAT_auto_translated_physmap] = "auto_translated_physmap",    [XENFEAT_supervisor_mode_kernel] = "supervisor_mode_kernel",    [XENFEAT_pae_pgdir_above_4gb] = "pae_pgdir_above_4gb"};const int elf_xen_features =sizeof(elf_xen_feature_names) / sizeof(elf_xen_feature_names[0]);int elf_xen_parse_features(const char *features,                           uint32_t *supported,                           uint32_t *required){    char feature[64];    int pos, len, i;    if ( features == NULL )        return 0;    for ( pos = 0; features[pos] != '\0'; pos += len )    {        memset(feature, 0, sizeof(feature));        for ( len = 0;; len++ )        {            if ( len >= sizeof(feature)-1 )                break;            if ( features[pos + len] == '\0' )                break;            if ( features[pos + len] == '|' )            {                len++;                break;            }            feature[len] = features[pos + len];        }        for ( i = 0; i < elf_xen_features; i++ )        {            if ( !elf_xen_feature_names[i] )                continue;            if ( (required != NULL) && (feature[0] == '!') )            {                /* required */                if ( !strcmp(feature + 1, elf_xen_feature_names[i]) )                {                    elf_xen_feature_set(i, supported);                    elf_xen_feature_set(i, required);                    break;                }            }            else            {                /* supported */                if ( !strcmp(feature, elf_xen_feature_names[i]) )                {                    elf_xen_feature_set(i, supported);                    break;                }            }        }        if ( i == elf_xen_features )            return -1;    }    return 0;}/* ------------------------------------------------------------------------ *//* xen elf notes                                                            */int elf_xen_parse_note(struct elf_binary *elf,                       struct elf_dom_parms *parms,                       const elf_note *note){/* *INDENT-OFF* */    static const struct {        char *name;        int str;    } note_desc[] = {        [XEN_ELFNOTE_ENTRY] = { "ENTRY", 0},        [XEN_ELFNOTE_HYPERCALL_PAGE] = { "HYPERCALL_PAGE", 0},        [XEN_ELFNOTE_VIRT_BASE] = { "VIRT_BASE", 0},        [XEN_ELFNOTE_PADDR_OFFSET] = { "PADDR_OFFSET", 0},        [XEN_ELFNOTE_HV_START_LOW] = { "HV_START_LOW", 0},        [XEN_ELFNOTE_XEN_VERSION] = { "XEN_VERSION", 1},        [XEN_ELFNOTE_GUEST_OS] = { "GUEST_OS", 1},        [XEN_ELFNOTE_GUEST_VERSION] = { "GUEST_VERSION", 1},        [XEN_ELFNOTE_LOADER] = { "LOADER", 1},        [XEN_ELFNOTE_PAE_MODE] = { "PAE_MODE", 1},        [XEN_ELFNOTE_FEATURES] = { "FEATURES", 1},        [XEN_ELFNOTE_BSD_SYMTAB] = { "BSD_SYMTAB", 1},        [XEN_ELFNOTE_SUSPEND_CANCEL] = { "SUSPEND_CANCEL", 0 },    };/* *INDENT-ON* */    const char *str = NULL;    uint64_t val = 0;    int type = elf_uval(elf, note, type);    if ( (type >= sizeof(note_desc) / sizeof(note_desc[0])) ||         (note_desc[type].name == NULL) )    {        elf_msg(elf, "%s: unknown xen elf note (0x%x)\n",                __FUNCTION__, type);        return 0;    }    if ( note_desc[type].str )    {        str = elf_note_desc(elf, note);        elf_msg(elf, "%s: %s = \"%s\"\n", __FUNCTION__,                note_desc[type].name, str);        parms->elf_notes[type].type = XEN_ENT_STR;        parms->elf_notes[type].data.str = str;    }    else    {        val = elf_note_numeric(elf, note);        elf_msg(elf, "%s: %s = 0x%" PRIx64 "\n", __FUNCTION__,                note_desc[type].name, val);        parms->elf_notes[type].type = XEN_ENT_LONG;        parms->elf_notes[type].data.num = val;    }    parms->elf_notes[type].name = note_desc[type].name;    switch ( type )    {    case XEN_ELFNOTE_LOADER:        safe_strcpy(parms->loader, str);        break;    case XEN_ELFNOTE_GUEST_OS:        safe_strcpy(parms->guest_os, str);        break;    case XEN_ELFNOTE_GUEST_VERSION:        safe_strcpy(parms->guest_ver, str);        break;    case XEN_ELFNOTE_XEN_VERSION:        safe_strcpy(parms->xen_ver, str);        break;    case XEN_ELFNOTE_PAE_MODE:        if ( !strcmp(str, "yes") )            parms->pae = 2 /* extended_cr3 */;        if ( strstr(str, "bimodal") )            parms->pae = 3 /* bimodal */;        break;    case XEN_ELFNOTE_BSD_SYMTAB:        if ( !strcmp(str, "yes") )            parms->bsd_symtab = 1;        break;    case XEN_ELFNOTE_VIRT_BASE:        parms->virt_base = val;        break;    case XEN_ELFNOTE_ENTRY:        parms->virt_entry = val;        break;    case XEN_ELFNOTE_PADDR_OFFSET:        parms->elf_paddr_offset = val;        break;    case XEN_ELFNOTE_HYPERCALL_PAGE:        parms->virt_hypercall = val;        break;    case XEN_ELFNOTE_HV_START_LOW:        parms->virt_hv_start_low = val;        break;    case XEN_ELFNOTE_FEATURES:        if ( elf_xen_parse_features(str, parms->f_supported,                                    parms->f_required) )            return -1;        break;    }    return 0;}static int elf_xen_parse_notes(struct elf_binary *elf,                               struct elf_dom_parms *parms,                               const void *start, const void *end){    int xen_elfnotes = 0;    const elf_note *note;    parms->elf_note_start = start;    parms->elf_note_end   = end;    for ( note = parms->elf_note_start;          (void *)note < parms->elf_note_end;          note = elf_note_next(elf, note) )    {        if ( strcmp(elf_note_name(elf, note), "Xen") )            continue;        if ( elf_xen_parse_note(elf, parms, note) )            return -1;        xen_elfnotes++;    }    return xen_elfnotes;}/* ------------------------------------------------------------------------ *//* __xen_guest section                                                      */int elf_xen_parse_guest_info(struct elf_binary *elf,                             struct elf_dom_parms *parms){    const char *h;    char name[32], value[128];    int len;    h = parms->guest_info;    while ( *h )    {        memset(name, 0, sizeof(name));        memset(value, 0, sizeof(value));        for ( len = 0;; len++, h++ )        {            if ( len >= sizeof(name)-1 )                break;            if ( *h == '\0' )                break;            if ( *h == ',' )            {                h++;                break;            }            if ( *h == '=' )            {                h++;                for ( len = 0;; len++, h++ )                {                    if ( len >= sizeof(value)-1 )                        break;                    if ( *h == '\0' )                        break;                    if ( *h == ',' )                    {                        h++;                        break;                    }                    value[len] = *h;                }                break;            }            name[len] = *h;        }        elf_msg(elf, "%s: %s=\"%s\"\n", __FUNCTION__, name, value);        /* strings */        if ( !strcmp(name, "LOADER") )            safe_strcpy(parms->loader, value);

⌨️ 快捷键说明

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