Pierre Jacquier a écrit 11 commentaires

  • [^] # Finalement, j'ai avancé

    Posté par  . En réponse au message Problème SPARC et assembleur. Évalué à 1.

    J'ai réussi à faire un petit programme en fait très simple pour charger un texte de la RAM et le mettre sur le TTY, le voici

    .text
    .global uputs_adr
    .type uputs_adr, #function
    /*; .set noreorder */

    /* uputs_adr(adresses_physique, texte)*/

    uputs_adr:
    ldsb [ %o1 ], %o3 /*chargement du caractère pointé vers un registre local*/
    addcc %o3, 0, %o3 /*Z=0 si le caractère est \0*/
    be end_uputs_adr /*si caractère = \0, fin de chaine*/
    add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/

    loop: stb %o3, [ %o0 ] /*sinon, on écrit le caractère à l'adresse du TTY*/
    ldsb [ %o1 ], %o3 /* on charge le caractère*/
    addcc %o3, 0, %o3 /*Z=0 si le caractère est \0*/
    bne loop /*si caractère != \0, on recommence*/
    add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/

    end_uputs_adr:
    retl
    nop


    MAIS il n'affiche rien. Je me suis rendu compte qu'en fait, c'est parceque, dans ma simulation, je ne faisais pas de reset, c'est à dire que, lorsque le processeur demarre, il charge l'instruction reset en premier, et il fallait donc que je crée un programme assembleur pour lire le code de mon programme mis en mémoire.
    Voici donc mon code de RESET :

    .extern _stack
    .extern _gp

    .text
    .align 2

    sethi %hi(_edata), %o0
    or %o0, %lo(_edata), %o0
    sethi %hi(_edata), %o1
    or %o1, %lo(_edata), %o1
    /* mov 0, %l2 */

    sethi %hi(_stack), %sp
    or %sp, %lo(_stack), %sp
    sub %sp, 4, %sp
    sethi %hi(_gp), %g1
    or %g1, %lo(_gp), %g1

    sethi %hi(main0), %l0
    or %l0, %lo(main0), %l0
    ld [%l0 + %lo(main0)], %l0

    jmpl main0, %l0
    nop
    /* call main0
    nop */


    OR ceci ne marche pas, car gcc me renvoie ce message :

    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-gcc -c main.c
    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-as reset.s -oreset.o
    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-as uputs_sparc.s -o uputs_sparc.o
    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-ld -T./ldscript -o sparc_soft.x main.o reset.o uputs_sparc.o
    ./reset.o(.text+0x24): relocation truncated to fit: R_SPARC_13 main0
    reset.o(.text+0x24): relocation truncated to fit: R_SPARC_13 main0
    make: *** [sparc_soft.x] Error 1

    J'ai donc remplacé mon jmpl par le call en commentaire, et là ça compile, masi ça n'affiche toujours rien. Je précise que le main0 est le suivant :

    int main0(void)
    {
    uputs_adr(0xC0000000,"Salut les gens, c'est moi le SPARC\n");
    return 0;
    }

    Et là, je dois avouer que je ne vois plus du tout pourquoi ça plante...
  • # Finalement, j'ai avancé !!!

    Posté par  . En réponse au message Problème SPARC et assembleur. Évalué à 1.

    J'ai réussi à faire le petit programme finalement très simple de prendre un message de la RAM pour la mettre sur le TTY.
    Malheureusement, si tout compile bien, rien ne s'affiche.
    J'ai trouvé pourquoi : au démarrage de la simulation, le SPARC (comme tous les ordinateurs il me semble) se met dans la position RESET et démarre.
    Or, si j'ai bien touvé un code en MIPS (c'est sur cette machine que j'ai appris à faire de l'assembleur), je n'arrive pas à le transformer...
    Enfin, presque pas : en particulier, j'ai lu la DOC du SPARC (presque) en entier (295 pages...) et je ne vois pas de registres utilisés pour l'OS (comme dans le MIPS les registres 27 et 28...
    Voici donc mon code :


    .extern _stack
    .extern _gp

    .text
    .align 2

    /* Modification de SR -> kernel avec IT */

    sethi %hi(_edata), %o0
    or %o0, %lo(_edata), %o0
    sethi %hi(_edata), %o1
    or %o1, %lo(_edata), %o1
    /* mov 0, %l2 */

    sethi %hi(_stack), %sp
    or %sp, %lo(_stack), %sp
    sub %sp, 4, %sp
    sethi %hi(_gp), %g1
    or %g1, %lo(_gp), %g1

    sethi %hi(main0), %l0
    or %l0, %lo(main0), %l0
    /* ld [%l0 + %lo(main0)], %l0 */

    jmpl main0, %l0
    nop
    /* call main0
    nop */



    Voici ce que gcc, en utilisant l'option du SPARC bien éidemment :) me répond :

    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-gcc -c main.c
    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-as reset.s -oreset.o
    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-as uputs_sparc.s -o uputs_sparc.o
    /dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-ld -T./ldscript -o sparc_soft.x main.o reset.o uputs_sparc.o
    ./reset.o(.text+0x2c): relocation truncated to fit: R_SPARC_13 main0
    reset.o(.text+0x2c): relocation truncated to fit: R_SPARC_13 main0
    make: *** [sparc_soft.x] Error 1

    J'ai donc remplacé le jmpl par le call (en commentaire sur cette version...) et ça compile... mais ça n'affiche rien ...
    Voici donc mes questions :
    1°) Pourquoi ce message d'erreur ?
    2°) Comment faire pour le corriger car je pense que CALL n'est pas une bonne solution.


    PS : Le principe de ce RESET est de mettre main0 en mémoire pour démarrer. Le main0 doit juste faire la commande d'affiche uputs que voici :

    .text
    .global uputs_adr
    .type uputs_adr, #function
    /*; .set noreorder */

    /* uputs_adr(adresses_physique, texte)*/

    uputs_adr:
    ldsb [ %o1 ], %o3 /*chargement du caractère pointé vers un registre local*/
    addcc %o3, 0, %o3 /*Z=0 si le caractère est \0*/
    be end_uputs_adr /*si caractère = \0, fin de chaine*/
    add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/

    loop: stb %o3, [ %o0 ] /*sinon, on écrit le caractère à l'adresse du TTY*/
    ldsb [ %o1 ], %o3 /* on charge le caractère*/
    addcc %o3, 0, %o3 /*Z=0 si le caractère est \0*/
    bne loop /*si caractère != \0, on recommence*/
    add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/

    end_uputs_adr:
    retl
    nop

    Et voici le main0 pour que, j'espère, ce soit plus clair :

    /* #define TTY_BASE 0xC0000000 */

    int main0(void)
    {
    uputs_adr(0xC0000000,"Salut les gens, c'est moi le SPARC\n"); /* 0xC0000000 est l'adresse de mon TTY suivant mon architecture.*/
    return 0;
    }
  • # Cool, j'ai compris

    Posté par  . En réponse au message Encore moi, je rame.... Évalué à 1.

    Merci à tous les deux, vous venez de me sauver la vie.
    J'ai bien compris comment m'y prendre.
    A plus tard pour de nouvelles aventures !!!

    Jacouille la fripouille
  • [^] # Re: c'est simple

    Posté par  . En réponse au message Encore moi, je rame.... Évalué à 1.

    je pensais qu'une liste chainee circulaire serait plus jolie, mais comment la rendre circulaire ? Comme on ne connait pas sa taille... Ou alors on définit une taille maximum, comme pour un tableau ?
  • [^] # Re: C'est quoi une "fifo circulaire" ?

    Posté par  . En réponse au message Encore moi, je rame.... Évalué à 1.

    Quand je parle de circulaire, en fait, c'était juste le modulo taille du tableau...
    Ca fait de la circularité...
    Merci beaucoup ...
  • [^] # Re: Installing grub

    Posté par  . En réponse au message passage de lilo a grub dans debian. Évalué à 1.

    Pour ce genre de problème, vas voir le post que j'a iécrit à l'adresse suivante :
    http://linuxfr.org/comments/446627.html#446627(...)
    (j'ai pas envie de tout réecrire !)
  • [^] # En fait, je suis un crétin

    Posté par  . En réponse au message Suse, Windows et grub : Problème bizarre. Évalué à 1.

    C'est tout simplement que, pour faire un double-boot, il faut mettre sur le disque sur lequel il y a deja windaube, une partition /boot sur laquelle on installe le double boot.
    Et tout marche !

    D'ailleurs, pas besoin de formater Windows : il faut enlever le point de montage, redimensionner la partition Windows (si Windows ne surcharge pas totalement le disque (130 Mo de décalage, ca suffit amplement), et mettre /boot sur l'espace libéré. puis REMETTRE le point de montage pour Windaube (typiquement /windows/c)

    Sur l'autre disque, on installe Linux sans rien changer à d'habitude :)
    Et voilà, c'est gagné !

    PS: c'est LA solution que j'ai trouvée, mais si quelqu'un a d'autres solutions qui marche ...
  • # Bracher un recepteur de l'autre côté

    Posté par  . En réponse au message Port série et enregistrement. Évalué à 1.

    En parlant de bracher un recepteur de l'autre côté en série, j'ai déjà un Palm Vx... Sur le site de Palm, il n'en parle même plus tellement il est dépassé.
    Connaissez-vous un petit programme installable dessus qui est capable de recevoir des infos séries ? (type ASCII affichables à l'écran ?)
    Merci
    @++

    Jacouille

    "La difficulté d'être un super-génie, c'est d'être entouré de super crétins " (Calvin dans Calvin and Hobbes (Bill Watterson))
  • # Exactement pareil

    Posté par  . En réponse au message passage de lilo a grub dans debian. Évalué à 1.

    J'ai exactement le même problème sous Suse
    Courage !
  • [^] # Re: bootloader

    Posté par  . En réponse au message Suse, Windows et grub : Problème bizarre. Évalué à 1.

    Mon grub corrompu ?
    Je viens de télécharger la dernère version de suse en ligne, et le grub est corrompu ?
    Vive Suse dans ces cas là !!!
    Mais je vais essayer tout de même.
    Merci beaucoup.
  • # J'adore les posts crétins

    Posté par  . En réponse au message chocking. Évalué à 1.

    La vie serait si dure sans eux !!!

    KISS (Keep It Simple, Stupid !)