Changes in kernel/generic/src/udebug/udebug_ops.c [3698e44:ae5aa90] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/udebug/udebug_ops.c
r3698e44 rae5aa90 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> 51 50 #include <udebug/udebug.h> 52 51 #include <udebug/udebug_ops.h> 53 #include <memstr.h>54 52 55 53 /** … … 210 208 211 209 mutex_lock(&t->udebug.lock); 212 if ((t->flags & THREAD_FLAG_USPACE) != 0) {210 if ((t->flags & THREAD_FLAG_USPACE) != 0) 213 211 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 } 212 mutex_unlock(&t->udebug.lock); 219 213 } 220 214 … … 360 354 * 361 355 * 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. 356 * as can fit are copied. The number of thread hashes copied is stored 357 * in @a n. 365 358 * 366 359 * The rationale for having @a buf_size is that this function is only … … 370 363 * @param buffer The buffer for storing thread hashes. 371 364 * @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) 365 * @param n The actual number of hashes copied will be stored here. 366 */ 367 int udebug_thread_read(void **buffer, size_t buf_size, size_t *n) 377 368 { 378 369 thread_t *t; 379 370 link_t *cur; 380 371 unative_t tid; 381 size_t copied_ids; 382 size_t extra_ids; 372 unsigned copied_ids; 383 373 ipl_t ipl; 384 374 unative_t *id_buffer; … … 389 379 390 380 /* Allocate a buffer to hold thread IDs */ 391 id_buffer = malloc(buf_size + 1, 0);381 id_buffer = malloc(buf_size, 0); 392 382 393 383 mutex_lock(&TASK->udebug.lock); … … 405 395 max_ids = buf_size / sizeof(unative_t); 406 396 copied_ids = 0; 407 extra_ids = 0;408 397 409 398 /* FIXME: make sure the thread isn't past debug shutdown... */ 410 399 for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) { 400 /* Do not write past end of buffer */ 401 if (copied_ids >= max_ids) break; 402 411 403 t = list_get_instance(cur, thread_t, th_link); 412 404 … … 416 408 417 409 /* Not interested in kernel threads. */ 418 if ((flags & THREAD_FLAG_USPACE) == 0) 419 continue; 420 421 if (copied_ids < max_ids) { 410 if ((flags & THREAD_FLAG_USPACE) != 0) { 422 411 /* Using thread struct pointer as identification hash */ 423 412 tid = (unative_t) t; 424 413 id_buffer[copied_ids++] = tid; 425 } else {426 extra_ids++;427 414 } 428 415 } … … 434 421 435 422 *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); 423 *n = copied_ids * sizeof(unative_t); 461 424 462 425 return 0; … … 473 436 * this function will fail with an EINVAL error code. 474 437 * 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. 438 * @param buffer The buffer for storing thread hashes. 479 439 */ 480 440 int udebug_args_read(thread_t *t, void **buffer) … … 508 468 } 509 469 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 470 /** Read the memory of the debugged task. 555 471 *
Note:
See TracChangeset
for help on using the changeset viewer.