Commit 425d3314 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/64s/hash: Provide arch_setup_exec() hooks for hash slice setup

This will be used by the SLB code in the next patch, but for now this
sets the slb_addr_limit to the correct size for 32-bit tasks.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 126b11b2
...@@ -487,6 +487,8 @@ int htab_remove_mapping(unsigned long vstart, unsigned long vend, ...@@ -487,6 +487,8 @@ int htab_remove_mapping(unsigned long vstart, unsigned long vend,
extern void pseries_add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages); extern void pseries_add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages);
extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr);
extern void hash__setup_new_exec(void);
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
void hpte_init_pseries(void); void hpte_init_pseries(void);
#else #else
......
...@@ -32,6 +32,7 @@ void slice_set_range_psize(struct mm_struct *mm, unsigned long start, ...@@ -32,6 +32,7 @@ void slice_set_range_psize(struct mm_struct *mm, unsigned long start,
unsigned long len, unsigned int psize); unsigned long len, unsigned int psize);
void slice_init_new_context_exec(struct mm_struct *mm); void slice_init_new_context_exec(struct mm_struct *mm);
void slice_setup_new_exec(void);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -72,6 +72,12 @@ static inline struct thread_info *current_thread_info(void) ...@@ -72,6 +72,12 @@ static inline struct thread_info *current_thread_info(void)
} }
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
#ifdef CONFIG_PPC_BOOK3S_64
void arch_setup_new_exec(void);
#define arch_setup_new_exec arch_setup_new_exec
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
/* /*
......
...@@ -1490,6 +1490,15 @@ void flush_thread(void) ...@@ -1490,6 +1490,15 @@ void flush_thread(void)
#endif /* CONFIG_HAVE_HW_BREAKPOINT */ #endif /* CONFIG_HAVE_HW_BREAKPOINT */
} }
#ifdef CONFIG_PPC_BOOK3S_64
void arch_setup_new_exec(void)
{
if (radix_enabled())
return;
hash__setup_new_exec();
}
#endif
int set_thread_uses_vas(void) int set_thread_uses_vas(void)
{ {
#ifdef CONFIG_PPC_BOOK3S_64 #ifdef CONFIG_PPC_BOOK3S_64
......
...@@ -84,6 +84,11 @@ static int hash__init_new_context(struct mm_struct *mm) ...@@ -84,6 +84,11 @@ static int hash__init_new_context(struct mm_struct *mm)
return index; return index;
} }
void hash__setup_new_exec(void)
{
slice_setup_new_exec();
}
static int radix__init_new_context(struct mm_struct *mm) static int radix__init_new_context(struct mm_struct *mm)
{ {
unsigned long rts_field; unsigned long rts_field;
......
...@@ -757,6 +757,20 @@ void slice_init_new_context_exec(struct mm_struct *mm) ...@@ -757,6 +757,20 @@ void slice_init_new_context_exec(struct mm_struct *mm)
bitmap_fill(mask->high_slices, SLICE_NUM_HIGH); bitmap_fill(mask->high_slices, SLICE_NUM_HIGH);
} }
#ifdef CONFIG_PPC_BOOK3S_64
void slice_setup_new_exec(void)
{
struct mm_struct *mm = current->mm;
slice_dbg("slice_setup_new_exec(mm=%p)\n", mm);
if (!is_32bit_task())
return;
mm->context.slb_addr_limit = DEFAULT_MAP_WINDOW;
}
#endif
void slice_set_range_psize(struct mm_struct *mm, unsigned long start, void slice_set_range_psize(struct mm_struct *mm, unsigned long start,
unsigned long len, unsigned int psize) unsigned long len, unsigned int psize)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment