qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC v2 05/34] translate: Listify tcg_exec_init


From: Peter Crosthwaite
Subject: Re: [Qemu-devel] [RFC v2 05/34] translate: Listify tcg_exec_init
Date: Fri, 10 Jul 2015 03:15:24 -0700

On Sat, May 30, 2015 at 11:11 PM, Peter Crosthwaite
<address@hidden> wrote:
> Create a global list of tcg_exec_init functions that is populated at
> startup. Multiple translation engines can register an init function
> and all will be called on the master call to tcg_exec_init.
>
> Introduce a new module, translate-common. This is a common-obj for
> translation functionality such as this.
>
> Signed-off-by: Peter Crosthwaite <address@hidden>
> ---
>  Makefile.objs         |  1 +
>  include/qemu-common.h |  1 +
>  translate-all.c       |  7 ++++++-
>  translate-common.c    | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 58 insertions(+), 1 deletion(-)
>  create mode 100644 translate-common.c
>
> diff --git a/Makefile.objs b/Makefile.objs
> index 4881d2c..294016e 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -67,6 +67,7 @@ common-obj-y += dma-helpers.o
>  common-obj-y += vl.o
>  vl.o-cflags := $(GPROF_CFLAGS) $(SDL_CFLAGS)
>  common-obj-y += tpm.o
> +common-obj-y += translate-common.o
>

The functions added to this module needed to accessible from
linux-user so this has to be an obj-y.

Regards,
Peter

>  common-obj-$(CONFIG_SLIRP) += slirp/
>
> diff --git a/include/qemu-common.h b/include/qemu-common.h
> index 6b373ff..88fbcfa 100644
> --- a/include/qemu-common.h
> +++ b/include/qemu-common.h
> @@ -263,6 +263,7 @@ typedef struct PCIHostDeviceAddress {
>      unsigned int function;
>  } PCIHostDeviceAddress;
>
> +void tcg_exec_init_add(void (*fn)(unsigned long));
>  void tcg_exec_init(unsigned long tb_size);
>  bool tcg_enabled(void);
>
> diff --git a/translate-all.c b/translate-all.c
> index 62042af..b2edfb4 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -677,7 +677,7 @@ static inline void code_gen_alloc(size_t tb_size)
>  /* Must be called before using the QEMU cpus. 'tb_size' is the size
>     (in bytes) allocated to the translation buffer. Zero means default
>     size. */
> -void tcg_exec_init(unsigned long tb_size)
> +static void do_tcg_exec_init(unsigned long tb_size)
>  {
>      cpu_gen_init();
>      code_gen_alloc(tb_size);
> @@ -691,6 +691,11 @@ void tcg_exec_init(unsigned long tb_size)
>  #endif
>  }
>
> +static __attribute__((constructor)) void register_tcg_exec_init(void)
> +{
> +    tcg_exec_init_add(do_tcg_exec_init);
> +}
> +
>  bool tcg_enabled(void)
>  {
>      return tcg_ctx.code_gen_buffer != NULL;
> diff --git a/translate-common.c b/translate-common.c
> new file mode 100644
> index 0000000..563ae5a
> --- /dev/null
> +++ b/translate-common.c
> @@ -0,0 +1,50 @@
> +/*
> + *  Host code generation common components
> + *
> + *  Copyright (c) 2015 Peter Crosthwaite <address@hidden>
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see 
> <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "qemu-common.h"
> +
> +typedef struct TCGExecInitFn {
> +    void (*do_tcg_exec_init)(unsigned long tb_size);
> +    QLIST_ENTRY(TCGExecInitFn) list;
> +} TCGExecInitFn;
> +
> +static QLIST_HEAD(, TCGExecInitFn) tcg_exec_init_list;
> +
> +void tcg_exec_init_add(void (*fn)(unsigned long))
> +{
> +    static bool inited;
> +    TCGExecInitFn *lelem = g_malloc0(sizeof *lelem);
> +
> +    if (!inited) {
> +        inited = true;
> +        QLIST_INIT(&tcg_exec_init_list);
> +    }
> +
> +    lelem->do_tcg_exec_init = fn;
> +    QLIST_INSERT_HEAD(&tcg_exec_init_list, lelem, list);
> +}
> +
> +void tcg_exec_init(unsigned long tb_size)
> +{
> +    TCGExecInitFn *t;
> +
> +    QLIST_FOREACH(t, &tcg_exec_init_list, list) {
> +        t->do_tcg_exec_init(tb_size);
> +    }
> +}
> --
> 1.9.1
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]