On 2/20/20 1:00 PM, Pierre Morel wrote: > 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@xxxxxxxxxxxxx> > Reviewed-by: Thomas Huth <thuth@xxxxxxxxxx> > Reviewed-by: David Hildenbrand <david@xxxxxxxxxx> > Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx> > --- > lib/s390x/interrupt.c | 22 +++++++++++++++++++++- > lib/s390x/interrupt.h | 7 +++++++ > 2 files changed, 28 insertions(+), 1 deletion(-) > create mode 100644 lib/s390x/interrupt.h > > diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c > index 3a40cac..f6f0665 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> Hrm > > static bool pgm_int_expected; > static bool ext_int_expected; > @@ -144,12 +144,32 @@ void handle_mcck_int(void) > stap(), 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: on cpu %d at %#lx", > stap(), 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; > +} > + > +int unregister_io_int_func(void (*f)(void)) > +{ > + if (io_int_func != f) > + return -1; > + io_int_func = NULL; > + return 0; > +} I'm currently working on something similar for PGMs and I see no additional value in two functions for this. Unregistering can be done by doing register_io_int_func(NULL) This should be enough: int register_io_int_func(void (*f)(void)) { io_int_func = f; } > + > void handle_svc_int(void) > { > report_abort("Unexpected supervisor call interrupt: on cpu %d 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:
signature.asc
Description: OpenPGP digital signature