/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ // // // A per function stub should look like this (N is the number of incoming arguments) // // functionStub: // push $function // jmp sysInvokeNative##N // // WARNING 1 -- the sysInvokeNative method must be defined with 'static' identifiers, otherwise // MSDev will fill the sysInvokeNativeStubs table with pointers to a jump vector, rather than // pointers to the real thing. // // WARNING 2 -- a check in x86Win32ExceptionHandler.cpp makes the following assumption // For sysInvokeNativeN() where 0 <= N < 6 // the address to return after the call is methodStart + 9 + 5N // For sysInvokeNative(N) where 6 <= N < 256 // the address to return after the call is methodStart + 23 // // If the sysInvokeNative methods change, the exception handler's check must also be changed // #if defined(WIN32) #include "Fundamentals.h" #define sysInvokeNative(N) \ static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative##N() \ { \ __asm { \ __asm pop eax /* pop the function adress */ \ \ __asm push ebp /************************************/ \ __asm mov ebp,esp /* */ \ __asm push edi /* PROLOG */ \ __asm push esi /* */ \ __asm push ebx /************************************/ \ \ __asm mov edx,N /* %edx = nArgs */ \ __asm loopHeader: \ __asm lea ecx,[esp+16+4*N] /* %ecx = %esp + 16 + 4 * nArgs */ \ __asm push [ecx] /* push original argument */ \ __asm dec edx /* nArgs -= 1 */ \ __asm jne loopHeader /* loop over */ \ __asm call eax /* call the native function */ \ \ __asm mov esp,ebp /********************************** */ \ __asm pop ebp /* EPILOG */ \ __asm ret (4*N) /************************************/ \ } \ } static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative0() { __asm { pop eax push ebp mov ebp,esp push edi push esi push ebx call eax mov esp,ebp pop ebp ret } } static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative1() { __asm { pop eax push ebp mov ebp,esp push edi push esi push ebx mov ecx,[esp+20] push ecx call eax mov esp,ebp pop ebp ret 4 } } static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative2() { __asm { pop eax push ebp mov ebp,esp push edi push esi push ebx mov ecx,[esp+24] push ecx mov ecx,[esp+24] push ecx call eax mov esp,ebp pop ebp ret 8 } } static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative3() { __asm { pop eax push ebp mov ebp,esp push edi push esi push ebx mov ecx,[esp+28] push ecx mov ecx,[esp+28] push ecx mov ecx,[esp+28] push ecx call eax mov esp,ebp pop ebp ret 12 } } static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative4() { __asm { pop eax push ebp mov ebp,esp push edi push esi push ebx mov ecx,[esp+32] push ecx mov ecx,[esp+32] push ecx mov ecx,[esp+32] push ecx mov ecx,[esp+32] push ecx call eax mov esp,ebp pop ebp ret 16 } } static __declspec(naked) NS_NATIVECALL(void) sysInvokeNative5() { __asm { pop eax push ebp mov ebp,esp push edi push esi push ebx mov ecx,[esp+36] push ecx mov ecx,[esp+36] push ecx mov ecx,[esp+36] push ecx mov ecx,[esp+36] push ecx mov ecx,[esp+36] push ecx call eax mov esp,ebp pop ebp ret 20 } } sysInvokeNative(6) sysInvokeNative(7) sysInvokeNative(8) sysInvokeNative(9) sysInvokeNative(10) sysInvokeNative(11) sysInvokeNative(12) sysInvokeNative(13) sysInvokeNative(14) sysInvokeNative(15) sysInvokeNative(16) sysInvokeNative(17) sysInvokeNative(18) sysInvokeNative(19) sysInvokeNative(20) sysInvokeNative(21) sysInvokeNative(22) sysInvokeNative(23) sysInvokeNative(24) sysInvokeNative(25) sysInvokeNative(26) sysInvokeNative(27) sysInvokeNative(28) sysInvokeNative(29) sysInvokeNative(30) sysInvokeNative(31) sysInvokeNative(32) sysInvokeNative(33) sysInvokeNative(34) sysInvokeNative(35) sysInvokeNative(36) sysInvokeNative(37) sysInvokeNative(38) sysInvokeNative(39) sysInvokeNative(40) sysInvokeNative(41) sysInvokeNative(42) sysInvokeNative(43) sysInvokeNative(44) sysInvokeNative(45) sysInvokeNative(46) sysInvokeNative(47) sysInvokeNative(48) sysInvokeNative(49) sysInvokeNative(50) sysInvokeNative(51) sysInvokeNative(52) sysInvokeNative(53) sysInvokeNative(54) sysInvokeNative(55) sysInvokeNative(56) sysInvokeNative(57) sysInvokeNative(58) sysInvokeNative(59) sysInvokeNative(60) sysInvokeNative(61) sysInvokeNative(62) sysInvokeNative(63) sysInvokeNative(64) sysInvokeNative(65) sysInvokeNative(66) sysInvokeNative(67) sysInvokeNative(68) sysInvokeNative(69) sysInvokeNative(70) sysInvokeNative(71) sysInvokeNative(72) sysInvokeNative(73) sysInvokeNative(74) sysInvokeNative(75) sysInvokeNative(76) sysInvokeNative(77) sysInvokeNative(78) sysInvokeNative(79) sysInvokeNative(80) sysInvokeNative(81) sysInvokeNative(82) sysInvokeNative(83) sysInvokeNative(84) sysInvokeNative(85) sysInvokeNative(86) sysInvokeNative(87) sysInvokeNative(88) sysInvokeNative(89) sysInvokeNative(90) sysInvokeNative(91) sysInvokeNative(92) sysInvokeNative(93) sysInvokeNative(94) sysInvokeNative(95) sysInvokeNative(96) sysInvokeNative(97) sysInvokeNative(98) sysInvokeNative(99) sysInvokeNative(100) sysInvokeNative(101) sysInvokeNative(102) sysInvokeNative(103) sysInvokeNative(104) sysInvokeNative(105) sysInvokeNative(106) sysInvokeNative(107) sysInvokeNative(108) sysInvokeNative(109) sysInvokeNative(110) sysInvokeNative(111) sysInvokeNative(112) sysInvokeNative(113) sysInvokeNative(114) sysInvokeNative(115) sysInvokeNative(116) sysInvokeNative(117) sysInvokeNative(118) sysInvokeNative(119) sysInvokeNative(120) sysInvokeNative(121) sysInvokeNative(122) sysInvokeNative(123) sysInvokeNative(124) sysInvokeNative(125) sysInvokeNative(126) sysInvokeNative(127) sysInvokeNative(128) sysInvokeNative(129) sysInvokeNative(130) sysInvokeNative(131) sysInvokeNative(132) sysInvokeNative(133) sysInvokeNative(134) sysInvokeNative(135) sysInvokeNative(136) sysInvokeNative(137) sysInvokeNative(138) sysInvokeNative(139) sysInvokeNative(140) sysInvokeNative(141) sysInvokeNative(142) sysInvokeNative(143) sysInvokeNative(144) sysInvokeNative(145) sysInvokeNative(146) sysInvokeNative(147) sysInvokeNative(148) sysInvokeNative(149) sysInvokeNative(150) sysInvokeNative(151) sysInvokeNative(152) sysInvokeNative(153) sysInvokeNative(154) sysInvokeNative(155) sysInvokeNative(156) sysInvokeNative(157) sysInvokeNative(158) sysInvokeNative(159) sysInvokeNative(160) sysInvokeNative(161) sysInvokeNative(162) sysInvokeNative(163) sysInvokeNative(164) sysInvokeNative(165) sysInvokeNative(166) sysInvokeNative(167) sysInvokeNative(168) sysInvokeNative(169) sysInvokeNative(170) sysInvokeNative(171) sysInvokeNative(172) sysInvokeNative(173) sysInvokeNative(174) sysInvokeNative(175) sysInvokeNative(176) sysInvokeNative(177) sysInvokeNative(178) sysInvokeNative(179) sysInvokeNative(180) sysInvokeNative(181) sysInvokeNative(182) sysInvokeNative(183) sysInvokeNative(184) sysInvokeNative(185) sysInvokeNative(186) sysInvokeNative(187) sysInvokeNative(188) sysInvokeNative(189) sysInvokeNative(190) sysInvokeNative(191) sysInvokeNative(192) sysInvokeNative(193) sysInvokeNative(194) sysInvokeNative(195) sysInvokeNative(196) sysInvokeNative(197) sysInvokeNative(198) sysInvokeNative(199) sysInvokeNative(200) sysInvokeNative(201) sysInvokeNative(202) sysInvokeNative(203) sysInvokeNative(204) sysInvokeNative(205) sysInvokeNative(206) sysInvokeNative(207) sysInvokeNative(208) sysInvokeNative(209) sysInvokeNative(210) sysInvokeNative(211) sysInvokeNative(212) sysInvokeNative(213) sysInvokeNative(214) sysInvokeNative(215) sysInvokeNative(216) sysInvokeNative(217) sysInvokeNative(218) sysInvokeNative(219) sysInvokeNative(220) sysInvokeNative(221) sysInvokeNative(222) sysInvokeNative(223) sysInvokeNative(224) sysInvokeNative(225) sysInvokeNative(226) sysInvokeNative(227) sysInvokeNative(228) sysInvokeNative(229) sysInvokeNative(230) sysInvokeNative(231) sysInvokeNative(232) sysInvokeNative(233) sysInvokeNative(234) sysInvokeNative(235) sysInvokeNative(236) sysInvokeNative(237) sysInvokeNative(238) sysInvokeNative(239) sysInvokeNative(240) sysInvokeNative(241) sysInvokeNative(242) sysInvokeNative(243) sysInvokeNative(244) sysInvokeNative(245) sysInvokeNative(246) sysInvokeNative(247) sysInvokeNative(248) sysInvokeNative(249) sysInvokeNative(250) sysInvokeNative(251) sysInvokeNative(252) sysInvokeNative(253) sysInvokeNative(254) sysInvokeNative(255) #define STUB(N) sysInvokeNative##N void* sysInvokeNativeStubs[1024] = { STUB(0), STUB(1), STUB(2), STUB(3), STUB(4), STUB(5), STUB(6), STUB(7), STUB(8), STUB(9), STUB(10), STUB(11), STUB(12), STUB(13), STUB(14), STUB(15), STUB(16), STUB(17), STUB(18), STUB(19), STUB(20), STUB(21), STUB(22), STUB(23), STUB(24), STUB(25), STUB(26), STUB(27), STUB(28), STUB(29), STUB(30), STUB(31), STUB(32), STUB(33), STUB(34), STUB(35), STUB(36), STUB(37), STUB(38), STUB(39), STUB(40), STUB(41), STUB(42), STUB(43), STUB(44), STUB(45), STUB(46), STUB(47), STUB(48), STUB(49), STUB(50), STUB(51), STUB(52), STUB(53), STUB(54), STUB(55), STUB(56), STUB(57), STUB(58), STUB(59), STUB(60), STUB(61), STUB(62), STUB(63), STUB(64), STUB(65), STUB(66), STUB(67), STUB(68), STUB(69), STUB(70), STUB(71), STUB(72), STUB(73), STUB(74), STUB(75), STUB(76), STUB(77), STUB(78), STUB(79), STUB(80), STUB(81), STUB(82), STUB(83), STUB(84), STUB(85), STUB(86), STUB(87), STUB(88), STUB(89), STUB(90), STUB(91), STUB(92), STUB(93), STUB(94), STUB(95), STUB(96), STUB(97), STUB(98), STUB(99), STUB(100), STUB(101), STUB(102), STUB(103), STUB(104), STUB(105), STUB(106), STUB(107), STUB(108), STUB(109), STUB(110), STUB(111), STUB(112), STUB(113), STUB(114), STUB(115), STUB(116), STUB(117), STUB(118), STUB(119), STUB(120), STUB(121), STUB(122), STUB(123), STUB(124), STUB(125), STUB(126), STUB(127), STUB(128), STUB(129), STUB(130), STUB(131), STUB(132), STUB(133), STUB(134), STUB(135), STUB(136), STUB(137), STUB(138), STUB(139), STUB(140), STUB(141), STUB(142), STUB(143), STUB(144), STUB(145), STUB(146), STUB(147), STUB(148), STUB(149), STUB(150), STUB(151), STUB(152), STUB(153), STUB(154), STUB(155), STUB(156), STUB(157), STUB(158), STUB(159), STUB(160), STUB(161), STUB(162), STUB(163), STUB(164), STUB(165), STUB(166), STUB(167), STUB(168), STUB(169), STUB(170), STUB(171), STUB(172), STUB(173), STUB(174), STUB(175), STUB(176), STUB(177), STUB(178), STUB(179), STUB(180), STUB(181), STUB(182), STUB(183), STUB(184), STUB(185), STUB(186), STUB(187), STUB(188), STUB(189), STUB(190), STUB(191), STUB(192), STUB(193), STUB(194), STUB(195), STUB(196), STUB(197), STUB(198), STUB(199), STUB(200), STUB(201), STUB(202), STUB(203), STUB(204), STUB(205), STUB(206), STUB(207), STUB(208), STUB(209), STUB(210), STUB(211), STUB(212), STUB(213), STUB(214), STUB(215), STUB(216), STUB(217), STUB(218), STUB(219), STUB(220), STUB(221), STUB(222), STUB(223), STUB(224), STUB(225), STUB(226), STUB(227), STUB(228), STUB(229), STUB(230), STUB(231), STUB(232), STUB(233), STUB(234), STUB(235), STUB(236), STUB(237), STUB(238), STUB(239), STUB(240), STUB(241), STUB(242), STUB(243), STUB(244), STUB(245), STUB(246), STUB(247), STUB(248), STUB(249), STUB(250), STUB(251), STUB(252), STUB(253), STUB(254), STUB(255), }; #endif // WIN32