diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-20 00:05:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-20 00:05:02 -0400 |
commit | 99bc7215bc60f6cd414cf1b85cd9d52cc596cccb (patch) | |
tree | 8bba8cc01d6494acd2443ccce4dfba1612d58981 | |
parent | 30ec56824897fc70f668dcb302f08cc9080eadfa (diff) | |
parent | 7ae85dc7687c7e7119053d83d02c560ea217b772 (diff) |
Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm
Pull ARM fixes from Russell King:
"Three fixes and a resulting cleanup for -rc2:
- Andre Przywara reported that he was seeing a warning with the new
cast inside DMA_ERROR_CODE's definition, and fixed the incorrect
use.
- Doug Anderson noticed that kgdb causes a "scheduling while atomic"
bug.
- OMAP5 folk noticed that their Thumb-2 compiled X servers crashed
when enabling support to cover ARMv6 CPUs due to a kernel bug
leaking some conditional context into the signal handler"
* 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm:
ARM: 8425/1: kgdb: Don't try to stop the machine when setting breakpoints
ARM: 8437/1: dma-mapping: fix build warning with new DMA_ERROR_CODE definition
ARM: get rid of needless #if in signal handling code
ARM: fix Thumb2 signal handling when ARMv6 is enabled
-rw-r--r-- | arch/arm/kernel/kgdb.c | 8 | ||||
-rw-r--r-- | arch/arm/kernel/signal.c | 15 | ||||
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 4 |
3 files changed, 17 insertions, 10 deletions
diff --git a/arch/arm/kernel/kgdb.c b/arch/arm/kernel/kgdb.c index a6ad93c9bce3..fd9eefce0a7b 100644 --- a/arch/arm/kernel/kgdb.c +++ b/arch/arm/kernel/kgdb.c | |||
@@ -259,15 +259,17 @@ int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) | |||
259 | if (err) | 259 | if (err) |
260 | return err; | 260 | return err; |
261 | 261 | ||
262 | patch_text((void *)bpt->bpt_addr, | 262 | /* Machine is already stopped, so we can use __patch_text() directly */ |
263 | *(unsigned int *)arch_kgdb_ops.gdb_bpt_instr); | 263 | __patch_text((void *)bpt->bpt_addr, |
264 | *(unsigned int *)arch_kgdb_ops.gdb_bpt_instr); | ||
264 | 265 | ||
265 | return err; | 266 | return err; |
266 | } | 267 | } |
267 | 268 | ||
268 | int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) | 269 | int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) |
269 | { | 270 | { |
270 | patch_text((void *)bpt->bpt_addr, *(unsigned int *)bpt->saved_instr); | 271 | /* Machine is already stopped, so we can use __patch_text() directly */ |
272 | __patch_text((void *)bpt->bpt_addr, *(unsigned int *)bpt->saved_instr); | ||
271 | 273 | ||
272 | return 0; | 274 | return 0; |
273 | } | 275 | } |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index b6cda06b455f..7b8f2141427b 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -343,15 +343,18 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig, | |||
343 | */ | 343 | */ |
344 | thumb = handler & 1; | 344 | thumb = handler & 1; |
345 | 345 | ||
346 | #if __LINUX_ARM_ARCH__ >= 7 | ||
347 | /* | 346 | /* |
348 | * Clear the If-Then Thumb-2 execution state | 347 | * Clear the If-Then Thumb-2 execution state. ARM spec |
349 | * ARM spec requires this to be all 000s in ARM mode | 348 | * requires this to be all 000s in ARM mode. Snapdragon |
350 | * Snapdragon S4/Krait misbehaves on a Thumb=>ARM | 349 | * S4/Krait misbehaves on a Thumb=>ARM signal transition |
351 | * signal transition without this. | 350 | * without this. |
351 | * | ||
352 | * We must do this whenever we are running on a Thumb-2 | ||
353 | * capable CPU, which includes ARMv6T2. However, we elect | ||
354 | * to always do this to simplify the code; this field is | ||
355 | * marked UNK/SBZP for older architectures. | ||
352 | */ | 356 | */ |
353 | cpsr &= ~PSR_IT_MASK; | 357 | cpsr &= ~PSR_IT_MASK; |
354 | #endif | ||
355 | 358 | ||
356 | if (thumb) { | 359 | if (thumb) { |
357 | cpsr |= PSR_T_BIT; | 360 | cpsr |= PSR_T_BIT; |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index e62604384945..1a7815e5421b 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -1249,7 +1249,7 @@ __iommu_create_mapping(struct device *dev, struct page **pages, size_t size) | |||
1249 | struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); | 1249 | struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); |
1250 | unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; | 1250 | unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; |
1251 | dma_addr_t dma_addr, iova; | 1251 | dma_addr_t dma_addr, iova; |
1252 | int i, ret = DMA_ERROR_CODE; | 1252 | int i; |
1253 | 1253 | ||
1254 | dma_addr = __alloc_iova(mapping, size); | 1254 | dma_addr = __alloc_iova(mapping, size); |
1255 | if (dma_addr == DMA_ERROR_CODE) | 1255 | if (dma_addr == DMA_ERROR_CODE) |
@@ -1257,6 +1257,8 @@ __iommu_create_mapping(struct device *dev, struct page **pages, size_t size) | |||
1257 | 1257 | ||
1258 | iova = dma_addr; | 1258 | iova = dma_addr; |
1259 | for (i = 0; i < count; ) { | 1259 | for (i = 0; i < count; ) { |
1260 | int ret; | ||
1261 | |||
1260 | unsigned int next_pfn = page_to_pfn(pages[i]) + 1; | 1262 | unsigned int next_pfn = page_to_pfn(pages[i]) + 1; |
1261 | phys_addr_t phys = page_to_phys(pages[i]); | 1263 | phys_addr_t phys = page_to_phys(pages[i]); |
1262 | unsigned int len, j; | 1264 | unsigned int len, j; |