* [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
* 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 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
* [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 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 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
* [Qemu-devel] [PATCH 0/2] test: fw_cfg: add reboot-timeout test case @ 2018-10-28 12:40 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 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 patchset is the test case for the following patch: https://lists.gnu.org/archive/html/qemu-devel/2018-10/msg05254.html 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 | 30 ++++++++++++++++++++++++++++++ tests/libqos/fw_cfg.h | 2 ++ 3 files changed, 44 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 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
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).