All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jordan Niethe <jniethe5@gmail.com>
To: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Christophe Leroy <christophe.leroy@c-s.fr>,
	Alistair Popple <alistair@popple.id.au>,
	Nicholas Piggin <npiggin@gmail.com>,
	Balamuruhan S <bala24@linux.ibm.com>,
	naveen.n.rao@linux.vnet.ibm.com, linuxppc-dev@lists.ozlabs.org,
	Daniel Axtens <dja@axtens.net>
Subject: Re: [PATCH v8 12/30] powerpc: Use a function for reading instructions
Date: Sun, 17 May 2020 20:44:29 +1000	[thread overview]
Message-ID: <CACzsE9qBXBsv0s25DWugjWUaTUZfYpHyONW5ryE4dnLKP5P7cA@mail.gmail.com> (raw)
In-Reply-To: <a7005edf-cdda-4aec-b7b0-fd9f45776147@csgroup.eu>

On Sun, May 17, 2020 at 4:39 AM Christophe Leroy
<christophe.leroy@csgroup.eu> wrote:
>
>
>
> Le 06/05/2020 à 05:40, Jordan Niethe a écrit :
> > Prefixed instructions will mean there are instructions of different
> > length. As a result dereferencing a pointer to an instruction will not
> > necessarily give the desired result. Introduce a function for reading
> > instructions from memory into the instruction data type.
>
>
> Shouldn't this function be used in mmu_patch_addis() in mm/nohash/8xx.c ?
>
> Christophe
Yes, that would be a good idea. mpe here is a fix, along with one I'll
post for [PATCH v8 11/30] powerpc: Use a datatype for instructions.

diff --git a/arch/powerpc/mm/nohash/8xx.c b/arch/powerpc/mm/nohash/8xx.c
--- a/arch/powerpc/mm/nohash/8xx.c
+++ b/arch/powerpc/mm/nohash/8xx.c
@@ -98,7 +98,7 @@ static void mmu_patch_cmp_limit(s32 *site, unsigned
long mapped)

 static void mmu_patch_addis(s32 *site, long simm)
 {
-    struct ppc_inst instr = *(struct ppc_inst *)patch_site_addr(site);
+    struct ppc_inst instr = ppc_inst_read((struct ppc_inst
*)patch_site_addr(site));
     unsigned int val = ppc_inst_val(instr);

     val &= 0xffff0000;
-- 
>
> >
> > Reviewed-by: Alistair Popple <alistair@popple.id.au>
> > Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
> > ---
> > v4: New to series
> > v5: - Rename read_inst() -> probe_kernel_read_inst()
> >      - No longer modify uprobe probe type in this patch
> > v6: - feature-fixups.c: do_final_fixups(): Use here
> >      - arch_prepare_kprobe(): patch_instruction(): no longer part of this
> >        patch
> >      - Move probe_kernel_read_inst() out of this patch
> >      - Use in uprobes
> > v8: style
> > ---
> >   arch/powerpc/include/asm/inst.h    |  5 +++++
> >   arch/powerpc/kernel/kprobes.c      |  6 +++---
> >   arch/powerpc/kernel/mce_power.c    |  2 +-
> >   arch/powerpc/kernel/optprobes.c    |  4 ++--
> >   arch/powerpc/kernel/trace/ftrace.c |  4 ++--
> >   arch/powerpc/kernel/uprobes.c      |  2 +-
> >   arch/powerpc/lib/code-patching.c   | 26 ++++++++++++++------------
> >   arch/powerpc/lib/feature-fixups.c  |  4 ++--
> >   arch/powerpc/xmon/xmon.c           |  6 +++---
> >   9 files changed, 33 insertions(+), 26 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/inst.h b/arch/powerpc/include/asm/inst.h
> > index 19d8bb7a1c2b..552e953bf04f 100644
> > --- a/arch/powerpc/include/asm/inst.h
> > +++ b/arch/powerpc/include/asm/inst.h
> > @@ -27,6 +27,11 @@ static inline struct ppc_inst ppc_inst_swab(struct ppc_inst x)
> >       return ppc_inst(swab32(ppc_inst_val(x)));
> >   }
> >
> > +static inline struct ppc_inst ppc_inst_read(const struct ppc_inst *ptr)
> > +{
> > +     return *ptr;
> > +}
> > +
> >   static inline bool ppc_inst_equal(struct ppc_inst x, struct ppc_inst y)
> >   {
> >       return ppc_inst_val(x) == ppc_inst_val(y);
> > diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
> > index a08ae5803622..f64312dca84f 100644
> > --- a/arch/powerpc/kernel/kprobes.c
> > +++ b/arch/powerpc/kernel/kprobes.c
> > @@ -106,7 +106,7 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset)
> >   int arch_prepare_kprobe(struct kprobe *p)
> >   {
> >       int ret = 0;
> > -     struct ppc_inst insn = *(struct ppc_inst *)p->addr;
> > +     struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->addr);
> >
> >       if ((unsigned long)p->addr & 0x03) {
> >               printk("Attempt to register kprobe at an unaligned address\n");
> > @@ -127,7 +127,7 @@ int arch_prepare_kprobe(struct kprobe *p)
> >       if (!ret) {
> >               memcpy(p->ainsn.insn, p->addr,
> >                               MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
> > -             p->opcode = *p->addr;
> > +             p->opcode = ppc_inst_val(insn);
> >               flush_icache_range((unsigned long)p->ainsn.insn,
> >                       (unsigned long)p->ainsn.insn + sizeof(kprobe_opcode_t));
> >       }
> > @@ -217,7 +217,7 @@ NOKPROBE_SYMBOL(arch_prepare_kretprobe);
> >   static int try_to_emulate(struct kprobe *p, struct pt_regs *regs)
> >   {
> >       int ret;
> > -     struct ppc_inst insn = *(struct ppc_inst *)p->ainsn.insn;
> > +     struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->ainsn.insn);
> >
> >       /* regs->nip is also adjusted if emulate_step returns 1 */
> >       ret = emulate_step(regs, insn);
> > diff --git a/arch/powerpc/kernel/mce_power.c b/arch/powerpc/kernel/mce_power.c
> > index cd23218c60bb..45c51ba0071b 100644
> > --- a/arch/powerpc/kernel/mce_power.c
> > +++ b/arch/powerpc/kernel/mce_power.c
> > @@ -374,7 +374,7 @@ static int mce_find_instr_ea_and_phys(struct pt_regs *regs, uint64_t *addr,
> >       pfn = addr_to_pfn(regs, regs->nip);
> >       if (pfn != ULONG_MAX) {
> >               instr_addr = (pfn << PAGE_SHIFT) + (regs->nip & ~PAGE_MASK);
> > -             instr = *(struct ppc_inst *)(instr_addr);
> > +             instr = ppc_inst_read((struct ppc_inst *)instr_addr);
> >               if (!analyse_instr(&op, &tmp, instr)) {
> >                       pfn = addr_to_pfn(regs, op.ea);
> >                       *addr = op.ea;
> > diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c
> > index 5a71fef71c22..52c1ab3f85aa 100644
> > --- a/arch/powerpc/kernel/optprobes.c
> > +++ b/arch/powerpc/kernel/optprobes.c
> > @@ -100,9 +100,9 @@ static unsigned long can_optimize(struct kprobe *p)
> >        * Ensure that the instruction is not a conditional branch,
> >        * and that can be emulated.
> >        */
> > -     if (!is_conditional_branch(*(struct ppc_inst *)p->ainsn.insn) &&
> > +     if (!is_conditional_branch(ppc_inst_read((struct ppc_inst *)p->ainsn.insn)) &&
> >           analyse_instr(&op, &regs,
> > -                       *(struct ppc_inst *)p->ainsn.insn) == 1) {
> > +                       ppc_inst_read((struct ppc_inst *)p->ainsn.insn)) == 1) {
> >               emulate_update_regs(&regs, &op);
> >               nip = regs.nip;
> >       }
> > diff --git a/arch/powerpc/kernel/trace/ftrace.c b/arch/powerpc/kernel/trace/ftrace.c
> > index 3117ed675735..acd5b889815f 100644
> > --- a/arch/powerpc/kernel/trace/ftrace.c
> > +++ b/arch/powerpc/kernel/trace/ftrace.c
> > @@ -848,7 +848,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
> >       struct ppc_inst old, new;
> >       int ret;
> >
> > -     old = *(struct ppc_inst *)&ftrace_call;
> > +     old = ppc_inst_read((struct ppc_inst *)&ftrace_call);
> >       new = ftrace_call_replace(ip, (unsigned long)func, 1);
> >       ret = ftrace_modify_code(ip, old, new);
> >
> > @@ -856,7 +856,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
> >       /* Also update the regs callback function */
> >       if (!ret) {
> >               ip = (unsigned long)(&ftrace_regs_call);
> > -             old = *(struct ppc_inst *)&ftrace_regs_call;
> > +             old = ppc_inst_read((struct ppc_inst *)&ftrace_regs_call);
> >               new = ftrace_call_replace(ip, (unsigned long)func, 1);
> >               ret = ftrace_modify_code(ip, old, new);
> >       }
> > diff --git a/arch/powerpc/kernel/uprobes.c b/arch/powerpc/kernel/uprobes.c
> > index 31c870287f2b..6893d40a48c5 100644
> > --- a/arch/powerpc/kernel/uprobes.c
> > +++ b/arch/powerpc/kernel/uprobes.c
> > @@ -174,7 +174,7 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
> >        * emulate_step() returns 1 if the insn was successfully emulated.
> >        * For all other cases, we need to single-step in hardware.
> >        */
> > -     ret = emulate_step(regs, auprobe->insn);
> > +     ret = emulate_step(regs, ppc_inst_read(&auprobe->insn));
> >       if (ret > 0)
> >               return true;
> >
> > diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
> > index 1dff9d9d6645..435fc8e9f45d 100644
> > --- a/arch/powerpc/lib/code-patching.c
> > +++ b/arch/powerpc/lib/code-patching.c
> > @@ -348,9 +348,9 @@ static unsigned long branch_bform_target(const struct ppc_inst *instr)
> >
> >   unsigned long branch_target(const struct ppc_inst *instr)
> >   {
> > -     if (instr_is_branch_iform(*instr))
> > +     if (instr_is_branch_iform(ppc_inst_read(instr)))
> >               return branch_iform_target(instr);
> > -     else if (instr_is_branch_bform(*instr))
> > +     else if (instr_is_branch_bform(ppc_inst_read(instr)))
> >               return branch_bform_target(instr);
> >
> >       return 0;
> > @@ -358,7 +358,8 @@ unsigned long branch_target(const struct ppc_inst *instr)
> >
> >   int instr_is_branch_to_addr(const struct ppc_inst *instr, unsigned long addr)
> >   {
> > -     if (instr_is_branch_iform(*instr) || instr_is_branch_bform(*instr))
> > +     if (instr_is_branch_iform(ppc_inst_read(instr)) ||
> > +         instr_is_branch_bform(ppc_inst_read(instr)))
> >               return branch_target(instr) == addr;
> >
> >       return 0;
> > @@ -368,13 +369,14 @@ int translate_branch(struct ppc_inst *instr, const struct ppc_inst *dest,
> >                    const struct ppc_inst *src)
> >   {
> >       unsigned long target;
> > -
> >       target = branch_target(src);
> >
> > -     if (instr_is_branch_iform(*src))
> > -             return create_branch(instr, dest, target, ppc_inst_val(*src));
> > -     else if (instr_is_branch_bform(*src))
> > -             return create_cond_branch(instr, dest, target, ppc_inst_val(*src));
> > +     if (instr_is_branch_iform(ppc_inst_read(src)))
> > +             return create_branch(instr, dest, target,
> > +                                  ppc_inst_val(ppc_inst_read(src)));
> > +     else if (instr_is_branch_bform(ppc_inst_read(src)))
> > +             return create_cond_branch(instr, dest, target,
> > +                                       ppc_inst_val(ppc_inst_read(src)));
> >
> >       return 1;
> >   }
> > @@ -598,7 +600,7 @@ static void __init test_translate_branch(void)
> >       patch_instruction(q, instr);
> >       check(instr_is_branch_to_addr(p, addr));
> >       check(instr_is_branch_to_addr(q, addr));
> > -     check(ppc_inst_equal(*q, ppc_inst(0x4a000000)));
> > +     check(ppc_inst_equal(ppc_inst_read(q), ppc_inst(0x4a000000)));
> >
> >       /* Maximum positive case, move x to x - 32 MB + 4 */
> >       p = buf + 0x2000000;
> > @@ -609,7 +611,7 @@ static void __init test_translate_branch(void)
> >       patch_instruction(q, instr);
> >       check(instr_is_branch_to_addr(p, addr));
> >       check(instr_is_branch_to_addr(q, addr));
> > -     check(ppc_inst_equal(*q, ppc_inst(0x49fffffc)));
> > +     check(ppc_inst_equal(ppc_inst_read(q), ppc_inst(0x49fffffc)));
> >
> >       /* Jump to x + 16 MB moved to x + 20 MB */
> >       p = buf;
> > @@ -655,7 +657,7 @@ static void __init test_translate_branch(void)
> >       patch_instruction(q, instr);
> >       check(instr_is_branch_to_addr(p, addr));
> >       check(instr_is_branch_to_addr(q, addr));
> > -     check(ppc_inst_equal(*q, ppc_inst(0x43ff8000)));
> > +     check(ppc_inst_equal(ppc_inst_read(q), ppc_inst(0x43ff8000)));
> >
> >       /* Maximum positive case, move x to x - 32 KB + 4 */
> >       p = buf + 0x8000;
> > @@ -667,7 +669,7 @@ static void __init test_translate_branch(void)
> >       patch_instruction(q, instr);
> >       check(instr_is_branch_to_addr(p, addr));
> >       check(instr_is_branch_to_addr(q, addr));
> > -     check(ppc_inst_equal(*q, ppc_inst(0x43ff7ffc)));
> > +     check(ppc_inst_equal(ppc_inst_read(q), ppc_inst(0x43ff7ffc)));
> >
> >       /* Jump to x + 12 KB moved to x + 20 KB */
> >       p = buf;
> > diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
> > index fb6e8e8abf4e..c0d3ed4efb7e 100644
> > --- a/arch/powerpc/lib/feature-fixups.c
> > +++ b/arch/powerpc/lib/feature-fixups.c
> > @@ -48,7 +48,7 @@ static int patch_alt_instruction(struct ppc_inst *src, struct ppc_inst *dest,
> >       int err;
> >       struct ppc_inst instr;
> >
> > -     instr = *src;
> > +     instr = ppc_inst_read(src);
> >
> >       if (instr_is_relative_branch(*src)) {
> >               struct ppc_inst *target = (struct ppc_inst *)branch_target(src);
> > @@ -403,7 +403,7 @@ static void do_final_fixups(void)
> >       length = (__end_interrupts - _stext) / sizeof(struct ppc_inst);
> >
> >       while (length--) {
> > -             raw_patch_instruction(dest, *src);
> > +             raw_patch_instruction(dest, ppc_inst_read(src));
> >               src++;
> >               dest++;
> >       }
> > diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> > index e0132d6d24d0..68e0b05d9226 100644
> > --- a/arch/powerpc/xmon/xmon.c
> > +++ b/arch/powerpc/xmon/xmon.c
> > @@ -702,13 +702,13 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
> >       if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
> >               bp = at_breakpoint(regs->nip);
> >               if (bp != NULL) {
> > -                     int stepped = emulate_step(regs, bp->instr[0]);
> > +                     int stepped = emulate_step(regs, ppc_inst_read(bp->instr));
> >                       if (stepped == 0) {
> >                               regs->nip = (unsigned long) &bp->instr[0];
> >                               atomic_inc(&bp->ref_count);
> >                       } else if (stepped < 0) {
> >                               printf("Couldn't single-step %s instruction\n",
> > -                                 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
> > +                                 IS_RFID(ppc_inst_read(bp->instr))? "rfid": "mtmsrd");
> >                       }
> >               }
> >       }
> > @@ -949,7 +949,7 @@ static void remove_bpts(void)
> >               if (mread(bp->address, &instr, 4) == 4
> >                   && ppc_inst_equal(instr, ppc_inst(bpinstr))
> >                   && patch_instruction(
> > -                     (struct ppc_inst *)bp->address, bp->instr[0]) != 0)
> > +                     (struct ppc_inst *)bp->address, ppc_inst_read(bp->instr)) != 0)
> >                       printf("Couldn't remove breakpoint at %lx\n",
> >                              bp->address);
> >       }
> >

  reply	other threads:[~2020-05-17 10:46 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-06  3:40 [PATCH v8 00/30] Initial Prefixed Instruction support Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 01/30] powerpc/xmon: Remove store_inst() for patch_instruction() Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 02/30] powerpc/xmon: Move breakpoint instructions to own array Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 03/30] powerpc/xmon: Move breakpoints to text section Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 04/30] powerpc/xmon: Use bitwise calculations in_breakpoint_table() Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 05/30] powerpc: Change calling convention for create_branch() et. al Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 06/30] powerpc: Use a macro for creating instructions from u32s Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 07/30] powerpc: Use an accessor for instructions Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 08/30] powerpc: Use a function for getting the instruction op code Jordan Niethe
2020-05-15  7:48   ` Jordan Niethe
2020-05-16 11:08     ` Michael Ellerman
2020-05-17  7:41       ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 09/30] powerpc: Use a function for byte swapping instructions Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 10/30] powerpc: Introduce functions for instruction equality Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 11/30] powerpc: Use a datatype for instructions Jordan Niethe
2020-05-08  1:51   ` Jordan Niethe
2020-05-08  7:17     ` Christophe Leroy
2020-05-11  1:19       ` Jordan Niethe
2020-05-08  2:15   ` Jordan Niethe
2020-05-08  9:23   ` kbuild test robot
2020-05-17 10:48   ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 12/30] powerpc: Use a function for reading instructions Jordan Niethe
2020-05-16 18:39   ` Christophe Leroy
2020-05-17 10:44     ` Jordan Niethe [this message]
2020-05-19  4:05       ` Michael Ellerman
2020-05-19  5:03         ` Christophe Leroy
2020-05-20  4:16           ` Michael Ellerman
2020-05-06  3:40 ` [PATCH v8 13/30] powerpc: Add a probe_user_read_inst() function Jordan Niethe
2020-05-13 12:52   ` Michael Ellerman
2020-05-13 23:51     ` Jordan Niethe
2020-05-14  5:46   ` Christophe Leroy
2020-05-15  3:46     ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 14/30] powerpc: Add a probe_kernel_read_inst() function Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 15/30] powerpc/kprobes: Use patch_instruction() Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 16/30] powerpc: Define and use __get_user_instr{, inatomic}() Jordan Niethe
2020-05-13 14:18   ` Michael Ellerman
2020-05-13 23:54     ` Jordan Niethe
2020-05-14  1:43       ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 17/30] powerpc: Introduce a function for reporting instruction length Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 18/30] powerpc/xmon: Use a function for reading instructions Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 19/30] powerpc/xmon: Move insertion of breakpoint for xol'ing Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 20/30] powerpc: Make test_translate_branch() independent of instruction length Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 21/30] powerpc: Enable Prefixed Instructions Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 22/30] powerpc: Define new SRR1 bits for a future ISA version Jordan Niethe
2020-05-08  2:26   ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 23/30] powerpc: Add prefixed instructions to instruction data type Jordan Niethe
2020-05-14  1:40   ` Jordan Niethe
2020-05-14  6:11   ` Christophe Leroy
2020-05-14 12:06     ` Alistair Popple
2020-05-14 12:29       ` Jordan Niethe
2020-05-14 12:57       ` Christophe Leroy
2020-05-14 12:28     ` Jordan Niethe
2020-05-15  1:33     ` Michael Ellerman
2020-05-15  7:52       ` Jordan Niethe
2020-05-16 11:54   ` [PATCH v8 22.5/30] powerpc/optprobes: Add register argument to patch_imm64_load_insns() Michael Ellerman
2020-06-09  5:51     ` Michael Ellerman
2020-05-06  3:40 ` [PATCH v8 24/30] powerpc: Test prefixed code patching Jordan Niethe
2020-05-15  7:54   ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 25/30] powerpc: Test prefixed instructions in feature fixups Jordan Niethe
2020-05-15  7:57   ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 26/30] powerpc/xmon: Don't allow breakpoints on suffixes Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 27/30] powerpc/kprobes: " Jordan Niethe
2021-05-18 18:43   ` Christophe Leroy
2021-05-18 19:52     ` Gabriel Paubert
2021-05-19  8:11     ` Naveen N. Rao
2021-05-20  3:45       ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 28/30] powerpc: Support prefixed instructions in alignment handler Jordan Niethe
2020-05-14  6:14   ` Christophe Leroy
2020-05-14 12:15     ` Alistair Popple
2020-05-14 12:59       ` Christophe Leroy
2020-05-06  3:40 ` [PATCH v8 29/30] powerpc sstep: Add support for prefixed load/stores Jordan Niethe
2020-05-14  6:15   ` Christophe Leroy
2020-05-14 12:19     ` Alistair Popple
2020-05-14 13:00       ` Christophe Leroy
2020-05-15  7:59   ` Jordan Niethe
2020-05-06  3:40 ` [PATCH v8 30/30] powerpc sstep: Add support for prefixed fixed-point arithmetic Jordan Niethe
2020-05-14  6:15   ` Christophe Leroy
2020-05-15  8:02   ` Jordan Niethe
2020-05-14  5:31 ` [PATCH v8 00/30] Initial Prefixed Instruction support Christophe Leroy
2020-05-14 10:33   ` Jordan Niethe
2020-05-20 10:59 ` Michael Ellerman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACzsE9qBXBsv0s25DWugjWUaTUZfYpHyONW5ryE4dnLKP5P7cA@mail.gmail.com \
    --to=jniethe5@gmail.com \
    --cc=alistair@popple.id.au \
    --cc=bala24@linux.ibm.com \
    --cc=christophe.leroy@c-s.fr \
    --cc=christophe.leroy@csgroup.eu \
    --cc=dja@axtens.net \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=naveen.n.rao@linux.vnet.ibm.com \
    --cc=npiggin@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.