lkml.org 
[lkml]   [2004]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
Subject[PATCH 12/17] 4level support for s390
From
4level support for s390

s390/s390x works with 3 levels (thanks to Martin S.)

Signed-off-by: Andi Kleen <ak@suse.de>

diff -urpN -X ../KDIFX linux-2.6.10rc1/arch/s390/mm/init.c linux-2.6.10rc1-4level/arch/s390/mm/init.c
--- linux-2.6.10rc1/arch/s390/mm/init.c 2004-08-15 19:45:11.000000000 +0200
+++ linux-2.6.10rc1-4level/arch/s390/mm/init.c 2004-10-25 04:48:09.000000000 +0200
@@ -40,6 +40,26 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_ga
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE)));
char empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));

+pgd_t *
+__pgd_alloc(struct mm_struct *mm, pml4_t *dummy, unsigned long addr)
+{
+ pgd_t *pgd;
+ int i;
+
+#ifndef __s390x__
+ pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,1);
+ if (pgd != NULL)
+ for (i = 0; i < PTRS_PER_PGD; i++)
+ pmd_clear(pmd_offset(pgd + i, i*PGDIR_SIZE));
+#else /* __s390x__ */
+ pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,2);
+ if (pgd != NULL)
+ for (i = 0; i < PTRS_PER_PGD; i++)
+ pgd_clear(pgd + i);
+#endif /* __s390x__ */
+ return pgd;
+}
+
void diag10(unsigned long addr)
{
if (addr >= 0x7ff00000)
diff -urpN -X ../KDIFX linux-2.6.10rc1/arch/s390/mm/ioremap.c linux-2.6.10rc1-4level/arch/s390/mm/ioremap.c
--- linux-2.6.10rc1/arch/s390/mm/ioremap.c 2004-06-16 12:22:52.000000000 +0200
+++ linux-2.6.10rc1-4level/arch/s390/mm/ioremap.c 2004-10-25 04:48:09.000000000 +0200
@@ -76,7 +76,7 @@ static int remap_area_pages(unsigned lon
unsigned long end = address + size;

phys_addr -= address;
- dir = pgd_offset(&init_mm, address);
+ dir = pml4_pgd_offset(&init_mm, address);
flush_cache_all();
if (address >= end)
BUG();
diff -urpN -X ../KDIFX linux-2.6.10rc1/include/asm-s390/mmu_context.h linux-2.6.10rc1-4level/include/asm-s390/mmu_context.h
--- linux-2.6.10rc1/include/asm-s390/mmu_context.h 2004-04-06 13:12:20.000000000 +0200
+++ linux-2.6.10rc1-4level/include/asm-s390/mmu_context.h 2004-10-25 04:48:10.000000000 +0200
@@ -26,13 +26,13 @@ static inline void switch_mm(struct mm_s
{
if (prev != next) {
#ifndef __s390x__
- S390_lowcore.user_asce = (__pa(next->pgd)&PAGE_MASK) |
+ S390_lowcore.user_asce = (__pa(next->pml4)&PAGE_MASK) |
(_SEGMENT_TABLE|USER_STD_MASK);
/* Load home space page table origin. */
asm volatile("lctl 13,13,%0"
: : "m" (S390_lowcore.user_asce) );
#else /* __s390x__ */
- S390_lowcore.user_asce = (__pa(next->pgd) & PAGE_MASK) |
+ S390_lowcore.user_asce = (__pa(next->pml4) & PAGE_MASK) |
(_REGION_TABLE|USER_STD_MASK);
/* Load home space page table origin. */
asm volatile("lctlg 13,13,%0"
diff -urpN -X ../KDIFX linux-2.6.10rc1/include/asm-s390/page.h linux-2.6.10rc1-4level/include/asm-s390/page.h
--- linux-2.6.10rc1/include/asm-s390/page.h 2004-10-19 01:55:34.000000000 +0200
+++ linux-2.6.10rc1-4level/include/asm-s390/page.h 2004-10-25 04:48:10.000000000 +0200
@@ -200,6 +200,8 @@ page_get_storage_key(unsigned long addr)
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)

+#include <asm-generic/nopml4-page.h>
+
#endif /* __KERNEL__ */

#endif /* _S390_PAGE_H */
diff -urpN -X ../KDIFX linux-2.6.10rc1/include/asm-s390/pgalloc.h linux-2.6.10rc1-4level/include/asm-s390/pgalloc.h
--- linux-2.6.10rc1/include/asm-s390/pgalloc.h 2004-05-10 09:44:23.000000000 +0200
+++ linux-2.6.10rc1-4level/include/asm-s390/pgalloc.h 2004-10-25 04:48:10.000000000 +0200
@@ -29,25 +29,6 @@ extern void diag10(unsigned long addr);
* if any.
*/

-static inline pgd_t *pgd_alloc(struct mm_struct *mm)
-{
- pgd_t *pgd;
- int i;
-
-#ifndef __s390x__
- pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,1);
- if (pgd != NULL)
- for (i = 0; i < USER_PTRS_PER_PGD; i++)
- pmd_clear(pmd_offset(pgd + i, i*PGDIR_SIZE));
-#else /* __s390x__ */
- pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,2);
- if (pgd != NULL)
- for (i = 0; i < PTRS_PER_PGD; i++)
- pgd_clear(pgd + i);
-#endif /* __s390x__ */
- return pgd;
-}
-
static inline void pgd_free(pgd_t *pgd)
{
#ifndef __s390x__
@@ -164,4 +145,6 @@ static inline void pte_free(struct page
*/
#define set_pgdir(addr,entry) do { } while(0)

+#include <asm-generic/nopml4-pgalloc.h>
+
#endif /* _S390_PGALLOC_H */
diff -urpN -X ../KDIFX linux-2.6.10rc1/include/asm-s390/pgtable.h linux-2.6.10rc1-4level/include/asm-s390/pgtable.h
--- linux-2.6.10rc1/include/asm-s390/pgtable.h 2004-10-19 01:55:34.000000000 +0200
+++ linux-2.6.10rc1-4level/include/asm-s390/pgtable.h 2004-10-25 04:48:10.000000000 +0200
@@ -90,15 +90,15 @@ extern char empty_zero_page[PAGE_SIZE];
* pgd entries used up by user/kernel:
*/
#ifndef __s390x__
-# define USER_PTRS_PER_PGD 512
-# define USER_PGD_PTRS 512
-# define KERNEL_PGD_PTRS 512
-# define FIRST_USER_PGD_NR 0
+# define USER_PGDS_IN_LAST_PML4 512
+# define USER_PGD_PTRS 512
+# define KERNEL_PGD_PTRS 512
+# define FIRST_USER_PGD_NR 0
#else /* __s390x__ */
-# define USER_PTRS_PER_PGD 2048
-# define USER_PGD_PTRS 2048
-# define KERNEL_PGD_PTRS 2048
-# define FIRST_USER_PGD_NR 0
+# define USER_PGDS_IN_LAST_PML4 2048
+# define USER_PGD_PTRS 2048
+# define KERNEL_PGD_PTRS 2048
+# define FIRST_USER_PGD_NR 0
#endif /* __s390x__ */

#define pte_ERROR(e) \
@@ -680,10 +680,7 @@ static inline pte_t mk_pte_phys(unsigned

/* to find an entry in a page-table-directory */
#define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
-
-/* to find an entry in a kernel page-table-directory */
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
+#define pgd_index_k(address) pgd_index(address)

#ifndef __s390x__

@@ -798,5 +795,7 @@ extern inline pte_t mk_swap_pte(unsigned
#define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
#include <asm-generic/pgtable.h>

+#include <asm-generic/nopml4-pgtable.h>
+
#endif /* _S390_PAGE_H */

diff -urpN -X ../KDIFX linux-2.6.10rc1/include/asm-s390/tlbflush.h linux-2.6.10rc1-4level/include/asm-s390/tlbflush.h
--- linux-2.6.10rc1/include/asm-s390/tlbflush.h 2004-03-21 21:11:56.000000000 +0100
+++ linux-2.6.10rc1-4level/include/asm-s390/tlbflush.h 2004-10-25 04:48:10.000000000 +0200
@@ -105,7 +105,7 @@ static inline void __flush_tlb_mm(struct
if (MACHINE_HAS_IDTE) {
asm volatile (".insn rrf,0xb98e0000,0,%0,%1,0"
: : "a" (2048),
- "a" (__pa(mm->pgd)&PAGE_MASK) : "cc" );
+ "a" (__pa(mm->pml4)&PAGE_MASK) : "cc" );
return;
}
preempt_disable();
-
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-03-22 14:07    [W:0.033 / U:0.116 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site