コード例 #1
0
 bool isLeftAssociative() { return ASSOC_LEFT == associativity(); }
コード例 #2
0
 bool isRightAssociative() { return ASSOC_RIGHT == associativity(); }
コード例 #3
0
ファイル: cache.c プロジェクト: AlexKordic/cpuid
static char *create_description(const struct cache_desc_index_t *idx)
{
	const struct cache_desc_t *desc = &idx->desc;
	char buffer[128], temp[32];
	const char *cp;
	buffer[0] = 0;

	/* Special cases. */
	switch(idx->descriptor) {
	case 0x40:
		sprintf(buffer, "No L2 cache, or if L2 cache exists, no L3 cache");
		goto out;
	case 0xF0:
		sprintf(buffer, "64-byte prefetching");
		goto out;
	case 0xF1:
		sprintf(buffer, "64-byte prefetching");
		goto out;
	}

	switch(desc->level) {
	case NO:
		break;
	case L0:
		strcat(buffer, "L0 ");
		break;
	case L1:
		strcat(buffer, "L1 ");
		break;
	case L2:
		strcat(buffer, "L2 ");
		break;
	case L3:
		strcat(buffer, "L3 ");
		break;
	default:
		abort();
	}

	switch (desc->type) {
	case TRACE:
		strcat(buffer, "trace cache: ");
		sprintf(temp, "%dK-uops", desc->size);
		strcat(buffer, temp);
		break;
	case DATA_TLB:
		strcat(buffer, "Data TLB: ");
		break;
	case CODE_TLB:
		strcat(buffer, "Code TLB: ");
		break;
	case SHARED_TLB:
		strcat(buffer, "shared TLB: ");
		break;
	case CODE:
		strcat(buffer, "code cache: ");
		strcat(buffer, size(temp, desc->size));
		break;
	case DATA:
		strcat(buffer, "data cache: ");
		strcat(buffer, size(temp, desc->size));
		break;
	case UNIFIED:
		strcat(buffer, "cache: ");
		strcat(buffer, size(temp, desc->size));
		break;
	default:
		abort();
	}

	cp = page_types(desc->attrs);
	if (cp) {
		strcat(buffer, page_types(desc->attrs));
	}

	if (desc->assoc != 0) {
		strcat(buffer, ", ");
		strcat(buffer, associativity(temp, desc->assoc));
	}

	if (desc->attrs & SECTORED)
		strcat(buffer, ", sectored cache");

	switch (desc->type) {
	case CODE:
	case DATA:
	case UNIFIED:
		sprintf(temp, ", %d byte line size", desc->linesize);
		strcat(buffer, temp);
		break;
	case DATA_TLB:
	case CODE_TLB:
	case SHARED_TLB:
		sprintf(temp, ", %d entries", desc->size);
		strcat(buffer, temp);
		break;
	default:
		break;
	}

	if (desc->attrs & ECC)
		strcat(buffer, ", ECC");

	if (desc->attrs & UNDOCUMENTED)
		strcat(buffer, " (undocumented)");
out:
	return strdup(buffer);
}