lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 21 Nov 2015 11:50:28 +0000 From: Måns Rullgård <mans@...sr.com> To: Stephen Boyd <sboyd@...eaurora.org> Cc: linux-arm-kernel@...ts.infradead.org, linux-kernel@...r.kernel.org, linux-arm-msm@...r.kernel.org, Nicolas Pitre <nico@...xnic.net>, Arnd Bergmann <arnd@...db.de>, Steven Rostedt <rostedt@...dmis.org> Subject: Re: [RFC/PATCH 3/3] ARM: Replace calls to __aeabi_{u}idiv with udiv/sdiv instructions Stephen Boyd <sboyd@...eaurora.org> writes: > +static int module_patch_aeabi_uidiv(unsigned long loc, const Elf32_Sym *sym) > +{ > + extern char __aeabi_uidiv[], __aeabi_idiv[]; > + unsigned long udiv_addr = (unsigned long)__aeabi_uidiv; > + unsigned long sdiv_addr = (unsigned long)__aeabi_idiv; > + unsigned int udiv_insn, sdiv_insn, mask; > + > + if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) { > + mask = HWCAP_IDIVT; > + udiv_insn = __opcode_to_mem_thumb32(0xfbb0f0f1); > + sdiv_insn = __opcode_to_mem_thumb32(0xfb90f0f1); > + } else { > + mask = HWCAP_IDIVA; > + udiv_insn = __opcode_to_mem_arm(0xe730f110); > + sdiv_insn = __opcode_to_mem_arm(0xe710f110); > + } > + > + if (elf_hwcap & mask) { > + if (sym->st_value == udiv_addr) { > + *(u32 *)loc = udiv_insn; > + return 1; > + } else if (sym->st_value == sdiv_addr) { > + *(u32 *)loc = sdiv_insn; > + return 1; > + } > + } > + > + return 0; > +} [...] > +static void __init patch_aeabi_uidiv(void) > +{ > + extern unsigned long *__start_udiv_loc[], *__stop_udiv_loc[]; > + extern unsigned long *__start_idiv_loc[], *__stop_idiv_loc[]; > + unsigned long **p; > + unsigned int udiv_insn, sdiv_insn, mask; > + > + if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) { > + mask = HWCAP_IDIVT; > + udiv_insn = __opcode_to_mem_thumb32(0xfbb0f0f1); > + sdiv_insn = __opcode_to_mem_thumb32(0xfb90f0f1); > + } else { > + mask = HWCAP_IDIVA; > + udiv_insn = __opcode_to_mem_arm(0xe730f110); > + sdiv_insn = __opcode_to_mem_arm(0xe710f110); > + } > + > + if (elf_hwcap & mask) { > + for (p = __start_udiv_loc; p < __stop_udiv_loc; p++) { > + unsigned long *inst = *p; > + *inst = udiv_insn; > + } > + for (p = __start_idiv_loc; p < __stop_idiv_loc; p++) { > + unsigned long *inst = *p; > + *inst = sdiv_insn; > + } > + } > +} These functions are rather similar. Perhaps they could be combined somehow. -- Måns Rullgård mans@...sr.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists