/*
JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine
Copyright (C) 2012-2013 Ian Preston
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Details (including contact information) can be found at:
jpc.sourceforge.net
or the developer website
sourceforge.net/projects/jpc/
End of licence header
*/
package org.jpc.debugger;
import org.jpc.emulator.processor.Processor;
import org.jpc.emulator.processor.Segment;
import org.jpc.emulator.processor.SegmentFactory;
public class ProcessorState
{
public static final int EAX = 0;
public static final int ECX = 1;
public static final int EDX = 2;
public static final int EBX = 3;
public static final int ESI = 4;
public static final int EDI = 5;
public static final int ESP = 6;
public static final int EBP = 7;
public static final int EIP = 8;
public static final int EFLAGS = 9;
public static final int CR0 = 10;
public static final int CR1 = 11;
public static final int CR2 = 12;
public static final int CR3 = 13;
public static final int CR4 = 14;
public static final int ES = 15;
public static final int CS = 16;
public static final int SS = 17;
public static final int DS = 18;
public static final int FS = 19;
public static final int GS = 20;
public static final int ES_LIMIT = 21;
public static final int CS_LIMIT = 22;
public static final int SS_LIMIT = 23;
public static final int DS_LIMIT = 24;
public static final int FS_LIMIT = 25;
public static final int GS_LIMIT = 26;
public static final int IDTR = 27;
public static final int GDTR = 28;
public static final int LDTR = 29;
public static int[] extract(Processor cpu)
{
int[] regs = new int[30];
regs[EAX] = cpu.r_eax.get32();
regs[ECX] = cpu.r_ecx.get32();
regs[EDX] = cpu.r_edx.get32();
regs[EBX] = cpu.r_ebx.get32();
regs[ESI] = cpu.r_esi.get32();
regs[EDI] = cpu.r_edi.get32();
regs[ESP] = cpu.r_esp.get32();
regs[EBP] = cpu.r_ebp.get32();
regs[EIP] = cpu.eip;
regs[EFLAGS] = cpu.getEFlags();
regs[CR0] = cpu.getCR0();
regs[CR1] = 0;
regs[CR2] = cpu.getCR2();
regs[CR3] = cpu.getCR3();
regs[CR4] = cpu.getCR4();
regs[ES] = getBase(cpu.es);
regs[CS] = getBase(cpu.cs);
regs[SS] = getBase(cpu.ss);
regs[DS] = getBase(cpu.ds);
regs[FS] = getBase(cpu.fs);
regs[GS] = getBase(cpu.gs);
regs[ES_LIMIT] = getLimit(cpu.es);
regs[CS_LIMIT] = getLimit(cpu.cs);
regs[SS_LIMIT] = getLimit(cpu.ss);
regs[DS_LIMIT] = getLimit(cpu.ds);
regs[FS_LIMIT] = getLimit(cpu.fs);
regs[GS_LIMIT] = getLimit(cpu.gs);
regs[IDTR] = getBase(cpu.idtr);
regs[GDTR] = getBase(cpu.gdtr);
regs[LDTR] = getBase(cpu.ldtr);
return regs;
}
private static int getLimit(Segment s)
{
if (s instanceof SegmentFactory.NullSegment)
return 0;
return s.getLimit();
}
private static int getBase(Segment s)
{
if (s instanceof SegmentFactory.NullSegment)
return 0;
return s.getBase();
}
}