wok rev 25511

memtest: 386 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Feb 13 17:17:56 2023 +0000 (21 months ago)
parents 69e1e705f038
children e92394c9bae5
files memtest/receipt memtest/stuff/memtest86+-6-386.patch
line diff
     1.1 --- a/memtest/receipt	Sun Feb 12 20:36:56 2023 +0000
     1.2 +++ b/memtest/receipt	Mon Feb 13 17:17:56 2023 +0000
     1.3 @@ -67,11 +67,15 @@
     1.4  compile_rules()
     1.5  {
     1.6  	# Need CPUID instruction (586+ cpu)
     1.7 -	sed -i 's|64, MT_VERSION "." GIT_HASH|65, MT_VERSION ".SliTaz"|;s|"\.x32"|".586"|' app/display.c
     1.8 -	sed 's|gcc|gcc-83|' -i build32/Makefile
     1.9 +	sed -i 's|64, MT_VERSION "." GIT_HASH|65, MT_VERSION ".SliTaz"|;s|"\.x32"|".386"|' app/display.c
    1.10 +	sed 's|gcc|gcc-83|;s|march=i586|march=i486|' -i build32/Makefile
    1.11 +	patch -p0 < $stuff/memtest86\+-6-386.patch
    1.12  	cd build32
    1.13 +	make boot/startup.o
    1.14 +	objdump -t boot/startup.o | \
    1.15 +	awk '/patch/ { print "sed -i \"s|" $5 "|0x" $1 "|\" ../boot/setup.S" }' | sh
    1.16  	make memtest.bin
    1.17 -	tune_lzma memtest.bin 122,mf=bt4 LC 3 PB 2
    1.18 +	tune_lzma memtest.bin 161,mf=bt2 LC 3 PB 2
    1.19  } 
    1.20  
    1.21  
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/memtest/stuff/memtest86+-6-386.patch	Mon Feb 13 17:17:56 2023 +0000
     2.3 @@ -0,0 +1,149 @@
     2.4 +--- system/cpuinfo.c
     2.5 ++++ system/cpuinfo.c
     2.6 +@@ -848,6 +848,12 @@
     2.7 +       default:
     2.8 +         // Unknown processor - make a guess at the family.
     2.9 +         switch (cpuid_info.version.family) {
    2.10 ++          case 3:
    2.11 ++            cpu_model = "386";
    2.12 ++            break;
    2.13 ++          case 4:
    2.14 ++            cpu_model = "486";
    2.15 ++            break;
    2.16 +           case 5:
    2.17 +             cpu_model = "586";
    2.18 +             break;
    2.19 +--- system/cpuid.c
    2.20 ++++ system/cpuid.c
    2.21 +@@ -8,6 +8,27 @@
    2.22 + #include <stdint.h>
    2.23 + 
    2.24 + #include "cpuid.h"
    2.25 ++#include "config.h"
    2.26 ++
    2.27 ++#define AC_BIT		(1<<18)
    2.28 ++#define CPUID_BIT	(1<<21)
    2.29 ++static inline int has_cpuid(int bits)
    2.30 ++{
    2.31 ++	int eax, edx;
    2.32 ++	__asm__ __volatile__(
    2.33 ++		"pushfl\n\t"
    2.34 ++		"popl %0\n\t"
    2.35 ++		"movl %0,%1\n\t"
    2.36 ++		"xorl %2,%0\n\t"
    2.37 ++		"pushl %0\n\t"
    2.38 ++		"popfl\n\t"
    2.39 ++		"pushfl\n\t"
    2.40 ++		"popl %0\n\t"
    2.41 ++		"pushl %1\n\t"
    2.42 ++		"popfl\n\t"
    2.43 ++		"xorl %1,%0":"=a" (eax),"=d" (edx):"c" (bits));
    2.44 ++	return eax;
    2.45 ++}
    2.46 + 
    2.47 + //------------------------------------------------------------------------------
    2.48 + // Public Variables
    2.49 +@@ -24,6 +45,17 @@
    2.50 +     uint32_t reg[4];
    2.51 +     char *p, *q;
    2.52 + 
    2.53 ++    switch (has_cpuid(AC_BIT|CPUID_BIT)) {
    2.54 ++    case 0:
    2.55 ++        cpuid_info.version.family = 3;
    2.56 ++        pause_at_start = false;
    2.57 ++        return;
    2.58 ++    case AC_BIT:
    2.59 ++        cpuid_info.version.family = 4;
    2.60 ++        pause_at_start = false;
    2.61 ++        return;
    2.62 ++    }
    2.63 ++
    2.64 +     // Get the max standard cpuid & vendor ID.
    2.65 +     cpuid(0x0, 0,
    2.66 +         &cpuid_info.max_cpuid,
    2.67 +--- boot/setup.S
    2.68 ++++ boot/setup.S
    2.69 +@@ -100,6 +100,29 @@
    2.70 + 	.long	0x10
    2.71 + 
    2.72 + do_setup:
    2.73 ++
    2.74 ++	# Check cpuid support
    2.75 ++
    2.76 ++	pushfl
    2.77 ++	popw	%dx
    2.78 ++	popw	%ax
    2.79 ++	xorb	$0x20, %al		# toggle CPUID feature bit (21)
    2.80 ++	pushw	%ax
    2.81 ++	pushw	%dx
    2.82 ++	popfl
    2.83 ++	pushfl
    2.84 ++	popw	%dx
    2.85 ++	popw	%ax
    2.86 ++	xorb	%dl, %al
    2.87 ++	and	$0x20, %al
    2.88 ++	jz	1f
    2.89 ++	movw	$0x1000, %ax
    2.90 ++	movw	%ax, %ds
    2.91 ++	movb	$0xa8, %al		# testb $imm %al opcode
    2.92 ++	movw	%ax, patch1
    2.93 ++	movw	%ax, patch2
    2.94 ++1:
    2.95 ++
    2.96 + 	# Reload the segment registers, except for the stack.
    2.97 + 
    2.98 + 	movw	%cs, %ax
    2.99 +--- boot/startup32.S
   2.100 ++++ boot/startup32.S
   2.101 +@@ -105,6 +105,8 @@
   2.102 + 
   2.103 + 	# ...and check if the processor supports long mode.
   2.104 + 
   2.105 ++patch1:
   2.106 ++	jmp	1f
   2.107 + 	movl	$0x80000000, %eax	# check if function 0x80000001 is available
   2.108 + 	pushl	%ebx			# ebx is overwritten by cpuid
   2.109 + 	cpuid
   2.110 +@@ -198,6 +200,8 @@
   2.111 + 
   2.112 + 	# Enable PAE if supported.
   2.113 + 
   2.114 ++patch2:
   2.115 ++	jmp	1f
   2.116 + 	pushl	%ebx			# ebx is overwritten by cpuid
   2.117 + 	movl	$0x00000001, %eax	# test the PAE flag
   2.118 + 	cpuid
   2.119 +--- system/cache.h
   2.120 ++++ system/cache.h
   2.121 +@@ -1,6 +1,7 @@
   2.122 + // SPDX-License-Identifier: GPL-2.0
   2.123 + #ifndef CACHE_H
   2.124 + #define CACHE_H
   2.125 ++#include "cpuid.h"
   2.126 + /**
   2.127 +  * \file
   2.128 +  *
   2.129 +@@ -26,6 +27,7 @@
   2.130 +         : "rax", "memory"
   2.131 +     );
   2.132 + #else
   2.133 ++    if (cpuid_info.version.family >= 4)
   2.134 +     __asm__ __volatile__ ("\t"
   2.135 +         "movl   %%cr0, %%eax        \n\t"
   2.136 +         "orl    $0x40000000, %%eax  \n\t"  /* Set CD */
   2.137 +@@ -53,6 +55,7 @@
   2.138 +         : "rax", "memory"
   2.139 +     );
   2.140 + #else
   2.141 ++    // if (cpuid_info.version.family >= 4)
   2.142 +     __asm__ __volatile__ ("\t"
   2.143 +         "movl   %%cr0, %%eax        \n\t"
   2.144 +         "andl   $0x9fffffff, %%eax  \n\t" /* Clear CD and NW */
   2.145 +@@ -69,6 +72,7 @@
   2.146 +  */
   2.147 + static inline void cache_flush(void)
   2.148 + {
   2.149 ++    if (cpuid_info.version.family >= 4)
   2.150 +     __asm__ __volatile__ ("\t"
   2.151 +         "wbinvd\n"
   2.152 +         : /* no outputs */