00001 #if !defined(__SYSTEM_L4_X86_X86_CONTEXT_HPP__)
00002 #define __SYSTEM_L4_X86_X86_CONTEXT_HPP__
00003
00004
00005
00006
00007 #include <l4/sys/utcb.h>
00008
00009
00010
00011
00012 #include "core/system/context.hpp"
00013
00018 struct x86_context : public context<l4_utcb_t>
00019 {
00020
00021
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
00106