Fix of 16byte stack alignment, doprnt.c does not require va_arg fix now

This commit is contained in:
igor-m
2014-04-19 09:50:04 +02:00
parent 4783836659
commit 6ce8e28a85
3 changed files with 4 additions and 23 deletions

View File

@@ -53,11 +53,6 @@ static unsigned char mkhex (unsigned char ch);
static int cvt (double number, int prec, int sharpflag, unsigned char *negp,
unsigned char fmtch, unsigned char *startp, unsigned char *endp);
// union {
// unsigned long u32;
// va_list ap32;
// } x;
int
_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;
double d;
unsigned long *da;
if (! stream)
return 0;
@@ -372,22 +366,8 @@ number: if (sign && ((long) ul != 0L)) {
case 'g':
case 'G': {
// --- IM - vaarg alignment issue fix:
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);
}
// ---va_arg alignment fix
d = va_arg(ap, double);
// ---
/*

View File

@@ -113,6 +113,7 @@ struct sigstack {
struct sigcontext {
int sc_onstack; /* sigstack state 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_r2; /* and other registers */
int sc_r3;

View File

@@ -432,7 +432,7 @@ badarg:
*/
ucp = USER_DATA_END - nc - 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_R5] = ap; /* $a1 := argv */
u.u_frame [FRAME_R6] = ap + (na-ne+1)*NBPW; /* $a2 := env */