Date: Wed, 18 Nov 2009 15:48:51 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r199485 - projects/ppc64/sys/compat/freebsd32 Message-ID: <200911181548.nAIFmpgW076574@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911181548.nAIFmpgW076574>