Henrik Austad wrote: > On Friday 01 August 2008 10:41:55 Prasad Joshi wrote: >> Hi All, >> >> Here is the code for __do_clear_user, I am not getting how does it work. >> Can any one please explain? > > I think the easiest way, would be to find a chart over all > assembly-instructions and then go through the function step by step (see > references below). > > a few notes: might_sleep() is a kernel-macro that yields if there are other > tasks that have a job to do. > > And, even though I don't fully know what all instructions do, I assume it > iterates over the memoryregion, zeroing it out as it goes.(as the comment > suggests). > >> #define __do_clear_user(addr,size) \ >> do { \ >> int __d0; \ >> might_sleep(); \ >> __asm__ __volatile__( \ >> "0: rep; stosl\n" \ >> " movl %2,%0\n" \ >> "1: rep; stosb\n" \ >> "2:\n" \ >> ".section .fixup,\"ax\"\n" \ >> "3: lea 0(%2,%0,4),%0\n" \ >> " jmp 2b\n" \ >> ".previous\n" \ >> _ASM_EXTABLE(0b,3b) \ >> _ASM_EXTABLE(1b,2b) \ >> >> : "=&c"(size), "=&D" (__d0) \ >> : "r"(size & 3), "0"(size / 4), "1"(addr), "a"(0)); \ >> >> } while (0) >> >> /** >> * clear_user: - Zero a block of memory in user space. >> * @to: Destination address, in user space. >> * @n: Number of bytes to zero. >> * >> * Zero a block of memory in user space. >> * >> * Returns number of bytes that could not be cleared. >> * On success, this will be zero. >> */ >> unsigned long >> clear_user(void __user *to, unsigned long n) >> { >> might_sleep(); >> if (access_ok(VERIFY_WRITE, to, n)) >> __do_clear_user(to, n); >> return n; >> } >> EXPORT_SYMBOL(clear_user); >> >> >> clear_user() is the function which is calling __do_clear_user(), from the >> context I can understand it is clearing the user space buffer. But how does >> it work? > > Have a look here: > > http://www.ibm.com/developerworks/library/l-ia.html > http://docs.sun.com/app/docs/doc/817-5477/ > http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/toc.html > > Sorry for not giving you a 'this function does ...' kind of explaination, but > hopefully you can gather some more insight from these pages. > I wonder why __do_clear_user can't be written in C. -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ