Commit 45592145 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://www.atmel.no/~hskinnemoen/linux/kernel/avr32

* 'for-linus' of git://www.atmel.no/~hskinnemoen/linux/kernel/avr32:
  avr32: dma-mapping.h
  [AVR32] Don't use kmap() in flush_icache_page()
  [AVR32] Fix bogus ti->flags manipulation in debug handler
  [AVR32] Fix typo in include/asm-avr32/Kbuild
  [AVR32] show_trace: Only walk valid stack addresses
  [AVR32] at32_spi_setup_slaves should be __init
parents 0782588b a9e28d9b
...@@ -313,7 +313,7 @@ asmlinkage void do_debug_priv(struct pt_regs *regs) ...@@ -313,7 +313,7 @@ asmlinkage void do_debug_priv(struct pt_regs *regs)
__mtdr(DBGREG_DC, dc); __mtdr(DBGREG_DC, dc);
ti = current_thread_info(); ti = current_thread_info();
ti->flags |= _TIF_BREAKPOINT; set_ti_thread_flag(ti, TIF_BREAKPOINT);
/* The TLB miss handlers don't check thread flags */ /* The TLB miss handlers don't check thread flags */
if ((regs->pc >= (unsigned long)&itlb_miss) if ((regs->pc >= (unsigned long)&itlb_miss)
...@@ -328,7 +328,7 @@ asmlinkage void do_debug_priv(struct pt_regs *regs) ...@@ -328,7 +328,7 @@ asmlinkage void do_debug_priv(struct pt_regs *regs)
* single step. * single step.
*/ */
if ((regs->sr & MODE_MASK) != MODE_SUPERVISOR) if ((regs->sr & MODE_MASK) != MODE_SUPERVISOR)
ti->flags |= TIF_SINGLE_STEP; set_ti_thread_flag(ti, TIF_SINGLE_STEP);
} else { } else {
panic("Unable to handle debug trap at pc = %08lx\n", panic("Unable to handle debug trap at pc = %08lx\n",
regs->pc); regs->pc);
......
...@@ -49,39 +49,45 @@ static void dump_mem(const char *str, unsigned long bottom, unsigned long top) ...@@ -49,39 +49,45 @@ static void dump_mem(const char *str, unsigned long bottom, unsigned long top)
return; return;
} }
static inline int valid_stack_ptr(struct thread_info *tinfo, unsigned long p)
{
return (p > (unsigned long)tinfo)
&& (p < (unsigned long)tinfo + THREAD_SIZE - 3);
}
#ifdef CONFIG_FRAME_POINTER #ifdef CONFIG_FRAME_POINTER
static inline void __show_trace(struct task_struct *tsk, unsigned long *sp, static inline void __show_trace(struct task_struct *tsk, unsigned long *sp,
struct pt_regs *regs) struct pt_regs *regs)
{ {
unsigned long __user *fp; unsigned long lr, fp;
unsigned long __user *last_fp = NULL; struct thread_info *tinfo;
if (regs) { tinfo = (struct thread_info *)
fp = (unsigned long __user *)regs->r7; ((unsigned long)sp & ~(THREAD_SIZE - 1));
} else if (tsk == current) {
register unsigned long __user *real_fp __asm__("r7"); if (regs)
fp = real_fp; fp = regs->r7;
} else { else if (tsk == current)
fp = (unsigned long __user *)tsk->thread.cpu_context.r7; asm("mov %0, r7" : "=r"(fp));
} else
fp = tsk->thread.cpu_context.r7;
/* /*
* Walk the stack until (a) we get an exception, (b) the frame * Walk the stack as long as the frame pointer (a) is within
* pointer becomes zero, or (c) the frame pointer gets stuck * the kernel stack of the task, and (b) it doesn't move
* at the same value. * downwards.
*/ */
while (fp && fp != last_fp) { while (valid_stack_ptr(tinfo, fp)) {
unsigned long lr, new_fp = 0; unsigned long new_fp;
last_fp = fp;
if (__get_user(lr, fp))
break;
if (fp && __get_user(new_fp, fp + 1))
break;
fp = (unsigned long __user *)new_fp;
lr = *(unsigned long *)fp;
printk(" [<%08lx>] ", lr); printk(" [<%08lx>] ", lr);
print_symbol("%s\n", lr); print_symbol("%s\n", lr);
new_fp = *(unsigned long *)(fp + 4);
if (new_fp <= fp)
break;
fp = new_fp;
} }
printk("\n"); printk("\n");
} }
......
...@@ -752,7 +752,7 @@ static struct resource atmel_spi1_resource[] = { ...@@ -752,7 +752,7 @@ static struct resource atmel_spi1_resource[] = {
DEFINE_DEV(atmel_spi, 1); DEFINE_DEV(atmel_spi, 1);
DEV_CLK(spi_clk, atmel_spi1, pba, 1); DEV_CLK(spi_clk, atmel_spi1, pba, 1);
static void static void __init
at32_spi_setup_slaves(unsigned int bus_num, struct spi_board_info *b, at32_spi_setup_slaves(unsigned int bus_num, struct spi_board_info *b,
unsigned int n, const u8 *pins) unsigned int n, const u8 *pins)
{ {
......
...@@ -121,9 +121,8 @@ void flush_icache_range(unsigned long start, unsigned long end) ...@@ -121,9 +121,8 @@ void flush_icache_range(unsigned long start, unsigned long end)
void flush_icache_page(struct vm_area_struct *vma, struct page *page) void flush_icache_page(struct vm_area_struct *vma, struct page *page)
{ {
if (vma->vm_flags & VM_EXEC) { if (vma->vm_flags & VM_EXEC) {
void *v = kmap(page); void *v = page_address(page);
__flush_icache_range((unsigned long)v, (unsigned long)v + PAGE_SIZE); __flush_icache_range((unsigned long)v, (unsigned long)v + PAGE_SIZE);
kunmap(v);
} }
} }
......
include include/asm-generic/Kbuild.asm include include/asm-generic/Kbuild.asm
headers-y += cachectl.h header-y += cachectl.h
...@@ -274,6 +274,24 @@ dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, ...@@ -274,6 +274,24 @@ dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
dma_cache_sync(dev, bus_to_virt(dma_handle), size, direction); dma_cache_sync(dev, bus_to_virt(dma_handle), size, direction);
} }
static inline void
dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
unsigned long offset, size_t size,
enum dma_data_direction direction)
{
/* just sync everything, that's all the pci API can do */
dma_sync_single_for_cpu(dev, dma_handle, offset+size, direction);
}
static inline void
dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
unsigned long offset, size_t size,
enum dma_data_direction direction)
{
/* just sync everything, that's all the pci API can do */
dma_sync_single_for_device(dev, dma_handle, offset+size, direction);
}
/** /**
* dma_sync_sg_for_cpu * dma_sync_sg_for_cpu
* @dev: valid struct device pointer, or NULL for ISA and EISA-like devices * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment