#
# 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 := syscalls.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 += syscalls.list
targets += SYSCALLS.i syscalls.nrs
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

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

# Create list of all files
$(obj)/syscalls.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) $(KLIBCSRC)/syscalls.pl -1 $(obj)/SYSCALLS.i   \
                             $(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph    \
                             $(KLIBCARCH) $(KLIBCBITSIZE) $(obj)/syscalls.nrs \
                             $(obj)                                         \
                             $(KLIBCINC)/klibc/havesyscall.h 		    \
			     $(obj)/typesize.c > $@                      \
                             || rm -f $@

$(obj)/typesize.c: $(KLIBCSRC)/syscalls.pl $(obj)/SYSCALLS.i \
                      $(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph \
                      $(call objectify, $(syscall-objs:.o=.S)) \
                      $(src)/syscommon.h $(obj)/syscalls.nrs
	$(call cmd,syscalsz)

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

$(obj)/typesize.bin: $(obj)/typesize.o
	$(call cmd,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) $(KLIBCSRC)/syscalls.pl -2 $(obj)/SYSCALLS.i   \
                             $(KLIBCSRC)/arch/$(KLIBCARCHDIR)/sysstub.ph    \
                             $(KLIBCARCH) $(KLIBCBITSIZE) $(obj)/syscalls.nrs \
                             $(obj)                                         \
                             $(KLIBCINC)/klibc/havesyscall.h 		    \
			     $(obj)/typesize.bin > $@                    \
                             || rm -f $@

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