fix nxemu

This commit is contained in:
Kyle McMartin 2011-05-30 13:13:15 -04:00
parent 9e66a07b07
commit 6ece5fb0c5
2 changed files with 22 additions and 27 deletions

View File

@ -1173,7 +1173,7 @@ ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch
# #
# Exec shield # Exec shield
# #
#ApplyPatch linux-2.6-i386-nx-emulation.patch ###FIX ApplyPatch linux-2.6-i386-nx-emulation.patch
ApplyPatch linux-2.6-32bit-mmap-exec-randomization.patch ApplyPatch linux-2.6-32bit-mmap-exec-randomization.patch
# #

View File

@ -3,21 +3,21 @@
@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
#include <asm/ldt.h> #include <asm/ldt.h>
#include <asm/mmu.h> #include <asm/mmu.h>
#include <linux/smp.h>
+#include <linux/mm_types.h> +#include <linux/mm_types.h>
#include <linux/smp.h>
static inline void fill_ldt(struct desc_struct *desc, static inline void fill_ldt(struct desc_struct *desc, const struct user_desc *info)
const struct user_desc *info) @@ -97,6 +98,9 @@ static inline int desc_empty(const void *ptr)
@@ -93,6 +94,9 @@ static inline int desc_empty(const void *ptr)
#define load_TLS(t, cpu) native_load_tls(t, cpu) #define load_TLS(t, cpu) native_load_tls(t, cpu)
#define set_ldt native_set_ldt #define set_ldt native_set_ldt
+#ifdef CONFIG_X86_32 +#ifdef CONFIG_X86_32
+#define load_user_cs_desc native_load_user_cs_desc +#define load_user_cs_desc native_load_user_cs_desc
+#endif /*CONFIG_X86_32*/ +#endif /*CONFIG_X86_32*/
#define write_ldt_entry(dt, entry, desc) \ #define write_ldt_entry(dt, entry, desc) native_write_ldt_entry(dt, entry, desc)
native_write_ldt_entry(dt, entry, desc) #define write_gdt_entry(dt, entry, desc, type) native_write_gdt_entry(dt, entry, desc, type)
@@ -392,4 +396,25 @@ static inline void set_system_intr_gate_ist(int n, void *addr, unsigned ist) @@ -392,4 +396,25 @@ static inline void set_system_intr_gate_ist(int n, void *addr, unsigned ist)
_set_gate(n, GATE_INTERRUPT, addr, 0x3, ist, __KERNEL_CS); _set_gate(n, GATE_INTERRUPT, addr, 0x3, ist, __KERNEL_CS);
} }
@ -46,7 +46,7 @@
#endif /* _ASM_X86_DESC_H */ #endif /* _ASM_X86_DESC_H */
--- a/arch/x86/include/asm/mmu.h --- a/arch/x86/include/asm/mmu.h
+++ b/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h
@@ -7,18 +7,25 @@ @@ -7,6 +7,9 @@
/* /*
* The x86 doesn't have a mmu context, but * The x86 doesn't have a mmu context, but
* we put the segment information here. * we put the segment information here.
@ -56,19 +56,15 @@
*/ */
typedef struct { typedef struct {
void *ldt; void *ldt;
int size; @@ -19,6 +22,11 @@ typedef struct {
struct mutex lock; struct mutex lock;
void *vdso; void *vdso;
+
#ifdef CONFIG_X86_64
/* True if mm supports a task running in 32 bit compatibility mode. */
unsigned short ia32_compat;
#endif
+#ifdef CONFIG_X86_32 +#ifdef CONFIG_X86_32
+ struct desc_struct user_cs; + struct desc_struct user_cs;
+ unsigned long exec_limit; + unsigned long exec_limit;
+#endif +#endif
} mm_context_t; } mm_context_t;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
@ -508,16 +504,15 @@
static void unmap_region(struct mm_struct *mm, static void unmap_region(struct mm_struct *mm,
struct vm_area_struct *vma, struct vm_area_struct *prev, struct vm_area_struct *vma, struct vm_area_struct *prev,
unsigned long start, unsigned long end); unsigned long start, unsigned long end);
@@ -388,6 +401,9 @@ @@ -432,6 +432,8 @@ __vma_link(struct mm_struct *mm, struct vm_area_struct *vma,
struct vm_area_struct *prev, struct rb_node **rb_link,
struct rb_node *rb_parent)
{ {
struct vm_area_struct *next;
+ if (vma->vm_flags & VM_EXEC) + if (vma->vm_flags & VM_EXEC)
+ arch_add_exec_range(mm, vma->vm_end); + arch_add_exec_range(mm, vma->vm_end);
+ __vma_link_list(mm, vma, prev, rb_parent);
vma->vm_prev = prev; __vma_link_rb(mm, vma, rb_link, rb_parent);
if (prev) { }
next = prev->vm_next;
@@ -489,6 +504,8 @@ @@ -489,6 +504,8 @@
rb_erase(&vma->vm_rb, &mm->mm_rb); rb_erase(&vma->vm_rb, &mm->mm_rb);
if (mm->mmap_cache == vma) if (mm->mmap_cache == vma)
@ -555,8 +550,8 @@
/* Success. */ /* Success. */
@@ -2254,6 +2367,7 @@ @@ -2254,6 +2367,7 @@
free_pgtables(tlb, vma, FIRST_USER_ADDRESS, 0); free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0);
tlb_finish_mmu(tlb, 0, end); tlb_finish_mmu(&tlb, 0, end);
+ arch_flush_exec_range(mm); + arch_flush_exec_range(mm);
/* /*