aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Carmichael <iancarm@cygnus>1998-02-16 21:44:45 +0000
committerIan Carmichael <iancarm@cygnus>1998-02-16 21:44:45 +0000
commit9c577d9a94f0750a5bdd51dffd1d4f4764eaff93 (patch)
tree82192cdcd1507a46c098076a174e8bd95989077a
parentb86c0dd361625225dabd8668c163a2b0b1cba881 (diff)
downloadbinutils-9c577d9a94f0750a5bdd51dffd1d4f4764eaff93.zip
binutils-9c577d9a94f0750a5bdd51dffd1d4f4764eaff93.tar.gz
binutils-9c577d9a94f0750a5bdd51dffd1d4f4764eaff93.tar.bz2
* Partially implement new VPE_STAT register.
-rw-r--r--sim/mips/.Sanitize2
-rw-r--r--sim/mips/sky-vu1.c33
-rw-r--r--sim/mips/sky-vu1.h2
3 files changed, 25 insertions, 12 deletions
diff --git a/sim/mips/.Sanitize b/sim/mips/.Sanitize
index 29ff045..30edef2 100644
--- a/sim/mips/.Sanitize
+++ b/sim/mips/.Sanitize
@@ -24,7 +24,7 @@ else
lose_these_too="${r5900_files} ${lose_these_too}"
fi
-sky_files="ChangeLog.sky sky-device.c sky-device.h sky-dma.c sky-dma.h"
+sky_files="ChangeLog.sky sky-device.c sky-device.h sky-dma.c sky-dma.h sky-bits.h"
sky_files="$sky_files sky-engine.c sky-gpuif.c sky-gpuif.h"
sky_files="$sky_files sky-hardware.c sky-hardware.h"
sky_files="$sky_files sky-libvpe.c sky-libvpe.h sky-pke.c sky-pke.h"
diff --git a/sim/mips/sky-vu1.c b/sim/mips/sky-vu1.c
index 6fbb81e..4815286 100644
--- a/sim/mips/sky-vu1.c
+++ b/sim/mips/sky-vu1.c
@@ -9,6 +9,9 @@
#include "sky-vu1.h"
#include "sky-libvpe.h"
#include "sky-vu.h"
+#include "sky-bits.h"
+
+#include <assert.h>
VectorUnitState vu1_state;
@@ -36,24 +39,35 @@ vu1_io_read_register_window(device *me,
{
/* Slow and crappy hack ... */
+
int i;
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;
- *(VpeStat*)&source_buffer[VPE1_STAT - VU1_REGISTER_WINDOW_START] = vu1_state.regs.VPE_STAT;
+ *(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] = stat;
+ }
#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));
@@ -84,7 +98,6 @@ vu1_io_write_register_window(device *me,
if (addr == VPE1_STAT && nr_bytes == 4) {
/* Magic to switch VU to run state, until other methods are available. */
vu1_state.runState = VU_RUN;
- vu1_state.regs.VPE_STAT.vbs = 1;
vu1_state.junk.eflag = 0;
vu1_state.junk.peflag = 0;
/*printf("Magic start run...\n");*/
diff --git a/sim/mips/sky-vu1.h b/sim/mips/sky-vu1.h
index 88fe3e9..225b8cb 100644
--- a/sim/mips/sky-vu1.h
+++ b/sim/mips/sky-vu1.h
@@ -7,9 +7,9 @@
#include "sim-main.h"
-void vu1_attach(SIM_DESC sd);
void vu1_issue(void);
void vu1_init(SIM_DESC sd);
+int vu1_status(void);
#define VU1_MEM0_WINDOW_START 0x11008000
#define VU1_MEM0_SIZE 0x4000 /* 16K = 16384 */