Message ID | 1575649588-6127-4-git-send-email-pmorel@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: Testing the Channel Subsystem I/O | expand |
On 06/12/2019 17.26, Pierre Morel wrote: > Define two functions to register and to unregister a call back for IO > Interrupt handling. > > Per default we keep the old behavior, so does a successful unregister > of the callback. > > Signed-off-by: Pierre Morel <pmorel@linux.ibm.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 3e07867..e0eae4d 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; > @@ -140,12 +140,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; > +} > + > +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 > Reviewed-by: Thomas Huth <thuth@redhat.com>
On 06.12.19 17:26, Pierre Morel wrote: > Define two functions to register and to unregister a call back for IO > Interrupt handling. > > Per default we keep the old behavior, so does a successful unregister > of the callback. > > Signed-off-by: Pierre Morel <pmorel@linux.ibm.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 3e07867..e0eae4d 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; > @@ -140,12 +140,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; > +} > + > +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 > Reviewed-by: David Hildenbrand <david@redhat.com>
On 2019-12-09 12:48, David Hildenbrand wrote: > On 06.12.19 17:26, Pierre Morel wrote: >> Define two functions to register and to unregister a call back for IO >> Interrupt handling. >> >> Per default we keep the old behavior, so does a successful unregister >> of the callback. >> >> Signed-off-by: Pierre Morel <pmorel@linux.ibm.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 3e07867..e0eae4d 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; >> @@ -140,12 +140,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; >> +} >> + >> +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 >> > > Reviewed-by: David Hildenbrand <david@redhat.com> > Thanks, Pierre
On 2019-12-09 12:40, Thomas Huth wrote: > On 06/12/2019 17.26, Pierre Morel wrote: >> Define two functions to register and to unregister a call back for IO >> Interrupt handling. >> >> Per default we keep the old behavior, so does a successful unregister >> of the callback. >> >> Signed-off-by: Pierre Morel <pmorel@linux.ibm.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 3e07867..e0eae4d 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; >> @@ -140,12 +140,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; >> +} >> + >> +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 >> > > Reviewed-by: Thomas Huth <thuth@redhat.com> > Thanks, Pierre
diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c index 3e07867..e0eae4d 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; @@ -140,12 +140,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; +} + +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
Define two functions to register and to unregister a call back for IO Interrupt handling. Per default we keep the old behavior, so does a successful unregister of the callback. Signed-off-by: Pierre Morel <pmorel@linux.ibm.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