logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[PoewrPC 405GP][C/Asembler][Linux] - problem z mmu

Komar_Rafal 03 Lip 2008 09:48 1940 2
REKLAMA
  • #1 5307530
    Komar_Rafal
    Poziom 10  
    Procesor: PowerPC 405GP
    System: Linux 2.6.22.1

    Witam,
    korzystam z EBC banku 1, mam tam podlaczone pewne urzadzenie. Konfiguruje to tak:
    set_dcr(EBC0_CFGADDR, EBC0_B1CR);
    set_dcr(EBC0_CFGDATA, 0xE001C000);

    set_dcr(EBC0_CFGADDR, EBC0_B1AP);
    set_dcr(EBC0_CFGDATA, 0x89020100);

    set_dcr(EBC0_CFGADDR, EBC0_CFG);
    set_dcr(EBC0_CFGDATA, 0xF36000000);

    Rejestry sie ustawiaja bo to juz sprawdzilem. Problem jest z odwolaniem sie teraz do tego obszaru pamieci. Probujac odczytac wartosc z pod adresu 0xE0004080 (wlasnie z tego banku) Linux wypada na trapie:


    Oops: kernel access of bad area, sig: 11 [#5]
    PREEMPT
    NIP: C2099628 LR: C2099618 CTR: C01CF13C
    REGS: c0b55df0 TRAP: 0300 Not tainted (2.6.22.1)
    MSR: 00029030 <EE,ME,IR,DR> CR: 24000442 XER: 00000000
    DAR: E0004080, DSISR: 00000000, result: 00000000
    TASK = c0e94460[156] 'cat' THREAD: c0b54000
    EBC0_BEAR: 00000000, EBC0_BESR0: 00000000, EBC0_BESR1: 00000000
    EBC0_B1CR: E001C000, EBC0_B1AP: 89020100
    ZPR: 10000000
    GPR00: C2099618 C0B55EA0 C0E94460 C2099AE4 00000001 00000001 00000000 C0340000
    GPR08: C034B7A3 E0004080 000092DE C0B54000 C0011400 1001C148 7FB67C80 10000000
    GPR16: 00000000 00000000 00000001 00000000 FFFFFFFF 100BFDC8 100C6028 00000000
    GPR24: 7FB67DB4 00000002 C0BC71A4 C03F02A0 C0B523B8 C0B523B8 C0925BE0 00000008
    NIP [C2099628] stratix_check+0x78/0x94 [gpio]
    LR [C2099618] stratix_check+0x68/0x94 [gpio]
    Call Trace:
    [C0B55EA0] [C2099618] stratix_check+0x68/0x94 [gpio] (unreliable)
    [C0B55EB0] [C20994D8] gpio_release+0x78/0xa8 [gpio]
    [C0B55EC0] [C006FDF0] __fput+0xd4/0x1ec
    [C0B55EF0] [C006FD0C] fput+0x30/0x40
    [C0B55F00] [C006DEF0] filp_close+0x80/0x98
    [C0B55F20] [C006DFA0] sys_close+0x98/0xe0
    [C0B55F40] [C0002B10] ret_from_syscall+0x0/0x3c
    Instruction dump:
    38000023 7c120386 3d403600 3920000f 7d330386 3c60c20a 38639ac8 480000cd
    3c60c20a 3d20e000 38639ae4 61294080 <80890000> 480000b5 80010014 38600000
    Segmentation fault


    Prawdopodobnie mmu ma zablokowany ten obszar. Wszystko konfiguruje sie w TLB i ZPR ale nie do konca wiem jak t zrobic. Trzeba odnalezc odpowiedni TLB powiazany z tym obszarem pamieci i go ustawic ale jak to nie wiem :(

    Czy ktos moze mi pomoc ?
  • REKLAMA
  • #2 5311269
    szelus
    Poziom 34  
    Nie możesz pod Linuxem odwoływać się bezpośrednio do adresów fizycznych. Trzeba je zamapować na pamięć wirtualną jądra. Służy do tego bodaj funkcja ioremap().
    Polecam książkę Linux Device Drivers
  • #3 5311322
    Komar_Rafal
    Poziom 10  
    Dzieki za odpowiedz :) Dzisiaj rano wlasnie tak zrobilem i zadzialalo. A skoro ktos mi radzi zeby uzyc funkcji, ktorej juz wczesniej uzylem tzn., ze dobrze zrobilem :D A w/w ksiazke caly czas czytam ;)
REKLAMA