mirror of https://gitee.com/openkylin/qemu.git
plugins/cache: Enable cache parameterization
Enabled configuring both icache and dcache parameters using plugin parameters. Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20210623125458.450462-3-ma.mandourr@gmail.com> Message-Id: <20210709143005.1554-38-alex.bennee@linaro.org>
This commit is contained in:
parent
e2c5557ce1
commit
86ae3a1daa
|
@ -99,8 +99,28 @@ static inline uint64_t extract_set(Cache *cache, uint64_t addr)
|
|||
return (addr & cache->set_mask) >> cache->blksize_shift;
|
||||
}
|
||||
|
||||
static const char *cache_config_error(int blksize, int assoc, int cachesize)
|
||||
{
|
||||
if (cachesize % blksize != 0) {
|
||||
return "cache size must be divisible by block size";
|
||||
} else if (cachesize % (blksize * assoc) != 0) {
|
||||
return "cache size must be divisible by set size (assoc * block size)";
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static bool bad_cache_params(int blksize, int assoc, int cachesize)
|
||||
{
|
||||
return (cachesize % blksize) != 0 || (cachesize % (blksize * assoc) != 0);
|
||||
}
|
||||
|
||||
static Cache *cache_init(int blksize, int assoc, int cachesize)
|
||||
{
|
||||
if (bad_cache_params(blksize, assoc, cachesize)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Cache *cache;
|
||||
int i;
|
||||
uint64_t blk_mask;
|
||||
|
@ -397,7 +417,19 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
|
|||
|
||||
for (i = 0; i < argc; i++) {
|
||||
char *opt = argv[i];
|
||||
if (g_str_has_prefix(opt, "limit=")) {
|
||||
if (g_str_has_prefix(opt, "iblksize=")) {
|
||||
iblksize = g_ascii_strtoll(opt + 9, NULL, 10);
|
||||
} else if (g_str_has_prefix(opt, "iassoc=")) {
|
||||
iassoc = g_ascii_strtoll(opt + 7, NULL, 10);
|
||||
} else if (g_str_has_prefix(opt, "icachesize=")) {
|
||||
icachesize = g_ascii_strtoll(opt + 11, NULL, 10);
|
||||
} else if (g_str_has_prefix(opt, "dblksize=")) {
|
||||
dblksize = g_ascii_strtoll(opt + 9, NULL, 10);
|
||||
} else if (g_str_has_prefix(opt, "dassoc=")) {
|
||||
dassoc = g_ascii_strtoll(opt + 7, NULL, 10);
|
||||
} else if (g_str_has_prefix(opt, "dcachesize=")) {
|
||||
dcachesize = g_ascii_strtoll(opt + 11, NULL, 10);
|
||||
} else if (g_str_has_prefix(opt, "limit=")) {
|
||||
limit = g_ascii_strtoll(opt + 6, NULL, 10);
|
||||
} else {
|
||||
fprintf(stderr, "option parsing failed: %s\n", opt);
|
||||
|
@ -406,7 +438,20 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
|
|||
}
|
||||
|
||||
dcache = cache_init(dblksize, dassoc, dcachesize);
|
||||
if (!dcache) {
|
||||
const char *err = cache_config_error(dblksize, dassoc, dcachesize);
|
||||
fprintf(stderr, "dcache cannot be constructed from given parameters\n");
|
||||
fprintf(stderr, "%s\n", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
icache = cache_init(iblksize, iassoc, icachesize);
|
||||
if (!icache) {
|
||||
const char *err = cache_config_error(iblksize, iassoc, icachesize);
|
||||
fprintf(stderr, "icache cannot be constructed from given parameters\n");
|
||||
fprintf(stderr, "%s\n", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rng = g_rand_new();
|
||||
|
||||
|
|
Loading…
Reference in New Issue