#------------------------------------------------------------------------------ # # Copyright (c) Microsoft Corporation. # Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # # Module Name: # # DynamicCookieGcc.S # # Abstract: # # Generates random number through the RdTime instruction on a 64-bit LOONGARCH64 platform # to store a random value in the GCC __stack_check_guard stack cookie. # The first byte is 0'd to prevent string copy functions from clobbering # the stack cookie. # # Notes: # # Use the RngLib library to get random numbers. LoongArch64 currently does not support like # `RdRand` or `RNDR` instructions, it can use the `RdTime` and a xorshift64 algorithms to # generate pseudo-random numbers. # #------------------------------------------------------------------------------ #include ASM_GLOBAL ASM_PFX (_ModuleEntryPoint) #------------------------------------------------------------------------------ # VOID # EFIAPI # _ModuleEntryPoint ( # The parameters are saved to the stack when it calls other functions. # ) #------------------------------------------------------------------------------ ASM_PFX(_ModuleEntryPoint): addi.d $sp, $sp, -0x20 st.d $a0, $sp, 0x0 st.d $a1, $sp, 0x8 st.d $ra, $sp, 0x10 // // Use the stack to pass parameters. // addi.d $a0, $sp, 0x18 bl GetRandomNumber64 // // Load the random number from the stack. // ld.d $t0, $sp, 0x18 // // Zero the first byte of the random value // bstrins.d $t0, $zero, 7, 0 la.local $t1, __stack_chk_guard st.d $t0, $t1, 0 dbar 0 ld.d $a0, $sp, 0x0 ld.d $a1, $sp, 0x8 ld.d $ra, $sp, 0x10 addi.d $sp, $sp, 0x20 c_entry: b _CModuleEntryPoint // Jump to the C module entry point .end