lkml.org 
[lkml]   [2005]   [Aug]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subject[patch 31/39] remap_file_pages protection support: s390 bits
From
Date

From: Martin Schwidefsky <schwidefsky@de.ibm.com>

s390 memory management changes for remap-file-pages-prot patch:

- Add pgoff_prot_to_pte/pte_to_pgprot, remove pgoff_to_pte (required for
'prot' parameteter in shared-writeable mappings).

- Handle VM_FAULT_SIGSEGV from handle_mm_fault in do_exception.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
---

linux-2.6.git-paolo/arch/s390/mm/fault.c | 2
linux-2.6.git-paolo/include/asm-s390/pgtable.h | 90 ++++++++++++++++---------
2 files changed, 60 insertions(+), 32 deletions(-)

diff -puN arch/s390/mm/fault.c~rfp-arch-s390 arch/s390/mm/fault.c
--- linux-2.6.git/arch/s390/mm/fault.c~rfp-arch-s390 2005-08-12 19:27:58.000000000 +0200
+++ linux-2.6.git-paolo/arch/s390/mm/fault.c 2005-08-12 19:27:58.000000000 +0200
@@ -260,6 +260,8 @@ survive:
goto do_sigbus;
case VM_FAULT_OOM:
goto out_of_memory;
+ case VM_FAULT_SIGSEGV:
+ goto bad_area;
default:
BUG();
}
diff -puN include/asm-s390/pgtable.h~rfp-arch-s390 include/asm-s390/pgtable.h
--- linux-2.6.git/include/asm-s390/pgtable.h~rfp-arch-s390 2005-08-12 19:27:58.000000000 +0200
+++ linux-2.6.git-paolo/include/asm-s390/pgtable.h 2005-08-12 19:27:58.000000000 +0200
@@ -211,16 +211,41 @@ extern char empty_zero_page[PAGE_SIZE];
* C : changed bit
*/

-/* Hardware bits in the page table entry */
+/* Hardware bits in the page table entry. */
#define _PAGE_RO 0x200 /* HW read-only */
#define _PAGE_INVALID 0x400 /* HW invalid */

-/* Mask and four different kinds of invalid pages. */
-#define _PAGE_INVALID_MASK 0x601
+/* Software bits in the page table entry. */
+#define _PAGE_FILE 0x001
+#define _PAGE_PROTNONE 0x002
+
+/*
+ * We have 8 different page "types", two valid types and 6 invalid types
+ * (p = page address, o = swap offset, t = swap type, f = file offset):
+ * 0 xxxxxxxxxxxxxxxxxxx 0IP0 yyyyyy NF
+ * valid rw: 0 <--------p--------> 0000 <--0-> 00
+ * valid ro: 0 <--------p--------> 0010 <--0-> 00
+ * invalid none: 0 <--------p--------> 0100 <--0-> 10
+ * invalid empty: 0 <--------0--------> 0100 <--0-> 00
+ * invalid swap: 0 <--------o--------> 0110 <--t-> 00
+ * invalid file rw: 0 <--------f--------> 0100 <--f-> 01
+ * invalid file ro: 0 <--------f--------> 0110 <--f-> 01
+ * invaild file none: 0 <--------f--------> 0100 <--f-> 11
+ *
+ * The format for 64 bit is almost identical, there isn't a leading zero
+ * and the number of bits in the page address part of the pte is 52 bits
+ * instead of 19.
+ */
+
#define _PAGE_INVALID_EMPTY 0x400
-#define _PAGE_INVALID_NONE 0x401
#define _PAGE_INVALID_SWAP 0x600
-#define _PAGE_INVALID_FILE 0x601
+#define _PAGE_INVALID_FILE 0x401
+
+#define _PTE_IS_VALID(__pte) (!(pte_val(__pte) & _PAGE_INVALID))
+#define _PTE_IS_NONE(__pte) ((pte_val(__pte) & 0x603) == 0x402)
+#define _PTE_IS_EMPTY(__pte) ((pte_val(__pte) & 0x603) == 0x400)
+#define _PTE_IS_SWAP(__pte) ((pte_val(__pte) & 0x603) == 0x600)
+#define _PTE_IS_FILE(__pte) ((pte_val(__pte) & 0x401) == 0x401)

#ifndef __s390x__

@@ -281,13 +306,11 @@ extern char empty_zero_page[PAGE_SIZE];
/*
* No mapping available
*/
-#define PAGE_NONE_SHARED __pgprot(_PAGE_INVALID_NONE)
-#define PAGE_NONE_PRIVATE __pgprot(_PAGE_INVALID_NONE)
-#define PAGE_RO_SHARED __pgprot(_PAGE_RO)
-#define PAGE_RO_PRIVATE __pgprot(_PAGE_RO)
-#define PAGE_COPY __pgprot(_PAGE_RO)
-#define PAGE_SHARED __pgprot(0)
-#define PAGE_KERNEL __pgprot(0)
+#define PAGE_NONE __pgprot(_PAGE_INVALID | _PAGE_PROTNONE)
+#define PAGE_READONLY __pgprot(_PAGE_RO)
+#define PAGE_COPY __pgprot(_PAGE_RO)
+#define PAGE_SHARED __pgprot(0)
+#define PAGE_KERNEL __pgprot(0)

/*
* The S390 can't do page protection for execute, and considers that the
@@ -295,21 +318,21 @@ extern char empty_zero_page[PAGE_SIZE];
* the closest we can get..
*/
/*xwr*/
-#define __P000 PAGE_NONE_PRIVATE
-#define __P001 PAGE_RO_PRIVATE
+#define __P000 PAGE_NONE
+#define __P001 PAGE_READONLY
#define __P010 PAGE_COPY
#define __P011 PAGE_COPY
-#define __P100 PAGE_RO_PRIVATE
-#define __P101 PAGE_RO_PRIVATE
+#define __P100 PAGE_READONLY
+#define __P101 PAGE_READONLY
#define __P110 PAGE_COPY
#define __P111 PAGE_COPY

-#define __S000 PAGE_NONE_SHARED
-#define __S001 PAGE_RO_SHARED
+#define __S000 PAGE_NONE
+#define __S001 PAGE_READONLY
#define __S010 PAGE_SHARED
#define __S011 PAGE_SHARED
-#define __S100 PAGE_RO_SHARED
-#define __S101 PAGE_RO_SHARED
+#define __S100 PAGE_READONLY
+#define __S101 PAGE_READONLY
#define __S110 PAGE_SHARED
#define __S111 PAGE_SHARED

@@ -376,18 +399,17 @@ extern inline int pmd_bad(pmd_t pmd)

extern inline int pte_none(pte_t pte)
{
- return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_EMPTY;
+ return _PTE_IS_EMPTY(pte);
}

extern inline int pte_present(pte_t pte)
{
- return !(pte_val(pte) & _PAGE_INVALID) ||
- (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_NONE;
+ return _PTE_IS_VALID(pte) || _PTE_IS_NONE(pte);
}

extern inline int pte_file(pte_t pte)
{
- return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_FILE;
+ return _PTE_IS_FILE(pte);
}

#define pte_same(a,b) (pte_val(a) == pte_val(b))
@@ -476,8 +498,8 @@ extern inline pte_t pte_modify(pte_t pte

extern inline pte_t pte_wrprotect(pte_t pte)
{
- /* Do not clobber _PAGE_INVALID_NONE pages! */
- if (!(pte_val(pte) & _PAGE_INVALID))
+ /* Do not clobber PROT_NONE pages! */
+ if (!_PTE_IS_NONE(pte))
pte_val(pte) |= _PAGE_RO;
return pte;
}
@@ -774,17 +796,21 @@ extern inline pte_t mk_swap_pte(unsigned
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })

#ifndef __s390x__
-# define PTE_FILE_MAX_BITS 26
+# define PTE_FILE_MAX_BITS 25
#else /* __s390x__ */
-# define PTE_FILE_MAX_BITS 59
+# define PTE_FILE_MAX_BITS 58
#endif /* __s390x__ */

#define pte_to_pgoff(__pte) \
- ((((__pte).pte >> 12) << 7) + (((__pte).pte >> 1) & 0x7f))
+ ((((__pte).pte >> 12) << 6) + (((__pte).pte >> 2) & 0x3f))
+
+#define pte_to_pgprot(pte) \
+ __pgprot(pte_val(pte) & (_PAGE_RO | _PAGE_PROTNONE))

-#define pgoff_to_pte(__off) \
- ((pte_t) { ((((__off) & 0x7f) << 1) + (((__off) >> 7) << 12)) \
- | _PAGE_INVALID_FILE })
+#define pgoff_prot_to_pte(__off, __prot) \
+ ((pte_t) { _PAGE_INVALID_FILE | \
+ ((((__off) & 0x3f) << 2) + (((__off) >> 6) << 12)) | \
+ (pgprot_val(__prot) & (_PAGE_RO | _PAGE_PROTNONE)) })

#endif /* !__ASSEMBLY__ */

_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-08-12 20:57    [W:0.059 / U:0.460 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site