egcs kontra gcc

Petr Cech cech na atrey.karlin.mff.cuni.cz
Středa Srpen 5 12:27:06 CEST 1998


Petr Snajdr napsal:
> 
> On Wed, 5 Aug 1998, Martin Mares wrote:
> 
> >    egcs generuje o neco kvalitnejsi kod nez gcc 2.8.X, rovnez ma lepsi podporu
> > nekterych featur C++ (templaty, exceptiony).
> 
> Docela by zajimala moznost predkladat egcs jadro. Jaky je aktualni stav?
No, mne to de. Ale je treba aplikovat patch na apm. Jde o zmenu zapisu
asembleru. Toto je trochu opraveny patch. Autor sam chvilku po odeslani
korigoval typo. Bez tohoto patche mi to tuhlo nekdo okolo detekce HDD.

-- Begin forward --

Date: 	Wed, 13 May 1998 06:00:00 +0200 (MET DST)
From: "Michael L. Galbraith" <mikeg na weiden.de>
To: linux-kernel <linux-kernel na vger.rutgers.edu>
Subject: apm_bios.c + egcs .. asm constraints fix

Hi all,

I sent the following to a brave person who was having problems
with apm bios when compiled with newer egcs compilers.  He tells
me that it fixed the problem.

The goal was to give the compiler the same info in a different way.
Someone with more assembler savy should probably take a look.

	-Mike

--- ./drivers/char/apm_bios.c.org	Sun May 10 18:02:44 1998
+++ ./drivers/char/apm_bios.c	Wed May 13 05:34:05 1998
@@ -254,74 +254,92 @@
 		"setc %%" # error_reg "\n\t" \
 		"popfl\n\t" \
 		APM_DO_RESTORE_SEGS
-#define APM_BIOS_CALL_END \
-		: "ax", "bx", "cx", "dx", "si", "di", "bp", "memory")
 
 #ifdef CONFIG_APM_CPU_IDLE
 #define APM_SET_CPU_IDLE(error) \
+do{ \
 	APM_BIOS_CALL(al) \
-	: "=a" (error) \
-	: "a" (0x5305) \
-	APM_BIOS_CALL_END
+	: "=&a" (error) \
+	: "0" (0x5305) \
+	: "bx", "cx", "dx", "si", "di", "bp", "memory"); \
+}while(0)
 #endif
 
 #define APM_SET_CPU_BUSY(error) \
+do{ \
 	APM_BIOS_CALL(al) \
-	: "=a" (error) \
-	: "a" (0x5306) \
-	APM_BIOS_CALL_END
+	: "=&a" (error) \
+	: "0" (0x5306) \
+	: "bx", "cx", "dx", "si", "di", "bp", "memory"); \
+}while(0)
 
 #define APM_SET_POWER_STATE(state, error) \
+do{ int dead1,dead2;\
 	APM_BIOS_CALL(al) \
-	: "=a" (error) \
-	: "a" (0x5307), "b" (0x0001), "c" (state) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (dead1), "=&c" (dead2) \
+	: "0" (0x5307), "1" (0x0001), "2" (state) \
+	: "dx", "si", "di", "bp", "memory"); \
+}while(0)
 
 #ifdef CONFIG_APM_DISPLAY_BLANK
 #define APM_SET_DISPLAY_POWER_STATE(state, error) \
+do{ int dead1,dead2;\
 	APM_BIOS_CALL(al) \
-	: "=a" (error) \
-	: "a" (0x5307), "b" (0x01ff), "c" (state) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (dead1), "=&c" (dead2) \
+	: "0" (0x5307), "1" (0x01ff), "2" (state) \
+	: "dx", "si", "di", "bp", "memory"); \
+}while(0)
 #endif
 
 #ifdef CONFIG_APM_DO_ENABLE
 #define APM_ENABLE_POWER_MANAGEMENT(device, error) \
+do{ int dead1,dead2;\
 	APM_BIOS_CALL(al) \
-	: "=a" (error) \
-	: "a" (0x5308), "b" (device), "c" (1) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (dead1), "=&c" (dead2) \
+	: "0" (0x5308), "1" (device), "2" (1) \
+	: "dx", "si", "di", "bp", "memory"); \
+}while(0)
 #endif
 
 #define APM_GET_POWER_STATUS(bx, cx, dx, error) \
+do{ \
 	APM_BIOS_CALL(al) \
-	: "=a" (error), "=b" (bx), "=c" (cx), "=d" (dx) \
-	: "a" (0x530a), "b" (1) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (bx), "=&c" (cx), "=&d" (dx) \
+	: "0" (0x530a), "1" (1) \
+	: "si", "di", "bp", "memory"); \
+}while(0)
 
 #define APM_GET_BATTERY_STATUS(which, bx, cx, dx, si, error) \
+do{ \
 	APM_BIOS_CALL(al) \
-	: "=a" (error), "=b" (bx), "=c" (cx), "=d" (dx), "=S" (si) \
-	: "a" (0x530a), "b" (0x8000 | (which)) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (bx), "=&c" (cx), "=&d" (dx), "=&S" (si) \
+	: "0" (0x530a), "1" (0x8000 | (which)) \
+	: "di", "bp", "memory"); \
+}while(0)
 
 #define APM_GET_EVENT(event, info, error)	\
+do{ \
 	APM_BIOS_CALL(al) \
-	: "=a" (error), "=b" (event), "=c" (info) \
-	: "a" (0x530b) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (event), "=&c" (info) \
+	: "0" (0x530b) \
+	: "dx", "di", "bp", "memory"); \
+}while(0)
 
 #define APM_DRIVER_VERSION(ver, ax, error) \
+do{ int dead1;\
 	APM_BIOS_CALL(bl) \
-	: "=a" (ax), "=b" (error) \
-	: "a" (0x530e), "b" (0), "c" (ver) \
-	APM_BIOS_CALL_END
+	: "=&a" (ax), "=&b" (error), "=&c" (dead1) \
+	: "0" (0x530e), "1" (0), "2" (ver) \
+	: "dx", "di", "bp", "memory"); \
+}while(0)
 
 #define APM_ENGAGE_POWER_MANAGEMENT(device, error) \
+do{ int dead1,dead2;\
 	APM_BIOS_CALL(al) \
-	: "=a" (error) \
-	: "a" (0x530f), "b" (device), "c" (1) \
-	APM_BIOS_CALL_END
+	: "=&a" (error), "=&b" (dead1), "=&c" (dead2) \
+	: "0" (0x530f), "1" (device), "2" (1) \
+	: "dx", "di", "bp", "memory"); \
+}while(0)
 
 /*
  * Forward declarations

----- End forwarded message -----
				Petr Cech 
--
 /    mailto: cech na atrey.karlin.mff.cuni.cz    \
|   PGP: finger cech na atrey.karlin.mff.cuni.cz	|
 \      C75B671E75117038  43BE6B9AC09C3318     /


Další informace o konferenci Linux