00001 #if !defined(__IN_OUT_HPP__)
00002 #define __IN_OUT_HPP__
00003
00004
00005
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
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
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
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
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
00100