Skip to content

x86 registers definition #62

Description

@Wenzel

Hi !

I'm considering using your crate to use a "standard" definition of x86 registers in my project.
My goal is to do Virtual Machine Introspection (VMI), and I would like to read the registers of a VM on Xen, KVM or VirtualBox with a Rust API (libmicrovmi)

I looked at your docs, but I couldn't find a structure that would define the x86 registers.
There is indeed a module that defines the MSR constants, but what I would like is a structure that would contains all x86 standard registers.

For example on the Libvmi (C) library:

/*
 * Commonly used x86 registers
 */
typedef struct x86_regs {
    uint64_t rax;
    uint64_t rcx;
    uint64_t rdx;
    uint64_t rbx;
    uint64_t rsp;
    uint64_t rbp;
    uint64_t rsi;
    uint64_t rdi;
    uint64_t r8;
    uint64_t r9;
    uint64_t r10;
    uint64_t r11;
    uint64_t r12;
    uint64_t r13;
    uint64_t r14;
    uint64_t r15;
    uint64_t rflags;
    uint64_t dr6;
    uint64_t dr7;
    uint64_t rip;
    uint64_t cr0;
    uint64_t cr2;
    uint64_t cr3;
    uint64_t cr4;
    uint64_t sysenter_cs;
    uint64_t sysenter_esp;
    uint64_t sysenter_eip;
    uint64_t msr_efer;
    uint64_t msr_star;
    uint64_t msr_lstar;
    uint64_t msr_pat;
    uint64_t msr_cstar;
    uint64_t fs_base;
    uint64_t fs_limit;
    uint64_t fs_sel;
    uint64_t fs_arbytes;
    uint64_t gs_base;
    uint64_t gs_limit;
    uint64_t gs_sel;
    uint64_t gs_arbytes;
    uint64_t cs_base;
    uint64_t cs_limit;
    uint64_t cs_sel;
    uint32_t cs_arbytes;
    uint64_t ss_base;
    uint64_t ss_limit;
    uint64_t ss_sel;
    uint64_t ss_arbytes;
    uint64_t ds_base;
    uint64_t ds_limit;
    uint64_t ds_sel;
    uint64_t ds_arbytes;
    uint64_t es_base;
    uint64_t es_limit;
    uint64_t es_sel;
    uint64_t es_arbytes;
    uint64_t shadow_gs;
    uint64_t idtr_base;
    uint64_t idtr_limit;
    uint64_t gdtr_base;
    uint64_t gdtr_limit;

    uint32_t _pad;
} x86_registers_t;

typedef struct arm_registers {
    uint64_t ttbr0;
    uint64_t ttbr1;
    uint64_t ttbcr;
    uint64_t pc;
    uint32_t cpsr;
    uint32_t _pad;
} arm_registers_t;

typedef struct registers {
    union {
        x86_registers_t x86;
        arm_registers_t arm;
    };
} registers_t;

Can you add such a structure to provide a standard definition of x86 registers in a crate ?
What do you think ?

Thank you for this crate !

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions