summaryrefslogtreecommitdiff
path: root/sys/src/9
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-12-14 20:02:07 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2016-12-14 20:02:07 +0100
commit052abe1cc8dd6403f4983b1b587f14d3eed1fe8c (patch)
tree9131a31ef4a6f6f72602a3cfa947ec8e2d996e6a /sys/src/9
parent6cbc226351d6c47ace019f6d62e7070deb7b4b5a (diff)
xen: fix build by adding missing rdrandbuf() function
Diffstat (limited to 'sys/src/9')
-rw-r--r--sys/src/9/xen/fns.h1
-rw-r--r--sys/src/9/xen/l.s32
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
*/