diff options
| -rw-r--r-- | arch/arm64/mm/proc.S | 12 | 
1 files changed, 12 insertions, 0 deletions
| diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index 0a48191534ff..97d7bcd8d4f2 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S @@ -447,6 +447,18 @@ SYM_FUNC_START(__cpu_setup)  	mov	x10, #(SYS_GCR_EL1_RRND | SYS_GCR_EL1_EXCL_MASK)  	msr_s	SYS_GCR_EL1, x10 +	/* +	 * If GCR_EL1.RRND=1 is implemented the same way as RRND=0, then +	 * RGSR_EL1.SEED must be non-zero for IRG to produce +	 * pseudorandom numbers. As RGSR_EL1 is UNKNOWN out of reset, we +	 * must initialize it. +	 */ +	mrs	x10, CNTVCT_EL0 +	ands	x10, x10, #SYS_RGSR_EL1_SEED_MASK +	csinc	x10, x10, xzr, ne +	lsl	x10, x10, #SYS_RGSR_EL1_SEED_SHIFT +	msr_s	SYS_RGSR_EL1, x10 +  	/* clear any pending tag check faults in TFSR*_EL1 */  	msr_s	SYS_TFSR_EL1, xzr  	msr_s	SYS_TFSRE0_EL1, xzr | 
