📄 libelf-dominfo.c
字号:
/* * 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 + -