1feb8d2d73
A big bug has been diagnosed on hosts running the SKAS patch and built with CONFIG_REGPARM, due to some missing prevent_tail_call(). On these hosts, this workaround is needed to avoid triggering that bug, because "to" is kept by GCC only in EBX, which is corrupted at the return of mmap2(). Since to trigger this bug int 0x80 must be used when doing the call, it rarely manifests itself, so I'd prefer to get this merged to workaround that host bug, since it should cause no functional change. Still, you might prefer to drop it, I'll leave this to you. Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Cc: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
25 lines
572 B
C
25 lines
572 B
C
/*
|
|
* Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
|
|
* Licensed under the GPL
|
|
*/
|
|
|
|
#include <linux/mman.h>
|
|
#include <asm/unistd.h>
|
|
|
|
static int errno;
|
|
|
|
static inline _syscall2(int,munmap,void *,start,size_t,len)
|
|
static inline _syscall6(void *,mmap,void *,addr,size_t,len,int,prot,int,flags,int,fd,off_t,offset)
|
|
int switcheroo(int fd, int prot, void *from, void *to, int size)
|
|
{
|
|
if(munmap(to, size) < 0){
|
|
return(-1);
|
|
}
|
|
if(mmap(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) == (void*) -1){
|
|
return(-1);
|
|
}
|
|
if(munmap(from, size) < 0){
|
|
return(-1);
|
|
}
|
|
return(0);
|
|
}
|