Changeset 18
- Timestamp:
- 11/06/05 15:32:03 (6 years ago)
- Files:
-
- arch/i386/kernel/callgate.c (modified) (9 diffs)
- arch/i386/kernel/traps.c (modified) (1 diff)
- fs/ioctl.c (modified) (2 diffs)
- include/asm-i386/callgate.h (modified) (2 diffs)
- include/asm-i386/dapi.h (modified) (3 diffs)
- include/linux/ioport.h (modified) (2 diffs)
- kernel/module.c (modified) (3 diffs)
- kernel/resource.c (modified) (2 diffs)
- .version (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
arch/i386/kernel/callgate.c
r17 r18 31 31 #include <linux/kallsyms.h> 32 32 #include <linux/ptrace.h> 33 #include <linux/ioport.h> 33 34 34 35 #include <asm/segment.h> … … 108 109 "pushl 16(%ebp)\n\t" 109 110 "decl %ecx\n\t" 110 "cmpl $ 3, %ecx\n\t"111 "cmpl $5, %ecx\n\t" 111 112 "ja done4\n\t" 112 113 "call *callgate_table4(,%ecx,4)\n\t" … … 115 116 "leave\n\t" 116 117 "lret $16\n\t" 117 "callgate_table4: .long register_chrdev, copy_from_user, copy_to_user, no_llseek "118 "callgate_table4: .long register_chrdev, copy_from_user, copy_to_user, no_llseek, mod_request_region, mod_request_mem_region" 118 119 ); 119 120 … … 128 129 "pushl 16(%ebp)\n\t" 129 130 "decl %ecx\n\t" 130 "cmpl $ 0, %ecx\n\t"131 "cmpl $-1, %ecx\n\t" 131 132 "ja done5\n\t" 132 133 "call *callgate_table5(,%ecx,4)\n\t" … … 135 136 "leave\n\t" 136 137 "lret $20\n\t" 137 "callgate_table5: .long __request_region"138 "callgate_table5: .long 0" 138 139 ); 139 140 __asm__("callgate_entry1:" … … 162 163 "pushl 16(%ebp)\n\t" 163 164 "decl %ecx\n\t" 164 "cmpl $ 0, %ecx\n\t"165 "cmpl $1, %ecx\n\t" 165 166 "ja done3\n\t" 166 167 "call *callgate_table3(,%ecx,4)\n\t" … … 169 170 "leave\n\t" 170 171 "lret $12\n\t" 171 "callgate_table3: "172 "callgate_table3: .long mod_release_region, mod_release_mem_region " 172 173 ); 173 174 … … 292 293 293 294 //Set new state for thread 294 //show_stack(tsk, NULL);295 295 regs=task_pt_regs(tsk); 296 296 //show_regs(regs); … … 338 338 vunmap(origmems[i]); 339 339 } 340 regs->esp+=4; 340 341 } 341 342 return tsk->exit_code; arch/i386/kernel/traps.c
r17 r18 442 442 int ret; 443 443 unsigned long addr=(unsigned long) myaddr; 444 printk("Attempting to unload module\n");445 444 name=find_module_by_thread(addr); 446 printk("Address we got was %x, module is %s\n", addr, name);447 445 ret=sys_delete_module(name, 0); 448 printk("delete returned %d which is %d", ret, -ret);449 446 } 450 447 static DECLARE_WORK(mytask, do_unload_module, NULL); fs/ioctl.c
r1 r18 44 44 return put_user(i_size_read(inode) - filp->f_pos, p); 45 45 } 46 if (filp->f_op && filp->f_op->ioctl) 47 return filp->f_op->ioctl(inode, filp, cmd, arg); 46 if (filp->f_op && filp->f_op->ioctl) { 47 if ((unsigned long) filp->f_op->ioctl > PAGE_OFFSET) 48 return filp->f_op->ioctl(inode, filp, cmd, arg); 49 else { 50 unsigned long args[4]; 51 args[0]=(unsigned long) inode; 52 args[1]=(unsigned long) filp; 53 args[2]=(unsigned long) cmd; 54 args[3]=(unsigned long) arg; 55 return calldriver((unsigned long) filp->f_op->ioctl, args, 4, current->mm, 3); 56 } 57 } 48 58 return -ENOTTY; 49 59 } … … 125 135 if (S_ISREG(filp->f_dentry->d_inode->i_mode)) 126 136 error = file_ioctl(filp, cmd, arg); 127 else if (filp->f_op && filp->f_op->ioctl) 128 error = filp->f_op->ioctl(filp->f_dentry->d_inode, filp, cmd, arg); 137 else if (filp->f_op && filp->f_op->ioctl) { 138 if ((unsigned long) filp->f_op->ioctl > PAGE_OFFSET) 139 error = filp->f_op->ioctl(filp->f_dentry->d_inode, filp, cmd, arg); 140 else { 141 unsigned long args[4]; 142 args[0]=(unsigned long) filp->f_dentry->d_inode; 143 args[1]=(unsigned long) filp; 144 args[2]=(unsigned long) cmd; 145 args[3]=(unsigned long) arg; 146 error=calldriver((unsigned long) filp->f_op->ioctl, args, 4, current->mm, 3); 147 } 148 } 149 129 150 } 130 151 unlock_kernel(); include/asm-i386/callgate.h
r14 r18 41 41 #define CALLGATE_misc_deregister "pushl $5\n\t" 42 42 43 //2 parameter functions 44 #define CALLGATE_release_region "pushl $1\n\t" 45 #define CALLGATE_release_mem_region "pushl $2\n\t" 46 43 47 //3 parameter functions 44 48 #define CALLGATE_REGISTERCHRDEV "pushl $1\n\t" … … 46 50 #define CALLGATE_copy_to_user "pushl $3\n\t" 47 51 #define CALLGATE_no_llseek "pushl $4\n\t" 52 #define CALLGATE_request_region "pushl $5\n\t" 53 #define CALLGATE_request_mem_region "pushl $6\n\t" 48 54 //4 parameter functions 49 55 #define CALLGATE___request_region "pushl $1\n\t" include/asm-i386/dapi.h
r14 r18 19 19 static inline ret func ( type1 param1 , type2 param2 ) { \ 20 20 ret myret; \ 21 asm volatile ("pushl % 0\n\t" \22 "pushl % 1\n\t" \21 asm volatile ("pushl %%eax\n\t" \ 22 "pushl %%ebx\n\t" \ 23 23 CALLGATE_ ## func \ 24 24 LCALL2 \ 25 : "=a"(myret) : " r"(param2), "r"(param1)); \25 : "=a"(myret) : "a"(param2), "b"(param1)); \ 26 26 return myret; \ 27 27 } … … 31 31 static inline ret func ( type1 param1 , type2 param2, type3 param3 ) { \ 32 32 ret myret; \ 33 asm volatile ("pushl % 0\n\t" \34 "pushl % 1\n\t" \35 "pushl % 2\n\t" \33 asm volatile ("pushl %%eax\n\t" \ 34 "pushl %%ebx\n\t" \ 35 "pushl %%ecx\n\t" \ 36 36 CALLGATE_ ## func \ 37 37 LCALL3 \ 38 : "=a"(myret) : " r"(param3), "r"(param2), "r"(param1)); \38 : "=a"(myret) : "a"(param3), "b"(param2), "c"(param1)); \ 39 39 return myret; \ 40 40 } … … 91 91 make_wrap3(copy_to_user, unsigned long, void __user *, const void *, unsigned long) 92 92 make_wrap3(copy_from_user, unsigned long, void *, const void __user *, unsigned long) 93 make_wrap4(__request_region, struct resource *, struct resource *, unsigned long, unsigned long, const char *) 93 make_wrap3(request_region, struct resource *, unsigned long, unsigned long, const char *) 94 make_wrap2(release_region, int, unsigned long, unsigned long) 94 95 //make_wrap3(no_llseek, loff_t, struct file *, loff_t, int) 95 96 include/linux/ioport.h
r1 r18 104 104 105 105 /* Convenience shorthand with allocation */ 106 #ifndef MODULE 106 107 #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name)) 107 108 #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name)) 109 #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) 110 #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n)) 111 extern struct resource *mod_request_region(unsigned long start, unsigned long n, const char *name); 112 extern struct resource *mod_request_mem_region(unsigned long start, unsigned long n, const char *name); 113 extern void mod_release_region(unsigned long start, unsigned long n); 114 extern void mod_release_mem_region(unsigned long start, unsigned long n); 115 #endif 116 #ifdef MODULE 117 extern struct resource *request_region(unsigned long start, unsigned long n, const char *name); 118 extern struct resource *request_mem_region(unsigned long start, unsigned long n, const char *name); 119 extern int release_region(unsigned long start, unsigned long n); 120 extern int release_mem_region(unsigned long start, unsigned long n); 121 #endif 108 122 #define rename_region(region, newname) do { (region)->name = (newname); } while (0) 109 123 … … 111 125 112 126 /* Compatibility cruft */ 113 #define release_region(start,n) __release_region(&ioport_resource, (start), (n))114 127 #define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n)) 115 #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n))116 128 117 129 extern int __check_region(struct resource *, unsigned long, unsigned long); kernel/module.c
r16 r18 1618 1618 1619 1619 if (pcpuindex) { 1620 printk("wtf?\n");1621 1620 /* We have a special allocation for this section. */ 1622 1621 percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, … … 1654 1653 memset(ptr, 0, mod->init_size); 1655 1654 mod->module_init = ptr; 1656 printk("percpu is currently %xn", mod->percpu);1657 1655 /* Transfer each section which specifies SHF_ALLOC */ 1658 1656 DEBUGP("final section addresses:\n"); … … 1678 1676 /* Module has been moved. */ 1679 1677 mod = (void *)sechdrs[modindex].sh_addr; 1680 printk("NOW it is %x\n", mod->percpu);1681 1678 /* Now we've moved module, initialize linked lists, etc. */ 1682 1679 module_unload_init(mod); kernel/resource.c
r14 r18 448 448 449 449 /* Uhhuh, that didn't work out.. */ 450 printk("Hmm, we're not grandint port access for %s to port %x\n", name, start); 450 451 kfree(res); 451 452 res = NULL; … … 456 457 if (res) { 457 458 //Check if this is a driver thread 459 //FIXME: This prints out extra error messages during bootup 460 //How do we know if this is ootup or a real driver thread? 458 461 if ((task_pt_regs(current)->xcs & 3) && (~(task_pt_regs(current)->xcs) & 3)) { 462 printk("driver got port access!\n"); 459 463 if (sys_ioperm(start, n, 1)) 460 464 printk(KERN_ERR "Unable to grant io port access\n"); 461 465 } 462 466 } 467 463 468 return res; 464 469 } 465 470 466 471 EXPORT_SYMBOL(__request_region); 472 473 struct resource *mod_request_region(unsigned long start, unsigned long n, const char *name) 474 { 475 printk("called with start %x, n is %x, name is %x or %s\n", start, n, name, name); 476 return __request_region(&ioport_resource, start, n, name); 477 } 478 struct resource *mod_request_mem_region(unsigned long start, unsigned long n, const char *name) 479 { 480 return __request_region(&iomem_resource, start, n, name); 481 } 482 483 void mod_release_region(unsigned long start, unsigned long n) 484 { 485 printk("called with start %x, n is %x\n", start, n); 486 __release_region(&ioport_resource, start, n); 487 } 488 489 void mod_release_mem_region(unsigned long start, unsigned long n) 490 { 491 __release_region(&iomem_resource, start, n); 492 } 467 493 468 494 int __deprecated __check_region(struct resource *parent, unsigned long start, unsigned long n) .version
r17 r18 1 1 831 196
