mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Howells <dhowells@redhat.com>
To: linux-am33-list@redhat.com
Cc: linux-kernel@vger.kernel.org, Mark Salter <msalter@redhat.com>
Subject: [PATCH 37/43] MN10300: Map userspace atomic op regs as a vmalloc page
Date: Tue, 26 Oct 2010 03:56:19 +0100	[thread overview]
Message-ID: <20101026025619.23512.61850.stgit@warthog.procyon.org.uk> (raw)
In-Reply-To: <20101026025301.23512.24525.stgit@warthog.procyon.org.uk>

From: Mark Salter <msalter@redhat.com>

The AM34 processor has an atomic operation that's the equivalent of LL/SC on
other architectures.  However, rather than being done through a pair of
instructions, it's driven by writing to a pair of memory-mapped CPU control
registers.

One set of these registers (AARU/ADRU/ASRU) is available for use by userspace,
but for userspace to access them a PTE must be set up to cover the region.
This is done by dedicating the first vmalloc region page to this purpose,
setting the permissions on its PTE such that userspace can access the page.

glibc is hardcoded to expect the registers to be there.

The way atomic ops are done through these registers is straightforward:

 (1) Write the address of the word you wish to access into AARU.  This causes
     the CPU to go and fetch that word and load it into ADRU.  The status bits
     are also cleared in ASRU.

 (2) The current data value is read from the ADRU register and modified.

 (3) To alter the data in RAM, the revised data is written back to the ADRU
     register, which causes the CPU to attempt to write it back.

 (4) The ASRU.RW flag (ASRU read watch), ASRU.LW flag (bus lock watch),
     ASRU.IW (interrupt watch) and the ASRU.BW (bus error watch) flags then
     must be checked to confirm that the operation wasn't aborted.  If any of
     the watches have been set to true, the operation was aborted.

Signed-off-by: Mark Salter <msalter@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
---

 arch/mn10300/include/asm/pgtable.h |    3 +++
 arch/mn10300/mm/init.c             |   21 +++++++++++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)


diff --git a/arch/mn10300/include/asm/pgtable.h b/arch/mn10300/include/asm/pgtable.h
index ba66606..b6e77f5 100644
--- a/arch/mn10300/include/asm/pgtable.h
+++ b/arch/mn10300/include/asm/pgtable.h
@@ -182,6 +182,9 @@ extern pte_t kernel_vmalloc_ptes[(VMALLOC_END - VMALLOC_START) / PAGE_SIZE];
 #define PAGE_KERNEL_LARGE	__pgprot(__PAGE_KERNEL_LARGE)
 #define PAGE_KERNEL_LARGE_EXEC	__pgprot(__PAGE_KERNEL_LARGE_EXEC)
 
+#define __PAGE_USERIO		(__PAGE_KERNEL_BASE | _PAGE_PROT_WKWU | _PAGE_NX)
+#define PAGE_USERIO		__pgprot(__PAGE_USERIO)
+
 /*
  * Whilst the MN10300 can do page protection for execute (given separate data
  * and insn TLBs), we are not supporting it at the moment. Write permission,
diff --git a/arch/mn10300/mm/init.c b/arch/mn10300/mm/init.c
index 1daf97f..48907cc 100644
--- a/arch/mn10300/mm/init.c
+++ b/arch/mn10300/mm/init.c
@@ -41,6 +41,10 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
 unsigned long highstart_pfn, highend_pfn;
 
+#ifdef CONFIG_MN10300_HAS_ATOMIC_OPS_UNIT
+static struct vm_struct user_iomap_vm;
+#endif
+
 /*
  * set up paging
  */
@@ -73,6 +77,23 @@ void __init paging_init(void)
 	/* pass the memory from the bootmem allocator to the main allocator */
 	free_area_init(zones_size);
 
+#ifdef CONFIG_MN10300_HAS_ATOMIC_OPS_UNIT
+	/* The Atomic Operation Unit registers need to be mapped to userspace
+	 * for all processes.  The following uses vm_area_register_early() to
+	 * reserve the first page of the vmalloc area and sets the pte for that
+	 * page.
+	 *
+	 * glibc hardcodes this virtual mapping, so we're pretty much stuck with
+	 * it from now on.
+	 */
+	user_iomap_vm.flags = VM_USERMAP;
+	user_iomap_vm.size = 1 << PAGE_SHIFT;
+	vm_area_register_early(&user_iomap_vm, PAGE_SIZE);
+	ppte = kernel_vmalloc_ptes;
+	set_pte(ppte, pfn_pte(USER_ATOMIC_OPS_PAGE_ADDR >> PAGE_SHIFT,
+			      PAGE_USERIO));
+#endif
+
 	local_flush_tlb_all();
 }
 


  parent reply	other threads:[~2010-10-26  2:56 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-26  2:53 [PATCH 00/43] MN10300: Add SMP support and AM34 CPU core support David Howells
2010-10-26  2:53 ` [PATCH 01/43] Partially revert patch that encloses asm-offset.h numbers in brackets David Howells
2010-10-26  2:53 ` [PATCH 02/43] MN10300: BUG to BUG_ON changes David Howells
2010-10-26  2:53 ` [PATCH 03/43] bitops: Change the bitmap index from int to unsigned long [mn10300] David Howells
2010-10-26  2:53 ` [PATCH 04/43] mn10300: Use pci_claim_resource David Howells
2010-10-26  2:53 ` [PATCH 05/43] MN10300: Prevent cnt32_to_63() from being preempted in sched_clock() David Howells
2010-10-26  2:53 ` [PATCH 06/43] Typedef SMP call function pointer David Howells
2010-10-26  2:53 ` [PATCH 07/43] MN10300: Don't cast away the volatile in test_bit() David Howells
2010-10-26  2:53 ` [PATCH 08/43] MN10300: Add reads[bwl]() and writes[bwl]() David Howells
2010-10-26  2:53 ` [PATCH 09/43] MN10300: Provide the functions to fully disable maskable interrupts David Howells
2010-10-26  2:53 ` [PATCH 10/43] MN10300: Differentiate AM33_2 and AM33_3 in config David Howells
2010-10-26  2:54 ` [PATCH 11/43] MN10300: Move DMA engine control reg defs to MN103E010 processor directory David Howells
2010-10-26  2:54 ` [PATCH 12/43] MN10300: Don't hard code the cacheline size in register defs David Howells
2010-10-26  2:54 ` [PATCH 13/43] MN10300: Add CPU register bits for AM34 David Howells
2010-10-26  2:54 ` [PATCH 14/43] MN10300: Remove monitor/JTAG functions David Howells
2010-10-26  2:54 ` [PATCH 15/43] MN10300: Cache: Split cache bits out of arch Kconfig David Howells
2010-10-26  2:54 ` [PATCH 16/43] MN10300: Provide a MN10300_CACHE_ENABLED config option David Howells
2010-10-26  2:54 ` [PATCH 17/43] MN10300: Reorder asm/cacheflush.h to put primitives first David Howells
2010-10-26  2:54 ` [PATCH 18/43] MN10300: AM34: The current cacheflush routines operate by controlling tag regs David Howells
2010-10-26  2:54 ` [PATCH 19/43] MN10300: Cacheflush functions should take unsigned long addresses David Howells
2010-10-26  2:54 ` [PATCH 20/43] MN10300: SMP: Differentiate local cache flushing David Howells
2010-10-26  2:54 ` [PATCH 21/43] MN10300: AM34: Add cacheflushing by using the AM34 purge registers David Howells
2010-10-26  2:54 ` [PATCH 22/43] MN10300: Allow some cacheflushes to be avoided if cache snooping is available David Howells
2010-10-26  2:55 ` [PATCH 23/43] MN10300: Cache: Implement SMP global cache flushing David Howells
2010-10-26  2:55 ` [PATCH 24/43] MN10300: Make the boot wrapper able to use writeback caching David Howells
2010-10-26  2:55 ` [PATCH 25/43] MN10300: AM34 erratum requires MMUCTR read and write on exception entry David Howells
2010-10-26  2:55 ` [PATCH 26/43] MN10300: Rename __flush_tlb*() to local_flush_tlb*() David Howells
2010-10-26  2:55 ` [PATCH 27/43] MN10300: Make the use of PIDR to mark TLB entries controllable David Howells
2010-10-26  2:55 ` [PATCH 28/43] MN10300: Use the [ID]PTEL2 registers rather than [ID]PTEL for TLB control David Howells
2010-10-26  2:55 ` [PATCH 29/43] MN10300: SMP TLB flushing David Howells
2010-10-26  2:55 ` [PATCH 30/43] MN10300: Make the FPU operate in non-lazy mode under SMP David Howells
2010-10-26  2:55 ` [PATCH 31/43] MN10300: Implement atomic ops using atomic ops unit David Howells
2010-10-26  2:55 ` [PATCH 32/43] MN10300: Optimise do_csum() David Howells
2010-10-26  2:55 ` [PATCH 33/43] MN10300: Make various interrupt priority settings configurable David Howells
2010-10-26  2:56 ` [PATCH 34/43] MN10300: Delete idle_timestamp from irq_cpustat_t David Howells
2010-10-26  2:56 ` [PATCH 35/43] MN10300: And Panasonic AM34 subarch and implement SMP David Howells
2010-10-27 13:31   ` [Linux-am33-list] " Suzuki Takashi
2010-10-27 14:33   ` David Howells
2010-10-26  2:56 ` [PATCH 36/43] MN10300: ASB2364: Add support for SMSC911X and SMC911X David Howells
2010-10-26  2:56 ` David Howells [this message]
2010-10-26  2:56 ` [PATCH 38/43] MN10300: Specify an ELF HWCAP flag for MN10300 Atomic Operations Unit support David Howells
2010-10-26  2:56 ` [PATCH 39/43] MN10300: Generic time support David Howells
2010-10-26  2:56 ` [PATCH 40/43] MN10300: Update the ASB2303 defconfig David Howells
2010-10-26  2:56 ` [PATCH 41/43] MN10300: Create a defconfig for the ASB2364 board David Howells
2010-10-26  2:56 ` [PATCH 42/43] MN10300: Change "Matsushita" to "Panasonic" David Howells
2010-10-26  2:56 ` [PATCH 43/43] MN10300: Save frame pointer in thread_info struct rather than global var David Howells
2010-10-26  3:07 ` [PATCH 00/43] MN10300: Add SMP support and AM34 CPU core support David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20101026025619.23512.61850.stgit@warthog.procyon.org.uk \
    --to=dhowells@redhat.com \
    --cc=linux-am33-list@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=msalter@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®