diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-12-14 20:02:07 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-12-14 20:02:07 +0100 |
commit | 052abe1cc8dd6403f4983b1b587f14d3eed1fe8c (patch) | |
tree | 9131a31ef4a6f6f72602a3cfa947ec8e2d996e6a /sys/src | |
parent | 6cbc226351d6c47ace019f6d62e7070deb7b4b5a (diff) |
xen: fix build by adding missing rdrandbuf() function
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/xen/fns.h | 1 | ||||
-rw-r--r-- | sys/src/9/xen/l.s | 32 |
2 files changed, 33 insertions, 0 deletions
diff --git a/sys/src/9/xen/fns.h b/sys/src/9/xen/fns.h index 5b39cfddb..88f5f1916 100644 --- a/sys/src/9/xen/fns.h +++ b/sys/src/9/xen/fns.h @@ -102,6 +102,7 @@ int wrmsr(int, vlong); uint xchgl(uint*, uint); uint xchgw(ushort*, uint); uint xchgb(uchar*, uint); +void rdrandbuf(void*, ulong); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) #define KADDR(a) ((void*)((ulong)(a)|KZERO)) diff --git a/sys/src/9/xen/l.s b/sys/src/9/xen/l.s index f50fd5842..466b84d8c 100644 --- a/sys/src/9/xen/l.s +++ b/sys/src/9/xen/l.s @@ -296,6 +296,38 @@ TEXT mul64fract(SB), $0 ADCL BX, 4(CX) /* r2 += carry */ RET +#define RDRANDAX BYTE $0x0f; BYTE $0xc7; BYTE $0xf0 + +TEXT rdrand32(SB), $-4 +_rloop32: + RDRANDAX + JCC _rloop32 + RET + +TEXT rdrandbuf(SB), $0 + MOVL buf+0(FP), DI + MOVL cnt+4(FP), CX + CLD + MOVL CX, DX + SHRL $2, CX + CMPL CX, $0 + JE _rndleft +_rnddwords: + CALL rdrand32(SB) + STOSL + LOOP _rnddwords +_rndleft: + MOVL DX, CX + ANDL $3, CX + CMPL CX, $0 + JE _rnddone +_rndbytes: + CALL rdrand32(SB) + STOSB + LOOP _rndbytes +_rnddone: + RET + /* * label consists of a stack pointer and a PC */ |