Re: [kvm-unit-tests PATCH v4 3/9] s390x: interrupt registration

Janosch Frank
2019-12-12T09:39:32Z

[-- Attachment #1.1: Type: text/plain, Size: 2244 bytes --]

On 12/11/19 4:46 PM, Pierre Morel wrote:
> Define two functions to register and to unregister a call back for IO
> Interrupt handling.

How about:
Let's make it possible to add and remove a custom io interrupt handler,
that can be used instead of the normal one.

>
> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Reviewed-by: David Hildenbrand <david@redhat.com>
> ---
> lib/s390x/interrupt.c | 23 ++++++++++++++++++++++-
> lib/s390x/interrupt.h | 7 +++++++
> 2 files changed, 29 insertions(+), 1 deletion(-)
> create mode 100644 lib/s390x/interrupt.h
>
> diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c
> index 05f30be..b70aafd 100644
> --- a/lib/s390x/interrupt.c
> +++ b/lib/s390x/interrupt.c
> @@ -10,9 +10,9 @@
> * under the terms of the GNU Library General Public License version 2.
> */
> #include <libcflat.h>
> -#include <asm/interrupt.h>
> #include <asm/barrier.h>
> #include <sclp.h>
> +#include <interrupt.h>
>
> static bool pgm_int_expected;
> static bool ext_int_expected;
> @@ -141,12 +141,33 @@ void handle_mcck_int(void)
> lc->mcck_old_psw.addr);
> }
>
> +static void (*io_int_func)(void);
> +
> void handle_io_int(void)
> {
> + if (*io_int_func)
> + return (*io_int_func)();
> +
> report_abort("Unexpected io interrupt: at %#lx",
> lc->io_old_psw.addr);
> }
>
> +int register_io_int_func(void (*f)(void))
> +{
> + if (io_int_func)
> + return -1;
> + io_int_func = f;
> + return 0;
> +}

Not completely sure why this isn't a bool, but ok.

> +
> +int unregister_io_int_func(void (*f)(void))
> +{
> + if (io_int_func != f)
> + return -1;
> + io_int_func = NULL;
> + return 0;
> +}
> +
> void handle_svc_int(void)
> {
> report_abort("Unexpected supervisor call interrupt: at %#lx",
> diff --git a/lib/s390x/interrupt.h b/lib/s390x/interrupt.h
> new file mode 100644
> index 0000000..e945ef7
> --- /dev/null
> +++ b/lib/s390x/interrupt.h
> @@ -0,0 +1,7 @@
> +#ifndef __INTERRUPT_H
> +#include <asm/interrupt.h>
> +
> +int register_io_int_func(void (*f)(void));
> +int unregister_io_int_func(void (*f)(void));
> +
> +#endif
>

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]