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.


added the framework for interupt delivery
[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.23 $
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 # Base address of kernel
24 #
25 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
26 # minus maximum size
27 #
28 #
29 # Note that the code will initially load at 0x10000
30 #
31 # The setup code needs to copy it up to this address and jump there
32 #
33 KERNEL_BASE_ADDR := 0x00010000
34
35 # Kernel entry point function
36 KERNEL_ENTRY = $(SYM_PFX)Main
37
38
39 PROJECT_ROOT := ..
40 VPATH := $(PROJECT_ROOT)/src
41
42 #when -DNDEBUG is set the kassert functions are disabled
43 #JRLDEBUG=-DNDEBUG
44 JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1
45
46 #
47 #
48 #Peter's compile flags
49 PADFLAGS =
50
51 # Figure out if we're compiling with cygwin, http://cygwin.com
52 SYSTEM_NAME := $(shell uname -s)
53 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
54 SYM_PFX            := _
55 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
56 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
57 NON_ELF_SYSTEM     := yes
58 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
59 endif
60
61
62
63
64 # ----------------------------------------------------------------------
65 # Configuration -
66 #   Various options specifying how GeekOS should be built,
67 #   what source files to build, which user programs to build,
68 #   etc.  This is generally the only section of the makefile
69 #   that will need to be modified.
70 # ----------------------------------------------------------------------
71
72 # List of targets to build by default.
73 # These targets encompass everything needed to boot
74 # and run GeekOS.
75 ALL_TARGETS := fd.img vm_kernel
76
77
78 # Kernel source files
79 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
80         blockdev.c ide.c \
81         keyboard.c screen.c timer.c \
82         mem.c crc32.c \
83         gdt.c tss.c segment.c \
84         bget.c malloc.c \
85         synch.c kthread.c \
86         serial.c  reboot.c \
87         paging.c \
88         debug.c vmm_stubs.c  vm.c\
89         main.c
90
91 # Kernel object files built from C source files
92 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
93
94 # Kernel assembly files
95 KERNEL_ASM_SRCS := lowlevel.asm
96
97 KERNEL_GAS_SRCS := testvm.s
98
99 # Kernel object files build from assembler source files
100 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
101
102 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
103
104
105 # All kernel object files
106 KERNEL_OBJS := $(KERNEL_C_OBJS) \
107   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
108
109 # Common library source files.
110 # This library is linked into both the kernel and user programs.
111 # It provides string functions and generic printf()-style
112 # formatted output.
113 COMMON_C_SRCS := fmtout.c string.c memmove.c
114
115 # Common library object files.
116 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
117
118 VMM_ASM_SRCS :=  svm_lowlevel.asm \
119 #                       vmx_lowlevel.asm
120
121 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
122
123
124 VMM_C_SRCS :=   vm_guest.c \
125                 svm.c svm_handler.c vmm.c vmm_util.c svm_ctrl_regs.c \
126                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
127                 vmm_intr.c \
128                 vmm_shadow_paging.c vm_guest_mem.c #\
129 #               vmx.c vmcs_gen.c vmcs.c
130
131 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
132
133 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
134
135
136
137 # ----------------------------------------------------------------------
138 # Tools -
139 #   This section defines programs that are used to build GeekOS.
140 # ----------------------------------------------------------------------
141
142 # Uncomment if cross compiling
143 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
144 #TARGET_CC_PREFIX :=  i386-elf-
145
146 # Target C compiler.  gcc 2.95.2 or later should work.
147 TARGET_CC := $(TARGET_CC_PREFIX)gcc
148 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
149
150 # Host C compiler.  This is used to compile programs to execute on
151 # the host platform, not the target (x86) platform.  On x86/ELF
152 # systems, such as Linux and FreeBSD, it can generally be the same
153 # as the target C compiler.
154 HOST_CC := gcc
155
156 # Target linker.  GNU ld is probably to only one that will work.
157 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
158
159 # Target archiver
160 TARGET_AR := $(TARGET_CC_PREFIX)ar
161
162 # Target ranlib
163 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
164
165 # Target nm
166 TARGET_NM := $(TARGET_CC_PREFIX)nm
167
168 # Target objcopy
169 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
170
171 # Nasm (http://nasm.sourceforge.net)
172 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
173 #NASM := /opt/vmm-tools/bin/nasm
174
175 AS = as --32
176
177 # Tool to build PFAT filesystem images.
178 BUILDFAT := tools/builtFat.exe
179
180 # Perl5 or later
181 PERL := perl
182
183 # Pad a file so its size is a multiple of some unit (i.e., sector size)
184 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
185
186 # Create a file filled with zeroes.
187 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
188
189 # Calculate size of file in sectors
190 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
191
192
193 # ----------------------------------------------------------------------
194 # Definitions -
195 #   Options passed to the tools.
196 # ----------------------------------------------------------------------
197
198 # Flags used for all C source files
199 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) -fPIC
200 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
201
202 # Flags used for kernel C source files
203 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
204
205 # Flags used for VMM C source files
206 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include
207
208 # Flags used for VMM C ASM files
209 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
210
211 # Flags user for kernel assembly files
212 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
213
214 # Flags used for common library and libc source files
215 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
216         $(EXTRA_CC_USER_OPTS)
217
218 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
219 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
220
221 # ----------------------------------------------------------------------
222 # Rules -
223 #   Describes how to compile the source files.
224 # ----------------------------------------------------------------------
225
226 # Compilation of kernel C source files
227
228 geekos/%.o : geekos/%.c
229         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
230
231
232 # Compilation of kernel assembly source files
233 geekos/%.o : geekos/%.asm
234         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
235
236 # Compilation of test VM
237 geekos/%.o : geekos/%.s
238         $(AS) $< -o geekos/$*.o
239
240 geekos/%.o : geekos/%.S
241         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
242
243 # Compilation of common library C source files
244 common/%.o : common/%.c
245         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
246
247 palacios/%.o : palacios/%.c
248         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
249
250 palacios/%.o : palacios/%.asm
251         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
252
253 # ----------------------------------------------------------------------
254 # Targets -
255 #   Specifies files to be built
256 # ----------------------------------------------------------------------
257
258 # Default target - see definition of ALL_TARGETS in Configuration section
259 all : $(ALL_TARGETS)
260
261
262 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
263 #       $(NASM) -O99 \
264 #       -f elf \
265 #               -I$(PROJECT_ROOT)/src/geekos/ \
266 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
267 #       -o $@
268
269
270 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
271 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
272
273 # Standard floppy image - just boots the kernel
274 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
275         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
276         $(PAD) _temp 512
277         cat _temp vm_kernel > $@
278
279 # make ready to boot over PXE
280 pxe:    fd.img
281         cp fd.img /tftpboot/vmm.img
282         $(PAD) /tftpboot/vmm.img 1474560
283
284
285
286 # Floppy boot sector (first stage boot loader).
287 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
288         $(NASM) -f bin \
289                 -I$(PROJECT_ROOT)/src/geekos/ \
290                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
291                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
292                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
293                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
294                 -o $@
295
296 # Setup program (second stage boot loader).
297 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
298         $(NASM) -f bin \
299                 -I$(PROJECT_ROOT)/src/geekos/ \
300                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
301                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
302                 -DGUEST_SIZE=`$(NUMSECS) vm_kernel` \
303                 $(PROJECT_ROOT)/src/geekos/setup.asm \
304                 -o $@
305         $(PAD) $@ 512
306
307 # Loadable (flat) kernel image.
308 geekos/kernel.bin : geekos/kernel.exe
309         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
310         $(PAD) $@ 512
311
312 # The kernel executable and symbol map.
313 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS)
314         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
315                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS)
316         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
317
318
319 force:
320
321
322 vm_kernel: force
323         $(PAD) vm_kernel 512
324         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
325
326
327
328
329 # Clean build directories of generated files
330 clean :
331         for d in geekos common libc user tools palacios; do \
332                 (cd $$d && rm -f *); \
333         done
334
335
336 # Build header file dependencies, so source files are recompiled when
337 # header files they depend on are modified.
338 depend : $(GENERATED_LIBC_SRCS)
339         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
340                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
341                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
342                 > depend.mak
343         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
344                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
345                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
346                 >> depend.mak
347         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
348                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
349                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
350                 >> depend.mak
351
352 # By default, there are no header file dependencies.
353 depend.mak :
354         touch $@
355
356 include depend.mak