From 2834d98f523e5580642fdf92723045edb3a8b0ec Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Tue, 8 Nov 2022 15:06:42 +0100 Subject: [PATCH] cpu/intel: Fix clearing MTRR for clang 64bit Clang generates R_X86_64_32S symbols that get truncated. TESTED: - prodrive/hermes boots with GCC and clang - MTRR are properly cleared (tested by filling in both MTRR_FIX_64K_00000 and MTRR_FIX_4K_F8000 before clearing) Change-Id: I6a5139f7029b6f35b44377f105dded06f6d9cbf9 Signed-off-by: Arthur Heymans Reviewed-on: https://review.coreboot.org/c/coreboot/+/69388 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons --- src/cpu/intel/car/core2/cache_as_ram.S | 11 ++++++----- src/cpu/intel/car/non-evict/cache_as_ram.S | 11 ++++++----- src/cpu/intel/car/p4-netburst/cache_as_ram.S | 11 ++++++----- src/soc/intel/common/block/cpu/car/cache_as_ram.S | 11 ++++++----- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/cpu/intel/car/core2/cache_as_ram.S b/src/cpu/intel/car/core2/cache_as_ram.S index fffe3f80b4..b9104e624e 100644 --- a/src/cpu/intel/car/core2/cache_as_ram.S +++ b/src/cpu/intel/car/core2/cache_as_ram.S @@ -32,15 +32,16 @@ wait_for_sipi: post_code(POST_SOC_CLEAR_FIXED_MTRRS) /* Clear/disable fixed MTRRs */ - mov $fixed_mtrr_list_size, %ebx + mov $fixed_mtrr_list, %ebx xor %eax, %eax xor %edx, %edx clear_fixed_mtrr: - add $-2, %ebx - movzwl fixed_mtrr_list(%ebx), %ecx + movzwl (%ebx), %ecx wrmsr - jnz clear_fixed_mtrr + add $2, %ebx + cmp $fixed_mtrr_list_end, %ebx + jl clear_fixed_mtrr /* Figure out how many MTRRs we have, and clear them out */ mov $MTRR_CAP_MSR, %ecx @@ -202,6 +203,6 @@ fixed_mtrr_list: .word MTRR_FIX_4K_E8000 .word MTRR_FIX_4K_F0000 .word MTRR_FIX_4K_F8000 -fixed_mtrr_list_size = . - fixed_mtrr_list +fixed_mtrr_list_end: _cache_as_ram_setup_end: diff --git a/src/cpu/intel/car/non-evict/cache_as_ram.S b/src/cpu/intel/car/non-evict/cache_as_ram.S index 2ac660c9aa..d47fa725f1 100644 --- a/src/cpu/intel/car/non-evict/cache_as_ram.S +++ b/src/cpu/intel/car/non-evict/cache_as_ram.S @@ -43,15 +43,16 @@ wait_for_sipi: post_code(POST_SOC_CLEAR_FIXED_MTRRS) /* Clear/disable fixed MTRRs */ - mov $fixed_mtrr_list_size, %ebx + mov $fixed_mtrr_list, %ebx xor %eax, %eax xor %edx, %edx clear_fixed_mtrr: - add $-2, %ebx - movzwl fixed_mtrr_list(%ebx), %ecx + movzwl (%ebx), %ecx wrmsr - jnz clear_fixed_mtrr + add $2, %ebx + cmp $fixed_mtrr_list_end, %ebx + jl clear_fixed_mtrr /* Zero out all variable range MTRRs. */ movl $MTRR_CAP_MSR, %ecx @@ -256,6 +257,6 @@ fixed_mtrr_list: .word MTRR_FIX_4K_E8000 .word MTRR_FIX_4K_F0000 .word MTRR_FIX_4K_F8000 -fixed_mtrr_list_size = . - fixed_mtrr_list +fixed_mtrr_list_end: _cache_as_ram_setup_end: diff --git a/src/cpu/intel/car/p4-netburst/cache_as_ram.S b/src/cpu/intel/car/p4-netburst/cache_as_ram.S index 01abdf884f..efd0d17d54 100644 --- a/src/cpu/intel/car/p4-netburst/cache_as_ram.S +++ b/src/cpu/intel/car/p4-netburst/cache_as_ram.S @@ -28,15 +28,16 @@ cache_as_ram: jz ap_init /* Clear/disable fixed MTRRs */ - mov $fixed_mtrr_list_size, %ebx + mov $fixed_mtrr_list, %ebx xor %eax, %eax xor %edx, %edx clear_fixed_mtrr: - add $-2, %ebx - movzwl fixed_mtrr_list(%ebx), %ecx + movzwl (%ebx), %ecx wrmsr - jnz clear_fixed_mtrr + add $2, %ebx + cmp $fixed_mtrr_list_end, %ebx + jl clear_fixed_mtrr /* Figure out how many MTRRs we have, and clear them out */ mov $MTRR_CAP_MSR, %ecx @@ -402,6 +403,6 @@ fixed_mtrr_list: .word MTRR_FIX_4K_E8000 .word MTRR_FIX_4K_F0000 .word MTRR_FIX_4K_F8000 -fixed_mtrr_list_size = . - fixed_mtrr_list +fixed_mtrr_list_end: _cache_as_ram_setup_end: diff --git a/src/soc/intel/common/block/cpu/car/cache_as_ram.S b/src/soc/intel/common/block/cpu/car/cache_as_ram.S index 1b08af2f5c..a1e73f970a 100644 --- a/src/soc/intel/common/block/cpu/car/cache_as_ram.S +++ b/src/soc/intel/common/block/cpu/car/cache_as_ram.S @@ -101,15 +101,16 @@ no_reset: post_code(POST_SOC_NO_RESET) /* Clear/disable fixed MTRRs */ - mov $fixed_mtrr_list_size, %ebx + mov $fixed_mtrr_list, %ebx xor %eax, %eax xor %edx, %edx clear_fixed_mtrr: - add $-2, %ebx - movzwl fixed_mtrr_list(%ebx), %ecx + movzwl (%ebx), %ecx wrmsr - jnz clear_fixed_mtrr + add $2, %ebx + cmp $fixed_mtrr_list_end, %ebx + jl clear_fixed_mtrr post_code(POST_SOC_CLEAR_FIXED_MTRRS) @@ -317,7 +318,7 @@ fixed_mtrr_list: .word MTRR_FIX_4K_E8000 .word MTRR_FIX_4K_F0000 .word MTRR_FIX_4K_F8000 -fixed_mtrr_list_size = . - fixed_mtrr_list +fixed_mtrr_list_end: #if CONFIG(INTEL_CAR_NEM) .global car_nem