int hv_ioctl(struct inode *inode, struct file *file, unsigned int ioctl_num, unsigned long ioctl_param) { unsigned long num; switch (ioctl_num) { case IOCTL_SET_NUMCALL: num = ioctl_param; printk(KERN_ALERT "hhv: Function %d\n\n", num); __asm__ volatile ( "li %%r3, 0;\n" \ "li %%r4, 0;\n" \ "li %%r5, 0;\n" \ "li %%r6, 0;\n" \ "li %%r7, 0;\n" \ "li %%r8, 0;\n" \ "li %%r9, 0;\n" \ "li %%r10, 0;\n" \ "mr %%r11,%1;\n" \ "sc 1;\n" \ "extsw %%r3,%%r3;\n" \ "mr %0,%%r3;\n" \ "nop;\n" : "=r" (last_ret) : "r" (num)); printk(KERN_ALERT "\n"); /* hhv: Call OK. last_ret=%d\n", last_ret);*/ break; case IOCTL_GET_RETVAL: /* Inverse return value, cos < 0 will make ioctl call to fail */ return -last_ret; break; } return 0; }