2.5.48 s390 (12/16): 31bit emulation.
PATCH 1/1 2.5.48 s390 (12/16): 31bit emulation.
Bug fixes for the 31 bit emulation layer. New interface [un]register_ioctl32_conversion.
arch/s390x/kernel/ioctl32.c +44 -1
@@ -1024,6 +1024,8 @@static void ioctl32_insert (struct ioctl32_list *entry) {int hash =ioctl32_hash (entry->handler.cmd); + + entry->next =0 ;if (!ioctl32_hash_table[hash]) ioctl32_hash_table[hash] = entry;else {
@@ -1032,10 +1034,51 @@while (l->next) l = l->next; l->next = entry; - entry->next =0 ; } } +int register_ioctl32_conversion (unsigned int cmd, +int (*handler)(unsigned int ,unsigned int , +unsigned long ,struct file *)) +{ +struct ioctl32_list *l, *new; +int hash; + + hash =ioctl32_hash (cmd); +for (l = ioctl32_hash_table[hash]; l !=NULL ; l = l->next) +if (l->handler.cmd == cmd) +return -EBUSY ; + new =kmalloc (sizeof (struct ioctl32_list ),GFP_KERNEL ); +if (new ==NULL ) +return -ENOMEM ; + new->handler.cmd = cmd; + new->handler.function = (void *) handler; +ioctl32_insert (new); +return 0 ; +} + +int unregister_ioctl32_conversion (unsigned int cmd) +{ +struct ioctl32_list *p, *l; +int hash; + + hash =ioctl32_hash (cmd); + p =NULL ; +for (l = ioctl32_hash_table[hash]; l !=NULL ; l = l->next) { +if (l->handler.cmd == cmd) +break ; + p = l; + } +if (l ==NULL ) +return -ENOENT ; +if (p ==NULL ) + ioctl32_hash_table[hash] = l->next; +else + p->next = l->next; +kfree (l); +return 0 ; +} +static int __init init_ioctl32 (void ) {int i;
arch/s390x/kernel/linux32.c +127 -196
388 lines not on this page · raw message
arch/s390x/kernel/s390_ksyms.c +14 -0
@@ -60,6 +60,20 @@EXPORT_SYMBOL (overflowuid);EXPORT_SYMBOL (overflowgid); +#ifdef CONFIG_S390_SUPPORT +/* +* Dynamically add/remove 31 bit ioctl conversion functions. +*/ +extern int register_ioctl32_conversion (unsigned int cmd, +int (*handler)(unsigned int , +unsigned int , +unsigned long , +struct file *)); +int unregister_ioctl32_conversion (unsigned int cmd); +EXPORT_SYMBOL (register_ioctl32_conversion); +EXPORT_SYMBOL (unregister_ioctl32_conversion); +#endif +/* * misc. */
arch/s390x/kernel/wrapper32.S +2 -2
@@ -17,14 +17,14 @@ llgfr %r2,%r2 # unsigned int llgtr %r3,%r3 # char * llgfr %r4,%r4 # size_t - jg sys_read # branch to sys_read + jg sys32_read # branch to sys_read .globl sys32_write_wrapper sys32_write_wrapper: llgfr %r2,%r2 # unsigned int llgtr %r3,%r3 # const char * llgfr %r4,%r4 # size_t - jg sys_write # branch to system call + jg sys32_write # branch to system call .globl sys32_open_wrapper sys32_open_wrapper: