Fix of 16byte stack alignment, doprnt.c does not require va_arg fix now
This commit is contained in:
@@ -53,11 +53,6 @@ static unsigned char mkhex (unsigned char ch);
|
|||||||
static int cvt (double number, int prec, int sharpflag, unsigned char *negp,
|
static int cvt (double number, int prec, int sharpflag, unsigned char *negp,
|
||||||
unsigned char fmtch, unsigned char *startp, unsigned char *endp);
|
unsigned char fmtch, unsigned char *startp, unsigned char *endp);
|
||||||
|
|
||||||
// union {
|
|
||||||
// unsigned long u32;
|
|
||||||
// va_list ap32;
|
|
||||||
// } x;
|
|
||||||
|
|
||||||
int
|
int
|
||||||
_doprnt (char const *fmt, va_list ap, FILE *stream)
|
_doprnt (char const *fmt, va_list ap, FILE *stream)
|
||||||
{
|
{
|
||||||
@@ -69,7 +64,6 @@ _doprnt (char const *fmt, va_list ap, FILE *stream)
|
|||||||
unsigned long ul;
|
unsigned long ul;
|
||||||
|
|
||||||
double d;
|
double d;
|
||||||
unsigned long *da;
|
|
||||||
|
|
||||||
if (! stream)
|
if (! stream)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -372,22 +366,8 @@ number: if (sign && ((long) ul != 0L)) {
|
|||||||
case 'g':
|
case 'g':
|
||||||
case 'G': {
|
case 'G': {
|
||||||
|
|
||||||
// --- IM - vaarg alignment issue fix:
|
// ---va_arg alignment fix
|
||||||
|
d = va_arg(ap, double);
|
||||||
da = (unsigned long *) ≈
|
|
||||||
|
|
||||||
unsigned long *l = (unsigned long *) &d;
|
|
||||||
|
|
||||||
if ( ((unsigned long)da) & 4) { // maj_II
|
|
||||||
l[0]= va_arg(ap, unsigned long);
|
|
||||||
l[1]= va_arg(ap, unsigned long);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
l[0]= va_arg(ap, unsigned long);
|
|
||||||
l[0]= va_arg(ap, unsigned long);
|
|
||||||
l[1]= va_arg(ap, unsigned long);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ struct sigstack {
|
|||||||
struct sigcontext {
|
struct sigcontext {
|
||||||
int sc_onstack; /* sigstack state to restore */
|
int sc_onstack; /* sigstack state to restore */
|
||||||
long sc_mask; /* signal mask to restore */
|
long sc_mask; /* signal mask to restore */
|
||||||
|
int sc_align[2]; /* align to 16 bytes */
|
||||||
int sc_r1; /* r1 to restore */
|
int sc_r1; /* r1 to restore */
|
||||||
int sc_r2; /* and other registers */
|
int sc_r2; /* and other registers */
|
||||||
int sc_r3;
|
int sc_r3;
|
||||||
|
|||||||
@@ -432,7 +432,7 @@ badarg:
|
|||||||
*/
|
*/
|
||||||
ucp = USER_DATA_END - nc - NBPW;
|
ucp = USER_DATA_END - nc - NBPW;
|
||||||
ap = ucp - na*NBPW - 2*NBPW;
|
ap = ucp - na*NBPW - 2*NBPW;
|
||||||
u.u_frame [FRAME_SP] = ap - 16;
|
u.u_frame [FRAME_SP] = (ap - 16) & ~0xf; /* align to 16 bytes */
|
||||||
u.u_frame [FRAME_R4] = na - ne; /* $a0 := argc */
|
u.u_frame [FRAME_R4] = na - ne; /* $a0 := argc */
|
||||||
u.u_frame [FRAME_R5] = ap; /* $a1 := argv */
|
u.u_frame [FRAME_R5] = ap; /* $a1 := argv */
|
||||||
u.u_frame [FRAME_R6] = ap + (na-ne+1)*NBPW; /* $a2 := env */
|
u.u_frame [FRAME_R6] = ap + (na-ne+1)*NBPW; /* $a2 := env */
|
||||||
|
|||||||
Reference in New Issue
Block a user