Пример #1
0
/**
 * イベントオブジェクト生成
 */
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;
}
Пример #2
0
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);
}
Пример #3
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;
}
Пример #4
0
/**
 * 文字列のアロケート(非初期化版)
 */
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;
}
Пример #5
0
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);
}
Пример #6
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);
}