Skip to content

Commit

Permalink
powerpc/code-patching: Reorganise do_patch_instruction() to ease erro…
Browse files Browse the repository at this point in the history
…r handling

Split do_patch_instruction() in two functions, the caller doing the
spin locking and the callee doing everything else.

And remove a few unnecessary initialisations and intermediate
variables.

This allows the callee to return from anywhere in the function.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/dbc85980a0d2a935731b272e8907e8bb1d8fc8c5.1638446239.git.christophe.leroy@csgroup.eu
  • Loading branch information
chleroy authored and mpe committed Dec 23, 2021
1 parent a3483c3 commit 6b21af7
Showing 1 changed file with 21 additions and 16 deletions.
37 changes: 21 additions & 16 deletions arch/powerpc/lib/code-patching.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,30 @@ static void unmap_patch_area(unsigned long addr)
flush_tlb_kernel_range(addr, addr + PAGE_SIZE);
}

static int __do_patch_instruction(u32 *addr, ppc_inst_t instr)
{
int err;
u32 *patch_addr;
unsigned long text_poke_addr;

text_poke_addr = (unsigned long)__this_cpu_read(text_poke_area)->addr;
patch_addr = (u32 *)(text_poke_addr + offset_in_page(addr));

err = map_patch_area(addr, text_poke_addr);
if (err)
return err;

err = __patch_instruction(addr, instr, patch_addr);

unmap_patch_area(text_poke_addr);

return err;
}

static int do_patch_instruction(u32 *addr, ppc_inst_t instr)
{
int err;
u32 *patch_addr = NULL;
unsigned long flags;
unsigned long text_poke_addr;
unsigned long kaddr = (unsigned long)addr;

/*
* During early early boot patch_instruction is called
Expand All @@ -146,19 +163,7 @@ static int do_patch_instruction(u32 *addr, ppc_inst_t instr)
return raw_patch_instruction(addr, instr);

local_irq_save(flags);

text_poke_addr = (unsigned long)__this_cpu_read(text_poke_area)->addr;
err = map_patch_area(addr, text_poke_addr);
if (err)
goto out;

patch_addr = (u32 *)(text_poke_addr + (kaddr & ~PAGE_MASK));

err = __patch_instruction(addr, instr, patch_addr);

unmap_patch_area(text_poke_addr);

out:
err = __do_patch_instruction(addr, instr);
local_irq_restore(flags);

return err;
Expand Down

0 comments on commit 6b21af7

Please sign in to comment.