#include <grub/cpu/gdb.h>
#include <grub/gdb.h>
#include <grub/serial.h>
+#include <grub/backtrace.h>
static const char hexchars[] = "0123456789abcdef";
int grub_gdb_regs[GRUB_MACHINE_NR_REGS];
/* Convert the memory pointed to by mem into hex, placing result in buf.
Return a pointer to the last char put in buf (NULL). */
static char *
-grub_gdb_mem2hex (char *mem, char *buf, int count)
+grub_gdb_mem2hex (char *mem, char *buf, grub_size_t count)
{
- int i;
+ grub_size_t i;
unsigned char ch;
for (i = 0; i < count; i++)
/* Convert hex characters to int and return the number of characters
processed. */
static int
-grub_gdb_hex2int (char **ptr, int *int_value)
+grub_gdb_hex2int (char **ptr, grub_uint64_t *int_value)
{
int num_chars = 0;
int hex_value;
{
int sig_no;
int stepping;
- int addr;
- int length;
+ grub_uint64_t addr;
+ grub_uint64_t length;
char *ptr;
- int newPC;
if (!grub_gdb_port)
{
grub_printf ("Unhandled exception 0x%x at ", trap_no);
- grub_backtrace_print_address (grub_gdb_regs[PC]);
+ grub_backtrace_print_address ((void *) grub_gdb_regs[PC]);
grub_printf ("\n");
- grub_backtrace_pointer (grub_gdb_regs[EBP]);
+ grub_backtrace_pointer ((void *) grub_gdb_regs[EBP]);
grub_abort ();
}
/* Set the value of a single CPU register -- return OK. */
case 'P':
{
- int regno;
+ grub_uint64_t regno;
if (grub_gdb_hex2int (&ptr, ®no) && *ptr++ == '=')
- if (regno >= 0 && regno < GRUB_MACHINE_NR_REGS)
+ if (regno < GRUB_MACHINE_NR_REGS)
{
grub_gdb_hex2mem (ptr, (char *) &grub_gdb_regs[regno], 4);
grub_strcpy (grub_gdb_outbuf, "OK");
if (grub_gdb_hex2int (&ptr, &length))
{
ptr = 0;
- grub_gdb_mem2hex ((char *) addr, grub_gdb_outbuf, length);
+ grub_gdb_mem2hex ((char *) (grub_addr_t) addr,
+ grub_gdb_outbuf, length);
}
if (ptr)
grub_strcpy (grub_gdb_outbuf, "E01");
if (grub_gdb_hex2int (&ptr, &length))
if (*(ptr++) == ':')
{
- grub_gdb_hex2mem (ptr, (char *) addr, length);
+ grub_gdb_hex2mem (ptr, (char *) (grub_addr_t) addr, length);
grub_strcpy (grub_gdb_outbuf, "OK");
ptr = 0;
}
if (grub_gdb_hex2int (&ptr, &addr))
grub_gdb_regs[PC] = addr;
- newPC = grub_gdb_regs[PC];
-
/* Clear the trace bit. */
grub_gdb_regs[PS] &= 0xfffffeff;
#define MAX_STACK_FRAME 102400
-GRUB_MOD_LICENSE ("GPLv3+");
-
-void
-grub_backtrace_print_address (void *addr)
-{
- grub_dl_t mod;
-
- FOR_DL_MODULES (mod)
- {
- grub_dl_segment_t segment;
- for (segment = mod->segment; segment; segment = segment->next)
- if (segment->addr <= addr && (grub_uint8_t *) segment->addr
- + segment->size > (grub_uint8_t *) addr)
- {
- grub_printf ("%s.%x+%" PRIxGRUB_SIZE, mod->name, segment->section,
- (grub_uint8_t *) addr - (grub_uint8_t *) segment->addr);
- return;
- }
- }
-
- grub_printf ("%p", addr);
-}
-
void
grub_backtrace_pointer (void *ebp)
{