Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/taskdump/taskdump.c

    re3a3a619 r36e9cd1  
    5454#define LINE_BYTES 16
    5555
     56#define DBUF_SIZE 4096
     57static uint8_t data_buf[DBUF_SIZE];
     58
    5659static int phoneid;
    5760static task_id_t task_id;
     
    6770static int thread_dump(uintptr_t thash);
    6871static int areas_dump(void);
     72static int area_dump(as_area_info_t *area);
     73static void hex_dump(uintptr_t addr, void *buffer, size_t size);
    6974static int td_read_uintptr(void *arg, uintptr_t addr, uintptr_t *value);
    7075
     
    351356}
    352357
     358static __attribute__((unused)) int area_dump(as_area_info_t *area)
     359{
     360        size_t to_copy;
     361        size_t total;
     362        uintptr_t addr;
     363        int rc;
     364
     365        addr = area->start_addr;
     366        total = 0;
     367
     368        while (total < area->size) {
     369                to_copy = min(area->size - total, DBUF_SIZE);
     370                rc = udebug_mem_read(phoneid, data_buf, addr, to_copy);
     371                if (rc < 0) {
     372                        printf("udebug_mem_read() failed.\n");
     373                        return rc;
     374                }
     375
     376                hex_dump(addr, data_buf, to_copy);
     377
     378                addr += to_copy;
     379                total += to_copy;
     380        }
     381
     382        return EOK;
     383}
     384
     385static void hex_dump(uintptr_t addr, void *buffer, size_t size)
     386{
     387        uint8_t *data = (uint8_t *) buffer;
     388        uint8_t b;
     389        size_t pos, i;
     390
     391        assert(addr % LINE_BYTES == 0);
     392        assert(size % LINE_BYTES == 0);
     393
     394        pos = 0;
     395
     396        while (pos < size) {
     397                printf("%08lx:", addr + pos);
     398                for (i = 0; i < LINE_BYTES; ++i) {
     399                        if (i % 4 == 0) putchar(' ');
     400                        printf(" %02x", data[pos + i]);
     401                }
     402                putchar('\t');
     403
     404                for (i = 0; i < LINE_BYTES; ++i) {
     405                        b = data[pos + i];
     406                        if (b >= 32 && b < 127) {
     407                                putchar(b);
     408                        } else {
     409                                putchar(' ');
     410                        }
     411                }
     412                putchar('\n');
     413                pos += LINE_BYTES;
     414        }
     415}
     416
    353417static int td_read_uintptr(void *arg, uintptr_t addr, uintptr_t *value)
    354418{
Note: See TracChangeset for help on using the changeset viewer.