bool isLeftAssociative() { return ASSOC_LEFT == associativity(); }
bool isRightAssociative() { return ASSOC_RIGHT == associativity(); }
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); }