int pdb_debug_state = 0; /* small parser state machine */
-int pdb_serial_input(u_char c, struct pt_regs *regs)
-{
- int out = 1;
- int loop, count;
- unsigned long cr3;
-
- __asm__ __volatile__ ("movl %%cr3,%0" : "=r" (cr3) : );
-
- switch (pdb_debug_state)
- {
- case 0: /* not currently processing debug string */
- if ( c == '$' ) /* start token */
- {
- pdb_debug_state = 1;
- pdb_in_buffer_ptr = 0;
- pdb_in_checksum = 0;
- pdb_xmit_checksum = 0;
- }
- else
- {
- out = 0;
- }
- break;
- case 1: /* saw '$' */
- if ( c == '#' ) /* checksum token */
- {
- pdb_debug_state = 2;
- pdb_in_buffer[pdb_in_buffer_ptr] = 0;
- }
- else
- {
- pdb_in_checksum += c;
- pdb_in_buffer[pdb_in_buffer_ptr++] = c;
- }
- break;
- case 2: /* 1st checksum digit */
- pdb_xmit_checksum = hex(c) << 4;
- pdb_debug_state = 3;
- break;
- case 3: /* 2nd checksum digit */
- pdb_xmit_checksum += hex(c);
- if (pdb_in_checksum != pdb_xmit_checksum)
- {
- pdb_put_char('-'); /* checksum failure */
- printk ("checksum failure [%s.%02x.%02x]\n", pdb_in_buffer,
- pdb_in_checksum, pdb_xmit_checksum);
- }
- else
- {
- pdb_put_char('+'); /* checksum okay */
- if ( pdb_in_buffer_ptr > 1 && pdb_in_buffer[2] == ':' )
- {
- pdb_put_char(pdb_in_buffer[0]);
- pdb_put_char(pdb_in_buffer[1]);
- /* remove sequence chars from buffer */
- count = strlen(pdb_in_buffer);
- for (loop = 3; loop < count; loop++)
- pdb_in_buffer[loop - 3] = pdb_in_buffer[loop];
- }
-
- pdb_process_command (pdb_in_buffer, regs, cr3,
- PDB_LIVE_EXCEPTION);
- }
- pdb_debug_state = 0;
- break;
- }
-
- return out;
-}
-
int hex(char ch)
{
if ((ch >= 'a') && (ch <= 'f')) return (ch-'a'+10);
/* External entry points. */
extern int pdb_handle_exception(int exceptionVector,
struct pt_regs *xen_regs);
-extern int pdb_serial_input(u_char c, struct pt_regs *regs);
extern void pdb_do_debug(dom0_op_t *op);
/* PDB Context. */