seba0691 seba0691 - 1 year ago 140
C Question

Writing a new system call

I have been trying to write a new system call(called sys_defclose) in the raspberry's kernel, but upon compiling i get this error:

arch/arm/kernel/built-in.o: In function `__sys_trace_return':
:(.text+0xd50): undefined reference to `sys_defclose'


i have modified the following file:

-include/linux/syscalls.h : where i put the prototype of my syscall

-arch/arm/include/asm/unistd.h : where i put the new raw of the syscall table:

#define __NR_sys_defclose (__NR_SYSCALL_BASE+380)


-arch/arm/kernel/calls.S : where i put:

CALL(sys_defclose)


-i put the source of sys_defclose in arch/arm/kernel and i have modified the makefile in the same directory with the new line

obj-y +=sys_defclose.o


the kernel version is 3.6 of raspberrypi.
can somebody explain me how to solve this error?
thanks
this is the implementation of my syscall

static struct task_struct* get_task_by_pid(pid_t pid)
{
return pid_task(find_pid_ns(pid, task_active_pid_ns(current)), PIDTYPE_PID);
}

static void close_files(struct files_struct * files)
{
int i, j;
struct fdtable *fdt;

j = 0;

rcu_read_lock();
fdt = files_fdtable(files);
rcu_read_unlock();
for (;;) {
unsigned long set;
i = j * BITS_PER_LONG;
if (i >= fdt->max_fds)
break;
set = fdt->open_fds[j++];
while (set) {
if (set & 1) {
struct file * file = xchg(&fdt->fd[i], NULL);
if (file) {
filp_close(file, files);
cond_resched();
}
}
i++;
set >>= 1;
}
}
}
asmlinkage long sys_defclose(pid_t pid)
{
struct task_struct *result = NULL;

rcu_read_lock();
result = get_task_by_pid(pid);
rcu_read_unlock();
close_files(result->files);
}

Answer Source

You should use SYSCALL_DEFINE* to define syscall (I think, this step you did wrong), then add your syscall into sys_call_table, which is architecture-dependent (arch/arm/kernel/calls.S for arm).

Change your sys_defclose to look like this:

SYSCALL_DEFINE1(defclose, pid_t, pid)
{
        struct task_struct *result = NULL;

        rcu_read_lock(); 
        result = get_task_by_pid(pid);
        rcu_read_unlock(); 
        close_files(result->files);
}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download