On Thu, 15 Feb 2007, Pascal Hofstee wrote:

On 1/31/07, Robert Watson <[EMAIL PROTECTED]> wrote:
If we do decide to go ahead with the ABI change, there are a number of other things that should be done simultaneously, such as changing the uid and gid fields to uid_t and gid_t. I would very much like to see the ABI change happen, and the first step (breaking out kernel from user structures) has been done already as part of the MAC work. The next step is to add routines that translate internal/external formats, which isn't hard, but requires a moderate pile of code to do (as well as great care :-).

Well .. i finally found some spare time to have a closer look at the "shm_segsz" issue ... and noticed there were actually a very limited number of direct uses of the shm_segsz struct member (26 lines in the entire /usr/src tree)

I have attached a patchset that should change shm_segsz to size_t. There were however 2 to 3 locations all regarding compat code (ibcs2, svr4 and COMPAT_43) where i opted to stay on the clear side and not touch anything, the rest was fairly straightforward as should be obvious from the diff. I checked to make sure no function prototypes changed anywhere.

Please have a look at the attached patch (available at http://callisto.offis.uni-oldenburg.de/shm_segsz-int2size_t.diff in case the attachment gets stripped off by the mailinglist software) and provide any feedback where appropriate.

Unfortunately, things are a bit more tricky. The problem is not so much the API, where converting size_t/int is a relative non-event, rather, the ABI. By changing the size of a field in a data structure, you may change the layout of the structure, and hence the offset of other fields. This offset information is compiled into binaries that access the structure -- hence being part of the ABI. On i386, the change from int to size_t doesn't modify the ABI, as both int and size_t are 32-bit. However, on 64-bit platforms, int is 32-bit and size_t is 64-bit:

sledge:/tmp> uname -a
FreeBSD sledge.freebsd.org 7.0-CURRENT FreeBSD 7.0-CURRENT #898: Wed Feb 14 14:20:16 UTC 2007 [EMAIL PROTECTED]:/h/src/sys/amd64/compile/SLEDGE amd64
sledge:/tmp> ./size_t
sizeof int: 4
sizeof size_t: 8

In practice, this means that all of the later fields in the data structure will be offset by 4 bytes. This will affect any application that accesses later fields in the structure but isn't recompiled. This is why DES and I have been discussing this change as requiring kernel compatibility code, which would provide new system calls working with the new layout, and retain old system calls working with the old layout. So we'd need to provide a new shmctl() with the new structure, and an oshmctl() with the old layout. While doing that, it makes sense to do all the other ABI-related things that we'd like to get out of the way, such as fixing the types in shm_perm.

Robert N M Watson
Computer Laboratory
University of Cambridge
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to