Page 1 of 1

hardware breakpoints

Posted: Thu Apr 19, 2007 5:52 am
by JorDy
I've been trying to set up my own breakpoint handler using the sio shell code, but its not been very successful so far.

Code: Select all

/* Install a V_DEBUG handler in place of the kernel one */
static void install_debug_handler(void)
{
   u32 data;
   /* Build a 'j level2ExceptionHandler' instruction */
   data = (u32) level2ExceptionHandler & 0xFFFFFFF;
   data = 0x8000000 | (data >> 2);
   _sw(data, 0x80000100);
   _sw(0, 0x80000104);
  FlushCache(0);

}
    .global _level2SavedRegs
    .global _level2ExceptionStack
        
    .global level2ExceptionHandler
    .ent	level2ExceptionHandler

level2ExceptionHandler:

	sq	$k0, -0x20($0)
	la	$k0, _level2SavedRegs
	#lui	k1, 0x8000
	#	or	$k0, $k0, k1

    sq      $0,  0x00($k0)
    sq      $1,  0x10($k0)
    sq      $2,  0x20($k0)
    sq      $3,  0x30($k0)
    sq      $4,  0x40($k0)
    sq      $5,  0x50($k0)
    sq      $6,  0x60($k0)
    sq      $7,  0x70($k0)
    sq      $8,  0x80($k0)
    sq      $9,  0x90($k0)
    sq      $10,  0xa0($k0)
    sq      $11,  0xb0($k0)
    sq      $12,  0xc0($k0)
    sq      $13,  0xd0($k0)
    sq      $14,  0xe0($k0)
    sq      $15,  0xf0($k0)
    sq      $16,  0x100($k0)
    sq      $17,  0x110($k0)
    sq      $18,  0x120($k0)
    sq      $19,  0x130($k0)
    sq      $20,  0x140($k0)
    sq      $21,  0x150($k0)
    sq      $22,  0x160($k0)
    sq      $23,  0x170($k0)
    sq      $24,  0x180($k0)
    sq      $25,  0x190($k0)
	# Restore $k0 and save
    lq		$1, -0x20($0)
    sq      $1, 0x1a0($k0)         # zero instead of $k0
    sq      $27,  0x1b0($k0)          # $k1
    sq      $28,  0x1c0($k0)
    sq      $29,  0x1d0($k0)          # $sp
    sq      $30,  0x1e0($k0)
    sq      $31,  0x1f0($k0)          # $ra

   
    # Return from exception and start 'debugger'
    #jal      sio_shell_level2 
    # nop

    la      $k0, _level2SavedRegs
             

    lq      $0,  0x00($k0)
    lq      $1,  0x10($k0)
    lq      $2,  0x20($k0)
    lq      $3,  0x30($k0)
    lq      $4,  0x40($k0)
    lq      $5,  0x50($k0)
    lq      $6,  0x60($k0)
    lq      $7,  0x70($k0)
    lq      $8,  0x80($k0)
    lq      $9,  0x90($k0)
    lq      $10,  0xa0($k0)
    lq      $11,  0xb0($k0)
    lq      $12,  0xc0($k0)
    lq      $13,  0xd0($k0)
    lq      $14,  0xe0($k0)
    lq      $15,  0xf0($k0)
    lq      $16,  0x100($k0)
    lq      $17,  0x110($k0)
    lq      $18,  0x120($k0)
    lq      $19,  0x130($k0)
    lq      $20,  0x140($k0)
    lq      $21,  0x150($k0)
    lq      $22,  0x160($k0)
    lq      $23,  0x170($k0)
    lq      $24,  0x180($k0)
    lq      $25,  0x190($k0)
	# no $k0
    lq      $27,  0x1b0($k0)          # $k1
    lq      $28,  0x1c0($k0)
    lq      $29,  0x1d0($k0)          # $sp
    lq      $30,  0x1e0($k0)
    lq      $31,  0x1f0($k0)          # $ra

    lq		$k0, -0x20($0)

    sync
    eret	
    nop
    jr		$ra
    nop

    .end	level2ExceptionHandler
    
    .bss
        .align  4
        .ent	_level2SavedRegs
_level2SavedRegs:
        .space  0x240, 0
        .end	_level2SavedRegs

u32 test;
u32 memory_location = 0x0;
int main(void)
{
	
	SifInitRpc(0);

	init_scr();
	ee_kmode_enter();
	install_debug_handler();
	ee_kmode_exit();
	scr_printf("			Handler on\n");

	InitBPC();
	scr_printf("			BPC on\n");
	SetDataAddrBP(&test, 0xfffffffc,BPC_DWE | BPC_DUE | BPC_BED);
	scr_printf("			BP SET on\n");
	scr_printf("			test = %8.8x\n",test);
	scr_printf("			Done\n");
	test++;
	scr_printf("			test = %0x\n",test);
	scr_printf("			memory_location = %8.8x\n",memory_location);
	while(1)
	{

	}

	return 0;
}
once it has increased test by 1 it triggers the breakpoint i assume as everything just seems to freeze, it doesn't return back to execution and finish printing the new value to screen, which i thought it would do am i wrong? Its really bugging me because i have basically taken it straight from the sio shell.
In my level 1 handler i have to increase the EPC to the next address so the break doesn't happen again, am i supposed to do this with a level 2 exception as well?

Posted: Sat Apr 21, 2007 12:54 am
by JorDy
any have any idea?