diff --git a/include/sys/syscall.h b/include/sys/syscall.h index 835f40e085b..c7d9b086c49 100644 --- a/include/sys/syscall.h +++ b/include/sys/syscall.h @@ -152,12 +152,24 @@ # ifdef CONFIG_SCHED_HAVE_PARENT # define SYS_wait (__SYS_waitpid+1) # define SYS_waitid (__SYS_waitpid+2) -# define __SYS_posix_spawn (__SYS_waitpid+3) +# define __SYS_insmod (__SYS_waitpid+3) # else -# define __SYS_posix_spawn (__SYS_waitpid+1) +# define __SYS_insmod (__SYS_waitpid+1) #endif #else -# define __SYS_posix_spawn __SYS_waitpid +# define __SYS_insmod __SYS_waitpid +#endif + +/* The following can only be defined if we are configured to load + * OS modules from a file system. + */ + +#ifdef CONFIG_MODULE +# define SYS_insmod __SYS_insmod +# define SYS_rmmod (__SYS_insmod+1) +# define __SYS_posix_spawn (__SYS_insmod+2) +#else +# define __SYS_posix_spawn __SYS_insmod #endif /* The following can only be defined if we are configured to execute diff --git a/sched/module/mod_rmmod.c b/sched/module/mod_rmmod.c index 6918b3fde60..339ef808a3a 100644 --- a/sched/module/mod_rmmod.c +++ b/sched/module/mod_rmmod.c @@ -83,15 +83,24 @@ int rmmod(FAR struct module_s *modp) sdbg("ERROR: Failed to uninitialize the module: %d\n", ret); return ret; } + + /* Nullify so that the uninitializer cannot be called again */ + + modp->uninitializer = NULL; + modp->arg = NULL; } - /* Free the module memory */ - - /* Release memory holding the relocated ELF image */ + /* Release resources held by the module */ if (modp->alloc != 0) { + /* Free the module memory */ + kmm_free((FAR void *)modp->alloc); + + /* Nullify so that the memory cannot be freed again */ + + modp->alloc = NULL; } return ret; diff --git a/syscall/syscall.csv b/syscall/syscall.csv index f9ea9285a62..50ebab9612d 100644 --- a/syscall/syscall.csv +++ b/syscall/syscall.csv @@ -28,6 +28,7 @@ "getenv","stdlib.h","!defined(CONFIG_DISABLE_ENVIRON)","FAR char*","FAR const char*" "getpid","unistd.h","","pid_t" "getsockopt","sys/socket.h","CONFIG_NSOCKET_DESCRIPTORS > 0 && defined(CONFIG_NET)","int","int","int","int","FAR void*","FAR socklen_t*" +"insmod","nuttx/module.h",defined(CONFIG_MODULE),"int","FAR struct module_s *" "ioctl","sys/ioctl.h","!defined(CONFIG_LIBC_IOCTL_VARIADIC) && (CONFIG_NSOCKET_DESCRIPTORS > 0 || CONFIG_NFILE_DESCRIPTORS > 0)","int","int","int","unsigned long" "kill","signal.h","!defined(CONFIG_DISABLE_SIGNALS)","int","pid_t","int" "listen","sys/socket.h","CONFIG_NSOCKET_DESCRIPTORS > 0 && defined(CONFIG_NET)","int","int","int" @@ -97,6 +98,7 @@ "rename","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT)","int","FAR const char*","FAR const char*" "rewinddir","dirent.h","CONFIG_NFILE_DESCRIPTORS > 0","void","FAR DIR*" "rmdir","unistd.h","CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT)","int","FAR const char*" +"rmmod","nuttx/module.h",defined(CONFIG_MODULE),"int","FAR struct module_s *" "sched_getparam","sched.h","","int","pid_t","struct sched_param*" "sched_getscheduler","sched.h","","int","pid_t" "sched_getstreams","nuttx/sched.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","FAR struct streamlist*" diff --git a/syscall/syscall_lookup.h b/syscall/syscall_lookup.h index db52304592d..62ccbd2d5f5 100644 --- a/syscall/syscall_lookup.h +++ b/syscall/syscall_lookup.h @@ -106,6 +106,15 @@ SYSCALL_LOOKUP(up_assert, 2, STUB_up_assert) # endif #endif +/* The following can only be defined if we are configured to load + * OS modules from a file system. + */ + +#ifdef CONFIG_MODULE + SYSCALL_LOOKUP(insmod, 1, STUB_insmod) + SYSCALL_LOOKUP(rmmod, 1, STUB_rmmod) +#endif + /* The following can only be defined if we are configured to execute * programs from a file system. */ diff --git a/syscall/syscall_stublookup.c b/syscall/syscall_stublookup.c index 9991192feb2..e23e801f197 100644 --- a/syscall/syscall_stublookup.c +++ b/syscall/syscall_stublookup.c @@ -107,6 +107,15 @@ uintptr_t STUB_wait(int nbr, uintptr_t parm1); uintptr_t STUB_waitid(int nbr, uintptr_t parm1, uintptr_t parm2, uintptr_t parm3, uintptr_t parm4); +/* The following can only be defined if we are configured to load + * OS modules from a file system. + */ + +#ifdef CONFIG_MODULE +uintptr_t STUB_insmod(int nbr, uintptr_t parm1); +uintptr_t STUB_rmmod(int nbr, uintptr_t parm1); +#endif + /* The following can only be defined if we are configured to execute * programs from a file system. */