mirror of https://github.com/xemu-project/xemu.git
tests: fw_cfg: add a function to get the fw_cfg file
This is useful to write qtest about fw_cfg file entry. Signed-off-by: Li Qiang <liq3ea@163.com> Acked-by: Thomas Huth <thuth@redhat.com> Tested-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20190424140643.62457-3-liq3ea@163.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
parent
7a44091d48
commit
c99f5f1dd4
|
@ -16,6 +16,7 @@
|
|||
#include "libqos/fw_cfg.h"
|
||||
#include "libqtest.h"
|
||||
#include "qemu/bswap.h"
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
|
||||
void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
|
||||
{
|
||||
|
@ -59,6 +60,50 @@ static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
|
|||
qtest_writew(fw_cfg->qts, fw_cfg->base, key);
|
||||
}
|
||||
|
||||
/*
|
||||
* The caller need check the return value. When the return value is
|
||||
* nonzero, it means that some bytes have been transferred.
|
||||
*
|
||||
* If the fw_cfg file in question is smaller than the allocated & passed-in
|
||||
* buffer, then the buffer has been populated only in part.
|
||||
*
|
||||
* If the fw_cfg file in question is larger than the passed-in
|
||||
* buffer, then the return value explains how much room would have been
|
||||
* necessary in total. And, while the caller's buffer has been fully
|
||||
* populated, it has received only a starting slice of the fw_cfg file.
|
||||
*/
|
||||
size_t qfw_cfg_get_file(QFWCFG *fw_cfg, const char *filename,
|
||||
void *data, size_t buflen)
|
||||
{
|
||||
uint32_t count;
|
||||
uint32_t i;
|
||||
unsigned char *filesbuf = NULL;
|
||||
size_t dsize;
|
||||
FWCfgFile *pdir_entry;
|
||||
size_t filesize = 0;
|
||||
|
||||
qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, &count, sizeof(count));
|
||||
count = be32_to_cpu(count);
|
||||
dsize = sizeof(uint32_t) + count * sizeof(struct fw_cfg_file);
|
||||
filesbuf = g_malloc(dsize);
|
||||
qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
|
||||
pdir_entry = (FWCfgFile *)(filesbuf + sizeof(uint32_t));
|
||||
for (i = 0; i < count; ++i, ++pdir_entry) {
|
||||
if (!strcmp(pdir_entry->name, filename)) {
|
||||
uint32_t len = be32_to_cpu(pdir_entry->size);
|
||||
uint16_t sel = be16_to_cpu(pdir_entry->select);
|
||||
filesize = len;
|
||||
if (len > buflen) {
|
||||
len = buflen;
|
||||
}
|
||||
qfw_cfg_get(fw_cfg, sel, data, len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_free(filesbuf);
|
||||
return filesize;
|
||||
}
|
||||
|
||||
static void mm_fw_cfg_read(QFWCFG *fw_cfg, void *data, size_t len)
|
||||
{
|
||||
uint8_t *ptr = data;
|
||||
|
|
|
@ -31,6 +31,8 @@ void qfw_cfg_get(QFWCFG *fw_cfg, uint16_t key, void *data, size_t len);
|
|||
uint16_t qfw_cfg_get_u16(QFWCFG *fw_cfg, uint16_t key);
|
||||
uint32_t qfw_cfg_get_u32(QFWCFG *fw_cfg, uint16_t key);
|
||||
uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key);
|
||||
size_t qfw_cfg_get_file(QFWCFG *fw_cfg, const char *filename,
|
||||
void *data, size_t buflen);
|
||||
|
||||
QFWCFG *mm_fw_cfg_init(QTestState *qts, uint64_t base);
|
||||
void mm_fw_cfg_uninit(QFWCFG *fw_cfg);
|
||||
|
|
Loading…
Reference in New Issue