Index: Contrib/System/Source/System.c =================================================================== RCS file: /cvsroot/nsis/NSIS/Contrib/System/Source/System.c,v retrieving revision 1.12 diff -u -r1.12 System.c --- Contrib/System/Source/System.c 13 Jan 2006 14:31:28 -0000 1.12 +++ Contrib/System/Source/System.c 18 Jan 2006 05:34:56 -0000 @@ -1,11 +1,20 @@ // System.cpp : Defines the entry point for the DLL application. // +// FIXME: +// - port __LOCAL_SIZE and _alloca_probe to gcc +// - Input/output registers + +#define stringize2(x) "$"#x +#define stringize(x) stringize2(x) + #include "stdafx.h" #include "Plugin.h" #include "Buffers.h" #include "System.h" -#include +#ifdef INTEL +//#include +#endif #include // Parse Section Type @@ -51,7 +60,11 @@ #ifdef SYSTEM_LOG_DEBUG // System log debuggin turned on -#define SYSTEM_EVENT(a) { _asm { mov logespsave, esp }; LogEvent(a); } +#ifdef INTEL +#define SYSTEM_EVENT(a) { asm { mov logespsave, esp }; LogEvent(a); } +#else +#define SYSTEM_EVENT(a) { asm ("movl %esp, _logespsave\n" ); LogEvent(a); } +#endif #define SYSTEM_LOG_ADD(a) { lstrcat(syslogbuf, a); } #define SYSTEM_LOG_POST { lstrcat(syslogbuf, "\n"); WriteToLog(syslogbuf); *syslogbuf = 0; } @@ -868,11 +881,20 @@ void _alloca_probe(); -SystemProc __declspec(naked) *CallProc(SystemProc *proc) +#ifdef INTEL +#define NAKED __declspec(naked) +#else +// GCC doesn't support this on i386 +// #define NAKED __attribute__((naked)) +#define NAKED __attribute__((cdecl)) +#endif + +SystemProc NAKED *CallProc(SystemProc *proc) { int z3; - _asm +#ifdef INTEL + asm { // Save stack push ebp @@ -884,34 +906,71 @@ push edi push esi } +#else + asm ( + // Save stack + "pushl %ebp\n" + "movl %esp, %ebp\n" + // Stack space for local variables + // FIXME + //"subl __LOCAL_SIZE, %esp\n" + // Save all usable registers to free our hands + "pushl %ebx\n" + "pushl %edi\n" + "pushl %esi\n" + ); +#endif SYSTEM_LOG_ADD("\t\tCall:\n"); SYSTEM_EVENT("\t\t\tBefore call ") if (CallbackIndex && (!(proc->Options & POPT_GENSTACK))) { - _asm +#ifdef INTEL + asm { push ebp // Save previous stack location mov LastStackReal, esp } - +#else + asm ( + "pushl %ebp\n" + // Save previous stack location + "movl %esp, _LastStackReal\n" + ); +#endif if (LastStackPlace == 0) { - _asm +#ifdef INTEL + asm { // Create new stack mov eax, NEW_STACK_SIZE call _alloca_probe mov LastStackPlace, esp } +#else + asm ( + // Create new stack + "movl "stringize(NEW_STACK_SIZE)", %eax\n" + "call _alloca_probe\n" + "movl %esp, _LastStackPlace\n" + ); + #endif } else - _asm +#ifdef INTEL + asm { // Move stack pointer mov esp, LastStackPlace } +#else + asm ( + // Move stack pointer + "movl _LastStackPlace, %esp\n" + ); +#endif } // Push arguments to stack @@ -921,11 +980,19 @@ if (proc->Params[z1].Size == 2) { z2 = proc->Params[z1]._value; - _asm push z2; +#ifdef INTEL + asm push z2; +#else + asm ( "pushl _z2"); +#endif } // Default z2 = proc->Params[z1].Value; - _asm push z2; +#ifdef INTEL + asm push z2; +#else + asm ( "pushl _z2" ); +#endif } // Call the proc and save return @@ -933,17 +1000,25 @@ // Save proc proc->Clone = (SystemProc *) LastProc; - _asm +#ifdef INTEL + asm { mov eax, proc mov LastProc, eax } +#else + asm ( + "movl $proc, %eax\n" + "movl %eax, _LastProc\n" + ); +#endif //LastProc = proc; SYSTEM_EVENT("\n\t\t\tNear call ") SYSTEM_LOG_POST; - _asm +#ifdef INTEL + asm { // Call call z1 @@ -951,6 +1026,15 @@ mov z1, eax mov z2, edx } +#else + asm ( + // Call + "call _z1\n" + // Return + "movl %eax, _z1\n" + "movl %edx, _z2\n" + ); +#endif SYSTEM_LOG_ADD("Back from "); SYSTEM_LOG_ADD(LastProc->ProcName); @@ -958,21 +1042,37 @@ if ((CallbackIndex) && (!(LastProc->Options & POPT_GENSTACK))) { - _asm +#ifdef INTEL + asm { // Restore real stack location mov LastStackPlace, esp mov esp, LastStackReal pop ebp } +#else + asm ( + // Restore real stack location + "movl %esp, _LastStackPlace\n" + "movl _LastStackReal, %esp\n" + "popl %ebp\n" + ); +#endif } // Restore proc - _asm +#ifdef INTEL + asm { mov eax, LastProc mov proc, eax } +#else + asm ( + "movl _LastProc, %eax\n" + "movl %eax, proc\n" + ); +#endif // proc = LastProc; LastProc = proc->Clone; @@ -990,8 +1090,13 @@ for (z3 = 1; z3 <= proc->ParamCount; z3++) { if (proc->Params[z3].Size == 2) - _asm pop edx; - _asm pop edx; +#ifdef INTEL + asm pop edx; + asm pop edx; +#else + asm ("popl %edx"); + asm ("popl %edx"); +#endif } } } @@ -1022,7 +1127,8 @@ #endif SYSTEM_LOG_POST; - _asm +#ifdef INTEL + asm { // Return mov eax, proc @@ -1036,13 +1142,29 @@ // Return ret } +#else + asm ( + // Return + "movl $proc, %eax\n" + // Restore registers + "popl %esi\n" + "popl %edi\n" + "popl %ebx\n" + // Restore stack pointer + "movl %ebp, %esp\n" + "popl %ebp\n" + // Return + "ret\n" + ); +#endif } SystemProc __declspec(naked) *RealCallBack() { SystemProc *proc; - - _asm + +#ifdef INTEL + asm { // Save stack push ebp @@ -1057,10 +1179,32 @@ // Arguments pointer mov z2, esp // 1-st arg - 4*4 (pushes) - 4 (return) - __LOCAL_SIZE add z2, __LOCAL_SIZE - add z2, 5*4 + add z2, 20 // Our callback proc mov proc, eax } +#else + asm ( + // Save stack + "pushl %ebp\n" + "movl %esp, %ebp\n" + // Stack space for local variables + // FIXME + //"subl __LOCAL_SIZE, %esp\n" + // Save all usable registers to free our hands + "pushl %ebx\n" + "pushl %edi\n" + "pushl %esi\n" + + // Arguments pointer + "movl %esp, _z2\n" // 1-st arg - 4*4 (pushes) - 4 (return) - __LOCAL_SIZE + // FIXME + //"add __LOCAL_SIZE, _z2\n" + "addl $20, _z2\n" + // Our callback proc + "movl %eax, proc\n" + ); +#endif SYSTEM_LOG_ADD("Called callback from "); SYSTEM_LOG_ADD(LastProc->ProcName); @@ -1090,7 +1234,8 @@ } proc->ProcResult = PR_CALLBACK; - _asm +#ifdef INTEL + asm { // Return mov eax, proc @@ -1104,8 +1249,24 @@ pop ebp // pop LastStackReal } +#else + asm ( + // Return + "movl $proc, %eax\n" + + // Save temporary stack info + "pushl %ebp\n" +// push LastStackPlace + "movl %esp, _LastStackPlace\n" + // Restore real stack + "movl _LastStackReal, %esp\n" + "popl %ebp\n" +// pop LastStackReal + ); +#endif - _asm +#ifdef INTEL + asm { // Fake return from System::Call @@ -1119,12 +1280,28 @@ // Return ret } +#else + asm ( + // Fake return from System::Call + + // Restore registers + "popl %esi\n" + "popl %edi\n" + "popl %ebx\n" + // Restore stack pointer + "movl %ebp, %esp\n" + "popl %ebp\n" + // Return + "ret\n" + ); +#endif } -SystemProc __declspec(naked) *CallBack(SystemProc *proc) +SystemProc NAKED *CallBack(SystemProc *proc) { - _asm +#ifdef INTEL + asm { // Save stack push ebp @@ -1136,6 +1313,20 @@ push edi push esi } +#else + asm ( + // Save stack + "pushl %ebp\n" + "movl %esp, %ebp\n" + // Stack space for local variables + // FIXME + //"subl __LOCAL_SIZE, %esp\n" + // Save all usable registers to free our hands + "pushl %ebx\n" + "pushl %edi\n" + "pushl %esi\n" + ); +#endif // MessageBox(NULL, "cool1", "Cool", MB_OK); @@ -1146,13 +1337,22 @@ //z1 = proc->Params[0].Value; //z2 = proc->Params[0]._value; //z1 = &(proc->Params[0].Value); - _asm +#ifdef INTEL + asm { mov eax, proc add eax, SYSTEM_ZERO_PARAM_VALUE_OFFSET push [eax] push [eax+4] } +#else + asm ( + "movl $proc, %eax\n" + "addl "stringize(SYSTEM_ZERO_PARAM_VALUE_OFFSET)", %eax\n" + "pushl (%eax)\n" + "pushl 4(%eax)\n" + ); +#endif // Adjust return statement if ((proc->Options & POPT_CDECL) == 0) retexpr[1] = proc->ArgsSize; @@ -1166,7 +1366,8 @@ // MessageBox(NULL, "cool2", "Cool", MB_OK); - _asm +#ifdef INTEL + asm { // Prepare return // callback proc result @@ -1185,25 +1386,61 @@ // pop LastStackPlace pop ebp } +#else + asm ( + // Prepare return + // callback proc result + "popl %edx\n" + "popl %eax\n" + + // Restore temporary stack and return + + // Save real stack info + // Save previous stack location +// push LastStackReal + "pushl %ebp\n" + "movl %esp, _LastStackReal\n" + // Move stack pointer + "movl _LastStackPlace, %esp\n" +// pop LastStackPlace + "popl %ebp\n" + ); +#endif #ifdef SYSTEM_LOG_DEBUG - _asm +#ifdef INTEL + asm { push eax push edx } +#else + asm ( + "pushl %eax\n" + "pushl %edx\n" + ); +#endif SYSTEM_EVENT("\n\t\t\tSh-Before call-back"); SYSTEM_LOG_POST; - _asm +#ifdef INTEL + asm { // callback proc result pop edx pop eax } +#else + asm ( + // callback proc result + "popl %edx\n" + "popl %eax\n" + ); +#endif #endif // Fake return from Callback - _asm { +#ifdef INTEL + asm { // Restore registers pop esi pop edi @@ -1214,6 +1451,19 @@ // Return jmp retaddr } +#else + asm ( + // Restore registers + "popl %esi\n" + "popl %edi\n" + "popl %ebx\n" + // Restore stack pointer + "movl %ebp, %esp\n" + "popl %ebp\n" + // Return + "jmp _retaddr\n" + ); +#endif } HANDLE CreateCallback(SystemProc *cbproc)