Message ID | 200812211446.56783.yur@emcraft.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Josh Boyer |
Headers | show |
Yuri Tikhonov <yur@emcraft.com> writes: > Because ELF standard supports only page sizes up to 64K, then you should > use patched binutils for building applications to be run with the 256KB- > page sized kernel. The patch for binutils is rather trivial, and may > look as follows: > > --- binutils/bfd/elf32-ppc.c.orig > +++ binutils/bfd/elf32-ppc.c > > -#define ELF_MAXPAGESIZE 0x10000 > +#define ELF_MAXPAGESIZE 0x40000 You don't have to patch it, it's enough to pass -zmax-page-size=0x40000 to the linker. Andreas.
Hello Andreas, On Sunday, December 21, 2008 you wrote: > Yuri Tikhonov <yur@emcraft.com> writes: >> Because ELF standard supports only page sizes up to 64K, then you should >> use patched binutils for building applications to be run with the 256KB- >> page sized kernel. The patch for binutils is rather trivial, and may >> look as follows: >> >> --- binutils/bfd/elf32-ppc.c.orig >> +++ binutils/bfd/elf32-ppc.c >> >> -#define ELF_MAXPAGESIZE 0x10000 >> +#define ELF_MAXPAGESIZE 0x40000 > You don't have to patch it, it's enough to pass -zmax-page-size=0x40000 > to the linker. Thanks for pointing this. I guess, the -zmax-page-size option is new to binutils 2.17.50.0.10. Right? I'll remove the STDBINUTILS config option from this patch then, and correspondingly update the description. Regards, Yuri -- Yuri Tikhonov, Senior Software Engineer Emcraft Systems, www.emcraft.com
Yuri Tikhonov <yur@emcraft.com> writes: > Thanks for pointing this. I guess, the -zmax-page-size option is new > to binutils 2.17.50.0.10. Right? It was added 2½ years ago. Andreas.
On Sunday, December 21, 2008 you wrote: > Yuri Tikhonov <yur@emcraft.com> writes: >> Thanks for pointing this. I guess, the -zmax-page-size option is new >> to binutils 2.17.50.0.10. Right? > It was added 2½ years ago. Yes, approximately: http://gcc.gnu.org/ml/gcc/2006-07/msg00361.html " Date: Sat, 15 Jul 2006 15:19:05 -0700 Subject: The Linux binutils 2.17.50.0.3 is released Changes from binutils 2.17.50.0.2: ... 16. Add "-z max-page-size=" and "-z common-page-size=" to ELF linker. " >> I'll remove the STDBINUTILS config option from this patch then, and >> correspondingly update the description. I thought about this more, and I guess that we should keep the dependency on the newly introduced by this patch STDBINUTILS option. Perhaps, change it name to, say, STD_ELF_LINKING. Because, in any case, either should we patch binutils, or should we pass some non-default value to the linker: the resulted application doesn't match the ELF standard, and the applications which match the standard simply won't work with the 256K paged kernel - so, a user has to be aware of it before turning the 256K on. What do you think about this? Regards, Yuri
Yuri Tikhonov <yur@emcraft.com> writes: > Because, in any case, either should we patch binutils, or should we > pass some non-default value to the linker: the resulted application > doesn't match the ELF standard An ELF object built with a 256k alignment of is still perfectly compliant. Andreas.
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index cd8ff7c..3338e71 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -436,6 +436,18 @@ config PPC_64K_PAGES bool "64k page size" if 44x || PPC_STD_MMU_64 select PPC_HAS_HASH_64K if PPC_STD_MMU_64 +config PPC_256K_PAGES + bool "256k page size" if 44x + depends on !STDBINUTILS + help + Make the page size 256k. + + As the ELF standard only requires alignment to support page + sizes up to 64k, you will need to compile all of your user + space applications with a patched binutils. + + Say N unless you know what you are doing. + endchoice config FORCE_MAX_ZONEORDER @@ -448,6 +460,8 @@ config FORCE_MAX_ZONEORDER default "9" if PPC_STD_MMU_32 && PPC_16K_PAGES range 7 64 if PPC_STD_MMU_32 && PPC_64K_PAGES default "7" if PPC_STD_MMU_32 && PPC_64K_PAGES + range 5 64 if PPC_STD_MMU_32 && PPC_256K_PAGES + default "5" if PPC_STD_MMU_32 && PPC_256K_PAGES range 11 64 default "11" help diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index 7d6bb37..0d1333f 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -39,15 +39,15 @@ extern pte_t *pkmap_page_table; * chunk of RAM. */ /* - * We use one full pte table with 4K pages. And with 16K/64K pages pte - * table covers enough memory (32MB and 512MB resp.) that both FIXMAP - * and PKMAP can be placed in single pte table. We use 1024 pages for - * PKMAP in case of 16K/64K pages. + * We use one full pte table with 4K pages. And with 16K/64K/256K pages pte + * table covers enough memory (32MB/512MB/2GB resp.), so that both FIXMAP + * and PKMAP can be placed in a single pte table. We use 512 pages for PKMAP + * in case of 16K/64K/256K page sizes. */ #ifdef CONFIG_PPC_4K_PAGES #define PKMAP_ORDER PTE_SHIFT #else -#define PKMAP_ORDER 10 +#define PKMAP_ORDER 9 #endif #define LAST_PKMAP (1 << PKMAP_ORDER) #ifndef CONFIG_PPC_4K_PAGES diff --git a/arch/powerpc/include/asm/mmu-44x.h b/arch/powerpc/include/asm/mmu-44x.h index 73e1909..52a2339 100644 --- a/arch/powerpc/include/asm/mmu-44x.h +++ b/arch/powerpc/include/asm/mmu-44x.h @@ -81,6 +81,8 @@ typedef struct { #define PPC44x_TLBE_SIZE PPC44x_TLB_16K #elif (PAGE_SHIFT == 16) #define PPC44x_TLBE_SIZE PPC44x_TLB_64K +#elif (PAGE_SHIFT == 18) +#define PPC44x_TLBE_SIZE PPC44x_TLB_256K #else #error "Unsupported PAGE_SIZE" #endif diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index 197d569..32cbf16 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h @@ -19,12 +19,14 @@ #include <asm/kdump.h> /* - * On regular PPC32 page size is 4K (but we support 4K/16K/64K pages + * On regular PPC32 page size is 4K (but we support 4K/16K/64K/256K pages * on PPC44x). For PPC64 we support either 4K or 64K software * page size. When using 64K pages however, whether we are really supporting * 64K pages in HW or not is irrelevant to those definitions. */ -#if defined(CONFIG_PPC_64K_PAGES) +#if defined(CONFIG_PPC_256K_PAGES) +#define PAGE_SHIFT 18 +#elif defined(CONFIG_PPC_64K_PAGES) #define PAGE_SHIFT 16 #elif defined(CONFIG_PPC_16K_PAGES) #define PAGE_SHIFT 14 diff --git a/arch/powerpc/include/asm/page_32.h b/arch/powerpc/include/asm/page_32.h index 1458d95..a0e3f6e 100644 --- a/arch/powerpc/include/asm/page_32.h +++ b/arch/powerpc/include/asm/page_32.h @@ -19,7 +19,11 @@ #define PTE_FLAGS_OFFSET 0 #endif +#ifdef CONFIG_PPC_256K_PAGES +#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2 - 2) /* 1/4 of a page */ +#else #define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2) /* full page */ +#endif #ifndef __ASSEMBLY__ /* diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 9665a26..e04286f 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h @@ -12,8 +12,10 @@ /* We have 8k stacks on ppc32 and 16k on ppc64 */ -#ifdef CONFIG_PPC64 +#if defined(CONFIG_PPC64) #define THREAD_SHIFT 14 +#elif defined(CONFIG_PPC_256K_PAGES) +#define THREAD_SHIFT 15 #else #define THREAD_SHIFT 13 #endif diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index fce2df9..17803ad 100644 --- a/arch/powerpc/kernel/head_booke.h +++ b/arch/powerpc/kernel/head_booke.h @@ -10,6 +10,15 @@ mtspr SPRN_IVOR##vector_number,r26; \ sync +#if (THREAD_SHIFT < 15) +#define ALLOC_STACK_FRAME(reg, val) \ + addi reg,reg,val +#else +#define ALLOC_STACK_FRAME(reg, val) \ + addis reg,reg,val@ha; \ + addi reg,reg,val@l +#endif + #define NORMAL_EXCEPTION_PROLOG \ mtspr SPRN_SPRG0,r10; /* save two registers to work with */\ mtspr SPRN_SPRG1,r11; \ @@ -20,7 +29,7 @@ beq 1f; \ mfspr r1,SPRN_SPRG3; /* if from user, start at top of */\ lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\ - addi r1,r1,THREAD_SIZE; \ + ALLOC_STACK_FRAME(r1, THREAD_SIZE); \ 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\ mr r11,r1; \ stw r10,_CCR(r11); /* save various registers */\ diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig index 3496bc0..346b293 100644 --- a/arch/powerpc/platforms/44x/Kconfig +++ b/arch/powerpc/platforms/44x/Kconfig @@ -214,6 +214,16 @@ config 440SPe bool select IBM_NEW_EMAC_EMAC4 +config STDBINUTILS + bool "Using standard binutils" + depends on 44x + default y + help + Turning this option off allows you to select 256KB PAGE_SIZE on 44x. + Note, that kernel will be able to run only those applications, + which had been compiled using the patched binutils (ELF standard + supports only page sizes up to 64K). + config 460EX bool select PPC_FPU