[comp.bugs.sys5] Bad LALIGN

bbadger@x102c.harris-atd.com (Badger BA 64810) (09/25/89)

I noticed what seems to be an error in ATT System V Release 3.2 Upgrade 2.1 
system file sysmacros.h.  The error only affects pdp11 systems, because it
is conditionally compiled.  Since this is a 80386 release, perhaps no 
one is affected.  Nonetheless, here's my patch:

diff -c /user03/sec/l/V3_2_1/usr/src/uts/i386/sys/sysmacros.h /user03/sec/l/Vcm/usr/src/Vcm/uts/i386/sys/sysmacros.h 
*** /user03/sec/l/V3_2_1/usr/src/uts/i386/sys/sysmacros.h	Tue May 17 17:22:08 1988
--- /user03/sec/l/Vcm/usr/src/Vcm/uts/i386/sys/sysmacros.h	Sun Sep 24 16:44:28 1989
***************
*** 191,197 ****
  #ifdef	pdp11
  #define	SALIGN(p)		(char *)(((int)p+1) & ~1)
  #define	IALIGN(p)		(char *)(((int)p+1) & ~1)
! #define LALIGN(p)		(char *)(((int)p+1) & ~3)
  #endif
  #if vax | i386
  #define	SALIGN(p)		(char *)(((int)p+1) & ~1)
--- 191,197 ----
  #ifdef	pdp11
  #define	SALIGN(p)		(char *)(((int)p+1) & ~1)
  #define	IALIGN(p)		(char *)(((int)p+1) & ~1)
! #define	LALIGN(p)		(char *)(((int)p+3) & ~3)
  #endif
  #if vax | i386
  #define	SALIGN(p)		(char *)(((int)p+1) & ~1)

Note that I've changed a space to a tab and a '1' to a '3'.  
Now the LALIGN(p) matches the one defined for when 
``#if vax | i386'' is in effect (not shown here).

I have two questions about this.

1.  Technical:  Is it really a good idea to convert to (int)?
Wouldn't (unsigned int) or (unsigned long) be safer?  I've seen 
a similar operation elsewhere in kernel code which does:
	(char *)((int)p + 3) & ~3L) 
Is this any better?

2.  Procedural:  What's the official way to submit these things
to ATT?  I haven't seen any ``problem report'' forms in the backs
of our manuals, (unlike DIGITAL which puts one in theirs).  Is 
there an ATT network address which accepts bug reports, like 
Sun has?
    -----	-	-	-	-	-	-	-	----
Bernard A. Badger Jr.	407/984-6385          |``Get a LIFE!''  -- J.H. Conway
Harris GISD, Melbourne, FL  32902             |Buddy, can you paradigm?
Internet: bbadger%x102c@trantor.harris-atd.com|'s/./&&/g' Tom sed expansively.

gwyn@smoke.BRL.MIL (Doug Gwyn) (09/25/89)

In article <2721@trantor.harris-atd.com> bbadger@x102c.harris-atd.com (Badger BA 64810) writes:
>Now the LALIGN(p) matches the one defined for when 
>``#if vax | i386'' is in effect (not shown here).

Yeah, and now you've broken it.  PDP-11 longs need be aligned
only on a word boundary, not on a longword boundary.

>1.  Technical:  Is it really a good idea to convert to (int)?

On a PDP-11, sure.

>2.  Procedural:  What's the official way to submit these things to ATT?

Submit a software trouble report.  If you have subscribed to
the appropriate level of software support, you should have a
folder that contains forms and instructions.

>Is there an ATT network address which accepts bug reports, like Sun has?

There is (or was) a command "trenter" that would guide you through
the steps of filling out a trouble report then e-mail it somewhere.

bbadger@x102c.harris-atd.com (Badger BA 64810) (09/29/89)

In article <11150@smoke.BRL.MIL> gwyn@brl.arpa (Doug Gwyn) writes:
>In article <2721@trantor.harris-atd.com> bbadger@x102c.harris-atd.com (Badger BA 64810) writes:
>>Now the LALIGN(p) matches the one defined for when 
>>``#if vax | i386'' is in effect (not shown here).
>
>Yeah, and now you've broken it.  PDP-11 longs need be aligned
>only on a word boundary, not on a longword boundary.
>
Well, I thought that longs might only be aligned to even bytes,
but then shouldn't the definition of LALIGN be the same as IALIGN?

#ifdef	pdp11
#define	SALIGN(p)		(char *)(((int)p+1) & ~1)
#define	IALIGN(p)		(char *)(((int)p+1) & ~1)
#define LALIGN(p)		(char *)(((int)p+1) & ~3)	/* ??? */
#endif
#if vax | i386
#define	SALIGN(p)		(char *)(((int)p+1) & ~1)
#define	IALIGN(p)		(char *)(((int)p+3) & ~3)
#define	LALIGN(p)		(char *)(((int)p+3) & ~3)
#endif

An generalized alignment macro would always use the same number like this:
#define ALIGN(p,m)  	(char *)(((int)p+m) & ~m)
	p	+1&~3	+3&~3
	0	0	0
	1	0	4
	2	0	4
	3	4	4
	4	4	4
	5	4	8
	6	4	8
	7	8	8
	8	8	8
Is there any possible reason to use the +1&~3 pattern?  I can't see it.

>>1.  Technical:  Is it really a good idea to convert to (int)?
>
>On a PDP-11, sure.
I was more worried about the VAX.
#define	LALIGN(p)		(char *)(((int)p+3) & ~3)
However, I guess since each macro set is machine dependent, it could
be changed to handle whatever int size that pointers turned out to be.
I guess that there isn't a machine-independent way to do this.  It
should only be a problem if (sizeof(int) != sizeof(* char)).
>
>>2.  Procedural:  What's the official way to submit these things to ATT?
>
>Submit a software trouble report.  If you have subscribed to
>the appropriate level of software support, you should have a
>folder that contains forms and instructions.
>
>>Is there an ATT network address which accepts bug reports, like Sun has?
>
>There is (or was) a command "trenter" that would guide you through
>the steps of filling out a trouble report then e-mail it somewhere.
No such command here.

    -----	-	-	-	-	-	-	-	----
Bernard A. Badger Jr.	407/984-6385          |``Get a LIFE!''  -- J.H. Conway
Harris GISD, Melbourne, FL  32902             |Buddy, can you paradigm?
Internet: bbadger%x102c@trantor.harris-atd.com|'s/./&&/g' Tom sed expansively.