Skip to content

Commit 5080ca0

Browse files
SiFiveHollandpalmer-dabbelt
authored andcommitted
riscv: Simplify text patching loops
This reduces the number of variables and makes the code easier to parse. Signed-off-by: Samuel Holland <[email protected]> Reviewed-by: Björn Töpel <[email protected]> Reviewed-by: Conor Dooley <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent b175675 commit 5080ca0

File tree

1 file changed

+21
-16
lines changed

1 file changed

+21
-16
lines changed

arch/riscv/kernel/patch.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,22 +163,24 @@ NOKPROBE_SYMBOL(__patch_insn_write);
163163

164164
static int patch_insn_set(void *addr, u8 c, size_t len)
165165
{
166-
size_t patched = 0;
167166
size_t size;
168-
int ret = 0;
167+
int ret;
169168

170169
/*
171170
* __patch_insn_set() can only work on 2 pages at a time so call it in a
172171
* loop with len <= 2 * PAGE_SIZE.
173172
*/
174-
while (patched < len && !ret) {
175-
size = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(addr + patched), len - patched);
176-
ret = __patch_insn_set(addr + patched, c, size);
177-
178-
patched += size;
173+
while (len) {
174+
size = min(len, PAGE_SIZE * 2 - offset_in_page(addr));
175+
ret = __patch_insn_set(addr, c, size);
176+
if (ret)
177+
return ret;
178+
179+
addr += size;
180+
len -= size;
179181
}
180182

181-
return ret;
183+
return 0;
182184
}
183185
NOKPROBE_SYMBOL(patch_insn_set);
184186

@@ -198,22 +200,25 @@ NOKPROBE_SYMBOL(patch_text_set_nosync);
198200

199201
int patch_insn_write(void *addr, const void *insn, size_t len)
200202
{
201-
size_t patched = 0;
202203
size_t size;
203-
int ret = 0;
204+
int ret;
204205

205206
/*
206207
* Copy the instructions to the destination address, two pages at a time
207208
* because __patch_insn_write() can only handle len <= 2 * PAGE_SIZE.
208209
*/
209-
while (patched < len && !ret) {
210-
size = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(addr + patched), len - patched);
211-
ret = __patch_insn_write(addr + patched, insn + patched, size);
212-
213-
patched += size;
210+
while (len) {
211+
size = min(len, PAGE_SIZE * 2 - offset_in_page(addr));
212+
ret = __patch_insn_write(addr, insn, size);
213+
if (ret)
214+
return ret;
215+
216+
addr += size;
217+
insn += size;
218+
len -= size;
214219
}
215220

216-
return ret;
221+
return 0;
217222
}
218223
NOKPROBE_SYMBOL(patch_insn_write);
219224

0 commit comments

Comments
 (0)