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.


pulled out vmxassist, added linux kernel
[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.5 $
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 := 0x160000
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 VM_linux_kernel
89
90
91 # Kernel source files
92 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
93         blockdev.c ide.c \
94         keyboard.c screen.c timer.c \
95         mem.c crc32.c \
96         gdt.c tss.c segment.c \
97         bget.c malloc.c \
98         synch.c kthread.c \
99         serial.c  reboot.c \
100         paging.c vmx.c vmcs_gen.c vmcs.c\
101         main.c
102
103 # Kernel object files built from C source files
104 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
105
106 # Kernel assembly files
107 KERNEL_ASM_SRCS := lowlevel.asm vmx_lowlevel.asm
108
109 KERNEL_GAS_SRCS := testvm.s
110
111 # Kernel object files build from assembler source files
112 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
113
114 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
115
116
117 # All kernel object files
118 KERNEL_OBJS := $(KERNEL_C_OBJS) \
119   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
120
121 # Common library source files.
122 # This library is linked into both the kernel and user programs.
123 # It provides string functions and generic printf()-style
124 # formatted output.
125 COMMON_C_SRCS := fmtout.c string.c memmove.c
126
127 # Common library object files.
128 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
129
130
131
132
133 # ----------------------------------------------------------------------
134 # Tools -
135 #   This section defines programs that are used to build GeekOS.
136 # ----------------------------------------------------------------------
137
138 # Uncomment if cross compiling
139 #TARGET_CC_PREFIX := i386-elf-
140
141 # Target C compiler.  gcc 2.95.2 or later should work.
142 TARGET_CC := $(TARGET_CC_PREFIX)gcc
143 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
144
145 # Host C compiler.  This is used to compile programs to execute on
146 # the host platform, not the target (x86) platform.  On x86/ELF
147 # systems, such as Linux and FreeBSD, it can generally be the same
148 # as the target C compiler.
149 HOST_CC := gcc
150
151 # Target linker.  GNU ld is probably to only one that will work.
152 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
153
154 # Target archiver
155 TARGET_AR := $(TARGET_CC_PREFIX)ar
156
157 # Target ranlib
158 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
159
160 # Target nm
161 TARGET_NM := $(TARGET_CC_PREFIX)nm
162
163 # Target objcopy
164 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
165
166 # Nasm (http://nasm.sourceforge.net)
167 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
168
169 AS = as --32
170
171 # Tool to build PFAT filesystem images.
172 BUILDFAT := tools/builtFat.exe
173
174 # Perl5 or later
175 PERL := perl
176
177 # Pad a file so its size is a multiple of some unit (i.e., sector size)
178 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
179
180 # Create a file filled with zeroes.
181 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
182
183 # Calculate size of file in sectors
184 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
185
186
187 # ----------------------------------------------------------------------
188 # Definitions -
189 #   Options passed to the tools.
190 # ----------------------------------------------------------------------
191
192 # Flags used for all C source files
193 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
194 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
195
196 # Flags used for kernel C source files
197 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
198
199 # Flags user for kernel assembly files
200 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
201
202 # Flags used for common library and libc source files
203 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
204         $(EXTRA_CC_USER_OPTS)
205
206 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
207 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
208
209 # ----------------------------------------------------------------------
210 # Rules -
211 #   Describes how to compile the source files.
212 # ----------------------------------------------------------------------
213
214 # Compilation of kernel C source files
215
216 geekos/%.o : geekos/%.c
217         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
218
219
220 # Compilation of kernel assembly source files
221 geekos/%.o : geekos/%.asm
222         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
223
224 # Compilation of test VM
225 geekos/%.o : geekos/%.s
226         $(AS) $< -o geekos/$*.o
227
228 geekos/%.o : geekos/%.S
229         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
230
231 # Compilation of common library C source files
232 common/%.o : common/%.c
233         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
234
235 # ----------------------------------------------------------------------
236 # Targets -
237 #   Specifies files to be built
238 # ----------------------------------------------------------------------
239
240 # Default target - see definition of ALL_TARGETS in Configuration section
241 all : $(ALL_TARGETS)
242
243
244 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
245         $(NASM) -O99 \
246         -f elf \
247                 -I$(PROJECT_ROOT)/src/geekos/ \
248                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
249         -o $@
250
251
252 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
253         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
254
255 # Standard floppy image - just boots the kernel
256 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin VM_linux_kernel
257         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
258         $(PAD) _temp 512
259         cat _temp VM_linux_kernel > $@
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 VM_linux_kernel
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_VM_KERNEL_SECTORS=`$(NUMSECS) VM_linux_kernel` \
290                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
291                 -o $@
292
293 # Setup program (second stage boot loader).
294 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
295         $(NASM) -f bin \
296                 -I$(PROJECT_ROOT)/src/geekos/ \
297                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
298                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
299                 -DVMM_SIZE=$(MAX_VMM) \
300                 $(PROJECT_ROOT)/src/geekos/setup.asm \
301                 -o $@
302         $(PAD) $@ 512
303
304 # Loadable (flat) kernel image.
305 geekos/kernel.bin : geekos/kernel.exe
306         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
307         $(PAD) $@ 512
308
309 # The kernel executable and symbol map.
310 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
311         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
312                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
313         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
314
315
316 generate_sizes: force
317         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
318         echo "#define __vmm_sizes" >> $(VMM_SIZES)
319         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
320
321         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
322         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS) geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
323         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
324
325         echo "#define VM_KERNEL_LENGTH (" `$(NUMSECS) VM_linux_kernel` "*512)" >> $(VMM_SIZES)
326         echo "#define VM_KERNEL_START (KERNEL_LOAD_ADDRESS + KERNEL_CORE_LENGTH)" >> $(VMM_SIZES)
327         echo "#define VM_BOOT_PACKAGE_START (VM_KERNEL_START) " >> $(VMM_SIZES)
328         echo "#define VM_BOOT_PACKAGE_END  (VM_KERNEL_START+VM_KERNEL_LENGTH-1) " >> $(VMM_SIZES)
329         echo "#endif" >> $(VMM_SIZES)
330
331 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
332         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
333
334 show_sizes: make_show_sizes
335         ./show_sizes
336
337
338 get_kernel_size: make_show_sizes
339         ./show_sizes | grep 
340
341 force:
342
343
344 VM_linux_kernel: force
345         $(PAD) VM_linux_kernel 512
346         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) VM_linux_kernel` "sectors long"
347
348
349 # Clean build directories of generated files
350 clean :
351         for d in geekos common libc user tools; do \
352                 (cd $$d && rm -f *); \
353         done
354
355
356 # Build header file dependencies, so source files are recompiled when
357 # header files they depend on are modified.
358 depend : $(GENERATED_LIBC_SRCS)
359         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
360                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
361                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
362                 > depend.mak
363         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
364                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
365                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
366                 >> depend.mak
367
368 # By default, there are no header file dependencies.
369 depend.mak :
370         touch $@
371
372 include depend.mak