Skip to content
Snippets Groups Projects
Commit 9b657e91 authored by cnlohr's avatar cnlohr
Browse files

Closes #158 - resolves single-step debugging.

parent 77e10b1e
No related branches found
No related tags found
No related merge requests found
...@@ -25,6 +25,7 @@ void RVNetPoll(void * dev ); ...@@ -25,6 +25,7 @@ void RVNetPoll(void * dev );
int RVSendGDBHaltReason( void * dev ); int RVSendGDBHaltReason( void * dev );
void RVNetConnect( void * dev ); void RVNetConnect( void * dev );
int RVReadCPURegister( void * dev, int regno, uint32_t * regret ); int RVReadCPURegister( void * dev, int regno, uint32_t * regret );
int RVWriteCPURegister( void * dev, int regno, uint32_t value );
void RVDebugExec( void * dev, int halt_reset_or_resume ); void RVDebugExec( void * dev, int halt_reset_or_resume );
int RVReadMem( void * dev, uint32_t memaddy, uint8_t * payload, int len ); int RVReadMem( void * dev, uint32_t memaddy, uint8_t * payload, int len );
int RVHandleBreakpoint( void * dev, int set, uint32_t address ); int RVHandleBreakpoint( void * dev, int set, uint32_t address );
...@@ -161,7 +162,6 @@ void HandleGDBPacket( void * dev, char * data, int len ) ...@@ -161,7 +162,6 @@ void HandleGDBPacket( void * dev, char * data, int len )
{ {
int i; int i;
//printf( ":::%s:::\n", data );
// Got a packet? // Got a packet?
if( data[0] != '$' ) return; if( data[0] != '$' ) return;
...@@ -209,9 +209,14 @@ void HandleGDBPacket( void * dev, char * data, int len ) ...@@ -209,9 +209,14 @@ void HandleGDBPacket( void * dev, char * data, int len )
break; break;
case 'c': case 'c':
case 'C': case 'C':
RVDebugExec( dev, (cmd == 's' )?9:(cmd == 'C')?4:2 );
SendReplyFull( "OK" );
break;
case 's': case 's':
RVDebugExec( dev, (cmd == 'C')?4:2 ); RVDebugExec( dev, 4 );
SendReplyFull( "OK" ); SendReplyFull( "OK" );
//RVHandleGDBBreakRequest( dev );
RVSendGDBHaltReason( dev );
break; break;
case 'D': case 'D':
// Handle disconnect. // Handle disconnect.
...@@ -220,8 +225,18 @@ void HandleGDBPacket( void * dev, char * data, int len ) ...@@ -220,8 +225,18 @@ void HandleGDBPacket( void * dev, char * data, int len )
case 'k': case 'k':
RVHandleKillRequest( dev ); // no reply. RVHandleKillRequest( dev ); // no reply.
break; break;
case 'Z': case 'P': // Set register
case 'z': {
uint32_t reg, value;
if( ReadHex( &data, -1, &reg ) < 0 ) goto err;
if( *(data++) != ',' ) goto err;
if( ReadHex( &data, -1, &value ) < 0 ) goto err;
printf( "REG: %02x = %08x\n", reg, value );
RVWriteCPURegister( dev, reg, value );
break;
}
case 'Z': // set
case 'z': // unset
{ {
uint32_t type = 0; uint32_t type = 0;
uint32_t addr = 0; uint32_t addr = 0;
......
...@@ -145,6 +145,36 @@ int RVReadCPURegister( void * dev, int regno, uint32_t * regret ) ...@@ -145,6 +145,36 @@ int RVReadCPURegister( void * dev, int regno, uint32_t * regret )
return 0; return 0;
} }
int RVWriteCPURegister( void * dev, int regno, uint32_t value )
{
if( shadow_running_state )
{
MCF.HaltMode( dev, 5 );
RVCommandPrologue( dev );
shadow_running_state = 0;
}
if( regno == 32 ) regno = 16; // Hack - Make 32 also 16 for old GDBs.
if( regno > 16 ) return 0; // Invalid register.
backup_regs[regno] = value;
if( !MCF.WriteAllCPURegisters )
{
fprintf( stderr, "ERROR: MCF.WriteAllCPURegisters is not implemented on this platform\n" );
return -99;
}
int r;
if( ( r = MCF.WriteAllCPURegisters( dev, backup_regs ) ) )
{
fprintf( stderr, "Error: WriteAllCPURegisters failed (%d)\n", r );
return r;
}
return 0;
}
void RVDebugExec( void * dev, int halt_reset_or_resume ) void RVDebugExec( void * dev, int halt_reset_or_resume )
{ {
if( !MCF.HaltMode ) if( !MCF.HaltMode )
...@@ -199,7 +229,13 @@ void RVDebugExec( void * dev, int halt_reset_or_resume ) ...@@ -199,7 +229,13 @@ void RVDebugExec( void * dev, int halt_reset_or_resume )
backup_regs[16]+=2; backup_regs[16]+=2;
else else
; //No change, it is a normal instruction. ; //No change, it is a normal instruction.
if( halt_reset_or_resume == 4 )
{
MCF.SetEnableBreakpoints( dev, 1, 1 );
}
} }
halt_reset_or_resume = 2; halt_reset_or_resume = 2;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment