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.


*** empty log 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.3 $
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 TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
143
144 # Host C compiler.  This is used to compile programs to execute on
145 # the host platform, not the target (x86) platform.  On x86/ELF
146 # systems, such as Linux and FreeBSD, it can generally be the same
147 # as the target C compiler.
148 HOST_CC := gcc
149
150 # Target linker.  GNU ld is probably to only one that will work.
151 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
152
153 # Target archiver
154 TARGET_AR := $(TARGET_CC_PREFIX)ar
155
156 # Target ranlib
157 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
158
159 # Target nm
160 TARGET_NM := $(TARGET_CC_PREFIX)nm
161
162 # Target objcopy
163 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
164
165 # Nasm (http://nasm.sourceforge.net)
166 NASM := /opt/vmm-tools/bin/nasm
167
168 AS = as --32
169
170 # Tool to build PFAT filesystem images.
171 BUILDFAT := tools/builtFat.exe
172
173 # Perl5 or later
174 PERL := perl
175
176 # Pad a file so its size is a multiple of some unit (i.e., sector size)
177 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
178
179 # Create a file filled with zeroes.
180 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
181
182 # Calculate size of file in sectors
183 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
184
185
186 # ----------------------------------------------------------------------
187 # Definitions -
188 #   Options passed to the tools.
189 # ----------------------------------------------------------------------
190
191 # Flags used for all C source files
192 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
193 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
194
195 # Flags used for kernel C source files
196 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
197
198 # Flags user for kernel assembly files
199 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
200
201 # Flags used for common library and libc source files
202 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
203         $(EXTRA_CC_USER_OPTS)
204
205 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
206 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
207
208 # ----------------------------------------------------------------------
209 # Rules -
210 #   Describes how to compile the source files.
211 # ----------------------------------------------------------------------
212
213 # Compilation of kernel C source files
214
215 geekos/%.o : geekos/%.c
216         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
217
218
219 # Compilation of kernel assembly source files
220 geekos/%.o : geekos/%.asm
221         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
222
223 # Compilation of test VM
224 geekos/%.o : geekos/%.s
225         $(AS) $< -o geekos/$*.o
226
227 geekos/%.o : geekos/%.S
228         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
229
230 # Compilation of common library C source files
231 common/%.o : common/%.c
232         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
233
234 # ----------------------------------------------------------------------
235 # Targets -
236 #   Specifies files to be built
237 # ----------------------------------------------------------------------
238
239 # Default target - see definition of ALL_TARGETS in Configuration section
240 all : $(ALL_TARGETS)
241
242
243 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
244         $(NASM) -O99 \
245         -f elf \
246                 -I$(PROJECT_ROOT)/src/geekos/ \
247                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
248         -o $@
249
250
251 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
252         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
253
254 # Standard floppy image - just boots the kernel
255 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin rombios vgabios vmxassist
256         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
257         $(PAD) _temp 512
258 # Note - second copy of rombios is intentional 
259         cat _temp rombios vgabios vmxassist rombios > $@
260
261 # make ready to boot over PXE
262 pxe:    fd.img
263         cp fd.img /tftpboot/vmm.img
264         $(PAD) /tftpboot/vmm.img 1474560
265
266
267 pxe-discovery-pdinda:   fd.img
268         cp fd.img geekos.img
269         $(PAD) geekos.img 1474560
270         /usr/local/vmm-util/pxe_cp geekos.img
271         /usr/local/vmm-util/tty_perm pdinda
272         echo "Copied file to PXE boot area and set serial permissions for pdinda"
273
274
275 pxe-discovery-bjp600:   fd.img
276         cp fd.img geekos.img
277         $(PAD) geekos.img 1474560
278         /usr/local/vmm-util/pxe_cp geekos.img
279         /usr/local/vmm-util/tty_perm bjp600
280         echo "Copied file to PXE boot area and set serial permissions for pdinda"
281
282
283 # Floppy boot sector (first stage boot loader).
284 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm rombios vgabios vmxassist
285         $(NASM) -f bin \
286                 -I$(PROJECT_ROOT)/src/geekos/ \
287                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
288                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
289                 -DNUM_BIOS_SECTORS=`$(NUMSECS) rombios` \
290                 -DNUM_VGA_BIOS_SECTORS=`$(NUMSECS) vgabios` \
291                 -DNUM_VMXASSIST_SECTORS=`$(NUMSECS) vmxassist` \
292                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
293                 -o $@
294
295 # Setup program (second stage boot loader).
296 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
297         $(NASM) -f bin \
298                 -I$(PROJECT_ROOT)/src/geekos/ \
299                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
300                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
301                 -DVMM_SIZE=$(MAX_VMM) \
302                 $(PROJECT_ROOT)/src/geekos/setup.asm \
303                 -o $@
304         $(PAD) $@ 512
305
306 # Loadable (flat) kernel image.
307 geekos/kernel.bin : geekos/kernel.exe
308         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
309         $(PAD) $@ 512
310
311 # The kernel executable and symbol map.
312 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
313         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
314                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
315         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
316
317
318 generate_sizes: force
319         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
320         echo "#define __vmm_sizes" >> $(VMM_SIZES)
321         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
322         echo "#define KERNEL_SETUP_LENGTH (" `$(NUMSECS) geekos/setup.bin` "*512)" >> $(VMM_SIZES) 
323         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS)  geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
324         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
325         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
326         echo "#define BIOS_LENGTH (" `$(NUMSECS) rombios` "*512)" >> $(VMM_SIZES) 
327         echo "#define VGA_BIOS_LENGTH (" `$(NUMSECS) vgabios` "*512)" >> $(VMM_SIZES) 
328         echo "#define VMXASSIST_LENGTH (" `$(NUMSECS) vmxassist` "*512)" >> $(VMM_SIZES) 
329         echo "#define BIOS_START (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH)" >> $(VMM_SIZES) 
330         echo "#define VGA_BIOS_START (BIOS_START+BIOS_LENGTH)" >> $(VMM_SIZES)
331         echo "#define VMXASSIST_START (VGA_BIOS_START+VGA_BIOS_LENGTH)" >> $(VMM_SIZES)
332         echo "//Note this is a second copy of the rom bios for debug" >> $(VMM_SIZES)
333         echo "#define BIOS2_START (VMXASSIST_START+VMXASSIST_LENGTH)" >> $(VMM_SIZES)
334         echo "#define VM_BOOT_PACKAGE_START (BIOS_START) " >> $(VMM_SIZES)
335         echo "#define VM_BOOT_PACKAGE_END  (BIOS2_START+BIOS_LENGTH-1) " >> $(VMM_SIZES)
336         echo "#endif" >> $(VMM_SIZES)
337
338 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
339         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
340
341 show_sizes: make_show_sizes
342         ./show_sizes
343
344
345 get_kernel_size: make_show_sizes
346         ./show_sizes | grep 
347
348 force:
349
350
351 rombios: force
352         (cd ../src/vmboot/rombios; make)
353         cp ../src/vmboot/rombios/BIOS-bochs-latest rombios
354         $(PAD) rombios 512
355         @echo "Rom bios lives at f000:0000 and is" `$(NUMSECS) rombios` "sectors long"
356
357
358 vgabios: force
359         (cd ../src/vmboot/vgabios;  make)
360         cp ../src/vmboot/vgabios/vgabios.bin vgabios
361         $(PAD) vgabios 512
362         @echo "Vga bios lives at c000:0000 and is" `$(NUMSECS) vgabios` "sectors long"
363
364 vmxassist: force
365         (cd ../src/vmboot/vmxassist; make)
366         cp ../src/vmboot/vmxassist/vmxassist.bin vmxassist
367         $(PAD) vmxassist 512
368         @echo "vmxassist lives at d000:0000 and is" `$(NUMSECS) vmxassist` "sectors long"
369
370 # Clean build directories of generated files
371 clean :
372         rm -f rombios vgabios vmxassist
373         (cd ../src/vmboot/rombios; make clean)
374         (cd ../src/vmboot/vgabios;  make clean)
375         (cd ../src/vmboot/vmxassist; make clean)
376         for d in geekos common libc user tools; do \
377                 (cd $$d && rm -f *); \
378         done
379
380
381 # Build header file dependencies, so source files are recompiled when
382 # header files they depend on are modified.
383 depend : $(GENERATED_LIBC_SRCS)
384         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
385                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
386                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
387                 > depend.mak
388         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
389                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
390                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
391                 >> depend.mak
392
393 # By default, there are no header file dependencies.
394 depend.mak :
395         touch $@
396
397 include depend.mak