Fix bugs between Filter.addvalue and ckt32 macro call: [re-]compressed

Linux kernels were not booting.  Explain .addvalue better.
Set kernel stack pointer for boot-time decompression according to
Linux kernel documentation.
	     p_vmlinx.cpp      p_vmlinz.cpp
	stub/l_vmlinx.asm stub/l_vmlinz.asm
	filter/cto.h filter/ctoj.h filter/ctok.h

committer: jreiser <jreiser> 1103326936 +0000
This commit is contained in:
John Reiser
2004-12-17 23:42:16 +00:00
parent b24fb59c94
commit 1418f57b96
7 changed files with 58 additions and 18 deletions
+8 -1
View File
@@ -36,11 +36,11 @@ static int F(Filter *f)
#ifdef U
// filter
upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else
// scan
const upx_byte *b = f->buf;
#endif
const unsigned addvalue = f->addvalue;
const unsigned size = f->buf_len;
unsigned ic, jc, kc;
@@ -52,6 +52,11 @@ static int F(Filter *f)
unsigned char buf[256];
memset(buf,0,256);
// A call to a destination that is inside the buffer
// will be rewritten and marked with cto8 as first byte.
// So, a call to a destination that is outside the buffer
// must not conflict with the mark.
// Note that unsigned comparison checks both edges of buffer.
for (ic = 0; ic < size - 5; ic++)
if (COND(b,ic) && get_le32(b+ic+1)+ic+1 >= size)
{
@@ -74,6 +79,8 @@ static int F(Filter *f)
// try to detect 'real' calls only
if (jc < size)
{
if ((1u<<24)<=(jc+addvalue)) // hi 8 bits won't be cto8
return 1; // fail - buffer not restored
#ifdef U
set_be32(b+ic+1,jc+addvalue+cto);
#endif
+3 -1
View File
@@ -40,11 +40,11 @@ static int F(Filter *f)
#ifdef U
// filter
upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else
// scan
const upx_byte *b = f->buf;
#endif
const unsigned addvalue = f->addvalue;
const unsigned size = f->buf_len;
unsigned ic, jc, kc;
@@ -78,6 +78,8 @@ static int F(Filter *f)
// try to detect 'real' calls only
if (jc < size)
{
if ((1u<<24)<=(jc+addvalue)) // hi 8 bits won't be cto8
return 1; // fail - buffer not restored
#ifdef U
set_be32(b+ic+1,jc+addvalue+cto);
#endif
+3 -1
View File
@@ -40,11 +40,11 @@ static int F(Filter *f)
#ifdef U
// filter
upx_byte *b = f->buf;
const unsigned addvalue = f->addvalue;
#else
// scan
const upx_byte *b = f->buf;
#endif
const unsigned addvalue = f->addvalue;
const unsigned size = f->buf_len;
unsigned const id = f->id;
@@ -79,6 +79,8 @@ static int F(Filter *f)
// try to detect 'real' calls only
if (jc < size)
{
if ((1u<<24)<=(jc+addvalue)) // hi 8 bits won't be cto8
return 1; // fail - buffer not restored
#ifdef U
set_be32(b+ic+1,jc+addvalue+cto);
#endif