Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


(no commit message)
[palacios.git] / palacios / build / Makefile
1 # Makefile for GeekOS kernel, userspace, and tools
2 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
3 # $Revision: 1.1.1.1 $
4
5 # This is free software.  You are permitted to use,
6 # redistribute, and modify it as specified in the file "COPYING".
7
8 # Required software to build GeekOS:
9 # - GNU Make (http://www.gnu.org/software/make)
10 # - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
11 # - nasm (http://nasm.sourceforge.net)
12 # - Perl5, AWK (any version), egrep
13 #
14 # Cygwin (http://cygwin.com) may be used to build GeekOS.
15 # Make sure that gcc, binutils, nasm, and perl are installed.
16
17 # NOTES:
18 # - This makefile has been written carefully to work correctly
19 #   with the -j (parallel make) option.  I regularly use "make -j 2"
20 #   to speed the build process on 2 processor systems.
21
22
23
24 # THESE MUST MATCH WHAT IS DEFINED IN defs.h and defs.asm exactly
25 # MUST BE INTEGRAL NUMBER OF PAGES
26 TOP_OF_MEM := 0x40000000
27 VM_SIZE    := 0x20000000
28 VM_START   := 0x0
29
30 #
31 # THE KERNEL, SETUP, BOOTPACKAGE MUST BE SMALLER THAN THIS
32 # MUST BE INTEGRAL NUMBER OF PAGES
33 # define 
34 MAX_VMM := 0x60000
35
36 # Base address of kernel
37 #
38 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
39 # minus maximum size
40 #
41 #
42 # Note that the code will initially load at 0x10000
43 #
44 # The setup code needs to copy it up to this address and jump there
45 #
46 KERNEL_BASE_ADDR := $(shell perl -e 'print sprintf("0x%x",$(TOP_OF_MEM)-4096*3-$(MAX_VMM));')
47
48 # Kernel entry point function
49 KERNEL_ENTRY = $(SYM_PFX)Main
50
51
52 PROJECT_ROOT := ..
53 VPATH := $(PROJECT_ROOT)/src
54
55 #when -DNDEBUG is set the kassert functions are disabled
56 #JRLDEBUG=-DNDEBUG
57 JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=1000 -DSERIAL_PRINT=1
58
59 #
60 #
61 #Peter's compile flags
62 PADFLAGS = -DMAX_VMM=$(MAX_VMM)
63
64 # Figure out if we're compiling with cygwin, http://cygwin.com
65 SYSTEM_NAME := $(shell uname -s)
66 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
67 SYM_PFX            := _
68 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
69 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
70 NON_ELF_SYSTEM     := yes
71 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
72 endif
73
74 VMM_SIZES = ../include/geekos/vmm_sizes.h
75
76
77 # ----------------------------------------------------------------------
78 # Configuration -
79 #   Various options specifying how GeekOS should be built,
80 #   what source files to build, which user programs to build,
81 #   etc.  This is generally the only section of the makefile
82 #   that will need to be modified.
83 # ----------------------------------------------------------------------
84
85 # List of targets to build by default.
86 # These targets encompass everything needed to boot
87 # and run GeekOS.
88 ALL_TARGETS := fd.img  rombios vgabios vmxassist
89
90
91 # Kernel source files
92 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
93         keyboard.c screen.c timer.c \
94         mem.c crc32.c \
95         gdt.c tss.c segment.c \
96         bget.c malloc.c \
97         synch.c kthread.c \
98         serial.c  reboot.c \
99         paging.c vmx.c vmcs_gen.c vmcs.c\
100         main.c
101
102 # Kernel object files built from C source files
103 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
104
105 # Kernel assembly files
106 KERNEL_ASM_SRCS := lowlevel.asm vmx_lowlevel.asm
107
108 KERNEL_GAS_SRCS := testvm.s
109
110 # Kernel object files build from assembler source files
111 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
112
113 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
114
115
116 # All kernel object files
117 KERNEL_OBJS := $(KERNEL_C_OBJS) \
118   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
119
120 # Common library source files.
121 # This library is linked into both the kernel and user programs.
122 # It provides string functions and generic printf()-style
123 # formatted output.
124 COMMON_C_SRCS := fmtout.c string.c memmove.c
125
126 # Common library object files.
127 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
128
129
130
131
132 # ----------------------------------------------------------------------
133 # Tools -
134 #   This section defines programs that are used to build GeekOS.
135 # ----------------------------------------------------------------------
136
137 # Uncomment if cross compiling
138 #TARGET_CC_PREFIX := i386-elf-
139
140 # Target C compiler.  gcc 2.95.2 or later should work.
141 TARGET_CC := $(TARGET_CC_PREFIX)gcc
142
143 # Host C compiler.  This is used to compile programs to execute on
144 # the host platform, not the target (x86) platform.  On x86/ELF
145 # systems, such as Linux and FreeBSD, it can generally be the same
146 # as the target C compiler.
147 HOST_CC := gcc
148
149 # Target linker.  GNU ld is probably to only one that will work.
150 TARGET_LD := $(TARGET_CC_PREFIX)ld
151
152 # Target archiver
153 TARGET_AR := $(TARGET_CC_PREFIX)ar
154
155 # Target ranlib
156 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
157
158 # Target nm
159 TARGET_NM := $(TARGET_CC_PREFIX)nm
160
161 # Target objcopy
162 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
163
164 # Nasm (http://nasm.sourceforge.net)
165 NASM := /usr/local/nasm-vmx/bin/nasm
166
167 AS = as
168
169 # Tool to build PFAT filesystem images.
170 BUILDFAT := tools/builtFat.exe
171
172 # Perl5 or later
173 PERL := perl
174
175 # Pad a file so its size is a multiple of some unit (i.e., sector size)
176 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
177
178 # Create a file filled with zeroes.
179 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
180
181 # Calculate size of file in sectors
182 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
183
184
185 # ----------------------------------------------------------------------
186 # Definitions -
187 #   Options passed to the tools.
188 # ----------------------------------------------------------------------
189
190 # Flags used for all C source files
191 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
192 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
193
194 # Flags used for kernel C source files
195 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
196
197 # Flags user for kernel assembly files
198 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
199
200 # Flags used for common library and libc source files
201 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
202         $(EXTRA_CC_USER_OPTS)
203
204 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
205 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
206
207 # ----------------------------------------------------------------------
208 # Rules -
209 #   Describes how to compile the source files.
210 # ----------------------------------------------------------------------
211
212 # Compilation of kernel C source files
213
214 geekos/%.o : geekos/%.c
215         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
216
217
218 # Compilation of kernel assembly source files
219 geekos/%.o : geekos/%.asm
220         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
221
222 # Compilation of test VM
223 geekos/%.o : geekos/%.s
224         $(AS) $< -o geekos/$*.o
225
226 geekos/%.o : geekos/%.S
227         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
228
229 # Compilation of common library C source files
230 common/%.o : common/%.c
231         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
232
233 # ----------------------------------------------------------------------
234 # Targets -
235 #   Specifies files to be built
236 # ----------------------------------------------------------------------
237
238 # Default target - see definition of ALL_TARGETS in Configuration section
239 all : $(ALL_TARGETS)
240
241
242 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
243         $(NASM) -O99 \
244         -f elf \
245                 -I$(PROJECT_ROOT)/src/geekos/ \
246                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
247         -o $@
248
249
250 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
251         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
252
253 # Standard floppy image - just boots the kernel
254 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin rombios vgabios vmxassist
255         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
256         $(PAD) _temp 512
257 # Note - second copy of rombios is intentional 
258         cat _temp rombios vgabios vmxassist rombios > $@
259
260 # make ready to boot over PXE
261 pxe:    fd.img
262         cp fd.img /tftpboot/geekos.img
263         $(PAD) /tftpboot/geekos.img 1474560
264
265
266 pxe-discovery-pdinda:   fd.img
267         cp fd.img geekos.img
268         $(PAD) geekos.img 1474560
269         /usr/local/vmm-util/pxe_cp geekos.img
270         /usr/local/vmm-util/tty_perm pdinda
271         echo "Copied file to PXE boot area and set serial permissions for pdinda"
272
273
274 pxe-discovery-bjp600:   fd.img
275         cp fd.img geekos.img
276         $(PAD) geekos.img 1474560
277         /usr/local/vmm-util/pxe_cp geekos.img
278         /usr/local/vmm-util/tty_perm bjp600
279         echo "Copied file to PXE boot area and set serial permissions for pdinda"
280
281
282 # Floppy boot sector (first stage boot loader).
283 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm rombios vgabios vmxassist
284         $(NASM) -f bin \
285                 -I$(PROJECT_ROOT)/src/geekos/ \
286                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
287                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
288                 -DNUM_BIOS_SECTORS=`$(NUMSECS) rombios` \
289                 -DNUM_VGA_BIOS_SECTORS=`$(NUMSECS) vgabios` \
290                 -DNUM_VMXASSIST_SECTORS=`$(NUMSECS) vmxassist` \
291                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
292                 -o $@
293
294 # Setup program (second stage boot loader).
295 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
296         $(NASM) -f bin \
297                 -I$(PROJECT_ROOT)/src/geekos/ \
298                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
299                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
300                 -DVMM_SIZE=$(MAX_VMM) \
301                 $(PROJECT_ROOT)/src/geekos/setup.asm \
302                 -o $@
303         $(PAD) $@ 512
304
305 # Loadable (flat) kernel image.
306 geekos/kernel.bin : geekos/kernel.exe
307         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
308         $(PAD) $@ 512
309
310 # The kernel executable and symbol map.
311 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
312         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
313                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
314         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
315
316
317 generate_sizes: force
318         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
319         echo "#define __vmm_sizes" >> $(VMM_SIZES)
320         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
321         echo "#define KERNEL_SETUP_LENGTH (" `$(NUMSECS) geekos/setup.bin` "*512)" >> $(VMM_SIZES) 
322         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS)  geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
323         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
324         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
325         echo "#define BIOS_LENGTH (" `$(NUMSECS) rombios` "*512)" >> $(VMM_SIZES) 
326         echo "#define VGA_BIOS_LENGTH (" `$(NUMSECS) vgabios` "*512)" >> $(VMM_SIZES) 
327         echo "#define VMXASSIST_LENGTH (" `$(NUMSECS) vmxassist` "*512)" >> $(VMM_SIZES) 
328         echo "#define BIOS_START (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH)" >> $(VMM_SIZES) 
329         echo "#define VGA_BIOS_START (BIOS_START+BIOS_LENGTH)" >> $(VMM_SIZES)
330         echo "#define VMXASSIST_START (VGA_BIOS_START+VGA_BIOS_LENGTH)" >> $(VMM_SIZES)
331         echo "//Note this is a second copy of the rom bios for debug" >> $(VMM_SIZES)
332         echo "#define BIOS2_START (VMXASSIST_START+VMXASSIST_LENGTH)" >> $(VMM_SIZES)
333         echo "#define VM_BOOT_PACKAGE_START (BIOS_START) " >> $(VMM_SIZES)
334         echo "#define VM_BOOT_PACKAGE_END  (BIOS2_START+BIOS_LENGTH-1) " >> $(VMM_SIZES)
335         echo "#endif" >> $(VMM_SIZES)
336
337 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
338         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
339
340 show_sizes: make_show_sizes
341         ./show_sizes
342
343
344 get_kernel_size: make_show_sizes
345         ./show_sizes | grep 
346
347 force:
348
349
350 rombios: force
351         (cd ../src/vmboot/rombios; make)
352         cp ../src/vmboot/rombios/BIOS-bochs-latest rombios
353         $(PAD) rombios 512
354         @echo "Rom bios lives at f000:0000 and is" `$(NUMSECS) rombios` "sectors long"
355
356
357 vgabios: force
358         (cd ../src/vmboot/vgabios;  make)
359         cp ../src/vmboot/vgabios/vgabios.bin vgabios
360         $(PAD) vgabios 512
361         @echo "Vga bios lives at c000:0000 and is" `$(NUMSECS) vgabios` "sectors long"
362
363 vmxassist: force
364         (cd ../src/vmboot/vmxassist; make)
365         cp ../src/vmboot/vmxassist/vmxassist.bin vmxassist
366         $(PAD) vmxassist 512
367         @echo "vmxassist lives at d000:0000 and is" `$(NUMSECS) vmxassist` "sectors long"
368
369 # Clean build directories of generated files
370 clean :
371         rm -f rombios vgabios vmxassist
372         (cd ../src/vmboot/rombios; make clean)
373         (cd ../src/vmboot/vgabios;  make clean)
374         (cd ../src/vmboot/vmxassist; make clean)
375         for d in geekos common libc user tools; do \
376                 (cd $$d && rm -f *); \
377         done
378
379
380 # Build header file dependencies, so source files are recompiled when
381 # header files they depend on are modified.
382 depend : $(GENERATED_LIBC_SRCS)
383         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
384                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
385                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
386                 > depend.mak
387         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
388                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
389                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
390                 >> depend.mak
391
392 # By default, there are no header file dependencies.
393 depend.mak :
394         touch $@
395
396 include depend.mak