On Sat, 19 May 2007 04:55:12 -0700 kernel coder wrote: > hi, > > I'm trying to implement a system call for x86_64. Mine processor is > dual core opetron.There is very little material on web for > implementing system calls for x86_64 processor for 2.6 series kernel.I > tried to implement a new system call by observing the existing > implementation but to no success.Following are files names and changes > made.
Your example is very CPU-independent, i.e., not x86_64-specific, so following examples of recently-added syscalls should be good enough. I used your "patch" below (with a few small modifications) on 2.6.22-rc2 and it worked fine. Linux unicorn 2.6.22-rc2 #2 SMP Sun May 20 22:22:36 PDT 2007 x86_64 x86_64 x86_64 GNU/Linux ... [ 98.369454] new system call > ////////////////////////////////////////////////// > file-> include/asm-x86_64/unistd.h > > #define __NR_newcall 273 > __SYSCALL(__NR_newcall, sys_newcall) > > #define __NR_syscall_max __NR_newcall syscall_max is no longer used. > > ////////////////////////////////////////////////// > file-> include/linux/syscalls.h > > asmlinkage unsigned long sys_newcall(char __user *buf); not unsigned. > > ///////////////////////////////////////////// > file--> fs/read_write.c > > asmlinkage unsigned long sys_newcall(char __user * buf){ not unsigned. > > printk("new system call \n"); > ret 0; return 0; > } > > EXPORT_SYMBOL_GPL(sys_write) EXPORT_SYMBOL_GPL(sys_newcall); > Please let me know where i'm doing wrong .Following is program which > is calling mine system call > > > #include <stdlib.h> > #include <stdio.h> > #include <sys/unistd.h> #include <unistd.h> > #include <sys/syscall.h> > > long int ret; > int num = 243; > char buffer=[20]; eh? does not compile. > > int main() { > > > asm ("syscall;" > : "=a" (ret) > : "0" (num), > "D" (buffer), > ); I just used the syscall() glibc interface instead of asm: ret = syscall(__NR_newcall); > return ret; > } > > When i call this ,nothing gets printed in file /var/log/messages.Am i > missing something ? Mostly typos... > Actually i wana pass a pointer to kernel from user space.Later on data > will be copied to that memory location .i am thinking of using > copy_to_user for copying data.Buffer passed through system call will > be used by kernel function as circular ring.And portions of this ring > will get updated frequently even after system call has returned. > > Is there any better way to do this? Sounds mostly OK to me. Where are the ring head, tail, size, etc. maintained? --- ~Randy *** Remember to use Documentation/SubmitChecklist when testing your code *** - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/