Bug 143010 - [panic] Panic String: trap: memory address not aligned
Summary: [panic] Panic String: trap: memory address not aligned
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: sparc64 (show other bugs)
Version: Unspecified
Hardware: Any Any
: Normal Affects Only Me
Assignee: freebsd-sparc64 (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-01-20 09:30 UTC by pg
Modified: 2010-01-31 22:20 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description pg 2010-01-20 09:30:03 UTC
'Panic String: trap: memory address not aligned'
When ISO file mounted by mdconfig and exported via NFS.


But I can't get backtrace :(
x1# cd /usr/obj/usr/src/sys/T1/
x1# kgdb kernel.debug /var/crash/vmcore.0
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "sparc64-marcel-freebsd"...
GDB can't read core files on this machine.
(kgdb)

How-To-Repeat: 1) mount -t cd9660 /dev/$(mdconfig -f dvd.iso) /export
2) share /export via NFS
3) mount_nfs 127.0.0.1:/export /mnt

4) Panic String: trap: memory address not aligned
Comment 1 marius 2010-01-20 21:45:22 UTC
Could you please give a kernel compiled with the following patch a try?
http://people.freebsd.org/~marius/cd9660_ifid_alignment.diff

Marius
Comment 2 pg 2010-01-21 10:42:37 UTC
Hi Marius,
Thanks a lot for provided patch. Problem successfully resolved.

On Thu, Jan 21, 2010 at 12:45 AM, Marius Strobl
<marius@alchemy.franken.de>wrote:

>
> Could you please give a kernel compiled with the following patch a try?
> http://people.freebsd.org/~marius/cd9660_ifid_alignment.diff<http://people.freebsd.org/%7Emarius/cd9660_ifid_alignment.diff>
>
> Marius
>
>
Comment 3 pg 2010-01-21 10:42:37 UTC
Hi Marius,
Thanks a lot for provided patch. Problem successfully resolved.

On Thu, Jan 21, 2010 at 12:45 AM, Marius Strobl
<marius@alchemy.franken.de>wrote:

>
> Could you please give a kernel compiled with the following patch a try?
> http://people.freebsd.org/~marius/cd9660_ifid_alignment.diff<http://people.freebsd.org/%7Emarius/cd9660_ifid_alignment.diff>
>
> Marius
>
>
Comment 4 dfilter service freebsd_committer freebsd_triage 2010-01-23 22:38:16 UTC
Author: marius
Date: Sat Jan 23 22:38:01 2010
New Revision: 202903
URL: http://svn.freebsd.org/changeset/base/202903

Log:
  On LP64 struct ifid is 64-bit aligned while struct fid is 32-bit aligned
  so on architectures with strict alignment requirements we can't just simply
  cast the latter to the former but need to copy it bytewise instead.
  
  PR:		143010
  MFC after:	3 days

Modified:
  head/sys/fs/cd9660/cd9660_vfsops.c
  head/sys/fs/cd9660/cd9660_vnops.c

Modified: head/sys/fs/cd9660/cd9660_vfsops.c
==============================================================================
--- head/sys/fs/cd9660/cd9660_vfsops.c	Sat Jan 23 22:37:34 2010	(r202902)
+++ head/sys/fs/cd9660/cd9660_vfsops.c	Sat Jan 23 22:38:01 2010	(r202903)
@@ -589,17 +589,19 @@ cd9660_fhtovp(mp, fhp, vpp)
 	struct fid *fhp;
 	struct vnode **vpp;
 {
-	struct ifid *ifhp = (struct ifid *)fhp;
+	struct ifid ifh;
 	struct iso_node *ip;
 	struct vnode *nvp;
 	int error;
 
+	memcpy(&ifh, fhp, sizeof(ifh));
+
 #ifdef	ISOFS_DBG
 	printf("fhtovp: ino %d, start %ld\n",
-	       ifhp->ifid_ino, ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
 
-	if ((error = VFS_VGET(mp, ifhp->ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
+	if ((error = VFS_VGET(mp, ifh.ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
 		*vpp = NULLVP;
 		return (error);
 	}

Modified: head/sys/fs/cd9660/cd9660_vnops.c
==============================================================================
--- head/sys/fs/cd9660/cd9660_vnops.c	Sat Jan 23 22:37:34 2010	(r202902)
+++ head/sys/fs/cd9660/cd9660_vnops.c	Sat Jan 23 22:38:01 2010	(r202903)
@@ -819,20 +819,25 @@ cd9660_vptofh(ap)
 		struct fid *a_fhp;
 	} */ *ap;
 {
+	struct ifid ifh;
 	struct iso_node *ip = VTOI(ap->a_vp);
-	struct ifid *ifhp;
 
-	ifhp = (struct ifid *)ap->a_fhp;
-	ifhp->ifid_len = sizeof(struct ifid);
+	ifh.ifid_len = sizeof(struct ifid);
 
-	ifhp->ifid_ino = ip->i_number;
-	ifhp->ifid_start = ip->iso_start;
+	ifh.ifid_ino = ip->i_number;
+	ifh.ifid_start = ip->iso_start;
+	/*
+	 * This intentionally uses sizeof(ifh) in order to not copy stack
+	 * garbage on ILP32.
+	 */
+	memcpy(ap->a_fhp, &ifh, sizeof(ifh));
 
 #ifdef	ISOFS_DBG
 	printf("vptofh: ino %d, start %ld\n",
-	       ifhp->ifid_ino,ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
-	return 0;
+
+	return (0);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 5 dfilter service freebsd_committer freebsd_triage 2010-01-31 17:43:32 UTC
Author: marius
Date: Sun Jan 31 17:43:22 2010
New Revision: 203296
URL: http://svn.freebsd.org/changeset/base/203296

Log:
  MFC: r202903
  
  On LP64 struct ifid is 64-bit aligned while struct fid is 32-bit aligned
  so on architectures with strict alignment requirements we can't just simply
  cast the latter to the former but need to copy it bytewise instead.
  
  PR:		143010

Modified:
  stable/8/sys/fs/cd9660/cd9660_vfsops.c
  stable/8/sys/fs/cd9660/cd9660_vnops.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/fs/cd9660/cd9660_vfsops.c
==============================================================================
--- stable/8/sys/fs/cd9660/cd9660_vfsops.c	Sun Jan 31 17:17:24 2010	(r203295)
+++ stable/8/sys/fs/cd9660/cd9660_vfsops.c	Sun Jan 31 17:43:22 2010	(r203296)
@@ -589,17 +589,19 @@ cd9660_fhtovp(mp, fhp, vpp)
 	struct fid *fhp;
 	struct vnode **vpp;
 {
-	struct ifid *ifhp = (struct ifid *)fhp;
+	struct ifid ifh;
 	struct iso_node *ip;
 	struct vnode *nvp;
 	int error;
 
+	memcpy(&ifh, fhp, sizeof(ifh));
+
 #ifdef	ISOFS_DBG
 	printf("fhtovp: ino %d, start %ld\n",
-	       ifhp->ifid_ino, ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
 
-	if ((error = VFS_VGET(mp, ifhp->ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
+	if ((error = VFS_VGET(mp, ifh.ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
 		*vpp = NULLVP;
 		return (error);
 	}

Modified: stable/8/sys/fs/cd9660/cd9660_vnops.c
==============================================================================
--- stable/8/sys/fs/cd9660/cd9660_vnops.c	Sun Jan 31 17:17:24 2010	(r203295)
+++ stable/8/sys/fs/cd9660/cd9660_vnops.c	Sun Jan 31 17:43:22 2010	(r203296)
@@ -819,20 +819,25 @@ cd9660_vptofh(ap)
 		struct fid *a_fhp;
 	} */ *ap;
 {
+	struct ifid ifh;
 	struct iso_node *ip = VTOI(ap->a_vp);
-	struct ifid *ifhp;
 
-	ifhp = (struct ifid *)ap->a_fhp;
-	ifhp->ifid_len = sizeof(struct ifid);
+	ifh.ifid_len = sizeof(struct ifid);
 
-	ifhp->ifid_ino = ip->i_number;
-	ifhp->ifid_start = ip->iso_start;
+	ifh.ifid_ino = ip->i_number;
+	ifh.ifid_start = ip->iso_start;
+	/*
+	 * This intentionally uses sizeof(ifh) in order to not copy stack
+	 * garbage on ILP32.
+	 */
+	memcpy(ap->a_fhp, &ifh, sizeof(ifh));
 
 #ifdef	ISOFS_DBG
 	printf("vptofh: ino %d, start %ld\n",
-	       ifhp->ifid_ino,ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
-	return 0;
+
+	return (0);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 6 dfilter service freebsd_committer freebsd_triage 2010-01-31 22:16:41 UTC
Author: marius
Date: Sun Jan 31 22:16:27 2010
New Revision: 203326
URL: http://svn.freebsd.org/changeset/base/203326

Log:
  MFC: r202903
  
  On LP64 struct ifid is 64-bit aligned while struct fid is 32-bit aligned
  so on architectures with strict alignment requirements we can't just simply
  cast the latter to the former but need to copy it bytewise instead.
  
  PR:		143010
  Approved by:	re (kib)

Modified:
  stable/7/sys/fs/cd9660/cd9660_vfsops.c
  stable/7/sys/fs/cd9660/cd9660_vnops.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/fs/cd9660/cd9660_vfsops.c
==============================================================================
--- stable/7/sys/fs/cd9660/cd9660_vfsops.c	Sun Jan 31 22:08:52 2010	(r203325)
+++ stable/7/sys/fs/cd9660/cd9660_vfsops.c	Sun Jan 31 22:16:27 2010	(r203326)
@@ -596,17 +596,19 @@ cd9660_fhtovp(mp, fhp, vpp)
 	struct fid *fhp;
 	struct vnode **vpp;
 {
-	struct ifid *ifhp = (struct ifid *)fhp;
+	struct ifid ifh;
 	struct iso_node *ip;
 	struct vnode *nvp;
 	int error;
 
+	memcpy(&ifh, fhp, sizeof(ifh));
+
 #ifdef	ISOFS_DBG
 	printf("fhtovp: ino %d, start %ld\n",
-	       ifhp->ifid_ino, ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
 
-	if ((error = VFS_VGET(mp, ifhp->ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
+	if ((error = VFS_VGET(mp, ifh.ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
 		*vpp = NULLVP;
 		return (error);
 	}

Modified: stable/7/sys/fs/cd9660/cd9660_vnops.c
==============================================================================
--- stable/7/sys/fs/cd9660/cd9660_vnops.c	Sun Jan 31 22:08:52 2010	(r203325)
+++ stable/7/sys/fs/cd9660/cd9660_vnops.c	Sun Jan 31 22:16:27 2010	(r203326)
@@ -828,20 +828,25 @@ cd9660_vptofh(ap)
 		struct fid *a_fhp;
 	} */ *ap;
 {
+	struct ifid ifh;
 	struct iso_node *ip = VTOI(ap->a_vp);
-	struct ifid *ifhp;
 
-	ifhp = (struct ifid *)ap->a_fhp;
-	ifhp->ifid_len = sizeof(struct ifid);
+	ifh.ifid_len = sizeof(struct ifid);
 
-	ifhp->ifid_ino = ip->i_number;
-	ifhp->ifid_start = ip->iso_start;
+	ifh.ifid_ino = ip->i_number;
+	ifh.ifid_start = ip->iso_start;
+	/*
+	 * This intentionally uses sizeof(ifh) in order to not copy stack
+	 * garbage on ILP32.
+	 */
+	memcpy(ap->a_fhp, &ifh, sizeof(ifh));
 
 #ifdef	ISOFS_DBG
 	printf("vptofh: ino %d, start %ld\n",
-	       ifhp->ifid_ino,ifhp->ifid_start);
+	    ifh.ifid_ino, ifh.ifid_start);
 #endif
-	return 0;
+
+	return (0);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 7 Marius Strobl freebsd_committer freebsd_triage 2010-01-31 22:20:28 UTC
State Changed
From-To: open->closed

close