📄 skyeye2gdb.c
字号:
}
/* For W and X, we're done. */
*buf++ = 0;
}
void
decode_m_packet (char *from, CORE_ADDR * mem_addr_ptr, unsigned int *len_ptr)
{
int i = 0, j = 0;
char ch;
*mem_addr_ptr = *len_ptr = 0;
while ((ch = from[i++]) != ',')
{
*mem_addr_ptr = *mem_addr_ptr << 4;
*mem_addr_ptr |= fromhex (ch) & 0x0f;
}
for (j = 0; j < 4; j++)
{
if ((ch = from[i++]) == 0)
break;
*len_ptr = *len_ptr << 4;
*len_ptr |= fromhex (ch) & 0x0f;
}
}
void
decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr, unsigned int *len_ptr,
char *to)
{
int i = 0;
char ch;
*mem_addr_ptr = *len_ptr = 0;
while ((ch = from[i++]) != ',')
{
*mem_addr_ptr = *mem_addr_ptr << 4;
*mem_addr_ptr |= fromhex (ch) & 0x0f;
}
while ((ch = from[i++]) != ':')
{
*len_ptr = *len_ptr << 4;
*len_ptr |= fromhex (ch) & 0x0f;
}
convert_ascii_to_int (&from[i++], to, *len_ptr);
}
static int
frommem (ARMul_State * state, unsigned char *memory)
{
if (state->bigendSig == HIGH)
{
return (memory[0] << 24)
| (memory[1] << 16) | (memory[2] << 8) | (memory[3] << 0);
}
else
{
return (memory[3] << 24)
| (memory[2] << 16) | (memory[1] << 8) | (memory[0] << 0);
}
}
static void
tomem (ARMul_State * state, unsigned char *memory, int val)
{
if (state->bigendSig == HIGH)
{
memory[0] = val >> 24;
memory[1] = val >> 16;
memory[2] = val >> 8;
memory[3] = val >> 0;
}
else
{
memory[3] = val >> 24;
memory[2] = val >> 16;
memory[1] = val >> 8;
memory[0] = val >> 0;
}
}
#if 0
ARMword
ARMul_Debug (ARMul_State * state, ARMword pc ATTRIBUTE_UNUSED,
ARMword instr ATTRIBUTE_UNUSED)
{
state->Emulate = STOP;
stop_simulator = 1;
return 1;
}
#endif
int
sim_write (ARMword addr, unsigned char *buffer, int size)
{
int i;
init ();
for (i = 0; i < size; i++)
{
ARMul_WriteByte (state, addr + i, buffer[i]);
}
return size;
}
int
sim_read (ARMword addr, unsigned char *buffer, int size)
{
int i;
init ();
for (i = 0; i < size; i++)
{
buffer[i] = ARMul_ReadByte (state, addr + i);
}
return size;
}
int
sim_store_register (int rn, unsigned char *memory)
{
init ();
ARMul_SetReg (state, state->Mode, rn, frommem (state, memory));
return -1;
}
int
sim_fetch_register (int rn, unsigned char *memory)
{
ARMword regval;
init ();
if (rn < 16)
regval = ARMul_GetReg (state, state->Mode, rn);
else if (rn == 25) /* FIXME: use PS_REGNUM from gdb/config/arm/tm-arm.h */
regval = ARMul_GetCPSR (state);
else
regval = 0; /* FIXME: should report an error */
tomem (state, memory, regval);
return -1;
}
void
fetch_inferior_registers (int regno, unsigned char *memory)
{
if (regno == -1 || regno == 0)
for (regno = 0; regno < NUM_REGS; regno++)
sim_fetch_register (regno, &(memory[REGISTER_BYTE (regno)]));
else
sim_fetch_register (regno, &(memory[REGISTER_BYTE (regno)]));
}
void
store_inferior_registers (int regno, unsigned char *memory)
{
if (regno == -1 || regno == 0)
for (regno = 0; regno < NUM_REGS; regno++)
sim_store_register (regno, &(memory[REGISTER_BYTE (regno)]));
else
sim_store_register (regno, &(memory[REGISTER_BYTE (regno)]));
}
int
sim_debug ()
{
static char own_buf[8000], mem_buf[8000];
char ch, status;
int i = 0;
unsigned char signal;
unsigned int len;
CORE_ADDR mem_addr;
if (setjmp (toplevel))
{
fprintf (stderr, "Exiting\n");
exit (1);
}
while (1)
{
remote_open ("host:12345");
restart:
setjmp (toplevel);
while (getpkt (own_buf) > 0)
{
unsigned char sig;
i = 0;
ch = own_buf[i++];
switch (ch)
{
case 'd':
remote_debug = !remote_debug;
break;
#if 0 // chy 2005-07-30
case '!':
extended_protocol = 1;
prepare_resume_reply (own_buf, status, signal);
break;
#endif //chy
case '?':
status = 'S';
signal = 1;
prepare_resume_reply (own_buf, status, signal);
break;
#if 0 // chy 2005-07-30
case 'H':
switch (own_buf[1])
{
case 'g':
general_thread = strtol (&own_buf[2], NULL, 16);
write_ok (own_buf);
fetch_inferior_registers (0);
break;
case 'c':
cont_thread = strtol (&own_buf[2], NULL, 16);
write_ok (own_buf);
break;
default:
/* Silently ignore it so that gdb can extend the protocol
without compatibility headaches. */
own_buf[0] = '\0';
break;
}
break;
#endif //chy 2005-07-30
case 'g':
fetch_inferior_registers (0, registers);
convert_int_to_ascii (registers, own_buf, REGISTER_BYTES);
break;
case 'G':
convert_ascii_to_int (&own_buf[1], registers, REGISTER_BYTES);
store_inferior_registers (-1, registers);
write_ok (own_buf);
break;
case 'm':
decode_m_packet (&own_buf[1], &mem_addr, &len);
sim_read (mem_addr, mem_buf, len);
convert_int_to_ascii (mem_buf, own_buf, len);
break;
case 'M':
decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
//chy 2005-07-30 ARM_BREAKPOINT 0xe7ffdefe
//bp_opcode_conv( (unsigned long) mem_addr, (unsigned long*)mem_buf );
if (sim_write (mem_addr, mem_buf, len) == len)
write_ok (own_buf);
else
write_enn (own_buf);
break;
/* chy 2005-07-28
case 'q':
switch (own_buf[1]) {
case 'C':
own_buf[0] = '\0';
break;
case 'O':
send_area(own_buf);
break;
default:
own_buf[0] = '\0';
break;
}
break;
case 'C':
convert_ascii_to_int (own_buf + 1, &sig, 1);
myresume (0, sig);
signal = mywait (&status);
prepare_resume_reply (own_buf, status, signal);
break;
case 'S':
convert_ascii_to_int (own_buf + 1, &sig, 1);
myresume (1, sig);
signal = mywait (&status);
prepare_resume_reply (own_buf, status, signal);
break;
chy */
case 'c':
//chy 2005-07-30
ARMul_DoProg (state);
//myresume (0, 0);
//signal = mywait (&status);
prepare_resume_reply (own_buf, status, signal);
break;
case 's':
//chy 2005-07-30
ARMul_DoInstr (state);
//myresume (1, 0);
//signal = mywait (&status);
prepare_resume_reply (own_buf, status, signal);
break;
#if 0 // chy 2005-07-30
case 'k':
fprintf (stderr, "Killing inferior\n");
kill_inferior ();
/* When using the extended protocol, we start up a new
debugging session. The traditional protocol will
exit instead. */
if (extended_protocol)
{
write_ok (own_buf);
fprintf (stderr, "GDBserver restarting\n");
/* Wait till we are at 1st instruction in prog. */
//chy 20050729 go to restart
//signal = start_inferior (&argv[2], &status);
goto restart;
break;
}
else
{
exit (0);
break;
}
case 'T':
if (mythread_alive (strtol (&own_buf[1], NULL, 16)))
write_ok (own_buf);
else
write_enn (own_buf);
break;
case 'R':
/* Restarting the inferior is only supported in the
extended protocol. */
if (extended_protocol)
{
kill_inferior ();
write_ok (own_buf);
fprintf (stderr, "GDBserver restarting\n");
/* Wait till we are at 1st instruction in prog. */
//chy 20050729 go to restart
//signal = start_inferior (&argv[2], &status);
goto restart;
break;
}
else
{
/* It is a request we don't understand. Respond with an
empty packet so that gdb knows that we don't support this
request. */
own_buf[0] = '\0';
break;
}
#endif //chy 2005-07-30
default:
/* It is a request we don't understand. Respond with an
empty packet so that gdb knows that we don't support this
request. */
own_buf[0] = '\0';
break;
}
putpkt (own_buf);
if (status == 'W')
fprintf (stderr, "\nChild exited with status %d\n", sig);
if (status == 'X')
fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig);
if (status == 'W' || status == 'X')
{
if (extended_protocol)
{
//chy 2005-07-30
fprintf (stderr, "CHY SkyEye: not Killing inferior\n");
//kill_inferior ();
write_ok (own_buf);
fprintf (stderr, "GDBserver restarting\n");
/* Wait till we are at 1st instruction in prog. */
//chy 20050729 go to restart
//signal = start_inferior (&argv[2], &status);
goto restart;
break;
}
else
{
fprintf (stderr, "GDBserver exiting\n");
exit (0);
}
}
}
/* We come here when getpkt fails.
For the extended remote protocol we exit (and this is the only
way we gracefully exit!).
For the traditional remote protocol close the connection,
and re-open it at the top of the loop. */
if (extended_protocol)
{
remote_close ();
exit (0);
}
else
{
fprintf (stderr,
"Remote side has terminated connection. GDBserver will reopen the connection.\n");
remote_close ();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -