summaryrefslogblamecommitdiffstats
path: root/src/arch/i386/Makefile
blob: 0a80ff94653f51ebf0c26beaebe904e6c1ed374f (plain) (tree)




















                                                                                






























































































































































                                                                                                   
                                                                      

                                                



                                                                               



























































































































































































                                                                                                     
ARCH_FORMAT=	elf32-i386

# For debugging, don't delete intermediates
#.SECONDARY:

LDSCRIPT=	arch/i386/core/etherboot.lds
PLDSCRIPT=	arch/i386/core/etherboot.prefix.lds

LCONFIG+=	-Ui386

ROMLIMIT=	524288
CHECKSIZE=	{ read d1; read d1 d2 d3 size d4; [ $$size -gt $(ROMLIMIT) ] &&\
	{ $(RM) $@; echo "ERROR: code size exceeds limit!"; exit 1; }; exit 0; }

START=	$(BIN)/start32.o $(BIN)/linuxbios.o \
	$(BIN)/bios.o $(BIN)/console.o $(BIN)/memsizes.o $(BIN)/basemem.o \
	$(BIN)/hidemem.o $(BIN)/e820mangler.o \
	$(BIN)/realmode.o $(BIN)/realmode_asm.o \
	$(BIN)/callbacks.o $(BIN)/pxe_callbacks.o

SRCS+=	arch/i386/prefix/floppyprefix.S
SRCS+=	arch/i386/prefix/unnrv2b.S
SRCS+=	arch/i386/firmware/pcbios/bios.c
SRCS+=	arch/i386/firmware/pcbios/console.c
SRCS+=	arch/i386/firmware/pcbios/memsizes.c
SRCS+=	arch/i386/firmware/pcbios/basemem.c
SRCS+=	arch/i386/firmware/pcbios/hidemem.c
SRCS+=	arch/i386/firmware/pcbios/e820mangler.S
SRCS+=	arch/i386/prefix/liloprefix.S
SRCS+=	arch/i386/prefix/elfprefix.S
SRCS+=	arch/i386/prefix/lmelf_prefix.S
SRCS+=	arch/i386/prefix/elf_dprefix.S
SRCS+=	arch/i386/prefix/lmelf_dprefix.S
SRCS+=	arch/i386/prefix/comprefix.S
SRCS+=	arch/i386/prefix/exeprefix.S
SRCS+=	arch/i386/prefix/pxeprefix.S
SRCS+=	arch/i386/prefix/romprefix.S

SRCS+=	arch/i386/core/init.S
SRCS+=	arch/i386/core/start32.S
SRCS+=	arch/i386/core/pci_io.c
SRCS+=	arch/i386/core/i386_timer.c
SRCS+=	arch/i386/core/elf.c
SRCS+=	arch/i386/core/cpu.c
SRCS+=	arch/i386/core/video_subr.c
SRCS+=	arch/i386/core/pic8259.c
SRCS+=	arch/i386/core/hooks.c
SRCS+=	arch/i386/core/callbacks.c
SRCS+=	arch/i386/core/realmode.c
SRCS+=	arch/i386/core/realmode_asm.S
SRCS+=	arch/i386/core/pxe_callbacks.c

# ROM loaders: ISA and PCI versions
ISAPREFIX=	$(BIN)/isaprefix.o
ISAENTRY=	$(BIN)/isaprefix.entry.o
ISAEXIT=	$(BIN)/isaprefix.exit.o
PCIPREFIX=	$(BIN)/pciprefix.o
PCIENTRY=	$(BIN)/pciprefix.entry.o
PCIEXIT=	$(BIN)/pciprefix.exit.o
# Variables xxx_ROMTYPE are defined by genrules.pl.  ROMENTRY and
# ROMEXIT will evaluate to give the correct objects to use.
TARGETBASE=$(patsubst $(BIN)/%,%,$(firstword $(subst ., ,$@)))
ROMCARD=$(firstword $(subst --, ,$(TARGETBASE)))
ROMTYPE=$(firstword $(ROMTYPE_$(ROMCARD)) ISA)
romENTRY=$($(ROMTYPE)ENTRY)
romEXIT=$($(ROMTYPE)EXIT)

# Target type for generic prf rules
TARGETTYPE=$(patsubst .%,%, $(suffix $(basename $@)))
TARGETENTRY=$($(TARGETTYPE)ENTRY)
TARGETEXIT=$($(TARGETTYPE)EXIT)

# Other real-mode entry loaders
dskPREFIX=	$(BIN)/floppyprefix.o
dskENTRY=	$(BIN)/floppyprefix.entry.o
dskEXIT=	$(BIN)/floppyprefix.exit.o
comPREFIX=	$(BIN)/comprefix.o
comENTRY=	$(BIN)/comprefix.entry.o
comEXIT=	$(BIN)/comprefix.exit.o
exePREFIX=	$(BIN)/exeprefix.o
exeENTRY=	$(BIN)/exeprefix.entry.o
exeEXIT=	$(BIN)/exeprefix.exit.o
liloPREFIX=	$(BIN)/liloprefix.o
liloENTRY=	$(BIN)/liloprefix.entry.o
liloEXIT=	$(BIN)/liloprefix.exit.o
bImagePREFIX=	$(BIN)/bImageprefix.o
bImageENTRY=	$(BIN)/bImageprefix.entry.o
bImageEXIT=	$(BIN)/bImageprefix.exit.o
pxePREFIX=	$(BIN)/pxeprefix.o
pxeENTRY=	$(BIN)/pxeprefix.entry.o
pxeEXIT=	$(BIN)/pxeprefix.exit.o
rawPREFIX=	$(BIN)/nullprefix.o
rawENTRY=	$(BIN)/nullprefix.entry.o
rawEXIT=	$(BIN)/nullprefix.exit.o

# Protected mode entry loaders
elfPREFIX=	$(BIN)/elfprefix.o
elfENTRY=	$(BIN)/elfprefix.entry.o
elfEXIT=	$(BIN)/elfprefix.exit.o
lmelfPREFIX=	$(BIN)/lmelf_prefix.o
lmelfENTRY=	$(BIN)/lmelf_prefix.entry.o
lmelfEXIT=	$(BIN)/lmelf_prefix.exit.o
elfdPREFIX=	$(BIN)/elf_dprefix.o
elfdENTRY=	$(BIN)/elf_dprefix.entry.o
elfdEXIT=	$(BIN)/elf_dprefix.exit.o
lmelfdPREFIX=	$(BIN)/lmelf_dprefix.o
lmelfdENTRY=	$(BIN)/lmelf_dprefix.entry.o
lmelfdEXIT=	$(BIN)/lmelf_dprefix.exit.o

include		$(BIN)/Roms

all:		$(ROMS)
allroms:	$(ROMS)
allzroms:	$(ROMS)
alldsks:	$(EB_DSKS)
allzdsks:	$(EB_ZDSKS)
alllilos:	$(EB_LILOS)
allzlilos:	$(EB_ZLILOS)
allbImages:	$(EB_BIMAGES)
allbzImages:	$(EB_BZIMAGES)
allpxes:	$(EB_PXES)
allzpxes:	$(EB_ZPXES)
allelfs:	$(EB_ELFS)
allzelfs:	$(EB_ZELFS)
alllmelfs:	$(EB_LMELFS)
allzlmelfs:	$(EB_ZLMELFS)
allelfds:	$(EB_ELFDS)
allzelfds:	$(EB_ZELFDS)
alllmelfds:	$(EB_LMELFDS)
allzlmelfds:	$(EB_ZLMELFDS)
allcoms:	$(EB_COMS)
allexes:	$(EB_EXES)
allisos:	$(EB_ISOS)
alllisos:	$(EB_LISOS)

BOBJS+=		$(BIN)/pci_io.o $(BIN)/i386_timer.o
BOBJS+=		$(BIN)/elf.o $(BIN)/cpu.o $(BIN)/video_subr.o
BOBJS+=		$(BIN)/pic8259.o $(BIN)/hooks.o

# ROM loaders

$(ISAPREFIX):	arch/i386/prefix/romprefix.S $(MAKEDEPS)
	$(CPP) $(CFLAGS) $(LCONFIG) -Ui386 -D ASSEMBLY $< \
		| $(AS) $(ASFLAGS) -o $@ 

$(PCIPREFIX):	arch/i386/prefix/romprefix.S $(MAKEDEPS)
	$(CPP) -DPCI_PNP_HEADER $(CFLAGS) $(LCONFIG) -Ui386 -D ASSEMBLY $< \
		| $(AS) $(ASFLAGS) -o $@ 

# Prefix splitters
$(BIN)/%prefix.entry.o: $(BIN)/%prefix.o $(MAKEDEPS)
	$(OBJCOPY) -R .text16 $< $@

$(BIN)/%prefix.exit.o: $(BIN)/%prefix.o $(MAKEDEPS)
	$(OBJCOPY) -R .prefix $< $@

# Generic prefix objects
PREFIXOBJS = $(BIN)/init.o
ZPREFIXOBJS = $(BIN)/init.o $(BIN)/unnrv2b.o

# Utilities
$(BIN)/nrv2b:	util/nrv2b.c
	$(HOST_CC) -O2 -DENCODE -DDECODE -DMAIN -DVERBOSE -DNDEBUG -DBITSIZE=32 -DENDIAN=0 -o $@ $<

ZFILELEN = perl util/zfilelen.pl

# Pattern Rules

# General for compiling/assembly source files

$(BIN)/%.o:	arch/i386/core/%.c $(MAKEDEPS)
	$(CC) $(CFLAGS) -o $@ -c $<

$(BIN)/%.o:	arch/i386/core/%.S $(MAKEDEPS)
	$(CPP) $(CFLAGS) -Ui386 -D ASSEMBLY $< | $(AS) $(ASFLAGS) -o $@

$(BIN)/%.o:	arch/i386/firmware/pcbios/%.c $(MAKEDEPS)
	$(CC) $(CFLAGS) -o $@ -c $<

$(BIN)/%.o:	arch/i386/firmware/pcbios/%.S $(MAKEDEPS)
	$(CPP) $(CFLAGS) -Ui386 -DASSEMBLY $< | $(AS) $(ASFLAGS) -o $@

$(BIN)/%.o:	arch/i386/prefix/%.S $(MAKEDEPS)
	$(CPP) $(CFLAGS) -Ui386 -DASSEMBLY $< | $(AS) $(ASFLAGS) -o $@

$(BIN)/%16.o:	arch/i386/prefix/%.S $(MAKEDEPS)
	$(CPP) $(CFLAGS) -Ui386 -DASSEMBLY -DCODE16 $< | $(AS) $(ASFLAGS) -o $@

# general rule for 16bit .o, may be overridden
$(BIN)/%.o:	$(BIN)/%.s
	$(AS) $(ASFLAGS) -o $@ $<

# general rule for .bin (plain binary loader code), may be overridden
$(BIN)/%.bin:	$(BIN)/%.o
	$(OBJCOPY) -O binary $< $@

# general rule for .z (compressed binary code), may be overridden
# rule for .z is in top level Makefile
# Give the directory name, e.g. use $(BIN)/rtl8139.com as the target.

$(BIN)/%.zo:	$(BIN)/%.zbin arch/i386/core/prefixzdata.lds $(MAKEDEPS)
	$(LD) -T arch/i386/core/prefixzdata.lds -b binary $< -o $@

$(BIN)/%.uo:	$(BIN)/%.bin arch/i386/core/prefixudata.lds $(MAKEDEPS)
	$(LD) -T arch/i386/core/prefixudata.lds -b binary $< -o $@

# Intermediate prf rules

%.prf:  %.rt $(PREFIXOBJS) %.rt1.uo %.rt2.uo $(MAKEDEPS)
	$(MAKE) $(TARGETENTRY)
	$(LD) $(LDFLAGS) -T $(PLDSCRIPT) $(TARGETENTRY) -R $(subst $(MAKEDEPS),,$^)  -o $@ 

%.zprf:  %.rt $(ZPREFIXOBJS) %.rt1.uo %.rt2.zo $(MAKEDEPS)
	$(MAKE) $(TARGETENTRY)
	$(LD) $(LDFLAGS) -T $(PLDSCRIPT) $(TARGETENTRY) -R $(subst $(MAKEDEPS),,$^)  -o $@ 

# general rules for normal/compressed ROM images, may be overridden
SUFFIXES +=	rom zrom

$(BIN)/%.rom.rt: $(BIN)/%.rt.o  $(ISAENTRY) $(PCIENTRY) $(ISAEXIT) $(PCIEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $(romEXIT) $<
	@$(SIZE) $@ | $(CHECKSIZE)

$(BIN)/%.rom: $(BIN)/%.rom.prf
	$(OBJCOPY) -O binary $< $@
	$(MAKEROM) $(MAKEROM_FLAGS) $(MAKEROM_$(ROMCARD)) $(MAKEROM_ID_$(ROMCARD)) -i$(IDENT) $@

$(BIN)/%.zrom: $(BIN)/%.rom.zprf
	$(OBJCOPY) -O binary $< $@
	$(MAKEROM) $(MAKEROM_FLAGS) $(MAKEROM_$(ROMCARD)) $(MAKEROM_ID_$(ROMCARD)) -i$(IDENT) $@

# general rules for ELF images
SUFFIXES +=	elf zelf
$(BIN)/%.elf.rt:  $(BIN)/%.rt.o $(elfENTRY) $(elfEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $(elfEXIT)  $< 

$(BIN)/%.elf: $(BIN)/%.elf.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zelf: $(BIN)/%.elf.zprf 
	$(OBJCOPY) -O binary $< $@

# general rules for Long Mode ELF images
SUFFIXES +=	lmelf zlmelf
$(BIN)/%.lmelf.rt: $(BIN)/%.rt.o $(lmelfENTRY) $(lmelfEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $(lmelfEXIT) $<

$(BIN)/%.lmelf: $(BIN)/%.lmelf.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zlmelf: $(BIN)/%.lmelf.zprf
	$(OBJCOPY) -O binary $< $@

# general rules for ELF dynamic images
SUFFIXES +=	elfd zelfd
$(BIN)/%.elfd.rt: $(BIN)/%.rt.o $(elfdENTRY) $(elfdEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $(elfdEXIT) $<

$(BIN)/%.elfd: $(BIN)/%.elfd.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zelfd: $(BIN)/%.elfd.zprf
	$(OBJCOPY) -O binary $< $@

# general rules for Long Mode ELF dynamic images
SUFFIXES +=	lmelfd zlmelfd
$(BIN)/%.lmelfd.rt: $(BIN)/%.rt.o $(lmelfdENTRY) $(lmelfdEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $(lmelfdEXIT) $<

$(BIN)/%.lmelfd: $(BIN)/%.lmelfd.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zlmelfd: $(BIN)/%.lmelfd.zprf
	$(OBJCOPY) -O binary $< $@

# rules to generate a DOS loadable .com executable
SUFFIXES +=	com
$(BIN)/%.com.rt: $(BIN)/%.rt.o $(comENTRY) $(comEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(comEXIT)

$(BIN)/%.com: $(BIN)/%.com.zprf
	$(OBJCOPY) -O binary $< $@

# rules to generate a DOS loadable .exe executable
SUFFIXES +=	exe
$(BIN)/%.exe.rt: $(BIN)/%.rt.o $(exeENTRY) $(exeEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(exeEXIT)
	@$(SIZE) $@ | $(CHECKSIZE)

$(BIN)/%.exe: $(BIN)/%.exe.prf
	$(OBJCOPY) -O binary $< $@

# rules to make a LILO loadable image
SUFFIXES +=	lilo zlilo

$(BIN)/%.lilo.rt: $(BIN)/%.rt.o $(liloENTRY) $(liloEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(liloEXIT)
	@$(SIZE) $@ | $(CHECKSIZE)

$(BIN)/%.lilo: $(BIN)/%.lilo.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zlilo: $(BIN)/%.lilo.zprf
	$(OBJCOPY) -O binary $< $@

# rules to make big linux boot protocol image
SUFFIXES +=	bImage bzImage

$(BIN)/%.bImage.rt: $(BIN)/%.rt.o $(bImageENTRY) $(bImageEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(bImageEXIT)

$(BIN)/%.bImage: $(BIN)/%.bImage.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.bzImage: $(BIN)/%.bImage.zprf
	$(OBJCOPY) -O binary $< $@


# rules to generate a PXE loadable image
SUFFIXES +=	pxe zpxe

$(BIN)/%.pxe.rt: $(BIN)/%.rt.o $(pxeENTRY) $(pxeEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(pxeEXIT)
	@$(SIZE) $@ | $(CHECKSIZE)

$(BIN)/%.pxe: $(BIN)/%.pxe.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zpxe: $(BIN)/%.pxe.zprf
	$(OBJCOPY) -O binary $< $@

# rules to generate the .dsk/.zdsk floppy images
SUFFIXES +=	dsk zdsk

$(BIN)/%.dsk.rt: $(BIN)/%.rt.o $(dskENTRY) $(dskEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(dskEXIT)
	@$(SIZE) $@ | $(CHECKSIZE)

$(BIN)/%.dsk: $(BIN)/%.dsk.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zdsk: $(BIN)/%.dsk.zprf
	$(OBJCOPY) -O binary $< $@

# rules to write the .dsk/.zdsk image onto a blank floppy
SUFFIXES +=	fd0 zfd0
%.fd0:	%.dsk
	dd if=$< bs=512 conv=sync of=/dev/fd0
	sync

%.zfd0:	%.zdsk
	dd if=$< bs=512 conv=sync of=/dev/fd0
	sync

# rules to create raw executable images
SUFFIXES +=	raw zraw
$(BIN)/%.raw.rt: $(BIN)/%.rt.o $(rawENTRY) $(rawEXIT) $(LDSCRIPT) $(MAKEDEPS)
	$(LD) $(LDFLAGS) -T $(LDSCRIPT) -o $@ $< $(rawEXIT)

$(BIN)/%.raw: $(BIN)/%.raw.prf
	$(OBJCOPY) -O binary $< $@

$(BIN)/%.zraw: $(BIN)/%.raw.zprf
	$(OBJCOPY) -O binary $< $@

# rule to make a non-emulation ISO boot image
SUFFIXES +=	iso
%.iso:	util/geniso %.zlilo
	ISOLINUX_BIN=${ISOLINUX_BIN} bash util/geniso $*.iso $*.zlilo

# rule to make a floppy emulation ISO boot image
SUFFIXES +=	liso
%.liso:	util/genliso %.zlilo
	bash util/genliso $*.liso $*.zlilo