mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-25 03:00:46 +00:00
Fix a handful of crash bugs I caused with the 32-bit ASM version of the classic renderer. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4719 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
3c8034609f
commit
9c001e6e2e
6 changed files with 76 additions and 2483 deletions
|
@ -26,7 +26,7 @@ EXTRN _reciptable : near
|
||||||
EXTRN _fpuasm : dword
|
EXTRN _fpuasm : dword
|
||||||
EXTRN _globalx3 : dword
|
EXTRN _globalx3 : dword
|
||||||
EXTRN _globaly3 : dword
|
EXTRN _globaly3 : dword
|
||||||
EXTRN _ylookup : near
|
EXTRN _ylookup : dword
|
||||||
|
|
||||||
EXTRN _vplce : near
|
EXTRN _vplce : near
|
||||||
EXTRN _vince : near
|
EXTRN _vince : near
|
||||||
|
@ -834,7 +834,8 @@ CDECLPARAM edi,1,5
|
||||||
|
|
||||||
push ebp
|
push ebp
|
||||||
|
|
||||||
mov eax, dword ptr _ylookup[ecx*4]
|
mov eax, _ylookup
|
||||||
|
mov eax, [eax+ecx*4]
|
||||||
add eax, edi
|
add eax, edi
|
||||||
mov dword ptr [machvline4end+2], eax
|
mov dword ptr [machvline4end+2], eax
|
||||||
sub edi, eax
|
sub edi, eax
|
||||||
|
@ -987,7 +988,8 @@ CDECLPARAM edi,1,5
|
||||||
|
|
||||||
push ebp
|
push ebp
|
||||||
|
|
||||||
mov eax, dword ptr _ylookup[ecx*4]
|
mov eax, _ylookup
|
||||||
|
mov eax, [eax+ecx*4]
|
||||||
add eax, edi
|
add eax, edi
|
||||||
mov dword ptr [promachvline4end1+2], eax
|
mov dword ptr [promachvline4end1+2], eax
|
||||||
inc eax
|
inc eax
|
||||||
|
|
|
@ -964,7 +964,8 @@ CDECLPARAM ecx,0,5
|
||||||
CDECLPARAM edi,1,5
|
CDECLPARAM edi,1,5
|
||||||
push ebp
|
push ebp
|
||||||
|
|
||||||
mov eax, dword [ylookup+ecx*4]
|
mov eax, dword ylookup
|
||||||
|
mov eax, [eax+ecx*4]
|
||||||
add eax, edi
|
add eax, edi
|
||||||
mov dword [machvline4end+2], eax
|
mov dword [machvline4end+2], eax
|
||||||
sub edi, eax
|
sub edi, eax
|
||||||
|
@ -1114,7 +1115,8 @@ CDECLPARAM ecx,0,5
|
||||||
CDECLPARAM edi,1,5
|
CDECLPARAM edi,1,5
|
||||||
push ebp
|
push ebp
|
||||||
|
|
||||||
mov eax, dword [ylookup+ecx*4]
|
mov eax, dword ylookup
|
||||||
|
mov eax, [eax+ecx*4]
|
||||||
add eax, edi
|
add eax, edi
|
||||||
mov dword [promachvline4end1+2], eax
|
mov dword [promachvline4end1+2], eax
|
||||||
inc eax
|
inc eax
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -131,11 +131,65 @@ void readjoybstatus(int32_t *b)
|
||||||
*b = joyb;
|
*b = joyb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined _WIN32
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# include <windows.h>
|
||||||
|
#elif defined __linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __APPLE__
|
||||||
|
# include <sys/mman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NOASM) && !defined(GEKKO) && !defined(__ANDROID__)
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
extern intptr_t dep_begin, dep_end;
|
||||||
|
#ifdef __cplusplus
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int32_t nx_unprotect(intptr_t beg, intptr_t end)
|
||||||
|
{
|
||||||
|
#if !defined(NOASM) && !defined(GEKKO) && !defined(__ANDROID__)
|
||||||
|
# if defined _WIN32
|
||||||
|
DWORD oldprot;
|
||||||
|
|
||||||
|
if (!VirtualProtect((LPVOID) beg, (SIZE_T)end - (SIZE_T)beg, PAGE_EXECUTE_READWRITE, &oldprot))
|
||||||
|
{
|
||||||
|
initprintf("VirtualProtect() error! Crashing in 3... 2... 1...\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
# elif defined __linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __APPLE__
|
||||||
|
int32_t pagesize;
|
||||||
|
size_t dep_begin_page;
|
||||||
|
pagesize = sysconf(_SC_PAGE_SIZE);
|
||||||
|
if (pagesize == -1)
|
||||||
|
{
|
||||||
|
initprintf("Error getting system page size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
dep_begin_page = ((size_t)beg) & ~(pagesize-1);
|
||||||
|
if (mprotect((void *) dep_begin_page, (size_t)end - dep_begin_page, PROT_READ|PROT_WRITE) < 0)
|
||||||
|
{
|
||||||
|
initprintf("Error making code writeable (errno=%d)\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
# error "Don't know how to unprotect the self-modifying assembly on this platform!"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Calculate ylookup[] and call setvlinebpl()
|
// Calculate ylookup[] and call setvlinebpl()
|
||||||
void calc_ylookup(int32_t bpl, int32_t lastyidx)
|
void calc_ylookup(int32_t bpl, int32_t lastyidx)
|
||||||
{
|
{
|
||||||
int32_t i, j=0;
|
int32_t i, j=0;
|
||||||
|
|
||||||
|
lastyidx++;
|
||||||
|
|
||||||
Bassert(lastyidx <= MAXYDIM);
|
Bassert(lastyidx <= MAXYDIM);
|
||||||
|
|
||||||
if (lastyidx > ylookupsiz)
|
if (lastyidx > ylookupsiz)
|
||||||
|
@ -144,6 +198,9 @@ void calc_ylookup(int32_t bpl, int32_t lastyidx)
|
||||||
Baligned_free(ylookup);
|
Baligned_free(ylookup);
|
||||||
|
|
||||||
ylookup = (intptr_t *)Xaligned_alloc(16, lastyidx * sizeof(intptr_t));
|
ylookup = (intptr_t *)Xaligned_alloc(16, lastyidx * sizeof(intptr_t));
|
||||||
|
#if !defined(NOASM) && !defined(GEKKO) && !defined(__ANDROID__)
|
||||||
|
nx_unprotect((intptr_t)ylookup, (intptr_t)ylookup + (lastyidx * sizeof(intptr_t)));
|
||||||
|
#endif
|
||||||
ylookupsiz = lastyidx;
|
ylookupsiz = lastyidx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,6 +222,14 @@ void calc_ylookup(int32_t bpl, int32_t lastyidx)
|
||||||
setvlinebpl(bpl);
|
setvlinebpl(bpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void makeasmwriteable(void)
|
||||||
|
{
|
||||||
|
#if !defined(NOASM) && !defined(GEKKO) && !defined(__ANDROID__)
|
||||||
|
nx_unprotect((intptr_t)&dep_begin, (intptr_t)&dep_end);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_OPENGL
|
#ifdef USE_OPENGL
|
||||||
void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f)
|
void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f)
|
||||||
{
|
{
|
||||||
|
@ -484,56 +549,6 @@ int32_t baselayer_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined _WIN32
|
|
||||||
# define WIN32_LEAN_AND_MEAN
|
|
||||||
# include <windows.h>
|
|
||||||
#elif defined __linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __APPLE__
|
|
||||||
# include <sys/mman.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(NOASM) && !defined(GEKKO) && !defined(__ANDROID__)
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern int32_t dep_begin, dep_end;
|
|
||||||
#ifdef __cplusplus
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void makeasmwriteable(void)
|
|
||||||
{
|
|
||||||
#if !defined(NOASM) && !defined(GEKKO) && !defined(__ANDROID__)
|
|
||||||
// extern int32_t dep_begin, dep_end;
|
|
||||||
# if defined _WIN32
|
|
||||||
DWORD oldprot;
|
|
||||||
if (!VirtualProtect((LPVOID)&dep_begin, (SIZE_T)&dep_end - (SIZE_T)&dep_begin, PAGE_EXECUTE_READWRITE, &oldprot))
|
|
||||||
{
|
|
||||||
initprintf("Error making code writeable\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
# elif defined __linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __APPLE__
|
|
||||||
int32_t pagesize;
|
|
||||||
size_t dep_begin_page;
|
|
||||||
pagesize = sysconf(_SC_PAGE_SIZE);
|
|
||||||
if (pagesize == -1)
|
|
||||||
{
|
|
||||||
initprintf("Error getting system page size\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dep_begin_page = ((size_t)&dep_begin) & ~(pagesize-1);
|
|
||||||
if (mprotect((void *)dep_begin_page, (size_t)&dep_end - dep_begin_page, PROT_READ|PROT_WRITE) < 0)
|
|
||||||
{
|
|
||||||
initprintf("Error making code writeable (errno=%d)\n", errno);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
# else
|
|
||||||
# error "Don't know how to unprotect the self-modifying assembly on this platform!"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void maybe_redirect_outputs(void)
|
void maybe_redirect_outputs(void)
|
||||||
{
|
{
|
||||||
#if !(defined __APPLE__ && defined __BIG_ENDIAN__)
|
#if !(defined __APPLE__ && defined __BIG_ENDIAN__)
|
||||||
|
|
|
@ -11407,7 +11407,6 @@ static void initsmost(void)
|
||||||
{ (void **)&swall, xdim * sizeof(int32_t) },
|
{ (void **)&swall, xdim * sizeof(int32_t) },
|
||||||
{ (void **)&lwall, (xdim + 4) * sizeof(int32_t) },
|
{ (void **)&lwall, (xdim + 4) * sizeof(int32_t) },
|
||||||
{ (void **)&radarang2, xdim * sizeof(int16_t) },
|
{ (void **)&radarang2, xdim * sizeof(int16_t) },
|
||||||
{ (void **)&ylookup, (ydim + 1) * sizeof(intptr_t) },
|
|
||||||
{ (void **)&dotp1, ydim * sizeof(intptr_t) },
|
{ (void **)&dotp1, ydim * sizeof(intptr_t) },
|
||||||
{ (void **)&dotp2, ydim * sizeof(intptr_t) },
|
{ (void **)&dotp2, ydim * sizeof(intptr_t) },
|
||||||
{ (void **)&lastx, ydim * sizeof(int32_t) },
|
{ (void **)&lastx, ydim * sizeof(int32_t) },
|
||||||
|
@ -11423,7 +11422,6 @@ static void initsmost(void)
|
||||||
|
|
||||||
ysavecnt = YSAVES;
|
ysavecnt = YSAVES;
|
||||||
nodesperline = tabledivide32_noinline(YSAVES, ydim);
|
nodesperline = tabledivide32_noinline(YSAVES, ydim);
|
||||||
ylookupsiz = ydim + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -788,7 +788,8 @@ int32_t initinput(void)
|
||||||
//
|
//
|
||||||
void uninitinput(void)
|
void uninitinput(void)
|
||||||
{
|
{
|
||||||
switchlayout(defaultlayoutname);
|
if (defaultlayoutname[0])
|
||||||
|
switchlayout(defaultlayoutname);
|
||||||
|
|
||||||
uninitmouse();
|
uninitmouse();
|
||||||
UninitDirectInput();
|
UninitDirectInput();
|
||||||
|
|
Loading…
Reference in a new issue