summaryrefslogtreecommitdiffstats
path: root/contrib/baremetal/Makefile
blob: df4de762e2f80f4b124b40f9f86d941e00d9cc6d (plain) (blame)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
#
# Makefile for Etherboot
#
# Most of the time you should edit Config
#
# Common options:
#	VERSION=v	- Set the version string
#
# NS8390 options:
#	-DINCLUDE_NE	- Include NE1000/NE2000 support
#	-DNE_SCAN=list	- Probe for NE base address using list of
#			  comma separated hex addresses
#	-DINCLUDE_3C503 - Include 3c503 support
#	  -DT503_SHMEM	- Use 3c503 shared memory mode (off by default)
#	-DINCLUDE_WD	- Include Western Digital/SMC support
#	-DWD_DEFAULT_MEM- Default memory location for WD/SMC cards
#	-DCOMPEX_RL2000_FIX
#
#	If you have a Compex RL2000 PCI 32-bit (11F6:1401),
#	and the bootrom hangs in "Probing...[NE*000/PCI]",
#	try enabling this fix... it worked for me :).
#	In the first packet write somehow it somehow doesn't
#	get back the expected data so it is stuck in a loop.
#	I didn't bother to investigate what or why because it works
#	when I interrupt the loop if it takes more then COMPEX_RL2000_TRIES.
#	The code will notify if it does a abort.
#	SomniOne - somnione@gmx.net
#
# 3C509 option:
#	-DINCLUDE_3C509	- Include 3c509 support
#
# 3C90X options:
#	-DINCLUDE_3C90X	- Include 3c90x support
#	-DCFG_3C90X_PRESERVE_XCVR - Reset the transceiver type to the value it
#			  had initially just before the loaded code is started.
#	-DCFG_3C90X_XCVR - Hardcode the tranceiver type Etherboot uses.
#	-DCFG_3C90X_BOOTROM_FIX - If you have a 3c905B with buggy ROM
#			  interface, setting this option might "fix" it.  Use
#			  with caution and read the docs in 3c90x.txt!
#
#	See the documentation file 3c90x.txt for more details.
#
# CS89X0 (optional) options:
#	-DINCLUDE_CS89X0- Include CS89x0 support
#	-DCS_SCAN=list	- Probe for CS89x0 base address using list of
#			  comma separated hex addresses; increasing the
#			  address by one (0x300 -> 0x301) will force a
#			  more aggressive probing algorithm. This might
#			  be neccessary after a soft-reset of the NIC.
#
# LANCE options:
#	-DINCLUDE_NE2100- Include NE2100 support
#	-DINCLUDE_NI6510- Include NI6510 support
#
# SK_G16 options:
#	-DINCLUDE_SK_G16- Include SK_G16 support
#
# I82586 options:
#	-DINCLUDE_3C507	- Include 3c507 support
#	-DINCLUDE_NI5210- Include NI5210 support
#	-DINCLUDE_EXOS205-Include EXOS205 support
#
# SMC9000 options:
#       -DINCLUDE_SMC9000   - Include SMC9000 driver
#       -DSMC9000_SCAN=list - List of I/O addresses to probe
#
# TIARA (Fujitsu Etherstar) options:
#	-DINCLUDE_TIARA	- Include Tiara support
#
# NI5010 options:
#	-DINCLUDE_NI5010 - Include NI5010 support
#
# TULIP options:
#	-DINCLUDE_TULIP	- Include Tulip support
#	-DUSE_INTERNAL_BUFFER - receuve and transmit buffers within program
#		space, not below 0x10000, in case that region is used
#
# RTL8139 options:
#	-DINCLUDE_RTL8139 - Include RTL8139 support
#	-DUSE_INTERNAL_BUFFER - 8 kB receive buffer within program space,
#		not at 0x10000 - 8kB, in case that region is used
#

include Config

GCC=		gcc
CPP=		gcc -E
VERSION=	4.6.12
CFLAGS16+=	-DVERSION=\"$(VERSION)\" -DRELOC=$(RELOCADDR)
CFLAGS32+=	-DVERSION=\"$(VERSION)\" -DRELOC=$(RELOCADDR) $(OLDGAS)
LCONFIG+=	-DRELOC=$(RELOCADDR)

IDENT16=		'Etherboot/16 $(VERSION) (GPL) $(@F)'
IDENT32=		'Etherboot/32 $(VERSION) (GPL) $(@F)'

# Find out if we're using binutils 2.9.1 which uses a different syntax in some
# places (most prominently in the opcode prefix area).
OLDGAS:=	$(shell $(AS) --version | grep -q '2\.9\.1' && echo -DGAS291)

# Check the requested type of build (32, 16 or both families)
ifeq ($(ETHERBOOT),16)
BUILD_LIBS=	$(BLIB16)
BUILD_BINS=	$(BINS16)
endif
ifeq ($(ETHERBOOT),32)
BUILD_LIBS=	$(BLIB32)
BUILD_BINS=	$(BINS32)
endif
ifeq ($(ETHERBOOT),both)
BUILD_LIBS=	$(BLIB16) $(BLIB32)
BUILD_BINS=	$(BINS16) $(BINS32)
endif

3C503FLAGS=	-DINCLUDE_3C503 # -DT503_SHMEM
# Note that the suffix to MAKEROM_ is the (mixed case) basename of the ROM file
MAKEROM_3c503=	-3
3C507FLAGS=	-DINCLUDE_3C507
3C509FLAGS=	-DINCLUDE_3C509
3C529FLAGS=	-DINCLUDE_3C529
3C595FLAGS=	-DINCLUDE_3C595
3C90XFLAGS=	-DINCLUDE_3C90X
CS89X0FLAGS=	-DINCLUDE_CS89X0
EEPROFLAGS=	-DINCLUDE_EEPRO
EEPRO100FLAGS=	-DINCLUDE_EEPRO100
EPIC100FLAGS=	-DINCLUDE_EPIC100
EXOS205FLAGS=	-DINCLUDE_EXOS205
LANCEFLAGS=	-DINCLUDE_LANCE		# Lance/PCI!
NE2100FLAGS=	-DINCLUDE_NE2100
NEFLAGS=	-DINCLUDE_NE -DNE_SCAN=0x300,0x280,0x320,0x340,0x380
NS8390FLAGS=	-DINCLUDE_NS8390	# NE2000/PCI!
NI5010FLAGS=	-DINCLUDE_NI5010
NI5210FLAGS=	-DINCLUDE_NI5210
NI6510FLAGS=	-DINCLUDE_NI6510
RTL8139FLAGS=	-DINCLUDE_RTL8139
SK_G16FLAGS=	-DINCLUDE_SK_G16
SMC9000FLAGS=   -DINCLUDE_SMC9000
TIARAFLAGS=	-DINCLUDE_TIARA
DEPCAFLAGS=	-DINCLUDE_DEPCA	# -DDEPCA_MODEL=DEPCA -DDEPCA_RAM_BASE=0xd0000
TULIPFLAGS=	-DINCLUDE_TULIP
OTULIPFLAGS=	-DINCLUDE_OTULIP
VIA_RHINEFLAGS=	-DINCLUDE_VIA_RHINE
WDFLAGS=	-DINCLUDE_WD -DWD_DEFAULT_MEM=0xCC000
W89C840FLAGS=	-DINCLUDE_W89C840

# If you have not made any changes to the *.S files, AS86 need not be set.
# (most people)
# If you have made changes to the *.S files and you want to rebuild *loader.bin
# and {floppy,com}load.bin and you have as86 from the ELKS Dev86 package (not
# the one that normally comes with Linux) (not most people)
#AS86=		as86
# If you have made changes to the *.S files and you want to rebuild *loader.bin
# and {floppy,com}load.bin and you have nasm (not most people)
#AS86=		nasm

# if your as has trouble with the data32 directive, uncomment this
# but note that the premade start*.o will be larger than necessary because it
# contains some routines which may not be used
#AS_PSEUDOS=	n

SRCS=	floppyload.S comload.S liloprefix.S loader.S start16.S start32.S serial.S startmpcc.S
SRCS+=	main.c pci.c osloader.c nfs.c misc.c ansiesc.c bootmenu.c config.c
SRCS+=	md5.c floppy.c

# ROM loaders: LZ version (prefix Z), PCI header version (prefix P)
ifndef AS86
RLOADER=	rloader.bin.pre
PRLOADER=	prloader.bin.pre
RZLOADER=	rzloader.bin.pre
PRZLOADER=	przloader.bin.pre
FLOPPYLOAD=	floppyload.bin.pre
COMLOAD=	comload.bin.pre
LILOPREFIX=	liloprefix.bin.pre
else
RLOADER=	bin/rloader.bin
PRLOADER=	bin/prloader.bin
RZLOADER=	bin/rzloader.bin
PRZLOADER=	bin/przloader.bin
FLOPPYLOAD=	bin/floppyload.bin
COMLOAD=	bin/comload.bin
LILOPREFIX=	bin/liloprefix.bin
endif

ifeq ($(AS86),as86)
LCPPFLAGS+=	-DUSE_AS86
LASFLAGS+=	$(AS86FLAGS) -0
LASBINARY:=	-b
endif
ifeq ($(AS86),nasm)
LCPPFLAGS+=	-DUSE_NASM
LASFLAGS+=	$(NASMFLAGS) -fbin
LASBINARY:=	-o
endif

ifeq ($(AS_PSEUDOS),n)
START16=	start16.o.pre
START32=	start32.o.pre
else
START16=	bin16/start16.o
START32=	bin32/startmpcc.o
endif

BOBJS16=	bin16/main.o bin16/osloader.o bin16/misc.o bin16/bootmenu.o
BOBJS16+=	bin16/floppy.o bin16/timer.o
BOBJS32=	bin32/main.o bin32/osloader.o bin32/nfs.o bin32/misc.o
BOBJS32+=	bin32/ansiesc.o bin32/bootmenu.o bin32/md5.o bin32/floppy.o
BOBJS32+=	bin32/serial.o bin32/timer.o
BLIB16=	bin16/bootlib.a
BLIB32=	bin32/bootlib.a
LIBS16=	$(BLIB16) $(LIBC16)
LIBS32=	$(BLIB32) $(LIBC32) /usr/lib/gcc-lib/i386-redhat-linux/2.96/libgcc.a
UTIL_LZHUF:= $(shell if [ -d ../contrib/compressor ]; then echo bin/lzhuf; fi)
UTILS+=	bin/makerom $(UTIL_LZHUF) bin/organon
STDDEPS16=	$(START16) $(BLIB16) $(UTILS)
STDDEPS32=	$(START32) $(BLIB32) $(UTILS)
MAKEDEPS=	Makefile Config Roms

CHECKSIZE=	{ read d1; read d1 d2 d3 size d4; [ $$size -gt $(ROMLIMIT) ] &&\
	{ $(RM) $@; echo "ERROR: code size exceeds limit!"; exit 1; }; exit 0; }

# Make sure that the relocation address is acceptable for all ROM sizes.
# Setting it to 0x98000 leaves about 29kB of space for the Etherboot program.
# The check is done based running 'size' on the binary, not ROM size, but
# roughly this means a ROM of 16kB or a partially used ROM of 32kB,
# remembering to compressed ROM images into account.
# You may also set RELOCADDR to 0x88000 to avoid using 0x98000
# because of other drivers (e.g. Disk On Chip). In that case, you may
# only load 512kB of OS, or load in memory above 1MB.
# Don't forget to choose an assembler because the loaders have to be rebuilt.
ifndef RELOCADDR
RELOCADDR=0x98000
#RELOCADDR=0xe0000
endif

# Evaluate ROMLIMIT only once - it is constant during the make run.
# Note that the 3K safety margin below is for the 1K extended BIOS data area
# and for the Etherboot runtime stack.  Under normal situations, 2K of stack
# are rarely needed.  If you experience strange behaviour in functions that use
# many local variables or that call functions that do, check for stack overrun!
# Make sure that the normal case needs no perl interpreter - if someone uses a
# different RELOCADDR, then he has perl installed anyways (the shell cannot
# deal with hex numbers, as test/eval don't support non-decimal integers).
ifeq ($(RELOCADDR),0x98000)
ROMLIMIT=29696
else
ROMLIMIT:=$(shell perl -e 'print 0x10000 - 3072 - ($(RELOCADDR) & 0xFFFF), "\n";')
endif

# Start of targets

all:	$(UTILS) $(BUILD_LIBS) allbins

include Roms

# We need allbins because $(BINS16) and $(BINS32) are not defined until
# the Makefile fragment "Roms" is read.

allbins:	$(BUILD_BINS)

# Common files

$(BLIB16):	$(BOBJS16)
	$(AR16) rv $@ $(BOBJS16)
	$(RANLIB16) $@

$(BLIB32):	$(BOBJS32)
	$(AR32) rv $@ $(BOBJS32)
	$(RANLIB32) $@

bin16/main.o:		main.c etherboot.h osdep.h nic.h
bin32/main.o:		main.c etherboot.h osdep.h nic.h

bin16/osloader.o:	osloader.c etherboot.h osdep.h
bin32/osloader.o:	osloader.c etherboot.h osdep.h

# NFS currently makes no sense for Etherboot/16
bin32/nfs.o:		nfs.c etherboot.h osdep.h nic.h

bin16/misc.o:		misc.c etherboot.h osdep.h
bin32/misc.o:		misc.c etherboot.h osdep.h

# ANSIESC is not supported for Etherboot/16
bin32/ansiesc.o:	ansiesc.c etherboot.h osdep.h

bin16/bootmenu.o:	bootmenu.c etherboot.h osdep.h
bin32/bootmenu.o:	bootmenu.c etherboot.h osdep.h

# Password support is not available for Etherboot/16
bin32/md5.o:		md5.c etherboot.h osdep.h

bin16/floppy.o:		floppy.c etherboot.h osdep.h
bin32/floppy.o:		floppy.c etherboot.h osdep.h

bin16/timer.o:		timer.c timer.h etherboot.h osdep.h
bin32/timer.o:		timer.c timer.h etherboot.h osdep.h

bin32/inthw.o:		inthw.c

# PCI support code (common to all PCI drivers)

bin32/pci.o:	pci.c pci.h

# Do not add driver specific dependencies here unless it's something the
# genrules.pl script *can't* deal with, i.e. if it is not C code.

# Prepended loaders

#ifndef AS86
#$(RLOADER) $(RZLOADER) $(PRLOADER) $(PRZLOADER):	$(MAKEDEPS)
#	@if [ $(RELOCADDR) != 0x98000 ]; then echo Non-standard RELOCADDR, must assemble $@; exit 1; fi
#	$(TOUCH) $@
#else
#bin/rloader.s:	loader.S $(MAKEDEPS)
#	$(CPP) $(LCPPFLAGS) $(LCONFIG) -o $@ $<
#
#bin/rzloader.s:	loader.S $(MAKEDEPS)
#	$(CPP) $(LCPPFLAGS) $(LCONFIG) -DZLOADER -o $@ $<
#
#bin/prloader.s:	loader.S $(MAKEDEPS)
#	$(CPP) $(LCPPFLAGS) $(LCONFIG) -DPCI_PNP_HEADER -o $@ $<
#
#bin/przloader.s:	loader.S $(MAKEDEPS)
#	$(CPP) $(LCPPFLAGS) $(LCONFIG) -DPCI_PNP_HEADER -DZLOADER -o $@ $<
#endif

# Floppy loader

ifdef AS86
bin/floppyload.s:	floppyload.S $(MAKEDEPS)
	$(CPP) $(LCPPFLAGS) -o $@ $<
endif

# COM loader

ifdef AS86
bin/comload.s:	comload.S $(MAKEDEPS)
	$(CPP) $(LCPPFLAGS) -o $@ $<
endif

# LILO prefix:

ifdef AS86
bin/liloprefix.s:	liloprefix.S $(MAKEDEPS)
	$(CPP) $(LCPPFLAGS) -o $@ $<
endif

# Utilities

bin/makerom: makerom.c
	$(GCC) -O2 -o $@ makerom.c

bin/organon: organon.c
	$(GCC) -o $@ organon.c

bin/lzhuf:	../contrib/compressor/lzhuf.c
	$(GCC) -O2 -DENCODE -DDECODE -DMAIN -DVERBOSE -o $@ $<

# Roms file

Roms:	NIC genrules.pl
	@chmod +x genrules.pl
	./genrules.pl NIC > $@

# Pattern Rules

# general rules for compiling/assembling source files
bin16/%.o:	%.c $(MAKEDEPS)
	$(CC16) $(CFLAGS16) -o $@ -c $<

bin32/%.o:	%.c $(MAKEDEPS)
	$(CC32) $(CFLAGS32) -o $@ -c $<

bin16/%.o:	%.S $(MAKEDEPS)
	$(CC16) $(CFLAGS16) $(ASFLAGS16) -c -o $@ $<

bin32/%.o:	%.S $(MAKEDEPS)
	$(CPP) $(CFLAGS32) $< | $(AS) $(ASFLAGS32) -o $@

# general rule for .bin (plain binary loader code), may be overridden
ifdef AS86
bin/%.bin:	bin/%.s
	$(AS86) $(LASFLAGS) $(LASBINARY) $@ $<
endif

# general rule for .huf (compressed binary code), may be overridden
%.huf:	%.img
	bin/lzhuf e $< $@

# general rules for normal/compressed ROM images, may be overridden
bin16/%.rom:	bin16/%.img $(RLOADER)
	cat $(RLOADER) $< > $@
	bin/makerom $(MAKEROM_$*) -i$(IDENT16) $@

bin32/%.rom:	bin32/%.img $(RLOADER)
	cat $(RLOADER) $< > $@
	bin/makerom $(MAKEROM_$*) -i$(IDENT32) $@

bin16/%.lzrom:	bin16/%.huf $(RZLOADER)
	cat $(RZLOADER) $< > $@
	bin/makerom $(MAKEROM_$*) -i$(IDENT16) $@

bin32/%.lzrom:	bin32/%.huf $(RZLOADER)
	cat $(RZLOADER) $< > $@
	bin/makerom $(MAKEROM_$*) -i$(IDENT32) $@

# rules to write the .rom/.lzrom image onto a blank floppy
# You must give the directory name, e.g. use bin32/rtl8139.lzfd0 as the target.
%.fd0:	%.rom $(FLOPPYLOAD)
	cat $(FLOPPYLOAD) $< > /dev/fd0

%.lzfd0:	%.lzrom $(FLOPPYLOAD)
	cat $(FLOPPYLOAD) $< > /dev/fd0

# rules to generate a .com executable
# You must give the directory name, e.g. use bin32/rtl8139.com as the target.
%.com:	%.lzrom $(COMLOAD)
	cat $(COMLOAD) $< > $@

# rules to make a floppy image (padding to fill an even number of cylinders).
# VMware reports floppy image read errors if it cannot read ahead 36 sectors,
# probably because the floppyload.S code reads up to that number of sectors in
# a single request.  Not that 18k matters much these days...
# You must give the directory name, e.g. use bin32/rtl8139.fdimg as the target.
%.fdimg:	%.rom $(FLOPPYLOAD)
	cat $(FLOPPYLOAD) $< > $@.x
	dd if=$@.x of=$@ bs=36k conv=sync 2> /dev/null
	$(RM) $@.x

%.lzfdimg:	%.lzrom $(FLOPPYLOAD)
	cat $(FLOPPYLOAD) $< > $@.x
	dd if=$@.x of=$@ bs=36k conv=sync 2> /dev/null
	$(RM) $@.x

# rules to make a LILO-bootable image
%.lilo:		%.rom $(LILOPREFIX)
	cat $(LILOPREFIX) $< /dev/zero | head -c 64k > $@

%.lzlilo:	%.lzrom $(LILOPREFIX)
	cat $(LILOPREFIX) $< /dev/zero | head -c 64k > $@

# Housekeeping

# To make sure that this actually builds a start32.o.pre with all options set,
# you have to make sure that -DFLOPPY -DANSIESC -DCONSOLE_DUAL are in CFLAGS32.
precompiled:	bin/rloader.bin bin/rzloader.bin bin/prloader.bin bin/przloader.bin bin/floppyload.bin bin/comload.bin bin16/start16.o bin32/start32.o bin/liloprefix.bin
	cp -p bin/rloader.bin rloader.bin.pre
	cp -p bin/rzloader.bin rzloader.bin.pre
	cp -p bin/prloader.bin prloader.bin.pre
	cp -p bin/przloader.bin przloader.bin.pre
	cp -p bin/floppyload.bin floppyload.bin.pre
	cp -p bin/comload.bin comload.bin.pre
	cp -p bin16/start16.o start16.o.pre
	cp -p bin32/start32.o start32.o.pre
	cp -p bin/liloprefix.bin liloprefix.bin.pre

clean:
	$(RM) $(UTILS) bin/*.s bin/*.bin
	$(RM) $(BLIB16) $(BLIB32)
	$(RM) bin16/*.o bin32/*.o bin16/*.tmp bin32/*.tmp
	$(RM) bin16/*.img bin32/*.img bin16/*.huf bin32/*.huf
	$(RM) bin16/*.rom bin32/*.rom bin16/*.lzrom bin32/*.lzrom
	$(RM) bin16/*.com bin32/*.com
	$(RM) bin16/*.fdimg bin32/*.fdimg bin16/*.lzfdimg bin32/*.lzfdimg
	$(RM) bin16/*.lilo bin32/*.lilo bin16/*.lzlilo bin32/*.lzlilo
	$(RM) bin32/*.hex
	$(RM) bin32/*.asm
	$(RM) bin32/*.map

tarball:
	(echo -n $(VERSION) ''; date -u +'%Y-%m-%d') > ../VERSION
	(cd ..; tar cf /tmp/mpccboot-$(VERSION).tar --exclude CVS mpccboot)
	bzip2 -9 < /tmp/mpccboot-$(VERSION).tar > /tmp/mpccboot-$(VERSION).tar.bz2
	gzip -9 < /tmp/mpccboot-$(VERSION).tar > /tmp/mpccboot-$(VERSION).tar.gz

version:
	@echo $(VERSION)