static int dump_sem_info(int argc, char **argv) { bool found = false; addr_t num; int32 i; if (argc < 2) { print_debugger_command_usage(argv[0]); return 0; } num = strtoul(argv[1], NULL, 0); if (IS_KERNEL_ADDRESS(num)) { dump_sem((struct sem_entry *)num); return 0; } else if (num >= 0) { uint32 slot = num % sMaxSems; if (sSems[slot].id != (int)num) { kprintf("sem %ld (%#lx) doesn't exist!\n", num, num); return 0; } dump_sem(&sSems[slot]); return 0; } // walk through the sem list, trying to match name for (i = 0; i < sMaxSems; i++) { if (sSems[i].u.used.name != NULL && strcmp(argv[1], sSems[i].u.used.name) == 0) { dump_sem(&sSems[i]); found = true; } } if (!found) kprintf("sem \"%s\" doesn't exist!\n", argv[1]); return 0; }
void do_read(char *buf){ int ret; char *p; struct sem sem; /* read something */ if((p = strchr(buf, ' ')) == NULL){ printf("r must take an index argument\n"); return; } p++; idx = atoi(p); ret = read_sem(&sem); if(ret < 0) return; printf("Index %d:\n", idx); if((p = strchr(p, '.')) == NULL){ dump_sem(&sem); dump_hex(&sem, sizeof(sem)); } else{ p++; if(strstr(p, "val")) printf("val = %d (%.04x)\n", sem.semval, sem.semval); if(strstr(p, "pid")) printf("pid = %d (%.08x)\n", sem.sempid, sem.sempid); if(strstr(p, "ncnt")) printf("ncnt = %d (%.04x)\n", sem.semncnt, sem.semncnt); if(strstr(p, "zcnt")) printf("zcnt = %d (%.04x)\n", sem.semzcnt, sem.semzcnt); } }