svn commit: r199485 - projects/ppc64/sys/compat/freebsd32
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Wed Nov 18 15:48:51 UTC 2009
Author: nwhitehorn
Date: Wed Nov 18 15:48:51 2009
New Revision: 199485
URL: http://svn.freebsd.org/changeset/base/199485
Log:
Make freebsd32 pread, pwrite, lseek, and truncate work on big-endian.
Init now asks me what kind of shell I want to start.
Modified:
projects/ppc64/sys/compat/freebsd32/freebsd32_misc.c
projects/ppc64/sys/compat/freebsd32/freebsd32_proto.h
projects/ppc64/sys/compat/freebsd32/syscalls.master
Modified: projects/ppc64/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- projects/ppc64/sys/compat/freebsd32/freebsd32_misc.c Wed Nov 18 15:35:03 2009 (r199484)
+++ projects/ppc64/sys/compat/freebsd32/freebsd32_misc.c Wed Nov 18 15:48:51 2009 (r199485)
@@ -2013,8 +2013,13 @@ freebsd32_lseek(struct thread *td, struc
error = lseek(td, &ap);
/* Expand the quad return into two parts for eax and edx */
pos = *(off_t *)(td->td_retval);
+ #if BYTE_ORDER == BIG_ENDIAN
+ td->td_retval[0] = pos >> 32;
+ td->td_retval[1] = pos & 0xffffffff;
+ #else
td->td_retval[0] = pos & 0xffffffff; /* %eax */
td->td_retval[1] = pos >> 32; /* %edx */
+ #endif
return error;
}
Modified: projects/ppc64/sys/compat/freebsd32/freebsd32_proto.h
==============================================================================
--- projects/ppc64/sys/compat/freebsd32/freebsd32_proto.h Wed Nov 18 15:35:03 2009 (r199484)
+++ projects/ppc64/sys/compat/freebsd32/freebsd32_proto.h Wed Nov 18 15:48:51 2009 (r199485)
@@ -347,15 +347,25 @@ struct freebsd32_pread_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)];
char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
+ #if BYTE_ORDER == BIG_ENDIAN
+ char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)];
+ char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)];
+ #else
char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)];
char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)];
+ #endif
};
struct freebsd32_pwrite_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)];
char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
+ #if BYTE_ORDER == BIG_ENDIAN
+ char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)];
+ char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)];
+ #else
char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)];
char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)];
+ #endif
};
struct freebsd32_mmap_args {
char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
@@ -374,8 +384,13 @@ struct freebsd32_lseek_args {
};
struct freebsd32_truncate_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+ #if BYTE_ORDER == BIG_ENDIAN
+ char lengthhi_l_[PADL_(u_int32_t)]; u_int32_t lengthhi; char lengthhi_r_[PADR_(u_int32_t)];
+ char lengthlo_l_[PADL_(u_int32_t)]; u_int32_t lengthlo; char lengthlo_r_[PADR_(u_int32_t)];
+ #else
char lengthlo_l_[PADL_(u_int32_t)]; u_int32_t lengthlo; char lengthlo_r_[PADR_(u_int32_t)];
char lengthhi_l_[PADL_(u_int32_t)]; u_int32_t lengthhi; char lengthhi_r_[PADR_(u_int32_t)];
+ #endif
};
struct freebsd32_ftruncate_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
@@ -667,8 +682,13 @@ struct freebsd6_freebsd32_mmap_args {
struct freebsd6_freebsd32_lseek_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ #if BYTE_ORDER == BIG_ENDIAN
+ char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)];
+ char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)];
+ #else
char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)];
char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)];
+ #endif
char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)];
};
struct freebsd6_freebsd32_truncate_args {
Modified: projects/ppc64/sys/compat/freebsd32/syscalls.master
==============================================================================
--- projects/ppc64/sys/compat/freebsd32/syscalls.master Wed Nov 18 15:35:03 2009 (r199484)
+++ projects/ppc64/sys/compat/freebsd32/syscalls.master Wed Nov 18 15:48:51 2009 (r199485)
@@ -317,11 +317,9 @@
173 AUE_PREAD COMPAT6 { ssize_t freebsd32_pread(int fd, void *buf, \
size_t nbyte, int pad, \
u_int32_t offsetlo, u_int32_t offsethi); }
-; XXX note - bigendian is different
174 AUE_PWRITE COMPAT6 { ssize_t freebsd32_pwrite(int fd, \
const void *buf, size_t nbyte, int pad, \
u_int32_t offsetlo, u_int32_t offsethi); }
-; XXX note - bigendian is different
175 AUE_NULL UNIMPL nosys
176 AUE_NTP_ADJTIME NOPROTO { int ntp_adjtime(struct timex *tp); }
177 AUE_NULL UNIMPL sfork (BSD/OS 2.x)
@@ -364,7 +362,6 @@
199 AUE_LSEEK COMPAT6 { off_t freebsd32_lseek(int fd, int pad, \
u_int32_t offsetlo, u_int32_t offsethi, \
int whence); }
-; XXX note - bigendian is different
200 AUE_TRUNCATE COMPAT6 { int freebsd32_truncate(char *path, \
int pad, u_int32_t lengthlo, \
u_int32_t lengthhi); }
More information about the svn-src-projects
mailing list