Message ID | 20200603051912.23296-5-cmr@informatik.wtf (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Use per-CPU temporary mappings for patching | expand |
Le 03/06/2020 à 07:19, Christopher M. Riedl a écrit : > When live patching a STRICT_RWX kernel, a mapping is installed at a > "patching address" with temporary write permissions. Provide a > LKDTM-only accessor function for this address in preparation for a LKDTM > test which attempts to "hijack" this mapping by writing to it from > another CPU. > > Signed-off-by: Christopher M. Riedl <cmr@informatik.wtf> > --- > arch/powerpc/lib/code-patching.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c > index df0765845204..c23453049116 100644 > --- a/arch/powerpc/lib/code-patching.c > +++ b/arch/powerpc/lib/code-patching.c > @@ -52,6 +52,13 @@ int raw_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) > static struct mm_struct *patching_mm __ro_after_init; > static unsigned long patching_addr __ro_after_init; > > +#ifdef CONFIG_LKDTM > +unsigned long read_cpu_patching_addr(unsigned int cpu) If this fonction is not static, it means it is intended to be used from some other C file, so it should be declared in a .h too. Christophe > +{ > + return patching_addr; > +} > +#endif > + > void __init poking_init(void) > { > spinlock_t *ptl; /* for protecting pte table */ >
On Wed Jun 3, 2020 at 9:14 AM, Christophe Leroy wrote: > > > > > Le 03/06/2020 à 07:19, Christopher M. Riedl a écrit : > > When live patching a STRICT_RWX kernel, a mapping is installed at a > > "patching address" with temporary write permissions. Provide a > > LKDTM-only accessor function for this address in preparation for a LKDTM > > test which attempts to "hijack" this mapping by writing to it from > > another CPU. > > > > Signed-off-by: Christopher M. Riedl <cmr@informatik.wtf> > > --- > > arch/powerpc/lib/code-patching.c | 7 +++++++ > > 1 file changed, 7 insertions(+) > > > > diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c > > index df0765845204..c23453049116 100644 > > --- a/arch/powerpc/lib/code-patching.c > > +++ b/arch/powerpc/lib/code-patching.c > > @@ -52,6 +52,13 @@ int raw_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) > > static struct mm_struct *patching_mm __ro_after_init; > > static unsigned long patching_addr __ro_after_init; > > > > +#ifdef CONFIG_LKDTM > > +unsigned long read_cpu_patching_addr(unsigned int cpu) > > > If this fonction is not static, it means it is intended to be used from > some other C file, so it should be declared in a .h too. > Yup agreed. This was left-over from the RFC to simplify using the LKDTM test on a tree without this series. Will fix this in the next spin. > > Christophe > > > > +{ > > + return patching_addr; > > +} > > +#endif > > + > > void __init poking_init(void) > > { > > spinlock_t *ptl; /* for protecting pte table */ > > > > > >
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c index df0765845204..c23453049116 100644 --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c @@ -52,6 +52,13 @@ int raw_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) static struct mm_struct *patching_mm __ro_after_init; static unsigned long patching_addr __ro_after_init; +#ifdef CONFIG_LKDTM +unsigned long read_cpu_patching_addr(unsigned int cpu) +{ + return patching_addr; +} +#endif + void __init poking_init(void) { spinlock_t *ptl; /* for protecting pte table */
When live patching a STRICT_RWX kernel, a mapping is installed at a "patching address" with temporary write permissions. Provide a LKDTM-only accessor function for this address in preparation for a LKDTM test which attempts to "hijack" this mapping by writing to it from another CPU. Signed-off-by: Christopher M. Riedl <cmr@informatik.wtf> --- arch/powerpc/lib/code-patching.c | 7 +++++++ 1 file changed, 7 insertions(+)