Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Jun 2011 23:22:36 +0000 (UTC)
From:      Craig Rodrigues <rodrigc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r223128 - head/lib/libstand
Message-ID:  <201106152322.p5FNMafx002688@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rodrigc
Date: Wed Jun 15 23:22:35 2011
New Revision: 223128
URL: http://svn.freebsd.org/changeset/base/223128

Log:
  Bring back following change which was undone in previous commit:
  
      ------------------------------------------------------------------------
      r172854 | marius | 2007-10-21 10:03:18 -0700 (Sun, 21 Oct 2007) | 16 lines
      Changed paths:
         M /head/lib/libstand/tftp.c
  
      - Given that we tell the compiler that struct ip is packed and 32-bit
        aligned, GCC 4.2.1 also generates code for sendudp() that assumes
        this alignment. GCC 4.2.1 however doesn't 32-bit align wbuf, causing
        the loader to crash due to an unaligned access of wbuf in sendudp()
        when netbooting sparc64. Solve this by specifying wbuf as packed and
        32-bit aligned, too. As for lastdata and readudp() this currently is
        no issue when compiled with GCC 4.2.1, though give lastdata the same
        treatment as wbuf for consistency and possibility of being affected
        in the future. [1]
      - Sprinkle const on a lookup table.
      ------------------------------------------------------------------------

Modified:
  head/lib/libstand/tftp.c

Modified: head/lib/libstand/tftp.c
==============================================================================
--- head/lib/libstand/tftp.c	Wed Jun 15 23:19:09 2011	(r223127)
+++ head/lib/libstand/tftp.c	Wed Jun 15 23:22:35 2011	(r223128)
@@ -118,10 +118,10 @@ struct tftp_handle {
 		u_char header[HEADER_SIZE];
 		struct tftphdr t;
 		u_char space[TFTP_MAX_BLKSIZE];
-	} lastdata;
+	} __packed __aligned(4) lastdata;
 };
 
-static int tftperrors[8] = {
+static const int tftperrors[8] = {
 	0,			/* ??? */
 	ENOENT,
 	EPERM,
@@ -208,7 +208,7 @@ tftp_makereq(struct tftp_handle *h)
 		u_char header[HEADER_SIZE];
 		struct tftphdr  t;
 		u_char space[FNAME_SIZE + 6];
-	} wbuf;
+	} __packed __aligned(4) wbuf;
 	char           *wtail;
 	int             l;
 	ssize_t         res;
@@ -286,7 +286,7 @@ tftp_getnextblock(struct tftp_handle *h)
 	struct {
 		u_char header[HEADER_SIZE];
 		struct tftphdr t;
-	} wbuf;
+	} __packed __aligned(4) wbuf;
 	char           *wtail;
 	int             res;
 	struct tftphdr *t;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106152322.p5FNMafx002688>