Commit Graph
5 Commits
Author SHA1 Message Date
Yawning Angel c430a82721 src: Fix the syscall intrinsic code generation for Linux and Windows
The old assembly generated for the syscall intrinsic did not specify
clobber constraints.  This adds RCX and R11 (that are clobbered by
the instruction itself), and memory (that is clobbered by some
system calls) to the assembly constraints.

Note: This is still incorrect on FreeBSD, which clobbers more registers
and uses the carry flag instead of -errno in rax to indicate an error.
2021-11-13 09:53:20 +00:00
Yawning Angel 672fc9fc4d core/mem: Add zero_explicit
This call is intended to provide the ability to securely scrub memory
without compiler interference, in a similar manner to explicit_bzero,
memset_s, SecureZeroMemory.

The approach taken is a volatile memset followed by a seqentially
consistent memory fence, to prevent the call from being optimized away
by DSE, and from being reordered.  An identical approach is currently
being used by the zeroize Rust crate, and is effective in practice.

LLVM IR output:
```
; Function Attrs: nounwind
define internal i8* @mem.zero_explicit(i8* %0, i64 %1) #0 {
decls:
  call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 %1, i1 true)
  fence seq_cst
  ret i8* %0
}
```
2021-10-31 22:57:13 +00:00
Yawning Angel 796a0c3968 core/intrinsics: Add mem_zero_volatile 2021-10-31 21:37:22 +00:00
Yawning Angel ff36bd3d85 build: Support the Fedora LLVM 11 package
Fedora is on LLVM 12, and the backward compatibility package has a
non-standard name for llvm-config.
2021-10-31 20:23:03 +00:00
Yawning Angel ee724f183a core:math/bits: Improve add/sub/mul_u64
* `add_u32`/`add_u64`/`add_uint` are now constant time
 * `sub_u32`/`sub_u64`/`sub_uint` are now constant time
 * `mul_u64` now uses `u128`
2021-10-27 12:37:35 +00:00