* sky-vu.c: new file to read/write VU registers
* Makefile.in .Sanitize: add sky-vu.c * sky-vu.h: define registers as enum, export read/write routines * sky-vu[01].[ch]: use register read/write routines in sky-vu.c * interp.c: use register read/write routines in sky-vu.c
This commit is contained in:
parent
d8f5304972
commit
d44859a2d8
|
@ -35,7 +35,7 @@ sky_files="ChangeLog.sky sky-device.c sky-device.h sky-dma.c sky-dma.h sky-bits.
|
|||
sky_files="$sky_files sky-engine.c sky-gpuif.c sky-gpuif.h"
|
||||
sky_files="$sky_files sky-hardware.c sky-hardware.h sky-gdb.c"
|
||||
sky_files="$sky_files sky-libvpe.c sky-libvpe.h sky-pke.c sky-pke.h"
|
||||
sky_files="$sky_files sky-vpe.h sky-vu.h sky-vu0.c sky-vu0.h sky-vu1.c sky-vu1.h"
|
||||
sky_files="$sky_files sky-vpe.h sky-vu.h sky-vu.c sky-vu0.c sky-vu0.h sky-vu1.c sky-vu1.h"
|
||||
if ( echo $* | grep keep\-sky > /dev/null ) ; then
|
||||
keep_these_too="${sky_files} ${keep_these_too}"
|
||||
else
|
||||
|
|
|
@ -17,6 +17,7 @@ SIM_SKY_OBJS = \
|
|||
sky-hardware.o \
|
||||
sky-libvpe.o \
|
||||
sky-pke.o \
|
||||
sky-vu.o \
|
||||
sky-vu0.o \
|
||||
sky-vu1.o \
|
||||
sky-gdb.o
|
||||
|
@ -46,6 +47,7 @@ SIM_M16_OBJ = \
|
|||
m16run.o \
|
||||
|
||||
MIPS_EXTRA_OBJS = @mips_extra_objs@
|
||||
MIPS_EXTRA_LIBS = @mips_extra_libs@
|
||||
|
||||
SIM_OBJS = \
|
||||
$(SIM_@sim_gen@_OBJ) \
|
||||
|
@ -77,6 +79,8 @@ SIM_EXTRA_CLEAN = clean-extra
|
|||
|
||||
SIM_EXTRA_ALL = $(SIM_@sim_gen@_ALL)
|
||||
|
||||
SIM_EXTRA_LIBS = $(MIPS_EXTRA_LIBS)
|
||||
|
||||
# List of main object files for `run'.
|
||||
SIM_RUN_OBJS = nrun.o
|
||||
|
||||
|
@ -127,6 +131,9 @@ IGEN_INCLUDE=\
|
|||
$(srcdir)/vr5400.igen \
|
||||
$(srcdir)/mdmx.igen \
|
||||
$(end-sanitize-vr5400) \
|
||||
$(start-sanitize-vr4320) \
|
||||
$(srcdir)/vr4320.igen \
|
||||
$(end-sanitize-vr4320) \
|
||||
$(srcdir)/m16.igen
|
||||
|
||||
SIM_IGEN_ALL = tmp-igen
|
||||
|
|
|
@ -66,6 +66,12 @@ code on the hardware.
|
|||
|
||||
#include "sysdep.h"
|
||||
|
||||
/* start-sanitize-sky */
|
||||
#ifdef TARGET_SKY
|
||||
#include "sky-vu.h"
|
||||
#endif
|
||||
/* end-sanitize-sky */
|
||||
|
||||
#ifndef PARAMS
|
||||
#define PARAMS(x)
|
||||
#endif
|
||||
|
@ -666,10 +672,7 @@ sim_store_register (sd,rn,memory,length)
|
|||
rn = rn - NUM_R5900_REGS;
|
||||
|
||||
if (rn < NUM_VU_INTEGER_REGS)
|
||||
{
|
||||
vu_regs[0].i[rn] = T2H_2( *(unsigned short *) memory );
|
||||
size = 2;
|
||||
}
|
||||
size = write_vu_int_reg (&(vu0_state.regs), rn, memory);
|
||||
else if( rn < NUM_VU_REGS )
|
||||
vu_regs[0].f[rn - NUM_VU_INTEGER_REGS]
|
||||
= T2H_4( *(unsigned int *) memory );
|
||||
|
@ -677,10 +680,7 @@ sim_store_register (sd,rn,memory,length)
|
|||
rn = rn - NUM_VU_REGS;
|
||||
|
||||
if( rn < NUM_VU_INTEGER_REGS )
|
||||
{
|
||||
vu_regs[1].i[rn] = T2H_2( *(unsigned short *) memory );
|
||||
size = 2;
|
||||
}
|
||||
size = write_vu_int_reg (&(vu1_state.regs), rn, memory);
|
||||
else if( rn < NUM_VU_REGS )
|
||||
vu_regs[1].f[rn - NUM_VU_INTEGER_REGS]
|
||||
= T2H_4( *(unsigned int *) memory );
|
||||
|
@ -768,10 +768,7 @@ sim_fetch_register (sd,rn,memory,length)
|
|||
rn = rn - NUM_R5900_REGS;
|
||||
|
||||
if (rn < NUM_VU_INTEGER_REGS)
|
||||
{
|
||||
*((unsigned short *) memory) = H2T_2( vu_regs[0].i[rn] );
|
||||
size = 2;
|
||||
}
|
||||
size = read_vu_int_reg (&(vu0_state.regs), rn, memory);
|
||||
else if (rn < NUM_VU_REGS)
|
||||
*((unsigned int *) memory)
|
||||
= H2T_4( vu_regs[0].f[rn - NUM_VU_INTEGER_REGS] );
|
||||
|
@ -780,10 +777,7 @@ sim_fetch_register (sd,rn,memory,length)
|
|||
rn = rn - NUM_VU_REGS;
|
||||
|
||||
if (rn < NUM_VU_INTEGER_REGS)
|
||||
{
|
||||
(*(unsigned short *) memory) = H2T_2( vu_regs[1].i[rn] );
|
||||
size = 2;
|
||||
}
|
||||
size = read_vu_int_reg (&(vu1_state.regs), rn, memory);
|
||||
else if (rn < NUM_VU_REGS)
|
||||
(*(unsigned int *) memory)
|
||||
= H2T_4( vu_regs[1].f[rn - NUM_VU_INTEGER_REGS] );
|
||||
|
|
|
@ -5,8 +5,11 @@
|
|||
#include "sim-main.h"
|
||||
|
||||
#include "sky-device.h"
|
||||
#include "sky-vu.h"
|
||||
#include "sky-vu0.h"
|
||||
|
||||
VectorUnitState vu0_state;
|
||||
|
||||
/* these are aligned versions of zalloc() pointers - do not zfree()! */
|
||||
static char* vu0_mem0_buffer = 0;
|
||||
static char* vu0_mem1_buffer = 0;
|
||||
|
@ -26,8 +29,16 @@ vu0_io_read_buffer(device *me,
|
|||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
{
|
||||
printf("%s: Read!\n", me->name);
|
||||
return nr_bytes;
|
||||
if (addr < VU0_REGISTER_WINDOW_START)
|
||||
return 0;
|
||||
|
||||
addr -= VU0_REGISTER_WINDOW_START;
|
||||
|
||||
/* Adjust nr_bytes if too big */
|
||||
if ((addr + nr_bytes) > VU_REG_END)
|
||||
nr_bytes -= addr + nr_bytes - VU_REG_END;
|
||||
|
||||
return read_vu_registers (&vu0_state, addr, nr_bytes, dest);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -39,8 +50,16 @@ vu0_io_write_buffer(device *me,
|
|||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
{
|
||||
printf("%s: Write!\n", me->name);
|
||||
return nr_bytes;
|
||||
if (addr < VU0_REGISTER_WINDOW_START)
|
||||
return 0;
|
||||
|
||||
addr -= VU0_REGISTER_WINDOW_START;
|
||||
|
||||
/* Adjust nr_bytes if too big */
|
||||
if ((addr + nr_bytes) > VU_REG_END)
|
||||
nr_bytes -= addr + nr_bytes - VU_REG_END;
|
||||
|
||||
return write_vu_registers (&vu0_state, addr, nr_bytes, source);
|
||||
}
|
||||
|
||||
device vu0_device =
|
||||
|
@ -59,7 +78,7 @@ vu0_attach(SIM_DESC sd)
|
|||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU0_REGISTER_WINDOW_START,
|
||||
VU0_REGISTER_WINDOW_SIZE /*nr_bytes*/,
|
||||
VU_REG_END /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
&vu0_device,
|
||||
NULL /*buffer*/);
|
||||
|
|
|
@ -18,21 +18,7 @@ void vu0_issue(void);
|
|||
|
||||
#define VU0_REGISTER_WINDOW_START 0x10000c00
|
||||
|
||||
#define VU0_VF00 0x10000c00
|
||||
/* ... */
|
||||
#define VU0_VF31 0x10000df0
|
||||
|
||||
#define VU0_VI00 0x10000e00
|
||||
/* ... */
|
||||
#define VU0_VI15 0x10000ef0
|
||||
|
||||
/* ... */
|
||||
|
||||
#define VPE0_STAT 0x10000fd0
|
||||
#define VU0_CIA 0x10000fe0
|
||||
|
||||
#define VU0_REGISTER_WINDOW_END 0x10000ff0
|
||||
|
||||
#define VU0_REGISTER_WINDOW_SIZE (VU0_REGISTER_WINDOW_END - VU0_REGISTER_WINDOW_START)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,10 +27,6 @@ void init_vu(VectorUnitState *state,
|
|||
char* mem_buffer, unsigned mem_qw_size);
|
||||
|
||||
#if 0
|
||||
int vu1_busy(void) {
|
||||
if (vu1_state.runState == VU_READY) { return 0; } else { return 1; }
|
||||
}
|
||||
|
||||
static void dump_mem() {
|
||||
int i;
|
||||
typedef int T[2048][4];
|
||||
|
@ -51,108 +47,44 @@ vu1_issue(void)
|
|||
|
||||
static int
|
||||
vu1_io_read_register_window(device *me,
|
||||
void *dest,
|
||||
int space,
|
||||
address_word addr,
|
||||
unsigned nr_bytes,
|
||||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
void *dest,
|
||||
int space,
|
||||
address_word addr,
|
||||
unsigned nr_bytes,
|
||||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
{
|
||||
/* Slow and crappy hack ... */
|
||||
if (addr < VU1_REGISTER_WINDOW_START)
|
||||
return 0;
|
||||
|
||||
addr -= VU1_REGISTER_WINDOW_START;
|
||||
|
||||
int i;
|
||||
/* Adjust nr_bytes if too big */
|
||||
if ((addr + nr_bytes) > VU_REG_END)
|
||||
nr_bytes -= addr + nr_bytes - VU_REG_END;
|
||||
|
||||
char source_buffer[VU1_REGISTER_WINDOW_SIZE];
|
||||
char* src;
|
||||
|
||||
assert(nr_bytes == 1 || nr_bytes == 2 || nr_bytes == 4 || nr_bytes == 8 || nr_bytes == 16);
|
||||
|
||||
memcpy(source_buffer, &vu1_state.regs.VF[0][0], 0x200); /* copy VF registers */
|
||||
for (i = 0; i<16; i++ ) {
|
||||
*(short*)&source_buffer[0x200 + i*16] = vu1_state.regs.VI[i];
|
||||
}
|
||||
*(u_long*)&source_buffer[VU1_MST - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MST;
|
||||
*(u_long*)&source_buffer[VU1_MMC - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MMC;
|
||||
*(u_long*)&source_buffer[VU1_MCP - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MCP;
|
||||
*(u_long*)&source_buffer[VU1_MR - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MR;
|
||||
*(u_long*)&source_buffer[VU1_MI - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MI;
|
||||
*(u_long*)&source_buffer[VU1_MQ - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MQ;
|
||||
*(u_long*)&source_buffer[VU1_MP - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MP;
|
||||
*(u_long*)&source_buffer[VU1_MTPC - VU1_REGISTER_WINDOW_START] = vu1_state.regs.MTPC;
|
||||
|
||||
{
|
||||
u_long stat;
|
||||
stat = 0;
|
||||
if (vu1_state.runState == VU_RUN || vu1_state.runState == VU_BREAK)
|
||||
SET_BIT(stat, VPU_STAT_VBS1_BIT);
|
||||
|
||||
*(u_long*)&source_buffer[VPE1_STAT - VU1_REGISTER_WINDOW_START] = H2T_4(stat);
|
||||
}
|
||||
|
||||
*(u_long*)&source_buffer[VU1_CIA - VU1_REGISTER_WINDOW_START] = H2T_4(vu1_state.junk._vpepc);
|
||||
/* XXX: other H2T_N's needed around here. */
|
||||
|
||||
#if 0
|
||||
printf("%s: Read: %x, %d, dest: %x, space: %d, %x!\n", me->name, (int)addr, nr_bytes, (int)dest, space, *(int*)&(vu1_state.regs.VPE_STAT));
|
||||
printf(" vu1_state.regs.VPE_STAT = %x\n", *(int*)&(vu1_state.regs.VPE_STAT));
|
||||
#endif
|
||||
|
||||
if (addr + nr_bytes > VU1_REGISTER_WINDOW_END) {
|
||||
fprintf(stderr, "Error: Read past end of vu1 register window!!!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
src = &source_buffer[0] + (addr - VU1_REGISTER_WINDOW_START);
|
||||
memcpy(dest, src, nr_bytes);
|
||||
return nr_bytes;
|
||||
return read_vu_registers (&vu1_state, addr, nr_bytes, dest);
|
||||
}
|
||||
|
||||
static int
|
||||
vu1_io_write_register_window(device *me,
|
||||
const void *source,
|
||||
int space,
|
||||
address_word addr,
|
||||
unsigned nr_bytes,
|
||||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
const void *source,
|
||||
int space,
|
||||
address_word addr,
|
||||
unsigned nr_bytes,
|
||||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
{
|
||||
char *dest;
|
||||
if (addr < VU1_REGISTER_WINDOW_START)
|
||||
return 0;
|
||||
|
||||
assert(nr_bytes == 4);
|
||||
addr -= VU1_REGISTER_WINDOW_START;
|
||||
|
||||
if (addr == VPE1_STAT) {
|
||||
/* Do nothing, read only register. */
|
||||
sim_warning("vu1: Write to read/only register at address %lx.\n", (u_long)addr);
|
||||
return nr_bytes;
|
||||
} else if (addr == VU1_MST) {
|
||||
/* Magic switch to set _TOP register */
|
||||
vu1_state.junk._TOP = T2H_4(*(int*)source);
|
||||
return nr_bytes;
|
||||
} else if (addr == VU1_CIA) {
|
||||
vu1_state.junk.pc = vu1_state.junk._vpepc = T2H_4(*(int*)source);
|
||||
vu1_state.runState = VU_RUN;
|
||||
vu1_state.junk.eflag = 0;
|
||||
vu1_state.junk.peflag = 0;
|
||||
return nr_bytes;
|
||||
}
|
||||
/* Adjust nr_bytes if too big */
|
||||
if ((addr + nr_bytes) > VU_REG_END)
|
||||
nr_bytes -= addr + nr_bytes - VU_REG_END;
|
||||
|
||||
/* Everything else does nothing... */
|
||||
sim_warning("vu1: Write to unimplemented control register at address %lx.\n", (u_long)addr);
|
||||
return nr_bytes;
|
||||
|
||||
/*printf("%s: Write: %x, %d, source: %x, space: %d!\n", me->name, (int)addr, nr_bytes, (int)source, space);*/
|
||||
|
||||
if (addr + nr_bytes > VU1_REGISTER_WINDOW_END) {
|
||||
fprintf(stderr, "Error: Read past end of vu1 register window!!!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
dest = ((char*) (&vu1_state.regs)) + (addr - VU1_REGISTER_WINDOW_START);
|
||||
|
||||
memcpy(dest, source, nr_bytes);
|
||||
|
||||
return nr_bytes;
|
||||
return write_vu_registers (&vu1_state, addr, nr_bytes, source);
|
||||
}
|
||||
|
||||
device vu1_device =
|
||||
|
@ -172,7 +104,7 @@ vu1_init(SIM_DESC sd)
|
|||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU1_REGISTER_WINDOW_START,
|
||||
VU1_REGISTER_WINDOW_SIZE /*nr_bytes*/,
|
||||
VU_REG_END /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
&vu1_device,
|
||||
NULL /*buffer*/);
|
||||
|
|
|
@ -20,30 +20,8 @@ int vu1_busy(void);
|
|||
|
||||
#define VU1_REGISTER_WINDOW_START 0x11007000
|
||||
|
||||
#define VU1_VF00 0x11007000
|
||||
/* ... */
|
||||
#define VU1_VF31 0x110071f0
|
||||
|
||||
#define VU1_VI00 0x11007200
|
||||
/* ... */
|
||||
#define VU1_VI15 0x110072f0
|
||||
|
||||
#define VU1_MST 0x11007300
|
||||
#define VU1_MMC 0x11007310
|
||||
#define VU1_MCP 0x11007320
|
||||
#define VU1_MR 0x11007330
|
||||
#define VU1_MI 0x11007340
|
||||
#define VU1_MQ 0x11007350
|
||||
#define VU1_MP 0x11007360
|
||||
#define VU1_MTPC 0x110073a0
|
||||
#define VPE1_STAT 0x110073d0
|
||||
|
||||
/* FIX ME: These should be derived from enum in sky-vu.h */
|
||||
#define VPU_STAT 0x110073d0
|
||||
|
||||
#define VU1_CIA 0x110073e0
|
||||
|
||||
#define VU1_REGISTER_WINDOW_END 0x110073f0
|
||||
|
||||
#define VU1_REGISTER_WINDOW_SIZE (VU1_REGISTER_WINDOW_END - VU1_REGISTER_WINDOW_START)
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue