Hello,

Following patch adds proper inline assembly register clobbers to the AMD CAR code. The reason is that the GCC expects some values to be still valid, but those are overwritten by the inline code (ecx). The memcopy implementation is taken from linux kernel 2.6.32. The EBP relocation is to needed because the code does not use frame pointer. As an extra safety I added a clobber of all available registers. To make GCC extra sure that no value is valid, which should catch pointers to variables on the stack too.

Can someone test this change on something else than model 0fh please?

Signed-off-by: Rudolf Marek <[email protected]>

Thanks,
Rudolf

Index: src/cpu/amd/car/disable_cache_as_ram.c
===================================================================
--- src/cpu/amd/car/disable_cache_as_ram.c	(revision 5009)
+++ src/cpu/amd/car/disable_cache_as_ram.c	(working copy)
@@ -2,62 +2,49 @@
 /* be warned, this file will be used other cores and core 0 / node 0 */
 static inline __attribute__((always_inline)) void disable_cache_as_ram(void)
 {
-
-        __asm__ volatile (
-
+        __asm__ __volatile__ (
         /* We don't need cache as ram for now on */
         /* disable cache */
-        "movl    %cr0, %eax\n\t"
-        "orl    $(0x1<<30),%eax\n\t"
-        "movl    %eax, %cr0\n\t"
+        "movl    %%cr0, %%eax\n\t"
+        "orl    $(0x1<<30),%%eax\n\t"
+        "movl    %%eax, %%cr0\n\t"
 
         /* clear sth */
-        "movl    $0x269, %ecx\n\t"  /* fix4k_c8000*/
-        "xorl    %edx, %edx\n\t"
-        "xorl    %eax, %eax\n\t"
+        "movl    $0x269, %%ecx\n\t"  /* fix4k_c8000*/
+        "xorl    %%edx, %%edx\n\t"
+        "xorl    %%eax, %%eax\n\t"
 	"wrmsr\n\t"
 #if CONFIG_DCACHE_RAM_SIZE > 0x8000
-	"movl    $0x268, %ecx\n\t"  /* fix4k_c0000*/
+	"movl    $0x268, %%ecx\n\t"  /* fix4k_c0000*/
         "wrmsr\n\t"
 #endif
 
         /* disable fixed mtrr from now on, it will be enabled by coreboot_ram again*/
-        "movl    $0xC0010010, %ecx\n\t"
+        "movl    $0xC0010010, %%ecx\n\t"
 //        "movl    $SYSCFG_MSR, %ecx\n\t"
         "rdmsr\n\t"
-        "andl    $(~(3<<18)), %eax\n\t"
+        "andl    $(~(3<<18)), %%eax\n\t"
 //        "andl    $(~(SYSCFG_MSR_MtrrFixDramModEn | SYSCFG_MSR_MtrrFixDramEn)), %eax\n\t"
         "wrmsr\n\t"
 
         /* Set the default memory type and disable fixed and enable variable MTRRs */
-        "movl    $0x2ff, %ecx\n\t"
+        "movl    $0x2ff, %%ecx\n\t"
 //        "movl    $MTRRdefType_MSR, %ecx\n\t"
-        "xorl    %edx, %edx\n\t"
+        "xorl    %%edx, %%edx\n\t"
         /* Enable Variable and Disable Fixed MTRRs */
-        "movl    $0x00000800, %eax\n\t"
+        "movl    $0x00000800, %%eax\n\t"
         "wrmsr\n\t"
 
         /* enable cache */
-        "movl    %cr0, %eax\n\t"
-        "andl    $0x9fffffff,%eax\n\t"
-        "movl    %eax, %cr0\n\t"
-
+        "movl    %%cr0, %%eax\n\t"
+        "andl    $0x9fffffff,%%eax\n\t"
+        "movl    %%eax, %%cr0\n\t"
+        ::: "memory", "eax", "ecx", "edx"
         );
 }
 
 static void disable_cache_as_ram_bsp(void)
 {
-	__asm__ volatile (
-//		"pushl %eax\n\t"
- 		"pushl %edx\n\t"
- 		"pushl %ecx\n\t"
-	);
-
 	disable_cache_as_ram();
-        __asm__ volatile (
-                "popl %ecx\n\t"
-                "popl %edx\n\t"
-//                "popl %eax\n\t"
-        );
 }
 
Index: src/cpu/amd/car/post_cache_as_ram.c
===================================================================
--- src/cpu/amd/car/post_cache_as_ram.c	(revision 5009)
+++ src/cpu/amd/car/post_cache_as_ram.c	(working copy)
@@ -12,12 +12,16 @@
 
 static void inline __attribute__((always_inline))  memcopy(void *dest, const void *src, unsigned long bytes)
 {
-        __asm__ volatile(
-                "cld\n\t"
-                "rep; movsl\n\t"
-                : /* No outputs */
-                : "S" (src), "D" (dest), "c" ((bytes)>>2)
-                );
+	int d0, d1, d2;
+	asm volatile("cld ; rep ; movsl\n\t"
+			"movl %4,%%ecx\n\t"
+			"andl $3,%%ecx\n\t"
+			"jz 1f\n\t"
+			"rep ; movsb\n\t"
+			"1:"
+			: "=&c" (d0), "=&D" (d1), "=&S" (d2)
+			: "0" (bytes / 4), "g" (bytes), "1" ((long)dest), "2" ((long)src)
+			: "memory", "cc");
 }
 /* Disable Erratum 343 Workaround, see RevGuide for Fam10h, Pub#41322 Rev 3.33 */
 
@@ -51,6 +55,7 @@
 	unsigned testx = 0x5a5a5a5a;
 	print_debug_pcar("testx = ", testx);
 
+
 	/* copy data from cache as ram to 
 		ram need to set CONFIG_RAMTOP to 2M and use var mtrr instead.
 	 */
@@ -66,28 +71,16 @@
 	/* from here don't store more data in CAR */
 	vErrata343();
 
-#if 0
-        __asm__ volatile (
-        	"pushl  %eax\n\t"
-        );
-#endif
-
         memcopy((void *)((CONFIG_RAMTOP)-CONFIG_DCACHE_RAM_SIZE), (void *)CONFIG_DCACHE_RAM_BASE, CONFIG_DCACHE_RAM_SIZE); //inline
 //        dump_mem((CONFIG_RAMTOP) - 0x8000, (CONFIG_RAMTOP) - 0x7c00);
 
         __asm__ volatile (
                 /* set new esp */ /* before CONFIG_RAMBASE */
-                "subl   %0, %%ebp\n\t"
                 "subl   %0, %%esp\n\t"
                 ::"a"( (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE)- (CONFIG_RAMTOP) )
-        ); // We need to push %eax to the stack (CAR) before copy stack and pop it later after copy stack and change esp
-#if 0
-        __asm__ volatile (
-	        "popl   %eax\n\t"
+                : "cc", "memory", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp"
         );
-#endif
 
-
 	/* We can put data to stack again */
 
         /* only global variable sysinfo in cache need to be offset */
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to