386_common: Optimize I/O permission checking for word and dword operations (based on qemu)
This commit is contained in:
@@ -2,7 +2,7 @@ static int
|
||||
opIN_AL_imm(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t port = (uint16_t) getbytef();
|
||||
check_io_perm(port);
|
||||
check_io_perm(port, 1);
|
||||
AL = inb(port);
|
||||
CLOCK_CYCLES(12);
|
||||
PREFETCH_RUN(12, 2, -1, 1, 0, 0, 0, 0);
|
||||
@@ -14,8 +14,7 @@ static int
|
||||
opIN_AX_imm(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t port = (uint16_t) getbytef();
|
||||
check_io_perm(port);
|
||||
check_io_perm(port + 1);
|
||||
check_io_perm(port, 2);
|
||||
AX = inw(port);
|
||||
CLOCK_CYCLES(12);
|
||||
PREFETCH_RUN(12, 2, -1, 1, 0, 0, 0, 0);
|
||||
@@ -27,10 +26,7 @@ static int
|
||||
opIN_EAX_imm(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t port = (uint16_t) getbytef();
|
||||
check_io_perm(port);
|
||||
check_io_perm(port + 1);
|
||||
check_io_perm(port + 2);
|
||||
check_io_perm(port + 3);
|
||||
check_io_perm(port, 4);
|
||||
EAX = inl(port);
|
||||
CLOCK_CYCLES(12);
|
||||
PREFETCH_RUN(12, 2, -1, 0, 1, 0, 0, 0);
|
||||
@@ -43,7 +39,7 @@ static int
|
||||
opOUT_AL_imm(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t port = (uint16_t) getbytef();
|
||||
check_io_perm(port);
|
||||
check_io_perm(port, 1);
|
||||
outb(port, AL);
|
||||
CLOCK_CYCLES(10);
|
||||
PREFETCH_RUN(10, 2, -1, 0, 0, 1, 0, 0);
|
||||
@@ -57,8 +53,7 @@ static int
|
||||
opOUT_AX_imm(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t port = (uint16_t) getbytef();
|
||||
check_io_perm(port);
|
||||
check_io_perm(port + 1);
|
||||
check_io_perm(port, 2);
|
||||
outw(port, AX);
|
||||
CLOCK_CYCLES(10);
|
||||
PREFETCH_RUN(10, 2, -1, 0, 0, 1, 0, 0);
|
||||
@@ -70,10 +65,7 @@ static int
|
||||
opOUT_EAX_imm(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t port = (uint16_t) getbytef();
|
||||
check_io_perm(port);
|
||||
check_io_perm(port + 1);
|
||||
check_io_perm(port + 2);
|
||||
check_io_perm(port + 3);
|
||||
check_io_perm(port, 4);
|
||||
outl(port, EAX);
|
||||
CLOCK_CYCLES(10);
|
||||
PREFETCH_RUN(10, 2, -1, 0, 0, 0, 1, 0);
|
||||
@@ -85,7 +77,7 @@ opOUT_EAX_imm(uint32_t fetchdat)
|
||||
static int
|
||||
opIN_AL_DX(uint32_t fetchdat)
|
||||
{
|
||||
check_io_perm(DX);
|
||||
check_io_perm(DX, 1);
|
||||
AL = inb(DX);
|
||||
CLOCK_CYCLES(12);
|
||||
PREFETCH_RUN(12, 1, -1, 1, 0, 0, 0, 0);
|
||||
@@ -96,8 +88,7 @@ opIN_AL_DX(uint32_t fetchdat)
|
||||
static int
|
||||
opIN_AX_DX(uint32_t fetchdat)
|
||||
{
|
||||
check_io_perm(DX);
|
||||
check_io_perm(DX + 1);
|
||||
check_io_perm(DX, 2);
|
||||
AX = inw(DX);
|
||||
CLOCK_CYCLES(12);
|
||||
PREFETCH_RUN(12, 1, -1, 1, 0, 0, 0, 0);
|
||||
@@ -108,10 +99,7 @@ opIN_AX_DX(uint32_t fetchdat)
|
||||
static int
|
||||
opIN_EAX_DX(uint32_t fetchdat)
|
||||
{
|
||||
check_io_perm(DX);
|
||||
check_io_perm(DX + 1);
|
||||
check_io_perm(DX + 2);
|
||||
check_io_perm(DX + 3);
|
||||
check_io_perm(DX, 4);
|
||||
EAX = inl(DX);
|
||||
CLOCK_CYCLES(12);
|
||||
PREFETCH_RUN(12, 1, -1, 0, 1, 0, 0, 0);
|
||||
@@ -123,7 +111,7 @@ opIN_EAX_DX(uint32_t fetchdat)
|
||||
static int
|
||||
opOUT_AL_DX(uint32_t fetchdat)
|
||||
{
|
||||
check_io_perm(DX);
|
||||
check_io_perm(DX, 1);
|
||||
outb(DX, AL);
|
||||
CLOCK_CYCLES(11);
|
||||
PREFETCH_RUN(11, 1, -1, 0, 0, 1, 0, 0);
|
||||
@@ -134,8 +122,7 @@ opOUT_AL_DX(uint32_t fetchdat)
|
||||
static int
|
||||
opOUT_AX_DX(uint32_t fetchdat)
|
||||
{
|
||||
check_io_perm(DX);
|
||||
check_io_perm(DX + 1);
|
||||
check_io_perm(DX, 2);
|
||||
outw(DX, AX);
|
||||
CLOCK_CYCLES(11);
|
||||
PREFETCH_RUN(11, 1, -1, 0, 0, 1, 0, 0);
|
||||
@@ -146,10 +133,7 @@ opOUT_AX_DX(uint32_t fetchdat)
|
||||
static int
|
||||
opOUT_EAX_DX(uint32_t fetchdat)
|
||||
{
|
||||
check_io_perm(DX);
|
||||
check_io_perm(DX + 1);
|
||||
check_io_perm(DX + 2);
|
||||
check_io_perm(DX + 3);
|
||||
check_io_perm(DX, 4);
|
||||
outl(DX, EAX);
|
||||
PREFETCH_RUN(11, 1, -1, 0, 0, 0, 1, 0);
|
||||
if (nmi && nmi_enable && nmi_mask)
|
||||
|
||||
Reference in New Issue
Block a user