You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2020/06/25 08:30:06 UTC

[incubator-nuttx] branch feature/syscall-instrumentation updated (d24bd78 -> 159b7b4)

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a change to branch feature/syscall-instrumentation
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git.


    from d24bd78  libc: Implement pathconf and fpathconf
     new b064bff  Create wrapper library for system call instrumentation
     new bb4255f  Fix note type id for syscall enter/leave
     new 159b7b4  Syscall instrumentation build system support for Arm and RISC-V

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 arch/Kconfig                                       |   2 +
 arch/arm/src/Makefile                              |   8 +-
 arch/risc-v/src/Makefile                           |   8 +-
 arch/risc-v/src/common/riscv_initialize.c          |   6 +
 sched/Kconfig                                      |   2 +-
 sched/sched/sched_note.c                           |   4 +-
 syscall/.gitignore                                 |   1 +
 syscall/Makefile                                   |  36 ++-
 .../ez80/ez80_clock.c => syscall/syscall_names.c   |  24 +-
 .../src/litex/chip.h => syscall/syscall_wraps.h    |  17 +-
 syscall/{stubs => wraps}/.gitignore                |   0
 {libs/libc/errno => syscall/wraps}/Make.defs       |   9 +-
 tools/Directories.mk                               |   5 +
 tools/FlatLibs.mk                                  |   6 +
 tools/KernelLibs.mk                                |   6 +
 tools/LibTargets.mk                                |   6 +
 tools/ProtectedLibs.mk                             |   6 +
 tools/mksyscall.c                                  | 310 ++++++++++++++++++++-
 18 files changed, 426 insertions(+), 30 deletions(-)
 copy arch/z80/src/ez80/ez80_clock.c => syscall/syscall_names.c (72%)
 copy arch/risc-v/src/litex/chip.h => syscall/syscall_wraps.h (82%)
 copy syscall/{stubs => wraps}/.gitignore (100%)
 copy {libs/libc/errno => syscall/wraps}/Make.defs (88%)


[incubator-nuttx] 03/03: Syscall instrumentation build system support for Arm and RISC-V

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch feature/syscall-instrumentation
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 159b7b49087c9a203dafc0597a07678419432ba8
Author: Nakamura, Yuuichi <Yu...@sony.com>
AuthorDate: Tue Jun 16 12:16:17 2020 +0900

    Syscall instrumentation build system support for Arm and RISC-V
---
 arch/Kconfig                              | 2 ++
 arch/arm/src/Makefile                     | 8 +++++++-
 arch/risc-v/src/Makefile                  | 8 +++++++-
 arch/risc-v/src/common/riscv_initialize.c | 6 ++++++
 sched/Kconfig                             | 2 +-
 5 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 21e3f5d..d49d844 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -14,6 +14,7 @@ config ARCH_ARM
 	select ARCH_HAVE_STACKCHECK
 	select ARCH_HAVE_CUSTOMOPT
 	select ARCH_HAVE_STDARG_H
+	select ARCH_HAVE_SYSCALL_HOOKS
 	---help---
 		The ARM architectures
 
@@ -60,6 +61,7 @@ config ARCH_RISCV
 	select ARCH_HAVE_STACKCHECK
 	select ARCH_HAVE_CUSTOMOPT
 	select ARCH_HAVE_STDARG_H
+	select ARCH_HAVE_SYSCALL_HOOKS
 	---help---
 		RISC-V 32 and 64-bit RV32 / RV64 architectures.
 
diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile
index 0066baa..1c28a2c 100644
--- a/arch/arm/src/Makefile
+++ b/arch/arm/src/Makefile
@@ -69,6 +69,12 @@ else
   NUTTX = "$(TOPDIR)$(DELIM)nuttx$(EXEEXT)"
 endif
 
+# Additional rules for system call wrapper
+
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+  EXTRALINKCMDS += @$(TOPDIR)/syscall/syscall_wraps.ldcmd
+endif
+
 # The "head" object
 
 HEAD_OBJ = $(HEAD_ASRC:.S=$(OBJEXT))
@@ -99,7 +105,7 @@ UOBJS = $(UAOBJS) $(UCOBJS)
 KBIN = libkarch$(LIBEXT)
 BIN  = libarch$(LIBEXT)
 
-LDFLAGS += $(ARCHSCRIPT)
+LDFLAGS += $(ARCHSCRIPT) $(EXTRALINKCMDS)
 
 # Override in Make.defs if linker is not 'ld'
 
diff --git a/arch/risc-v/src/Makefile b/arch/risc-v/src/Makefile
index 1ba7a6e..806eeec 100644
--- a/arch/risc-v/src/Makefile
+++ b/arch/risc-v/src/Makefile
@@ -66,6 +66,12 @@ else
   NUTTX = "$(TOPDIR)$(DELIM)nuttx$(EXEEXT)"
 endif
 
+# Additional rules for system call wrapper
+
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+  EXTRALINKCMDS += @$(TOPDIR)/syscall/syscall_wraps.ldcmd
+endif
+
 # The "head" object
 
 HEAD_OBJ = $(HEAD_ASRC:.S=$(OBJEXT))
@@ -96,7 +102,7 @@ UOBJS = $(UAOBJS) $(UCOBJS)
 KBIN = libkarch$(LIBEXT)
 BIN  = libarch$(LIBEXT)
 
-LDFLAGS += $(ARCHSCRIPT)
+LDFLAGS += $(ARCHSCRIPT) $(EXTRALINKCMDS)
 
 LDSTARTGROUP ?= --start-group
 LDENDGROUP ?= --end-group
diff --git a/arch/risc-v/src/common/riscv_initialize.c b/arch/risc-v/src/common/riscv_initialize.c
index c21353f..b2cea94 100644
--- a/arch/risc-v/src/common/riscv_initialize.c
+++ b/arch/risc-v/src/common/riscv_initialize.c
@@ -44,6 +44,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/board.h>
+#include <nuttx/sched_note.h>
 #include <nuttx/serial/pty.h>
 #include <nuttx/syslog/syslog_console.h>
 #include <nuttx/drivers/drivers.h>
@@ -144,6 +145,11 @@ void up_initialize(void)
   devzero_register();   /* Standard /dev/zero */
 #endif
 
+#if defined(CONFIG_SCHED_INSTRUMENTATION_BUFFER) && \
+    defined(CONFIG_DRIVER_NOTE)
+  note_register();    /* Non-standard /dev/note */
+#endif
+
   /* Initialize the serial device driver */
 
 #ifdef USE_SERIALDRIVER
diff --git a/sched/Kconfig b/sched/Kconfig
index 460b58a..f57bb4a 100644
--- a/sched/Kconfig
+++ b/sched/Kconfig
@@ -975,7 +975,7 @@ config SCHED_INSTRUMENTATION_SPINLOCKS
 config SCHED_INSTRUMENTATION_SYSCALL
 	bool "System call monitor hooks"
 	default n
-	depends on LIB_SYSCALL && ARCH_HAVE_SYSCALL_HOOKS
+	depends on ARCH_HAVE_SYSCALL_HOOKS
 	---help---
 		Enables additional hooks for entry and exit from system call.
 		Board-specific logic must provide this additional logic.


[incubator-nuttx] 01/03: Create wrapper library for system call instrumentation

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch feature/syscall-instrumentation
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit b064bffb61adade2df03c2454c555376471cbbf2
Author: Nakamura, Yuuichi <Yu...@sony.com>
AuthorDate: Tue Jun 16 12:16:05 2020 +0900

    Create wrapper library for system call instrumentation
---
 syscall/.gitignore       |   1 +
 syscall/Makefile         |  36 +++++-
 syscall/syscall_names.c  |  48 ++++++++
 syscall/syscall_wraps.h  |  37 ++++++
 syscall/wraps/.gitignore |   1 +
 syscall/wraps/Make.defs  |  21 ++++
 tools/Directories.mk     |   5 +
 tools/FlatLibs.mk        |   6 +
 tools/KernelLibs.mk      |   6 +
 tools/LibTargets.mk      |   6 +
 tools/ProtectedLibs.mk   |   6 +
 tools/mksyscall.c        | 310 ++++++++++++++++++++++++++++++++++++++++++++++-
 12 files changed, 478 insertions(+), 5 deletions(-)

diff --git a/syscall/.gitignore b/syscall/.gitignore
index eaefd7c..70bb8f7 100644
--- a/syscall/.gitignore
+++ b/syscall/.gitignore
@@ -1 +1,2 @@
 /.context
+/*.ldcmd
diff --git a/syscall/Makefile b/syscall/Makefile
index 475349a..7a283eb 100644
--- a/syscall/Makefile
+++ b/syscall/Makefile
@@ -37,18 +37,27 @@ include $(TOPDIR)/Make.defs
 
 include proxies/Make.defs
 include stubs/Make.defs
+include wraps/Make.defs
 
 MKSYSCALL = "$(TOPDIR)$(DELIM)tools$(DELIM)mksyscall$(HOSTEXEEXT)"
 CSVFILE = "$(TOPDIR)$(DELIM)syscall$(DELIM)syscall.csv"
 
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+ifeq ($(CONFIG_LIB_SYSCALL),y)
+PROXY_SRCS += syscall_names.c
+else
+WRAP_SRCS += syscall_names.c
+endif
+endif
 STUB_SRCS += syscall_funclookup.c syscall_stublookup.c syscall_nparms.c
 
 AOBJS = $(ASRCS:.S=$(OBJEXT))
 
 PROXY_OBJS = $(PROXY_SRCS:.c=$(OBJEXT))
 STUB_OBJS = $(STUB_SRCS:.c=$(OBJEXT))
+WRAP_OBJS = $(WRAP_SRCS:.c=$(OBJEXT))
 
-CSRCS = $(PROXY_SRCS) $(STUB_SRCS)
+CSRCS = $(PROXY_SRCS) $(STUB_SRCS) $(WRAP_SRCS)
 COBJS = $(CSRCS:.c=$(OBJEXT))
 
 SRCS = $(ASRCS) $(CSRCS)
@@ -56,12 +65,15 @@ OBJS = $(AOBJS) $(COBJS)
 
 PROXYDEPPATH = --dep-path proxies
 STUBDEPPATH = --dep-path stubs
-VPATH = proxies:stubs
+WRAPDEPPATH = --dep-path wraps
+VPATH = proxies:stubs:wraps
 
 BIN1 = libproxies$(LIBEXT)
 BIN2 = libstubs$(LIBEXT)
+BIN3 = libwraps$(LIBEXT)
+SYSCALLWRAPS = syscall_wraps.ldcmd
 
-all: $(BIN1) $(BIN2)
+all: $(BIN1) $(BIN2) $(BIN3) $(SYSCALLWRAPS)
 .PHONY: context depend clean distclean
 
 $(AOBJS): %$(OBJEXT): %.S
@@ -76,8 +88,13 @@ $(BIN1): $(PROXY_OBJS)
 $(BIN2): $(STUB_OBJS)
 	$(call ARCHIVE, $@, $(STUB_OBJS))
 
+$(BIN3): $(WRAP_OBJS)
+	$(call ARCHIVE, $@, $(WRAP_OBJS))
+
+$(SYSCALLWRAPS): .context
+
 .depend: Makefile $(SRCS)
-	$(Q) $(MKDEP) $(PROXYDEPPATH) $(STUBDEPPATH) \
+	$(Q) $(MKDEP) $(PROXYDEPPATH) $(STUBDEPPATH) $(WRAPDEPPATH) \
 	  "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep
 	$(Q) touch $@
 
@@ -85,8 +102,15 @@ depend: .depend
 
 .context: syscall.csv
 	$(Q) $(MAKE) -C $(TOPDIR)$(DELIM)tools -f Makefile.host mksyscall
+ifeq ($(CONFIG_LIB_SYSCALL),y)
 	$(Q) (cd proxies; $(MKSYSCALL) -p $(CSVFILE);)
 	$(Q) (cd stubs; $(MKSYSCALL) -s $(CSVFILE);)
+endif
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+	$(Q) (cd wraps; $(MKSYSCALL) -w $(CSVFILE);)
+	$(Q) $(CPP) $(CPPFLAGS) $(SYSCALLWRAPS:.ldcmd=.h) | \
+	  sed -e '1,/WRAPOPTSTARTS/d' -e '/^#/d' > $(SYSCALLWRAPS)
+endif
 	$(Q) touch $@
 
 context: .context
@@ -94,9 +118,11 @@ context: .context
 clean:
 	$(call DELFILE, $(BIN1))
 	$(call DELFILE, $(BIN2))
+	$(call DELFILE, $(BIN3))
 ifneq ($(OBJEXT),)
 	$(call DELFILE, proxies$(DELIM)*$(OBJEXT))
 	$(call DELFILE, stubs$(DELIM)*$(OBJEXT))
+	$(call DELFILE, wraps$(DELIM)*$(OBJEXT))
 endif
 	$(call CLEAN)
 
@@ -106,5 +132,7 @@ distclean: clean
 	$(call DELFILE, .depend)
 	$(call DELFILE, proxies$(DELIM)*.c)
 	$(call DELFILE, stubs$(DELIM)*.c)
+	$(call DELFILE, wraps$(DELIM)*.c)
+	$(call DELFILE, $(SYSCALLWRAPS))
 
 -include Make.dep
diff --git a/syscall/syscall_names.c b/syscall/syscall_names.c
new file mode 100644
index 0000000..b4005fe
--- /dev/null
+++ b/syscall/syscall_names.c
@@ -0,0 +1,48 @@
+/****************************************************************************
+ * syscall/syscall_names.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#ifndef CONFIG_LIB_SYSCALL
+#define CONFIG_LIB_SYSCALL
+#endif
+#include <syscall.h>
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* System call name tables.  This table is indexed by the system call numbers
+ * defined above.  Given the system call number, this table provides the
+ * name of the corresponding system function.
+ */
+
+const char *g_funcnames[SYS_nsyscalls] =
+{
+#  define SYSCALL_LOOKUP1(f,n) #f
+#  define SYSCALL_LOOKUP(f,n)  , #f
+#  include <sys/syscall_lookup.h>
+#  undef SYSCALL_LOOKUP1
+#  undef SYSCALL_LOOKUP
+};
diff --git a/syscall/syscall_wraps.h b/syscall/syscall_wraps.h
new file mode 100644
index 0000000..0bc130e
--- /dev/null
+++ b/syscall/syscall_wraps.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+ * syscall/syscall_wraps.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/arch.h>
+
+#ifndef UP_WRAPOPT
+#define UP_WRAPOPT(f) --wrap f
+#endif
+
+#define SYSCALL_LOOKUP1(f,n) UP_WRAPOPT(f)
+#define SYSCALL_LOOKUP(f,n)  UP_WRAPOPT(f)
+
+WRAPOPTSTARTS
+
+#include <sys/syscall_lookup.h>
diff --git a/syscall/wraps/.gitignore b/syscall/wraps/.gitignore
new file mode 100644
index 0000000..b5a455a
--- /dev/null
+++ b/syscall/wraps/.gitignore
@@ -0,0 +1 @@
+/*.c
diff --git a/syscall/wraps/Make.defs b/syscall/wraps/Make.defs
new file mode 100644
index 0000000..9643b58
--- /dev/null
+++ b/syscall/wraps/Make.defs
@@ -0,0 +1,21 @@
+############################################################################
+# syscall/wraps/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+WRAP_SRCS := ${shell cd wraps; ls *.c 2>/dev/null }
diff --git a/tools/Directories.mk b/tools/Directories.mk
index f63fb03..f6c0602 100644
--- a/tools/Directories.mk
+++ b/tools/Directories.mk
@@ -99,8 +99,13 @@ ifeq ($(CONFIG_LIB_SYSCALL),y)
 CONTEXTDIRS += syscall
 USERDEPDIRS += syscall
 else
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+CONTEXTDIRS += syscall
+USERDEPDIRS += syscall
+else
 CLEANDIRS += syscall
 endif
+endif
 
 ifeq ($(CONFIG_LIB_ZONEINFO_ROMFS),y)
 CONTEXTDIRS += libs$(DELIM)libc
diff --git a/tools/FlatLibs.mk b/tools/FlatLibs.mk
index 5e115ae..657481f 100644
--- a/tools/FlatLibs.mk
+++ b/tools/FlatLibs.mk
@@ -62,6 +62,12 @@ NUTTXLIBS += staging$(DELIM)libstubs$(LIBEXT)
 USERLIBS  += staging$(DELIM)libproxies$(LIBEXT)
 endif
 
+# Add library for system call instrumentation if needed
+
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+NUTTXLIBS += staging$(DELIM)libwraps$(LIBEXT)
+endif
+
 # Add libraries for two pass build support.  The special directory pass1
 # may be populated so that application generated logic can be included into
 # the kernel build
diff --git a/tools/KernelLibs.mk b/tools/KernelLibs.mk
index 93c4b12..e50da99 100644
--- a/tools/KernelLibs.mk
+++ b/tools/KernelLibs.mk
@@ -59,6 +59,12 @@ NUTTXLIBS += staging$(DELIM)libkmm$(LIBEXT) staging$(DELIM)libkarch$(LIBEXT)
 USERLIBS  += staging$(DELIM)libproxies$(LIBEXT) staging$(DELIM)libc$(LIBEXT)
 USERLIBS  += staging$(DELIM)libmm$(LIBEXT) staging$(DELIM)libarch$(LIBEXT)
 
+# Add library for system call instrumentation if needed
+
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+NUTTXLIBS += staging$(DELIM)libwraps$(LIBEXT)
+endif
+
 # Add libraries for C++ support.  CXX, CXXFLAGS, and COMPILEXX must
 # be defined in Make.defs for this to work!
 
diff --git a/tools/LibTargets.mk b/tools/LibTargets.mk
index 39c8399..dc15531 100644
--- a/tools/LibTargets.mk
+++ b/tools/LibTargets.mk
@@ -148,6 +148,12 @@ syscall$(DELIM)libstubs$(LIBEXT): pass2dep
 staging$(DELIM)libstubs$(LIBEXT): syscall$(DELIM)libstubs$(LIBEXT)
 	$(Q) $(call INSTALL_LIB,$<,$@)
 
+syscall$(DELIM)libwraps$(LIBEXT): pass2dep
+	$(Q) $(MAKE) -C syscall TOPDIR="$(TOPDIR)" libwraps$(LIBEXT) EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)"
+
+staging$(DELIM)libwraps$(LIBEXT): syscall$(DELIM)libwraps$(LIBEXT)
+	$(Q) $(call INSTALL_LIB,$<,$@)
+
 # Special case
 
 ifeq ($(CONFIG_BUILD_FLAT),y)
diff --git a/tools/ProtectedLibs.mk b/tools/ProtectedLibs.mk
index 816bd7d..306b53e 100644
--- a/tools/ProtectedLibs.mk
+++ b/tools/ProtectedLibs.mk
@@ -60,6 +60,12 @@ NUTTXLIBS += staging$(DELIM)libkmm$(LIBEXT) staging$(DELIM)libkarch$(LIBEXT)
 USERLIBS  += staging$(DELIM)libproxies$(LIBEXT) staging$(DELIM)libc$(LIBEXT)
 USERLIBS  += staging$(DELIM)libmm$(LIBEXT) staging$(DELIM)libarch$(LIBEXT)
 
+# Add library for system call instrumentation if needed
+
+ifeq ($(CONFIG_SCHED_INSTRUMENTATION_SYSCALL),y)
+NUTTXLIBS += staging$(DELIM)libwraps$(LIBEXT)
+endif
+
 # Add libraries for two pass build support.  The special directory pass1
 # may be populated so that application generated logic can be included into
 # the kernel build
diff --git a/tools/mksyscall.c b/tools/mksyscall.c
index f87e374..bd2f942 100644
--- a/tools/mksyscall.c
+++ b/tools/mksyscall.c
@@ -520,6 +520,304 @@ static void generate_stub(int nfixed, int nparms)
   stub_close(stream);
 }
 
+static FILE *open_wrapper(void)
+{
+  char filename[MAX_PARMSIZE + 8];
+  FILE *stream;
+
+  snprintf(filename, MAX_PARMSIZE + 7, "WRAP_%s.c", g_parm[NAME_INDEX]);
+  filename[MAX_PARMSIZE + 7] = '\0';
+
+  stream = fopen(filename, "w");
+
+  if (stream == NULL)
+    {
+      fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno));
+      exit(10);
+    }
+
+  return stream;
+}
+
+static void generate_wrapper(int nfixed, int nparms)
+{
+  FILE *stream = open_wrapper();
+  char formal[MAX_PARMSIZE];
+  char actual[MAX_PARMSIZE];
+  char fieldname[MAX_PARMSIZE];
+  int i;
+
+  /* Generate "up-front" information, include correct header files */
+
+  fprintf(stream, "/* Auto-generated %s wrap file -- do not edit */\n\n",
+          g_parm[NAME_INDEX]);
+  fprintf(stream, "#include <nuttx/config.h>\n");
+  fprintf(stream, "#include <nuttx/sched_note.h>\n");
+  fprintf(stream, "#include <stdint.h>\n");
+
+  /* Suppress "'noreturn' function does return" warnings. */
+
+  fprintf(stream, "#include <nuttx/compiler.h>\n");
+  fprintf(stream, "#undef noreturn_function\n");
+  fprintf(stream, "#define noreturn_function\n");
+
+  /* CONFIG_LIB_SYSCALL must be defined to get syscall number */
+
+  fprintf(stream, "#undef CONFIG_LIB_SYSCALL\n");
+  fprintf(stream, "#define CONFIG_LIB_SYSCALL\n");
+  fprintf(stream, "#include <syscall.h>\n");
+
+  /* Does this function have a variable number of parameters?  If so then the
+   * final parameter type will be encoded as "..."
+   */
+
+  if (nfixed != nparms)
+    {
+      fprintf(stream, "#include <stdarg.h>\n");
+    }
+
+  if (g_parm[HEADER_INDEX] && strlen(g_parm[HEADER_INDEX]) > 0)
+    {
+      fprintf(stream, "#include <%s>\n", g_parm[HEADER_INDEX]);
+    }
+
+  /* Define macros to get wrapper symbol */
+
+  fprintf(stream, "#include <nuttx/arch.h>\n");
+  fprintf(stream, "#ifndef UP_WRAPSYM\n");
+  fprintf(stream, "#define UP_WRAPSYM(s) __wrap_##s\n");
+  fprintf(stream, "#endif\n");
+  fprintf(stream, "#ifndef UP_REALSYM\n");
+  fprintf(stream, "#define UP_REALSYM(s) __real_##s\n");
+  fprintf(stream, "#endif\n\n");
+
+  if (g_parm[COND_INDEX][0] != '\0')
+    {
+      fprintf(stream, "#if %s\n\n", g_parm[COND_INDEX]);
+    }
+
+  /* Generate the wrapper function definition that matches standard function
+   * prototype
+   */
+
+  fprintf(stream, "%s UP_WRAPSYM(%s)(", g_parm[RETTYPE_INDEX],
+          g_parm[NAME_INDEX]);
+
+  /* Generate the formal parameter list */
+
+  if (nparms <= 0)
+    {
+      fprintf(stream, "void");
+    }
+  else
+    {
+      for (i = 0; i < nfixed; i++)
+        {
+          /* The formal and actual parameter types may be encoded.. extra the
+           * formal parameter type.
+           */
+
+          get_formalparmtype(g_parm[PARM1_INDEX + i], formal);
+
+          /* Arguments after the first must be separated from the preceding
+           * parameter with a comma.
+           */
+
+          if (i > 0)
+            {
+              fprintf(stream, ", ");
+            }
+
+          print_formalparm(stream, formal, i + 1);
+        }
+    }
+
+  if (i < nparms)
+    {
+       fprintf(stream, ", ...)\n{\n");
+    }
+  else
+    {
+      fprintf(stream, ")\n{\n");
+    }
+
+  /* Generate the result variable definition for non-void function */
+
+  if (strcmp(g_parm[RETTYPE_INDEX], "void") != 0)
+    {
+      fprintf(stream, "  %s result;\n", g_parm[RETTYPE_INDEX]);
+    }
+
+  /* Generate the wrapped (real) function prototype definition */
+
+  fprintf(stream, "  %s UP_REALSYM(%s)(", g_parm[RETTYPE_INDEX],
+          g_parm[NAME_INDEX]);
+
+  /* Generate the formal parameter list */
+
+  if (nparms <= 0)
+    {
+      fprintf(stream, "void");
+    }
+  else
+    {
+      for (i = 0; i < nfixed; i++)
+        {
+          /* The formal and actual parameter types may be encoded.. extra the
+           * formal parameter type.
+           */
+
+          get_formalparmtype(g_parm[PARM1_INDEX + i], formal);
+
+          /* Arguments after the first must be separated from the preceding
+           * parameter with a comma.
+           */
+
+          if (i > 0)
+            {
+              fprintf(stream, ", ");
+            }
+
+          fprintf(stream, "%s", formal);
+        }
+    }
+
+  /* Handle the end of the formal parameter list */
+
+  if (i < nparms)
+    {
+      fprintf(stream, ", ...);\n");
+
+      /* Get parm variables .. some from the parameter list and others from
+       * the varargs.
+       */
+
+      fprintf(stream, "  va_list ap;\n");
+      for (; i < nparms; i++)
+        {
+          get_formalparmtype(g_parm[PARM1_INDEX + i], formal);
+          fprintf(stream, "  %s parm%d;\n", formal, i + 1);
+        }
+
+      fprintf(stream, "\n  va_start(ap, parm%d);\n", nfixed);
+
+      for (i = nfixed; i < nparms; i++)
+        {
+          get_formalparmtype(g_parm[PARM1_INDEX + i], formal);
+          get_actualparmtype(g_parm[PARM1_INDEX + i], actual);
+
+          if (is_union(formal))
+            {
+              fprintf(stream, "  parm%d = (%s)va_arg(ap, %s);\n",
+                      i + 1, formal, actual);
+            }
+          else
+            {
+              fprintf(stream, "  parm%d = va_arg(ap, %s);\n", i + 1, actual);
+            }
+        }
+
+      fprintf(stream, "  va_end(ap);\n");
+    }
+  else
+    {
+      fprintf(stream, ");\n");
+    }
+
+  /* Call system call enter hook function */
+
+  fprintf(stream, "\n  sched_note_syscall_enter(SYS_%s, %d",
+          g_parm[NAME_INDEX], nparms);
+
+  for (i = 0; i < nparms; i++)
+    {
+      /* Is the parameter a union member */
+
+      if (is_union(g_parm[PARM1_INDEX + i]))
+        {
+          /* Then we will have to pick a field name that can be cast to a
+           * uintptr_t.  There probably should be some error handling here<
+           * to catch the case where the fieldname was not supplied.
+           */
+
+          get_fieldname(g_parm[PARM1_INDEX + i], fieldname);
+          fprintf(stream, ", (uintptr_t)parm%d.%s", i + 1, fieldname);
+        }
+      else
+        {
+          fprintf(stream, ", (uintptr_t)parm%d", i + 1);
+        }
+    }
+
+  fprintf(stream, ");\n\n");
+
+  /* Then call the wrapped (real) function.  Functions that have no return
+   * value are a special case.
+   */
+
+  if (strcmp(g_parm[RETTYPE_INDEX], "void") == 0)
+    {
+      fprintf(stream, "  UP_REALSYM(%s)(", g_parm[NAME_INDEX]);
+    }
+  else
+    {
+      fprintf(stream, "  result = UP_REALSYM(%s)(", g_parm[NAME_INDEX]);
+    }
+
+  /* The pass all of the system call parameters */
+
+  for (i = 0; i < nparms; i++)
+    {
+      /* Treat the first argument in the list differently from the others..
+       * It does not need a comma before it.
+       */
+
+      if (i > 0)
+        {
+          fprintf(stream, ", ");
+        }
+
+      fprintf(stream, "parm%d", i + 1);
+    }
+
+  fprintf(stream, ");\n\n");
+
+  /* Call system call leave hook function */
+
+  fprintf(stream, "  sched_note_syscall_leave(SYS_%s, ", g_parm[NAME_INDEX]);
+
+  if (strcmp(g_parm[RETTYPE_INDEX], "void") == 0)
+    {
+      fprintf(stream, "0");
+    }
+  else
+    {
+      fprintf(stream, "(uintptr_t)result");
+    }
+
+  fprintf(stream, ");\n\n");
+
+  /* Tail end of the function.  If the wrapped (real) function has no return
+   * value, do nothing.
+   */
+
+  if (strcmp(g_parm[RETTYPE_INDEX], "void") == 0)
+    {
+      fprintf(stream, "}\n");
+    }
+  else
+    {
+      fprintf(stream, "  return result;\n}\n");
+    }
+
+  if (g_parm[COND_INDEX][0] != '\0')
+    {
+      fprintf(stream, "\n#endif /* %s */\n", g_parm[COND_INDEX]);
+    }
+
+  fclose(stream);
+}
+
 static void show_usage(const char *progname)
 {
   fprintf(stderr, "USAGE: %s [-p|s|i] <CSV file>\n\n", progname);
@@ -527,6 +825,7 @@ static void show_usage(const char *progname)
   fprintf(stderr, "\t-p : Generate proxies\n");
   fprintf(stderr, "\t-s : Generate stubs\n");
   fprintf(stderr, "\t-i : Generate proxies as static inline functions\n");
+  fprintf(stderr, "\t-w : Generate wrappers\n");
   fprintf(stderr, "\t-d : Enable debug output\n");
   exit(1);
 }
@@ -539,6 +838,7 @@ int main(int argc, char **argv, char **envp)
 {
   char *csvpath;
   bool proxies = false;
+  bool wrappers = false;
   FILE *stream;
   char *ptr;
   int ch;
@@ -549,7 +849,7 @@ int main(int argc, char **argv, char **envp)
   g_debug = false;
   g_inline = false;
 
-  while ((ch = getopt(argc, argv, ":dps")) > 0)
+  while ((ch = getopt(argc, argv, ":dpsw")) > 0)
     {
       switch (ch)
         {
@@ -569,6 +869,10 @@ int main(int argc, char **argv, char **envp)
             g_inline = true;
             break;
 
+          case 'w' :
+            wrappers = true;
+            break;
+
           case '?' :
             fprintf(stderr, "Unrecognized option: %c\n", optopt);
             show_usage(argv[0]);
@@ -661,6 +965,10 @@ int main(int argc, char **argv, char **envp)
         {
           generate_proxy(nfixed, nargs - PARM1_INDEX);
         }
+      else if (wrappers)
+        {
+          generate_wrapper(nfixed, nargs - PARM1_INDEX);
+        }
       else
         {
           g_stubstream = NULL;


[incubator-nuttx] 02/03: Fix note type id for syscall enter/leave

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch feature/syscall-instrumentation
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit bb4255f980efb7239eabc5e632ded2b743b50e9c
Author: Nakamura, Yuuichi <Yu...@sony.com>
AuthorDate: Thu Jun 18 14:24:10 2020 +0900

    Fix note type id for syscall enter/leave
---
 sched/sched/sched_note.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sched/sched/sched_note.c b/sched/sched/sched_note.c
index c952ca8..3d9748d 100644
--- a/sched/sched/sched_note.c
+++ b/sched/sched/sched_note.c
@@ -584,7 +584,7 @@ void sched_note_syscall_enter(int nr, int argc, ...)
   /* Format the note */
 
   note_common(tcb, &note.nsc_cmn, sizeof(struct note_syscall_enter_s),
-              NOTE_CSECTION_ENTER);
+              NOTE_SYSCALL_ENTER);
   note.nsc_nr = nr;
 
   /* Add the note to circular buffer */
@@ -600,7 +600,7 @@ void sched_note_syscall_leave(int nr, uintptr_t result)
   /* Format the note */
 
   note_common(tcb, &note.nsc_cmn, sizeof(struct note_syscall_leave_s),
-              NOTE_CSECTION_LEAVE);
+              NOTE_SYSCALL_LEAVE);
   note.nsc_result = result;
   note.nsc_nr     = nr;