[uml-devel] Using __initcall from um/drivers/chan_kern.c / fun with keyboard
Hi, I'm sending a patch that allows me to query the number of keys pressed by the user (I'll copy [4]). Actually, I'm counting scancodes and some keys send more than one. It works well. -- # cat /proc/keystrokes 29 -- I read [1] and skimmed over [2] and I think I'm using the __init and __initcall macros well, but I get this error when I try to use them: CC arch/um/drivers/chan_kern.o arch/um/drivers/chan_kern.c:111: error: `proc_kst_init' undeclared here (not in a function) arch/um/drivers/chan_kern.c:98: warning: `proc_kts_init' defined but not used make[1]: *** [arch/um/drivers/chan_kern.o] Error 1 make: *** [arch/um/drivers] Error 2 98 : static int __init proc_kts_init(void) 99 : { 111 : __initcall(proc_kst_init); What should I do/try? Can I use these macros in um/drivers/chan_kern.c? Related questions: * Is there a better place to to this in UML? * What would be the right place to do in ix86 (or arch independant)? Blaisorblade told me to it in serio[3], but I don't know where I should put the hooks. I think I can also use drivers/char/keyboard.c [1]http://people.netfilter.org/~rusty/unreliable-guides/kernel-hacking/routines-init-again.html [2]http://geek.vtnet.ca/doc/initcall/review.html [3]http://marc.theaimsgroup.com/?l=user-mode-linux-userm=112827478307626w=2 [4]http://bodq.vstu.edu.ua/activity/data/k.html -- Homepage : http://geocities.com/arhuaco The first principle is that you must not fool yourself and you are the easiest person to fool. -- Richard Feynman. diff -u linux-2.6.13.2.orig/arch/um/drivers/chan_kern.c linux-2.6.13.2/arch/um/drivers/chan_kern.c --- linux-2.6.13.2.orig/arch/um/drivers/chan_kern.c 2005-09-16 20:02:12.0 -0500 +++ linux-2.6.13.2/arch/um/drivers/chan_kern.c 2005-10-03 00:22:14.0 -0500 @@ -19,6 +19,101 @@ #include line.h #include os.h +#define CONFIG_PROC_KSTROKES + +/* + * I'm trying to learn how to intercept keyboard keystrokes in + * Linux. I want to gather some statistics. + * + * For instance, a count of each pressed key (A-Z). I guess I will + * have to do ( counter % 100) on each counter for security reasons. + * + * Arhuaco. Oct 2 / 2005. + */ + +#ifdef CONFIG_PROC_KSTROKES + +#define KST_DEBUG 1 +#define KST_LOG_LEN 32 + +#include linux/seq_file.h +#include linux/proc_fs.h +#include linux/init.h + +/* + * Do we need this to use __init and __initcall? + * #include linux/module.h */ + +unsigned int kst_count = 0; + +#if KST_DEBUG +char kst_log[KST_LOG_LEN]; +int kst_actual = 0; +#endif + +static int proc_kst_show(struct seq_file *m, void *v) +{ + #if KST_DEBUG +int error = 0; +int i; + +error = + #endif + + seq_printf(m, %d\n, kst_count); + + #if KST_DEBUG + + for (i = 0; !error i KST_LOG_LEN; i++) + { +if (i) + error = seq_putc(m, ' '); + +if (!error) + error = seq_printf(m, %x, kst_log[i]); + } + + if (!error) +seq_printf(m, \nactual %d\n, kst_actual); + + #endif + + return 0; +} + +static int proc_kst_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_kst_show, NULL); +} + +static struct file_operations proc_kst_operations = { + .open = proc_kst_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + + +static int /*__init*/ proc_kts_init(void) +{ + struct proc_dir_entry *e; + + e = create_proc_entry(keystrokes, 0, NULL); + + if (e) +e-proc_fops = proc_kst_operations; + else +printk(KERN_ERR chan_kern.c : /proc/keystrokes creation failed \n); + + return 0; +} + +/* __initcall(proc_kst_init); == Make it work */ + +int kst_did_init = 0; + +#endif /* CONFIG_PROC_KSTROKES */ + #ifdef CONFIG_NOCONFIG_CHAN /* The printk's here are wrong because we are complaining that there is no @@ -113,6 +208,22 @@ return(0); else if(n == 0) return(-EIO); + +#ifdef CONFIG_PROC_KSTROKES + kst_count ++; + + if (!kst_did_init) /* TODO: use __initcall */ + { +proc_kts_init(); +kst_did_init = 1; + } + + #if KST_DEBUG +kst_log[kst_actual] = *c_out; +kst_actual = (kst_actual + 1) % KST_LOG_LEN; + #endif +#endif + return(n); } --- linux-2.6.13.2.orig/arch/um/drivers/chan_kern.c 2005-09-16 20:02:12.0 -0500 +++ linux-2.6.13.2/arch/um/drivers/chan_kern.c 2005-10-03 00:57:26.0 -0500 @@ -19,6 +19,99 @@ #include line.h #include os.h +#define CONFIG_PROC_KSTROKES + +/* + * I'm trying to learn how to intercept keyboard keystrokes in + * Linux. I want to gather some statistics. + * + * For instance, a count of each pressed key (A-Z). I guess I will + * have to do ( counter % 100) on each counter for security reasons. + * + * Arhuaco. Oct 2 / 2005. + */ + +#ifdef CONFIG_PROC_KSTROKES + +#define KST_DEBUG 1 +#define KST_LOG_LEN 32 + +#include linux/seq_file.h +#include linux/proc_fs.h +#include linux/init.h + +/* + * Do we need this to use __init and __initcall? + * #include linux/module.h */ +
Re: [uml-devel] Clearing kmalloc_ok during shutdown is broken - malloc will clear our data.
On Monday 03 October 2005 15:40, Allan Graves wrote: I'm not understanding why glibc would break the registers at will. From setjmp: /* NOTE: The machine-dependent definitions of `__sigsetjmp' assume that a `jmp_buf' begins with a `__jmp_buf' and that `__mask_was_saved' follows it. Do not move these members or add others before it. */ Seems to indicate to me that this isn't gonna change, the comments above are mostly relative to the definitions of __sigsetjmp, i.e. to glibc internal code. Also, it's related to the layout of the structure, while our main problem is not the structure layout. and I'm using the bits/setjmp.h defines, so if they do change, the code should just follow along with the change. Am I missing something? I didn't even see those constants - I stopped earlier, at __jmp_buf_tag. Given that it feels like a Glibc private thing, I worried. Since those constants are explicitly exported, I guess that's for userspace programs as well, so Glibc provides that API as a public one. -- Inform me of my mistakes, so I can keep imitating Homer Simpson's Doh!. Paolo Giarrusso, aka Blaisorblade (Skype ID PaoloGiarrusso, ICQ 215621894) http://www.user-mode-linux.org/~blaisorblade ___ Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB http://mail.yahoo.it --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Re: [uml-devel] Using __initcall from um/drivers/chan_kern.c / fun with keyboard
On Monday 03 October 2005 08:02, Nelson Castillo wrote: Hi, I'm sending a patch that allows me to query the number of keys pressed by the user (I'll copy [4]). -- # cat /proc/keystrokes 29 -- I read [1] and skimmed over [2] and I think I'm using the __init and __initcall macros well, but I get this error when I try to use them: CC arch/um/drivers/chan_kern.o arch/um/drivers/chan_kern.c:111: error: `proc_kst_init' undeclared here (not in a function) arch/um/drivers/chan_kern.c:98: warning: `proc_kts_init' defined but not If you pasted the correct error message and the correct code, they both say kst on one line and kts on the other. You have a trivial typo. What should I do/try? Can I use these macros in um/drivers/chan_kern.c? Yes, take the right include and you can (use linux/init.h, not arch/um/include/init.h) Blaisorblade told me to it in serio[3], but I don't know where I should put the hooks. I think I can also use drivers/char/keyboard.c If it's arch-independent, you maybe can. But you'd better ask this on LKML, probably. -- Inform me of my mistakes, so I can keep imitating Homer Simpson's Doh!. Paolo Giarrusso, aka Blaisorblade (Skype ID PaoloGiarrusso, ICQ 215621894) http://www.user-mode-linux.org/~blaisorblade ___ Yahoo! Messenger: chiamate gratuite in tutto il mondo http://it.messenger.yahoo.com --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Re: [uml-devel] a question about sigsetjmp() in copy_from/to_user()
On Sunday 02 October 2005 20:31, Jeff Dike wrote: On Sun, Oct 02, 2005 at 12:23:14PM +0200, Blaisorblade wrote: Sorry, any reference will fault, unless it is done on a allocated present page, which the UML kernel freed but the host didn't. And remember, btw, you've planned to make this impossible... You are not making any sense t me here. /dev/anon - when the UML kernel frees a page, we ask the host to free it too. Sorry, Jeff, which page are you going to evict? It can be a dirty page. Unless you mean that since that page is still accounted in the FS, Linux will leave a RAM page free to allow it to be re-read, while still swapping the page. Swapped pages are accounted in the FS all the time and there's obviously no dedicated page left free for them when they are next pulled in. All disk-based filesystems account pages that are on disk and not in memory. tmpfs is no different, except that its disk is the swap partition. Exactly what I knew... However, I was in error... I just saw that filling the disk, or tmpfs, is rather different than going OOM. OOM causes SIGKILL, while SIGBUS (as you correctly said) comes from full disk/partition, or filled disk quota. I only checked tmpfs, but that gives at least a feeling. -- Inform me of my mistakes, so I can keep imitating Homer Simpson's Doh!. Paolo Giarrusso, aka Blaisorblade (Skype ID PaoloGiarrusso, ICQ 215621894) http://www.user-mode-linux.org/~blaisorblade ___ Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB http://mail.yahoo.it --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
[uml-devel] Re: UML/2.6.14-rc3 doesn't work fixes
On Sunday 02 October 2005 22:54, Al Viro wrote: BTW, speaking of Kbuild cleanups (and that one is definitely 2.6.15 fodder): patch below * kills messing with lib vs. core for uml-amd64 (we don't need that anymore) I'm even curious why we needed that in first place. * kills symlinks in arch/um/sys-*/ * kills foo.c-dir - we simply give HOST_OBJS=list of pathnames under arch/$(SUBARCH) and that's it (no SYMLINKS either) Price: use of make feature I really, really hate - $(eval ...). I looked at make Changelog, time ago, and this feature was added in make 3.80, so you'd need to update Documentation/Changes. Make 3.80 was released in 2002-10-03, so I hope it's not a problem (should check on Debian Woody though, maybe). I'm using it to generate and process bar-y := ../../$(SUBARCH)/foo/bar.o ... for all HOST_OBJS elements. If there are better suggestions, I'd be glad to hear them... The first thing is that HOST_OBJS is totally confusing... SUBARCH_OBJS or something else is better. The second is that, even if x86_64 uses things such as (from arch/x86_64/mm/Makefile): obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o hugetlbpage-y = ../../i386/mm/hugetlbpage.o (because hugetlbpage.o is conditional) we could as well do subarch-y := ../../$(SUBARCH)/name (even with foreach) for most things (see arch/x86_64/oprofile/Makefile), and for highmem and module I'd just do that by hand: highmem-y := $(SUBARCH_DIR)/mm/highmem.o module-y := $(SUBARCH_DIR)/kernel/module.o with SUBARCH_DIR defined in arch/um/Makefile. -- Inform me of my mistakes, so I can keep imitating Homer Simpson's Doh!. Paolo Giarrusso, aka Blaisorblade (Skype ID PaoloGiarrusso, ICQ 215621894) http://www.user-mode-linux.org/~blaisorblade ___ Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB http://mail.yahoo.it --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Re: [uml-devel] Using __initcall from um/drivers/chan_kern.c / fun with keyboard
On 10/3/05, Blaisorblade [EMAIL PROTECTED] wrote: You have a trivial typo. Yup :( Thanks. -- Homepage : http://geocities.com/arhuaco The first principle is that you must not fool yourself and you are the easiest person to fool. -- Richard Feynman. --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Re: [uml-devel] a question about sigsetjmp() in copy_from/to_user()
On Mon, Oct 03, 2005 at 08:35:54PM +0200, Blaisorblade wrote: /dev/anon - when the UML kernel frees a page, we ask the host to free it too. Yeah, /dev/anon is a completely different story, but I thought we were talking about normal tmpfs. Jeff --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
[uml-devel] Re: UML/2.6.14-rc3 doesn't work fixes
On Mon, Oct 03, 2005 at 08:30:23PM +0200, Blaisorblade wrote: The second is that, even if x86_64 uses things such as (from arch/x86_64/mm/Makefile): obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o hugetlbpage-y = ../../i386/mm/hugetlbpage.o (because hugetlbpage.o is conditional) we could as well do subarch-y := ../../$(SUBARCH)/name (even with foreach) Err... Kbuild won't know what to do with your subarch-y. The way it works is simple - we are saying that e.g. bitops.o is a multi-part object with only one part, namely ../../i386/lib/bitops.o. Said part is built by the normal Kbuild logics and then we get (dummy) linking, creating bitops.o. for most things (see arch/x86_64/oprofile/Makefile), and for highmem and module I'd just do that by hand: highmem-y := $(SUBARCH_DIR)/mm/highmem.o module-y := $(SUBARCH_DIR)/kernel/module.o with SUBARCH_DIR defined in arch/um/Makefile. Hrm... That just might be usable, _if_ we never run into modular suckers; in that case we can do the following: ifneq ($(subarch-objs-y),) obj-y += subarch.o subarch-y = $(addprefix ../../$(SUBARCH),$(subarch-objs-y)) endif in arch/um/scripts/Makefile.rules with subarch-y = . subarch-$(CONFIG_MODULE) += kernel/module.o etc. in arch/um/sys-.../Makefile The thing is, if we _ever_ need a potentially modular object pulled from the underlying architecture that trick will break. So far we do not and since $(eval...) *is* a vile mess straight from the GNU intestine... --- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl ___ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel