Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » WEGA - C Frage » Themenansicht

Autor Thread - Seiten: -1-
000
14.11.2015, 13:41 Uhr
Olli

Avatar von Olli

Moin,

habe gerade u.A. Probleme den link() Syscall in C zu reimplementieren.

Normalerweise sieht der unter V7 oder SYSIII so aus:


Quellcode:

link()
{
        register struct inode *ip, *xp;
        register struct a {
                char        *target;
                char        *linkname;
        } *uap;

[...]
        u.u_dirp = (caddr_t)uap->linkname;
[...]
}



Problem ist nun, das in WEGA u_dirp im user struct ein saddr_t (long) und kein caddr_t (*char) ist, und ich frage mich wie ich uap->linkname korrekt zugewiesen bekomme.


Quellcode:

typedef union
{
    caddr_t             l;
    struct
    {
        unsigned        left;
        unsigned        right;
    }                   half;
}                       saddr_t;        /* segmented address with parts */



Der Original-ASM code schaut so aus:


Quellcode:

_link::
{
        dec        fp,#~L2
        ldm        _stkseg+4(fp),r8,#6
        ldl        rr8,_u+36
[...]
        ldl        rr2,rr8(#4)
        ldl        rr4,rr2
        and        r4,#32512
        ldl        _u+78,rr4
[...]



Ich hatte das schonmal vor 7 Jahren, bin damals aber auch zu keiner Lösung gekommen.

http://home.salatschuessel.net/quest/problems.php

Wenn ich inzwischen so drüber nachdenke was da passiert im ASM, will ich das mal hier versuchen zu beschreiben wie ich es verstehe:

1. _u+78 (u.u_dirp) enthällt einen pointer - also wird im Assemblercode hier eine Speicheradresse zugewiesen.
2. Die Adressnotation für Daten in Segmenten auf dem Z8001 sollte 0xSS00XXXX sein, wobei SS die Segmentnummer (0-127) und XXXX die relative Adresse in diesem Segment sind.
3. ANDing den 0xSS00 Teil mit 0x7F00 heisst also, alles was ausserhalb dieses Wertebereiches liegt zu entfernen, um sicherzustellen, das der Teil nur zwischen 0x0000 und 0x7F00 liegen kann.

Und nun frage ich mich.... wie sollte die Zuweisung im C-Code richtigerweise sein?!
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 14.11.2015 um 13:58 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
14.11.2015, 16:20 Uhr
Olli

Avatar von Olli

Habe nun folgendes gebastelt:


Quellcode:

        u.u_dirp.left = hiword(uap->linkname) & 0x7f00;
        u.u_dirp.right = loword(uap->linkname);



hiword und loword sind macros in param.h:


Quellcode:

# define loword(X)      (((unsigned short *)&X)[sizeof(X) - \
                        (sizeof(unsigned short)+1)])
# define hiword(X)      (((unsigned short *)&X)[0])



Ergibt dann folgendes ASM:


Quellcode:

        ld      r2,rr8(#4)
        and     r2,#32512
        ld      _u+78,r2
        ld      r2,rr8(#6)
        ld      _u+80,r2



Macht zwar das gleiche, aber ist halt nicht 100% binär-identisch
Wundere mich, warum

Quellcode:

  u.u_dirp.l = (caddr_t)(((long)uap->linkname) & 0x7F00FFFF);


nicht funzte....

Jedenfalls läuft nun link() wieder...


Quellcode:

#1 ls -i /z/tmp/
2487 hugo   2486 walter
#2 rm /z/tmp/walter
#3 ln /z/tmp/hugo /z/tmp/walter
#4 !1
ls -i /z/tmp/
2487 hugo   2487 walter
#5 ln /z/tmp/hugo /z/walter
#6 ls -i /z/tmp/hugo /z/walter
2487 /z/tmp/hugo                  2487 /z/walter
#7



Wenn noch irgendwer ne Idee hat.....
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek