* [PATCH v4] Virtual memory size detection for 64 bit MIPS CPUs
@ 2010-02-02 0:02 Guenter Roeck
2010-02-02 10:04 ` Sergei Shtylyov
0 siblings, 1 reply; 2+ messages in thread
From: Guenter Roeck @ 2010-02-02 0:02 UTC (permalink / raw)
To: linux-mips; +Cc: Guenter Roeck
Linux kernel 2.6.32 and later allocates memory from the top of virtual memory
space.
This patch implements virtual memory size detection for 64 bit MIPS CPUs
to avoid resulting crashes.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
---
arch/mips/include/asm/cpu-features.h | 3 +++
arch/mips/include/asm/cpu-info.h | 1 +
arch/mips/include/asm/pgtable-64.h | 4 +++-
arch/mips/kernel/cpu-probe.c | 12 ++++++++++++
4 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h
index 1f4df64..284eb55 100644
--- a/arch/mips/include/asm/cpu-features.h
+++ b/arch/mips/include/asm/cpu-features.h
@@ -209,6 +209,9 @@
# ifndef cpu_has_64bit_addresses
# define cpu_has_64bit_addresses 1
# endif
+# ifndef cpu_vmbits
+# define cpu_vmbits cpu_data[0].vmbits
+# endif
#endif
#if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint)
diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h
index 1260443..3c694bc 100644
--- a/arch/mips/include/asm/cpu-info.h
+++ b/arch/mips/include/asm/cpu-info.h
@@ -58,6 +58,7 @@ struct cpuinfo_mips {
struct cache_desc tcache; /* Tertiary/split secondary cache */
int srsets; /* Shadow register sets */
int core; /* physical core number */
+ int vmbits; /* Virtual memory size in bits */
#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
/*
* In the MIPS MT "SMTC" model, each TC is considered
diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h
index 9cd5089..259ec58 100644
--- a/arch/mips/include/asm/pgtable-64.h
+++ b/arch/mips/include/asm/pgtable-64.h
@@ -110,7 +110,9 @@
#define VMALLOC_START MAP_BASE
#define VMALLOC_END \
(VMALLOC_START + \
- PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32))
+ min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
+ (1UL<<cpu_vmbits)) - (1UL << 32))
+
#if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
VMALLOC_START != CKSSEG
/* Load modules into 32bit-compatible segment. */
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index 7a51866..ac9aca1 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -282,6 +282,16 @@ static inline int __cpu_has_fpu(void)
return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE);
}
+static inline void cpu_set_vmbits(struct cpuinfo_mips *c)
+{
+ if (cpu_has_64bits) {
+ write_c0_entryhi(0xfffffffffffff000ULL);
+ back_to_back_c0_hazard();
+ c->vmbits = fls64(read_c0_entryhi() & 0x3ffffffffffff000ULL);
+ } else
+ c->vmbits = 32;
+}
+
#define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
| MIPS_CPU_COUNTER)
@@ -967,6 +977,8 @@ __cpuinit void cpu_probe(void)
c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
else
c->srsets = 1;
+
+ cpu_set_vmbits(c);
}
__cpuinit void cpu_report(void)
--
1.6.0.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v4] Virtual memory size detection for 64 bit MIPS CPUs
2010-02-02 0:02 [PATCH v4] Virtual memory size detection for 64 bit MIPS CPUs Guenter Roeck
@ 2010-02-02 10:04 ` Sergei Shtylyov
0 siblings, 0 replies; 2+ messages in thread
From: Sergei Shtylyov @ 2010-02-02 10:04 UTC (permalink / raw)
To: Guenter Roeck; +Cc: linux-mips
Hello.
Guenter Roeck wrote:
> Linux kernel 2.6.32 and later allocates memory from the top of virtual memory
> space.
>
> This patch implements virtual memory size detection for 64 bit MIPS CPUs
> to avoid resulting crashes.
>
> Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
>
[...]
> diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h
> index 9cd5089..259ec58 100644
> --- a/arch/mips/include/asm/pgtable-64.h
> +++ b/arch/mips/include/asm/pgtable-64.h
> @@ -110,7 +110,9 @@
> #define VMALLOC_START MAP_BASE
> #define VMALLOC_END \
> (VMALLOC_START + \
> - PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32))
> + min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
> + (1UL<<cpu_vmbits)) - (1UL << 32))
>
Why you've added spaces around the second << but not around the
first? Should be more consistent.
> +
> #if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
> VMALLOC_START != CKSSEG
> /* Load modules into 32bit-compatible segment. */
> diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
> index 7a51866..ac9aca1 100644
> --- a/arch/mips/kernel/cpu-probe.c
> +++ b/arch/mips/kernel/cpu-probe.c
> @@ -282,6 +282,16 @@ static inline int __cpu_has_fpu(void)
> return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE);
> }
>
> +static inline void cpu_set_vmbits(struct cpuinfo_mips *c)
> +{
> + if (cpu_has_64bits) {
> + write_c0_entryhi(0xfffffffffffff000ULL);
> + back_to_back_c0_hazard();
> + c->vmbits = fls64(read_c0_entryhi() & 0x3ffffffffffff000ULL);
>
I don't quite understand why set bits 62-63 only to mask them off
later...
WBR, Sergei
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-02-02 10:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-02 0:02 [PATCH v4] Virtual memory size detection for 64 bit MIPS CPUs Guenter Roeck
2010-02-02 10:04 ` Sergei Shtylyov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox