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
134
135
136
137
138
139
140
141
142
|
#
# $Id: nwpre.as,v 1.3 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 (nwpre-like) startup code for netware
#
# 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)
#
_pasStart_:
pushl $_nlm_main
call _SetupArgV_411
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
# _kNLMInfo (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 $_kNLMInfo
pushl %eax
movl 0x24(%ebp),%edx # 1b7f6
pushl %edx
pushl %ecx
pushl %ebx
pushl %esi # uninitialized data size
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 _kNLMInfo,%edx
pushl %edx
call _TerminateNLM
addl $0x0c,%esp
ret
.data
# argc is defined in the novell nwpre, i assume it is not needed
#_argc:
# .long 0
# structure needed by clib
# kNLMInfoT =
# PACKED RECORD
# Signature : ARRAY [0..3] OF CHAR; // LONG 'NLMI'
# Flavor : LONGINT; // TRADINIONAL_FLAVOR = 0
# Version : LONGINT; // TRADINIONAL_VERSION = 0, LIBERTY_VERSION = 1
# LongDoubleSize : LONGINT; // gcc nwpre defines 12, watcom 8
# wchar_tSize : LONGINT;
# END;
.globl _kNLMInfo # will be used as data start
_kNLMInfo:
.ascii "NLMI"
.long 0,1,8,2
.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
|