summaryrefslogtreecommitdiff
path: root/fpcsrc/rtl/netware/prelude.as
blob: 254dc257b26eb843765c8df86ce3b6694aa07a63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#
#    $Id: prelude.as,v 1.2 2003/03/25 18:17:54 armin Exp $
#    This file is part of the Free Pascal run time library.
#    Copyright (c) 1999-2002 by the Free Pascal development team
#    Copyright (c) 2002 Armin Diehl
#		
#    This is the (prelude-like) startup code for netware before 4.11
#	    
#    See the file COPYING.FPC, included in this distribution,
#    for details about the copyright.
#				    
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#				
#**********************************************************************

    .file "nwpre.as"
    .text

#
# This is the main program (not loader) Entry-Point that will be called by netware    
# it sets up the argc and argv and calls _nlm_main (in system.pp)
# This version uses the old _SetupArgv and not the newer _SetupArvV_411
#
    .globl	_pas_Start_
_pasStart_:
    pushl	$_nlm_main
    call	_SetupArgv
    addl	$4,%esp
    ret
# this is a hack to avoid that FPC_NW_CHECKFUNCTION will be
# eleminated by the linker (with smartlinking)
    call	FPC_NW_CHECKFUNCTION


#
# this will be called by the loader, we pass the address of _pasStart_ and
# _NLMID (needed by clib) and netware is doing the work
#
    .globl	_Prelude
_Prelude:
       	pushl	%ebp
    	movl	%esp,%ebp
       	pushl	%edi
       	pushl	%esi
   	pushl	%ebx
     	movl	0x14(%ebp),%edi
     	movl	0x18(%ebp),%esi
       	movl	%esi, __uninitializedDataSize
     	movl	0x1c(%ebp),%ebx
     	movl	0x20(%ebp),%ecx
     	movl	0x28(%ebp),%eax
   	pushl	$_pasStart_
   	pushl	$_NLMID
   	pushl	%eax
     	movl	0x24(%ebp),%edx
   	pushl	%edx
       	pushl	%ecx
   	pushl	%ebx
       	pushl	%esi
       	pushl	%edi
     	movl	0x10(%ebp),%edx
   	pushl	%edx
     	movl	0xc(%ebp),%edx
   	pushl	%edx
     	movl	0x8(%ebp),%edx
 	pushl	%edx
       	call	_StartNLM
	test	%eax,%eax
    	jne	x1
    	xorl	%eax,%eax		# dont know why this is needed ?
x1:
     	lea	0xfffffff4(%ebp),%esp
   	popl	%ebx
       	popl	%esi
       	popl	%edi
    	movl	%ebp,%esp
   	popl	%ebp
   	ret


#
# the global stop-function
#
    .globl	_Stop
_Stop:
	pushl	$0x5			# TERMINATE_BY_UNLOAD=0, TERMINATE_BY_EXTERNAL_THREAD=0
	pushl	$0x0
       	movl	_NLMID,%edx
       	pushl	%edx
       	call	_TerminateNLM
    	addl	$0x0c,%esp
       	ret


.data
# argc is defined in the novell prelude, i assume it is not needed
#_argc:
#	.long	0

_NLMID:
	.long	0

.text
.globl	__getTextStart
__getTextStart:
    movl    $.text,%eax
    ret	
    
.text
.globl	__getDataStart
__getDataStart:
    movl    $.data,%eax
    ret

.text
.globl	__getBssStart
__getBssStart:
    movl    $.bss,%eax
    ret
    
.data 
  __uninitializedDataSize:	.long
    


.text
.globl  __getUninitializedDataSize
__getUninitializedDataSize:
    movl   __uninitializedDataSize, %eax
    ret