Skip to content

Commit

Permalink
Merge master.kernel.org:/home/rmk/linux-2.6-arm
Browse files Browse the repository at this point in the history
* master.kernel.org:/home/rmk/linux-2.6-arm:
  [ARM] Provide basic printk_clock() implementation
  [ARM] Resolve fuse and direct-IO failures due to missing cache flushes
  [ARM] pass vma for flush_anon_page()
  [ARM] Fix potential MMCI bug
  [ARM] Fix kernel-mode undefined instruction aborts
  [ARM] 4082/1: iop3xx: fix iop33x gpio register offset
  [ARM] 4070/1: arch/arm/kernel: fix warnings from missing includes
  [ARM] 4079/1: iop: Update MAINTAINERS
  • Loading branch information
Linus Torvalds committed Jan 8, 2007
2 parents fea5f1e + e97126c commit 74bda93
Show file tree
Hide file tree
Showing 13 changed files with 103 additions and 17 deletions.
5 changes: 3 additions & 2 deletions Documentation/cachetlb.txt
Original file line number Diff line number Diff line change
Expand Up @@ -373,14 +373,15 @@ maps this page at its virtual address.
likely that you will need to flush the instruction cache
for copy_to_user_page().

void flush_anon_page(struct page *page, unsigned long vmaddr)
void flush_anon_page(struct vm_area_struct *vma, struct page *page,
unsigned long vmaddr)
When the kernel needs to access the contents of an anonymous
page, it calls this function (currently only
get_user_pages()). Note: flush_dcache_page() deliberately
doesn't work for an anonymous page. The default
implementation is a nop (and should remain so for all coherent
architectures). For incoherent architectures, it should flush
the cache of the page at vmaddr in the current user process.
the cache of the page at vmaddr.

void flush_kernel_dcache_page(struct page *page)
When the kernel needs to modify a user page is has obtained
Expand Down
22 changes: 18 additions & 4 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -412,20 +412,32 @@ S: Maintained
ARM/INTEL IOP32X ARM ARCHITECTURE
P: Lennert Buytenhek
M: kernel@wantstofly.org
P: Dan Williams
M: dan.j.williams@intel.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained
S: Supported

ARM/INTEL IOP33X ARM ARCHITECTURE
P: Dan Williams
M: dan.j.williams@intel.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Supported

ARM/INTEL IOP13XX ARM ARCHITECTURE
P: Lennert Buytenhek
M: kernel@wantstofly.org
P: Dan Williams
M: dan.j.williams@intel.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained
S: Supported

ARM/INTEL IQ81342EX MACHINE SUPPORT
P: Lennert Buytenhek
M: kernel@wantstofly.org
P: Dan Williams
M: dan.j.williams@intel.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained
S: Supported

ARM/INTEL IXP2000 ARM ARCHITECTURE
P: Lennert Buytenhek
Expand All @@ -448,8 +460,10 @@ S: Maintained
ARM/INTEL XSC3 (MANZANO) ARM CORE
P: Lennert Buytenhek
M: kernel@wantstofly.org
P: Dan Williams
M: dan.j.williams@intel.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained
S: Supported

ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT
P: Lennert Buytenhek
Expand Down
12 changes: 8 additions & 4 deletions arch/arm/kernel/entry-armv.S
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ __und_usr:
usr_entry

tst r3, #PSR_T_BIT @ Thumb mode?
bne fpundefinstr @ ignore FP
bne __und_usr_unknown @ ignore FP
sub r4, r2, #4

@
Expand All @@ -448,7 +448,7 @@ __und_usr:
@
1: ldrt r0, [r4]
adr r9, ret_from_exception
adr lr, fpundefinstr
adr lr, __und_usr_unknown
@
@ fallthrough to call_fpe
@
Expand Down Expand Up @@ -476,7 +476,9 @@ __und_usr:
* Emulators may wish to make use of the following registers:
* r0 = instruction opcode.
* r2 = PC+4
* r9 = normal "successful" return address
* r10 = this threads thread_info structure.
* lr = unrecognised instruction return address
*/
call_fpe:
tst r0, #0x08000000 @ only CDP/CPRT/LDC/STC have bit 27
Expand Down Expand Up @@ -545,10 +547,12 @@ do_fpe:

.data
ENTRY(fp_enter)
.word fpundefinstr
.word no_fp
.text

fpundefinstr:
no_fp: mov pc, lr

__und_usr_unknown:
mov r0, sp
adr lr, ret_from_exception
b do_undefinstr
Expand Down
13 changes: 13 additions & 0 deletions arch/arm/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
#include <linux/timer.h>
#include <linux/irq.h>

#include <linux/mc146818rtc.h>

#include <asm/leds.h>
#include <asm/thread_info.h>
#include <asm/mach/time.h>
Expand Down Expand Up @@ -85,6 +87,17 @@ unsigned long long __attribute__((weak)) sched_clock(void)
return (unsigned long long)jiffies * (1000000000 / HZ);
}

/*
* An implementation of printk_clock() independent from
* sched_clock(). This avoids non-bootable kernels when
* printk_clock is enabled.
*/
unsigned long long printk_clock(void)
{
return (unsigned long long)(jiffies - INITIAL_JIFFIES) *
(1000000000 / HZ);
}

static unsigned long next_rtc_update;

/*
Expand Down
1 change: 1 addition & 0 deletions arch/arm/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <asm/uaccess.h>
#include <asm/unistd.h>
#include <asm/traps.h>
#include <asm/io.h>

#include "ptrace.h"
#include "signal.h"
Expand Down
39 changes: 39 additions & 0 deletions arch/arm/mm/flush.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,3 +202,42 @@ void flush_dcache_page(struct page *page)
}
}
EXPORT_SYMBOL(flush_dcache_page);

/*
* Flush an anonymous page so that users of get_user_pages()
* can safely access the data. The expected sequence is:
*
* get_user_pages()
* -> flush_anon_page
* memcpy() to/from page
* if written to page, flush_dcache_page()
*/
void __flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
{
unsigned long pfn;

/* VIPT non-aliasing caches need do nothing */
if (cache_is_vipt_nonaliasing())
return;

/*
* Write back and invalidate userspace mapping.
*/
pfn = page_to_pfn(page);
if (cache_is_vivt()) {
flush_cache_page(vma, vmaddr, pfn);
} else {
/*
* For aliasing VIPT, we can flush an alias of the
* userspace address only.
*/
flush_pfn_alias(pfn, vmaddr);
}

/*
* Invalidate kernel mapping. No data should be contained
* in this mapping of the page. FIXME: this is overkill
* since we actually ask for a write-back and invalidate.
*/
__cpuc_flush_dcache_page(page_address(page));
}
4 changes: 4 additions & 0 deletions drivers/mmc/mmci.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ mmci_request_end(struct mmci_host *host, struct mmc_request *mrq)
{
writel(0, host->base + MMCICOMMAND);

BUG_ON(host->data);

host->mrq = NULL;
host->cmd = NULL;

Expand Down Expand Up @@ -198,6 +200,8 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
}

if (!cmd->data || cmd->error != MMC_ERR_NONE) {
if (host->data)
mmci_stop_data(host);
mmci_request_end(host, cmd->mrq);
} else if (!(cmd->data->flags & MMC_DATA_READ)) {
mmci_start_data(host, cmd->data);
Expand Down
2 changes: 1 addition & 1 deletion include/asm-arm/arch-iop32x/iop32x.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
* Peripherals that are shared between the iop32x and iop33x but
* located at different addresses.
*/
#define IOP3XX_GPIO_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07c0 + (reg))
#define IOP3XX_GPIO_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07c4 + (reg))
#define IOP3XX_TIMER_REG(reg) (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07e0 + (reg))

#include <asm/hardware/iop3xx.h>
Expand Down
10 changes: 10 additions & 0 deletions include/asm-arm/cacheflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,16 @@ extern void flush_dcache_page(struct page *);

extern void __flush_dcache_page(struct address_space *mapping, struct page *page);

#define ARCH_HAS_FLUSH_ANON_PAGE
static inline void flush_anon_page(struct vm_area_struct *vma,
struct page *page, unsigned long vmaddr)
{
extern void __flush_anon_page(struct vm_area_struct *vma,
struct page *, unsigned long);
if (PageAnon(page))
__flush_anon_page(vma, page, vmaddr);
}

#define flush_dcache_mmap_lock(mapping) \
write_lock_irq(&(mapping)->tree_lock)
#define flush_dcache_mmap_unlock(mapping) \
Expand Down
6 changes: 3 additions & 3 deletions include/asm-arm/hardware/iop3xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,9 +168,9 @@ extern void gpio_line_set(int line, int value);
#define IOP3XX_PERCR0 (volatile u32 *)IOP3XX_REG_ADDR(0x0710)

/* General Purpose I/O */
#define IOP3XX_GPOE (volatile u32 *)IOP3XX_GPIO_REG(0x0004)
#define IOP3XX_GPID (volatile u32 *)IOP3XX_GPIO_REG(0x0008)
#define IOP3XX_GPOD (volatile u32 *)IOP3XX_GPIO_REG(0x000c)
#define IOP3XX_GPOE (volatile u32 *)IOP3XX_GPIO_REG(0x0000)
#define IOP3XX_GPID (volatile u32 *)IOP3XX_GPIO_REG(0x0004)
#define IOP3XX_GPOD (volatile u32 *)IOP3XX_GPIO_REG(0x0008)

/* Timers */
#define IOP3XX_TU_TMR0 (volatile u32 *)IOP3XX_TIMER_REG(0x0000)
Expand Down
2 changes: 1 addition & 1 deletion include/asm-parisc/cacheflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long
}

static inline void
flush_anon_page(struct page *page, unsigned long vmaddr)
flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
{
if (PageAnon(page))
flush_user_dcache_page(vmaddr);
Expand Down
2 changes: 1 addition & 1 deletion include/linux/highmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include <asm/cacheflush.h>

#ifndef ARCH_HAS_FLUSH_ANON_PAGE
static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
{
}
#endif
Expand Down
2 changes: 1 addition & 1 deletion mm/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -1091,7 +1091,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
if (pages) {
pages[i] = page;

flush_anon_page(page, start);
flush_anon_page(vma, page, start);
flush_dcache_page(page);
}
if (vmas)
Expand Down

0 comments on commit 74bda93

Please sign in to comment.