Re: OT: SheevaPlug-Distributor in DE

From: Bernd Walter <ticso(at)cicely7.cicely.de>
Date: Fri, 25 Sep 2009 12:11:22 +0200

On Thu, Sep 24, 2009 at 07:27:39PM +0000, Christian Weisgerber wrote:
> Bernd Walter <ticso(at)cicely.de> wrote:
>
> > Ich musste für FreeBSD damals folgenden einbauen:
> > http://www.cicely.de/~ticso/openvpn-arm-patch
> > Ohne dem schlägt bereits der eigene Selbsttest fehl.
> > Google meinte, dass Linux-ARM genauso betroffen ist.
> > Problem ist, dass ARM auch 8 und 16bit Variablen auf ein 4-Byte alignment
> > haben will.
> > Ein struct mit 2 8bit Variablen belegt dann 8 Bytes,
>
> Nie und nimmer. Ich glaube nicht, dass ein BSD-Kernel auf sowas
> laufen würde. ARM verlangt das schon gar nicht, und dass die ARM-ABI
> das verlangt, nehme ich dir nicht ab.

Du hast recht - das ARM-struct-Problem ist leicht anders.

Es geht nur um sizeof einer struct:
struct foo {
        char blah;
        char blub;
};

Auf FreeBSD/arm ist sizeof = 4
Selbst auf FreeBSD/alpha ist sizeof = 2
Das knallt erst, wenn man ein festes Memory-Layout eines Arrays annimmt,
was die OpenVPN-Leute aber tun.
Im FreeBSD Kernel gab es auch diverse Stellen, die behandelt werden
mussten.
Der Grund ist, dass ein struct immer auf ein 4-Byte alignment beginnen
soll, damit man immer gleich maskieren kann.
Genauso, wie früher alphas konnten frühe ARM keine byte/word Zugriffe
machen, aber hatten im Gegensatz zu diesen keine bequemen Maskierbefehle.

#include <stdio.h>

struct foo {
        char blah;
        char blub;
};
struct foo blub;

int
main()
{
        printf("sizeof = %i\n", sizeof(blub));
        printf("addr = %p\n", &blub);
        printf("addr blah = %p\n", &blub.blah);
        printf("addr blub = %p\n", &blub.blub);
        return 0;
}

[97]arm9# ./test
sizeof = 4
addr = 0x108ac
addr blah = 0x108ac
addr blub = 0x108ad

[53]srv1# ./test
sizeof = 2
addr = 0x120010ca8
addr blah = 0x120010ca8
addr blub = 0x120010ca9

-- 
B.Walter <bernd@bwct.de> http://www.bwct.de
Modbus/TCP Ethernet I/O Baugruppen, ARM basierte FreeBSD Rechner uvm.
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 25 Sep 2009 - 12:11:32 CEST

search this site