Changeset 18

Show
Ignore:
Timestamp:
11/06/05 15:32:03 (6 years ago)
Author:
dkaplan1
Message:

Added calldriver to ioctl, added callgates for requesting port region access
Fixed stack overflow issue with calldriver
MP2 parallel port driver now works with kernel

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • arch/i386/kernel/callgate.c

    r17 r18  
    3131#include <linux/kallsyms.h> 
    3232#include <linux/ptrace.h> 
     33#include <linux/ioport.h> 
    3334 
    3435#include <asm/segment.h> 
     
    108109        "pushl 16(%ebp)\n\t" 
    109110        "decl %ecx\n\t" 
    110         "cmpl $3, %ecx\n\t" 
     111        "cmpl $5, %ecx\n\t" 
    111112        "ja done4\n\t" 
    112113        "call *callgate_table4(,%ecx,4)\n\t" 
     
    115116        "leave\n\t" 
    116117        "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
    118119); 
    119120 
     
    128129        "pushl 16(%ebp)\n\t" 
    129130        "decl %ecx\n\t" 
    130         "cmpl $0, %ecx\n\t" 
     131        "cmpl $-1, %ecx\n\t" 
    131132        "ja done5\n\t" 
    132133        "call *callgate_table5(,%ecx,4)\n\t" 
     
    135136        "leave\n\t" 
    136137        "lret $20\n\t" 
    137         "callgate_table5: .long __request_region
     138        "callgate_table5: .long 0
    138139); 
    139140__asm__("callgate_entry1:" 
     
    162163        "pushl 16(%ebp)\n\t" 
    163164        "decl %ecx\n\t" 
    164         "cmpl $0, %ecx\n\t" 
     165        "cmpl $1, %ecx\n\t" 
    165166        "ja done3\n\t" 
    166167        "call *callgate_table3(,%ecx,4)\n\t" 
     
    169170        "leave\n\t" 
    170171        "lret $12\n\t" 
    171         "callgate_table3:
     172        "callgate_table3: .long mod_release_region, mod_release_mem_region
    172173); 
    173174 
     
    292293 
    293294    //Set new state for thread 
    294     //show_stack(tsk, NULL); 
    295295    regs=task_pt_regs(tsk); 
    296296    //show_regs(regs); 
     
    338338            vunmap(origmems[i]); 
    339339        } 
     340        regs->esp+=4; 
    340341    } 
    341342    return tsk->exit_code; 
  • arch/i386/kernel/traps.c

    r17 r18  
    442442    int ret; 
    443443    unsigned long addr=(unsigned long) myaddr; 
    444     printk("Attempting to unload module\n"); 
    445444    name=find_module_by_thread(addr); 
    446     printk("Address we got was %x, module is %s\n", addr, name); 
    447445    ret=sys_delete_module(name, 0); 
    448     printk("delete returned %d which is %d", ret, -ret); 
    449446} 
    450447static DECLARE_WORK(mytask, do_unload_module, NULL); 
  • fs/ioctl.c

    r1 r18  
    4444                        return put_user(i_size_read(inode) - filp->f_pos, p); 
    4545        } 
    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  } 
    4858        return -ENOTTY; 
    4959} 
     
    125135                        if (S_ISREG(filp->f_dentry->d_inode->i_mode)) 
    126136                                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               
    129150        } 
    130151        unlock_kernel(); 
  • include/asm-i386/callgate.h

    r14 r18  
    4141#define CALLGATE_misc_deregister "pushl $5\n\t" 
    4242 
     43//2 parameter functions 
     44#define CALLGATE_release_region "pushl $1\n\t" 
     45#define CALLGATE_release_mem_region "pushl $2\n\t" 
     46 
    4347//3 parameter functions 
    4448#define CALLGATE_REGISTERCHRDEV "pushl $1\n\t" 
     
    4650#define CALLGATE_copy_to_user "pushl $3\n\t" 
    4751#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" 
    4854//4 parameter functions 
    4955#define CALLGATE___request_region "pushl $1\n\t" 
  • include/asm-i386/dapi.h

    r14 r18  
    1919    static inline ret func ( type1 param1 , type2 param2 ) { \ 
    2020        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" \ 
    2323                CALLGATE_ ## func  \ 
    2424                LCALL2       \ 
    25                 : "=a"(myret) : "r"(param2), "r"(param1));  \ 
     25                : "=a"(myret) : "a"(param2), "b"(param1));  \ 
    2626        return myret;  \ 
    2727    } 
     
    3131    static inline ret func ( type1 param1 , type2 param2, type3 param3 ) { \ 
    3232        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" \ 
    3636                CALLGATE_ ## func  \ 
    3737                LCALL3       \ 
    38                 : "=a"(myret) : "r"(param3), "r"(param2), "r"(param1));  \ 
     38                : "=a"(myret) : "a"(param3), "b"(param2), "c"(param1));  \ 
    3939        return myret;  \ 
    4040    } 
     
    9191make_wrap3(copy_to_user, unsigned long, void __user *, const void *, unsigned long) 
    9292make_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 *)  
     93make_wrap3(request_region, struct resource *, unsigned long, unsigned long, const char *)  
     94make_wrap2(release_region, int, unsigned long, unsigned long) 
    9495//make_wrap3(no_llseek, loff_t, struct file *, loff_t, int) 
    9596 
  • include/linux/ioport.h

    r1 r18  
    104104 
    105105/* Convenience shorthand with allocation */ 
     106#ifndef MODULE 
    106107#define request_region(start,n,name)    __request_region(&ioport_resource, (start), (n), (name)) 
    107108#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)) 
     111extern struct resource *mod_request_region(unsigned long start, unsigned long n, const char *name); 
     112extern struct resource *mod_request_mem_region(unsigned long start, unsigned long n, const char *name); 
     113extern void mod_release_region(unsigned long start, unsigned long n); 
     114extern void mod_release_mem_region(unsigned long start, unsigned long n); 
     115#endif 
     116#ifdef MODULE 
     117extern struct resource *request_region(unsigned long start, unsigned long n, const char *name); 
     118extern struct resource *request_mem_region(unsigned long start, unsigned long n, const char *name); 
     119extern int release_region(unsigned long start, unsigned long n); 
     120extern int release_mem_region(unsigned long start, unsigned long n); 
     121#endif 
    108122#define rename_region(region, newname) do { (region)->name = (newname); } while (0) 
    109123 
     
    111125 
    112126/* Compatibility cruft */ 
    113 #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) 
    114127#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)) 
    116128 
    117129extern int __check_region(struct resource *, unsigned long, unsigned long); 
  • kernel/module.c

    r16 r18  
    16181618 
    16191619        if (pcpuindex) { 
    1620     printk("wtf?\n"); 
    16211620                /* We have a special allocation for this section. */ 
    16221621                percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, 
     
    16541653        memset(ptr, 0, mod->init_size); 
    16551654        mod->module_init = ptr; 
    1656 printk("percpu is currently %xn", mod->percpu); 
    16571655        /* Transfer each section which specifies SHF_ALLOC */ 
    16581656        DEBUGP("final section addresses:\n"); 
     
    16781676        /* Module has been moved. */ 
    16791677        mod = (void *)sechdrs[modindex].sh_addr; 
    1680 printk("NOW it is %x\n", mod->percpu); 
    16811678        /* Now we've moved module, initialize linked lists, etc. */ 
    16821679        module_unload_init(mod); 
  • kernel/resource.c

    r14 r18  
    448448 
    449449                        /* Uhhuh, that didn't work out.. */ 
     450      printk("Hmm, we're not grandint port access for %s to port %x\n", name, start); 
    450451                        kfree(res); 
    451452                        res = NULL; 
     
    456457  if (res) { 
    457458      //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? 
    458461      if ((task_pt_regs(current)->xcs & 3) && (~(task_pt_regs(current)->xcs) & 3)) { 
     462          printk("driver got port access!\n"); 
    459463          if (sys_ioperm(start, n, 1)) 
    460464              printk(KERN_ERR "Unable to grant io port access\n"); 
    461465      } 
    462466  } 
     467   
    463468        return res; 
    464469} 
    465470 
    466471EXPORT_SYMBOL(__request_region); 
     472 
     473struct 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} 
     478struct 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 
     483void 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 
     489void mod_release_mem_region(unsigned long start, unsigned long n) 
     490{ 
     491    __release_region(&iomem_resource, start, n); 
     492} 
    467493 
    468494int __deprecated __check_region(struct resource *parent, unsigned long start, unsigned long n) 
  • .version

    r17 r18  
    1 183 
     1196