mirror of
https://github.com/SerenityOS/serenity
synced 2026-05-08 16:12:23 +02:00
As part of a commit series trying to make the prekernel nicer, we should move and refactor functions out of the init.cpp file if possible.
40 lines
985 B
C++
40 lines
985 B
C++
/*
|
|
* Copyright (c) 2024, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/Platform.h>
|
|
#include <Kernel/Boot/Multiboot.h>
|
|
#include <Kernel/Prekernel/Prekernel.h>
|
|
#include <Kernel/Prekernel/Random.h>
|
|
#if ARCH(X86_64)
|
|
# include <Kernel/Arch/x86_64/ASM_wrapper.h>
|
|
# include <Kernel/Arch/x86_64/CPUID.h>
|
|
#endif
|
|
|
|
u64 generate_secure_seed()
|
|
{
|
|
u32 seed = 0xFEEBDAED;
|
|
|
|
#if ARCH(X86_64)
|
|
Kernel::CPUID processor_info(0x1);
|
|
if (processor_info.edx() & (1 << 4)) // TSC
|
|
seed ^= Kernel::read_tsc();
|
|
|
|
if (processor_info.ecx() & (1 << 30)) // RDRAND
|
|
seed ^= Kernel::read_rdrand();
|
|
|
|
Kernel::CPUID extended_features(0x7);
|
|
if (extended_features.ebx() & (1 << 18)) // RDSEED
|
|
seed ^= Kernel::read_rdseed();
|
|
#else
|
|
# warning No native randomness source available for this architecture
|
|
#endif
|
|
|
|
seed ^= multiboot_info_ptr->mods_addr;
|
|
seed ^= multiboot_info_ptr->framebuffer_addr;
|
|
|
|
return seed;
|
|
}
|