* Inserted skeleton of R5900 COP2 simulation. Merged old vu[01].[ch] code
into single PKE-style vu.[ch]. [ChangeLog] Fri Mar 27 16:19:29 1998 Frank Ch. Eigler <fche@cygnus.com> start-sanitize-sky * Makefile.in (SIM_SKY_OBJS): Replaced sky-vu[01].o with sky-vu.o. * interp.c (sim_{load,store}_register): Use new vu[01]_device static to access VU registers. (decode_coproc): Added skeleton of sky COP2 (VU) instruction decoding. Work in progress. * mips.igen (LDCzz, SDCzz): Removed *5900 case for this overlapping/redundant bit pattern. (LQC2, SQC2): Added *5900 COP2 instruction skeleta. Work in progress. * sim-main.h (status_CU[012]): Added COP[n]-enabled flags for status register. end-sanitize-sky * interp.c (cop_lq, cop_sq): New functions for future 128-bit access to coprocessor registers. * sim-main.h (COP_LQ, COP_SQ): New macro front-ends for above. [ChangeLog.sky] * sky-engine.c (engine_run): Adapted from vu[01] -> vu merge. * sky-hardware.c (register_devices): Ditto * sky-pke.c (pke_fifo_*): Made these functions private again, now that the GPUIF code does not use them. * sky-pke.h (pke_fifo_*): Removed newly private declarations. * sky-vu.c (*): Major rework: merge of old sky-vu0.c and sky-vu1.c. Management of two VU devices parallels two PKEs. Work in progress. * sky-vu.h (*): Other half of merge. (vu_device): New struct, parallel to pke_device.
This commit is contained in:
parent
c8e8b829fe
commit
15232df4a3
@ -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-vu.c 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"
|
||||
if ( echo $* | grep keep\-sky > /dev/null ) ; then
|
||||
keep_these_too="${sky_files} ${keep_these_too}"
|
||||
else
|
||||
|
@ -1,3 +1,28 @@
|
||||
Fri Mar 27 16:19:29 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
start-sanitize-sky
|
||||
* Makefile.in (SIM_SKY_OBJS): Replaced sky-vu[01].o with sky-vu.o.
|
||||
|
||||
* interp.c (sim_{load,store}_register): Use new vu[01]_device
|
||||
static to access VU registers.
|
||||
(decode_coproc): Added skeleton of sky COP2 (VU) instruction
|
||||
decoding. Work in progress.
|
||||
|
||||
* mips.igen (LDCzz, SDCzz): Removed *5900 case for this
|
||||
overlapping/redundant bit pattern.
|
||||
(LQC2, SQC2): Added *5900 COP2 instruction skeleta. Work in
|
||||
progress.
|
||||
|
||||
* sim-main.h (status_CU[012]): Added COP[n]-enabled flags for
|
||||
status register.
|
||||
|
||||
end-sanitize-sky
|
||||
|
||||
* interp.c (cop_lq, cop_sq): New functions for future 128-bit
|
||||
access to coprocessor registers.
|
||||
|
||||
* sim-main.h (COP_LQ, COP_SQ): New macro front-ends for above.
|
||||
|
||||
Fri Mar 27 16:15:52 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||
|
@ -18,8 +18,6 @@ SIM_SKY_OBJS = \
|
||||
sky-libvpe.o \
|
||||
sky-pke.o \
|
||||
sky-vu.o \
|
||||
sky-vu0.o \
|
||||
sky-vu1.o \
|
||||
sky-gs.o \
|
||||
sky-gdb.o
|
||||
# end-sanitize-sky
|
||||
|
@ -14,8 +14,7 @@
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
$Revision$
|
||||
$Author$
|
||||
$Date$
|
||||
$Date$
|
||||
|
||||
NOTEs:
|
||||
|
||||
@ -39,6 +38,14 @@ code on the hardware.
|
||||
#include "sim-options.h"
|
||||
#include "sim-assert.h"
|
||||
|
||||
/* start-sanitize-sky */
|
||||
#ifdef TARGET_SKY
|
||||
#include "sky-vu.h"
|
||||
#include "sky-vpe.h"
|
||||
#include "sky-libvpe.h"
|
||||
#endif
|
||||
/* end-sanitize-sky */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -154,6 +161,7 @@ static void ColdReset PARAMS((SIM_DESC sd));
|
||||
#define MONITOR_BASE (0xBFC00000)
|
||||
#define MONITOR_SIZE (1 << 11)
|
||||
#define MEM_SIZE (2 << 20)
|
||||
|
||||
/* start-sanitize-sky */
|
||||
#ifdef TARGET_SKY
|
||||
#undef MEM_SIZE
|
||||
@ -672,7 +680,7 @@ sim_store_register (sd,rn,memory,length)
|
||||
rn = rn - NUM_R5900_REGS;
|
||||
|
||||
if (rn < NUM_VU_INTEGER_REGS)
|
||||
size = write_vu_int_reg (&(vu0_state.regs), rn, memory);
|
||||
size = write_vu_int_reg (& vu0_device.state->regs, rn, memory);
|
||||
else if( rn < NUM_VU_REGS )
|
||||
vu_regs[0].f[rn - NUM_VU_INTEGER_REGS]
|
||||
= T2H_4( *(unsigned int *) memory );
|
||||
@ -680,7 +688,7 @@ sim_store_register (sd,rn,memory,length)
|
||||
rn = rn - NUM_VU_REGS;
|
||||
|
||||
if( rn < NUM_VU_INTEGER_REGS )
|
||||
size = write_vu_int_reg (&(vu1_state.regs), rn, memory);
|
||||
size = write_vu_int_reg (& vu1_device.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,7 +776,7 @@ sim_fetch_register (sd,rn,memory,length)
|
||||
rn = rn - NUM_R5900_REGS;
|
||||
|
||||
if (rn < NUM_VU_INTEGER_REGS)
|
||||
size = read_vu_int_reg (&(vu0_state.regs), rn, memory);
|
||||
size = read_vu_int_reg (& vu0_device.state->regs, rn, memory);
|
||||
else if (rn < NUM_VU_REGS)
|
||||
*((unsigned int *) memory)
|
||||
= H2T_4( vu_regs[0].f[rn - NUM_VU_INTEGER_REGS] );
|
||||
@ -777,7 +785,7 @@ sim_fetch_register (sd,rn,memory,length)
|
||||
rn = rn - NUM_VU_REGS;
|
||||
|
||||
if (rn < NUM_VU_INTEGER_REGS)
|
||||
size = read_vu_int_reg (&(vu1_state.regs), rn, memory);
|
||||
size = read_vu_int_reg (& vu1_device.state->regs, rn, memory);
|
||||
else if (rn < NUM_VU_REGS)
|
||||
(*(unsigned int *) memory)
|
||||
= H2T_4( vu_regs[1].f[rn - NUM_VU_INTEGER_REGS] );
|
||||
@ -3239,6 +3247,33 @@ cop_ld (SIM_DESC sd,
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cop_lq (SIM_DESC sd,
|
||||
sim_cpu *cpu,
|
||||
address_word cia,
|
||||
int coproc_num,
|
||||
int coproc_reg,
|
||||
unsigned128 memword)
|
||||
{
|
||||
switch (coproc_num)
|
||||
{
|
||||
/* start-sanitize-sky */
|
||||
case 2:
|
||||
/* XXX COP2 */
|
||||
break;
|
||||
/* end-sanitize-sky */
|
||||
|
||||
default:
|
||||
sim_io_printf(sd,"COP_LQ(%d,%d,??) at PC = 0x%s : TODO (architecture specific)\n",
|
||||
coproc_num,coproc_reg,pr_addr(cia));
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
cop_sw (SIM_DESC sd,
|
||||
sim_cpu *cpu,
|
||||
@ -3298,6 +3333,33 @@ cop_sd (SIM_DESC sd,
|
||||
return(value);
|
||||
}
|
||||
|
||||
|
||||
unsigned128
|
||||
cop_sq (SIM_DESC sd,
|
||||
sim_cpu *cpu,
|
||||
address_word cia,
|
||||
int coproc_num,
|
||||
int coproc_reg)
|
||||
{
|
||||
unsigned128 value = {0, 0};
|
||||
switch (coproc_num)
|
||||
{
|
||||
/* start-sanitize-sky */
|
||||
case 2:
|
||||
/* XXX COP2 */
|
||||
break;
|
||||
/* end-sanitize-sky */
|
||||
|
||||
default:
|
||||
sim_io_printf(sd,"COP_SQ(%d,%d) at PC = 0x%s : TODO (architecture specific)\n",
|
||||
coproc_num,coproc_reg,pr_addr(cia));
|
||||
break;
|
||||
}
|
||||
|
||||
return(value);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
decode_coproc (SIM_DESC sd,
|
||||
sim_cpu *cpu,
|
||||
@ -3439,9 +3501,140 @@ decode_coproc (SIM_DESC sd,
|
||||
break;
|
||||
|
||||
case 2: /* undefined co-processor */
|
||||
sim_io_eprintf(sd,"COP2 instruction 0x%08X at PC = 0x%s : No handler present\n",instruction,pr_addr(cia));
|
||||
break;
|
||||
|
||||
{
|
||||
int handle = 0;
|
||||
|
||||
/* start-sanitize-sky */
|
||||
/* On the R5900, this refers to a "VU" vector co-processor. */
|
||||
|
||||
int i_25_21 = (instruction >> 21) & 0x1f;
|
||||
int i_20_16 = (instruction >> 16) & 0x1f;
|
||||
int i_15_11 = (instruction >> 11) & 0x1f;
|
||||
int i_15_0 = instruction & 0xffff;
|
||||
int i_10_1 = (instruction >> 1) & 0x3ff;
|
||||
int interlock = instruction & 0x01;
|
||||
unsigned_4 vpe_status = sim_core_read_aligned_4 (cpu, cia, read_map, VPE0_STAT);
|
||||
int vpe_busy = (vpe_status & 0x00000001);
|
||||
/* setup for semantic.c-like actions below */
|
||||
typedef unsigned_4 instruction_word;
|
||||
int CIA = cia;
|
||||
int NIA = cia + 4;
|
||||
sim_cpu* CPU_ = cpu;
|
||||
|
||||
handle = 1;
|
||||
|
||||
/* test COP2 usability */
|
||||
if(! (SR & status_CU2))
|
||||
{
|
||||
SignalException(CoProcessorUnusable,instruction);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* classify & execute basic COP2 instructions */
|
||||
if(i_25_21 == 0x08 && i_20_16 == 0x00) /* BC2F */
|
||||
{
|
||||
address_word offset = EXTEND16(i_15_0) << 2;
|
||||
if(! vpe_busy) DELAY_SLOT(cia + 4 + offset);
|
||||
}
|
||||
else if(i_25_21 == 0x08 && i_20_16==0x02) /* BC2FL */
|
||||
{
|
||||
address_word offset = EXTEND16(i_15_0) << 2;
|
||||
if(! vpe_busy) DELAY_SLOT(cia + 4 + offset);
|
||||
else NULLIFY_NEXT_INSTRUCTION();
|
||||
}
|
||||
else if(i_25_21 == 0x08 && i_20_16 == 0x01) /* BC2T */
|
||||
{
|
||||
address_word offset = EXTEND16(i_15_0) << 2;
|
||||
if(vpe_busy) DELAY_SLOT(cia + 4 + offset);
|
||||
}
|
||||
else if(i_25_21 == 0x08 && i_20_16 == 0x03) /* BC2TL */
|
||||
{
|
||||
address_word offset = EXTEND16(i_15_0) << 2;
|
||||
if(vpe_busy) DELAY_SLOT(cia + 4 + offset);
|
||||
else NULLIFY_NEXT_INSTRUCTION();
|
||||
}
|
||||
else if((i_25_21 == 0x02 && i_10_1 == 0x000) || /* CFC2 */
|
||||
(i_25_21 == 0x06 && i_10_1 == 0x000)) /* CTC2 */
|
||||
{
|
||||
int rt = i_20_16;
|
||||
int id = i_15_11;
|
||||
int to_vu = (i_25_21 == 0x06); /* transfer direction */
|
||||
address_word vu_cr_addr; /* VU control register address */
|
||||
|
||||
if(interlock)
|
||||
while(vpe_busy)
|
||||
{
|
||||
vu0_issue(sd); /* advance one clock cycle */
|
||||
vpe_status = sim_core_read_aligned_4 (cpu, cia, read_map, VPE0_STAT);
|
||||
vpe_busy = vpe_status & 0x00000001;
|
||||
}
|
||||
|
||||
/* compute VU register address */
|
||||
vu_cr_addr = VU0_MST + (id * 16);
|
||||
|
||||
/* read or write word */
|
||||
if(to_vu) /* CTC2 */
|
||||
{
|
||||
unsigned_4 data = GPR[rt];
|
||||
sim_core_write_aligned_4(cpu, cia, write_map, vu_cr_addr, data);
|
||||
}
|
||||
else /* CFC2 */
|
||||
{
|
||||
unsigned_4 data = sim_core_read_aligned_4(cpu, cia, read_map, vu_cr_addr);
|
||||
GPR[rt] = EXTEND64(data);
|
||||
}
|
||||
}
|
||||
else if((i_25_21 == 0x01) || /* QMFC2 */
|
||||
(i_25_21 == 0x05)) /* QMTC2 */
|
||||
{
|
||||
int rt = i_20_16;
|
||||
int id = i_15_11;
|
||||
int to_vu = (i_25_21 == 0x05); /* transfer direction */
|
||||
address_word vu_cr_addr; /* VU control register address */
|
||||
|
||||
if(interlock)
|
||||
while(vpe_busy)
|
||||
{
|
||||
vu0_issue(sd); /* advance one clock cycle */
|
||||
vpe_status = sim_core_read_aligned_4 (cpu, cia, read_map, VPE0_STAT);
|
||||
vpe_busy = vpe_status & 0x00000001;
|
||||
}
|
||||
|
||||
/* compute VU register address */
|
||||
vu_cr_addr = VU0_VF00 + (id * 16);
|
||||
|
||||
/* read or write word */
|
||||
if(to_vu) /* CTC2 */
|
||||
{
|
||||
unsigned_4 data = GPR[rt];
|
||||
sim_core_write_aligned_4(cpu, cia, write_map, vu_cr_addr, data);
|
||||
}
|
||||
else /* CFC2 */
|
||||
{
|
||||
unsigned_4 data = sim_core_read_aligned_4(cpu, cia, read_map, vu_cr_addr);
|
||||
GPR[rt] = EXTEND64(data);
|
||||
}
|
||||
}
|
||||
/* other COP2 instructions */
|
||||
else
|
||||
{
|
||||
SignalException(ReservedInstruction,instruction);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* cleanup for semantic.c-like actions above */
|
||||
PC = NIA;
|
||||
|
||||
/* end-sanitize-sky */
|
||||
|
||||
if(! handle)
|
||||
{
|
||||
sim_io_eprintf(sd,"COP2 instruction 0x%08X at PC = 0x%s : No handler present\n",
|
||||
instruction,pr_addr(cia));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: /* should not occur (FPU co-processor) */
|
||||
case 3: /* should not occur (FPU co-processor) */
|
||||
SignalException(ReservedInstruction,instruction);
|
||||
@ -3451,6 +3644,7 @@ decode_coproc (SIM_DESC sd,
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*-- instruction simulation -------------------------------------------------*/
|
||||
|
||||
/* When the IGEN simulator is being built, the function below is be
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -513,7 +513,8 @@ struct _sim_cpu {
|
||||
#ifndef TM_TXVU_H
|
||||
|
||||
/* Number of machine registers */
|
||||
#define NUM_VU_REGS 152
|
||||
#define NUM_VU_REGS 153
|
||||
#define NUM_VU_INTEGER_REGS 17
|
||||
|
||||
#define NUM_R5900_REGS 128
|
||||
|
||||
@ -681,6 +682,11 @@ struct sim_state {
|
||||
#define status_TS (1 << 21) /* TLB shutdown has occurred */
|
||||
#define status_ERL (1 << 2) /* Error level */
|
||||
#define status_RP (1 << 27) /* Reduced Power mode */
|
||||
/* begin-sanitize-r5900 */
|
||||
#define status_CU0 (1 << 28) /* COP0 usable */
|
||||
#define status_CU1 (1 << 29) /* COP1 usable */
|
||||
#define status_CU2 (1 << 30) /* COP2 usable */
|
||||
/* begin-sanitize-r5900 */
|
||||
|
||||
#define cause_BD ((unsigned)1 << 31) /* Exception in branch delay slot */
|
||||
|
||||
@ -757,17 +763,23 @@ void signal_exception (SIM_DESC sd, sim_cpu *cpu, address_word cia, int exceptio
|
||||
|
||||
void cop_lw PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, int coproc_num, int coproc_reg, unsigned int memword));
|
||||
void cop_ld PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, int coproc_num, int coproc_reg, uword64 memword));
|
||||
void cop_lq PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, int coproc_num, int coproc_reg, unsigned128 memword));
|
||||
unsigned int cop_sw PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, int coproc_num, int coproc_reg));
|
||||
uword64 cop_sd PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, int coproc_num, int coproc_reg));
|
||||
unsigned128 cop_sq PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, int coproc_num, int coproc_reg));
|
||||
|
||||
#define COP_LW(coproc_num,coproc_reg,memword) \
|
||||
cop_lw (SD, CPU, cia, coproc_num, coproc_reg, memword)
|
||||
#define COP_LD(coproc_num,coproc_reg,memword) \
|
||||
cop_ld (SD, CPU, cia, coproc_num, coproc_reg, memword)
|
||||
#define COP_LQ(coproc_num,coproc_reg,memword) \
|
||||
cop_lq (SD, CPU, cia, coproc_num, coproc_reg, memword)
|
||||
#define COP_SW(coproc_num,coproc_reg) \
|
||||
cop_sw (SD, CPU, cia, coproc_num, coproc_reg)
|
||||
#define COP_SD(coproc_num,coproc_reg) \
|
||||
cop_sd (SD, CPU, cia, coproc_num, coproc_reg)
|
||||
#define COP_SQ(coproc_num,coproc_reg) \
|
||||
cop_sq (SD, CPU, cia, coproc_num, coproc_reg)
|
||||
|
||||
void decode_coproc PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia, unsigned int instruction));
|
||||
#define DecodeCoproc(instruction) \
|
||||
|
@ -4,15 +4,16 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "sky-pke.h"
|
||||
#include "sky-dma.h"
|
||||
#include "sim-main.h"
|
||||
#include "sim-bits.h"
|
||||
#include "sim-assert.h"
|
||||
#include "sky-vu0.h"
|
||||
#include "sky-vu1.h"
|
||||
#include "sky-pke.h"
|
||||
#include "sky-dma.h"
|
||||
#include "sky-vu.h"
|
||||
#include "sky-gpuif.h"
|
||||
#include "sky-device.h"
|
||||
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
@ -64,6 +65,11 @@ static void pke_code_direct(struct pke_device* me, unsigned_4 pkecode);
|
||||
static void pke_code_directhl(struct pke_device* me, unsigned_4 pkecode);
|
||||
static void pke_code_unpack(struct pke_device* me, unsigned_4 pkecode);
|
||||
static void pke_code_error(struct pke_device* me, unsigned_4 pkecode);
|
||||
unsigned_4 pke_fifo_flush(struct pke_fifo*);
|
||||
void pke_fifo_reset(struct pke_fifo*);
|
||||
struct fifo_quadword* pke_fifo_fit(struct pke_fifo*);
|
||||
struct fifo_quadword* pke_fifo_access(struct pke_fifo*, unsigned_4 qwnum);
|
||||
void pke_fifo_old(struct pke_fifo*, unsigned_4 qwnum);
|
||||
|
||||
|
||||
|
||||
|
@ -15,16 +15,11 @@ void pke0_issue(SIM_DESC sd);
|
||||
void pke1_attach(SIM_DESC sd);
|
||||
void pke1_issue(SIM_DESC sd);
|
||||
|
||||
|
||||
/* structs declared below */
|
||||
struct pke_fifo;
|
||||
struct fifo_quadword;
|
||||
|
||||
unsigned_4 pke_fifo_flush(struct pke_fifo*);
|
||||
void pke_fifo_reset(struct pke_fifo*);
|
||||
struct fifo_quadword* pke_fifo_fit(struct pke_fifo*);
|
||||
struct fifo_quadword* pke_fifo_access(struct pke_fifo*, unsigned_4 qwnum);
|
||||
void pke_fifo_old(struct pke_fifo*, unsigned_4 qwnum);
|
||||
|
||||
|
||||
/* Quadword data type */
|
||||
|
||||
|
@ -1,111 +0,0 @@
|
||||
/* Copyright (C) 1998, Cygnus Solutions
|
||||
|
||||
*/
|
||||
|
||||
#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;
|
||||
|
||||
|
||||
void
|
||||
vu0_issue(void)
|
||||
{
|
||||
}
|
||||
|
||||
static int
|
||||
vu0_io_read_buffer(device *me,
|
||||
void *dest,
|
||||
int space,
|
||||
address_word addr,
|
||||
unsigned nr_bytes,
|
||||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
{
|
||||
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
|
||||
vu0_io_write_buffer(device *me,
|
||||
const void *source,
|
||||
int space,
|
||||
address_word addr,
|
||||
unsigned nr_bytes,
|
||||
sim_cpu *processor,
|
||||
sim_cia cia)
|
||||
{
|
||||
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 =
|
||||
{
|
||||
"vu0",
|
||||
&vu0_io_read_buffer,
|
||||
&vu0_io_write_buffer
|
||||
};
|
||||
|
||||
void
|
||||
vu0_attach(SIM_DESC sd)
|
||||
{
|
||||
sim_core_attach (sd,
|
||||
NULL,
|
||||
0 /*level*/,
|
||||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU0_REGISTER_WINDOW_START,
|
||||
VU_REG_END /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
&vu0_device,
|
||||
NULL /*buffer*/);
|
||||
|
||||
vu0_mem0_buffer = zalloc(VU0_MEM0_SIZE);
|
||||
vu0_mem0_buffer = (void*) ALIGN_16((unsigned)vu0_mem0_buffer);
|
||||
sim_core_attach (sd,
|
||||
NULL,
|
||||
0 /*level*/,
|
||||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU0_MEM0_WINDOW_START,
|
||||
VU0_MEM0_SIZE /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
0 /*device*/,
|
||||
vu0_mem0_buffer /*buffer*/);
|
||||
|
||||
vu0_mem1_buffer = zalloc(VU0_MEM1_SIZE);
|
||||
vu0_mem1_buffer = (void*) ALIGN_16((unsigned)vu0_mem1_buffer);
|
||||
sim_core_attach (sd,
|
||||
NULL,
|
||||
0 /*level*/,
|
||||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU0_MEM1_WINDOW_START,
|
||||
VU0_MEM1_SIZE /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
0 /*device*/,
|
||||
vu0_mem1_buffer /*buffer*/);
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
/* Copyright (C) 1998, Cygnus Solutions
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VU0_H_
|
||||
#define VU0_H_
|
||||
|
||||
#include "sim-main.h"
|
||||
|
||||
void vu0_attach(SIM_DESC sd);
|
||||
void vu0_issue(void);
|
||||
|
||||
#define VU0_MEM0_WINDOW_START 0x11000000
|
||||
#define VU0_MEM0_SIZE 0x1000 /* 4K = 4096 */
|
||||
|
||||
#define VU0_MEM1_WINDOW_START 0x11004000
|
||||
#define VU0_MEM1_SIZE 0x1000 /* 4K = 4096 */
|
||||
|
||||
#define VU0_REGISTER_WINDOW_START 0x10000c00
|
||||
|
||||
#define VPE0_STAT 0x10000fd0
|
||||
#define VU0_CIA 0x10000fe0
|
||||
|
||||
#endif
|
@ -1,310 +0,0 @@
|
||||
/* Copyright (C) 1998, Cygnus Solutions
|
||||
|
||||
*/
|
||||
|
||||
#include "sim-main.h"
|
||||
#include "sim-endian.h"
|
||||
|
||||
#include "sky-device.h"
|
||||
#include "sky-vu1.h"
|
||||
#include "sky-libvpe.h"
|
||||
#include "sky-vu.h"
|
||||
#include "sky-bits.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
VectorUnitState vu1_state;
|
||||
|
||||
#define sim_warning printf
|
||||
|
||||
/* these are aligned versions of zalloc() pointers - do not zfree()! */
|
||||
static char* vu1_umem_buffer = 0;
|
||||
static char* vu1_mem_buffer = 0;
|
||||
|
||||
void init_vu1(void);
|
||||
void init_vu(VectorUnitState *state,
|
||||
char* umem_buffer, unsigned umem_dw_size,
|
||||
char* mem_buffer, unsigned mem_qw_size);
|
||||
|
||||
#if 0
|
||||
static void dump_mem() {
|
||||
int i;
|
||||
typedef int T[2048][4];
|
||||
T *mem = (T*)&vu1_mem_buffer;
|
||||
|
||||
for (i = 0; i < 200; i++) {
|
||||
printf("%d: %x %x %x %x\n", i, (*mem)[i][0], (*mem)[i][1], (*mem)[i][2], (*mem)[i][3]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
vu1_issue(void)
|
||||
{
|
||||
if (vu1_state.runState == VU_RUN)
|
||||
vpecallms_cycle(&vu1_state);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (addr < VU1_REGISTER_WINDOW_START)
|
||||
return 0;
|
||||
|
||||
addr -= VU1_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 (&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)
|
||||
{
|
||||
if (addr < VU1_REGISTER_WINDOW_START)
|
||||
return 0;
|
||||
|
||||
addr -= VU1_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 (&vu1_state, addr, nr_bytes, source);
|
||||
}
|
||||
|
||||
device vu1_device =
|
||||
{
|
||||
"vu1",
|
||||
&vu1_io_read_register_window,
|
||||
&vu1_io_write_register_window
|
||||
};
|
||||
|
||||
void
|
||||
vu1_init(SIM_DESC sd)
|
||||
{
|
||||
|
||||
sim_core_attach (sd,
|
||||
NULL,
|
||||
0 /*level*/,
|
||||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU1_REGISTER_WINDOW_START,
|
||||
VU_REG_END /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
&vu1_device,
|
||||
NULL /*buffer*/);
|
||||
|
||||
vu1_umem_buffer = zalloc(VU1_MEM0_SIZE);
|
||||
vu1_umem_buffer = (void*) ALIGN_16((unsigned)vu1_umem_buffer);
|
||||
sim_core_attach (sd,
|
||||
NULL,
|
||||
0 /*level*/,
|
||||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU1_MEM0_WINDOW_START,
|
||||
VU1_MEM0_SIZE /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
0 /*device*/,
|
||||
vu1_umem_buffer /*buffer*/);
|
||||
|
||||
vu1_mem_buffer = zalloc(VU1_MEM1_SIZE + 2*sizeof(unsigned_16));
|
||||
vu1_mem_buffer = (void*) ALIGN_16((unsigned)vu1_mem_buffer);
|
||||
sim_core_attach (sd,
|
||||
NULL,
|
||||
0 /*level*/,
|
||||
access_read_write,
|
||||
0 /*space ???*/,
|
||||
VU1_MEM1_WINDOW_START,
|
||||
VU1_MEM1_SIZE /*nr_bytes*/,
|
||||
0 /*modulo*/,
|
||||
0 /*device*/,
|
||||
vu1_mem_buffer /*buffer*/);
|
||||
|
||||
init_vu1();
|
||||
/*initvpe();*/
|
||||
vpecallms_init(&vu1_state);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* */
|
||||
/* Sony Computer Entertainment CONFIDENTIAL */
|
||||
/* (C) 1997 Sony Computer Entertainment Inc. All Rights Reserved */
|
||||
/* */
|
||||
/* VPE1 simulator */
|
||||
/* */
|
||||
/****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <strings.h>
|
||||
#include "sky-libvpe.h"
|
||||
|
||||
char ifilename[64] = "vu.bin";
|
||||
char ofilename[64] = "";
|
||||
char pfilename[64] = "";
|
||||
|
||||
static void abend2(char *fmt, char* p) {
|
||||
fprintf(stderr, fmt, p);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void getoption(VectorUnitState* state);
|
||||
|
||||
void init_vu1(void) {
|
||||
init_vu(&vu1_state,
|
||||
&vu1_umem_buffer[0], VU1_MEM0_SIZE/8,
|
||||
&vu1_mem_buffer[0], VU1_MEM1_SIZE/16);
|
||||
}
|
||||
|
||||
void init_vu(VectorUnitState *state,
|
||||
char* umem_buffer, unsigned umem_dw_size,
|
||||
char* mem_buffer, unsigned mem_qw_size)
|
||||
{
|
||||
FILE *fp;
|
||||
int i, j;
|
||||
u_long data[4];
|
||||
|
||||
/* set up memory buffers */
|
||||
state->uMEM_buffer = (uMEM_Entry_Type *) umem_buffer;
|
||||
state->uMEM_size = umem_dw_size;
|
||||
state->MEM_buffer = (MEM_Entry_Type*) mem_buffer;
|
||||
state->MEM_size = mem_qw_size;
|
||||
|
||||
/* set up run state */
|
||||
state->runState = VU_READY;
|
||||
|
||||
/* read option */
|
||||
getoption(state);
|
||||
|
||||
/* read instruction file (mandatory) */
|
||||
if (*ifilename) {
|
||||
if((fp = fopen(ifilename, "r")) != NULL) {
|
||||
for (i = 0; fread(&data[0], 4, 1, fp) != 0; i++) {
|
||||
fread(&data[1], 4, 1, fp);
|
||||
LoadMMem(state, i, data, 1);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
/* PKE dirven simvpe */
|
||||
if (*pfilename) {
|
||||
/* initpke(pfilename); */
|
||||
initvpe(&vu1_state);
|
||||
/* while (simpke() != -1)
|
||||
simvpe(); */
|
||||
}
|
||||
|
||||
/* conventional simvpe */
|
||||
else {
|
||||
initvpe(&vu1_state);
|
||||
/*simvpe();*/
|
||||
}
|
||||
|
||||
/* write result memory image (optional) */
|
||||
if (*ofilename) {
|
||||
if((fp = fopen(ofilename, "w")) == NULL)
|
||||
abend2("%s: can not open\n", ofilename);
|
||||
|
||||
for(i = 0; i < 2048; i++){
|
||||
StoreVUMem(state, i, data, 1);
|
||||
for(j = 0; j < 4; j++)
|
||||
fwrite(&data[j], 4, 1, fp);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void Usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: simvpe [options]\n");
|
||||
fprintf(stderr, "\t\t-i instruction-file\n");
|
||||
fprintf(stderr, "\t\t-o output-memory-file\n");
|
||||
fprintf(stderr, "\t\t-t PKE-file (text type)\n");
|
||||
fprintf(stderr, "\t\t-s start-address [default = 0]\n");
|
||||
fprintf(stderr, "\t\t-d [interactive mode enable: default desable]\n");
|
||||
fprintf(stderr, "\t\t-v [statistics mode enable: default desable]\n");
|
||||
fprintf(stderr, "\t\t-p [debug print mode enable: default desable]\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
void getoption(VectorUnitState* state)
|
||||
{
|
||||
#if 0
|
||||
int startline = 0;
|
||||
int count = 1;
|
||||
#endif
|
||||
|
||||
state->junk._is_dbg = 1;
|
||||
state->junk._vpepc = 0;
|
||||
state->junk._is_verb = 0;
|
||||
state->junk._is_dump = 0;
|
||||
state->junk._pgpuif = 4; /* MEMGPUIF */
|
||||
state->junk._ITOP = 20;
|
||||
state->junk._TOP = 10;
|
||||
|
||||
#if 0
|
||||
while(argc - count){
|
||||
if(argv[count][0] == '-'){
|
||||
switch(argv[count][1]){
|
||||
case 'i':
|
||||
strcpy(ifilename, argv[count+1]);
|
||||
count += 2;
|
||||
break;
|
||||
case 'o':
|
||||
strcpy(ofilename, argv[count+1]);
|
||||
count += 2;
|
||||
break;
|
||||
case 't':
|
||||
strcpy(pfilename, argv[count+1]);
|
||||
count += 2;
|
||||
break;
|
||||
case 's':
|
||||
sscanf(argv[count+1], "%d", &startline);
|
||||
state->junk._vpepc = startline;
|
||||
count += 2;
|
||||
break;
|
||||
case 'd':
|
||||
state->junk._is_dbg = 1;
|
||||
count += 1;
|
||||
break;
|
||||
case 'v':
|
||||
state->junk._is_verb = 1;
|
||||
count += 1;
|
||||
break;
|
||||
case 'p':
|
||||
state->junk._is_dump = 1;
|
||||
count += 1;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
Usage();
|
||||
exit(1);
|
||||
break;
|
||||
default:
|
||||
Usage();
|
||||
exit(1);
|
||||
}
|
||||
}else{
|
||||
Usage();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
/* Copyright (C) 1998, Cygnus Solutions
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VU1_H_
|
||||
#define VU1_H_
|
||||
|
||||
#include "sim-main.h"
|
||||
|
||||
void vu1_issue(void);
|
||||
void vu1_init(SIM_DESC sd);
|
||||
int vu1_status(void);
|
||||
int vu1_busy(void);
|
||||
|
||||
#define VU1_MEM0_WINDOW_START 0x11008000
|
||||
#define VU1_MEM0_SIZE 0x4000 /* 16K = 16384 */
|
||||
|
||||
#define VU1_MEM1_WINDOW_START 0x1100c000
|
||||
#define VU1_MEM1_SIZE 0x4000 /* 16K = 16384 */
|
||||
|
||||
#define VU1_REGISTER_WINDOW_START 0x11007000
|
||||
|
||||
/* FIX ME: These should be derived from enum in sky-vu.h */
|
||||
#define VPU_STAT 0x110073d0
|
||||
#define VU1_CIA 0x110073e0
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user