* [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry
2018-10-28 12:40 [Qemu-devel] [PATCH 0/2] test: fw_cfg: add reboot-timeout " Li Qiang
@ 2018-10-28 12:40 ` Li Qiang
2018-10-29 23:46 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 11+ messages in thread
From: Li Qiang @ 2018-10-28 12:40 UTC (permalink / raw)
To: pbonzini, thuth, lvivier; +Cc: philmd, qemu-devel, Li Qiang
This is useful to write qtest abount fw_cfg file entry.
Signed-off-by: Li Qiang <liq3ea@163.com>
---
tests/libqos/fw_cfg.c | 30 ++++++++++++++++++++++++++++++
tests/libqos/fw_cfg.h | 2 ++
2 files changed, 32 insertions(+)
diff --git a/tests/libqos/fw_cfg.c b/tests/libqos/fw_cfg.c
index d0889d1e22..2dd7a498ab 100644
--- a/tests/libqos/fw_cfg.c
+++ b/tests/libqos/fw_cfg.c
@@ -16,6 +16,7 @@
#include "libqos/fw_cfg.h"
#include "libqtest.h"
#include "qemu/bswap.h"
+#include "standard-headers/linux/qemu_fw_cfg.h"
void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
{
@@ -54,6 +55,35 @@ uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key)
return le64_to_cpu(value);
}
+void 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;
+ uint32_t dsize;
+ struct fw_cfg_file *p;
+
+ 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_malloc0(dsize);
+ qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
+ p = (struct fw_cfg_file *)(filesbuf + 4);
+ for (i = 0; i < count; ++i, ++p) {
+ if (!strcmp(p->name, filename)) {
+ uint32_t len = be32_to_cpu(p->size);
+ uint16_t sel = be16_to_cpu(p->select);
+ void *buf = g_malloc0(len);
+ qfw_cfg_get(fw_cfg, sel, buf, len);
+ memcpy(data, buf, buflen);
+ g_free(buf);
+ break;
+ }
+ }
+ g_free(filesbuf);
+}
+
static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
{
qtest_writew(fw_cfg->qts, fw_cfg->base, key);
diff --git a/tests/libqos/fw_cfg.h b/tests/libqos/fw_cfg.h
index 0353416af0..50e4227638 100644
--- a/tests/libqos/fw_cfg.h
+++ b/tests/libqos/fw_cfg.h
@@ -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);
+void 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);
QFWCFG *io_fw_cfg_init(QTestState *qts, uint16_t base);
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry
2018-10-28 12:40 ` [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry Li Qiang
@ 2018-10-29 23:46 ` Philippe Mathieu-Daudé
2018-10-30 1:45 ` li qiang
0 siblings, 1 reply; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-29 23:46 UTC (permalink / raw)
To: Li Qiang, pbonzini, thuth, lvivier; +Cc: qemu-devel
Hi Li,
On 28/10/18 13:40, Li Qiang wrote:
> This is useful to write qtest abount fw_cfg file entry.
>
> Signed-off-by: Li Qiang <liq3ea@163.com>
> ---
> tests/libqos/fw_cfg.c | 30 ++++++++++++++++++++++++++++++
> tests/libqos/fw_cfg.h | 2 ++
> 2 files changed, 32 insertions(+)
>
> diff --git a/tests/libqos/fw_cfg.c b/tests/libqos/fw_cfg.c
> index d0889d1e22..2dd7a498ab 100644
> --- a/tests/libqos/fw_cfg.c
> +++ b/tests/libqos/fw_cfg.c
> @@ -16,6 +16,7 @@
> #include "libqos/fw_cfg.h"
> #include "libqtest.h"
> #include "qemu/bswap.h"
> +#include "standard-headers/linux/qemu_fw_cfg.h"
>
> void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
> {
> @@ -54,6 +55,35 @@ uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key)
> return le64_to_cpu(value);
> }
>
Can this return size_t the size of the file?
So qfw_cfg_get_file(..., buflen=0) returns the file size.
> +void 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;
> + uint32_t dsize;
> + struct fw_cfg_file *p;
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_malloc0(dsize);
> + qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
> + p = (struct fw_cfg_file *)(filesbuf + 4);
> + for (i = 0; i < count; ++i, ++p) {
> + if (!strcmp(p->name, filename)) {
> + uint32_t len = be32_to_cpu(p->size);
> + uint16_t sel = be16_to_cpu(p->select);
> + void *buf = g_malloc0(len);
Why call malloc() here?
> + qfw_cfg_get(fw_cfg, sel, buf, len);
And not copy directly to 'data':
filesize = len;
if (len > buflen) {
len = buflen;
}
qfw_cfg_get(fw_cfg, sel, data, len);
> + memcpy(data, buf, buflen);
> + g_free(buf);
Dropping 2 previous lines.
> + break;
> + }
> + }
> + g_free(filesbuf);
return filesize;
> +}
> +
> static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
> {
> qtest_writew(fw_cfg->qts, fw_cfg->base, key);
> diff --git a/tests/libqos/fw_cfg.h b/tests/libqos/fw_cfg.h
> index 0353416af0..50e4227638 100644
> --- a/tests/libqos/fw_cfg.h
> +++ b/tests/libqos/fw_cfg.h
> @@ -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);
> +void 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);
> QFWCFG *io_fw_cfg_init(QTestState *qts, uint16_t base);
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry
2018-10-29 23:46 ` Philippe Mathieu-Daudé
@ 2018-10-30 1:45 ` li qiang
0 siblings, 0 replies; 11+ messages in thread
From: li qiang @ 2018-10-30 1:45 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Li Qiang, pbonzini@redhat.com,
thuth@redhat.com, lvivier@redhat.com
Cc: qemu-devel@nongnu.org
Hello Philippe,
Thanks for your review,
I will send v2 later.
Thanks.
Li Qiang
在 2018/10/30 7:46, Philippe Mathieu-Daudé 写道:
> Hi Li,
>
> On 28/10/18 13:40, Li Qiang wrote:
>> This is useful to write qtest abount fw_cfg file entry.
>>
>> Signed-off-by: Li Qiang <liq3ea@163.com>
>> ---
>> tests/libqos/fw_cfg.c | 30 ++++++++++++++++++++++++++++++
>> tests/libqos/fw_cfg.h | 2 ++
>> 2 files changed, 32 insertions(+)
>>
>> diff --git a/tests/libqos/fw_cfg.c b/tests/libqos/fw_cfg.c
>> index d0889d1e22..2dd7a498ab 100644
>> --- a/tests/libqos/fw_cfg.c
>> +++ b/tests/libqos/fw_cfg.c
>> @@ -16,6 +16,7 @@
>> #include "libqos/fw_cfg.h"
>> #include "libqtest.h"
>> #include "qemu/bswap.h"
>> +#include "standard-headers/linux/qemu_fw_cfg.h"
>> void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
>> {
>> @@ -54,6 +55,35 @@ uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t
>> key)
>> return le64_to_cpu(value);
>> }
>
> Can this return size_t the size of the file?
> So qfw_cfg_get_file(..., buflen=0) returns the file size.
>
>> +void 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;
>> + uint32_t dsize;
>> + struct fw_cfg_file *p;
>
> 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_malloc0(dsize);
>> + qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
>> + p = (struct fw_cfg_file *)(filesbuf + 4);
>> + for (i = 0; i < count; ++i, ++p) {
>> + if (!strcmp(p->name, filename)) {
>> + uint32_t len = be32_to_cpu(p->size);
>
>
>> + uint16_t sel = be16_to_cpu(p->select);
>> + void *buf = g_malloc0(len);
>
> Why call malloc() here?
>
>> + qfw_cfg_get(fw_cfg, sel, buf, len);
>
> And not copy directly to 'data':
>
> filesize = len;
> if (len > buflen) {
> len = buflen;
> }
> qfw_cfg_get(fw_cfg, sel, data, len);
>
>> + memcpy(data, buf, buflen);
>> + g_free(buf);
>
> Dropping 2 previous lines.
>
>> + break;
>> + }
>> + }
>> + g_free(filesbuf);
>
> return filesize;
>
>> +}
>> +
>> static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
>> {
>> qtest_writew(fw_cfg->qts, fw_cfg->base, key);
>> diff --git a/tests/libqos/fw_cfg.h b/tests/libqos/fw_cfg.h
>> index 0353416af0..50e4227638 100644
>> --- a/tests/libqos/fw_cfg.h
>> +++ b/tests/libqos/fw_cfg.h
>> @@ -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);
>> +void 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);
>> QFWCFG *io_fw_cfg_init(QTestState *qts, uint16_t base);
>>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 0/2] tests: fw_cfg: add reboot-timeout test case
@ 2019-01-20 7:13 Li Qiang
2019-01-20 7:13 ` [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry Li Qiang
2019-01-20 7:13 ` [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case Li Qiang
0 siblings, 2 replies; 11+ messages in thread
From: Li Qiang @ 2019-01-20 7:13 UTC (permalink / raw)
To: philmd, lersek, kraxel, thuth, lvivier, pbonzini
Cc: qemu-devel, liq3ea, Li Qiang
The first patch adds a util function to get
the fw_cfg file entry.
And second adds a reboot-timeout test case.
Li Qiang (2):
tests: fw_cfg: add a function to get the fw_cfg file entry
tests: fw_cfg: add reboot_timeout test case
tests/fw_cfg-test.c | 13 ++++++++++++-
tests/libqos/fw_cfg.c | 33 +++++++++++++++++++++++++++++++++
tests/libqos/fw_cfg.h | 2 ++
3 files changed, 47 insertions(+), 1 deletion(-)
--
2.17.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry
2019-01-20 7:13 [Qemu-devel] [PATCH 0/2] tests: fw_cfg: add reboot-timeout test case Li Qiang
@ 2019-01-20 7:13 ` Li Qiang
2019-01-21 21:32 ` Laszlo Ersek
2019-01-20 7:13 ` [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case Li Qiang
1 sibling, 1 reply; 11+ messages in thread
From: Li Qiang @ 2019-01-20 7:13 UTC (permalink / raw)
To: philmd, lersek, kraxel, thuth, lvivier, pbonzini
Cc: qemu-devel, liq3ea, Li Qiang
This is useful to write qtest about fw_cfg file entry.
Signed-off-by: Li Qiang <liq3ea@163.com>
---
tests/libqos/fw_cfg.c | 33 +++++++++++++++++++++++++++++++++
tests/libqos/fw_cfg.h | 2 ++
2 files changed, 35 insertions(+)
diff --git a/tests/libqos/fw_cfg.c b/tests/libqos/fw_cfg.c
index d0889d1e22..e2b0cae7cd 100644
--- a/tests/libqos/fw_cfg.c
+++ b/tests/libqos/fw_cfg.c
@@ -16,6 +16,7 @@
#include "libqos/fw_cfg.h"
#include "libqtest.h"
#include "qemu/bswap.h"
+#include "standard-headers/linux/qemu_fw_cfg.h"
void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
{
@@ -54,6 +55,38 @@ uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key)
return le64_to_cpu(value);
}
+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;
+ uint32_t dsize;
+ struct fw_cfg_file *p;
+ 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_malloc0(dsize);
+ qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
+ p = (struct fw_cfg_file *)(filesbuf + sizeof(uint32_t));
+ for (i = 0; i < count; ++i, ++p) {
+ if (!strcmp(p->name, filename)) {
+ uint32_t len = be32_to_cpu(p->size);
+ uint16_t sel = be16_to_cpu(p->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_select(QFWCFG *fw_cfg, uint16_t key)
{
qtest_writew(fw_cfg->qts, fw_cfg->base, key);
diff --git a/tests/libqos/fw_cfg.h b/tests/libqos/fw_cfg.h
index 0353416af0..de73722e67 100644
--- a/tests/libqos/fw_cfg.h
+++ b/tests/libqos/fw_cfg.h
@@ -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);
QFWCFG *io_fw_cfg_init(QTestState *qts, uint16_t base);
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case
2019-01-20 7:13 [Qemu-devel] [PATCH 0/2] tests: fw_cfg: add reboot-timeout test case Li Qiang
2019-01-20 7:13 ` [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry Li Qiang
@ 2019-01-20 7:13 ` Li Qiang
2019-01-21 21:38 ` Laszlo Ersek
1 sibling, 1 reply; 11+ messages in thread
From: Li Qiang @ 2019-01-20 7:13 UTC (permalink / raw)
To: philmd, lersek, kraxel, thuth, lvivier, pbonzini
Cc: qemu-devel, liq3ea, Li Qiang
Signed-off-by: Li Qiang <liq3ea@163.com>
---
tests/fw_cfg-test.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/tests/fw_cfg-test.c b/tests/fw_cfg-test.c
index 1c5103fe1c..c28e6c3fb5 100644
--- a/tests/fw_cfg-test.c
+++ b/tests/fw_cfg-test.c
@@ -99,6 +99,15 @@ static void test_fw_cfg_boot_menu(void)
g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_BOOT_MENU), ==, boot_menu);
}
+static void test_fw_cfg_reboot_timeout(void)
+{
+ uint32_t reboot_timeout;
+
+ qfw_cfg_get_file(fw_cfg, "etc/boot-fail-wait",
+ &reboot_timeout, sizeof(reboot_timeout));
+ g_assert_cmpint(reboot_timeout, ==, 15);
+}
+
int main(int argc, char **argv)
{
QTestState *s;
@@ -106,7 +115,8 @@ int main(int argc, char **argv)
g_test_init(&argc, &argv, NULL);
- s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8");
+ s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8 "
+ "-boot reboot-timeout=15");
fw_cfg = pc_fw_cfg_init(s);
@@ -125,6 +135,7 @@ int main(int argc, char **argv)
qtest_add_func("fw_cfg/max_cpus", test_fw_cfg_max_cpus);
qtest_add_func("fw_cfg/numa", test_fw_cfg_numa);
qtest_add_func("fw_cfg/boot_menu", test_fw_cfg_boot_menu);
+ qtest_add_func("fw_cfg/reboot_timeout", test_fw_cfg_reboot_timeout);
ret = g_test_run();
--
2.17.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry
2019-01-20 7:13 ` [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry Li Qiang
@ 2019-01-21 21:32 ` Laszlo Ersek
2019-01-22 1:21 ` Li Qiang
0 siblings, 1 reply; 11+ messages in thread
From: Laszlo Ersek @ 2019-01-21 21:32 UTC (permalink / raw)
To: Li Qiang, philmd, kraxel, thuth, lvivier, pbonzini; +Cc: qemu-devel, liq3ea
On 01/20/19 08:13, Li Qiang wrote:
> This is useful to write qtest about fw_cfg file entry.
>
> Signed-off-by: Li Qiang <liq3ea@163.com>
> ---
> tests/libqos/fw_cfg.c | 33 +++++++++++++++++++++++++++++++++
> tests/libqos/fw_cfg.h | 2 ++
> 2 files changed, 35 insertions(+)
>
> diff --git a/tests/libqos/fw_cfg.c b/tests/libqos/fw_cfg.c
> index d0889d1e22..e2b0cae7cd 100644
> --- a/tests/libqos/fw_cfg.c
> +++ b/tests/libqos/fw_cfg.c
> @@ -16,6 +16,7 @@
> #include "libqos/fw_cfg.h"
> #include "libqtest.h"
> #include "qemu/bswap.h"
> +#include "standard-headers/linux/qemu_fw_cfg.h"
>
> void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
> {
> @@ -54,6 +55,38 @@ uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key)
> return le64_to_cpu(value);
> }
>
> +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;
> + uint32_t dsize;
dsize should be size_t
> + struct fw_cfg_file *p;
Please use a better variable name, such as "dir_entry" or similar.
> + 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);
where does "struct fw_cfg_file" come from?
... more precisely: why use it over the "FWCfgFile" typedef? (applies to
the declaration of "p" as well).
> + filesbuf = g_malloc0(dsize);
> + qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
> + p = (struct fw_cfg_file *)(filesbuf + sizeof(uint32_t));
> + for (i = 0; i < count; ++i, ++p) {
> + if (!strcmp(p->name, filename)) {
> + uint32_t len = be32_to_cpu(p->size);
> + uint16_t sel = be16_to_cpu(p->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_select(QFWCFG *fw_cfg, uint16_t key)
> {
> qtest_writew(fw_cfg->qts, fw_cfg->base, key);
> diff --git a/tests/libqos/fw_cfg.h b/tests/libqos/fw_cfg.h
> index 0353416af0..de73722e67 100644
> --- a/tests/libqos/fw_cfg.h
> +++ b/tests/libqos/fw_cfg.h
> @@ -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);
> QFWCFG *io_fw_cfg_init(QTestState *qts, uint16_t base);
>
Looks OK to me otherwise.
Thanks,
Laszlo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case
2019-01-20 7:13 ` [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case Li Qiang
@ 2019-01-21 21:38 ` Laszlo Ersek
2019-01-22 1:28 ` Li Qiang
0 siblings, 1 reply; 11+ messages in thread
From: Laszlo Ersek @ 2019-01-21 21:38 UTC (permalink / raw)
To: Li Qiang, philmd, kraxel, thuth, lvivier, pbonzini; +Cc: qemu-devel, liq3ea
On 01/20/19 08:13, Li Qiang wrote:
> Signed-off-by: Li Qiang <liq3ea@163.com>
> ---
> tests/fw_cfg-test.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/tests/fw_cfg-test.c b/tests/fw_cfg-test.c
> index 1c5103fe1c..c28e6c3fb5 100644
> --- a/tests/fw_cfg-test.c
> +++ b/tests/fw_cfg-test.c
> @@ -99,6 +99,15 @@ static void test_fw_cfg_boot_menu(void)
> g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_BOOT_MENU), ==, boot_menu);
> }
>
> +static void test_fw_cfg_reboot_timeout(void)
> +{
> + uint32_t reboot_timeout;
> +
> + qfw_cfg_get_file(fw_cfg, "etc/boot-fail-wait",
> + &reboot_timeout, sizeof(reboot_timeout));
> + g_assert_cmpint(reboot_timeout, ==, 15);
> +}
> +
You don't check the return status of qfw_cfg_get_file(), before reading
"reboot_timeout". If the qfw_cfg_get_file() fails (returning 0), then
the comparison will refer to an indeterminate value. Also, it's
theoretically possible for qfw_cfg_get_file() to overwrite only part of
the "reboot_timeout" object.
So I think we need the function to transfer exactly (sizeof
reboot_timeout) bytes.
BTW, this reminds me, qfw_cfg_get_file() seems to return the number of
bytes that would be necessary for transferring the entire file. That
looks like a good idea, but it should be documented. Please add some
docs on top of qfw_cfg_get_file().
> int main(int argc, char **argv)
> {
> QTestState *s;
> @@ -106,7 +115,8 @@ int main(int argc, char **argv)
>
> g_test_init(&argc, &argv, NULL);
>
> - s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8");
> + s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8 "
> + "-boot reboot-timeout=15");
>
> fw_cfg = pc_fw_cfg_init(s);
>
> @@ -125,6 +135,7 @@ int main(int argc, char **argv)
> qtest_add_func("fw_cfg/max_cpus", test_fw_cfg_max_cpus);
> qtest_add_func("fw_cfg/numa", test_fw_cfg_numa);
> qtest_add_func("fw_cfg/boot_menu", test_fw_cfg_boot_menu);
> + qtest_add_func("fw_cfg/reboot_timeout", test_fw_cfg_reboot_timeout);
>
> ret = g_test_run();
>
>
Looks OK otherwise.
Thanks
Laszlo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry
2019-01-21 21:32 ` Laszlo Ersek
@ 2019-01-22 1:21 ` Li Qiang
0 siblings, 0 replies; 11+ messages in thread
From: Li Qiang @ 2019-01-22 1:21 UTC (permalink / raw)
To: Laszlo Ersek
Cc: Li Qiang, Philippe Mathieu-Daudé, Gerd Hoffmann, Thomas Huth,
lvivier, Paolo Bonzini, Qemu Developers
Laszlo Ersek <lersek@redhat.com> 于2019年1月22日周二 上午5:32写道:
> On 01/20/19 08:13, Li Qiang wrote:
> > This is useful to write qtest about fw_cfg file entry.
> >
> > Signed-off-by: Li Qiang <liq3ea@163.com>
> > ---
> > tests/libqos/fw_cfg.c | 33 +++++++++++++++++++++++++++++++++
> > tests/libqos/fw_cfg.h | 2 ++
> > 2 files changed, 35 insertions(+)
> >
> > diff --git a/tests/libqos/fw_cfg.c b/tests/libqos/fw_cfg.c
> > index d0889d1e22..e2b0cae7cd 100644
> > --- a/tests/libqos/fw_cfg.c
> > +++ b/tests/libqos/fw_cfg.c
> > @@ -16,6 +16,7 @@
> > #include "libqos/fw_cfg.h"
> > #include "libqtest.h"
> > #include "qemu/bswap.h"
> > +#include "standard-headers/linux/qemu_fw_cfg.h"
> >
> > void qfw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
> > {
> > @@ -54,6 +55,38 @@ uint64_t qfw_cfg_get_u64(QFWCFG *fw_cfg, uint16_t key)
> > return le64_to_cpu(value);
> > }
> >
> > +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;
> > + uint32_t dsize;
>
> dsize should be size_t
>
>
OK.
> > + struct fw_cfg_file *p;
>
> Please use a better variable name, such as "dir_entry" or similar.
>
>
OK.
> > + 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);
>
> where does "struct fw_cfg_file" come from?
>
>
>From include/standard-headers/linux/qemu_fw_cfg.h
> ... more precisely: why use it over the "FWCfgFile" typedef? (applies to
> the declaration of "p" as well).
>
>
Ok, I think we should use include/hw/nvram/fw_cfg.h.
Thanks,
Li Qiang
> > + filesbuf = g_malloc0(dsize);
> > + qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
> > + p = (struct fw_cfg_file *)(filesbuf + sizeof(uint32_t));
> > + for (i = 0; i < count; ++i, ++p) {
> > + if (!strcmp(p->name, filename)) {
> > + uint32_t len = be32_to_cpu(p->size);
> > + uint16_t sel = be16_to_cpu(p->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_select(QFWCFG *fw_cfg, uint16_t key)
> > {
> > qtest_writew(fw_cfg->qts, fw_cfg->base, key);
> > diff --git a/tests/libqos/fw_cfg.h b/tests/libqos/fw_cfg.h
> > index 0353416af0..de73722e67 100644
> > --- a/tests/libqos/fw_cfg.h
> > +++ b/tests/libqos/fw_cfg.h
> > @@ -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);
> > QFWCFG *io_fw_cfg_init(QTestState *qts, uint16_t base);
> >
>
> Looks OK to me otherwise.
>
> Thanks,
> Laszlo
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case
2019-01-21 21:38 ` Laszlo Ersek
@ 2019-01-22 1:28 ` Li Qiang
2019-01-22 12:10 ` Laszlo Ersek
0 siblings, 1 reply; 11+ messages in thread
From: Li Qiang @ 2019-01-22 1:28 UTC (permalink / raw)
To: Laszlo Ersek
Cc: Li Qiang, Philippe Mathieu-Daudé, Gerd Hoffmann, Thomas Huth,
lvivier, Paolo Bonzini, Qemu Developers
Laszlo Ersek <lersek@redhat.com> 于2019年1月22日周二 上午5:38写道:
> On 01/20/19 08:13, Li Qiang wrote:
> > Signed-off-by: Li Qiang <liq3ea@163.com>
> > ---
> > tests/fw_cfg-test.c | 13 ++++++++++++-
> > 1 file changed, 12 insertions(+), 1 deletion(-)
> >
> > diff --git a/tests/fw_cfg-test.c b/tests/fw_cfg-test.c
> > index 1c5103fe1c..c28e6c3fb5 100644
> > --- a/tests/fw_cfg-test.c
> > +++ b/tests/fw_cfg-test.c
> > @@ -99,6 +99,15 @@ static void test_fw_cfg_boot_menu(void)
> > g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_BOOT_MENU), ==,
> boot_menu);
> > }
> >
> > +static void test_fw_cfg_reboot_timeout(void)
> > +{
> > + uint32_t reboot_timeout;
> > +
> > + qfw_cfg_get_file(fw_cfg, "etc/boot-fail-wait",
> > + &reboot_timeout, sizeof(reboot_timeout));
> > + g_assert_cmpint(reboot_timeout, ==, 15);
> > +}
> > +
>
> You don't check the return status of qfw_cfg_get_file(), before reading
> "reboot_timeout". If the qfw_cfg_get_file() fails (returning 0), then
> the comparison will refer to an indeterminate value. Also, it's
> theoretically possible for qfw_cfg_get_file() to overwrite only part of
> the "reboot_timeout" object.
>
>
Right. I will change in the next revision.
> So I think we need the function to transfer exactly (sizeof
> reboot_timeout) bytes.
>
>
What does this mean? check the return of 'qfw_cfg_get_file' if it is
sizeof(reboot_timeout)?
> BTW, this reminds me, qfw_cfg_get_file() seems to return the number of
> bytes that would be necessary for transferring the entire file. That
> looks like a good idea, but it should be documented. Please add some
> docs on top of qfw_cfg_get_file().
>
>
The docs like "return 0 means failed and non-zero means successful but
the caller need check the exactly size to avoid partially file size" ?
Thanks,
Li Qiang
> > int main(int argc, char **argv)
> > {
> > QTestState *s;
> > @@ -106,7 +115,8 @@ int main(int argc, char **argv)
> >
> > g_test_init(&argc, &argv, NULL);
> >
> > - s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8");
> > + s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8 "
> > + "-boot reboot-timeout=15");
> >
> > fw_cfg = pc_fw_cfg_init(s);
> >
> > @@ -125,6 +135,7 @@ int main(int argc, char **argv)
> > qtest_add_func("fw_cfg/max_cpus", test_fw_cfg_max_cpus);
> > qtest_add_func("fw_cfg/numa", test_fw_cfg_numa);
> > qtest_add_func("fw_cfg/boot_menu", test_fw_cfg_boot_menu);
> > + qtest_add_func("fw_cfg/reboot_timeout", test_fw_cfg_reboot_timeout);
> >
> > ret = g_test_run();
> >
> >
>
> Looks OK otherwise.
>
> Thanks
> Laszlo
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case
2019-01-22 1:28 ` Li Qiang
@ 2019-01-22 12:10 ` Laszlo Ersek
0 siblings, 0 replies; 11+ messages in thread
From: Laszlo Ersek @ 2019-01-22 12:10 UTC (permalink / raw)
To: Li Qiang
Cc: Li Qiang, Philippe Mathieu-Daudé, Gerd Hoffmann, Thomas Huth,
lvivier, Paolo Bonzini, Qemu Developers
On 01/22/19 02:28, Li Qiang wrote:
> Laszlo Ersek <lersek@redhat.com> 于2019年1月22日周二 上午5:38写道:
>
>> On 01/20/19 08:13, Li Qiang wrote:
>>> Signed-off-by: Li Qiang <liq3ea@163.com>
>>> ---
>>> tests/fw_cfg-test.c | 13 ++++++++++++-
>>> 1 file changed, 12 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/tests/fw_cfg-test.c b/tests/fw_cfg-test.c
>>> index 1c5103fe1c..c28e6c3fb5 100644
>>> --- a/tests/fw_cfg-test.c
>>> +++ b/tests/fw_cfg-test.c
>>> @@ -99,6 +99,15 @@ static void test_fw_cfg_boot_menu(void)
>>> g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_BOOT_MENU), ==,
>> boot_menu);
>>> }
>>>
>>> +static void test_fw_cfg_reboot_timeout(void)
>>> +{
>>> + uint32_t reboot_timeout;
>>> +
>>> + qfw_cfg_get_file(fw_cfg, "etc/boot-fail-wait",
>>> + &reboot_timeout, sizeof(reboot_timeout));
>>> + g_assert_cmpint(reboot_timeout, ==, 15);
>>> +}
>>> +
>>
>> You don't check the return status of qfw_cfg_get_file(), before reading
>> "reboot_timeout". If the qfw_cfg_get_file() fails (returning 0), then
>> the comparison will refer to an indeterminate value. Also, it's
>> theoretically possible for qfw_cfg_get_file() to overwrite only part of
>> the "reboot_timeout" object.
>>
>>
> Right. I will change in the next revision.
>
>
>
>> So I think we need the function to transfer exactly (sizeof
>> reboot_timeout) bytes.
>>
>>
> What does this mean? check the return of 'qfw_cfg_get_file' if it is
> sizeof(reboot_timeout)?
Yes, that's what I meant.
>> BTW, this reminds me, qfw_cfg_get_file() seems to return the number of
>> bytes that would be necessary for transferring the entire file. That
>> looks like a good idea, but it should be documented. Please add some
>> docs on top of qfw_cfg_get_file().
>>
>>
> The docs like "return 0 means failed and non-zero means successful but
> the caller need check the exactly size to avoid partially file size" ?
Yes. A bit more precisely, 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.
Vice versa, 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.
In the comparison that follows qfw_cfg_get_file(), we want to be sure
that the "reboot_timeout" integer object has been fully populated,
*plus* that we aren't ignoring any trailing bytes from the fw_cfg file.
Hence the strict equality on the size.
Thanks
Laszlo
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2019-01-22 19:16 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-01-20 7:13 [Qemu-devel] [PATCH 0/2] tests: fw_cfg: add reboot-timeout test case Li Qiang
2019-01-20 7:13 ` [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry Li Qiang
2019-01-21 21:32 ` Laszlo Ersek
2019-01-22 1:21 ` Li Qiang
2019-01-20 7:13 ` [Qemu-devel] [PATCH 2/2] tests: fw_cfg: add reboot_timeout test case Li Qiang
2019-01-21 21:38 ` Laszlo Ersek
2019-01-22 1:28 ` Li Qiang
2019-01-22 12:10 ` Laszlo Ersek
-- strict thread matches above, loose matches on Subject: below --
2018-10-28 12:40 [Qemu-devel] [PATCH 0/2] test: fw_cfg: add reboot-timeout " Li Qiang
2018-10-28 12:40 ` [Qemu-devel] [PATCH 1/2] tests: fw_cfg: add a function to get the fw_cfg file entry Li Qiang
2018-10-29 23:46 ` Philippe Mathieu-Daudé
2018-10-30 1:45 ` li qiang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).