// -*- mode: c++ -*- #ifndef CONTEXT_H #define CONTEXT_H #include #include #include #include "vg/memcheck.h" template T align_down(T sp) { // There is no platform we care about that needs more than a // 16-byte alignment. return (T)((uint32_t)sp & ~(16 - 1)); } struct registers_t { // general purpose registers uint32_t eax, ebx, ecx, edx, ebp, esi, edi, esp; // segment registers uint16_t cs, ds, ss, es, fs, gs; uint32_t eflags; uint32_t eip; } __attribute__((aligned(16))); class context { public: registers_t regs; context(); context *next; void swap(context &out); void call(void *f, void *arg, void *sp); }; #endif