Changes in kernel/generic/src/udebug/udebug_ops.c [3698e44:41df2827] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/udebug/udebug_ops.c
r3698e44 r41df2827 46 46 #include <errno.h> 47 47 #include <print.h> 48 #include <string.h>49 48 #include <syscall/copy.h> 50 49 #include <ipc/ipc.h> … … 210 209 211 210 mutex_lock(&t->udebug.lock); 212 if ((t->flags & THREAD_FLAG_USPACE) != 0) {211 if ((t->flags & THREAD_FLAG_USPACE) != 0) 213 212 t->udebug.active = true; 214 mutex_unlock(&t->udebug.lock); 215 condvar_broadcast(&t->udebug.active_cv); 216 } else { 217 mutex_unlock(&t->udebug.lock); 218 } 213 mutex_unlock(&t->udebug.lock); 219 214 } 220 215 … … 360 355 * 361 356 * If the sequence is longer than @a buf_size bytes, only as much hashes 362 * as can fit are copied. The number of bytes copied is stored in @a stored. 363 * The total number of thread bytes that could have been saved had there been 364 * enough space is stored in @a needed. 357 * as can fit are copied. The number of thread hashes copied is stored 358 * in @a n. 365 359 * 366 360 * The rationale for having @a buf_size is that this function is only … … 370 364 * @param buffer The buffer for storing thread hashes. 371 365 * @param buf_size Buffer size in bytes. 372 * @param stored The actual number of bytes copied will be stored here. 373 * @param needed Total number of hashes that could have been saved. 374 */ 375 int udebug_thread_read(void **buffer, size_t buf_size, size_t *stored, 376 size_t *needed) 366 * @param n The actual number of hashes copied will be stored here. 367 */ 368 int udebug_thread_read(void **buffer, size_t buf_size, size_t *n) 377 369 { 378 370 thread_t *t; 379 371 link_t *cur; 380 372 unative_t tid; 381 size_t copied_ids; 382 size_t extra_ids; 373 unsigned copied_ids; 383 374 ipl_t ipl; 384 375 unative_t *id_buffer; … … 389 380 390 381 /* Allocate a buffer to hold thread IDs */ 391 id_buffer = malloc(buf_size + 1, 0);382 id_buffer = malloc(buf_size, 0); 392 383 393 384 mutex_lock(&TASK->udebug.lock); … … 405 396 max_ids = buf_size / sizeof(unative_t); 406 397 copied_ids = 0; 407 extra_ids = 0;408 398 409 399 /* FIXME: make sure the thread isn't past debug shutdown... */ 410 400 for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) { 401 /* Do not write past end of buffer */ 402 if (copied_ids >= max_ids) break; 403 411 404 t = list_get_instance(cur, thread_t, th_link); 412 405 … … 416 409 417 410 /* Not interested in kernel threads. */ 418 if ((flags & THREAD_FLAG_USPACE) == 0) 419 continue; 420 421 if (copied_ids < max_ids) { 411 if ((flags & THREAD_FLAG_USPACE) != 0) { 422 412 /* Using thread struct pointer as identification hash */ 423 413 tid = (unative_t) t; 424 414 id_buffer[copied_ids++] = tid; 425 } else {426 extra_ids++;427 415 } 428 416 } … … 434 422 435 423 *buffer = id_buffer; 436 *stored = copied_ids * sizeof(unative_t); 437 *needed = (copied_ids + extra_ids) * sizeof(unative_t); 438 439 return 0; 440 } 441 442 /** Read task name. 443 * 444 * Returns task name as non-terminated string in a newly allocated buffer. 445 * Also returns the size of the data. 446 * 447 * @param data Place to store pointer to newly allocated block. 448 * @param data_size Place to store size of the data. 449 * 450 * @returns EOK. 451 */ 452 int udebug_name_read(char **data, size_t *data_size) 453 { 454 size_t name_size; 455 456 name_size = str_size(TASK->name) + 1; 457 *data = malloc(name_size, 0); 458 *data_size = name_size; 459 460 memcpy(*data, TASK->name, name_size); 424 *n = copied_ids * sizeof(unative_t); 461 425 462 426 return 0; … … 473 437 * this function will fail with an EINVAL error code. 474 438 * 475 * @param t Thread where call arguments are to be read. 476 * @param buffer Place to store pointer to new buffer. 477 * @return EOK on success, ENOENT if @a t is invalid, EINVAL 478 * if thread state is not valid for this operation. 439 * @param buffer The buffer for storing thread hashes. 479 440 */ 480 441 int udebug_args_read(thread_t *t, void **buffer) … … 508 469 } 509 470 510 /** Read the register state of the thread.511 *512 * The contents of the thread's istate structure are copied to a newly513 * allocated buffer and a pointer to it is written to @a buffer. The size of514 * the buffer will be sizeof(istate_t).515 *516 * Currently register state cannot be read if the thread is inside a system517 * call (as opposed to an exception). This is an implementation limit.518 *519 * @param t Thread whose state is to be read.520 * @param buffer Place to store pointer to new buffer.521 * @return EOK on success, ENOENT if @a t is invalid, EINVAL522 * if thread is not in valid state, EBUSY if istate523 * is not available.524 */525 int udebug_regs_read(thread_t *t, void **buffer)526 {527 istate_t *state, *state_buf;528 int rc;529 530 /* Prepare a buffer to hold the data. */531 state_buf = malloc(sizeof(istate_t), 0);532 533 /* On success, this will lock t->udebug.lock */534 rc = _thread_op_begin(t, false);535 if (rc != EOK) {536 return rc;537 }538 539 state = t->udebug.uspace_state;540 if (state == NULL) {541 _thread_op_end(t);542 return EBUSY;543 }544 545 /* Copy to the allocated buffer */546 memcpy(state_buf, state, sizeof(istate_t));547 548 _thread_op_end(t);549 550 *buffer = (void *) state_buf;551 return 0;552 }553 554 471 /** Read the memory of the debugged task. 555 472 *
Note:
See TracChangeset
for help on using the changeset viewer.