Overview   API Reference  

x86_context.hpp

00001 #if !defined(__SYSTEM_L4_X86_X86_CONTEXT_HPP__)
00002 #define __SYSTEM_L4_X86_X86_CONTEXT_HPP__
00003 
00004 //
00005 // L4 includes
00006 //
00007 #include <l4/sys/utcb.h>
00008 
00009 //
00010 // local includes
00011 //
00012 #include "core/system/context.hpp"
00013 
00018 struct x86_context : public context<l4_utcb_t>
00019 {
00020     //
00021     // equally defined on both architectures
00022     //
00023     CONTEXT_ACCESSOR(l4_umword_t, trapno, exc.trapno);
00024     CONTEXT_ACCESSOR(l4_umword_t, err, exc.err);
00025     CONTEXT_ACCESSOR(l4_umword_t, pfa, exc.pfa);
00026 
00027   #if defined(ARCH_x86)
00028     CONTEXT_ACCESSOR(l4_umword_t, ip, exc.eip);
00029 
00030     CONTEXT_ACCESSOR(l4_umword_t, eax, exc.eax);
00031     CONTEXT_ACCESSOR(l4_umword_t, ebx, exc.ebx);
00032     CONTEXT_ACCESSOR(l4_umword_t, ecx, exc.ecx);
00033     CONTEXT_ACCESSOR(l4_umword_t, edx, exc.edx);
00034     CONTEXT_ACCESSOR(l4_umword_t, esi, exc.esi);
00035     CONTEXT_ACCESSOR(l4_umword_t, edi, exc.edi);
00036     CONTEXT_ACCESSOR(l4_umword_t, ebp, exc.ebp);
00037     CONTEXT_ACCESSOR(l4_umword_t, esp, exc.esp);
00038     CONTEXT_ACCESSOR(l4_umword_t, eip, exc.eip);
00039     CONTEXT_ACCESSOR(l4_umword_t, eflags, exc.eflags);
00040 
00041     CONTEXT_ACCESSOR(l4_umword_t, rax, exc.eax);
00042     CONTEXT_ACCESSOR(l4_umword_t, rbx, exc.ebx);
00043     CONTEXT_ACCESSOR(l4_umword_t, rcx, exc.ecx);
00044     CONTEXT_ACCESSOR(l4_umword_t, rdx, exc.edx);
00045     CONTEXT_ACCESSOR(l4_umword_t, rsi, exc.esi);
00046     CONTEXT_ACCESSOR(l4_umword_t, rdi, exc.edi);
00047     CONTEXT_ACCESSOR(l4_umword_t, rbp, exc.ebp);
00048     CONTEXT_ACCESSOR(l4_umword_t, rsp, exc.esp);
00049     CONTEXT_ACCESSOR(l4_umword_t, rip, exc.eip);
00050     CONTEXT_ACCESSOR(l4_umword_t, rflags, exc.eflags);
00051 
00052     CONTEXT_ACCESSOR(l4_umword_t, fs, exc.fs);
00053     CONTEXT_ACCESSOR(l4_umword_t, gs, exc.gs);
00054   #elif defined(ARCH_amd64)
00055     CONTEXT_ACCESSOR(l4_umword_t, ip, exc.rip);
00056 
00057     CONTEXT_ACCESSOR(l4_umword_t, eax, exc.rax);
00058     CONTEXT_ACCESSOR(l4_umword_t, ebx, exc.rbx);
00059     CONTEXT_ACCESSOR(l4_umword_t, ecx, exc.rcx);
00060     CONTEXT_ACCESSOR(l4_umword_t, edx, exc.rdx);
00061     CONTEXT_ACCESSOR(l4_umword_t, esi, exc.rsi);
00062     CONTEXT_ACCESSOR(l4_umword_t, edi, exc.rdi);
00063     CONTEXT_ACCESSOR(l4_umword_t, ebp, exc.rbp);
00064     CONTEXT_ACCESSOR(l4_umword_t, esp, exc.rsp);
00065     CONTEXT_ACCESSOR(l4_umword_t, eip, exc.rip);
00066     CONTEXT_ACCESSOR(l4_umword_t, eflags, exc.rflags);
00067 
00068     CONTEXT_ACCESSOR(l4_umword_t, rax, exc.rax);
00069     CONTEXT_ACCESSOR(l4_umword_t, rbx, exc.rbx);
00070     CONTEXT_ACCESSOR(l4_umword_t, rcx, exc.rcx);
00071     CONTEXT_ACCESSOR(l4_umword_t, rdx, exc.rdx);
00072     CONTEXT_ACCESSOR(l4_umword_t, rsi, exc.rsi);
00073     CONTEXT_ACCESSOR(l4_umword_t, rdi, exc.rdi);
00074     CONTEXT_ACCESSOR(l4_umword_t, rbp, exc.rbp);
00075     CONTEXT_ACCESSOR(l4_umword_t, rsp, exc.rsp);
00076     CONTEXT_ACCESSOR(l4_umword_t, rip, exc.rip);
00077     CONTEXT_ACCESSOR(l4_umword_t, rflags, exc.rflags);
00078 
00079     CONTEXT_ACCESSOR(l4_umword_t, r8, exc.r8);
00080     CONTEXT_ACCESSOR(l4_umword_t, r9, exc.r9);
00081     CONTEXT_ACCESSOR(l4_umword_t, r10, exc.r10);
00082     CONTEXT_ACCESSOR(l4_umword_t, r11, exc.r11);
00083     CONTEXT_ACCESSOR(l4_umword_t, r12, exc.r12);
00084     CONTEXT_ACCESSOR(l4_umword_t, r13, exc.r13);
00085     CONTEXT_ACCESSOR(l4_umword_t, r14, exc.r14);
00086     CONTEXT_ACCESSOR(l4_umword_t, r15, exc.r15);
00087 
00088     CONTEXT_ACCESSOR(l4_umword_t, ss, exc.ss);
00089   #endif
00090 
00091     template <typename WordT>
00092     inline WordT opcode(const int offset=0) const
00093     {
00094         return *reinterpret_cast<const WordT *>(ip()+offset);
00095     }
00096 
00097     inline bool is_io_page_fault(void) const
00098     {
00099         return l4_is_io_page_fault(pfa());
00100     }
00101 };
00102 
00103 #endif
00104 
00105 // ***** end of source ***** //
00106 

L4vmm Reference Manual, written by Mario Schwalbe  © 2006-2008