On Wed, 17 Nov 1999, Christophe Kumsta wrote:

: 
: Hi all,
: 
: I got a compiler error :
: 

[...]

: gcc-2.95 is buggy ???

 No, gcc-2.95 is ok, the only thing is that new gcc is more strict about
asm constraints. The attached patch is against rtai-0.7, features :

 - it allow compiling with gcc-2.95
 - CPU speed autodetection and 8254 calibration integrated in modules, so
        you don't need recompiling them if another machine occured
 - only upscheduler tested
 - native cpu calibration routine give me strange values - don't know why

: 
: 

                Rus
diff -ur rtai-0.7/cpu_freq_calibration/rt_cal.c 
rtai-0.7.1/cpu_freq_calibration/rt_cal.c
--- rtai-0.7/cpu_freq_calibration/rt_cal.c      Mon Sep 13 12:57:46 1999
+++ rtai-0.7.1/cpu_freq_calibration/rt_cal.c    Sun Nov  7 20:01:21 1999
@@ -29,12 +29,12 @@
        gcount++;
        if (++count == RESET_COUNT) {
                tsc.time -= tbase;
-               __asm__ __volatile__("movl %%cr0,%%eax": "=a" (linux_cr0): : "ax");
+               __asm__ __volatile__("movl %%cr0,%%eax": "=a" (linux_cr0));
                __asm__ __volatile__("clts; fnsave %0": "=m" (fpu_reg));
                freq =  (double)tsc.time_lh[1]*(double)0x100000000LL + 
(double)tsc.time_lh[0];
                count =  (freq*CLOCK_TICK_RATE)/(((double)gcount)*LATCH) + 
0.4999999999999;
                __asm__ __volatile__("frstor %0" : "=m" (fpu_reg));
-               __asm__ __volatile__("movl %%eax,%%cr0": :"a" (linux_cr0): "ax");
+               __asm__ __volatile__("movl %%eax,%%cr0": :"a" (linux_cr0));
                printk("\n->>> MEASURED CPU_FREQ: %d (Hz) (%d s) <<<-\n", count, 
gcount/100 + 1);
                count = 0;
        }
diff -ur rtai-0.7/examples/sound/rt_process.c rtai-0.7.1/examples/sound/rt_process.c
--- rtai-0.7/examples/sound/rt_process.c        Mon Sep 13 12:57:46 1999
+++ rtai-0.7.1/examples/sound/rt_process.c      Sun Nov  7 19:41:26 1999
@@ -17,7 +17,7 @@
 #include <rtai_fifos.h>
 #include <rtai_sched.h>
 
-#define ONESHOT
+//#define ONESHOT
 
 #define TIMER_TO_CPU 3 // < 0 || > 1 to maintain a symmetric processed timer.
 
diff -ur rtai-0.7/include/rtai.h rtai-0.7.1/include/rtai.h
--- rtai-0.7/include/rtai.h     Fri Sep 24 20:46:42 1999
+++ rtai-0.7.1/include/rtai.h   Mon Nov  8 02:05:52 1999
@@ -16,13 +16,14 @@
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
 
+#ifndef _RTAI_H_
+#define _RTAI_H_
 
 #include <asm/ptrace.h>
 #include <asm/spinlock.h>
 
 #define FREQ_8254 1193180
 #define LATENCY_8254 11000
-#define SETUP_TIME_8254 2000
 
 #define BUS_FREQ 100225700
 #define APIC_DIVISOR 16
@@ -31,9 +32,7 @@
 #define LATENCY_APIC 3000
 #define SETUP_TIME_APIC 500
 
-//#define CPU_FREQ FREQ_8254
-//#define CPU_FREQ 233863280
-#define CPU_FREQ 350799293
+//#define RT_FOR_486
 
 #define IFLAG  9
 
@@ -323,7 +322,7 @@
 extern void rt_setup_8254_tsc(void);
 
 #undef rdtsc
-#if CPU_FREQ == FREQ_8254
+#ifdef RT_FOR_486
 #define rdtsc() rd_8254_ts()
 #else
 #define rdtsc() rd_CPU_ts()
@@ -334,35 +333,36 @@
 {
        union {unsigned long long time; unsigned long time_lh[2]; } tsc;
        __asm__ __volatile__( "rdtsc"
-                             : "=a" (tsc.time_lh[0]), "=d" (tsc.time_lh[1])
-                             : 
-                             :"ax", "dx");
+                             : "=a" (tsc.time_lh[0]), "=d" (tsc.time_lh[1]));
        return tsc.time;
 }
 
 // returns (int)i = (int)i*(int)(mult)/(int)div.
 static inline int imuldiv(int i, int mult, int div)
 {
+ int dummy, dummy1;
+ 
        __asm__("imull %%edx ;     idiv %%ecx; sal $1,%%edx  \n\t"
               "cmpl %%edx,%%ecx; jge 1f;     incl %%eax;   1:"
-               : "=a" (i)
-                      : "a" (i), "d" (mult), "c" (div)
-               : "%eax", "%ecx", "%edx");
+               : "=a" (i), "=c" (dummy), "=d" (dummy1)
+                      : "a" (i), "d" (mult), "c" (div));
        return i;
 }
 
 // returns (long long)ll = (int)ll*(int)(mult)/(int)div.
 static inline long long llimd(long long ll, int mult, int div)
 {
+ int dummy, dummy1;
+ 
        __asm__( "movl %%edx,%%ecx; mull %%esi;       movl %%eax,%%ebx;  \n\t"
                 "movl %%ecx,%%eax; movl %%edx,%%ecx; mull %%esi;        \n\t"
                 "addl %%ecx,%%eax; adcl $0,%%edx;    divl %%edi;        \n\t"
                 "movl %%eax,%%ecx; movl %%ebx,%%eax; divl %%edi;        \n\t"
                 "sal $1,%%edx;     cmpl %%edx,%%edi; movl %%ecx,%%edx;  \n\t"
                 "jge 1f;           addl $1,%%eax;    adcl $0,%%edx;     1:"
-                : "=A" (ll)
+                : "=A" (ll), "=S" (dummy), "=D" (dummy1)
                 : "A" (ll), "S" (mult), "D" (div)
-                : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" );
+                : "%ebx", "%ecx");
        return ll;
 }
 
@@ -378,7 +378,7 @@
 #define SAVE_IRQ_REG __asm__ __volatile__ (" \
        pushl pushl %es; pushl %ds; pushl %eax;\n\t \
        pushl %ebp; pushl %ecx; pushl %edx;\n\t \
-       movl $" STR(__KERNEL_DS) ",%edx; movl %dx,%ds; movl %dx,%es")
+       movl $" STR(__KERNEL_DS) ",%edx; movl %edx,%ds; movl %edx,%es")
 
 #define RSTR_IRQ_REG __asm__ __volatile__ (" \
        popl %edx; popl %ecx; popl %ebp; popl %eax;\n\t \
@@ -388,7 +388,7 @@
        cld; pushl %es; pushl %ds; pushl %eax;\n\t \
        pushl %ebp; pushl %edi; pushl %esi;\n\t \
        pushl %edx; pushl %ecx; pushl %ebx;\n\t \
-       movl $" STR(__KERNEL_DS) ",%edx; movl %dx,%ds; movl %dx,%es")
+       movl $" STR(__KERNEL_DS) ",%edx; movl %edx,%ds; movl %edx,%es")
 
 #define RSTR_FULL_IRQ_REG __asm__ __volatile__ (" \
        popl %ebx; popl %ecx; popl %edx; popl %esi; popl %edi;\n\t \
@@ -398,8 +398,10 @@
        cld; pushl %es; pushl %ds; pushl %ebp;\n\t \
        pushl %edi; pushl %esi; pushl %ecx;\n\t \
        pushl %ebx; pushl %edx; pushl %eax;\n\t \
-       movl $" STR(__KERNEL_DS) ",%ebx; movl %bx,%ds; movl %bx,%es")
+       movl $" STR(__KERNEL_DS) ",%ebx; movl %ebx,%ds; movl %ebx,%es")
 
 #define RSTR_SRQ_REG __asm__ __volatile__ (" \
        popl %eax; popl %edx; popl %ebx; popl %ecx; popl %esi;\n\t \
        popl %edi; popl %ebp; popl %ds; popl %es; iret")
+
+#endif
diff -ur rtai-0.7/include/rtai_sched.h rtai-0.7.1/include/rtai_sched.h
--- rtai-0.7/include/rtai_sched.h       Fri Oct  1 20:03:27 1999
+++ rtai-0.7.1/include/rtai_sched.h     Sun Nov  7 20:34:31 1999
@@ -16,6 +16,8 @@
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
 
+#ifndef _RTAI_SCHED_H_
+#define _RTAI_SCHED_H_
 
 #ifdef INTERFACE_TO_LINUX
 #define RT_LINUX_PRIORITY 0x7fffFfff
@@ -222,5 +224,7 @@
 extern int rt_mbx_receive_until(MBX *mbx, void *msg, int msg_size, RTIME time);
 
 extern int rt_mbx_receive_timed(MBX *mbx, void *msg, int msg_size, RTIME delay);
+
+#endif
 
 #endif
diff -ur rtai-0.7/linux-2.2.12/copyto rtai-0.7.1/linux-2.2.12/copyto
--- rtai-0.7/linux-2.2.12/copyto        Mon Sep 13 12:57:47 1999
+++ rtai-0.7.1/linux-2.2.12/copyto      Sun Nov  7 18:40:04 1999
@@ -1,5 +1,5 @@
 #!/bin/bash
-LINUXDIR=/usr/src/linux-2.2.12
+LINUXDIR=/usr/src/linux
 
 cp $LINUXDIR/arch/i386/kernel/irq.c        $LINUXDIR/arch/i386/kernel/irq.c.old
 cp $LINUXDIR/arch/i386/kernel/time.c        $LINUXDIR/arch/i386/kernel/time.c.old
diff -ur rtai-0.7/rtai.c rtai-0.7.1/rtai.c
--- rtai-0.7/rtai.c     Tue Oct  5 19:55:39 1999
+++ rtai-0.7.1/rtai.c   Mon Nov  8 18:06:30 1999
@@ -36,6 +36,7 @@
 #include <asm/bitops.h>
 #include <asm/atomic.h>
 #include <asm/desc.h>
+//#include <asm/msr.h>
 
 #include "include/rtai.h"
 #include "include/rtai_srq.h"
@@ -59,7 +60,7 @@
 #define SAVE_REG(irq) __asm__ __volatile__ (" \
        pushl $"#irq"; pushl %es; pushl %ds; pushl %eax;\n\t \
        pushl %ebp; pushl %ecx; pushl %edx;\n\t \
-       movl $" STR(__KERNEL_DS) ",%edx; movl %dx,%ds; movl %dx,%es")
+       movl $" STR(__KERNEL_DS) ",%edx; movl %edx,%ds; movl %edx,%es")
 
 #define RSTR_REG __asm__ __volatile__ (" \
        popl %edx; popl %ecx; testl %eax,%eax; jnz 1f;\n\t \
@@ -87,13 +88,15 @@
        RSTR_REG; \
 }
 
+unsigned long cpu_freq;
+
 static void srqisr(void)
 {
        __asm__ __volatile__ (" \
        cld; pushl %es; pushl %ds; pushl %ebp;\n\t \
        pushl %edi; pushl %esi; pushl %ecx;\n\t \
        pushl %ebx; pushl %edx; pushl %eax;\n\t \
-       movl $" STR(__KERNEL_DS) ",%ebx; movl %bx,%ds; movl %bx,%es");
+       movl $" STR(__KERNEL_DS) ",%ebx; movl %ebx,%ds; movl %ebx,%es");
 
        __asm__ __volatile__ ("call "SYMBOL_NAME_STR(dispatch_srq));
 
@@ -1179,10 +1182,10 @@
                        cpu_own_irq[HARD_LOCK_IPI].handler = hard_lock_all_handler;
                        hard_sti();
                }
-               printk("\n***** RTAI NEWLY MOUNTED (MOUNT COUNT %d) ******\n\n", 
rtai_mounted);
-       } else {
-               printk("\n***** RTAI ALREADY MOUNTED (MOUNT COUNT %d) ******\n\n", 
rtai_mounted);
-       }
+//             printk("\n***** RTAI NEWLY MOUNTED (MOUNT COUNT %d) ******\n\n", 
+rtai_mounted);
+       } //else {
+//             printk("\n***** RTAI ALREADY MOUNTED (MOUNT COUNT %d) ******\n\n", 
+rtai_mounted);
+//     }
        rt_spin_unlock(&rtai_mount_lock);
 }
 
@@ -1210,13 +1213,30 @@
                cpu_own_irq[HARD_LOCK_IPI].handler = 0;
                cpu_own_irq[INVALIDATE_IPI].handler = 0;
                hard_unlock_all(flags);
-               printk("\n***** RTAI UNMOUNTED (MOUNT COUNT %d) ******\n\n", 
rtai_mounted);
-       } else {
-               printk("\n***** RTAI CANNOT BE UMOUNTED (MOUNT COUNT %d) ******\n\n", 
rtai_mounted);
-       }
+//             printk("\n***** RTAI UNMOUNTED (MOUNT COUNT %d) ******\n\n", 
+rtai_mounted);
+       }// else {
+//             printk("\n***** RTAI CANNOT BE UMOUNTED (MOUNT COUNT %d) ******\n\n", 
+rtai_mounted);
+//     }
        rt_spin_unlock(&rtai_mount_lock);
 }
 
+void calibrate_cpu_freq(void);
+
+void calibrate_cpu_freq()
+{
+ unsigned int t1, t2, t3;
+ unsigned long flags;
+ printk("\n***** Calibrating CPU frequency ... ");
+ save_flags(flags);
+ cli();
+ rdtscl(t1);
+ __udelay(1000);
+ rdtscl(t2);
+ rdtscl(t3);
+ restore_flags(flags);
+ cpu_freq = (t2-t1) - (t3-t2);
+ printk("%ld Hz *****\n", cpu_freq);
+}
 
 /* module init-cleanup */
 
@@ -1287,6 +1307,7 @@
 // Uncomment the line below if you want to check that Linux works well when it
 // is intercepted.
 //     rt_mount_rtai();
+  calibrate_cpu_freq();
        return 0;
 }
 
@@ -1516,6 +1537,7 @@
        hard_unlock_all(flags);
 }
 
+
 int calibrate_8254(void)
 {
        unsigned long flags, i;
@@ -1529,6 +1551,6 @@
        }
        i = rdtsc() - t;
        hard_unlock_all(flags);
-       return imuldiv(i, 100000, CPU_FREQ);
+       return imuldiv(i, 100000, cpu_freq);
 }
 /********** END OF SOME TIMER FUNCTIONS TO BE LIKELY PUT ELSWHERE ***********/
diff -ur rtai-0.7/shmem/rtai_shm.c rtai-0.7.1/shmem/rtai_shm.c
--- rtai-0.7/shmem/rtai_shm.c   Mon Sep 13 12:57:47 1999
+++ rtai-0.7.1/shmem/rtai_shm.c Sun Nov  7 19:55:19 1999
@@ -49,7 +49,7 @@
        cld; pushl %es; pushl %ds; pushl %ebp;\n\t \
        pushl %edi; pushl %esi; pushl %ecx;\n\t \
        pushl %ebx; pushl %edx; pushl %eax;\n\t \
-       movl $" STR(__KERNEL_DS) ",%ebx; movl %bx,%ds; movl %bx,%es");
+       movl $" STR(__KERNEL_DS) ",%ebx; movl %ebx,%ds; movl %ebx,%es");
 
        __asm__ __volatile__ ("call "SYMBOL_NAME_STR(shm_handler));
 
diff -ur rtai-0.7/smpscheduler/rtai_sched.c rtai-0.7.1/smpscheduler/rtai_sched.c
--- rtai-0.7/smpscheduler/rtai_sched.c  Mon Sep 27 18:37:25 1999
+++ rtai-0.7.1/smpscheduler/rtai_sched.c        Mon Nov  8 01:59:51 1999
@@ -78,7 +78,7 @@
 #define TIMER_CHIP "8254"
 #define TIMER_FREQ FREQ_8254
 #define TIMER_LATENCY LATENCY_8254
-#define TIMER_SETUP_TIME SETUP_TIME_8254
+//#define TIMER_SETUP_TIME SETUP_TIME_8254
 #define set_timer_cpu(cpu_map) 
 #define is_timer_cpu()
 #define set_timer_chip(delay) \
@@ -690,14 +690,16 @@
 const int LinuxFpu = LINUX_FPU;
 MODULE_PARM(LinuxFpu, "i");
 
-const int CpuFreq = CPU_FREQ;
-MODULE_PARM(CpuFreq, "i");
-
 const int Latency = TIMER_LATENCY;
 MODULE_PARM(Latency, "i");
 
+#ifdef __USE_APIC__
 const int SetupTimeTIMER = TIMER_SETUP_TIME;
 MODULE_PARM(SetupTimeTIMER, "i");
+#else
+extern int calibrate_8254(void);
+int SetupTimeTIMER;
+#endif
 
 int init_module(void)
 {
@@ -717,9 +719,12 @@
                fpu_smp_task[cpuid] = &rt_linux_task;
        }
        set_timer_cpu(cpu_present_map);
-       tuned.cpu_freq = CpuFreq;
-       tuned.latency = imuldiv(Latency, CpuFreq, 1E9);
-       tuned.setup_time_TIMER_CPUNIT = imuldiv(SetupTimeTIMER, CpuFreq, 1E9);
+       tuned.cpu_freq = cpu_freq;
+       tuned.latency = imuldiv(Latency, cpu_freq, 1E9);
+#ifndef __USE_APIC__
+  SetupTimeTIMER = calibrate_8254();
+#endif
+       tuned.setup_time_TIMER_CPUNIT = imuldiv(SetupTimeTIMER, cpu_freq, 1E9);
        tuned.setup_time_TIMER_UNIT = imuldiv(SetupTimeTIMER, TIMER_FREQ, 1E9);
        oneshot_timer = OneShot != 0 ? 1 : 0;
        preempt_always = 0;
diff -ur rtai-0.7/upscheduler/rtai_sched.c rtai-0.7.1/upscheduler/rtai_sched.c
--- rtai-0.7/upscheduler/rtai_sched.c   Mon Sep 27 19:25:05 1999
+++ rtai-0.7.1/upscheduler/rtai_sched.c Mon Nov  8 15:59:37 1999
@@ -18,7 +18,7 @@
 
 
 #define LINUX_FPU 0
-#define ONE_SHOT 0
+#define ONE_SHOT 1
 
 /* if PRIORDs below are not defined msg and sem queues are FIFOs otherwise   */
 /* insertion is in priority order and receiving tasks have their priority    */
@@ -86,8 +86,7 @@
        popl %%ebp\n\t \
        popl %%eax\n\t" \
        : /* no output */ \
-       : "c" (tsk) \
-       :"cx");
+       : "c" (tsk));
 
 static RT_TASK *rt_current;
 
@@ -416,7 +415,7 @@
 
        hard_save_flags_and_cli(flags);
        if (oneshot_timer) {
-#if CPU_FREQ == FREQ_8254
+#ifdef RT_FOR_486
                rt_setup_8254_tsc();
 #endif
                rt_request_timer(rt_timer_handler, 0, 0);
@@ -490,14 +489,13 @@
 const int LinuxFpu = LINUX_FPU;
 MODULE_PARM(LinuxFpu, "i");
 
-const int CpuFreq = CPU_FREQ;
-MODULE_PARM(CpuFreq, "i");
-
 const int Latency = LATENCY_8254;
 MODULE_PARM(Latency, "i");
 
-const int SetupTimeTIMER = SETUP_TIME_8254;
-MODULE_PARM(SetupTimeTIMER, "i");
+int SetupTimeTIMER;
+
+extern unsigned long cpu_freq;
+extern int calibrate_8254(void);
 
 int init_module(void)
 {
@@ -510,9 +508,10 @@
        rt_linux_task.next = 0;
        rt_current = &rt_linux_task;
        fpu_task = &rt_linux_task;
-       tuned.cpu_freq = CpuFreq;
-       tuned.latency = imuldiv(Latency, CpuFreq, 1E9);
-       tuned.setup_time_TIMER_CPUNIT = imuldiv(SetupTimeTIMER, CpuFreq, 1E9);
+       tuned.cpu_freq = cpu_freq;
+       tuned.latency = imuldiv(Latency, cpu_freq, 1E9);
+       SetupTimeTIMER = calibrate_8254();
+       tuned.setup_time_TIMER_CPUNIT = imuldiv(SetupTimeTIMER, cpu_freq, 1E9);
        tuned.setup_time_TIMER_UNIT = imuldiv(SetupTimeTIMER, TIMER_FREQ, 1E9);
        oneshot_timer = OneShot != 0 ? 1 : 0;
        preempt_always = 0;

Reply via email to