diff options
| -rw-r--r-- | arch/s390/include/asm/elf.h | 3 | ||||
| -rw-r--r-- | arch/s390/mm/pgtable.c | 7 | ||||
| -rw-r--r-- | drivers/s390/cio/cio.c | 8 |
3 files changed, 12 insertions, 6 deletions
diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h index 64b61bf72e93..547f1a6a35d4 100644 --- a/arch/s390/include/asm/elf.h +++ b/arch/s390/include/asm/elf.h | |||
| @@ -188,7 +188,8 @@ extern char elf_platform[]; | |||
| 188 | #define SET_PERSONALITY(ex) \ | 188 | #define SET_PERSONALITY(ex) \ |
| 189 | do { \ | 189 | do { \ |
| 190 | if (personality(current->personality) != PER_LINUX32) \ | 190 | if (personality(current->personality) != PER_LINUX32) \ |
| 191 | set_personality(PER_LINUX); \ | 191 | set_personality(PER_LINUX | \ |
| 192 | (current->personality & ~PER_MASK)); \ | ||
| 192 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ | 193 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ |
| 193 | set_thread_flag(TIF_31BIT); \ | 194 | set_thread_flag(TIF_31BIT); \ |
| 194 | else \ | 195 | else \ |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index f69ff3c13496..5d56c2b95b14 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -303,15 +303,15 @@ int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len) | |||
| 303 | /* Walk the guest addr space page table */ | 303 | /* Walk the guest addr space page table */ |
| 304 | table = gmap->table + (((to + off) >> 53) & 0x7ff); | 304 | table = gmap->table + (((to + off) >> 53) & 0x7ff); |
| 305 | if (*table & _REGION_ENTRY_INV) | 305 | if (*table & _REGION_ENTRY_INV) |
| 306 | return 0; | 306 | goto out; |
| 307 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); | 307 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); |
| 308 | table = table + (((to + off) >> 42) & 0x7ff); | 308 | table = table + (((to + off) >> 42) & 0x7ff); |
| 309 | if (*table & _REGION_ENTRY_INV) | 309 | if (*table & _REGION_ENTRY_INV) |
| 310 | return 0; | 310 | goto out; |
| 311 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); | 311 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); |
| 312 | table = table + (((to + off) >> 31) & 0x7ff); | 312 | table = table + (((to + off) >> 31) & 0x7ff); |
| 313 | if (*table & _REGION_ENTRY_INV) | 313 | if (*table & _REGION_ENTRY_INV) |
| 314 | return 0; | 314 | goto out; |
| 315 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); | 315 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); |
| 316 | table = table + (((to + off) >> 20) & 0x7ff); | 316 | table = table + (((to + off) >> 20) & 0x7ff); |
| 317 | 317 | ||
| @@ -319,6 +319,7 @@ int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len) | |||
| 319 | flush |= gmap_unlink_segment(gmap, table); | 319 | flush |= gmap_unlink_segment(gmap, table); |
| 320 | *table = _SEGMENT_ENTRY_INV; | 320 | *table = _SEGMENT_ENTRY_INV; |
| 321 | } | 321 | } |
| 322 | out: | ||
| 322 | up_read(&gmap->mm->mmap_sem); | 323 | up_read(&gmap->mm->mmap_sem); |
| 323 | if (flush) | 324 | if (flush) |
| 324 | gmap_flush_tlb(gmap); | 325 | gmap_flush_tlb(gmap); |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index cbde448f9947..eb3140ee821e 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
| @@ -654,8 +654,8 @@ static struct io_subchannel_private console_priv; | |||
| 654 | static int console_subchannel_in_use; | 654 | static int console_subchannel_in_use; |
| 655 | 655 | ||
| 656 | /* | 656 | /* |
| 657 | * Use tpi to get a pending interrupt, call the interrupt handler and | 657 | * Use cio_tpi to get a pending interrupt and call the interrupt handler. |
| 658 | * return a pointer to the subchannel structure. | 658 | * Return non-zero if an interrupt was processed, zero otherwise. |
| 659 | */ | 659 | */ |
| 660 | static int cio_tpi(void) | 660 | static int cio_tpi(void) |
| 661 | { | 661 | { |
| @@ -667,6 +667,10 @@ static int cio_tpi(void) | |||
| 667 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; | 667 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; |
| 668 | if (tpi(NULL) != 1) | 668 | if (tpi(NULL) != 1) |
| 669 | return 0; | 669 | return 0; |
| 670 | if (tpi_info->adapter_IO) { | ||
| 671 | do_adapter_IO(tpi_info->isc); | ||
| 672 | return 1; | ||
| 673 | } | ||
| 670 | irb = (struct irb *)&S390_lowcore.irb; | 674 | irb = (struct irb *)&S390_lowcore.irb; |
| 671 | /* Store interrupt response block to lowcore. */ | 675 | /* Store interrupt response block to lowcore. */ |
| 672 | if (tsch(tpi_info->schid, irb) != 0) | 676 | if (tsch(tpi_info->schid, irb) != 0) |
