/** * イベントオブジェクト生成 */ event_t *event(int val, int clos, int trans) { event_t *evt; evt = (event_t *)gc_record(GC_ALIGN(sizeof(event_t))); evt->val = (int)gc_forward((int*)val); evt->clos = (int)gc_forward((int*)clos); evt->trans = (int)gc_forward((int*)trans); return evt; }
int gc_cmd_uptags(struct gc_cmd *cmd, char **arg) { uint64_t addr; int rc; _gc_cap void *raw_obj; _gc_cap void *obj; _gc_cap struct gc_btbl *bt; size_t bt_idx; size_t pg_idx; if (arg[1] == NULL) { printf("uptags: <addr>\n"); return (0); } addr = strtoull(arg[1], NULL, 0); printf("Updating tags for address 0x%" PRIx64 "\n", addr); raw_obj = gc_cheri_ptr((void *)GC_ALIGN(addr), 0); rc = gc_get_obj(raw_obj, gc_cap_addr(&obj), gc_cap_addr(&bt), gc_cheri_ptr(&bt_idx, sizeof(bt_idx)), NULL, NULL); if (gc_ty_is_unmanaged(rc)) { printf("Error: object is unmanaged.\n"); return (0); } else if (gc_ty_is_revoked(rc)) { printf("Warning: object is revoked.\n"); } else if (gc_ty_is_free(rc)) { printf("Error: object is not allocated.\n"); return (0); } printf("Returned object: %s\n", gc_cap_str(obj)); printf("Block table: %s, index: %zu\n", gc_cap_str(bt), bt_idx); pg_idx = GC_SLOT_IDX_TO_PAGE_IDX(bt, bt_idx); printf("Old tags: hi=0x%" PRIx64 ", lo=0x%" PRIx64 ", v=%d\n", bt->bt_tags[pg_idx].tg_hi, bt->bt_tags[pg_idx].tg_lo, bt->bt_tags[pg_idx].tg_v); printf("Updating...\n"); gc_get_or_update_tags(bt, pg_idx); printf("New tags: hi=0x%" PRIx64 ", lo=0x%" PRIx64 ", v=%d\n", bt->bt_tags[pg_idx].tg_hi, bt->bt_tags[pg_idx].tg_lo, bt->bt_tags[pg_idx].tg_v); return (0); }
/** * チャネル生成 */ chan_t *__chan__(void) { chan_t *ch; ch = (chan_t *)gc_record(GC_ALIGN(sizeof(chan_t))); /* イベントキュー初期化 */ TAILQ_INIT(&ch->inq); TAILQ_INIT(&ch->outq); ch->ioent = NULL; ch->recvf = __recv__; ch->sendf = __send__; return ch; }
/** * 文字列のアロケート(非初期化版) */ int __salloc__(int len) { int ret; __prc__temp = gc_array(GC_ALIGN(len+1)); ret = __record__(4); ((int*)ret)[0] = TOPINT(0); ((int*)ret)[1] = __prc__temp; ((int*)ret)[2] = 0; ((int*)ret)[3] = TOPINT(len); __prc__temp = (int)NULL; return ret; }
int gc_cmd_revoke(struct gc_cmd *cmd, char **arg) { uint64_t addr; _gc_cap void *p; int rc; if (arg[1] == NULL) { printf("revoke: <addr>\n"); return (0); } addr = strtoull(arg[1], NULL, 0); p = gc_cheri_ptr(GC_ALIGN(addr), 0); printf("Attempting to revoke %s\n", gc_cap_str(p)); rc = gc_revoke(p); printf("Return code from gc_revoke: %d\n", rc); return (0); }
int gc_cmd_info(struct gc_cmd *cmd, char **arg) { uint64_t addr; int rc; _gc_cap void *raw_obj; _gc_cap void *obj; _gc_cap struct gc_btbl *bt; size_t bt_idx; _gc_cap struct gc_blk *bk; size_t bk_idx; size_t pg_idx; _gc_cap struct gc_vm_ent *ve; if (arg[1] == NULL) { printf("info: <addr>\n"); return (0); } addr = strtoull(arg[1], NULL, 0); printf("Retrieving information for address 0x%" PRIx64 "\n", addr); raw_obj = gc_cheri_ptr((void *)GC_ALIGN(addr), 0); rc = gc_get_obj(raw_obj, gc_cap_addr(&obj), gc_cap_addr(&bt), gc_cheri_ptr(&bt_idx, sizeof(bt_idx)), gc_cap_addr(&bk), gc_cheri_ptr(&bk_idx, sizeof(bk_idx))); if (gc_ty_is_unmanaged(rc)) { printf("Object is unmanaged.\n"); /* Try finding in VM mappings. */ ve = gc_vm_tbl_find(&gc_state_c->gs_vt, (uint64_t)GC_ALIGN(addr)); if (ve == NULL) { printf("No VM table entry.\n"); return (0); } else { printf("Found VM entry: " GC_DEBUG_VE_FMT "\n", GC_DEBUG_VE_PRI(ve)); bt = ve->ve_bt; rc = gc_get_obj_bt(raw_obj, bt, gc_cap_addr(&obj), gc_cheri_ptr(&bt_idx, sizeof(bt_idx)), gc_cap_addr(&bk), gc_cheri_ptr(&bk_idx, sizeof(bk_idx))); if (gc_ty_is_unmanaged(rc)) { /* Impossible? */ printf("No index found in VM block table.\n"); return (0); } } } if (gc_ty_is_revoked(rc)) printf("Object is revoked.\n"); else if (gc_ty_is_used(rc)) printf("Object is allocated.\n"); else if (gc_ty_is_marked(rc)) printf("Object is allocated and marked.\n"); else if (gc_ty_is_free(rc)) printf("Object is not allocated.\n"); else printf("Unknown object type.\n"); printf("Returned object: %s\n", gc_cap_str(obj)); printf("Block table: %s, ", gc_cap_str(bt)); printf("base: %s, slot size %zu, index: %zu\n", gc_cap_str(bt->bt_base), bt->bt_slotsz, bt_idx); pg_idx = GC_SLOT_IDX_TO_PAGE_IDX(bt, bt_idx); printf("Stored tags: hi=0x%" PRIx64 ", lo=0x%" PRIx64 ", v=%d\n", bt->bt_tags[pg_idx].tg_hi, bt->bt_tags[pg_idx].tg_lo, bt->bt_tags[pg_idx].tg_v); if (bt->bt_flags & GC_BTBL_FLAG_SMALL) { printf("Block: %s, index: %zu\n", gc_cap_str(bk), bk_idx); if (bk_idx == 0) { /* Block header; print block info. */ printf("Block header information:\n" " Object size: %zu bytes\n" " Mark bits: 0x%" PRIx64 "\n" " Free bits: 0x%" PRIx64 "\n" " Revoked bits: 0x%" PRIx64 "\n", bk->bk_objsz, bk->bk_marks, bk->bk_free, bk->bk_revoked); } } return (0); }