Re: [Qemu-devel] [RFC PATCH 6/6] hw/ppc/pnv_homer: add python interface support for homer/occ common area

2019-08-11 Thread Balamuruhan S
On 8/9/19 10:16 AM, David Gibson wrote:
> On Wed, Aug 07, 2019 at 12:44:45PM +0530, Balamuruhan S wrote:
>> use python interface APIs in homer/occ common area emulation to
>> interact with scripts if provided else fallback to normal flow,
>> it shows how simple to use the interface to call python methods
>> with any number of arguments in any script placed in common
>> -module-path provided in qemu commandline.
> What's the use case for this?

The usecase can be performing multiple boot test of the vm or during runtime
with different values expected/unexpected by firmware/kernel and check
how it is behaving or how it should behave.

It can be used as a framework for CI or regression.

>
>> Signed-off-by: Balamuruhan S 
>> ---
>>  hw/ppc/pnv_homer.c  | 20 
>>  hw/ppc/pnv_xscom.c  |  9 +
>>  include/sysemu/sysemu.h |  4 
>>  vl.c| 24 
>>  4 files changed, 53 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/ppc/pnv_homer.c b/hw/ppc/pnv_homer.c
>> index 73a94856d0..6ae5e74f19 100644
>> --- a/hw/ppc/pnv_homer.c
>> +++ b/hw/ppc/pnv_homer.c
>> @@ -16,7 +16,9 @@
>>   * You should have received a copy of the GNU Lesser General Public
>>   * License along with this library; if not, see 
>> .
>>   */
>> +#include "sysemu/python_api.h"
>>  #include "qemu/osdep.h"
>> +#include "sysemu/sysemu.h"
>>  #include "sysemu/hw_accel.h"
>>  #include "sysemu/cpus.h"
>>  #include "hw/ppc/pnv.h"
>> @@ -37,6 +39,15 @@ static bool core_max_array(hwaddr addr)
>>  
>>  static uint64_t homer_read(void *opaque, hwaddr addr, unsigned width)
>>  {
>> +if (homer_module && homer) {
>> +uint64_t homer_ret;
>> +char **address = g_malloc(sizeof(uint64_t));
>> +python_args_init_cast_long(address, addr, 0);
>> +homer_ret = python_callback_int(module_path, homer_module, homer, 
>> address, 1);
>> +python_args_clean(address, 1);
>> +g_free(address);
>> +return homer_ret;
>> +}
>>  switch (addr) {
>>  case 0xe2006:  /* max pstate ultra turbo */
>>  case 0xe2018:  /* pstate id for 0 */
>> @@ -106,6 +117,15 @@ const MemoryRegionOps pnv_homer_ops = {
>>  
>>  static uint64_t occ_common_area_read(void *opaque, hwaddr addr, unsigned 
>> width)
>>  {
>> +if (occ_module && occ) {
>> +uint64_t occ_ret;
>> +char **address = g_malloc(sizeof(uint64_t));
>> +python_args_init_cast_long(address, addr, 0);
>> +occ_ret = python_callback_int(module_path, occ_module, occ, 
>> address, 1);
>> +python_args_clean(address, 1);
>> +g_free(address);
>> +return occ_ret;
>> +}
>>  switch (addr) {
>>  /*
>>   * occ-sensor sanity check that asserts the sensor
>> diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
>> index 18a780bcdf..5e41b7c953 100644
>> --- a/hw/ppc/pnv_xscom.c
>> +++ b/hw/ppc/pnv_xscom.c
>> @@ -179,13 +179,14 @@ static uint64_t xscom_read(void *opaque, hwaddr addr, 
>> unsigned width)
>>  MemTxResult result;
>>  
>>  if (xscom_module && xscom_readp) {
>> -char **args = g_malloc(2 * sizeof(uint64_t));
>> +char **args = g_malloc(3 * sizeof(uint64_t));
>>  PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
>>  python_args_init_cast_long(args, pcba, 0);
>> -python_args_init_cast_int(args, pcc->chip_type, 1);
>> +python_args_init_cast_int(args, chip->chip_num, 1);
>> +python_args_init_cast_int(args, pcc->chip_type, 2);
>>  val = python_callback_int(module_path, xscom_module, xscom_readp,
>> -  args, 2);
>> -python_args_clean(args, 2);
>> +  args, 3);
>> +python_args_clean(args, 3);
>>  g_free(args);
>>  }
>>  else {
>> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
>> index 9b8dc346d6..3c8119e040 100644
>> --- a/include/sysemu/sysemu.h
>> +++ b/include/sysemu/sysemu.h
>> @@ -121,6 +121,10 @@ extern const char *module_path;
>>  extern const char *xscom_module;
>>  extern const char *xscom_readp;
>>  extern const char *xscom_writep;
>> +extern const char *homer_module;
>> +extern const char *homer;
>> +extern const char *occ_module;
>> +extern const char *occ;
>>  extern int mem_prealloc;
>>  
>>  #define MAX_NODES 128
>> diff --git a/vl.c b/vl.c
>> index 28f0dc1c1b..c96d35d907 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -144,6 +144,10 @@ const char *module_path = NULL;
>>  const char *xscom_module = NULL;
>>  const char *xscom_readp = NULL;
>>  const char *xscom_writep = NULL;
>> +const char *homer_module = NULL;
>> +const char *homer = NULL;
>> +const char *occ_module = NULL;
>> +const char *occ = NULL;
>>  int mem_prealloc = 0; /* force preallocation of physical target memory */
>>  bool enable_mlock = false;
>>  bool enable_cpu_pm = false;
>> @@ -495,6 +499,22 @@ static QemuOptsList qemu_module_opts = {
>>  

Re: [Qemu-devel] [RFC PATCH 6/6] hw/ppc/pnv_homer: add python interface support for homer/occ common area

2019-08-11 Thread Balamuruhan S


On 8/7/19 3:57 PM, Philippe Mathieu-Daudé wrote:
> On 8/7/19 9:14 AM, Balamuruhan S wrote:
>> use python interface APIs in homer/occ common area emulation to
>> interact with scripts if provided else fallback to normal flow,
>> it shows how simple to use the interface to call python methods
>> with any number of arguments in any script placed in common
>> -module-path provided in qemu commandline.
>>
>> Signed-off-by: Balamuruhan S 
>> ---
>>  hw/ppc/pnv_homer.c  | 20 
>>  hw/ppc/pnv_xscom.c  |  9 +
>>  include/sysemu/sysemu.h |  4 
>>  vl.c| 24 
>>  4 files changed, 53 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/ppc/pnv_homer.c b/hw/ppc/pnv_homer.c
>> index 73a94856d0..6ae5e74f19 100644
>> --- a/hw/ppc/pnv_homer.c
>> +++ b/hw/ppc/pnv_homer.c
>> @@ -16,7 +16,9 @@
>>   * You should have received a copy of the GNU Lesser General Public
>>   * License along with this library; if not, see 
>> .
>>   */
>> +#include "sysemu/python_api.h"
>>  #include "qemu/osdep.h"
>> +#include "sysemu/sysemu.h"
>>  #include "sysemu/hw_accel.h"
>>  #include "sysemu/cpus.h"
>>  #include "hw/ppc/pnv.h"
>> @@ -37,6 +39,15 @@ static bool core_max_array(hwaddr addr)
>>  
>>  static uint64_t homer_read(void *opaque, hwaddr addr, unsigned width)
>>  {
>> +if (homer_module && homer) {
>> +uint64_t homer_ret;
>> +char **address = g_malloc(sizeof(uint64_t));
>> +python_args_init_cast_long(address, addr, 0);
>> +homer_ret = python_callback_int(module_path, homer_module, homer, 
>> address, 1);
>> +python_args_clean(address, 1);
>> +g_free(address);
> Maybe the heap overhead can be simplified alloc'ing in the PnvChip
> structure.

But it also depends on with how many arguments that we need to call python

functions associated with read/write ops. sure, I will check the way to

adopt this suggestion.

Thanks Philippe.


>
>> +return homer_ret;
>> +}
>>  switch (addr) {
>>  case 0xe2006:  /* max pstate ultra turbo */
>>  case 0xe2018:  /* pstate id for 0 */
>> @@ -106,6 +117,15 @@ const MemoryRegionOps pnv_homer_ops = {
>>  
>>  static uint64_t occ_common_area_read(void *opaque, hwaddr addr, unsigned 
>> width)
>>  {
>> +if (occ_module && occ) {
>> +uint64_t occ_ret;
>> +char **address = g_malloc(sizeof(uint64_t));
>> +python_args_init_cast_long(address, addr, 0);
>> +occ_ret = python_callback_int(module_path, occ_module, occ, 
>> address, 1);
>> +python_args_clean(address, 1);
>> +g_free(address);
>> +return occ_ret;
>> +}
>>  switch (addr) {
>>  /*
>>   * occ-sensor sanity check that asserts the sensor
>> diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
>> index 18a780bcdf..5e41b7c953 100644
>> --- a/hw/ppc/pnv_xscom.c
>> +++ b/hw/ppc/pnv_xscom.c
>> @@ -179,13 +179,14 @@ static uint64_t xscom_read(void *opaque, hwaddr addr, 
>> unsigned width)
>>  MemTxResult result;
>>  
>>  if (xscom_module && xscom_readp) {
>> -char **args = g_malloc(2 * sizeof(uint64_t));
>> +char **args = g_malloc(3 * sizeof(uint64_t));
>>  PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
>>  python_args_init_cast_long(args, pcba, 0);
>> -python_args_init_cast_int(args, pcc->chip_type, 1);
>> +python_args_init_cast_int(args, chip->chip_num, 1);
>> +python_args_init_cast_int(args, pcc->chip_type, 2);
>>  val = python_callback_int(module_path, xscom_module, xscom_readp,
>> -  args, 2);
>> -python_args_clean(args, 2);
>> +  args, 3);
>> +python_args_clean(args, 3);
>>  g_free(args);
>>  }
>>  else {
>> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
>> index 9b8dc346d6..3c8119e040 100644
>> --- a/include/sysemu/sysemu.h
>> +++ b/include/sysemu/sysemu.h
>> @@ -121,6 +121,10 @@ extern const char *module_path;
>>  extern const char *xscom_module;
>>  extern const char *xscom_readp;
>>  extern const char *xscom_writep;
>> +extern const char *homer_module;
>> +extern const char *homer;
>> +extern const char *occ_module;
>> +extern const char *occ;
>>  extern int mem_prealloc;
>>  
>>  #define MAX_NODES 128
>> diff --git a/vl.c b/vl.c
>> index 28f0dc1c1b..c96d35d907 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -144,6 +144,10 @@ const char *module_path = NULL;
>>  const char *xscom_module = NULL;
>>  const char *xscom_readp = NULL;
>>  const char *xscom_writep = NULL;
>> +const char *homer_module = NULL;
>> +const char *homer = NULL;
>> +const char *occ_module = NULL;
>> +const char *occ = NULL;
>>  int mem_prealloc = 0; /* force preallocation of physical target memory */
>>  bool enable_mlock = false;
>>  bool enable_cpu_pm = false;
>> @@ -495,6 +499,22 @@ static QemuOptsList qemu_module_opts = {
>>  

Re: [Qemu-devel] [RFC PATCH 6/6] hw/ppc/pnv_homer: add python interface support for homer/occ common area

2019-08-08 Thread David Gibson
On Wed, Aug 07, 2019 at 12:44:45PM +0530, Balamuruhan S wrote:
> use python interface APIs in homer/occ common area emulation to
> interact with scripts if provided else fallback to normal flow,
> it shows how simple to use the interface to call python methods
> with any number of arguments in any script placed in common
> -module-path provided in qemu commandline.

What's the use case for this?

> 
> Signed-off-by: Balamuruhan S 
> ---
>  hw/ppc/pnv_homer.c  | 20 
>  hw/ppc/pnv_xscom.c  |  9 +
>  include/sysemu/sysemu.h |  4 
>  vl.c| 24 
>  4 files changed, 53 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/pnv_homer.c b/hw/ppc/pnv_homer.c
> index 73a94856d0..6ae5e74f19 100644
> --- a/hw/ppc/pnv_homer.c
> +++ b/hw/ppc/pnv_homer.c
> @@ -16,7 +16,9 @@
>   * You should have received a copy of the GNU Lesser General Public
>   * License along with this library; if not, see 
> .
>   */
> +#include "sysemu/python_api.h"
>  #include "qemu/osdep.h"
> +#include "sysemu/sysemu.h"
>  #include "sysemu/hw_accel.h"
>  #include "sysemu/cpus.h"
>  #include "hw/ppc/pnv.h"
> @@ -37,6 +39,15 @@ static bool core_max_array(hwaddr addr)
>  
>  static uint64_t homer_read(void *opaque, hwaddr addr, unsigned width)
>  {
> +if (homer_module && homer) {
> +uint64_t homer_ret;
> +char **address = g_malloc(sizeof(uint64_t));
> +python_args_init_cast_long(address, addr, 0);
> +homer_ret = python_callback_int(module_path, homer_module, homer, 
> address, 1);
> +python_args_clean(address, 1);
> +g_free(address);
> +return homer_ret;
> +}
>  switch (addr) {
>  case 0xe2006:  /* max pstate ultra turbo */
>  case 0xe2018:  /* pstate id for 0 */
> @@ -106,6 +117,15 @@ const MemoryRegionOps pnv_homer_ops = {
>  
>  static uint64_t occ_common_area_read(void *opaque, hwaddr addr, unsigned 
> width)
>  {
> +if (occ_module && occ) {
> +uint64_t occ_ret;
> +char **address = g_malloc(sizeof(uint64_t));
> +python_args_init_cast_long(address, addr, 0);
> +occ_ret = python_callback_int(module_path, occ_module, occ, address, 
> 1);
> +python_args_clean(address, 1);
> +g_free(address);
> +return occ_ret;
> +}
>  switch (addr) {
>  /*
>   * occ-sensor sanity check that asserts the sensor
> diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
> index 18a780bcdf..5e41b7c953 100644
> --- a/hw/ppc/pnv_xscom.c
> +++ b/hw/ppc/pnv_xscom.c
> @@ -179,13 +179,14 @@ static uint64_t xscom_read(void *opaque, hwaddr addr, 
> unsigned width)
>  MemTxResult result;
>  
>  if (xscom_module && xscom_readp) {
> -char **args = g_malloc(2 * sizeof(uint64_t));
> +char **args = g_malloc(3 * sizeof(uint64_t));
>  PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
>  python_args_init_cast_long(args, pcba, 0);
> -python_args_init_cast_int(args, pcc->chip_type, 1);
> +python_args_init_cast_int(args, chip->chip_num, 1);
> +python_args_init_cast_int(args, pcc->chip_type, 2);
>  val = python_callback_int(module_path, xscom_module, xscom_readp,
> -  args, 2);
> -python_args_clean(args, 2);
> +  args, 3);
> +python_args_clean(args, 3);
>  g_free(args);
>  }
>  else {
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 9b8dc346d6..3c8119e040 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -121,6 +121,10 @@ extern const char *module_path;
>  extern const char *xscom_module;
>  extern const char *xscom_readp;
>  extern const char *xscom_writep;
> +extern const char *homer_module;
> +extern const char *homer;
> +extern const char *occ_module;
> +extern const char *occ;
>  extern int mem_prealloc;
>  
>  #define MAX_NODES 128
> diff --git a/vl.c b/vl.c
> index 28f0dc1c1b..c96d35d907 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -144,6 +144,10 @@ const char *module_path = NULL;
>  const char *xscom_module = NULL;
>  const char *xscom_readp = NULL;
>  const char *xscom_writep = NULL;
> +const char *homer_module = NULL;
> +const char *homer = NULL;
> +const char *occ_module = NULL;
> +const char *occ = NULL;
>  int mem_prealloc = 0; /* force preallocation of physical target memory */
>  bool enable_mlock = false;
>  bool enable_cpu_pm = false;
> @@ -495,6 +499,22 @@ static QemuOptsList qemu_module_opts = {
>  .name = "xscom_write",
>  .type = QEMU_OPT_STRING,
>  },
> +{
> +.name = "homer_module",
> +.type = QEMU_OPT_STRING,
> +},
> +{
> +.name = "homer",
> +.type = QEMU_OPT_STRING,
> +},
> +{
> +.name = "occ_module",
> +.type = QEMU_OPT_STRING,
> +},
> + 

Re: [Qemu-devel] [RFC PATCH 6/6] hw/ppc/pnv_homer: add python interface support for homer/occ common area

2019-08-07 Thread Philippe Mathieu-Daudé
On 8/7/19 9:14 AM, Balamuruhan S wrote:
> use python interface APIs in homer/occ common area emulation to
> interact with scripts if provided else fallback to normal flow,
> it shows how simple to use the interface to call python methods
> with any number of arguments in any script placed in common
> -module-path provided in qemu commandline.
> 
> Signed-off-by: Balamuruhan S 
> ---
>  hw/ppc/pnv_homer.c  | 20 
>  hw/ppc/pnv_xscom.c  |  9 +
>  include/sysemu/sysemu.h |  4 
>  vl.c| 24 
>  4 files changed, 53 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/pnv_homer.c b/hw/ppc/pnv_homer.c
> index 73a94856d0..6ae5e74f19 100644
> --- a/hw/ppc/pnv_homer.c
> +++ b/hw/ppc/pnv_homer.c
> @@ -16,7 +16,9 @@
>   * You should have received a copy of the GNU Lesser General Public
>   * License along with this library; if not, see 
> .
>   */
> +#include "sysemu/python_api.h"
>  #include "qemu/osdep.h"
> +#include "sysemu/sysemu.h"
>  #include "sysemu/hw_accel.h"
>  #include "sysemu/cpus.h"
>  #include "hw/ppc/pnv.h"
> @@ -37,6 +39,15 @@ static bool core_max_array(hwaddr addr)
>  
>  static uint64_t homer_read(void *opaque, hwaddr addr, unsigned width)
>  {
> +if (homer_module && homer) {
> +uint64_t homer_ret;
> +char **address = g_malloc(sizeof(uint64_t));
> +python_args_init_cast_long(address, addr, 0);
> +homer_ret = python_callback_int(module_path, homer_module, homer, 
> address, 1);
> +python_args_clean(address, 1);
> +g_free(address);

Maybe the heap overhead can be simplified alloc'ing in the PnvChip
structure.

> +return homer_ret;
> +}
>  switch (addr) {
>  case 0xe2006:  /* max pstate ultra turbo */
>  case 0xe2018:  /* pstate id for 0 */
> @@ -106,6 +117,15 @@ const MemoryRegionOps pnv_homer_ops = {
>  
>  static uint64_t occ_common_area_read(void *opaque, hwaddr addr, unsigned 
> width)
>  {
> +if (occ_module && occ) {
> +uint64_t occ_ret;
> +char **address = g_malloc(sizeof(uint64_t));
> +python_args_init_cast_long(address, addr, 0);
> +occ_ret = python_callback_int(module_path, occ_module, occ, address, 
> 1);
> +python_args_clean(address, 1);
> +g_free(address);
> +return occ_ret;
> +}
>  switch (addr) {
>  /*
>   * occ-sensor sanity check that asserts the sensor
> diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
> index 18a780bcdf..5e41b7c953 100644
> --- a/hw/ppc/pnv_xscom.c
> +++ b/hw/ppc/pnv_xscom.c
> @@ -179,13 +179,14 @@ static uint64_t xscom_read(void *opaque, hwaddr addr, 
> unsigned width)
>  MemTxResult result;
>  
>  if (xscom_module && xscom_readp) {
> -char **args = g_malloc(2 * sizeof(uint64_t));
> +char **args = g_malloc(3 * sizeof(uint64_t));
>  PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
>  python_args_init_cast_long(args, pcba, 0);
> -python_args_init_cast_int(args, pcc->chip_type, 1);
> +python_args_init_cast_int(args, chip->chip_num, 1);
> +python_args_init_cast_int(args, pcc->chip_type, 2);
>  val = python_callback_int(module_path, xscom_module, xscom_readp,
> -  args, 2);
> -python_args_clean(args, 2);
> +  args, 3);
> +python_args_clean(args, 3);
>  g_free(args);
>  }
>  else {
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 9b8dc346d6..3c8119e040 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -121,6 +121,10 @@ extern const char *module_path;
>  extern const char *xscom_module;
>  extern const char *xscom_readp;
>  extern const char *xscom_writep;
> +extern const char *homer_module;
> +extern const char *homer;
> +extern const char *occ_module;
> +extern const char *occ;
>  extern int mem_prealloc;
>  
>  #define MAX_NODES 128
> diff --git a/vl.c b/vl.c
> index 28f0dc1c1b..c96d35d907 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -144,6 +144,10 @@ const char *module_path = NULL;
>  const char *xscom_module = NULL;
>  const char *xscom_readp = NULL;
>  const char *xscom_writep = NULL;
> +const char *homer_module = NULL;
> +const char *homer = NULL;
> +const char *occ_module = NULL;
> +const char *occ = NULL;
>  int mem_prealloc = 0; /* force preallocation of physical target memory */
>  bool enable_mlock = false;
>  bool enable_cpu_pm = false;
> @@ -495,6 +499,22 @@ static QemuOptsList qemu_module_opts = {
>  .name = "xscom_write",
>  .type = QEMU_OPT_STRING,
>  },
> +{
> +.name = "homer_module",
> +.type = QEMU_OPT_STRING,
> +},
> +{
> +.name = "homer",
> +.type = QEMU_OPT_STRING,
> +},
> +{
> +.name = "occ_module",
> +.type =