change td_retval into a union w/ off_t, with defines to mask the
change... This eliminates a cast, and also forces td_retval (often 2 32-bit registers) to be aligned so that off_t's can be stored there on arches with strict alignment requirements like armeb (AVILA)... On i386, this doesn't change alignment, and on amd64 it doesn't either, as register_t is already 64bits... This will also prevent future breakage due to people adding additional fields to the struct... This gets AVILA booting a bit farther... Reviewed by: bde
This commit is contained in:
parent
0775fbb475
commit
6f2b769cac
@ -1504,7 +1504,7 @@ freebsd32_lseek(struct thread *td, struct freebsd32_lseek_args *uap)
|
|||||||
ap.whence = uap->whence;
|
ap.whence = uap->whence;
|
||||||
error = sys_lseek(td, &ap);
|
error = sys_lseek(td, &ap);
|
||||||
/* Expand the quad return into two parts for eax and edx */
|
/* Expand the quad return into two parts for eax and edx */
|
||||||
pos = *(off_t *)(td->td_retval);
|
pos = td->td_uretoff.tdu_off;
|
||||||
td->td_retval[RETVAL_LO] = pos & 0xffffffff; /* %eax */
|
td->td_retval[RETVAL_LO] = pos & 0xffffffff; /* %eax */
|
||||||
td->td_retval[RETVAL_HI] = pos >> 32; /* %edx */
|
td->td_retval[RETVAL_HI] = pos >> 32; /* %edx */
|
||||||
return error;
|
return error;
|
||||||
|
@ -270,7 +270,7 @@ shm_seek(struct file *fp, off_t offset, int whence, struct thread *td)
|
|||||||
if (offset < 0 || offset > shmfd->shm_size)
|
if (offset < 0 || offset > shmfd->shm_size)
|
||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
else
|
else
|
||||||
*(off_t *)(td->td_retval) = offset;
|
td->td_uretoff.tdu_off = offset;
|
||||||
}
|
}
|
||||||
foffset_unlock(fp, offset, error != 0 ? FOF_NOUPDATE : 0);
|
foffset_unlock(fp, offset, error != 0 ? FOF_NOUPDATE : 0);
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -2080,7 +2080,7 @@ vn_seek(struct file *fp, off_t offset, int whence, struct thread *td)
|
|||||||
if (error != 0)
|
if (error != 0)
|
||||||
goto drop;
|
goto drop;
|
||||||
VFS_KNOTE_UNLOCKED(vp, 0);
|
VFS_KNOTE_UNLOCKED(vp, 0);
|
||||||
*(off_t *)(td->td_retval) = offset;
|
td->td_uretoff.tdu_off = offset;
|
||||||
drop:
|
drop:
|
||||||
foffset_unlock(fp, offset, error != 0 ? FOF_NOUPDATE : 0);
|
foffset_unlock(fp, offset, error != 0 ? FOF_NOUPDATE : 0);
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -300,7 +300,11 @@ struct thread {
|
|||||||
TDS_RUNQ,
|
TDS_RUNQ,
|
||||||
TDS_RUNNING
|
TDS_RUNNING
|
||||||
} td_state; /* (t) thread state */
|
} td_state; /* (t) thread state */
|
||||||
register_t td_retval[2]; /* (k) Syscall aux returns. */
|
union {
|
||||||
|
register_t tdu_retval[2];
|
||||||
|
off_t tdu_off;
|
||||||
|
} td_uretoff; /* (k) Syscall aux returns. */
|
||||||
|
#define td_retval td_uretoff.tdu_retval
|
||||||
struct callout td_slpcallout; /* (h) Callout for sleep. */
|
struct callout td_slpcallout; /* (h) Callout for sleep. */
|
||||||
struct trapframe *td_frame; /* (k) */
|
struct trapframe *td_frame; /* (k) */
|
||||||
struct vm_object *td_kstack_obj;/* (a) Kstack object. */
|
struct vm_object *td_kstack_obj;/* (a) Kstack object. */
|
||||||
|
Loading…
Reference in New Issue
Block a user