From c888fcbdd92fca643cec507d78bc21c5e5640b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Wed, 31 May 2023 16:26:03 +0200 Subject: [PATCH] lx_emul: implement __get_random_u32_below The implementation was already part of the Zynq's sd_card driver and since other ARM drivers need it as well, promote it to the common shadow library. Issue genodelabs/genode-allwinner#21. --- repos/dde_linux/src/app/wireguard/lx_emul.c | 12 --------- .../lib/lx_emul/shadow/drivers/char/random.c | 27 +++++++++++++++++++ .../dde_linux/src/test/driver_time/dummies.c | 8 ------ .../drivers/framebuffer/intel/pc/dummies.c | 8 ------ repos/pc/src/drivers/usb_host/pc/dummies.c | 16 ----------- repos/pc/src/lib/pc_wifi/dummies.c | 8 ------ 6 files changed, 27 insertions(+), 52 deletions(-) diff --git a/repos/dde_linux/src/app/wireguard/lx_emul.c b/repos/dde_linux/src/app/wireguard/lx_emul.c index 8173e5804e..df1d139417 100644 --- a/repos/dde_linux/src/app/wireguard/lx_emul.c +++ b/repos/dde_linux/src/app/wireguard/lx_emul.c @@ -39,18 +39,6 @@ int wait_for_random_bytes(void) #include -u32 prandom_u32(void) -{ - return lx_emul_random_gen_u32(); -} - - -u32 __get_random_u32_below(u32 ceil) -{ - return lx_emul_random_gen_u32(); -} - - u8 get_random_u8(void) { u8 ret; diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/drivers/char/random.c b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/char/random.c index aa3e1a6513..962d9c535a 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/drivers/char/random.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/char/random.c @@ -60,3 +60,30 @@ bool rng_is_initialized(void) { return 1; } + + +u32 __get_random_u32_below(u32 ceil) +{ + /** + * Returns a random number from the half-open interval [0, ceil) + * with uniform distribution. + * + * The idea here is to split [0, 2^32) into #ceil bins. By dividing a random + * number from the 32-bit interval, we can determine into which bin the number + * fell. + */ + + /* determine divisor to determine bin number by dividing 2^32 by ceil */ + u32 div = 0x100000000ULL / ceil; + + /** + * In case the above division has a remainder, we will end up with an + * additional (but smaller) bin at the end of the 32-bit interval. We'll + * discard the result if the number fell into this bin and repeat. + */ + u32 result = ceil; + while (result >= ceil) + result = lx_emul_random_gen_u32() / div; + + return result; +} diff --git a/repos/dde_linux/src/test/driver_time/dummies.c b/repos/dde_linux/src/test/driver_time/dummies.c index f81d00eaca..f53a729f1e 100644 --- a/repos/dde_linux/src/test/driver_time/dummies.c +++ b/repos/dde_linux/src/test/driver_time/dummies.c @@ -22,14 +22,6 @@ void register_syscore_ops(struct syscore_ops * ops) } -#include - -u32 __get_random_u32_below(u32 ceil) -{ - lx_emul_trace_and_stop(__func__); -} - - #include DEFINE_STATIC_KEY_FALSE(force_irqthreads_key); diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c b/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c index 0e1cb57a67..0f3ceebc83 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c +++ b/repos/pc/src/drivers/framebuffer/intel/pc/dummies.c @@ -422,14 +422,6 @@ void pci_disable_msi(struct pci_dev *dev) } -#include - -u32 __get_random_u32_below(u32 ceil) -{ - lx_emul_trace_and_stop(__func__); -} - - #include DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map); diff --git a/repos/pc/src/drivers/usb_host/pc/dummies.c b/repos/pc/src/drivers/usb_host/pc/dummies.c index 595ce07b85..1749836449 100644 --- a/repos/pc/src/drivers/usb_host/pc/dummies.c +++ b/repos/pc/src/drivers/usb_host/pc/dummies.c @@ -85,14 +85,6 @@ int __printk_ratelimit(const char * func) } -#include - -u32 prandom_u32(void) -{ - lx_emul_trace_and_stop(__func__); -} - - #include void pci_disable_device(struct pci_dev * dev) @@ -101,14 +93,6 @@ void pci_disable_device(struct pci_dev * dev) } -#include - -u32 __get_random_u32_below(u32 ceil) -{ - lx_emul_trace_and_stop(__func__); -} - - #include DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map); diff --git a/repos/pc/src/lib/pc_wifi/dummies.c b/repos/pc/src/lib/pc_wifi/dummies.c index 5db7f94186..e8710fc143 100644 --- a/repos/pc/src/lib/pc_wifi/dummies.c +++ b/repos/pc/src/lib/pc_wifi/dummies.c @@ -386,14 +386,6 @@ void ieee80211_free_led_names(struct ieee80211_local * local) pteval_t __default_kernel_pte_mask __read_mostly = ~0; -#include - -u32 __get_random_u32_below(u32 ceil) -{ - lx_emul_trace_and_stop(__func__); -} - - u16 get_random_u16(void) { lx_emul_trace_and_stop(__func__);