/* * Copyright (c) 2024, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #if ARCH(X86_64) # include # include #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; }