Overview   API Reference  

in_out.hpp

00001 #if !defined(__IN_OUT_HPP__)
00002 #define __IN_OUT_HPP__
00003 
00004 //
00005 // x86 in{b,w,l} emulation
00006 //
00007 template <typename WordT>
00008 inline int x86_in(x86_machine &machine, x86_context &ctx, const l4_port_t port)
00009 {
00010     const access_size access_size=sizeof(WordT);
00011     logd(L4VMM_DEBUG_X86 >= 4, "  reading %s from port "l4_port_fmt" [%d]\n",
00012          access_size.string(), port, access_size());
00013 
00014     // merge read bits with old register content
00015     const l4_umword_t mask=access_size.mask();
00016     ctx.eax()=(ctx.eax() & ~mask) | machine.template read_virtual_ioport<WordT>(port);
00017 
00018     logd(L4VMM_DEBUG_X86 >= 3, "  read %s %s from port "l4_port_fmt" [%d]\n",
00019          access_size.string(), format_hex<WordT>(ctx.eax(), access_size*2).c_str(), port, access_size());
00020     return 0;
00021 }
00022 
00023 //
00024 // x86 out{b,w,l} emulation
00025 //
00026 template <typename WordT>
00027 inline int x86_out(x86_machine &machine, x86_context &ctx, const l4_port_t port)
00028 {
00029     const access_size access_size=sizeof(WordT);
00030     logd(L4VMM_DEBUG_X86 >= 3, "  writing %s %s to port "l4_port_fmt" [%d]\n",
00031          access_size.string(), format_hex<WordT>(ctx.eax(), access_size*2).c_str(), port, access_size());
00032 
00033     machine.template write_virtual_ioport<WordT>(port, ctx.eax());
00034     return 0;
00035 }
00036 
00037 //
00038 // x86 ins{b,w,l} emulation
00039 //
00040 template <typename WordT>
00041 inline int x86_ins(x86_machine &machine, x86_context &ctx, bool rep=true)
00042 {
00043     const access_size access_size=sizeof(WordT);
00044     const l4_port_t port=ctx.edx() & 0xffff;
00045     const short delta=(ctx.eflags() & (1<<10)) ? -1 : 1;
00046     WordT *p=reinterpret_cast<WordT *>(ctx.edi());
00047 
00048     if (likely(rep)) {
00049         logd(L4VMM_DEBUG_X86 >= 3, "  reading %ld %ss from port "l4_port_fmt" to "l4_gva_fmt"\n",
00050              ctx.ecx(), access_size.string(), port, ctx.edi());
00051 
00052         ctx.edi()+=access_size * delta * ctx.ecx();
00053         for (; ctx.ecx() > 0; ctx.ecx()--, p+=delta)
00054             *p=machine.template read_virtual_ioport<WordT>(port);
00055     }
00056     else {
00057         logd(L4VMM_DEBUG_X86 >= 3, "  reading 1 %s from port "l4_port_fmt" to "l4_gva_fmt"\n",
00058              access_size.string(), port, ctx.edi());
00059 
00060         ctx.edi()+=access_size * delta;
00061         *p=machine.template read_virtual_ioport<WordT>(port);
00062     }
00063 
00064     return 0;
00065 }
00066 
00067 //
00068 // x86 outs{b,w,l} emulation
00069 //
00070 template <typename WordT>
00071 inline int x86_outs(x86_machine &machine, x86_context &ctx, bool rep=true)
00072 {
00073     const access_size access_size=sizeof(WordT);
00074     const l4_port_t port=ctx.edx() & 0xffff;
00075     const short delta=(ctx.eflags() & (1<<10)) ? -1 : 1;
00076     const WordT *p=reinterpret_cast<const WordT *>(ctx.esi());
00077 
00078     if (likely(rep)) {
00079         logd(L4VMM_DEBUG_X86 >= 3, "  writing %ld %ss from "l4_gva_fmt" to port "l4_port_fmt"\n",
00080              ctx.ecx(), access_size.string(), ctx.esi(), port);
00081 
00082         ctx.esi()+=access_size * delta * ctx.ecx();
00083         for (; ctx.ecx() > 0; ctx.ecx()--, p+=delta)
00084             machine.template write_virtual_ioport<WordT>(port, *p);
00085     }
00086     else {
00087         logd(L4VMM_DEBUG_X86 >= 3, "  writing 1 %s from "l4_gva_fmt" to port "l4_port_fmt"\n",
00088              access_size.string(), ctx.esi(), port);
00089 
00090         ctx.esi()+=access_size * delta;
00091         machine.template write_virtual_ioport<WordT>(port, *p);
00092     }
00093 
00094     return 0;
00095 }
00096 
00097 #endif
00098 
00099 // ***** end of source ***** //
00100 

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