Fix simulation of MSP430's open system call.

* sim/msp430/msp430-sim.c (maybe_perform_syscall): Fix passing of
	arguments for variadic syscall "open".
This commit is contained in:
Jozef Lawrynowicz 2017-08-29 14:09:58 +01:00 committed by Nick Clifton
parent 34e0882b83
commit 3819af136d
2 changed files with 30 additions and 10 deletions

View File

@ -1,3 +1,8 @@
2017-08-29 Jozef Lawrynowicz <jozef.l@somniumtech.com>
* sim/msp430/msp430-sim.c (maybe_perform_syscall): Fix passing of
arguments for variadic syscall "open".
2016-08-15 Mike Frysinger <vapier@gentoo.org>
* msp430-sim.c: Delete bfd.h include.

View File

@ -278,7 +278,7 @@ static int
get_op (SIM_DESC sd, MSP430_Opcode_Decoded *opc, int n)
{
MSP430_Opcode_Operand *op = opc->op + n;
int rv;
int rv = 0;
int addr;
unsigned char buf[4];
int incval = 0;
@ -465,7 +465,7 @@ static int
put_op (SIM_DESC sd, MSP430_Opcode_Decoded *opc, int n, int val)
{
MSP430_Opcode_Operand *op = opc->op + n;
int rv;
int rv = 0;
int addr;
unsigned char buf[4];
int incval = 0;
@ -986,11 +986,26 @@ maybe_perform_syscall (SIM_DESC sd, int call_addr)
if ((call_addr & ~0x3f) == 0x00180)
{
/* Syscall! */
int arg1, arg2, arg3, arg4;
int syscall_num = call_addr & 0x3f;
int arg1 = MSP430_CPU (sd)->state.regs[12];
int arg2 = MSP430_CPU (sd)->state.regs[13];
int arg3 = MSP430_CPU (sd)->state.regs[14];
int arg4 = MSP430_CPU (sd)->state.regs[15];
/* syscall_num == 2 is used for the variadic function "open".
The arguments are set up differently for variadic functions.
See slaa534.pdf distributed by TI. */
if (syscall_num == 2)
{
arg1 = MSP430_CPU (sd)->state.regs[12];
arg2 = mem_get_val (sd, SP, 16);
arg3 = mem_get_val (sd, SP + 2, 16);
arg4 = mem_get_val (sd, SP + 4, 16);
}
else
{
arg1 = MSP430_CPU (sd)->state.regs[12];
arg2 = MSP430_CPU (sd)->state.regs[13];
arg3 = MSP430_CPU (sd)->state.regs[14];
arg4 = MSP430_CPU (sd)->state.regs[15];
}
MSP430_CPU (sd)->state.regs[12] = sim_syscall (MSP430_CPU (sd),
syscall_num, arg1, arg2,
@ -1012,13 +1027,13 @@ msp430_step_once (SIM_DESC sd)
MSP430_Opcode_Decoded opcode_buf;
MSP430_Opcode_Decoded *opcode = &opcode_buf;
int s1, s2, result;
int u1, u2, uresult;
int c, reg;
int u1 = 0, u2, uresult;
int c = 0, reg;
int sp;
int carry_to_use;
int n_repeats;
int rept;
int op_bytes, op_bits;
int op_bytes = 0, op_bits;
PC &= 0xfffff;
opcode_pc = PC;
@ -1072,7 +1087,7 @@ msp430_step_once (SIM_DESC sd)
if (TRACE_ANY_P (MSP430_CPU (sd)))
trace_prefix (sd, MSP430_CPU (sd), NULL_CIA, opcode_pc,
TRACE_LINENUM_P (MSP430_CPU (sd)), NULL, 0, "");
TRACE_LINENUM_P (MSP430_CPU (sd)), NULL, 0, " ");
TRACE_DISASM (MSP430_CPU (sd), opcode_pc);