* [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h @ 2019-05-03 6:40 Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 2/3] powerpc/module32: Use symbolic instructions names Christophe Leroy ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Christophe Leroy @ 2019-05-03 6:40 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel PPC_HA() PPC_HI() and PPC_LO() macros are nice macros. Move them from module64.c to ppc-opcode.h in order to use them in other places. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- v3: no change v2: no change arch/powerpc/include/asm/ppc-opcode.h | 7 +++++++ arch/powerpc/kernel/module_64.c | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index 23f7ed796f38..c5ff44400d4d 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -412,6 +412,13 @@ #define __PPC_SPR(r) ((((r) & 0x1f) << 16) | ((((r) >> 5) & 0x1f) << 11)) #define __PPC_RC21 (0x1 << 10) +/* Both low and high 16 bits are added as SIGNED additions, so if low + 16 bits has high bit set, high 16 bits must be adjusted. These + macros do that (stolen from binutils). */ +#define PPC_LO(v) ((v) & 0xffff) +#define PPC_HI(v) (((v) >> 16) & 0xffff) +#define PPC_HA(v) PPC_HI ((v) + 0x8000) + /* * Only use the larx hint bit on 64bit CPUs. e500v1/v2 based CPUs will treat a * larx with EH set as an illegal instruction. diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 8661eea78503..c2e1b06253b8 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c @@ -400,13 +400,6 @@ static inline unsigned long my_r2(const Elf64_Shdr *sechdrs, struct module *me) return (sechdrs[me->arch.toc_section].sh_addr & ~0xfful) + 0x8000; } -/* Both low and high 16 bits are added as SIGNED additions, so if low - 16 bits has high bit set, high 16 bits must be adjusted. These - macros do that (stolen from binutils). */ -#define PPC_LO(v) ((v) & 0xffff) -#define PPC_HI(v) (((v) >> 16) & 0xffff) -#define PPC_HA(v) PPC_HI ((v) + 0x8000) - /* Patch stub to reference function and correct r2 value. */ static inline int create_stub(const Elf64_Shdr *sechdrs, struct ppc64_stub_entry *entry, -- 2.13.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/3] powerpc/module32: Use symbolic instructions names. 2019-05-03 6:40 [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Christophe Leroy @ 2019-05-03 6:40 ` Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 3/3] powerpc/module64: " Christophe Leroy 2019-07-08 1:19 ` [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Michael Ellerman 2 siblings, 0 replies; 7+ messages in thread From: Christophe Leroy @ 2019-05-03 6:40 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel To increase readability/maintainability, replace hard coded instructions values by symbolic names. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- v3: no change v2: Remove the ENTRY_JMP0 and ENTRY_JMP1 macros ; left real instructions as a comment. arch/powerpc/kernel/module_32.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c index 88d83771f462..9cf201111d6c 100644 --- a/arch/powerpc/kernel/module_32.c +++ b/arch/powerpc/kernel/module_32.c @@ -172,10 +172,12 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr, static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val) { - if (entry->jump[0] == 0x3d800000 + ((val + 0x8000) >> 16) - && entry->jump[1] == 0x398c0000 + (val & 0xffff)) - return 1; - return 0; + if (entry->jump[0] != (PPC_INST_ADDIS | __PPC_RT(R12) | PPC_HA(val))) + return 0; + if (entry->jump[1] != (PPC_INST_ADDI | __PPC_RT(R12) | __PPC_RA(R12) | + PPC_LO(val))) + return 0; + return 1; } /* Set up a trampoline in the PLT to bounce us to the distant function */ @@ -200,10 +202,16 @@ static uint32_t do_plt_call(void *location, entry++; } - entry->jump[0] = 0x3d800000+((val+0x8000)>>16); /* lis r12,sym@ha */ - entry->jump[1] = 0x398c0000 + (val&0xffff); /* addi r12,r12,sym@l*/ - entry->jump[2] = 0x7d8903a6; /* mtctr r12 */ - entry->jump[3] = 0x4e800420; /* bctr */ + /* + * lis r12, sym@ha + * addi r12, r12, sym@l + * mtctr r12 + * bctr + */ + entry->jump[0] = PPC_INST_ADDIS | __PPC_RT(R12) | PPC_HA(val); + entry->jump[1] = PPC_INST_ADDI | __PPC_RT(R12) | __PPC_RA(R12) | PPC_LO(val); + entry->jump[2] = PPC_INST_MTCTR | __PPC_RS(R12); + entry->jump[3] = PPC_INST_BCTR; pr_debug("Initialized plt for 0x%x at %p\n", val, entry); return (uint32_t)entry; -- 2.13.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 3/3] powerpc/module64: Use symbolic instructions names. 2019-05-03 6:40 [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 2/3] powerpc/module32: Use symbolic instructions names Christophe Leroy @ 2019-05-03 6:40 ` Christophe Leroy 2019-07-08 0:56 ` Michael Ellerman 2019-07-08 1:19 ` [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Michael Ellerman 2 siblings, 1 reply; 7+ messages in thread From: Christophe Leroy @ 2019-05-03 6:40 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel To increase readability/maintainability, replace hard coded instructions values by symbolic names. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- v3: fixed warning by adding () in an 'if' around X | Y (unlike said in v2 history, this change was forgotten in v2) v2: rearranged comments arch/powerpc/kernel/module_64.c | 53 +++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index c2e1b06253b8..b33a5d5e2d35 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c @@ -133,20 +133,27 @@ struct ppc64_stub_entry * the stub, but it's significantly shorter to put these values at the * end of the stub code, and patch the stub address (32-bits relative * to the TOC ptr, r2) into the stub. + * + * addis r11,r2, <high> + * addi r11,r11, <low> + * std r2,R2_STACK_OFFSET(r1) + * ld r12,32(r11) + * ld r2,40(r11) + * mtctr r12 + * bctr */ - static u32 ppc64_stub_insns[] = { - 0x3d620000, /* addis r11,r2, <high> */ - 0x396b0000, /* addi r11,r11, <low> */ + PPC_INST_ADDIS | __PPC_RT(R11) | __PPC_RA(R2), + PPC_INST_ADDI | __PPC_RT(R11) | __PPC_RA(R11), /* Save current r2 value in magic place on the stack. */ - 0xf8410000|R2_STACK_OFFSET, /* std r2,R2_STACK_OFFSET(r1) */ - 0xe98b0020, /* ld r12,32(r11) */ + PPC_INST_STD | __PPC_RS(R2) | __PPC_RA(R1) | R2_STACK_OFFSET, + PPC_INST_LD | __PPC_RT(R12) | __PPC_RA(R11) | 32, #ifdef PPC64_ELF_ABI_v1 /* Set up new r2 from function descriptor */ - 0xe84b0028, /* ld r2,40(r11) */ + PPC_INST_LD | __PPC_RT(R2) | __PPC_RA(R11) | 40, #endif - 0x7d8903a6, /* mtctr r12 */ - 0x4e800420 /* bctr */ + PPC_INST_MTCTR | __PPC_RS(R12), + PPC_INST_BCTR, }; #ifdef CONFIG_DYNAMIC_FTRACE @@ -704,18 +711,21 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, * ld r2, ...(r12) * add r2, r2, r12 */ - if ((((uint32_t *)location)[0] & ~0xfffc) - != 0xe84c0000) + if ((((uint32_t *)location)[0] & ~0xfffc) != + (PPC_INST_LD | __PPC_RT(R2) | __PPC_RA(R12))) break; - if (((uint32_t *)location)[1] != 0x7c426214) + if (((uint32_t *)location)[1] != + (PPC_INST_ADD | __PPC_RT(R2) | __PPC_RA(R2) | __PPC_RB(R12))) break; /* * If found, replace it with: * addis r2, r12, (.TOC.-func)@ha * addi r2, r12, (.TOC.-func)@l */ - ((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value); - ((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value); + ((uint32_t *)location)[0] = PPC_INST_ADDIS | __PPC_RT(R2) | + __PPC_RA(R12) | PPC_HA(value); + ((uint32_t *)location)[1] = PPC_INST_ADDI | __PPC_RT(R2) | + __PPC_RA(R12) | PPC_LO(value); break; case R_PPC64_REL16_HA: @@ -769,12 +779,19 @@ static unsigned long create_ftrace_stub(const Elf64_Shdr *sechdrs, { struct ppc64_stub_entry *entry; unsigned int i, num_stubs; + /* + * ld r12,PACATOC(r13) + * addis r12,r12,<high> + * addi r12,r12,<low> + * mtctr r12 + * bctr + */ static u32 stub_insns[] = { - 0xe98d0000 | PACATOC, /* ld r12,PACATOC(r13) */ - 0x3d8c0000, /* addis r12,r12,<high> */ - 0x398c0000, /* addi r12,r12,<low> */ - 0x7d8903a6, /* mtctr r12 */ - 0x4e800420, /* bctr */ + PPC_INST_LD | __PPC_RT(R12) | __PPC_RA(R13) | PACATOC, + PPC_INST_ADDIS | __PPC_RT(R12) | __PPC_RA(R12), + PPC_INST_ADDI | __PPC_RT(R12) | __PPC_RA(R12), + PPC_INST_MTCTR | __PPC_RS(R12), + PPC_INST_BCTR, }; long reladdr; -- 2.13.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 3/3] powerpc/module64: Use symbolic instructions names. 2019-05-03 6:40 ` [PATCH v3 3/3] powerpc/module64: " Christophe Leroy @ 2019-07-08 0:56 ` Michael Ellerman 2019-07-08 8:58 ` Christophe Leroy 0 siblings, 1 reply; 7+ messages in thread From: Michael Ellerman @ 2019-07-08 0:56 UTC (permalink / raw) To: Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras Cc: Ulirch Weigand, linuxppc-dev, linux-kernel Christophe Leroy <christophe.leroy@c-s.fr> writes: > To increase readability/maintainability, replace hard coded > instructions values by symbolic names. > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > --- > v3: fixed warning by adding () in an 'if' around X | Y (unlike said in v2 history, this change was forgotten in v2) > v2: rearranged comments > > arch/powerpc/kernel/module_64.c | 53 +++++++++++++++++++++++++++-------------- > 1 file changed, 35 insertions(+), 18 deletions(-) > > diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c > index c2e1b06253b8..b33a5d5e2d35 100644 > --- a/arch/powerpc/kernel/module_64.c > +++ b/arch/powerpc/kernel/module_64.c > @@ -704,18 +711,21 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ... > /* > * If found, replace it with: > * addis r2, r12, (.TOC.-func)@ha > * addi r2, r12, (.TOC.-func)@l > */ > - ((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value); > - ((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value); > + ((uint32_t *)location)[0] = PPC_INST_ADDIS | __PPC_RT(R2) | > + __PPC_RA(R12) | PPC_HA(value); > + ((uint32_t *)location)[1] = PPC_INST_ADDI | __PPC_RT(R2) | > + __PPC_RA(R12) | PPC_LO(value); > break; This was crashing and it's amazing how long you can stare at a disassembly and not see the difference between `r2` and `r12` :) Fixed now. cheers ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 3/3] powerpc/module64: Use symbolic instructions names. 2019-07-08 0:56 ` Michael Ellerman @ 2019-07-08 8:58 ` Christophe Leroy 2019-07-12 7:00 ` Michael Ellerman 0 siblings, 1 reply; 7+ messages in thread From: Christophe Leroy @ 2019-07-08 8:58 UTC (permalink / raw) To: Michael Ellerman, Benjamin Herrenschmidt, Paul Mackerras Cc: Ulirch Weigand, linuxppc-dev, linux-kernel Le 08/07/2019 à 02:56, Michael Ellerman a écrit : > Christophe Leroy <christophe.leroy@c-s.fr> writes: >> To increase readability/maintainability, replace hard coded >> instructions values by symbolic names. >> >> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >> --- >> v3: fixed warning by adding () in an 'if' around X | Y (unlike said in v2 history, this change was forgotten in v2) >> v2: rearranged comments >> >> arch/powerpc/kernel/module_64.c | 53 +++++++++++++++++++++++++++-------------- >> 1 file changed, 35 insertions(+), 18 deletions(-) >> >> diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c >> index c2e1b06253b8..b33a5d5e2d35 100644 >> --- a/arch/powerpc/kernel/module_64.c >> +++ b/arch/powerpc/kernel/module_64.c >> @@ -704,18 +711,21 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, > ... >> /* >> * If found, replace it with: >> * addis r2, r12, (.TOC.-func)@ha >> * addi r2, r12, (.TOC.-func)@l >> */ >> - ((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value); >> - ((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value); >> + ((uint32_t *)location)[0] = PPC_INST_ADDIS | __PPC_RT(R2) | >> + __PPC_RA(R12) | PPC_HA(value); >> + ((uint32_t *)location)[1] = PPC_INST_ADDI | __PPC_RT(R2) | >> + __PPC_RA(R12) | PPC_LO(value); >> break; > > This was crashing and it's amazing how long you can stare at a > disassembly and not see the difference between `r2` and `r12` :) Argh, yes. I was misleaded by the comment I guess. Sorry for that and thanks for fixing. Christophe > > Fixed now. > > cheers > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 3/3] powerpc/module64: Use symbolic instructions names. 2019-07-08 8:58 ` Christophe Leroy @ 2019-07-12 7:00 ` Michael Ellerman 0 siblings, 0 replies; 7+ messages in thread From: Michael Ellerman @ 2019-07-12 7:00 UTC (permalink / raw) To: Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras Cc: Ulirch Weigand, linuxppc-dev, linux-kernel Christophe Leroy <christophe.leroy@c-s.fr> writes: > Le 08/07/2019 à 02:56, Michael Ellerman a écrit : >> Christophe Leroy <christophe.leroy@c-s.fr> writes: >>> To increase readability/maintainability, replace hard coded >>> instructions values by symbolic names. >>> >>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >>> --- >>> v3: fixed warning by adding () in an 'if' around X | Y (unlike said in v2 history, this change was forgotten in v2) >>> v2: rearranged comments >>> >>> arch/powerpc/kernel/module_64.c | 53 +++++++++++++++++++++++++++-------------- >>> 1 file changed, 35 insertions(+), 18 deletions(-) >>> >>> diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c >>> index c2e1b06253b8..b33a5d5e2d35 100644 >>> --- a/arch/powerpc/kernel/module_64.c >>> +++ b/arch/powerpc/kernel/module_64.c >>> @@ -704,18 +711,21 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, >> ... >>> /* >>> * If found, replace it with: >>> * addis r2, r12, (.TOC.-func)@ha >>> * addi r2, r12, (.TOC.-func)@l >>> */ >>> - ((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value); >>> - ((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value); >>> + ((uint32_t *)location)[0] = PPC_INST_ADDIS | __PPC_RT(R2) | >>> + __PPC_RA(R12) | PPC_HA(value); >>> + ((uint32_t *)location)[1] = PPC_INST_ADDI | __PPC_RT(R2) | >>> + __PPC_RA(R12) | PPC_LO(value); >>> break; >> >> This was crashing and it's amazing how long you can stare at a >> disassembly and not see the difference between `r2` and `r12` :) > > Argh, yes. I was misleaded by the comment I guess. Sorry for that and > thanks for fixing. No worries, yes the comment was the problem. I fixed that as well. cheers ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h 2019-05-03 6:40 [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 2/3] powerpc/module32: Use symbolic instructions names Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 3/3] powerpc/module64: " Christophe Leroy @ 2019-07-08 1:19 ` Michael Ellerman 2 siblings, 0 replies; 7+ messages in thread From: Michael Ellerman @ 2019-07-08 1:19 UTC (permalink / raw) To: Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras Cc: linuxppc-dev, linux-kernel On Fri, 2019-05-03 at 06:40:15 UTC, Christophe Leroy wrote: > PPC_HA() PPC_HI() and PPC_LO() macros are nice macros. Move them > from module64.c to ppc-opcode.h in order to use them in other places. > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Series applied to powerpc next, thanks. https://git.kernel.org/powerpc/c/7f9c929a7ff203eae60b4225bb6824c3eb31796c cheers ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-07-12 7:02 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-05-03 6:40 [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 2/3] powerpc/module32: Use symbolic instructions names Christophe Leroy 2019-05-03 6:40 ` [PATCH v3 3/3] powerpc/module64: " Christophe Leroy 2019-07-08 0:56 ` Michael Ellerman 2019-07-08 8:58 ` Christophe Leroy 2019-07-12 7:00 ` Michael Ellerman 2019-07-08 1:19 ` [PATCH v3 1/3] powerpc: Move PPC_HA() PPC_HI() and PPC_LO() to ppc-opcode.h Michael Ellerman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).