#
# kbuild file for generating syscall stubs
#

# Include automatically generated Makefile fragment.
# It contains definition of syscall-objs specifying name of all .o files
ifeq ($(clean),)
-include $(obj)/syscalls.mk
endif

# Listing of all .o files
always := klib.list


#####
# Generate syscalls stubs
# Based on list in SYSCALLS.def generate stubs for sys calls. Actual arch code
# is defined in an arch specific perl file
targets += syscalls.mk
targets += klib.list
targets += SYSCALLS.i syscalls.nrs
targets += typesize.c typesize.o typesize.bin
targets += $(syscall-objs)

# Side effect of running syscalls.pl
clean-files += $(objtree)/$(KLIBCINC)/klibc/havesyscall.h
clean-files += $(KLIBCINC)/klibc/havesyscall.h
# All the syscall stubs
clean-files += *.o *.S *.c *.list *.bin

EXTRA_KLIBCCFLAGS := -I$(srctree)/$(src)

quiet_cmd_makelist = LIST    $@
      cmd_makelist = echo '$(filter-out FORCE,$^)' > $@

# Create list of all files
$(obj)/klib.list: $(call objectify,$(syscall-objs)) FORCE
	$(call if_changed,makelist)

# Generate assembler file (.i)
# We pass -ansi to keep cpp from define e.g. "i386" as well as "__i386__"
quiet_cmd_syscall.i = GEN     $@
      cmd_syscall.i = $(KLIBCCC) $(klibccflags) -D__ASSEMBLY__ \
                                -ansi -x c -E -o $@ $<
$(obj)/SYSCALLS.i: $(KLIBCSRC)/SYSCALLS.def FORCE
	$(call if_changed_dep,syscall.i)

# Get syscalls numbers
quiet_cmd_syscall.nrs = GEN     $@
      cmd_syscall.nrs = $(KLIBCCC) $(klibccflags) -Wp,-dM -x c -E -o $@ $<
$(obj)/syscalls.nrs: $(KLIBCINC)/sys/syscall.h FORCE
	$(call if_changed_dep,syscall.nrs)

# Generate typesize.c
quiet_cmd_syscalsz = GEN     $@
      cmd_syscalsz = \
            mkdir -p $(KLIBCINC)/klibc/;                                    \
            $(PERL) $(srctree)/$(KLIBCSRC)/syscalls.pl                      \
                  -1 $(obj)/SYSCALLS.i                                      \
                  $(srctree)/$(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph    \
                  $(KLIBCARCH) $(KLIBCBITSIZE) $(obj)/syscalls.nrs          \
                  $(obj)                                                    \
                  $(KLIBCINC)/klibc/havesyscall.h                           \
                  $(obj)/typesize.c > $@                                    \
                  || ( rm -f $@ ; exit 1 )

$(obj)/typesize.c: $(srctree)/$(KLIBCSRC)/syscalls.pl $(obj)/SYSCALLS.i     \
                   $(srctree)/$(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph   \
                   $(src)/syscommon.h $(obj)/syscalls.nrs FORCE
	$(call if_changed,syscalsz)

# Convert typesize.o to typesize.bin
quiet_cmd_mkbin = OBJCOPY $@
      cmd_mkbin = $(KLIBCOBJCOPY) -O binary $< $@

$(obj)/typesize.bin: $(obj)/typesize.o FORCE
	$(call if_changed,mkbin)

# Generate $(KLIBINC)/klibc/havesyscall.h + makefile fragment
# Using sysstub.pl in arch dir generate all .S files
quiet_cmd_syscalls = GEN     $@
      cmd_syscalls = \
            mkdir -p $(KLIBCINC)/klibc/;                                    \
            $(PERL) $(srctree)/$(KLIBCSRC)/syscalls.pl -2 $(obj)/SYSCALLS.i \
                  $(srctree)/$(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph    \
                  $(KLIBCARCH) $(KLIBCBITSIZE) $(obj)/syscalls.nrs          \
                  $(obj)                                                    \
                  $(KLIBCINC)/klibc/havesyscall.h                           \
                  $(obj)/typesize.bin > $@                                  \
                  || ( rm -f $@ ; exit 1 )

$(obj)/syscalls.mk: $(srctree)/$(KLIBCSRC)/syscalls.pl $(obj)/SYSCALLS.i   \
                    $(srctree)/$(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph \
                    $(call objectify, $(syscall-objs:.o=.S))               \
                    $(src)/syscommon.h $(obj)/syscalls.nrs                 \
                    $(obj)/typesize.bin FORCE
	$(call if_changed,syscalls)

PHONY += FORCE
