From: Manigandan R. <mra...@pa...> - 2004-10-18 21:47:39
|
Hi, I tried adding a new system call to a 2.6.7 UML kernel (guest) using the following steps: (1) include/asm-i386/unistd.h add #define __NR_XYZ xyz (2) arch/i386/kernel/entry.S .long sys_XYZ (3) arch/um/kernel/sys_call_table.c extern syscall_handler_t sys_XYZ ans [__NR_XYZ] = sys_XYZ, (4) kernel/XYZ.c asmlinkage sys_XYZ() {} (5) update makefile (6) User program _syscallX() But when I try to run a user program it complains that the "XYZ: Function not implemented" I have done this before in a 2.4 UML kernel and it worked fine. This is my webpage with the detailed instructions on what I did: http://parsys.cs.uic.edu/~mradhakr/uml/umlInstall.html I am not sure if anything has changed in 2.6 as far as adding a new system call goes. Any input on what's going wrong with the above is welcome. Thanks, Mani. |
From: BlaisorBlade <bla...@ya...> - 2004-10-18 22:19:24
|
On Monday 18 October 2004 23:43, Manigandan Radhakrishnan wrote: > Hi, > > I tried adding a new system call to a 2.6.7 UML kernel (guest) using > the following steps: > (1) include/asm-i386/unistd.h > add #define __NR_XYZ xyz The number of the last syscall is stored in NR_syscalls. Have you changed that? Also, see this in sys_call_table.c: #define LAST_GENERIC_SYSCALL __NR_set_tid_address You must change that to point to your syscall. See the end of the file to understand what happens - it must fill in the holes in the syscall table. > (2) arch/i386/kernel/entry.S > .long sys_XYZ This is for i386 only, but does not hurt. > (3) arch/um/kernel/sys_call_table.c > extern syscall_handler_t sys_XYZ > ans > [__NR_XYZ] = sys_XYZ, > (4) kernel/XYZ.c > asmlinkage sys_XYZ() > {} > (5) update makefile > (6) User program > _syscallX() > > But when I try to run a user program it complains that the > "XYZ: Function not implemented" > I have done this before in a 2.4 UML kernel and it worked fine. This is > my webpage with the detailed instructions on what I did: > http://parsys.cs.uic.edu/~mradhakr/uml/umlInstall.html > I am not sure if anything has changed in 2.6 as far as adding a new > system call goes. Any input on what's going wrong with the above is > welcome. -- Paolo Giarrusso, aka Blaisorblade Linux registered user n. 292729 |
From: Manigandan R. <mra...@pa...> - 2004-10-18 23:02:36
|
Hi BlaisorBlade, Thanks for the prompt reply. I changed the __NR_syscalls to reflect the addition of the system call(s) and set the LAST_GENERIC_SYSCALL to point to my system call. I also used the 'debug' option to fireup the debugger and listed the sys_call_table[my_sys_call_number]. It shows up fine. When I disassemble the code corresponding to my system call it appears to do what I want it to do, which at this time is a call to printk. Everything inside the kernel appears to be set from the sys_call_table onwards. Is there anything checking for system call numbers (MAX) to make sure that the system call number passed to 0x80 is within bounds. This is my code for the user program: #include <stdio.h> #include <linux/unistd.h> #define __NR_my_sys_call 286 _syscall0(int, kernelsec_init); main() { printf("%d\n", my_sys_call()); perror("my_sys_call"); } I changed the name to my_sys_call in the above example. When run it says "Function not implemented". Thanks, Mani. BlaisorBlade wrote: > On Monday 18 October 2004 23:43, Manigandan Radhakrishnan wrote: > >>Hi, >> >> I tried adding a new system call to a 2.6.7 UML kernel (guest) using >>the following steps: > > >>(1) include/asm-i386/unistd.h >> add #define __NR_XYZ xyz > > The number of the last syscall is stored in NR_syscalls. Have you changed > that? > > Also, see this in sys_call_table.c: > #define LAST_GENERIC_SYSCALL __NR_set_tid_address > You must change that to point to your syscall. See the end of the file to > understand what happens - it must fill in the holes in the syscall table. > > >>(2) arch/i386/kernel/entry.S >> .long sys_XYZ > > This is for i386 only, but does not hurt. > > >>(3) arch/um/kernel/sys_call_table.c >> extern syscall_handler_t sys_XYZ >> ans >> [__NR_XYZ] = sys_XYZ, > > >>(4) kernel/XYZ.c >> asmlinkage sys_XYZ() >> {} > > >>(5) update makefile > > >>(6) User program >> _syscallX() >> >> But when I try to run a user program it complains that the >> "XYZ: Function not implemented" > > >>I have done this before in a 2.4 UML kernel and it worked fine. This is >>my webpage with the detailed instructions on what I did: > > >>http://parsys.cs.uic.edu/~mradhakr/uml/umlInstall.html > > >>I am not sure if anything has changed in 2.6 as far as adding a new >>system call goes. Any input on what's going wrong with the above is >>welcome. > > |
From: BlaisorBlade <bla...@ya...> - 2004-10-19 13:28:43
|
On Tuesday 19 October 2004 00:58, Manigandan Radhakrishnan wrote: > Hi BlaisorBlade, > > Thanks for the prompt reply. > > I changed the __NR_syscalls to reflect the addition of the system > call(s) and set the LAST_GENERIC_SYSCALL to point to my system call. Can you post the patch containing your changes, so to give a look at it and see directly what's wrong? Please avoid including build-generated files in the patch (a "make clean ARCH=um" should be enough). Guessing what's the problem without the code is quite time-consuming. > I also used the 'debug' option to fireup the debugger and listed the > sys_call_table[my_sys_call_number]. It shows up fine. When I disassemble > the code corresponding to my system call it appears to do what I want it > to do, which at this time is a call to printk. Is the printk done? The "minimal" syscall code is not this: asmlinkage sys_XYZ() {} but this: asmlinkage int sys_XYZ() { /*Put here what you want, including your printk()*/ return 0; } Missing the "return 0;" can let the function compile and return a bogus value, in some cases -ENOSYS (it's easier for this to happen on i386 rather than UML, but just to check). > Everything inside the kernel appears to be set from the sys_call_table > onwards. Is there anything checking for system call numbers (MAX) to > make sure that the system call number passed to 0x80 is within bounds. Yes.... the checking is done in arch/um/kernel/syscall_kern.c: execute_syscall(), which will use the _skas or _tt version (in arch/um/kernel/{skas,tt}/syscall_kern.c), depending on the mode you are running. On i386, the check is done in arch/i386/kernel/entry.S > This is my code for the user program: > #include <stdio.h> > #include <linux/unistd.h> > > #define __NR_my_sys_call 286 > > _syscall0(int, kernelsec_init); I obviously assume this is "my_sys_call". > main() > { > printf("%d\n", my_sys_call()); > perror("my_sys_call"); > } > > I changed the name to my_sys_call in the above example. When run it says > "Function not implemented". Yes, ENOSYS. > Thanks, > Mani. > > BlaisorBlade wrote: > > On Monday 18 October 2004 23:43, Manigandan Radhakrishnan wrote: > >>Hi, > >> > >> I tried adding a new system call to a 2.6.7 UML kernel (guest) using > >>the following steps: > >> > >> > >>(1) include/asm-i386/unistd.h > >> add #define __NR_XYZ xyz > > > > The number of the last syscall is stored in NR_syscalls. Have you changed > > that? > > > > Also, see this in sys_call_table.c: > > #define LAST_GENERIC_SYSCALL __NR_set_tid_address > > You must change that to point to your syscall. See the end of the file to > > understand what happens - it must fill in the holes in the syscall table. > > > >>(2) arch/i386/kernel/entry.S > >> .long sys_XYZ > > > > This is for i386 only, but does not hurt. > > > >>(3) arch/um/kernel/sys_call_table.c > >> extern syscall_handler_t sys_XYZ > >> ans > >> [__NR_XYZ] = sys_XYZ, > >> > >> > >>(4) kernel/XYZ.c > >> asmlinkage sys_XYZ() > >> {} > >> > >> > >>(5) update makefile > >> > >> > >>(6) User program > >> _syscallX() > >> > >> But when I try to run a user program it complains that the > >> "XYZ: Function not implemented" > >> > >> > >>I have done this before in a 2.4 UML kernel and it worked fine. This is > >>my webpage with the detailed instructions on what I did: > >> > >> > >>http://parsys.cs.uic.edu/~mradhakr/uml/umlInstall.html > >> > >> > >>I am not sure if anything has changed in 2.6 as far as adding a new > >>system call goes. Any input on what's going wrong with the above is > >>welcome. > > ------------------------------------------------------- > This SF.net email is sponsored by: IT Product Guide on ITManagersJournal > Use IT products in your business? Tell us what you think of them. Give us > Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out more > http://productguide.itmanagersjournal.com/guidepromo.tmpl > _______________________________________________ > User-mode-linux-user mailing list > Use...@li... > https://lists.sourceforge.net/lists/listinfo/user-mode-linux-user -- Paolo Giarrusso, aka Blaisorblade Linux registered user n. 292729 |
From: Mani <mra...@pa...> - 2004-10-19 15:50:14
|
Hi BlaisorBlade, As noted in your previous email, I did return 0 from the system call(s). They just had a printk before the return to indicate that the system call was executed. This was just to test that the system call can be invoked from user space. The printk never happened. This is the patch I generated (excluding some scripts or .c files UML generates on compilation): diff -ru linux-2.6.7/arch/i386/kernel/entry.S linux-2.6.7-uml/arch/i386/kernel/entry.S --- linux-2.6.7/arch/i386/kernel/entry.S 2004-06-16 00:19:02.000000000 -0500 +++ linux-2.6.7-uml/arch/i386/kernel/entry.S 2004-10-18 20:23:28.000000000 -0500 @@ -886,5 +886,9 @@ .long sys_mq_notify .long sys_mq_getsetattr .long sys_ni_syscall /* reserved for kexec */ + .long sys_ordinary_relabel + .long sys_group_relabel /* 285 */ + .long sys_kernelsec_init + .long sys_kernelsec_create syscall_table_size=(.-sys_call_table) Only in linux-2.6.7-uml/arch/um/include: sysdep diff -ru linux-2.6.7/arch/um/kernel/sys_call_table.c linux-2.6.7-uml/arch/um/kernel/sys_call_table.c --- linux-2.6.7/arch/um/kernel/sys_call_table.c 2004-10-19 10:15:30.000000000 -0500 +++ linux-2.6.7-uml/arch/um/kernel/sys_call_table.c 2004-10-18 20:26:24.000000000 -0500 @@ -19,7 +19,7 @@ #define NFSSERVCTL sys_ni_syscall #endif -#define LAST_GENERIC_SYSCALL __NR_vserver +#define LAST_GENERIC_SYSCALL __NR_kernelsec_create #if LAST_GENERIC_SYSCALL > LAST_ARCH_SYSCALL #define LAST_SYSCALL LAST_GENERIC_SYSCALL @@ -53,6 +53,11 @@ extern syscall_handler_t sys_modify_ldt; extern syscall_handler_t sys_rt_sigsuspend; +extern syscall_handler_t sys_ordinary_relabel; +extern syscall_handler_t sys_group_relabel; +extern syscall_handler_t sys_kernelsec_init; +extern syscall_handler_t sys_kernelsec_create; + syscall_handler_t *sys_call_table[] = { [ __NR_restart_syscall ] = (syscall_handler_t *) sys_restart_syscall, [ __NR_exit ] (syscall_handler_t *) sys_exit, @@ -307,6 +312,10 @@ [ __NR_utimes ] (syscall_handler_t *) sys_utimes, [ __NR_fadvise64_64 ] (syscall_handler_t *) sys_fadvise64_64, [ __NR_vserver ] (syscall_handler_t *) sys_ni_syscall, + [ __NR_ordinary_relabel ] = sys_ordinary_relabel, + [ __NR_group_relabel ] = sys_group_relabel, + [ __NR_kernelsec_init ] = sys_kernelsec_init, + [ __NR_kernelsec_create ] = sys_kernelsec_create, ARCH_SYSCALLS [ LAST_SYSCALL + 1 ... NR_syscalls ] = Only in linux-2.6.7-uml/arch/um: os Only in linux-2.6.7-uml/arch/um/sys-i386: module.c Only in linux-2.6.7-uml/: .config Only in linux-2.6.7-uml/include: asm diff -ru linux-2.6.7/include/asm-i386/unistd.h linux-2.6.7-uml/include/asm-i386/unistd.h --- linux-2.6.7/include/asm-i386/unistd.h 2004-06-16 00:19:37.000000000 -0500 +++ linux-2.6.7-uml/include/asm-i386/unistd.h 2004-10-18 20:22:01.000000000 -0500 @@ -289,8 +289,12 @@ #define __NR_mq_notify (__NR_mq_open+4) #define __NR_mq_getsetattr (__NR_mq_open+5) #define __NR_sys_kexec_load 283 +#define __NR_ordinary_relabel 284 +#define __NR_group_relabel 285 +#define __NR_kernelsec_init 286 +#define __NR_kernelsec_create 287 -#define NR_syscalls 284 +#define NR_syscalls 288 /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */ Only in linux-2.6.7-uml/include/asm-um: arch Only in linux-2.6.7-uml/include/asm-um: archparam.h Only in linux-2.6.7-uml/include/asm-um: arch-signal.h Only in linux-2.6.7-uml/include/asm-um: module.h Only in linux-2.6.7-uml/include/asm-um: processor.h Only in linux-2.6.7-uml/include/asm-um: ptrace.h Only in linux-2.6.7-uml/include/asm-um: sigcontext.h Only in linux-2.6.7-uml/include/asm-um: system.h Only in linux-2.6.7-uml/include: config Only in linux-2.6.7-uml/include: kernelsec Only in linux-2.6.7-uml/include/linux: autoconf.h Only in linux-2.6.7-uml/include/linux: kernelsec.h Only in linux-2.6.7-uml/include/linux: version.h Only in linux-2.6.7-uml/kernel: kernelsec.c diff -ru linux-2.6.7/kernel/Makefile linux-2.6.7-uml/kernel/Makefile --- linux-2.6.7/kernel/Makefile 2004-06-16 00:19:01.000000000 -0500 +++ linux-2.6.7-uml/kernel/Makefile 2004-10-18 21:09:37.000000000 -0500 @@ -7,7 +7,7 @@ sysctl.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o pid.o \ rcupdate.o intermodule.o extable.o params.o posix-timers.o \ - kthread.o + kthread.o kernelsec.o obj-$(CONFIG_FUTEX) += futex.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o Only in linux-2.6.7-uml/scripts/basic: docproc Only in linux-2.6.7-uml/scripts/basic: fixdep Only in linux-2.6.7-uml/scripts/basic: split-include Only in linux-2.6.7-uml/scripts: bin2c Only in linux-2.6.7-uml/scripts: conmakehash Only in linux-2.6.7-uml/scripts: elfconfig.h Only in linux-2.6.7-uml/scripts: kallsyms Only in linux-2.6.7-uml/scripts/kconfig: lex.zconf.c Only in linux-2.6.7-uml/scripts/kconfig: libkconfig.so Only in linux-2.6.7-uml/scripts/kconfig: lkc_defs.h Only in linux-2.6.7-uml/scripts/kconfig: qconf Only in linux-2.6.7-uml/scripts/kconfig: qconf.moc Only in linux-2.6.7-uml/scripts/kconfig: .tmp_qtcheck Only in linux-2.6.7-uml/scripts/kconfig: zconf.tab.c Only in linux-2.6.7-uml/scripts/kconfig: zconf.tab.h Only in linux-2.6.7-uml/scripts: mk_elfconfig Only in linux-2.6.7-uml/scripts: modpost Only in linux-2.6.7-uml/scripts: pnmtologo Only in linux-2.6.7-uml/: .version Thanks, Mani. |