static void kill_request (const char *msg) { VG_(umsg) ("%s", msg); remote_close(); VG_(exit) (0); }
void gdbserver_terminate (void) { /* last call to gdbserver is cleanup call */ if (VG_MINIMAL_SETJMP(toplevel)) { dlog(0, "error caused VG_MINIMAL_LONGJMP to gdbserver_terminate\n"); return; } remote_close(); }
int main (int argc, char *argv[]) { FILE *fp; int ch; if (argc >= 2 && strcmp (argv[1], "--version") == 0) { gdbreplay_version (); exit (0); } if (argc >= 2 && strcmp (argv[1], "--help") == 0) { gdbreplay_usage (stdout); exit (0); } if (argc < 3) { gdbreplay_usage (stderr); exit (1); } fp = fopen (argv[1], "r"); if (fp == NULL) { perror_with_name (argv[1]); } remote_open (argv[2]); while ((ch = logchar (fp)) != EOF) { switch (ch) { case 'w': /* data sent from gdb to gdbreplay, accept and match it */ expect (fp); break; case 'r': /* data sent from gdbreplay to gdb, play it */ play (fp); break; case 'c': /* Command executed by gdb */ while ((ch = logchar (fp)) != EOL); break; } } remote_close (); exit (0); }
int main (int argc, char *argv[]) { FILE *fp; int ch; if (argc < 3) { fprintf (stderr, "Usage: gdbreplay <logfile> <host:port>\n"); fflush (stderr); exit (1); } fp = fopen (argv[1], "r"); if (fp == NULL) { perror_with_name (argv[1]); } remote_open (argv[2]); while ((ch = logchar (fp)) != EOF) { switch (ch) { case 'w': /* data sent from gdb to gdbreplay, accept and match it */ expect (fp); break; case 'r': /* data sent from gdbreplay to gdb, play it */ play (fp); break; case 'c': /* Command executed by gdb */ while ((ch = logchar (fp)) != EOL); break; } } remote_close (); exit (0); }
int main (int argc, char *argv[]) { char ch, status, *own_buf, mem_buf[2000]; int i = 0; unsigned char signal; unsigned int len; CORE_ADDR mem_addr; int bad_attach; int pid; char *arg_end; if (setjmp (toplevel)) { fprintf (stderr, "Exiting\n"); exit (1); } bad_attach = 0; pid = 0; attached = 0; if (argc >= 3 && strcmp (argv[2], "--attach") == 0) { if (argc == 4 && argv[3] != '\0' && (pid = strtoul (argv[3], &arg_end, 10)) != 0 && *arg_end == '\0') { ; } else bad_attach = 1; } if (argc < 3 || bad_attach) gdbserver_usage(); initialize_low (); own_buf = malloc (PBUFSIZ); if (pid == 0) { /* Wait till we are at first instruction in program. */ signal = start_inferior (&argv[2], &status); /* We are now stopped at the first instruction of the target process */ } else { switch (attach_inferior (pid, &status, &signal)) { case -1: error ("Attaching not supported on this target"); break; default: attached = 1; break; } } while (1) { remote_open (argv[1]); restart: setjmp (toplevel); while (getpkt (own_buf) > 0) { unsigned char sig; i = 0; ch = own_buf[i++]; switch (ch) { case 'q': handle_query (own_buf); break; case 'd': remote_debug = !remote_debug; break; case 'D': fprintf (stderr, "Detaching from inferior\n"); detach_inferior (); write_ok (own_buf); putpkt (own_buf); remote_close (); /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ if (!attached) { int status, ret; do { ret = waitpid (signal_pid, &status, 0); if (WIFEXITED (status) || WIFSIGNALED (status)) break; } while (ret != -1 || errno != ECHILD); } exit (0); case '!': if (attached == 0) { extended_protocol = 1; prepare_resume_reply (own_buf, status, signal); } else { /* We can not use the extended protocol if we are attached, because we can not restart the running program. So return unrecognized. */ own_buf[0] = '\0'; } break; case '?': prepare_resume_reply (own_buf, status, signal); break; case 'H': switch (own_buf[1]) { case 'g': general_thread = strtol (&own_buf[2], NULL, 16); write_ok (own_buf); set_desired_inferior (1); break; case 'c': cont_thread = strtol (&own_buf[2], NULL, 16); write_ok (own_buf); break; case 's': step_thread = strtol (&own_buf[2], NULL, 16); write_ok (own_buf); break; default: /* Silently ignore it so that gdb can extend the protocol without compatibility headaches. */ own_buf[0] = '\0'; break; } break; case 'g': set_desired_inferior (1); registers_to_string (own_buf); break; case 'G': set_desired_inferior (1); registers_from_string (&own_buf[1]); write_ok (own_buf); break; case 'm': decode_m_packet (&own_buf[1], &mem_addr, &len); if (read_inferior_memory (mem_addr, mem_buf, len) == 0) convert_int_to_ascii (mem_buf, own_buf, len); else write_enn (own_buf); break; case 'M': decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); if (write_inferior_memory (mem_addr, mem_buf, len) == 0) write_ok (own_buf); else write_enn (own_buf); break; case 'C': convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; set_desired_inferior (0); myresume (0, signal); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'S': convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; set_desired_inferior (0); myresume (1, signal); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'c': set_desired_inferior (0); myresume (0, 0); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 's': set_desired_inferior (0); myresume (1, 0); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'k': fprintf (stderr, "Killing inferior\n"); kill_inferior (); /* When using the extended protocol, we start up a new debugging session. The traditional protocol will exit instead. */ if (extended_protocol) { write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { exit (0); break; } case 'T': if (mythread_alive (strtol (&own_buf[1], NULL, 16))) write_ok (own_buf); else write_enn (own_buf); break; case 'R': /* Restarting the inferior is only supported in the extended protocol. */ if (extended_protocol) { kill_inferior (); write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } case 'v': /* Extended (long) request. */ handle_v_requests (own_buf, &status, &signal); break; default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } putpkt (own_buf); if (status == 'W') fprintf (stderr, "\nChild exited with status %d\n", signal); if (status == 'X') fprintf (stderr, "\nChild terminated with signal = 0x%x\n", signal); if (status == 'W' || status == 'X') { if (extended_protocol) { fprintf (stderr, "Killing inferior\n"); kill_inferior (); write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { fprintf (stderr, "GDBserver exiting\n"); exit (0); } } } /* We come here when getpkt fails. For the extended remote protocol we exit (and this is the only way we gracefully exit!). For the traditional remote protocol close the connection, and re-open it at the top of the loop. */ if (extended_protocol) { remote_close (); exit (0); } else { fprintf (stderr, "Remote side has terminated connection. " "GDBserver will reopen the connection.\n"); remote_close (); } } }
void db_update_remotes(YAAMP_DB *db) { db_query(db, "select id, speed/1000000, host, port, username, password, time, price, renterid from jobs where active and ready and algo='%s' order by time", g_stratum_algo); MYSQL_RES *result = mysql_store_result(&db->mysql); if(!result) yaamp_error("Cant query database"); MYSQL_ROW row; g_list_remote.Enter(); while((row = mysql_fetch_row(result)) != NULL) { if(!row[0] || !row[1] || !row[2] || !row[3] || !row[4] || !row[5] || !row[6] || !row[7]) continue; bool newremote = false; YAAMP_REMOTE *remote = (YAAMP_REMOTE *)object_find(&g_list_remote, atoi(row[0])); if(!remote) { remote = new YAAMP_REMOTE; memset(remote, 0, sizeof(YAAMP_REMOTE)); remote->id = atoi(row[0]); newremote = true; } // else if(remote->reset_balance) // continue; else if(row[6] && atoi(row[6]) > remote->updated) remote->status = YAAMP_REMOTE_RESET; remote->speed = atof(row[1]); strcpy(remote->host, row[2]); remote->port = atoi(row[3]); strcpy(remote->username, row[4]); strcpy(remote->password, row[5]); remote->updated = atoi(row[6]); remote->price = atof(row[7]); remote->touch = true; remote->submit_last = NULL; int renterid = row[8]? atoi(row[8]): 0; if(renterid && !remote->renter) remote->renter = (YAAMP_RENTER *)object_find(&g_list_renter, renterid); if(newremote) { if(remote->renter && remote->renter->balance <= 0.00001000) { debuglog("dont load that job %d\n", remote->id); delete remote; continue; } pthread_t thread; pthread_create(&thread, NULL, remote_thread, remote); pthread_detach(thread); g_list_remote.AddTail(remote); usleep(100*YAAMP_MS); } if(remote->renter) { if(!strcmp(g_current_algo->name, "sha256")) remote->speed = min(remote->speed, max(remote->renter->balance/g_current_algo->rent*100000000, 1)); else remote->speed = min(remote->speed, max(remote->renter->balance/g_current_algo->rent*100000, 1)); } } mysql_free_result(result); /////////////////////////////////////////////////////////////////////////////////////////// for(CLI li = g_list_remote.first; li; li = li->next) { YAAMP_REMOTE *remote = (YAAMP_REMOTE *)li->data; // if(remote->reset_balance && remote->renter) // { // db_query(db, "update renters set balance=0 where id=%d", remote->renter->id); // db_query(db, "update jobs set ready=false, active=false where renterid=%d", remote->renter->id); // // remote->reset_balance = false; // } if(remote->deleted) continue; if(remote->kill) { debuglog("******* kill that sucka %s\n", remote->host); pthread_cancel(remote->thread); object_delete(remote); continue; } if(remote->sock && remote->sock->last_read && remote->sock->last_read+120<time(NULL)) { debuglog("****** timeout %s\n", remote->host); remote->status = YAAMP_REMOTE_TERMINATE; remote->kill = true; remote_close(remote); continue; } if(!remote->touch) { remote->status = YAAMP_REMOTE_TERMINATE; continue; } remote->touch = false; if(remote->difficulty_written != remote->difficulty_actual) { remote->difficulty_written = remote->difficulty_actual; db_query(db, "update jobs set difficulty=%f where id=%d", remote->difficulty_actual, remote->id); } } // remote_sort(); g_list_remote.Leave(); }
int main (int argc, char *argv[]) { char ch, status, *own_buf; unsigned char *mem_buf; int i = 0; int signal; unsigned int len; CORE_ADDR mem_addr; int bad_attach; int pid; char *arg_end; my_stdout = stdout; my_stderr = stderr; myname = argv[0]; if (argc >= 2 && strcmp (argv[1], "--version") == 0) { gdbserver_version (); exit (0); } if (argc >= 2 && strcmp (argv[1], "--help") == 0) { gdbserver_usage (); exit (0); } if (setjmp (toplevel)) { warning ("Exiting"); exit (1); } bad_attach = 0; pid = 0; attached = 0; if (argc >= 3 && strcmp (argv[2], "--attach") == 0) { if (argc == 4 && argv[3][0] != '\0' && (pid = strtoul (argv[3], &arg_end, 10)) != 0 && *arg_end == '\0') { ; } else bad_attach = 1; } if (argc < 3 || bad_attach) { gdbserver_usage (); exit (1); } if (strcmp (argv[1], "pipe") == 0) { my_stdout = my_stderr = stderr; } initialize_low (); own_buf = malloc (PBUFSIZ + 1); mem_buf = malloc (PBUFSIZ); if (pid == 0) { /* Wait till we are at first instruction in program. */ signal = start_inferior (&argv[2], &status); /* We are now (hopefully) stopped at the first instruction of the target process. This assumes that the target process was successfully created. */ /* Don't report shared library events on the initial connection, even if some libraries are preloaded. */ dlls_changed = 0; } else { switch (attach_inferior (pid, &status, &signal)) { case -1: error ("Attaching not supported on this target"); break; default: attached = 1; break; } } if (setjmp (toplevel)) { warning ("Killing inferior"); kill_inferior (); exit (1); } if (status == 'W' || status == 'X') { warning ("No inferior, GDBserver exiting."); exit (1); } while (1) { remote_open (argv[1]); restart: if (setjmp (toplevel)) { if (remote_debug) printf_filtered ("gdbserver: error returned to main loop\n"); write_enn (own_buf); putpkt (own_buf); } while (1) { unsigned char sig; int packet_len; int new_packet_len = -1; packet_len = getpkt (own_buf, PBUFSIZ); if (packet_len <= 0) break; i = 0; ch = own_buf[i++]; switch (ch) { case 'q': handle_query (own_buf, packet_len, &new_packet_len); break; case 'Q': handle_general_set (own_buf); break; case 'D': warning ("Detaching from inferior"); if (detach_inferior () != 0) { write_enn (own_buf); putpkt (own_buf); } else { write_ok (own_buf); putpkt (own_buf); remote_close (); /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ if (!attached) join_inferior (); exit (0); } case '!': if (attached == 0) { extended_protocol = 1; prepare_resume_reply (own_buf, status, signal); } else { /* We can not use the extended protocol if we are attached, because we can not restart the running program. So return unrecognized. */ own_buf[0] = '\0'; } break; case '?': prepare_resume_reply (own_buf, status, signal); break; case 'H': if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') { unsigned long gdb_id, thread_id; gdb_id = strtoul (&own_buf[2], NULL, 16); thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } if (own_buf[1] == 'g') { general_thread = thread_id; set_desired_inferior (1); } else if (own_buf[1] == 'c') cont_thread = thread_id; else if (own_buf[1] == 's') step_thread = thread_id; write_ok (own_buf); } else { /* Silently ignore it so that gdb can extend the protocol without compatibility headaches. */ own_buf[0] = '\0'; } break; case 'g': set_desired_inferior (1); registers_to_string (own_buf); break; case 'G': set_desired_inferior (1); registers_from_string (&own_buf[1]); write_ok (own_buf); break; case 'm': decode_m_packet (&own_buf[1], &mem_addr, &len); if (read_inferior_memory (mem_addr, mem_buf, len) == 0) convert_int_to_ascii (mem_buf, own_buf, len); else write_enn (own_buf); break; case 'M': decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); if (write_inferior_memory (mem_addr, mem_buf, len) == 0) write_ok (own_buf); else write_enn (own_buf); break; case 'X': if (decode_X_packet (&own_buf[1], packet_len - 1, &mem_addr, &len, mem_buf) < 0 || write_inferior_memory (mem_addr, mem_buf, len) != 0) write_enn (own_buf); else write_ok (own_buf); break; case 'C': convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; set_desired_inferior (0); myresume (0, signal); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'S': convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; set_desired_inferior (0); myresume (1, signal); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'c': set_desired_inferior (0); myresume (0, 0); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 's': set_desired_inferior (0); myresume (1, 0); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'z': case 'Z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->insert_watchpoint == NULL || the_target->remove_watchpoint == NULL || (type < '0' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; if (ch == 'z') res = (*the_target->remove_watchpoint) (type, addr, len); else res = (*the_target->insert_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'k': warning ("Killing inferior"); kill_inferior (); /* When using the extended protocol, we start up a new debugging session. The traditional protocol will exit instead. */ if (extended_protocol) { write_ok (own_buf); warning ("GDBserver restarting"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { exit (0); break; } case 'T': { unsigned long gdb_id, thread_id; gdb_id = strtoul (&own_buf[1], NULL, 16); thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } if (mythread_alive (thread_id)) write_ok (own_buf); else write_enn (own_buf); } break; case 'R': /* Restarting the inferior is only supported in the extended protocol. */ if (extended_protocol) { kill_inferior (); write_ok (own_buf); warning ("GDBserver restarting"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } case 'v': /* Extended (long) request. */ handle_v_requests (own_buf, &status, &signal); break; default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } if (new_packet_len != -1) putpkt_binary (own_buf, new_packet_len); else putpkt (own_buf); if (status == 'W') warning ("\nChild exited with status %d", signal); if (status == 'X') warning ("\nChild terminated with signal = 0x%x (%s)", target_signal_to_host (signal), target_signal_to_name (signal)); if (status == 'W' || status == 'X') { if (extended_protocol) { warning ("Killing inferior"); kill_inferior (); write_ok (own_buf); warning ("GDBserver restarting"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { warning ("GDBserver exiting"); exit (0); } } } /* We come here when getpkt fails. For the extended remote protocol we exit (and this is the only way we gracefully exit!). For the traditional remote protocol close the connection, and re-open it at the top of the loop. */ if (extended_protocol) { remote_close (); exit (0); } else { warning ("Remote side has terminated connection. " "GDBserver will reopen the connection."); remote_close (); } } }
int main (int argc, char *argv[]) { char ch, status, *own_buf; unsigned char *mem_buf; int i = 0; int signal; unsigned int len; CORE_ADDR mem_addr; int bad_attach; int pid; char *arg_end, *port; char **next_arg = &argv[1]; int multi_mode = 0; int attach = 0; int was_running; while (*next_arg != NULL && **next_arg == '-') { if (strcmp (*next_arg, "--version") == 0) { gdbserver_version (); exit (0); } else if (strcmp (*next_arg, "--help") == 0) { gdbserver_usage (stdout); exit (0); } else if (strcmp (*next_arg, "--attach") == 0) attach = 1; else if (strcmp (*next_arg, "--multi") == 0) multi_mode = 1; else if (strcmp (*next_arg, "--wrapper") == 0) { next_arg++; wrapper_argv = next_arg; while (*next_arg != NULL && strcmp (*next_arg, "--") != 0) next_arg++; if (next_arg == wrapper_argv || *next_arg == NULL) { gdbserver_usage (stderr); exit (1); } /* Consume the "--". */ *next_arg = NULL; } else if (strcmp (*next_arg, "--debug") == 0) debug_threads = 1; else if (strcmp (*next_arg, "--disable-packet") == 0) { gdbserver_show_disableable (stdout); exit (0); } else if (strncmp (*next_arg, "--disable-packet=", sizeof ("--disable-packet=") - 1) == 0) { char *packets, *tok; packets = *next_arg += sizeof ("--disable-packet=") - 1; for (tok = strtok (packets, ","); tok != NULL; tok = strtok (NULL, ",")) { if (strcmp ("vCont", tok) == 0) disable_packet_vCont = 1; else if (strcmp ("Tthread", tok) == 0) disable_packet_Tthread = 1; else if (strcmp ("qC", tok) == 0) disable_packet_qC = 1; else if (strcmp ("qfThreadInfo", tok) == 0) disable_packet_qfThreadInfo = 1; else if (strcmp ("threads", tok) == 0) { disable_packet_vCont = 1; disable_packet_Tthread = 1; disable_packet_qC = 1; disable_packet_qfThreadInfo = 1; } else { fprintf (stderr, "Don't know how to disable \"%s\".\n\n", tok); gdbserver_show_disableable (stderr); exit (1); } } } else { fprintf (stderr, "Unknown argument: %s\n", *next_arg); exit (1); } next_arg++; continue; } if (setjmp (toplevel)) { fprintf (stderr, "Exiting\n"); exit (1); } port = *next_arg; next_arg++; if (port == NULL || (!attach && !multi_mode && *next_arg == NULL)) { gdbserver_usage (stderr); exit (1); } bad_attach = 0; pid = 0; /* --attach used to come after PORT, so allow it there for compatibility. */ if (*next_arg != NULL && strcmp (*next_arg, "--attach") == 0) { attach = 1; next_arg++; } if (attach && (*next_arg == NULL || (*next_arg)[0] == '\0' || (pid = strtoul (*next_arg, &arg_end, 0)) == 0 || *arg_end != '\0' || next_arg[1] != NULL)) bad_attach = 1; if (bad_attach) { gdbserver_usage (stderr); exit (1); } initialize_async_io (); initialize_low (); own_buf = malloc (PBUFSIZ + 1); mem_buf = malloc (PBUFSIZ); if (pid == 0 && *next_arg != NULL) { int i, n; n = argc - (next_arg - argv); program_argv = malloc (sizeof (char *) * (n + 1)); for (i = 0; i < n; i++) program_argv[i] = strdup (next_arg[i]); program_argv[i] = NULL; /* Wait till we are at first instruction in program. */ signal = start_inferior (program_argv, &status); /* We are now (hopefully) stopped at the first instruction of the target process. This assumes that the target process was successfully created. */ } else if (pid != 0) { if (attach_inferior (pid, &status, &signal) == -1) error ("Attaching not supported on this target"); /* Otherwise succeeded. */ } else { status = 'W'; signal = 0; } /* Don't report shared library events on the initial connection, even if some libraries are preloaded. Avoids the "stopped by shared library event" notice on gdb side. */ dlls_changed = 0; if (setjmp (toplevel)) { fprintf (stderr, "Killing inferior\n"); kill_inferior (); exit (1); } if (status == 'W' || status == 'X') was_running = 0; else was_running = 1; if (!was_running && !multi_mode) { fprintf (stderr, "No program to debug. GDBserver exiting.\n"); exit (1); } while (1) { noack_mode = 0; remote_open (port); restart: if (setjmp (toplevel) != 0) { /* An error occurred. */ if (response_needed) { write_enn (own_buf); putpkt (own_buf); } } disable_async_io (); while (!exit_requested) { unsigned char sig; int packet_len; int new_packet_len = -1; response_needed = 0; packet_len = getpkt (own_buf); if (packet_len <= 0) break; response_needed = 1; i = 0; ch = own_buf[i++]; switch (ch) { case 'q': handle_query (own_buf, packet_len, &new_packet_len); break; case 'Q': handle_general_set (own_buf); break; case 'D': require_running (own_buf); fprintf (stderr, "Detaching from inferior\n"); if (detach_inferior () != 0) write_enn (own_buf); else { write_ok (own_buf); if (extended_protocol) { /* Treat this like a normal program exit. */ signal = 0; status = 'W'; } else { putpkt (own_buf); remote_close (); /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ if (!attached) join_inferior (); exit (0); } } break; case '!': extended_protocol = 1; write_ok (own_buf); break; case '?': prepare_resume_reply (own_buf, status, signal); break; case 'H': if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') { unsigned long gdb_id, thread_id; require_running (own_buf); gdb_id = strtoul (&own_buf[2], NULL, 16); if (gdb_id == 0 || gdb_id == -1) thread_id = gdb_id; else { thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } } if (own_buf[1] == 'g') { general_thread = thread_id; set_desired_inferior (1); } else if (own_buf[1] == 'c') cont_thread = thread_id; else if (own_buf[1] == 's') step_thread = thread_id; write_ok (own_buf); } else { /* Silently ignore it so that gdb can extend the protocol without compatibility headaches. */ own_buf[0] = '\0'; } break; case 'g': require_running (own_buf); set_desired_inferior (1); registers_to_string (own_buf); break; case 'G': require_running (own_buf); set_desired_inferior (1); registers_from_string (&own_buf[1]); write_ok (own_buf); break; case 'm': require_running (own_buf); decode_m_packet (&own_buf[1], &mem_addr, &len); if (read_inferior_memory (mem_addr, mem_buf, len) == 0) convert_int_to_ascii (mem_buf, own_buf, len); else write_enn (own_buf); break; case 'M': require_running (own_buf); decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); if (write_inferior_memory (mem_addr, mem_buf, len) == 0) write_ok (own_buf); else write_enn (own_buf); break; case 'X': require_running (own_buf); if (decode_X_packet (&own_buf[1], packet_len - 1, &mem_addr, &len, mem_buf) < 0 || write_inferior_memory (mem_addr, mem_buf, len) != 0) write_enn (own_buf); else write_ok (own_buf); break; case 'C': require_running (own_buf); convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; myresume (own_buf, 0, &signal, &status); break; case 'S': require_running (own_buf); convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; myresume (own_buf, 1, &signal, &status); break; case 'c': require_running (own_buf); signal = 0; myresume (own_buf, 0, &signal, &status); break; case 's': require_running (own_buf); signal = 0; myresume (own_buf, 1, &signal, &status); break; case 'Z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->insert_watchpoint == NULL || (type < '2' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; require_running (own_buf); res = (*the_target->insert_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->remove_watchpoint == NULL || (type < '2' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; require_running (own_buf); res = (*the_target->remove_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'k': response_needed = 0; if (!target_running ()) /* The packet we received doesn't make sense - but we can't reply to it, either. */ goto restart; fprintf (stderr, "Killing inferior\n"); kill_inferior (); /* When using the extended protocol, we wait with no program running. The traditional protocol will exit instead. */ if (extended_protocol) { status = 'X'; signal = TARGET_SIGNAL_KILL; was_running = 0; goto restart; } else { exit (0); break; } case 'T': { unsigned long gdb_id, thread_id; require_running (own_buf); gdb_id = strtoul (&own_buf[1], NULL, 16); thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } if (mythread_alive (thread_id)) write_ok (own_buf); else write_enn (own_buf); } break; case 'R': response_needed = 0; /* Restarting the inferior is only supported in the extended protocol. */ if (extended_protocol) { if (target_running ()) kill_inferior (); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ if (program_argv != NULL) signal = start_inferior (program_argv, &status); else { status = 'X'; signal = TARGET_SIGNAL_KILL; } goto restart; } else { /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } case 'v': /* Extended (long) request. */ handle_v_requests (own_buf, &status, &signal, packet_len, &new_packet_len); break; default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } if (new_packet_len != -1) putpkt_binary (own_buf, new_packet_len); else putpkt (own_buf); response_needed = 0; if (was_running && (status == 'W' || status == 'X')) { was_running = 0; if (status == 'W') fprintf (stderr, "\nChild exited with status %d\n", signal); if (status == 'X') fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n", target_signal_to_host (signal), target_signal_to_name (signal)); if (extended_protocol) goto restart; else { fprintf (stderr, "GDBserver exiting\n"); exit (0); } } if (status != 'W' && status != 'X') was_running = 1; } /* If an exit was requested (using the "monitor exit" command), terminate now. The only other way to get here is for getpkt to fail; close the connection and reopen it at the top of the loop. */ if (exit_requested) { remote_close (); if (attached && target_running ()) detach_inferior (); else if (target_running ()) kill_inferior (); exit (0); } else { fprintf (stderr, "Remote side has terminated connection. " "GDBserver will reopen the connection.\n"); remote_close (); } } }
void gdbserver_main (void) { CORE_ADDR mem_addr; char *own_buf; unsigned char *mem_buf; int i = 0; unsigned int len; own_buf = malloc (PBUFSIZ + 1); mem_buf = malloc (PBUFSIZ); while (1) { remote_open (port); restart: #if 0 if (setjmp (toplevel) != 0) { /* An error occurred. */ if (response_needed) { write_enn (own_buf); putpkt (own_buf); } } #endif disable_async_io (); while (!exit_requested) { unsigned char sig; int packet_len; int new_packet_len = -1; response_needed = 0; packet_len = getpkt (own_buf); if (packet_len <= 0) break; response_needed = 1; i = 0; ch = own_buf[i++]; switch (ch) { case 'q': handle_query (own_buf, packet_len, &new_packet_len); break; case 'Q': handle_general_set (own_buf); break; case 'D': require_running (own_buf); fprintf (stderr, "Detaching from inferior\n"); if (detach_inferior () != 0) write_enn (own_buf); else { write_ok (own_buf); if (extended_protocol) { /* Treat this like a normal program exit. */ signal = 0; status = 'W'; } else { putpkt (own_buf); remote_close (); /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ if (!attached) join_inferior (); exit (0); } } break; case '!': extended_protocol = 1; write_ok (own_buf); break; case '?': prepare_resume_reply (own_buf, status, signal); break; case 'H': if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') { unsigned long gdb_id, thread_id; require_running (own_buf); gdb_id = strtoul (&own_buf[2], NULL, 16); if (gdb_id == 0 || gdb_id == -1) thread_id = gdb_id; else { thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } } if (own_buf[1] == 'g') { general_thread = thread_id; set_desired_inferior (1); } else if (own_buf[1] == 'c') cont_thread = thread_id; else if (own_buf[1] == 's') step_thread = thread_id; write_ok (own_buf); } else { /* Silently ignore it so that gdb can extend the protocol without compatibility headaches. */ own_buf[0] = '\0'; } break; case 'g': require_running (own_buf); set_desired_inferior (1); registers_to_string (own_buf); break; case 'G': require_running (own_buf); set_desired_inferior (1); registers_from_string (&own_buf[1]); write_ok (own_buf); break; case 'm': require_running (own_buf); decode_m_packet (&own_buf[1], &mem_addr, &len); if (read_inferior_memory (mem_addr, mem_buf, len) == 0) convert_int_to_ascii (mem_buf, own_buf, len); else write_enn (own_buf); break; case 'M': require_running (own_buf); decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); if (write_inferior_memory (mem_addr, mem_buf, len) == 0) write_ok (own_buf); else write_enn (own_buf); break; case 'X': require_running (own_buf); if (decode_X_packet (&own_buf[1], packet_len - 1, &mem_addr, &len, mem_buf) < 0 || write_inferior_memory (mem_addr, mem_buf, len) != 0) write_enn (own_buf); else write_ok (own_buf); break; case 'C': require_running (own_buf); convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; myresume (own_buf, 0, &signal, &status); break; case 'S': require_running (own_buf); convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; myresume (own_buf, 1, &signal, &status); break; case 'c': require_running (own_buf); signal = 0; myresume (own_buf, 0, &signal, &status); break; case 's': require_running (own_buf); signal = 0; myresume (own_buf, 1, &signal, &status); break; case 'Z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->insert_watchpoint == NULL || (type < '2' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; require_running (own_buf); res = (*the_target->insert_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->remove_watchpoint == NULL || (type < '2' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; require_running (own_buf); res = (*the_target->remove_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'k': response_needed = 0; if (!target_running ()) /* The packet we received doesn't make sense - but we can't reply to it, either. */ goto restart; fprintf (stderr, "Killing inferior\n"); kill_inferior (); /* When using the extended protocol, we wait with no program running. The traditional protocol will exit instead. */ if (extended_protocol) { status = 'X'; signal = TARGET_SIGNAL_KILL; was_running = 0; goto restart; } else { exit (0); break; } case 'T': { unsigned long gdb_id, thread_id; require_running (own_buf); gdb_id = strtoul (&own_buf[1], NULL, 16); thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } if (mythread_alive (thread_id)) write_ok (own_buf); else write_enn (own_buf); } break; case 'R': response_needed = 0; /* Restarting the inferior is only supported in the extended protocol. */ if (extended_protocol) { if (target_running ()) kill_inferior (); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ if (program_argv != NULL) signal = start_inferior (program_argv, &status); else { status = 'X'; signal = TARGET_SIGNAL_KILL; } goto restart; } else { /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } case 'v': /* Extended (long) request. */ handle_v_requests (own_buf, &status, &signal, packet_len, &new_packet_len); break; default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } if (new_packet_len != -1) putpkt_binary (own_buf, new_packet_len); else putpkt (own_buf); response_needed = 0; if (was_running && (status == 'W' || status == 'X')) { was_running = 0; if (status == 'W') fprintf (stderr, "\nChild exited with status %d\n", signal); if (status == 'X') fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n", target_signal_to_host (signal), target_signal_to_name (signal)); if (extended_protocol) goto restart; else { fprintf (stderr, "GDBserver exiting\n"); exit (0); } } if (status != 'W' && status != 'X') was_running = 1; } /* If an exit was requested (using the "monitor exit" command), terminate now. The only other way to get here is for getpkt to fail; close the connection and reopen it at the top of the loop. */ if (exit_requested) { remote_close (); if (attached && target_running ()) detach_inferior (); else if (target_running ()) kill_inferior (); exit (0); } else { fprintf (stderr, "Remote side has terminated connection. " "GDBserver will reopen the connection.\n"); remote_close (); } } }
int main (int argc, char *argv[]) { char ch, status, *own_buf; unsigned char *mem_buf; int i = 0; int signal; unsigned int len; CORE_ADDR mem_addr; int bad_attach; int pid; char *arg_end; if (argc >= 2 && strcmp (argv[1], "--version") == 0) { gdbserver_version (); exit (0); } if (argc >= 2 && strcmp (argv[1], "--help") == 0) { gdbserver_usage (); exit (0); } if (setjmp (toplevel)) { fprintf (stderr, "Exiting\n"); exit (1); } bad_attach = 0; pid = 0; attached = 0; if (argc >= 3 && strcmp (argv[2], "--attach") == 0) { if (argc == 4 && argv[3] != '\0' && (pid = strtoul (argv[3], &arg_end, 10)) != 0 && *arg_end == '\0') { ; } else bad_attach = 1; } if (argc < 3 || bad_attach) { gdbserver_usage (); exit (1); } initialize_low (); own_buf = malloc (PBUFSIZ); mem_buf = malloc (PBUFSIZ); if (pid == 0) { /* Wait till we are at first instruction in program. */ signal = start_inferior (&argv[2], &status); /* start_inferior() returns an integer, but the wait * function returns an unsigned char. in the case of * of an error, the wait returns -1 which means 255. */ if (status == 'W' || status == 'X') { fprintf (stderr, "Aborting server; child exited with %i\n", signal); exit (signal); } /* We are now stopped at the first instruction of the target process */ } else { switch (attach_inferior (pid, &status, &signal)) { case -1: error ("Attaching not supported on this target"); break; default: attached = 1; break; } } while (1) { remote_open (argv[1]); restart: setjmp (toplevel); while (1) { unsigned char sig; int packet_len; int new_packet_len = -1; packet_len = getpkt (own_buf); if (packet_len <= 0) break; i = 0; ch = own_buf[i++]; switch (ch) { case 'q': handle_query (own_buf, &new_packet_len); break; case 'd': remote_debug = !remote_debug; break; #ifndef USE_WIN32API /* Skip "detach" support on mingw32, since we don't have waitpid. */ case 'D': fprintf (stderr, "Detaching from inferior\n"); detach_inferior (); write_ok (own_buf); putpkt (own_buf); remote_close (); /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ if (!attached) { int status, ret; do { ret = waitpid (signal_pid, &status, 0); if (WIFEXITED (status) || WIFSIGNALED (status)) break; } while (ret != -1 || errno != ECHILD); } exit (0); #endif case '!': if (attached == 0) { extended_protocol = 1; prepare_resume_reply (own_buf, status, signal); } else { /* We can not use the extended protocol if we are attached, because we can not restart the running program. So return unrecognized. */ own_buf[0] = '\0'; } break; case '?': prepare_resume_reply (own_buf, status, signal); break; case 'H': if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') { unsigned long gdb_id, thread_id; gdb_id = strtoul (&own_buf[2], NULL, 16); thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } if (own_buf[1] == 'g') { general_thread = thread_id; set_desired_inferior (1); } else if (own_buf[1] == 'c') cont_thread = thread_id; else if (own_buf[1] == 's') step_thread = thread_id; write_ok (own_buf); } else { /* Silently ignore it so that gdb can extend the protocol without compatibility headaches. */ own_buf[0] = '\0'; } break; case 'g': set_desired_inferior (1); registers_to_string (own_buf); break; case 'G': set_desired_inferior (1); registers_from_string (&own_buf[1]); write_ok (own_buf); break; case 'm': decode_m_packet (&own_buf[1], &mem_addr, &len); if (read_inferior_memory (mem_addr, mem_buf, len) == 0) convert_int_to_ascii (mem_buf, own_buf, len); else write_enn (own_buf); break; case 'M': decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); if (write_inferior_memory (mem_addr, mem_buf, len) == 0) write_ok (own_buf); else write_enn (own_buf); break; case 'X': if (decode_X_packet (&own_buf[1], packet_len - 1, &mem_addr, &len, mem_buf) < 0 || write_inferior_memory (mem_addr, mem_buf, len) != 0) write_enn (own_buf); else write_ok (own_buf); break; case 'C': convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; set_desired_inferior (0); myresume (0, signal); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'S': convert_ascii_to_int (own_buf + 1, &sig, 1); if (target_signal_to_host_p (sig)) signal = target_signal_to_host (sig); else signal = 0; set_desired_inferior (0); myresume (1, signal); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'c': set_desired_inferior (0); myresume (0, 0); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 's': set_desired_inferior (0); myresume (1, 0); signal = mywait (&status, 1); prepare_resume_reply (own_buf, status, signal); break; case 'Z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->insert_watchpoint == NULL || (type < '2' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; res = (*the_target->insert_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'z': { char *lenptr; char *dataptr; CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16); int len = strtol (lenptr + 1, &dataptr, 16); char type = own_buf[1]; if (the_target->remove_watchpoint == NULL || (type < '2' || type > '4')) { /* No watchpoint support or not a watchpoint command; unrecognized either way. */ own_buf[0] = '\0'; } else { int res; res = (*the_target->remove_watchpoint) (type, addr, len); if (res == 0) write_ok (own_buf); else if (res == 1) /* Unsupported. */ own_buf[0] = '\0'; else write_enn (own_buf); } break; } case 'k': fprintf (stderr, "Killing inferior\n"); kill_inferior (); /* When using the extended protocol, we start up a new debugging session. The traditional protocol will exit instead. */ if (extended_protocol) { write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { exit (0); break; } case 'T': { unsigned long gdb_id, thread_id; gdb_id = strtoul (&own_buf[1], NULL, 16); thread_id = gdb_id_to_thread_id (gdb_id); if (thread_id == 0) { write_enn (own_buf); break; } if (mythread_alive (thread_id)) write_ok (own_buf); else write_enn (own_buf); } break; case 'R': /* Restarting the inferior is only supported in the extended protocol. */ if (extended_protocol) { kill_inferior (); write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } case 'v': /* Extended (long) request. */ handle_v_requests (own_buf, &status, &signal); break; default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } if (new_packet_len != -1) putpkt_binary (own_buf, new_packet_len); else putpkt (own_buf); if (status == 'W') fprintf (stderr, "\nChild exited with status %d\n", signal); if (status == 'X') fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n", target_signal_to_host (signal), target_signal_to_name (signal)); if (status == 'W' || status == 'X') { if (extended_protocol) { fprintf (stderr, "Killing inferior\n"); kill_inferior (); write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { fprintf (stderr, "GDBserver exiting\n"); exit (0); } } } /* We come here when getpkt fails. For the extended remote protocol we exit (and this is the only way we gracefully exit!). For the traditional remote protocol close the connection, and re-open it at the top of the loop. */ if (extended_protocol) { remote_close (); exit (0); } else { fprintf (stderr, "Remote side has terminated connection. " "GDBserver will reopen the connection.\n"); remote_close (); } } }
static int uvvp_vdec_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret=0; int i, j; //int recv_buf[256]; //int send_buf[256]; //int num = 0; // For UVVP_VDEC_TEST_VERSION_1 int reg_in = 0; int reg_out = 0; // For UVVP_VDEC_TEST_VERSION_2 int mem_sz = 1; UCHAR *p = NULL; unsigned int u4Align = 1024; unsigned int u4Size = 16384; unsigned char *buf_data; unsigned char *buf_data2; UINT32 u4RetValue; // For UVVP_VDEC_TEST_VERSION_3 struct termios settings; struct file *fd = 0; mm_segment_t oldfs; unsigned long crc = 0; unsigned long own_crc = 0; int frame_start = 0; int frame_end= 0; int file_num = 0; int file_len = 0; int read_len = 0; int tmp_buf[256]; // For speed measurement struct timeval tv1; struct timeval tv2; //struct file * pfilename; VDEC_PARAM_T *param; #if (VDEC_MVC_SUPPORT) VDEC_PARAM_T *param1; #endif printk("\r\n******** uvvp_vdec_ioctl cmd[%d]********\r\n",cmd); param = kmalloc(sizeof(VDEC_PARAM_T), GFP_KERNEL); #if (VDEC_MVC_SUPPORT) param1 = kmalloc(sizeof(VDEC_PARAM_T), GFP_KERNEL); #endif switch (cmd) { // General TEST CASE case UVVP_VDEC_TEST_VERSION: param->u4InstanceId = 0; param->u4Mode = 0; #if (VDEC_MVC_SUPPORT) param->fgMVCType = TRUE; #else param->fgMVCType = FALSE; #endif printk("\r\n******** uvvp_vdec_ioctl UVVP_VDEC_TEST_VERSION ********\r\n"); #if VDEC_VP8_WEBP_SUPPORT_ME2_INTEGRATION vVDecVerifyThread(param); vVerInitVDec(0); vVParserProc(0); vVDecProc(0); #if VP8_MB_ROW_MODE_SUPPORT_ME2_INTEGRATION while(1) { u4RetValue = vVerVP8DecEndProc_MB_ROW_START(0); if (u4RetValue == vVerResult_MB_ROW_DONE) { printk("\n\n======== MB ROW DONE!! ========\n\n"); } else if(u4RetValue == vVerResult_FRAME_DONE) { printk("\n\n======== FRAME DONE!! ========\n\n"); break; } else { printk("\n\n[ERROR]======== decode timeout!! ========\n\n"); break; } } vChkVDec_Webp_Row_Mode(0); #else vChkVDec(0); #endif #ifdef PCFILE_WRITE if(_tInFileInfo[param->u4InstanceId].pFile) { fclose(_tInFileInfo[param->u4InstanceId].pFile); } #endif vVerifyVDecIsrStop(param->u4InstanceId); vMemoryFree(param->u4InstanceId); #ifdef SATA_HDD_READ_SUPPORT #ifdef SATA_HDD_FS_SUPPORT if (_tFileListInfo[param->u4InstanceId].i4FileId != 0xFFFFFFFF) { // fgHDDFsCloseFile(u4InstID); // temp avoid system crash _tFileListInfo[param->u4InstanceId].i4FileId = 0xFFFFFFFF; } //FS mount fgHDDFsUnMount(0); #endif #endif #else MPV_thread = kthread_run(vVDecVerifyThread, param, "rt8192cu_rtw_xmit_thread"); if (IS_ERR(MPV_thread)) { printk("[%s]: failed to create MPV thread\n", __FUNCTION__); return 0; } else { printk("Creat mpv0 thread ok!\n"); } // break; // case UVVP_VDEC_TEST_VERSION_1: #if (VDEC_MVC_SUPPORT) param1->u4InstanceId = 1; param1->u4Mode = 0; param1->fgMVCType = TRUE; msleep(2); MPV_thread = kthread_run(vVDecVerifyThread, param1, "rt8192cu_rtw_xmit_thread"); if (IS_ERR(MPV_thread)) { printk("[%s]: failed to create MPV thread\n", __FUNCTION__); return 0; } else { printk("Creat mpv1 thread ok!\n"); } #endif #endif break; case UVVP_VDEC_TEST_VERSION_1: printk("UVVP_VDEC_TEST_VERSION_1\n"); reg_in = 0x1; reg_out = 0; MFV_HW_WRITE(VDEC_GCON_BASE, reg_in); reg_out = MFV_HW_READ(VDEC_GCON_BASE); printk("GCON write 0x%x, read 0x%x, %s\n", reg_in, reg_out, reg_in == reg_out ? "Pass":"******"); reg_in = 0xFFFFFFFF; reg_out = 0; MFV_HW_WRITE((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R1Y_ADD), reg_in); reg_out = MFV_HW_READ((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R1Y_ADD)); printk("OFFSET_R1Y_ADD write 0x%x, read 0x%x, mask 0x%x, %s\n", reg_in, reg_out, Y_MASK, (reg_in & Y_MASK) == reg_out ? "Pass":"******"); reg_in = 0xFFFFFFFF; reg_out = 0; MFV_HW_WRITE((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R1C_ADD), reg_in); reg_out = MFV_HW_READ((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R1C_ADD)); printk("OFFSET_R1C_ADD write 0x%x, read 0x%x, mask 0x%x, %s\n", reg_in, reg_out, C_MASK, (reg_in & C_MASK) == reg_out ? "Pass":"******"); reg_in = 0xFFFFFFFF; reg_out = 0; MFV_HW_WRITE((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R2Y_ADD), reg_in); reg_out = MFV_HW_READ((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R2Y_ADD)); printk("OFFSET_R2Y_ADD write 0x%x, read 0x%x, mask 0x%x, %s\n", reg_in, reg_out, Y_MASK, (reg_in & Y_MASK) == reg_out ? "Pass":"******"); reg_in = 0xFFFFFFFF; reg_out = 0; MFV_HW_WRITE((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R2C_ADD), reg_in); reg_out = MFV_HW_READ((VDEC_BASE + MC_BASE_OFFSET + OFFSET_R2C_ADD)); printk("OFFSET_R2C_ADD write 0x%x, read 0x%x, mask 0x%x, %s\n", reg_in, reg_out, C_MASK, (reg_in & C_MASK) == reg_out ? "Pass":"******"); break; case UVVP_VDEC_TEST_VERSION_2: printk("UVVP_VDEC_TEST_VERSION_2\n"); printk("=== vmalloc memory speed test ===\n"); do_gettimeofday(&tv1); buf_data = (unsigned char *)vmalloc(TESTDATA_BUFFER_SZ); buf_data2 = (unsigned char *)vmalloc(TESTDATA_BUFFER_SZ); do_gettimeofday(&tv2); calc_time_diff(&tv1, &tv2); printk("Allocated %d + %dMB in %d sec %d usec\n", TESTDATA_BUFFER_SZ/1024/1024, TESTDATA_BUFFER_SZ/1024/1024, tv2.tv_sec, tv2.tv_usec); do_gettimeofday(&tv1); memset(buf_data, 0, TESTDATA_BUFFER_SZ); memset(buf_data2, 1, TESTDATA_BUFFER_SZ); do_gettimeofday(&tv2); calc_time_diff(&tv1, &tv2); printk("memset %d + %dMB in %d sec %d usec\n", TESTDATA_BUFFER_SZ/1024/1024, TESTDATA_BUFFER_SZ/1024/1024, tv2.tv_sec, tv2.tv_usec); do_gettimeofday(&tv1); memcpy(buf_data, buf_data2, TESTDATA_BUFFER_SZ); do_gettimeofday(&tv2); calc_time_diff(&tv1, &tv2); printk("memcpy %dMB in %d sec %d usec\n", TESTDATA_BUFFER_SZ/1024/1024, tv2.tv_sec, tv2.tv_usec); vfree(buf_data); vfree(buf_data2); printk("=== ioremap_nocache memory speed test ===\n"); do_gettimeofday(&tv1); buf_data = g_pu1AllocSA; buf_data2 = g_pu1AllocSA + TESTDATA_BUFFER_SZ; buf_data = ioremap_nocache(buf_data, TESTDATA_BUFFER_SZ); buf_data2 = ioremap_nocache(buf_data2, TESTDATA_BUFFER_SZ); do_gettimeofday(&tv2); calc_time_diff(&tv1, &tv2); printk("ioremap %d + %dMB in %d sec %d usec\n", TESTDATA_BUFFER_SZ/1024/1024, TESTDATA_BUFFER_SZ/1024/1024, tv2.tv_sec, tv2.tv_usec); do_gettimeofday(&tv1); memset(buf_data, 0, TESTDATA_BUFFER_SZ); memset(buf_data2, 1, TESTDATA_BUFFER_SZ); do_gettimeofday(&tv2); calc_time_diff(&tv1, &tv2); printk("memset %d + %dMB in %d sec %d usec\n", TESTDATA_BUFFER_SZ/1024/1024, TESTDATA_BUFFER_SZ/1024/1024, tv2.tv_sec, tv2.tv_usec); do_gettimeofday(&tv1); memcpy(buf_data, buf_data2, TESTDATA_BUFFER_SZ); do_gettimeofday(&tv2); calc_time_diff(&tv1, &tv2); printk("memcpy %dMB in %d sec %d usec\n", TESTDATA_BUFFER_SZ/1024/1024, tv2.tv_sec, tv2.tv_usec); iounmap(buf_data); iounmap(buf_data2); printk("=== ioremap write test ===\n"); p = g_pu1AllocSA; p = ((UINT32)p + u4Align-1) & (~(u4Align - 1)); printk("p physical addr 0x%x\n", p); p = ioremap_nocache(p, u4Size); printk("p virtual addr 0x%x\n", p); *p = 'S'; *(p+u4Size-1) = 'E'; printk("p %c %c\n", *p, *(p+u4Size-1)); iounmap(p); /* while (1) { buf_data = (unsigned char *)vmalloc(mem_sz*1024*1024); if (buf_data != NULL) { vfree(buf_data); mem_sz = mem_sz + 1; printk("Memory size %dMB allocated!\n", mem_sz); } else { printk("Memory size %dMB failed to allocate\n", mem_sz); break; } } */ break; case UVVP_VDEC_TEST_VERSION_3: printk("UVVP_VDEC_TEST_VERSION_3\n"); buf_data = (unsigned char *)vmalloc(TESTDATA_BUFFER_SZ); if (0 == buf_data) { printk("Allocate %d bytes failed\n", TESTDATA_BUFFER_SZ); return 0; } oldfs = get_fs(); set_fs(KERNEL_DS); #ifdef USB_ACM_DMA1 printk("UVVP_VDEC_TEST_VERSION_3 Open /dev/usbacm\n"); fd = filp_open("/dev/usbacm", O_RDWR|O_NOCTTY|O_NDELAY, 0); if (fd == 0) { printk("Open /dev/usbacm failed\n"); return 0; } #else printk("UVVP_VDEC_TEST_VERSION_3 Open /dev/ttyGS0\n"); fd = filp_open("/dev/ttyGS0", O_RDWR, 0); if (fd == 0) { printk("Open /dev/ttyGS0 failed\n"); return 0; } fd->f_op->unlocked_ioctl(fd, TCGETS, (unsigned long)&settings); settings.c_cflag &= ~CBAUD; settings.c_cflag |= B921600; settings.c_cflag &= ~PARENB; settings.c_cflag &= ~CSTOPB; settings.c_cflag &= ~CSIZE; settings.c_cflag |= CS8 | CLOCAL | CREAD; settings.c_iflag &= ~(INLCR | ICRNL | IXON | IXOFF | IXANY); settings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*raw input*/ settings.c_oflag &= ~OPOST; /*raw output*/ settings.c_cc[VMIN] = 0; settings.c_cc[VTIME] = 100; fd->f_op->unlocked_ioctl(fd, TCSETS, (unsigned long)&settings); #endif // Read CRC printk("Read CRC file\n"); file_num = remote_open(fd, "Z:\\1280x720_30_2000.ivf.crc", 27, "rb", 2); if (file_num < 0) { printk("Open CRC failed\n"); return 0; } file_len = remote_seek(fd, file_num, 0, SEEK_END); if (file_len < 0 || file_len > TESTDATA_BUFFER_SZ) { printk("CRC file too big %d\n", file_len); return 0; } remote_seek(fd, file_num, 0, SEEK_SET); read_len = remote_read(fd, file_num, &crc, sizeof(int)); if (read_len < file_len) { printk("Fail to read CRC file\n"); return 0; } remote_close(fd, file_num); // Read real file printk("Read Data file\n"); file_num = remote_open(fd, "Z:\\1280x720_30_2000.ivf", 23, "rb", 2); if (file_num < 0) { printk("Open data file failed\n"); return 0; } file_len = remote_seek(fd, file_num, 0, SEEK_END); if (file_len < 0 || file_len > TESTDATA_BUFFER_SZ) { printk("Data file too big %d\n", file_len); return 0; } remote_seek(fd, file_num, 0, SEEK_SET); memset(&tv1, 0, sizeof(struct timeval)); memset(&tv2, 0, sizeof(struct timeval)); printk("Start reading data\n"); do_gettimeofday(&tv1); read_len = remote_read(fd, file_num, buf_data, file_len); do_gettimeofday(&tv2); printk("End reading data\n"); printk("tv1 %d.%d, tv2 %d.%d \n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec); tv2.tv_sec -= tv1.tv_sec; if (tv2.tv_usec < tv1.tv_usec) { if (tv2.tv_sec < 1) printk("TIME ERROR\n"); tv2.tv_usec = tv2.tv_usec + 1000000 - tv1.tv_usec; tv2.tv_sec -= 1; } else { tv2.tv_usec -= tv1.tv_usec; } printk("Data len %d, elapsed time %d ms, avg speed %d bytes/ms\n", read_len, (tv2.tv_sec * 1000000 + tv2.tv_usec)/1000, read_len/((tv2.tv_sec * 1000000 + tv2.tv_usec)/1000)); if (read_len < file_len) { printk("Fail read data file exp. %d, read %d\n", file_len, read_len); return 0; } remote_close(fd, file_num); // CRC check own_crc = av_adler32_update(1, buf_data, 1, read_len); printk("own_crc 0x%08x, crc 0x%08x, %s\n", own_crc, crc, (own_crc == crc) ? "Pass":"******"); // Write file file_num = remote_open(fd, "D:\\Test.txt", 11, "wb", 2); if (file_num < 0) { printk("Open data file failed\n"); return 0; } for (i = 0; i < 256; i++) { tmp_buf[i] = i; } for (i = 0; i < 1024; i++) { memcpy(buf_data+(1024*i), (unsigned char *)&tmp_buf[0], 1024); } remote_write(fd, file_num, buf_data, 1024*1024); remote_close(fd, file_num); filp_close(fd, NULL); vfree(buf_data); /* _pucVFifo[0] = ioremap(0x8000000, 0x100000); memset(_pucVFifo[0] ,5,0x100000); printk("_pucVFifo = 0x%x\n", _pucVFifo[0]); printk("_pucVFifo m4u_v2p = 0x%x\n", m4u_v2p_new((unsigned int)_pucVFifo[0])); iounmap(_pucVFifo[0]); _pucVFifo[0] = ioremap(0x8000000, 0x100000); memset(_pucVFifo[0] ,5,0x100000); printk("_pucVFifo = 0x%x\n", _pucVFifo[0]); printk("_pucVFifo m4u_v2p = 0x%x\n", m4u_v2p_new((unsigned int)_pucVFifo[0])); iounmap(_pucVFifo[0]); _pucVFifo[0] = ioremap(0x8000000, 0x100000); memset(_pucVFifo[0] ,5,0x100000); printk("_pucVFifo = 0x%x\n", _pucVFifo[0]); printk("_pucVFifo m4u_v2p = 0x%x\n", m4u_v2p_new((unsigned int)_pucVFifo[0])); iounmap(_pucVFifo[0]); */ break; case UVVP_VDEC_TEST_VERSION_4: initKernelEnv(); fd = openFile("/etc/frame_num",O_RDONLY,0); if (IS_ERR(fd) ) printk("[Error] Miss file: input arg file!!!!!!!!!!!!!\n"); else readFile(fd ,tmp_buf, 256 ); closeFile(fd); set_fs( oldfs ); sscanf ( tmp_buf, "%i %i %i %i %i %s %i %i" , &frame_start, &frame_end, &width, &height, &debug_mode, bitstream_name, &error_rate, &UFO_MODE); hevc_test( frame_start, frame_end); break; default: break; } //printk("\r\n******** uvvp_vdec_ioctl done********\r\n"); return 0; }
int main (int argc, char *argv[]) { char ch, status, own_buf[PBUFSIZ], mem_buf[2000]; int i = 0; unsigned char signal; unsigned int len; CORE_ADDR mem_addr; if (setjmp (toplevel)) { fprintf (stderr, "Exiting\n"); exit (1); } if (argc < 3) error ("Usage: gdbserver tty prog [args ...]"); initialize_low (); /* Wait till we are at first instruction in program. */ signal = start_inferior (&argv[2], &status); /* We are now stopped at the first instruction of the target process */ while (1) { remote_open (argv[1]); restart: setjmp (toplevel); while (getpkt (own_buf) > 0) { unsigned char sig; i = 0; ch = own_buf[i++]; switch (ch) { case 'd': remote_debug = !remote_debug; break; case '!': extended_protocol = 1; prepare_resume_reply (own_buf, status, signal); break; case '?': prepare_resume_reply (own_buf, status, signal); break; case 'H': switch (own_buf[1]) { case 'g': general_thread = strtol (&own_buf[2], NULL, 16); write_ok (own_buf); fetch_inferior_registers (0); break; case 'c': cont_thread = strtol (&own_buf[2], NULL, 16); write_ok (own_buf); break; default: /* Silently ignore it so that gdb can extend the protocol without compatibility headaches. */ own_buf[0] = '\0'; break; } break; case 'g': convert_int_to_ascii (registers, own_buf, REGISTER_BYTES); break; case 'G': convert_ascii_to_int (&own_buf[1], registers, REGISTER_BYTES); store_inferior_registers (-1); write_ok (own_buf); break; case 'm': decode_m_packet (&own_buf[1], &mem_addr, &len); read_inferior_memory (mem_addr, mem_buf, len); convert_int_to_ascii (mem_buf, own_buf, len); break; case 'M': decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); if (write_inferior_memory (mem_addr, mem_buf, len) == 0) write_ok (own_buf); else write_enn (own_buf); break; case 'C': convert_ascii_to_int (own_buf + 1, &sig, 1); myresume (0, sig); signal = mywait (&status); prepare_resume_reply (own_buf, status, signal); break; case 'S': convert_ascii_to_int (own_buf + 1, &sig, 1); myresume (1, sig); signal = mywait (&status); prepare_resume_reply (own_buf, status, signal); break; case 'c': myresume (0, 0); signal = mywait (&status); prepare_resume_reply (own_buf, status, signal); break; case 's': myresume (1, 0); signal = mywait (&status); prepare_resume_reply (own_buf, status, signal); break; case 'k': fprintf (stderr, "Killing inferior\n"); kill_inferior (); /* When using the extended protocol, we start up a new debugging session. The traditional protocol will exit instead. */ if (extended_protocol) { write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { exit (0); break; } case 'T': if (mythread_alive (strtol (&own_buf[1], NULL, 16))) write_ok (own_buf); else write_enn (own_buf); break; case 'R': /* Restarting the inferior is only supported in the extended protocol. */ if (extended_protocol) { kill_inferior (); write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this request. */ own_buf[0] = '\0'; break; } putpkt (own_buf); if (status == 'W') fprintf (stderr, "\nChild exited with status %d\n", sig); if (status == 'X') fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig); if (status == 'W' || status == 'X') { if (extended_protocol) { fprintf (stderr, "Killing inferior\n"); kill_inferior (); write_ok (own_buf); fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ signal = start_inferior (&argv[2], &status); goto restart; break; } else { fprintf (stderr, "GDBserver exiting\n"); exit (0); } } } /* We come here when getpkt fails. For the extended remote protocol we exit (and this is the only way we gracefully exit!). For the traditional remote protocol close the connection, and re-open it at the top of the loop. */ if (extended_protocol) { remote_close (); exit (0); } else { fprintf (stderr, "Remote side has terminated connection. GDBserver will reopen the connection.\n"); remote_close (); } } }