vx32.h - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       vx32.h (4059B)
       ---
            1 // VX32 Virtual execution environment
            2 
            3 #ifndef VX32_H
            4 #define VX32_H
            5 
            6 #include <inttypes.h>
            7 #include <sys/types.h>
            8 #include <sys/signal.h>
            9 
           10 // VX memory access permission bits
           11 #define VXPERM_READ  0x01
           12 #define VXPERM_WRITE 0x02
           13 #define VXPERM_EXEC  0x04
           14 
           15 // VX trap code categories
           16 #define VXTRAP_CPU                0x000
           17 #define VXTRAP_IRQ                0x100
           18 #define VXTRAP_SOFT                0x200
           19 #define VXTRAP_SYSCALL        0x300
           20 #define VXTRAP_SIGNAL        0x400
           21 #define VXTRAP_SINGLESTEP        0x500
           22 #define VXTRAP_CATEGORY        0xF00
           23 
           24 #define VXIRQ_TIMER                0
           25 
           26 // VX processor traps (same numbering as Intel)
           27 #define VXTRAP_DIVIDE                0x000        // Integer divide by zero
           28 #define VXTRAP_DEBUG                0x001        // Debug exception (single step)
           29 #define VXTRAP_BREAKPOINT        0x003        // INT3 (breakpoint) instruction
           30 #define VXTRAP_INVALID                0x006        // Invalid instruction opcode
           31 #define VXTRAP_FPOFF                0x007        // Floating point unit needed
           32 #define VXTRAP_PAGEFAULT        0x00e        // Reference to inaccessible page
           33 #define VXTRAP_ALIGN                0x011        // Misaligned memory reference
           34 #define VXTRAP_FLOAT                0x013        // SIMD floating-point exception
           35 
           36 // Intel 32-bit register numbers, in Intel order
           37 #define EAX        0
           38 #define ECX        1
           39 #define EDX        2
           40 #define EBX        3
           41 #define ESP        4
           42 #define EBP        5
           43 #define ESI        6
           44 #define EDI        7
           45 
           46 // EFLAGS bits implemented in vx32
           47 #define EF_CF_BIT        0
           48 #define EF_PF_BIT        2
           49 #define EF_ZF_BIT        6
           50 #define EF_SF_BIT        7
           51 #define EF_DF_BIT        10
           52 #define EF_OF_BIT        11
           53 #define EF_CF                (1 << EF_CF_BIT)
           54 #define EF_PF                (1 << EF_PF_BIT)
           55 #define EF_ZF                (1 << EF_ZF_BIT)
           56 #define EF_SF                (1 << EF_SF_BIT)
           57 #define EF_DF                (1 << EF_DF_BIT)
           58 #define EF_OF                (1 << EF_OF_BIT)
           59 
           60 // Signal handlers.
           61 int vx32_siginit(void);
           62 int vx32_sighandler(int, siginfo_t*, void*);
           63 
           64 typedef struct vxcpu        vxcpu;
           65 typedef struct vxemu        vxemu;
           66 typedef struct vxmem        vxmem;
           67 typedef struct vxmmap        vxmmap;
           68 typedef struct vxproc        vxproc;
           69 
           70 // VX32 CPU state
           71 struct vxcpu {
           72         uint32_t        reg[8];
           73         uint32_t        eip;
           74         uint32_t        eflags;
           75         
           76         uint32_t        traperr;
           77         uint32_t        trapva;  // cr2
           78 };
           79 
           80 // Memory
           81 #define VXMEMMAP_GODMODE        0x01        // Disable permission checking
           82 
           83 struct vxmem {
           84         ssize_t        (*read)(vxmem*, void *data, uint32_t addr, uint32_t len);
           85         ssize_t (*write)(vxmem*, const void *data, uint32_t addr, uint32_t len);
           86         vxmmap*        (*map)(vxmem*, uint32_t flags);
           87         void        (*unmap)(vxmem*, vxmmap*);
           88         int        (*checkperm)(vxmem*, uint32_t addr, uint32_t len, uint32_t perm, uint32_t *out_faultva);
           89         int        (*setperm)(vxmem*, uint32_t addr, uint32_t len, uint32_t perm);
           90         int        (*resize)(vxmem*, size_t);
           91         void        (*free)(vxmem*);
           92         
           93         vxmmap        *mapped;
           94         vxmmap        *mapped_godmode;
           95 };
           96 int        vxmem_read(vxmem*, void *data, uint32_t addr, uint32_t len);
           97 int        vxmem_write(vxmem*, const void *data, uint32_t addr, uint32_t len);
           98 vxmmap *vxmem_map(vxmem*, uint32_t);
           99 void vxmem_unmap(vxmem*, vxmmap*);
          100 int        vxmem_checkperm(vxmem*, uint32_t addr, uint32_t len, uint32_t perm, uint32_t *out_faultva);
          101 int        vxmem_setperm(vxmem*, uint32_t addr, uint32_t len, uint32_t perm);
          102 void        vxmem_free(vxmem*);
          103 int        vxmem_resize(vxmem*, size_t);
          104 
          105 vxmem*        vxmem_chunk_new(int);
          106 vxmem*        vxmem_chunk_copy(vxmem*);
          107 
          108 // A single memory-mapped address space region.
          109 struct vxmmap {
          110         int ref;
          111         void *base;
          112         uint32_t size;
          113 };
          114 
          115 
          116 // Process state.
          117 struct vxproc {
          118         vxemu        *emu;        // Emulation state
          119         vxcpu        *cpu;        // Register contents (points into emu)
          120         vxmem        *mem;        // Memory layout
          121         int        vxpno;
          122         int        allowfp;
          123 };
          124 
          125 vxproc        *vxproc_alloc(void);
          126 void        vxproc_free(vxproc*);
          127 int        vxproc_run(vxproc *proc);
          128 void        vxproc_flush(vxproc *proc);
          129 
          130 // ELF loader
          131 int        vxproc_loadelffile(vxproc *p, const char *file,
          132         const char *const *argv, const char *const *envp);
          133 int        vxproc_loadelfmem(vxproc *p, const void *mem, size_t nmem,
          134         const char *const *argv, const char *const *envp);
          135 
          136 // VX system call numbers
          137 #define VXPC_EXIT 0x1000
          138 #define VXPC_WRITE 0x3100
          139 #define VXPC_READ 0x03
          140 #define VXPC_SBRK 0x04
          141 #define VXPC_SETPERM 0x01
          142 
          143 // VX system call errors
          144 #define VXTRAP_INVARG                0x301        // Invalid argument to system call
          145 
          146 typedef int vxpcallhandler(vxproc *proc, void *pcalldata);
          147 int        vxproc_run_pcall(vxproc *proc, int(*)(vxproc*, void*), void*);
          148 
          149 extern int vx32_debugxlate;        // dump translations to stderr
          150 
          151 #endif