/* * Initialize glue code linking i386-stub with the rest of * the system */ void i386_stub_glue_init(int uart) { rtems_device_minor_number minor = (rtems_device_minor_number) uart; port_current = console_find_console_entry(NULL, 0, &minor); if (port_current == NULL) { printk("GDB: invalid minor number for UART\n"); return; } uart_current = uart; /* Intialise the UART, assuming polled drivers */ port_current->pDeviceFns->deviceInitialize(uart); }
static bool parse_printk_or_console( const char *param, rtems_device_minor_number *minor_out ) { static const char *opt; const char *option; const char *comma; size_t length; size_t index; rtems_device_minor_number minor; console_tbl *conscfg; /* * Check the command line for the type of mode the console is. */ opt = bsp_cmdline_arg(param); if ( !opt ) { return false; } /* * Fine the length, there can be more command line visible. */ length = 0; while ((opt[length] != ' ') && (opt[length] != '\0')) { ++length; if (length > NAME_MAX) { printk("invalid option (%s): too long\n", param); return false; } } /* * Only match up to a comma or NULL */ index = 0; while ((opt[index] != '=') && (index < length)) { ++index; } if (opt[index] != '=') { printk("invalid option (%s): no equals\n", param); return false; } ++index; option = &opt[index]; while ((opt[index] != ',') && (index < length)) { ++index; } if (opt[index] == ',') comma = &opt[index]; else comma = NULL; length = &opt[index] - option; conscfg = console_find_console_entry( option, length, &minor ); if ( conscfg == NULL ) { return false; } *minor_out = minor; if (comma) { option = comma + 1; if (strncmp (option, "115200", sizeof ("115200") - 1) == 0) conscfg->pDeviceParams = (void *)115200; else if (strncmp (option, "57600", sizeof ("57600") - 1) == 0) conscfg->pDeviceParams = (void *)57600; else if (strncmp (option, "38400", sizeof ("38400") - 1) == 0) conscfg->pDeviceParams = (void *)38400; else if (strncmp (option, "19200", sizeof ("19200") - 1) == 0) conscfg->pDeviceParams = (void *)19200; else if (strncmp (option, "9600", sizeof ("9600") - 1) == 0) conscfg->pDeviceParams = (void *)9600; else if (strncmp (option, "4800", sizeof ("4800") - 1) == 0) conscfg->pDeviceParams = (void *)4800; } return true; }
void pc386_parse_gdb_arguments(void) { static const char *opt; /* * Check the command line to see if com1-com4 are disabled. */ opt = bsp_cmdline_arg("--gdb="); if ( opt ) { const char *option; const char *comma; size_t length; size_t index; rtems_device_minor_number minor; uint32_t baudrate = 115200; bool halt = false; console_tbl *port; /* * Fine the length, there can be more command line visible. */ length = 0; while ((opt[length] != ' ') && (opt[length] != '\0')) { ++length; if (length > NAME_MAX) { printk("invalid option (--gdb): too long\n"); return; } } /* * Only match up to a comma or NULL */ index = 0; while ((opt[index] != '=') && (index < length)) { ++index; } if (opt[index] != '=') { printk("invalid option (--gdb): no equals\n"); return; } ++index; option = &opt[index]; while ((opt[index] != ',') && (index < length)) { ++index; } if (opt[index] == ',') comma = &opt[index]; else comma = NULL; length = &opt[index] - option; port = console_find_console_entry( option, length, &minor ); if ( port == NULL ) { printk("invalid option (--gdb): port not found\n"); return; } if (comma) { option = comma + 1; baudrate = strtoul(option, 0, 10); switch (baudrate) { case 115200: case 57600: case 38400: case 19200: case 9600: case 4800: port->pDeviceParams = (void*) baudrate; BSPBaseBaud = baudrate; /* REMOVE ME */ break; default: printk("invalid option (--gdb): bad baudrate\n"); return; } } /* * Provide a probe that fails so the device is not part of termios. All * functions are polling. */ port->deviceProbe = gdb_port_probe; port->pDeviceFns = &ns16550_fns_polled; opt = bsp_cmdline_arg("--gdb-remote-debug"); if ( opt ) { remote_debug = 1; } opt = bsp_cmdline_arg("--gdb-break"); if ( opt ) { halt = true; } printk("GDB stub: enable %s%s%s\n", port->sDeviceName, remote_debug ? ", remote-debug" : "", halt ? ", halting" : ""); i386_stub_glue_init(minor); set_debug_traps(); i386_stub_glue_init_breakin(); if ( halt ) { printk("GDB stub: waiting for remote connection..\n"); breakpoint(); } } }