|
@@ -265,9 +265,23 @@ EXPORT_SYMBOL_GPL(__memcpy_mcsafe)
|
|
mov %ecx, %eax
|
|
mov %ecx, %eax
|
|
ret
|
|
ret
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * For write fault handling, given the destination is unaligned,
|
|
|
|
+ * we handle faults on multi-byte writes with a byte-by-byte
|
|
|
|
+ * copy up to the write-protected page.
|
|
|
|
+ */
|
|
|
|
+.E_write_words:
|
|
|
|
+ shll $3, %ecx
|
|
|
|
+ addl %edx, %ecx
|
|
|
|
+ movl %ecx, %edx
|
|
|
|
+ jmp mcsafe_handle_tail
|
|
|
|
+
|
|
.previous
|
|
.previous
|
|
|
|
|
|
_ASM_EXTABLE_FAULT(.L_read_leading_bytes, .E_leading_bytes)
|
|
_ASM_EXTABLE_FAULT(.L_read_leading_bytes, .E_leading_bytes)
|
|
_ASM_EXTABLE_FAULT(.L_read_words, .E_read_words)
|
|
_ASM_EXTABLE_FAULT(.L_read_words, .E_read_words)
|
|
_ASM_EXTABLE_FAULT(.L_read_trailing_bytes, .E_trailing_bytes)
|
|
_ASM_EXTABLE_FAULT(.L_read_trailing_bytes, .E_trailing_bytes)
|
|
|
|
+ _ASM_EXTABLE(.L_write_leading_bytes, .E_leading_bytes)
|
|
|
|
+ _ASM_EXTABLE(.L_write_words, .E_write_words)
|
|
|
|
+ _ASM_EXTABLE(.L_write_trailing_bytes, .E_trailing_bytes)
|
|
#endif
|
|
#endif
|