Skip to content
Snippets Groups Projects
Commit 303123de authored by Gregory Nutt's avatar Gregory Nutt
Browse files

Add syscall support for insmod and rmmod

parent 040835de
Branches
Tags
No related merge requests found
......@@ -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
......
......@@ -83,15 +83,24 @@ int rmmod(FAR struct module_s *modp)
sdbg("ERROR: Failed to uninitialize the module: %d\n", ret);
return ret;
}
}
/* Free the module memory */
/* Nullify so that the uninitializer cannot be called again */
modp->uninitializer = NULL;
modp->arg = NULL;
}
/* 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;
......
......@@ -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*"
......
......@@ -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.
*/
......
......@@ -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.
*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment