Several cleanups
This commit is contained in:
parent
515e8007fc
commit
1948a3b714
7 changed files with 17 additions and 58 deletions
|
@ -1755,7 +1755,8 @@ module = {
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = backtrace;
|
name = backtrace;
|
||||||
common = lib/i386/backtrace.c;
|
x86 = lib/i386/backtrace.c;
|
||||||
|
common = lib/backtrace.c;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <grub/cpu/gdb.h>
|
#include <grub/cpu/gdb.h>
|
||||||
#include <grub/gdb.h>
|
#include <grub/gdb.h>
|
||||||
#include <grub/serial.h>
|
#include <grub/serial.h>
|
||||||
|
#include <grub/backtrace.h>
|
||||||
|
|
||||||
static const char hexchars[] = "0123456789abcdef";
|
static const char hexchars[] = "0123456789abcdef";
|
||||||
int grub_gdb_regs[GRUB_MACHINE_NR_REGS];
|
int grub_gdb_regs[GRUB_MACHINE_NR_REGS];
|
||||||
|
@ -140,9 +141,9 @@ grub_gdb_putpacket (char *buffer)
|
||||||
/* Convert the memory pointed to by mem into hex, placing result in buf.
|
/* Convert the memory pointed to by mem into hex, placing result in buf.
|
||||||
Return a pointer to the last char put in buf (NULL). */
|
Return a pointer to the last char put in buf (NULL). */
|
||||||
static char *
|
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;
|
unsigned char ch;
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
|
@ -175,7 +176,7 @@ grub_gdb_hex2mem (char *buf, char *mem, int count)
|
||||||
/* Convert hex characters to int and return the number of characters
|
/* Convert hex characters to int and return the number of characters
|
||||||
processed. */
|
processed. */
|
||||||
static int
|
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 num_chars = 0;
|
||||||
int hex_value;
|
int hex_value;
|
||||||
|
@ -205,17 +206,16 @@ grub_gdb_trap (int trap_no)
|
||||||
{
|
{
|
||||||
int sig_no;
|
int sig_no;
|
||||||
int stepping;
|
int stepping;
|
||||||
int addr;
|
grub_uint64_t addr;
|
||||||
int length;
|
grub_uint64_t length;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
int newPC;
|
|
||||||
|
|
||||||
if (!grub_gdb_port)
|
if (!grub_gdb_port)
|
||||||
{
|
{
|
||||||
grub_printf ("Unhandled exception 0x%x at ", trap_no);
|
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_printf ("\n");
|
||||||
grub_backtrace_pointer (grub_gdb_regs[EBP]);
|
grub_backtrace_pointer ((void *) grub_gdb_regs[EBP]);
|
||||||
grub_abort ();
|
grub_abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,10 +284,10 @@ grub_gdb_trap (int trap_no)
|
||||||
/* Set the value of a single CPU register -- return OK. */
|
/* Set the value of a single CPU register -- return OK. */
|
||||||
case 'P':
|
case 'P':
|
||||||
{
|
{
|
||||||
int regno;
|
grub_uint64_t regno;
|
||||||
|
|
||||||
if (grub_gdb_hex2int (&ptr, ®no) && *ptr++ == '=')
|
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_gdb_hex2mem (ptr, (char *) &grub_gdb_regs[regno], 4);
|
||||||
grub_strcpy (grub_gdb_outbuf, "OK");
|
grub_strcpy (grub_gdb_outbuf, "OK");
|
||||||
|
@ -308,7 +308,8 @@ grub_gdb_trap (int trap_no)
|
||||||
if (grub_gdb_hex2int (&ptr, &length))
|
if (grub_gdb_hex2int (&ptr, &length))
|
||||||
{
|
{
|
||||||
ptr = 0;
|
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)
|
if (ptr)
|
||||||
grub_strcpy (grub_gdb_outbuf, "E01");
|
grub_strcpy (grub_gdb_outbuf, "E01");
|
||||||
|
@ -322,7 +323,7 @@ grub_gdb_trap (int trap_no)
|
||||||
if (grub_gdb_hex2int (&ptr, &length))
|
if (grub_gdb_hex2int (&ptr, &length))
|
||||||
if (*(ptr++) == ':')
|
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");
|
grub_strcpy (grub_gdb_outbuf, "OK");
|
||||||
ptr = 0;
|
ptr = 0;
|
||||||
}
|
}
|
||||||
|
@ -342,8 +343,6 @@ grub_gdb_trap (int trap_no)
|
||||||
if (grub_gdb_hex2int (&ptr, &addr))
|
if (grub_gdb_hex2int (&ptr, &addr))
|
||||||
grub_gdb_regs[PC] = addr;
|
grub_gdb_regs[PC] = addr;
|
||||||
|
|
||||||
newPC = grub_gdb_regs[PC];
|
|
||||||
|
|
||||||
/* Clear the trace bit. */
|
/* Clear the trace bit. */
|
||||||
grub_gdb_regs[PS] &= 0xfffffeff;
|
grub_gdb_regs[PS] &= 0xfffffeff;
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ASM 1
|
|
||||||
#include <grub/cpu/gdb.h>
|
#include <grub/cpu/gdb.h>
|
||||||
|
|
||||||
#define EC_PRESENT 1
|
#define EC_PRESENT 1
|
||||||
|
|
|
@ -19,9 +19,6 @@
|
||||||
FUNCTION(grub_bios_interrupt)
|
FUNCTION(grub_bios_interrupt)
|
||||||
pushf
|
pushf
|
||||||
cli
|
cli
|
||||||
#ifndef GRUB_MACHINE_PCBIOS
|
|
||||||
sidt protidt
|
|
||||||
#endif
|
|
||||||
popf
|
popf
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
pushl %ecx
|
pushl %ecx
|
||||||
|
@ -51,9 +48,6 @@ FUNCTION(grub_bios_interrupt)
|
||||||
.code16
|
.code16
|
||||||
pushf
|
pushf
|
||||||
cli
|
cli
|
||||||
#ifndef GRUB_MACHINE_PCBIOS
|
|
||||||
lidt realidt
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mov %ds, %ax
|
mov %ds, %ax
|
||||||
push %ax
|
push %ax
|
||||||
|
@ -126,15 +120,4 @@ intno:
|
||||||
popl %eax
|
popl %eax
|
||||||
popl %ecx
|
popl %ecx
|
||||||
popl %ebp
|
popl %ebp
|
||||||
#ifndef GRUB_MACHINE_PCBIOS
|
|
||||||
lidt protidt
|
|
||||||
#endif
|
|
||||||
ret
|
ret
|
||||||
#ifndef GRUB_MACHINE_PCBIOS
|
|
||||||
realidt:
|
|
||||||
.word 0x100
|
|
||||||
.long 0
|
|
||||||
protidt:
|
|
||||||
.word 0
|
|
||||||
.long 0
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -26,29 +26,6 @@
|
||||||
|
|
||||||
#define MAX_STACK_FRAME 102400
|
#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
|
void
|
||||||
grub_backtrace_pointer (void *ebp)
|
grub_backtrace_pointer (void *ebp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,5 +21,6 @@
|
||||||
|
|
||||||
void grub_backtrace (void);
|
void grub_backtrace (void);
|
||||||
void grub_backtrace_pointer (void *ptr);
|
void grub_backtrace_pointer (void *ptr);
|
||||||
|
void grub_backtrace_print_address (void *addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
#define SP ESP
|
#define SP ESP
|
||||||
#define PS EFLAGS
|
#define PS EFLAGS
|
||||||
|
|
||||||
#ifndef ASM
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
#include <grub/gdb.h>
|
#include <grub/gdb.h>
|
||||||
|
|
||||||
|
@ -69,7 +69,6 @@ struct grub_cpu_idt_descriptor
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
extern void (*grub_gdb_trapvec[]) (void);
|
extern void (*grub_gdb_trapvec[]) (void);
|
||||||
void grub_gdb_breakpoint (void);
|
|
||||||
void grub_gdb_idtinit (void);
|
void grub_gdb_idtinit (void);
|
||||||
void grub_gdb_idtrestore (void);
|
void grub_gdb_idtrestore (void);
|
||||||
void grub_gdb_trap (int trap_no);
|
void grub_gdb_trap (int trap_no);
|
||||||
|
|
Loading…
Reference in a new issue