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
|
#!/bin/sh
#
# MOLPATH is needed if you want to build openbios-mol.elf
#
MOLPATH=$HOME/mol-0.9.71
if [ x"$1" = x -o "$1" = "-help" ]; then
printf "Usage:\n $0 [arch-config]...\n"
printf "arch-config values supported for native or cross compiled builds:\n"
printf " amd64, ppc, sparc32, sparc64, x86\n\n"
printf "Add \"unix-\" prefix to compile openbios-unix executable (native only)\n"
printf "Add \"builtin-\" prefix to compile openbios-builtin executables\n\n"
printf "Without prefixes, builtin and unix targets are selected\n\n"
printf "Special targets: mol-ppc briq-ppc pearpc-ppc qemu-ppc qemu-ppc64 xbox-x86\n\n"
printf "Example: $0 builtin-sparc32 unix-amd64 builtin-amd64\n"
exit 0
fi
is_bigendian()
{
cpu=$1
if test "$cpu" = "powerpc" -o "$cpu" = "ppc" \
-o "$cpu" = "powerpc64" -o "$cpu" = "ppc64" \
-o "$cpu" = "mips" -o "$cpu" = "s390" \
-o "$cpu" = "sparc32" -o "$cpu" = "sparc64" \
-o "$cpu" = "m68k" -o "$cpu" = "armv4b"; then
echo yes
else
echo no
fi
}
longbits()
{
cpu=$1
if test "$cpu" = "sparc64" -o "$cpu" = "ia64" \
-o "$cpu" = "amd64" -o "$cpu" = "x86_64" \
-o "$cpu" = "powerpc64" -o "$cpu" = "ppc64" \
-o "$cpu" = "alpha"; then
echo 64
else
echo 32
fi
}
basearch()
{
arch=$1
case $arch in
powerpc|ppc64|powerpc64)
echo ppc
;;
*)
echo $arch
;;
esac
}
crosscflags()
{
host=$1
target=$2
hostbigendian=$(is_bigendian $host)
hostlongbits=$(longbits $host)
targetbigendian=$(is_bigendian $target)
targetlongbits=$(longbits $target)
if test "$targetbigendian" = "$hostbigendian"; then
cflags="-USWAP_ENDIANNESS"
else
cflags="-DSWAP_ENDIANNESS"
fi
if test "$targetlongbits" = "$hostlongbits"; then
cflags="$cflags -DNATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH"
elif test "$targetlongbits" -lt "$hostlongbits"; then
cflags="$cflags -DNATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH"
else
cflags="$cflags -DNATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH"
fi
if test "$target" = "sparc64" -o "$target" = "ia64" \
-o "$target" = "amd64" -o "$target" = "x86_64" \
-o "$target" = "alpha"; then
if test "$host" = "x86"; then
cflags="$cflags -DNEED_FAKE_INT128_T"
elif test "$host" = "arm"; then
cflags="$cflags -DNEED_FAKE_INT128_T"
elif test "$host" = "ppc" -a `uname -s` = "Darwin"; then
cflags="$cflags -DNEED_FAKE_INT128_T"
fi
fi
CROSSCFLAGS=$cflags
}
archname()
{
HOSTARCH=`uname -m | sed -e s/i.86/x86/ -e s/i86pc/x86/ \
-e s/sun4u/sparc64/ -e s/sparc$/sparc32/ \
-e s/arm.*/arm/ -e s/sa110/arm/ -e s/x86_64/amd64/ \
-e "s/Power Macintosh/ppc/"`
}
select_prefix()
{
BASEARCH=$(basearch $ARCH)
for target_arch ; do
TARGETS="${target_arch}-unknown-linux-gnu- ${target_arch}-linux-gnu- ${target_arch}-linux- ${target_arch}-elf- ${target_arch}-eabi-"
if [ x"$CROSS_COMPILE" != "x" ]; then
TARGETS=$CROSS_COMPILE
fi
for TARGET in $TARGETS
do
if type ${TARGET}gcc > /dev/null 2>&1
then
return
fi
done
if [ "$BASEARCH" = "$(basearch $HOSTARCH)" ]; then
TARGET=""
return
fi
done
echo "ERROR: no $* cross-compiler found !" 1>&2
exit 1
}
config_set_boolean()
{
option=`echo $1 | tr a-z A-Z`
echo "<option name=\"$option\" type=\"boolean\" value=\"true\" />"
}
exists()
{
type "$1" >/dev/null 2>&1
}
SRCDIR=`dirname "$0"`/../..
BUILDDIR=`pwd`
# make source path absolute
SRCDIR=`cd "$SRCDIR"; pwd`
if test "x$HOSTARCH" = "x"; then
archname
fi
VERSION=`head $SRCDIR/VERSION`
echo "Configuring OpenBIOS on $HOSTARCH for $*"
if exists toke; then
:
else
echo "Unable to locate toke executable from the fcode-utils package - aborting"
exit 1
fi
target_list=""
for target in $*; do
case $target in
unix-*|builtin-*|plain-*|mol-ppc|briq-ppc|pearpc-ppc|qemu-ppc|qemu-ppc64|xbox-x86)
target_list="$target_list $target"
;;
cross-*)
echo "\"cross-\" prefix is no longer needed"
target=`echo $target | sed s/cross-//g`
target_list="$target_list builtin-$target"
;;
*)
#default: build builtin and if possible, unix target
target_list="$target_list builtin-$target unix-$target"
;;
esac
done
arch_list=""
for target in $target_list; do
arch=`echo $target | sed s/.*-//g`
if ! test -f $SRCDIR/config/examples/${arch}_config.xml; then
echo "Cannot find $SRCDIR/config/examples/${arch}_config.xml" >&2
exit 1
fi
if ! echo $arch_list | grep -q "$arch"; then
arch_list="$arch_list $arch"
fi
done
for ARCH in $arch_list; do
unix="no"
builtin="no"
plain="no"
mol="no"
briq="no"
pearpc="no"
qemu="no"
xbox="no"
cross="no"
for target in $target_list; do
case $target in
*-$ARCH)
:
;;
*)
continue
;;
esac
case $target in
mol-ppc)
mol="yes"
;;
briq-ppc)
briq="yes"
;;
pearpc-ppc)
pearpc="yes"
;;
builtin-ppc|qemu-ppc|builtin-ppc64|qemu-ppc64)
qemu="yes"
;;
xbox-x86)
xbox="yes"
;;
builtin-sparc32)
builtin="yes"
qemu="yes"
;;
builtin-sparc64)
builtin="yes"
qemu="yes"
;;
unix-*)
if [ "$ARCH" != "$HOSTARCH" ]; then
# Can't cross compile Unix target
continue
fi
unix="yes"
;;
builtin-*)
builtin="yes"
;;
plain-*)
plain="yes"
;;
esac
done
case $ARCH in
amd64)
select_prefix x86_64
CFLAGS="-fno-builtin"
AS_FLAGS=
;;
ppc)
select_prefix powerpc powerpc64
if [ "$unix" = "no" ]; then
# 604 cpu includes support for PReP as well as Mac
CFLAGS="-m32 -mcpu=604 -msoft-float -fno-builtin-bcopy -fno-builtin-log2"
AS_FLAGS="-m32"
else
CFLAGS="-fno-builtin"
AS_FLAGS=
fi
;;
ppc64)
select_prefix powerpc64
# 970 cpu is used in all 64-bit Macs but disable altivec
CFLAGS="-mcpu=970 -mno-altivec -Wa,-a64 -m64 -msoft-float -fno-builtin"
AS_FLAGS="-Wa,-a64"
;;
sparc32)
select_prefix sparc sparc64
CFLAGS="-Wa,-xarch=v8 -Wa,-32 -m32 -mcpu=supersparc -fno-builtin"
AS_FLAGS="-Wa,-xarch=v8 -Wa,-32"
;;
sparc64)
select_prefix sparc64
CFLAGS="-Wa,-xarch=v9b -Wa,-64 -m64 -mcpu=ultrasparc -mcmodel=medany -fno-builtin"
AS_FLAGS="-Wa,-xarch=v9b -Wa,-64"
;;
x86)
select_prefix i486
CFLAGS="-fno-builtin -m32"
AS_FLAGS="-Wa,-32"
;;
esac
if [ "$ARCH" != "$HOSTARCH" -o `uname -s` = "Darwin" ]; then
cross="yes"
fi
crosscflags $HOSTARCH $ARCH
OBJDIR=$BUILDDIR/obj-$ARCH
ODIRS="$ODIRS $OBJDIR"
printf "Initializing build tree $OBJDIR..."
rm -rf "$OBJDIR"
mkdir "$OBJDIR"
mkdir -p $OBJDIR/target
mkdir -p $OBJDIR/target/include
mkdir -p $OBJDIR/target/arch
mkdir -p $OBJDIR/target/arch/unix
mkdir -p $OBJDIR/target/arch/$ARCH
mkdir -p $OBJDIR/target/libgcc
mkdir -p $OBJDIR/target/kernel
mkdir -p $OBJDIR/target/libopenbios
mkdir -p $OBJDIR/target/packages
mkdir -p $OBJDIR/target/fs
mkdir -p $OBJDIR/target/fs/grubfs
mkdir -p $OBJDIR/target/fs/hfs
mkdir -p $OBJDIR/target/fs/hfsplus
mkdir -p $OBJDIR/target/fs/iso9660
mkdir -p $OBJDIR/target/fs/ext2
mkdir -p $OBJDIR/target/drivers
mkdir -p $OBJDIR/target/libc
mkdir -p $OBJDIR/host/include
mkdir -p $OBJDIR/host/kernel
mkdir -p $OBJDIR/forth
ln -s $SRCDIR/include/arch/$BASEARCH $OBJDIR/target/include/asm
#compile the host binary with target settings instead
#ln -s $SRCDIR/include/arch/$HOSTARCH $OBJDIR/host/include/asm
if [ "$mol" = "yes" ]; then
printf "\nUsing MOL path $MOLPATH...\n"
mkdir -p $OBJDIR/target/arch/ppc/mol
ln -s $MOLPATH/src/shared/osi_calls.h $OBJDIR/target/include/
ln -s $MOLPATH/src/shared/osi.h $OBJDIR/target/include/
ln -s $MOLPATH/src/shared/prom.h $OBJDIR/target/include/
ln -s $MOLPATH/src/include/boothelper_sh.h $OBJDIR/target/include/
ln -s $MOLPATH/src/include/video_sh.h $OBJDIR/target/include/
ln -s $MOLPATH/src/include/pseudofs_sh.h $OBJDIR/target/include/
ln -s $MOLPATH/src/include/kbd_sh.h $OBJDIR/target/include/
ln -s $MOLPATH/src/drivers/disk/include/scsi_sh.h $OBJDIR/target/include/
ln -s $MOLPATH/src/drivers/disk/include/ablk_sh.h $OBJDIR/target/include/
fi
if [ "$briq" = "yes" ]; then
mkdir -p $OBJDIR/target/arch/ppc/briq
fi
if [ "$pearpc" = "yes" ]; then
mkdir -p $OBJDIR/target/arch/ppc/pearpc
fi
if [ "$qemu" = "yes" ]; then
mkdir -p $OBJDIR/target/arch/ppc/qemu
fi
if [ "$xbox" = "yes" ]; then
mkdir -p $OBJDIR/target/arch/x86/xbox
fi
echo "ok."
ODIR=$OBJDIR
printf "Creating target config.mak..."
echo "ARCH=$ARCH" > $ODIR/config.mak
if [ "$cross" = "yes" ]; then
echo "TARGET=$TARGET" >> $ODIR/config.mak
fi
echo "CFLAGS=$CFLAGS" >> $ODIR/config.mak
echo "AS_FLAGS=$AS_FLAGS" >> $ODIR/config.mak
echo "HOSTARCH?=$HOSTARCH" >> $ODIR/config.mak
echo "CROSSCFLAGS=$CROSSCFLAGS" >> $ODIR/config.mak
echo "VERSION=\"$VERSION\"" >> $ODIR/config.mak
echo "SRCDIR=$SRCDIR" >> $ODIR/config.mak
echo "ok."
printf "Creating target rules.mak..."
ln -s $SRCDIR/config/xml/rules.xml $ODIR/rules.xml
echo "<?xml version=\"1.0\"?><config>" > $ODIR/config.xml
# Generic
config_set_boolean CONFIG_$ARCH >> $ODIR/config.xml
if [ "$BASEARCH" != "$ARCH" ]; then
config_set_boolean CONFIG_$BASEARCH >> $ODIR/config.xml
fi
if [ "$mol" = "yes" ]; then
config_set_boolean CONFIG_MOL >> $ODIR/config.xml
fi
if [ "$briq" = "yes" ]; then
config_set_boolean CONFIG_BRIQ >> $ODIR/config.xml
fi
if [ "$pearpc" = "yes" ]; then
config_set_boolean CONFIG_PEARPC >> $ODIR/config.xml
fi
if [ "$qemu" = "yes" ]; then
config_set_boolean CONFIG_QEMU >> $ODIR/config.xml
fi
if [ "$xbox" = "yes" ]; then
config_set_boolean CONFIG_XBOX >> $ODIR/config.xml
fi
if [ "$targetbigendian" = "yes" ]; then
config_set_boolean CONFIG_BIG_ENDIAN >> $ODIR/config.xml
else
config_set_boolean CONFIG_LITTLE_ENDIAN >> $ODIR/config.xml
fi
# Kernel binaries
if [ "$plain" = "yes" ]; then
config_set_boolean CONFIG_IMAGE_ELF >> $ODIR/config.xml
fi
if [ "$builtin" = "yes" ]; then
config_set_boolean CONFIG_IMAGE_ELF_EMBEDDED >> $ODIR/config.xml
fi
# Build hosted Unix binary?
if [ "$unix" = "yes" ]; then
config_set_boolean CONFIG_HOST_UNIX >> $ODIR/config.xml
#config_set_boolean CONFIG_UNIX_QT >> $ODIR/config.xml
#config_set_boolean CONFIG_PLUGINS >> $ODIR/config.xml
fi
cat $SRCDIR/config/examples/${ARCH}_config.xml >> $ODIR/config.xml
cd $ODIR
echo "</config>" >> $ODIR/config.xml
ln -s $SRCDIR/Makefile.target $ODIR/Makefile
xsltproc $SRCDIR/config/xml/xinclude.xsl $SRCDIR/build.xml > $ODIR/build-full.xml
xsltproc $SRCDIR/config/xml/makefile.xsl $ODIR/build-full.xml > $ODIR/rules.mak
echo "ok."
printf "Creating config files..."
xsltproc $SRCDIR/config/xml/config-c.xsl $ODIR/config.xml > $ODIR/host/include/autoconf.h
xsltproc $SRCDIR/config/xml/config-c.xsl $ODIR/config.xml > $ODIR/target/include/autoconf.h
xsltproc $SRCDIR/config/xml/config-forth.xsl $ODIR/config.xml > $ODIR/forth/config.fs
echo "ok."
cd $BUILDDIR
done
if [ "$SRCDIR" != "$BUILDDIR" ]; then
ln -s $SRCDIR/Makefile $BUILDDIR
fi
echo "ODIRS=$ODIRS" >> $BUILDDIR/config-host.mak
echo "TARGETS=$arch_list" >> $BUILDDIR/config-host.mak
|