Latest cagney update

This commit is contained in:
Michael Meissner 1996-01-08 18:01:17 +00:00
parent 436d414327
commit 979c3c25fd
7 changed files with 941 additions and 230 deletions

View file

@ -23,6 +23,27 @@
#define _EMUL_BUGAPI_C_
/* from bug.S - Dale Rahn */
#define _INCHR 0x00
#define _INSTAT 0x01
#define _INLN 0x02
#define _READSTR 0x03
#define _READLN 0x04
#define _OUTCHR 0x20
#define _OUTSTR 0x21
#define _OUTLN 0x22
#define _DSKRD 0x10
#define _DSKWR 0x11
#define _DSKCFIG 0x12
#define _DSKFMT 0x14
#define _DSKCTRL 0x15
#define _WRITE 0x23
#define _WRITELN 0x24
#define _DELAY 0x43
#define _RTC_RD 0x53
#define _RETURN 0x63
#define _BRD_ID 0x70
/* Note: this module is called via a table. There is no benefit in
making it inline */
@ -32,13 +53,27 @@
/* Any starting address less than this is assumed to be an OEA program
rather than VEA. */
#ifndef OEA_START_ADDRESS
#define OEA_START_ADDRESS 4096
#define OEA_START_ADDRESS 0x4000
#endif
#ifndef OEA_MEMORY_SIZE
#define OEA_MEMORY_SIZE 0x100000
#endif
/* All but CPU 0 are put into an infinate loop, this loop instruction
is stored at the address below */
#ifndef OEA_STALL_CPU_LOOP_ADDRESS
#define OEA_STALL_CPU_LOOP_ADDRESS 0x00c10
#endif
/* At initiallization, the system call exception branches to the BUG
emulation code */
#ifndef OEA_SYSTEM_CALL_ADDRESS
#define OEA_SYSTEM_CALL_ADDRESS 0x00c00
#endif
static os_emul_data *
emul_bugapi_create(device *root,
bfd *image,
@ -47,9 +82,11 @@ emul_bugapi_create(device *root,
/* check it really is for us */
if (name != NULL
&& strcmp(name, "bugapi") != 0)
&& strcmp(name, "bugapi") != 0
&& strcmp(name, "bug") != 0)
return NULL;
if (image != NULL
&& name == NULL
&& bfd_get_start_address(image) > OEA_START_ADDRESS)
return NULL;
@ -58,8 +95,12 @@ emul_bugapi_create(device *root,
const memory_size = OEA_MEMORY_SIZE;
const elf_binary = (image != NULL
&& image->xvec->flavour == bfd_target_elf_flavour);
const little_endian = (image != NULL
&& !image->xvec->byteorder_big_p);
#ifdef bfd_little_endian /* new bfd */
const little_endian = (image != NULL && bfd_little_endian(image));
#else
const little_endian = (image != NULL &&
!image->xvec->byteorder_big_p);
#endif
{ /* options */
device *options = device_tree_add_found(root, "/", "options");
@ -75,7 +116,7 @@ emul_bugapi_create(device *root,
device_add_boolean_property(options,
"strict-alignment?",
(WITH_ALIGNMENT == STRICT_ALIGNMENT
|| !image->xvec->byteorder_big_p));
|| little_endian));
device_add_boolean_property(options,
"floating-point?",
WITH_FLOATING_POINT);
@ -98,15 +139,32 @@ emul_bugapi_create(device *root,
device *init_register = device_tree_add_found(init, "", "register");
device_add_integer_property(init_register,
"pc",
0);
OEA_STALL_CPU_LOOP_ADDRESS);
device_add_integer_property(init_register,
"0.pc",
bfd_get_start_address(image));
device_add_integer_property(init_register,
"sp",
memory_size-16);
device_add_integer_property(init_register,
"msr",
(little_endian
? msr_little_endian_mode
: 0));
(msr_recoverable_interrupt
| (little_endian
? msr_little_endian_mode
: 0)
));
device_tree_add_found_uw_u_u(init, "",
"data",
OEA_SYSTEM_CALL_ADDRESS,
4, 0x1); /*emul-call*/
device_tree_add_found_uw_u_u(init, "",
"data",
OEA_SYSTEM_CALL_ADDRESS + 4,
4, 0x4c000064); /*rfi*/
device_tree_add_found_uw_u_u(init, "",
"data",
OEA_STALL_CPU_LOOP_ADDRESS,
4, 0x48000000); /*b .*/
}
{
device *init_stack = device_tree_add_found(init, "", "stack");
@ -140,8 +198,28 @@ emul_bugapi_instruction_call(cpu *processor,
unsigned_word ra,
os_emul_data *emul_data)
{
error("emul_bugapi_instruction_call() not implemented\n");
const int call_id = cpu_registers(processor)->gpr[10];
/* check that this isn't an invalid instruction */
if (cia != OEA_SYSTEM_CALL_ADDRESS)
return 0;
switch (call_id) {
case _OUTCHR:
printf_filtered("%c", cpu_registers(processor)->gpr[3]);
break;
case _OUTLN:
printf_filtered("\n");
break;
case _RETURN:
cpu_halt(processor, cia, was_exited, 0); /* always succeeds */
break;
default:
error("emul-bugapi: unimplemented bugapi call 0x%x from address 0x%lx\n",
call_id, SRR0);
break;
}
return 1;
/* the instruction following this one is a RFI. Thus by just
continuing the return from system call is performed */
}
const os_emul emul_bugapi = {