Changeset 204


Ignore:
Timestamp:
Aug 14, 2012, 8:14:55 PM (12 years ago)
Author:
alain
Message:

mproving support for multi-clusters architectures (CLUSTER_SIZE & CLUSTER_IO_ID parameters)

Location:
soft/giet_vm
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/Makefile

    r203 r204  
    44LD=mipsel-unknown-elf-ld
    55DU=mipsel-unknown-elf-objdump
     6
     7MAP_XML      = 1c_4p_four.xml
    68
    79SYS_OBJS     = build/sys/vm_handler.o \
     
    5759
    5860### mapping compilation
    59 map.bin: 1c_4p_four.xml
     61map.bin: $(MAP_XML)
    6062        $(MAKE) -C xml
    6163        xml/xml2bin $< $@
  • soft/giet_vm/boot/boot_init.c

    r203 r204  
    286286void boot_puts(const char *buffer)
    287287{
    288     unsigned int* tty_address = (unsigned int*)&seg_tty_base;
     288    unsigned int* tty_address = (unsigned int*)( (unsigned)&seg_tty_base +
     289                                     (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
    289290    unsigned int n;
    290291
     
    297298}
    298299////////////////////////////////////////////////////////////////////////////
    299 // boot_putw()
     300// boot_putx()
    300301// (it uses TTY0)
    301302////////////////////////////////////////////////////////////////////////////
    302 void boot_putw(unsigned int val)
     303void boot_putx(unsigned int val)
    303304{
    304305    static const char   HexaTab[] = "0123456789ABCDEF";
     
    316317    }
    317318    boot_puts(buf);
     319}
     320////////////////////////////////////////////////////////////////////////////
     321// boot_putd()
     322// (it uses TTY0)
     323////////////////////////////////////////////////////////////////////////////
     324void boot_putd(unsigned int val)
     325{
     326    static const char   DecTab[] = "0123456789";
     327    char                buf[11];
     328    unsigned int        i;
     329    unsigned int        first;
     330
     331    buf[10] = 0;
     332
     333    for ( i = 0 ; i < 10 ; i++ )
     334    {
     335        if ((val != 0) || (i == 0))
     336        {
     337            buf[9-i] = DecTab[val % 10];
     338            first    = 9-i;
     339        }
     340        else
     341        {
     342            break;
     343        }
     344        val /= 10;
     345    }
     346    boot_puts( &buf[first] );
    318347}
    319348
     
    495524    {
    496525        boot_puts("Unfound page table for vspace ");
    497         boot_putw(vspace_id);
     526        boot_putd(vspace_id);
    498527        boot_puts("\n");
    499528        boot_exit();
     
    530559    if ( ( *pt_flags & PTE_V) != 0 )    // page already mapped
    531560    {
    532         boot_puts("\n[BOOT ERROR] in boot_add_pte() function\n");
    533         boot_puts("page already mapped\n");
     561        boot_puts("\n[BOOT ERROR] double mapping in vspace ");
     562        boot_putd( vspace_id );
     563        boot_puts(" for vpn = ");
     564        boot_putx( vpn );
     565        boot_puts("\n");
    534566        boot_exit();
    535567    }
     
    579611boot_puts( vseg[vseg_id].name );
    580612boot_puts(" : flags = ");
    581 boot_putw( flags );
     613boot_putx( flags );
    582614boot_puts(" / npages = ");
    583 boot_putw( npages );
     615boot_putd( npages );
    584616boot_puts(" / pbase = ");
    585 boot_putw( vseg[vseg_id].pbase );
     617boot_putx( vseg[vseg_id].pbase );
    586618boot_puts("\n");
    587619#endif       
     
    615647boot_puts( vseg[vseg_id].name );
    616648boot_puts(" / flags = ");
    617 boot_putw( flags );
     649boot_putx( flags );
    618650boot_puts(" / npages = ");
    619 boot_putw( npages );
     651boot_putd( npages );
    620652boot_puts(" / pbase = ");
    621 boot_putw( vseg[vseg_id].pbase );
     653boot_putx( vseg[vseg_id].pbase );
    622654boot_puts("\n");
    623655#endif       
     
    720752                boot_puts( "\n[BOOT ERROR] in boot_vseg_map() function, " );
    721753                boot_puts("PTAB too small, minumum size is: ");
    722                 boot_putw( PT1_SIZE + PT2_SIZE);
     754                boot_putx( PT1_SIZE + PT2_SIZE);
    723755                boot_exit();
    724756            }
     
    750782        boot_puts("\n");
    751783        boot_puts("vseg pbase = ");
    752         boot_putw( vseg->pbase );
     784        boot_putx( vseg->pbase );
    753785        boot_puts("\n");
    754786        boot_puts("vseg length = ");
    755         boot_putw( vseg->length );
     787        boot_putx( vseg->length );
    756788        boot_puts("\n");
    757789        boot_puts("pseg pbase = ");
    758         boot_putw( pseg->base );
     790        boot_putx( pseg->base );
    759791        boot_puts("\n");
    760792        boot_puts("pseg length = ");
    761         boot_putw( pseg->length );
     793        boot_putx( pseg->length );
    762794        boot_puts("\n");
    763795        boot_exit();
     
    771803boot_puts( vseg->name );
    772804boot_puts(" : len = ");
    773 boot_putw( vseg->length );
     805boot_putx( vseg->length );
    774806boot_puts(" / vbase = ");
    775 boot_putw( vseg->vbase );
     807boot_putx( vseg->vbase );
    776808boot_puts(" / pbase = ");
    777 boot_putw( vseg->pbase );
     809boot_putx( vseg->pbase );
    778810boot_puts("\n");
    779811#endif 
     
    795827    {
    796828        boot_puts("\n[BOOT ERROR] Illegal mapping signature: ");
    797         boot_putw(header->signature);
     829        boot_putx(header->signature);
    798830        boot_puts("\n");
    799831        boot_exit();
     
    805837        boot_puts("\n[BOOT ERROR] Incoherent NB_CLUSTERS");
    806838        boot_puts("\n             - In giet_config,  value = ");
    807         boot_putw ( NB_CLUSTERS );
     839        boot_putd ( NB_CLUSTERS );
    808840        boot_puts("\n             - In mapping_info, value = ");
    809         boot_putw ( header->clusters );
     841        boot_putd ( header->clusters );
    810842        boot_puts("\n");
    811843        boot_exit();
     
    823855    unsigned int periph_id;
    824856    unsigned int cluster_id;
    825     unsigned int channels;
    826857    unsigned int tty_found = 0;
    827858    unsigned int nic_found = 0;
     
    832863        {
    833864            boot_puts("\n[BOOT ERROR] too much processors in cluster ");
    834             boot_putw( cluster_id );
     865            boot_putd( cluster_id );
    835866            boot_puts(" : procs = ");
    836             boot_putw ( cluster[cluster_id].procs );
     867            boot_putd ( cluster[cluster_id].procs );
    837868            boot_puts("\n");
    838869            boot_exit();
     
    854885                {
    855886                    boot_puts("\n[BOOT ERROR] Wrong NB_TTYS in cluster ");
    856                     boot_putw( cluster_id );
     887                    boot_putd( cluster_id );
    857888                    boot_puts(" : ttys = ");
    858                     boot_putw ( periph[periph_id].channels );
     889                    boot_putd ( periph[periph_id].channels );
    859890                    boot_puts("\n");
    860891                    boot_exit();
     
    873904                {
    874905                    boot_puts("\n[BOOT ERROR] Wrong NB_NICS in cluster ");
    875                     boot_putw( cluster_id );
     906                    boot_putd( cluster_id );
    876907                    boot_puts(" : nics = ");
    877                     boot_putw ( periph[periph_id].channels );
     908                    boot_putd ( periph[periph_id].channels );
    878909                    boot_puts("\n");
    879910                    boot_exit();
     
    887918                {
    888919                    boot_puts("\n[BOOT ERROR] Too much user timers in cluster ");
    889                     boot_putw( cluster_id );
     920                    boot_putd( cluster_id );
    890921                    boot_puts(" : timers = ");
    891                     boot_putw ( periph[periph_id].channels );
     922                    boot_putd ( periph[periph_id].channels );
    892923                    boot_puts("\n");
    893924                    boot_exit();
     
    900931                {
    901932                    boot_puts("\n[BOOT ERROR] Too much DMA channels in cluster ");
    902                     boot_putw( cluster_id );
     933                    boot_putd( cluster_id );
    903934                    boot_puts(" : channels = ");
    904                     boot_putw ( periph[periph_id].channels );
     935                    boot_putd ( periph[periph_id].channels );
    905936                    boot_puts("\n");
    906937                    boot_exit();
     
    937968        {
    938969            boot_puts("\n[BOOT ERROR] The number of processors in cluster ");
    939             boot_putw( cluster_id );
     970            boot_putd( cluster_id );
    940971            boot_puts(" is larger than NB_PROCS_MAX \n");
    941972            boot_exit();
     
    959990#if BOOT_DEBUG_PT
    960991boot_puts("cluster ");
    961 boot_putw(cluster_id);
     992boot_putd(cluster_id);
    962993boot_puts(" / pseg ");
    963994boot_puts(pseg[pseg_id].name);
    964995boot_puts(" : next_base = ");
    965 boot_putw(pseg[pseg_id].next_base);
     996boot_putx(pseg[pseg_id].next_base);
    966997boot_puts("\n");
    967998#endif
     
    10281059#if BOOT_DEBUG_PT
    10291060boot_puts("\n>>> page table physical address = ");
    1030 boot_putw((unsigned int)boot_ptabs_paddr[vspace_id]);
     1061boot_putx((unsigned int)boot_ptabs_paddr[vspace_id]);
    10311062boot_puts(", page table number of PT2 = ");
    1032 boot_putw((unsigned int)boot_max_pt2[vspace_id]);
     1063boot_putd((unsigned int)boot_max_pt2[vspace_id]);
    10331064boot_puts("\n");
    10341065#endif
     
    10821113boot_puts( vobj[vobj_id].name);
    10831114boot_puts(" / depth = ");
    1084 boot_putw( mwmr->depth );
     1115boot_putd( mwmr->depth );
    10851116boot_puts(" / width = ");
    1086 boot_putw( mwmr->width );
     1117boot_putd( mwmr->width );
    10871118boot_puts("\n");
    10881119#endif
     
    10951126boot_puts( vobj[vobj_id].name);
    10961127boot_puts(" / length = ");
    1097 boot_putw( vobj[vobj_id].length );
     1128boot_putx( vobj[vobj_id].length );
    10981129boot_puts("\n");
    10991130#endif
     
    11061137boot_puts( vobj[vobj_id].name);
    11071138boot_puts(" / length = ");
    1108 boot_putw( vobj[vobj_id].length );
     1139boot_putx( vobj[vobj_id].length );
    11091140boot_puts("\n");
    11101141#endif
     
    11201151boot_puts( vobj[vobj_id].name);
    11211152boot_puts(" / init_value = ");
    1122 boot_putw( barrier->init );
     1153boot_putd( barrier->init );
    11231154boot_puts("\n");
    11241155#endif
     
    11421173boot_puts( vobj[vobj_id].name);
    11431174boot_puts(" / length = ");
    1144 boot_putw( vobj[vobj_id].length );
     1175boot_putx( vobj[vobj_id].length );
    11451176boot_puts("\n");
    11461177#endif
     
    11541185boot_puts( vobj[vobj_id].name);
    11551186boot_puts(" / length = ");
    1156 boot_putw( vobj[vobj_id].length );
     1187boot_putx( vobj[vobj_id].length );
    11571188boot_puts("\n");
    11581189#endif
     
    11731204        {
    11741205            boot_puts("\n[INIT ERROR] Missing PTAB for vspace ");
    1175             boot_putw( vspace_id );
     1206            boot_putd( vspace_id );
    11761207            boot_exit();
    11771208        }
     
    11851216    volatile unsigned int *cbase = (unsigned int*) coproc;
    11861217   
    1187 
    11881218    cbase[MWMR_CONFIG_FIFO_WAY] = way ;
    11891219    cbase[MWMR_CONFIG_FIFO_NO] = no ;
     
    12221252#if BOOT_DEBUG_PERI
    12231253boot_puts("\n[BOOT DEBUG] ****** peripheral initialisation in cluster ");
    1224 boot_putw( cluster_id );
     1254boot_putd( cluster_id );
    12251255boot_puts(" ******\n");
    12261256#endif
     
    12451275#if BOOT_DEBUG_PERI
    12461276boot_puts("- IOC initialised : ");
    1247 boot_putw( channels );
     1277boot_putd( channels );
    12481278boot_puts(" channels\n");
    12491279#endif
     
    12611291#if BOOT_DEBUG_PERI
    12621292boot_puts("- DMA initialised : ");
    1263 boot_putw( channels );
     1293boot_putd( channels );
    12641294boot_puts(" channels\n");
    12651295#endif
     
    12761306#if BOOT_DEBUG_PERI
    12771307boot_puts("- NIC initialised : ");
    1278 boot_putw( channels );
     1308boot_putd( channels );
    12791309boot_puts(" channels\n");
    12801310#endif
     
    12981328#if BOOT_DEBUG_PERI
    12991329boot_puts("- IOB initialised : ");
    1300 boot_putw( channels );
     1330boot_putd( channels );
    13011331boot_puts(" channels\n");
    13021332#endif
     
    13041334
    13051335        } // end for periphs
    1306 /*
     1336
    13071337        for ( coproc_id = cluster[cluster_id].coproc_offset ;
    13081338              coproc_id < cluster[cluster_id].coproc_offset + cluster[cluster_id].coprocs ;
     
    13151345#if BOOT_DEBUG_PERI
    13161346boot_puts("[BOOT] mwmr coproc initialisation of ");
    1317 boot_putw((unsigned int) coproc[coproc_id].name);
     1347boot_putx((unsigned int) coproc[coproc_id].name);
    13181348boot_puts(", nb ports");
    1319 boot_putw((unsigned int)coproc[coproc_id].ports);
     1349boot_putd((unsigned int)coproc[coproc_id].ports);
    13201350boot_puts("\n");
    13211351#endif
     
    13561386            }
    13571387        } // end for coprocs
    1358 */
     1388
    13591389    } // end for clusters
    13601390} // end boot_peripherals_init()
     
    14171447#if BOOT_DEBUG_SCHED
    14181448boot_puts("\n[BOOT DEBUG] Initialise schedulers / IT vector in cluster ");
    1419 boot_putw( cluster_id );
     1449boot_putd( cluster_id );
    14201450boot_puts("\n");
    14211451#endif
     
    14401470        {
    14411471            boot_puts("\n[BOOT ERROR] Missing RAM pseg in cluster ");
    1442             boot_putw( cluster_id );
     1472            boot_putd( cluster_id );
    14431473            boot_puts("\n");
    14441474            boot_exit();
     
    14591489#if BOOT_DEBUG_SCHED
    14601490boot_puts("\nProc ");
    1461 boot_putw( proc_id );
     1491boot_putd( proc_id );
    14621492boot_puts(" : scheduler pbase = ");
    1463 boot_putw( pseg_pbase + (proc_id<<12) );
     1493boot_putx( pseg_pbase + (proc_id<<12) );
    14641494boot_puts("\n");
    14651495#endif
     
    14881518#if BOOT_DEBUG_SCHED
    14891519boot_puts("- IRQ : icu = ");
    1490 boot_putw( icu_id );
     1520boot_putd( icu_id );
    14911521boot_puts(" / type = ");
    1492 boot_putw( type );
     1522boot_putd( type );
    14931523boot_puts(" / isr = ");
    1494 boot_putw( isr_id );
     1524boot_putd( isr_id );
    14951525boot_puts(" / channel = ");
    1496 boot_putw( channel );
     1526boot_putd( channel );
    14971527boot_puts("\n");
    14981528#endif
     
    16271657            {
    16281658                boot_puts("\n[BOOT ERROR] : ");
    1629                 boot_putw( ltid );
     1659                boot_putd( ltid );
    16301660                boot_puts(" tasks allocated to processor ");
    1631                 boot_putw( gpid );
     1661                boot_putd( gpid );
    16321662                boot_puts(" / max is 15\n");
    16331663                boot_exit();
     
    16591689boot_puts( task[task_id].name );
    16601690boot_puts(" allocated to processor ");
    1661 boot_putw( gpid );
     1691boot_putd( gpid );
    16621692boot_puts("  - ctx[LTID]   = ");
    1663 boot_putw( ltid );
     1693boot_putd( ltid );
    16641694boot_puts("\n");
    16651695
    16661696boot_puts("  - ctx[SR]     = ");
    1667 boot_putw( ctx_sr );
     1697boot_putx( ctx_sr );
    16681698boot_puts("\n");
    16691699
    16701700boot_puts("  - ctx[SR]     = ");
    1671 boot_putw( ctx_sp );
     1701boot_putx( ctx_sp );
    16721702boot_puts("\n");
    16731703
    16741704boot_puts("  - ctx[RA]     = ");
    1675 boot_putw( ctx_ra );
     1705boot_putx( ctx_ra );
    16761706boot_puts("\n");
    16771707
    16781708boot_puts("  - ctx[EPC]    = ");
    1679 boot_putw( ctx_epc );
     1709boot_putx( ctx_epc );
    16801710boot_puts("\n");
    16811711
    16821712boot_puts("  - ctx[PTPR]   = ");
    1683 boot_putw( ctx_ptpr );
     1713boot_putx( ctx_ptpr );
    16841714boot_puts("\n");
    16851715
    16861716boot_puts("  - ctx[TTY]    = ");
    1687 boot_putw( ctx_tty );
     1717boot_putd( ctx_tty );
    16881718boot_puts("\n");
    16891719
    16901720boot_puts("  - ctx[NIC]    = ");
    1691 boot_putw( ctx_nic );
     1721boot_putd( ctx_nic );
    16921722boot_puts("\n");
    16931723
    16941724boot_puts("  - ctx[TIMER]  = ");
    1695 boot_putw( ctx_timer );
     1725boot_putd( ctx_timer );
    16961726boot_puts("\n");
    16971727
    16981728boot_puts("  - ctx[FBDMA]  = ");
    1699 boot_putw( ctx_fbdma );
     1729boot_putd( ctx_fbdma );
    17001730boot_puts("\n");
    17011731
    17021732boot_puts("  - ctx[PTAB]   = ");
    1703 boot_putw( ctx_ptab );
     1733boot_putx( ctx_ptab );
    17041734boot_puts("\n");
    17051735
    17061736boot_puts("  - ctx[VSID]   = ");
    1707 boot_putw( vspace_id );
     1737boot_putd( vspace_id );
    17081738boot_puts("\n");
    17091739
     
    17321762
    17331763    boot_puts("\n[BOOT] Mapping check completed at cycle ");
    1734     boot_putw( boot_proctime() );
     1764    boot_putd( boot_proctime() );
    17351765    boot_puts("\n");
    17361766
     
    17391769
    17401770    boot_puts("\n[BOOT] Pseg allocators initialisation completed at cycle ");
    1741     boot_putw( boot_proctime() );
     1771    boot_putd( boot_proctime() );
    17421772    boot_puts("\n");
    17431773
     
    17461776
    17471777    boot_puts("\n[BOOT] Page Tables initialisation completed at cycle ");
    1748     boot_putw( boot_proctime() );
     1778    boot_putd( boot_proctime() );
    17491779    boot_puts("\n");
    17501780
     
    17531783
    17541784    boot_puts("\n[BOOT] Vobjs initialisation completed at cycle : ");
    1755     boot_putw( boot_proctime() );
     1785    boot_putd( boot_proctime() );
    17561786    boot_puts("\n");
    17571787
     
    17601790
    17611791    boot_puts("\n[BOOT] Peripherals initialisation completed at cycle ");
    1762     boot_putw( boot_proctime() );
     1792    boot_putd( boot_proctime() );
    17631793    boot_puts("\n");
    17641794
     
    17681798
    17691799    boot_puts("\n[BOOT] MMU activation completed at cycle ");
    1770     boot_putw( boot_proctime() );
     1800    boot_putd( boot_proctime() );
    17711801    boot_puts("\n");
    17721802
     
    17751805
    17761806    boot_puts("\n[BOOT] Schedulers initialisation completed at cycle ");
    1777     boot_putw( boot_proctime() );
     1807    boot_putd( boot_proctime() );
    17781808    boot_puts("\n");
    17791809
  • soft/giet_vm/boot/reset.S

    r199 r204  
    6565    nop
    6666    mfc0        a0,     CP0_TIME
    67         jal             boot_putw
     67        jal             boot_putx
    6868        nop
    6969    la          a0,     boot_lf_string
     
    7676    mfc0        k0,     CP0_PROCID
    7777    andi        a0,     k0,     0xFFF
    78         jal             boot_putw
     78        jal             boot_putx
    7979    nop
    8080    la          a0,     boot_lf_string
     
    8686    nop
    8787    mfc0        a0,     CP0_EPC
    88         jal             boot_putw
     88        jal             boot_putx
    8989    nop
    9090    la          a0,     boot_lf_string
     
    9696    nop
    9797    mfc0        a0,     CP0_CR
    98         jal             boot_putw
     98        jal             boot_putx
    9999    nop
    100100    la          a0,     boot_lf_string
     
    106106    nop
    107107    mfc0        a0,     CP0_SR
    108         jal             boot_putw
     108        jal             boot_putx
    109109    nop
    110110    la          a0,     boot_lf_string
     
    116116    nop
    117117    mfc0        a0,     CP0_BVAR
    118         jal             boot_putw
     118        jal             boot_putx
    119119    nop
    120120    la          a0,     boot_lf_string
  • soft/giet_vm/giet_config.h

    r203 r204  
    1212/* Debug parameters */
    1313
    14 #define BOOT_DEBUG_PERI     0       /* display peripherals initialisation on TTY0 */
    15 #define BOOT_DEBUG_PT           0           /* display page tables initialisation on TTY0 */
    16 #define BOOT_DEBUG_VOBJS        0               /* display vobjs initialisation on TTY0 */
    17 #define BOOT_DEBUG_SCHED        0               /* display schedulers initialisation on TTY0 */
     14#define BOOT_DEBUG_PERI     0                   /* trace peripherals initialisation on TTY0 */
     15#define BOOT_DEBUG_PT           0                       /* trace page tables initialisation on TTY0 */
     16#define BOOT_DEBUG_VOBJS        0                       /* trace vobjs initialisation on TTY0 */
     17#define BOOT_DEBUG_SCHED        0                       /* trace schedulers initialisation on TTY0 */
    1818
    19 #define GIET_DEBUG_INIT         0               /* display parallel kernel initialisation on TTY0 */
    20 #define GIET_DEBUG_SWITCH       0           /* display context switchs on TTY0 */
     19#define GIET_DEBUG_INIT         0                       /* trace parallel kernel initialisation on TTY0 */
     20#define GIET_DEBUG_SWITCH       0                       /* trace context switchs on TTY0 */
    2121
    2222
     
    2525/* hardware parameters */
    2626
    27 #define NB_CLUSTERS             1           /* number of clusters */
    28 #define CLUSTER_SPAN            0           /* address increment between clusters */
    29 #define NB_PROCS_MAX        4       /* max number of processors per cluster */
    30 #define NB_TIMERS_MAX           0           /* max number of user timers per cluster */
    31 #define NB_DMAS_MAX                     1           /* max number of DMA channels per cluster*/
    32 #define NB_TTYS                         8           /* total number of TTY channels */
    33 #define NB_IOCS                         0           /* total number of IOC channels */
    34 #define NB_NICS                         0           /* total number of NIC channels */
     27#define NB_CLUSTERS             1                       /* number of clusters */
     28#define CLUSTER_SIZE            0x40000000      /* address increment between clusters */
     29#define CLUSTER_IO_ID       0                   /* cluster containing non replicated peripherals */
     30       
     31#define NB_PROCS_MAX        4                   /* max number of processors per cluster */
     32#define NB_TIMERS_MAX           0                       /* max number of user timers per cluster */
     33#define NB_DMAS_MAX                     1                       /* max number of DMA channels per cluster*/
     34#define NB_TTYS                         8                       /* total number of TTY channels */
     35#define NB_IOCS                         0                       /* total number of IOC channels */
     36#define NB_NICS                         0                       /* total number of NIC channels */
    3537
    3638/* software parameters */
    3739
    38 #define GIET_NB_VSPACE_MAX      4           /* max number of virtual spaces */
    39 #define GIET_TICK_VALUE     0x4000  /* context switch period (number of cycles) */
    40 #define GIET_IOMMU_ACTIVE   0           /* The IOMMU vspace is defined */
    41 #define GIET_USE_XICU       1           /* Use the XICU interrupt controler */
     40#define GIET_NB_VSPACE_MAX      4                       /* max number of virtual spaces */
     41#define GIET_TICK_VALUE     0x4000              /* context switch period (number of cycles) */
     42#define GIET_IOMMU_ACTIVE   0                   /* The IOMMU vspace is defined */
     43#define GIET_USE_XICU       1                   /* Use the XICU interrupt controler */
    4244
    4345#endif
  • soft/giet_vm/libs/stdio.c

    r203 r204  
    2121#define SYSCALL_GCD_WRITE       0x06
    2222#define SYSCALL_GCD_READ        0x07
    23 #define SYSCALL_TTY_READ_IRQ    0x0A
    24 #define SYSCALL_TTY_WRITE_IRQ   0x0B
    2523#define SYSCALL_CTX_SWITCH      0x0D
    2624#define SYSCALL_EXIT            0x0E
     
    165163                    0,0);
    166164}
    167 
    168 ////////////////////////////////////////////////////////////////////////////////////
    169 // giet_tty_getc_no_irq()
    170 ////////////////////////////////////////////////////////////////////////////////////
    171 // This blocking function fetches a single ascii character from a terminal.
    172 // The terminal index must be defined in the task context in the boot phase.
    173 // It doesn't use the IRQ_GET interrupt, and the associated kernel buffer.
    174 // - Returns necessarily 0 when completed.
    175 ////////////////////////////////////////////////////////////////////////////////////
    176 unsigned int giet_tty_getc_no_irq(char *byte)
    177 {
    178     unsigned int ret = 0;
    179     while (ret == 0)
    180     {
    181         ret = sys_call(SYSCALL_TTY_READ,
    182                        (unsigned int)byte,
    183                        1,
    184                        0,0);
    185     }
    186     return 0;
    187 }
    188165////////////////////////////////////////////////////////////////////////////////////
    189166// giet_tty_getc()
     
    199176    while (ret == 0)
    200177    {
    201         ret = sys_call(SYSCALL_TTY_READ_IRQ,
     178        ret = sys_call(SYSCALL_TTY_READ,
    202179                       (unsigned int)byte,
    203180                       1,
     
    231208    {
    232209        do {
    233             ret = sys_call(SYSCALL_TTY_READ_IRQ,
     210            ret = sys_call(SYSCALL_TTY_READ,
    234211                           (unsigned int)(&byte),
    235212                           1,
     
    283260    {
    284261        do {
    285             ret = sys_call(SYSCALL_TTY_READ_IRQ,
     262            ret = sys_call(SYSCALL_TTY_READ,
    286263                           (unsigned int)(&byte),
    287264                           1,
  • soft/giet_vm/sys/drivers.c

    r203 r204  
    1717//
    1818// The following global parameters must be defined in the giet_config.h file:
     19// - CLUSTER_IO_ID
     20// - CLUSTER_SIZE
    1921// - NB_CLUSTERS   
    2022// - NB_PROCS_MAX 
     
    2325// - NB_TTYS   
    2426//
    25 // The following virtual base addresses must be defined in the sys.ld file:
     27// The following virtual base addresses must be defined in the giet.ld file:
    2628// - seg_icu_base
    2729// - seg_tim_base
     
    3133// - seg_fbf_base
    3234// - seg_ioc_base
     35// As some peripherals can be replicated in the clusters (ICU, TIMER, DMA)
     36// These addresses must be completed by an offset depending on the cluster index
     37//    full_base_address = seg_***_base + cluster_id * CLUSTER_SIZE
    3338///////////////////////////////////////////////////////////////////////////////////
    3439
     
    5459#endif
    5560
    56 #if !defined(CLUSTER_SPAN)
    57 # error: You must define CLUSTER_SPAN in 'giet_config.h' file
     61#if !defined(CLUSTER_SIZE)
     62# error: You must define CLUSTER_SIZE in 'giet_config.h' file
    5863#endif
    5964
     
    132137
    133138#if GIET_USE_XICU
    134     unsigned int* timer_address = (unsigned int*)&seg_icu_base +
    135                                   (cluster_id * CLUSTER_SPAN);
     139    unsigned int* timer_address = (unsigned int*)((char*)&seg_icu_base +
     140                                  (cluster_id * CLUSTER_SIZE) );
    136141
    137142    timer_address[XICU_REG(XICU_PTI_PER, local_id)] = period;
    138143#else
    139     unsigned int* timer_address = (unsigned int*)&seg_tim_base +
    140                                   (cluster_id * CLUSTER_SPAN);
     144    unsigned int* timer_address = (unsigned int*)((char*)&seg_tim_base +
     145                                  (cluster_id * CLUSTER_SIZE) );
    141146
    142147    timer_address[local_id * TIMER_SPAN + TIMER_PERIOD] = period;
     
    160165
    161166#if GIET_USE_XICU
    162     unsigned int* timer_address = (unsigned int*)&seg_icu_base +
    163                                   (cluster_id * CLUSTER_SPAN);
     167    unsigned int* timer_address = (unsigned int*)((char*)&seg_icu_base +
     168                                  (cluster_id * CLUSTER_SIZE) );
    164169
    165170    timer_address[XICU_REG(XICU_PTI_PER, local_id)] = 0;
    166171#else
    167     unsigned int* timer_address = (unsigned int*)&seg_tim_base +
    168                                   (cluster_id * CLUSTER_SPAN);
     172    unsigned int* timer_address = (unsigned int*)((char*)&seg_tim_base +
     173                                  (cluster_id * CLUSTER_SIZE) );
    169174
    170175    timer_address[local_id * TIMER_SPAN + TIMER_MODE] = 0;
     
    176181//     _timer_reset_irq()
    177182// This function acknowlegge a timer interrupt in the vci_timer (or vci_xicu)
    178 // component by writing in the proper register the period value.
     183// component by reading/writing in the proper register.
    179184// It can be used by both the isr_switch() for a "system" timer,
    180185// or by the _isr_timer() for an "user" timer.
     
    189194
    190195#if GIET_USE_XICU
    191     unsigned int* timer_address = (unsigned int*)&seg_icu_base +
    192                                   (cluster_id * CLUSTER_SPAN);
     196    unsigned int* timer_address = (unsigned int*)((char*)&seg_icu_base +
     197                                  (cluster_id * (unsigned)CLUSTER_SIZE) );
    193198
    194199    unsigned int bloup = timer_address[XICU_REG(XICU_PTI_ACK, local_id)];
     200    bloup++;    // to avoid a warning
    195201#else
    196     unsigned int* timer_address = (unsigned int*)&seg_tim_base +
    197                                   (cluster_id * CLUSTER_SPAN);
     202    unsigned int* timer_address = (unsigned int*)((char*)&seg_tim_base +
     203                                  (cluster_id * CLUSTER_SIZE) );
    198204
    199205    timer_address[local_id * TIMER_SPAN + TIMER_RESETIRQ] = 0;
     
    258264    }
    259265
    260     unsigned int*       tty_address = (unsigned int*)&seg_tty_base + tty_id*TTY_SPAN;
     266    unsigned int*       tty_address = (unsigned int*)( (char*)&seg_tty_base +
     267                                  (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
    261268
    262269    for (nwritten = 0; nwritten < length; nwritten++)
    263270    {
    264271        // check tty's status
    265         if ((tty_address[TTY_STATUS] & 0x2) == 0x2)
     272        if ((tty_address[tty_id*TTY_SPAN + TTY_STATUS] & 0x2) == 0x2)
    266273            break;
    267274        else
    268275            // write character
    269             tty_address[TTY_WRITE] = (unsigned int)buffer[nwritten];
     276            tty_address[tty_id*TTY_SPAN + TTY_WRITE] = (unsigned int)buffer[nwritten];
    270277    }
    271278    return nwritten;
    272279}
    273280//////////////////////////////////////////////////////////////////////////////
    274 //      _tty_read_irq()
     281//      _tty_read()
    275282// This non-blocking function uses the TTY_GET_IRQ[tty_id] interrupt and
    276283// the associated kernel buffer, that has been written by the ISR.
     284// It get the TTY terminal index from the context of the current task.
    277285// It fetches one single character from the _tty_get_buf[tty_id] kernel
    278286// buffer, writes this character to the user buffer, and resets the
    279287// _tty_get_full[tty_id] buffer.
     288// The length argument is not used.
    280289// Returns 0 if the kernel buffer is empty, 1 if the buffer is full.
    281290//////////////////////////////////////////////////////////////////////////////
    282 unsigned int _tty_read_irq( char                        *buffer,
    283                             unsigned int        length)
     291unsigned int _tty_read( char                    *buffer,
     292                        unsigned int    length)
    284293{
    285294    unsigned int task_id  = _get_current_task_id();
     
    304313}
    305314////////////////////////////////////////////////////////////////////////////////
    306 //     _tty_read()
    307 // This non-blocking function fetches one character directly from the TTY_READ
    308 // register of the TTY controler, and writes this character to the user buffer.
    309 // It doesn't use the TTY_GET_IRQ interrupt and the associated kernel buffer.
    310 // Returns 0 if the register is empty, 1 if the register is full.
    311 ////////////////////////////////////////////////////////////////////////////////
    312 unsigned int _tty_read( char                    *buffer,
    313                         unsigned int    length)
    314 {
    315     unsigned int task_id  = _get_current_task_id();
    316     unsigned int tty_id   = _get_context_slot(task_id, CTX_TTY_ID);
    317 
    318     if ( tty_id >= NB_TTYS )
    319     {
    320         _tty_error( task_id );
    321         return 0;
    322     }
    323 
    324     unsigned int*       tty_address = (unsigned int*)&seg_tty_base + tty_id*TTY_SPAN;
    325 
    326     if ((tty_address[TTY_STATUS] & 0x1) != 0x1)
    327     {
    328         return 0;
    329     }
    330     else
    331     {
    332         *buffer = (char)tty_address[TTY_READ];
    333         return 1;
    334     }
     315//     _tty_get_char()
     316// This function is used by the _isr_tty to read a character in the TTY
     317// terminal defined by the tty_id argument. The character is stored
     318// in requested buffer, and the IRQ is acknowledged.
     319// Returns 0 if success, 1 if tty_id too large.
     320////////////////////////////////////////////////////////////////////////////////
     321unsigned int _tty_get_char( unsigned int        tty_id,
     322                            char*           buffer )
     323{
     324    // checking argument
     325    if ( tty_id >= NB_TTYS ) return 1;
     326
     327    // compute terminal base address
     328    unsigned int *tty_address = (unsigned int*)( (char*)&seg_tty_base +
     329                                (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
     330
     331    *buffer = (unsigned char)tty_address[tty_id*TTY_SPAN + TTY_READ];
     332    return 0;
    335333}
    336334
     
    359357    if ( proc_id    >= NB_PROCS_MAX )   return 1;
    360358
    361     unsigned int* icu_address = (unsigned int*)&seg_icu_base +
    362                                 (cluster_id * CLUSTER_SPAN);
     359    unsigned int* icu_address = (unsigned int*)( (char*)&seg_icu_base +
     360                                (cluster_id * (unsigned)CLUSTER_SIZE) );
    363361#if GIET_USE_XICU
    364362    if ( is_timer ) icu_address[XICU_REG(XICU_MSK_PTI_ENABLE, proc_id)] = value;
     
    385383    if ( proc_id    >= NB_PROCS_MAX )   return 1;
    386384
    387     unsigned int* icu_address = (unsigned int*)&seg_icu_base +
    388                                 (cluster_id * CLUSTER_SPAN);
     385    unsigned int* icu_address = (unsigned int*)( (char*)&seg_icu_base +
     386                                (cluster_id * (unsigned)CLUSTER_SIZE) );
    389387#if GIET_USE_XICU
    390388    unsigned int prio   = icu_address[XICU_REG(XICU_PRIO, proc_id)];
     
    422420                         unsigned int value)
    423421{
    424     volatile unsigned int *gcd_address;
    425 
    426422    // parameters checking
    427423    if (register_index >= GCD_END)
    428424        return 1;
    429425
    430     gcd_address = (unsigned int*)&seg_gcd_base;
     426    unsigned int* gcd_address = (unsigned int*)( (char*)&seg_gcd_base +
     427                                (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
    431428
    432429    gcd_address[register_index] = value; // write word
     
    441438                        unsigned int *buffer)
    442439{
    443     volatile unsigned int *gcd_address;
    444 
    445440    // parameters checking
    446441    if (register_index >= GCD_END)
    447442        return 1;
    448443
    449     gcd_address = (unsigned int*)&seg_gcd_base;
     444    unsigned int* gcd_address = (unsigned int*)( (char*)&seg_gcd_base +
     445                                (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
    450446
    451447    *buffer = gcd_address[register_index]; // read word
     
    538534    if ( (unsigned int)user_vaddr & 0x3 ) return 1;
    539535
    540     unsigned int*       ioc_address = (unsigned int*)&seg_ioc_base;
     536    unsigned int*       ioc_address = (unsigned int*)( (char*)&seg_ioc_base +
     537                                  (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
     538
    541539    unsigned int        block_size   = ioc_address[BLOCK_DEVICE_BLOCK_SIZE];
    542540    unsigned int        length       = count*block_size;
     
    630628    if ( GIET_IOMMU_ACTIVE )
    631629    {
    632         unsigned int* iob_address = (unsigned int*)&seg_iob_base;
     630        unsigned int* iob_address = (unsigned int*)( (char*)&seg_iob_base +
     631                                    (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
    633632
    634633        for ( ix2 = 0 ; ix2 < _ioc_iommu_npages ; ix2++ )
     
    687686                        (unsigned int)buffer,
    688687                        count );
     688}
     689///////////////////////////////////////////////////////////////////////////////
     690//     _ioc_get_status()
     691// This function returns the transfert status, and acknowledge the IRQ.
     692// Returns 0 if success, > 0 if error.
     693///////////////////////////////////////////////////////////////////////////////
     694unsigned int _ioc_get_status(unsigned int* status)
     695{
     696    // get IOC base address
     697    unsigned int* ioc_address = (unsigned int*)( (char*)&seg_ioc_base +
     698                                (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
     699
     700    *status = ioc_address[BLOCK_DEVICE_STATUS]; // read status & reset IRQ
     701    return 0;
    689702}
    690703
     
    718731in_unckdata unsigned int            _dma_iommu_npages[NB_DMAS_MAX * NB_CLUSTERS];
    719732#endif
     733
     734//////////////////////////////////////////////////////////////////////////////////
     735// _dma_reset_irq()
     736//////////////////////////////////////////////////////////////////////////////////
     737unsigned int _dma_reset_irq( unsigned int       cluster_id,
     738                             unsigned int       local_id )
     739{
     740    // parameters checking
     741    if ( cluster_id >= NB_CLUSTERS ) return 1;
     742    if ( local_id >= NB_DMAS_MAX )   return 1;
     743
     744    // compute DMA base address
     745    unsigned int*       dma_address = (unsigned int*)( (char*)&seg_dma_base +
     746                                  (cluster_id * (unsigned)CLUSTER_SIZE) );
     747
     748    dma_address[local_id*DMA_SPAN + DMA_RESET] = 0;                     
     749    return 0;
     750}
     751//////////////////////////////////////////////////////////////////////////////////
     752// _dma_get_status()
     753//////////////////////////////////////////////////////////////////////////////////
     754unsigned int _dma_get_status( unsigned int      cluster_id,
     755                              unsigned int      local_id,
     756                              unsigned int* status )
     757{
     758    // parameters checking
     759    if ( cluster_id >= NB_CLUSTERS ) return 1;
     760    if ( local_id >= NB_DMAS_MAX )   return 1;
     761
     762    // compute DMA base address
     763    unsigned int*       dma_address = (unsigned int*)( (char*)&seg_dma_base +
     764                                  (cluster_id * (unsigned)CLUSTER_SIZE) );
     765   
     766    *status = dma_address[local_id*DMA_SPAN + DMA_LEN];
     767    return 0;
     768}
    720769
    721770//////////////////////////////////////////////////////////////////////////////////
     
    819868    unsigned int    cluster_id = dma_id / NB_DMAS_MAX;
    820869    unsigned int    loc_id     = dma_id % NB_DMAS_MAX;
    821     unsigned int*       dma_base   = (unsigned int*)&seg_dma_base +
    822                                  (cluster_id * CLUSTER_SPAN) +
    823                                  (loc_id * DMA_SPAN);
    824 
     870
     871    unsigned int*       dma_base   = (unsigned int*)( (char*)&seg_dma_base +
     872                                 (cluster_id * (unsigned)CLUSTER_SIZE) );
     873 
    825874    // check user buffer address and length alignment
    826875    if ( (user_vaddr & 0x3) || (length & 0x3) )
     
    930979
    931980*/
     981
    932982    // invalidate data cache in case of memory write
    933983    if ( to_user ) _dcache_buf_invalidate( (void*)user_vaddr, length );
     
    939989    if ( to_user )
    940990    {
    941         dma_base[DMA_SRC] = (unsigned int)fb_pbase;
    942         dma_base[DMA_DST] = (unsigned int)user_pbase;
     991        dma_base[loc_id*DMA_SPAN + DMA_SRC] = (unsigned int)fb_pbase;
     992        dma_base[loc_id*DMA_SPAN + DMA_DST] = (unsigned int)user_pbase;
    943993    }
    944994    else
    945995    {
    946         dma_base[DMA_SRC] = (unsigned int)user_pbase;
    947         dma_base[DMA_DST] = (unsigned int)fb_pbase;
    948     }
    949     dma_base[DMA_LEN] = (unsigned int)length;
     996        dma_base[loc_id*DMA_SPAN + DMA_SRC] = (unsigned int)user_pbase;
     997        dma_base[loc_id*DMA_SPAN + DMA_DST] = (unsigned int)fb_pbase;
     998    }
     999    dma_base[loc_id*DMA_SPAN + DMA_LEN] = (unsigned int)length;
    9501000   
    9511001    return 0;
     
    10111061    if ( GIET_IOMMU_ACTIVE )
    10121062    {
    1013         unsigned int* iob_address = (unsigned int*)&seg_iob_base;
     1063        unsigned int* iob_address = (unsigned int*)( (char*)&seg_iob_base +
     1064                                    (CLUSTER_IO_ID * (unsigned)CLUSTER_SIZE) );
     1065
    10141066        unsigned int  ix1         = _dma_iommu_ix1 + dma_id;
    10151067        unsigned int  ix2;
  • soft/giet_vm/sys/drivers.h

    r203 r204  
    4040                            unsigned int        length);
    4141
    42 unsigned int _tty_read_irq( char*                       buffer,
    43                             unsigned int        length);
     42unsigned int _tty_get_char( unsigned int        tty_id,
     43                            char*                       buffer);
    4444
    4545///////////////////////////////////////////////////////////////////////////////////
     
    7777unsigned int _ioc_completed();
    7878
     79unsigned int _ioc_get_status( unsigned int* status);
     80
    7981///////////////////////////////////////////////////////////////////////////////////
    8082// Multi DMA variables                  (vci_multi_dma)
     
    8688extern unsigned int                             _dma_iommu_ix1;
    8789extern unsigned int                             _dma_iommu_npages[];
     90
     91unsigned int _dma_reset_irq( unsigned int       cluster_id,
     92                             unsigned int       local_id );
     93
     94unsigned int _dma_get_status( unsigned int      cluster_id,
     95                              unsigned int      local_id,
     96                              unsigned int*     status );
    8897
    8998///////////////////////////////////////////////////////////////////////////////////
  • soft/giet_vm/sys/irq_handler.c

    r203 r204  
    9292    // compute cluster_id and loc_id
    9393    unsigned int cluster_id = channel_id / NB_DMAS_MAX;
    94     unsigned int loc_id     = channel_id % NB_DMAS_MAX;
    95 
    96     // compute DMA channel address
    97     unsigned int*       dma_address = (unsigned int*)&seg_dma_base +
    98                                   (loc_id * DMA_SPAN) +
    99                                   (cluster_id * CLUSTER_SPAN);
     94    unsigned int local_id   = channel_id % NB_DMAS_MAX;
    10095
    10196    // save DMA channel status 
    102     _dma_status[channel_id] = dma_address[DMA_LEN];
    103 
    104     // reset DMA channel
    105     dma_address[DMA_RESET] = 0;                 
     97    if ( _dma_get_status(cluster_id, local_id, &_dma_status[channel_id]) )
     98    {
     99        _get_lock(&_tty_put_lock);
     100        _puts("[GIET ERROR] illegal DMA channel detected by _isr_dma\n");
     101        _release_lock(&_tty_put_lock);
     102        return;
     103    }
     104
     105    // reset DMA channel irq
     106    if ( _dma_reset_irq(cluster_id, local_id) )
     107    {
     108        _get_lock(&_tty_put_lock);
     109        _puts("[GIET ERROR] illegal DMA channel detected by _isr_dma\n");
     110        _release_lock(&_tty_put_lock);
     111        return;
     112    }
    106113
    107114    // release DMA channel
     
    117124void _isr_ioc()
    118125{
    119     unsigned int* ioc_address = (unsigned int*)&seg_ioc_base;
    120 
    121     _ioc_status = ioc_address[BLOCK_DEVICE_STATUS]; // save status & reset IRQ
    122     _ioc_done   = 1;                                // signals completion
     126     // save status & reset IRQ
     127    if ( _ioc_get_status( &_ioc_status ) )
     128    {
     129        _get_lock(&_tty_put_lock);
     130        _puts("[GIET ERROR] bad access to IOC status detected by _isr_ioc\n");
     131        _release_lock(&_tty_put_lock);
     132        return;
     133    }
     134
     135    // signals completion
     136    _ioc_done   = 1;
    123137}
    124138
     
    148162        _puts("[GIET ERROR] Strange... User timer ISR for a system timer\n");
    149163        _release_lock(&_tty_put_lock);
     164        return;
    150165    }
    151166
    152167    // aknowledge IRQ
    153     _timer_reset_irq( cluster_id, local_id );
     168    if ( _timer_reset_irq( cluster_id, local_id ) )
     169    {
     170        _get_lock(&_tty_put_lock);
     171        _puts("[GIET ERROR] illegal timer index detected by _isr_timer\n");
     172        _release_lock(&_tty_put_lock);
     173        return;
     174    }
    154175
    155176#if NB_TIMERS_MAX
     
    172193// This ISR handles the IRQs generated by the multi_tty controler,
    173194// signaling that a character is available.
    174 // There is one single multi_tty component controling all TTYs, and the tty_id
    175 // argument is the global TTY index.
     195// There is one single multi_tty component controling all TTYs,
     196// and the tty_id // argument is the global TTY index.
    176197// There is one communication buffer _tty_buf[tty_id] per terminal.
    177198// The sychronisation variable _tty_full[tty_id], is set by the ISR,
     
    181202void _isr_tty(unsigned int tty_id)
    182203{
    183     // compute terminal base address
    184     unsigned int *tty_address = (unsigned int*)&seg_tty_base + (tty_id * TTY_SPAN);
    185 
    186204    // save character and reset IRQ
    187     _tty_get_buf[tty_id] = (unsigned char)tty_address[TTY_READ];
     205    if ( _tty_get_char( tty_id, &_tty_get_buf[tty_id] ) )
     206    {
     207        _get_lock(&_tty_put_lock);
     208        _puts("[GIET ERROR] illegal tty index detected by _isr_tty\n");
     209        _release_lock(&_tty_put_lock);
     210        return;
     211    }
    188212
    189213    // signals character available
     
    207231
    208232    // acknowledge IRQ
    209     _timer_reset_irq( cluster_id, local_id );
     233    if ( _timer_reset_irq( cluster_id, local_id ) )
     234    {
     235        _get_lock(&_tty_put_lock);
     236        _puts("[GIET ERROR] illegal proc index detected by _isr_switch\n");
     237        _release_lock(&_tty_put_lock);
     238        return;
     239    }
    210240
    211241    // performs the context switch
  • soft/giet_vm/sys/sys_handler.c

    r203 r204  
    3232    &_sys_ukn,          /* 0x08 */
    3333    &_sys_ukn,          /* 0x09 */
    34     &_tty_read_irq,     /* 0x0A */
     34    &_sys_ukn,          /* 0x0A */
    3535    &_sys_ukn,          /* 0x0B */
    3636    &_sys_ukn,          /* 0x0C */
  • soft/giet_vm/xml/xml_driver.c

    r189 r204  
    218218    fprintf( fpout, "<?xml version = \"1.0\"?>\n\n");
    219219
    220     fprintf( fpout, "<mapping_info signature = \"0x%x\"\n", header->signature);
    221     fprintf( fpout, "              name      = \"%s\"\n", header->name);
    222     fprintf( fpout, "              clusters  = \"%d\"\n", header->clusters);
    223     fprintf( fpout, "              vspaces   = \"%d\"\n", header->vspaces);
    224     fprintf( fpout, "              globals   = \"%d\" >\n\n", header->globals);
     220    fprintf( fpout, "<mapping_info signature = \"0x%x\" ", header->signature);
     221    fprintf( fpout, " name = \"%s\" ", header->name);
     222    fprintf( fpout, " clusters = \"%d\" ", header->clusters);
     223    fprintf( fpout, " vspaces = \"%d\" >\n\n", header->vspaces);
    225224
    226225    ///////////////////// clusters ///////////////////////////////////////////////
     
    231230        fprintf( fpout, "        <cluster index  = \"%d\" >\n",   cluster_id);
    232231        for ( pseg_id = cluster[cluster_id].pseg_offset ;
    233                 pseg_id < cluster[cluster_id].pseg_offset + cluster[cluster_id].psegs ;
    234                     pseg_id++ )
    235         {
    236             fprintf( fpout, "                 <pseg    name   = \"%s\"\n",        pseg[pseg_id].name);
    237             fprintf( fpout, "                          type   = \"%s\"\n", pseg_type[pseg[pseg_id].type]);
    238             fprintf( fpout, "                          base   = \"0x%x\"\n",      pseg[pseg_id].base);
    239             fprintf( fpout, "                          length = \"0x%x\" />\n",   pseg[pseg_id].length);
     232              pseg_id < cluster[cluster_id].pseg_offset + cluster[cluster_id].psegs ;
     233              pseg_id++ )
     234        {
     235            fprintf( fpout, "            <pseg name = \"%s\" ", pseg[pseg_id].name);
     236            fprintf( fpout, " type = \"%s\" ", pseg_type[pseg[pseg_id].type]);
     237            fprintf( fpout, " base = \"0x%x\" ", pseg[pseg_id].base);
     238            fprintf( fpout, " length = \"0x%x\" />\n",   pseg[pseg_id].length);
    240239        }
    241240
     
    243242
    244243        for ( proc_id = cluster[cluster_id].proc_offset ;
    245                 proc_id < cluster[cluster_id].proc_offset + cluster[cluster_id].procs ;
    246                     proc_id++ )
    247         {
    248             fprintf( fpout, "                   <proc index   = \"%d\" >\n",       proc_id);
    249             for ( irq_id = proc[proc_id].irq_offset ; irq_id < proc[proc_id].irq_offset + proc[proc_id].irqs ; irq_id++ )
     244              proc_id < cluster[cluster_id].proc_offset + cluster[cluster_id].procs ;
     245              proc_id++ )
     246        {
     247            fprintf( fpout, "            <proc index = \"%d\" >\n", proc_id);
     248            for ( irq_id = proc[proc_id].irq_offset ;
     249                  irq_id < proc[proc_id].irq_offset + proc[proc_id].irqs ;
     250                  irq_id++ )
    250251            {
    251                 fprintf( fpout, "                         <irq    type    = \"%s\"\n", irq_type[irq[irq_id].type]);
    252                 fprintf( fpout, "                                 icuid   = \"0x%x\"\n",      irq[irq_id].icuid);
    253                 fprintf( fpout, "                                 isr     = \"%s\"\n", isr_type[irq[irq_id].isr]);
    254                 fprintf( fpout, "                                 channel = \"0x%x\" />\n",  irq[irq_id].channel);
     252                fprintf( fpout, "                <irq type = \"%s\" ", irq_type[irq[irq_id].type]);
     253                fprintf( fpout, " icuid = \"0x%x\" ", irq[irq_id].icuid);
     254                fprintf( fpout, " isr = \"%s\" ", isr_type[irq[irq_id].isr]);
     255                fprintf( fpout, " channel = \"0x%x\" />\n", irq[irq_id].channel);
    255256            }
    256             fprintf( fpout, "                   </proc>\n" );
     257            fprintf( fpout, "            </proc>\n" );
    257258        }
    258259
     
    261262
    262263        for ( coproc_id = cluster[cluster_id].coproc_offset ;
    263                 coproc_id < cluster[cluster_id].coproc_offset + cluster[cluster_id].coprocs ;
    264                     coproc_id++ )
    265         {
    266             fprintf( fpout, "                   <coproc name       = \"%s\"\n",       coproc[coproc_id].name);
    267             fprintf( fpout, "                           psegname   = \"%s\" >\n",       pseg[coproc[coproc_id].psegid].name);
    268             for ( port_id = coproc[coproc_id].port_offset ; port_id < coproc[coproc_id].port_offset + coproc[coproc_id].ports ; port_id++ )
     264              coproc_id < cluster[cluster_id].coproc_offset + cluster[cluster_id].coprocs ;
     265              coproc_id++ )
     266        {
     267            fprintf( fpout, "            <coproc name = \"%s\" ", coproc[coproc_id].name);
     268            fprintf( fpout, " psegname = \"%s\" >\n", pseg[coproc[coproc_id].psegid].name);
     269            for ( port_id = coproc[coproc_id].port_offset ;
     270                  port_id < coproc[coproc_id].port_offset + coproc[coproc_id].ports ;
     271                  port_id++ )
    269272            {
    270273                unsigned int vobj_id = cp_port[port_id].vobjlocid + vspace[cp_port[port_id].vspaceid].vobj_offset;
    271                 fprintf( fpout, "                           <port   direction    = \"%s\"\n",  port_direction[ cp_port[port_id].direction]);
    272                 fprintf( fpout, "                                   vspacename   = \"%s\"\n", vspace[cp_port[port_id].vspaceid].name);
    273                 fprintf( fpout, "                                   vobjname    = \"%s\" />\n",  vobj[vobj_id].name);
     274                fprintf( fpout, "             <port direction = \"%s\" ",  port_direction[ cp_port[port_id].direction]);
     275                fprintf( fpout, " vspacename = \"%s\" ", vspace[cp_port[port_id].vspaceid].name);
     276                fprintf( fpout, " vobjname = \"%s\" />\n",  vobj[vobj_id].name);
    274277            }
    275             fprintf( fpout, "                   </coproc>\n" );
     278            fprintf( fpout, "            </coproc>\n" );
    276279        }
    277280
     
    279282
    280283        for ( periph_id = cluster[cluster_id].periph_offset ;
    281                 periph_id < cluster[cluster_id].periph_offset + cluster[cluster_id].periphs ;
    282                     periph_id++ )
    283         {
    284             fprintf( fpout, "                   <periph type       = \"%s\"\n",    periph_type[periph[periph_id].type]);
    285             fprintf( fpout, "                           psegname   = \"%s\"\n",    pseg[periph[periph_id].psegid].name);
    286             fprintf( fpout, "                           channels  = \"%d\" />\n",  periph[periph_id].channels);
     284              periph_id < cluster[cluster_id].periph_offset + cluster[cluster_id].periphs ;
     285              periph_id++ )
     286        {
     287            fprintf( fpout, "            <periph type = \"%s\" ", periph_type[periph[periph_id].type]);
     288            fprintf( fpout, " psegname = \"%s\" ", pseg[periph[periph_id].psegid].name);
     289            fprintf( fpout, " channels = \"%d\" />\n",  periph[periph_id].channels);
    287290        }
    288291        fprintf( fpout, "        </cluster>\n" );
     
    297300        unsigned int pseg_id = vseg[vseg_id].psegid;
    298301
    299         fprintf( fpout, "        <vseg    name      = \"%s\"\n",      vseg[vseg_id].name);
    300         fprintf( fpout, "                 vbase     = \"0x%x\"\n",    vseg[vseg_id].vbase);
    301         fprintf( fpout, "                 mode      = \"%s\"\n", mode_str[vseg[vseg_id].mode]);
    302         fprintf( fpout, "                 clusterid = \"%d\"\n",      pseg[pseg_id].cluster);
    303         fprintf( fpout, "                 psegname  = \"%s\"\n",      pseg[pseg_id].name);
    304         fprintf( fpout, "                 ident     = \"%d\" >\n",    vseg[vseg_id].ident);
     302        fprintf( fpout, "        <vseg name = \"%s\" ", vseg[vseg_id].name);
     303        fprintf( fpout, "vbase = \"0x%x\" ", vseg[vseg_id].vbase);
     304        fprintf( fpout, "mode  = \"%s\" ", mode_str[vseg[vseg_id].mode]);
     305        fprintf( fpout, "clusterid = \"%d\" ", pseg[pseg_id].cluster);
     306        fprintf( fpout, "psegname = \"%s\" ", pseg[pseg_id].name);
     307        fprintf( fpout, "ident = \"%d\" >\n", vseg[vseg_id].ident);
    305308        for ( vobj_id = vseg[vseg_id].vobj_offset;
    306309              vobj_id < (vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs);
    307310              vobj_id++ )
    308311        {
    309             fprintf( fpout, "                 <vobj name     = \"%s\"\n",    vobj[vobj_id].name);
    310             fprintf( fpout, "                       type     = \"%s\"\n",    vobj_type[vobj[vobj_id].type]);
    311             fprintf( fpout, "                       length   = \"0x%x\"\n", vobj[vobj_id].length);
    312             fprintf( fpout, "                       align    = \"%d\"\n",    vobj[vobj_id].align);
    313             fprintf( fpout, "                       init     = \"%d\" \n",  vobj[vobj_id].init);
    314             fprintf( fpout, "                       binpath = \"%s\" />\n", vobj[vobj_id].binpath);
     312            fprintf( fpout, "            <vobj name = \"%s\" ", vobj[vobj_id].name);
     313            fprintf( fpout, "type = \"%s\" ", vobj_type[vobj[vobj_id].type]);
     314            fprintf( fpout, "length = \"0x%x\" ", vobj[vobj_id].length);
     315            fprintf( fpout, "align = \"%d\" ", vobj[vobj_id].align);
     316            fprintf( fpout, "init = \"%d\" ", vobj[vobj_id].init);
     317            fprintf( fpout, "binpath = \"%s\" />\n", vobj[vobj_id].binpath);
    315318        }
    316319        fprintf( fpout, "        </vseg>\n");
     
    324327    {
    325328        unsigned int func_id = vspace[vspace_id].vobj_offset + vspace[vspace_id].start_offset;
    326         fprintf( fpout, "        <vspace  name      = \"%s\"\n",    vspace[vspace_id].name);
    327         fprintf( fpout, "                 startname = \"%s\" >\n\n", vobj[func_id].name);
     329        fprintf( fpout, "        <vspace name = \"%s\" ", vspace[vspace_id].name);
     330        fprintf( fpout, " startname = \"%s\" >\n", vobj[func_id].name);
    328331
    329332        for ( vseg_id = vspace[vspace_id].vseg_offset ;
    330               vseg_id < (vspace[vspace_id].vseg_offset + vspace[vspace_id].vsegs) ; vseg_id++ )
     333              vseg_id < (vspace[vspace_id].vseg_offset + vspace[vspace_id].vsegs) ;
     334              vseg_id++ )
    331335        {
    332336            unsigned int pseg_id = vseg[vseg_id].psegid;
    333337
    334             fprintf( fpout, "                 <vseg name      = \"%s\"\n",      vseg[vseg_id].name);
    335             fprintf( fpout, "                       vbase     = \"0x%x\"\n",    vseg[vseg_id].vbase);
    336             fprintf( fpout, "                       mode      = \"%s\"\n", mode_str[vseg[vseg_id].mode]);
    337             fprintf( fpout, "                       clusterid = \"%d\"\n",      pseg[pseg_id].cluster);
    338             fprintf( fpout, "                       psegname  = \"%s\"\n",      pseg[pseg_id].name);
    339             fprintf( fpout, "                       ident     = \"%d\" >\n",    vseg[vseg_id].ident);
     338            fprintf( fpout, "            <vseg name = \"%s\" ", vseg[vseg_id].name);
     339            fprintf( fpout, "vbase = \"0x%x\" ", vseg[vseg_id].vbase);
     340            fprintf( fpout, "mode  = \"%s\" ", mode_str[vseg[vseg_id].mode]);
     341            fprintf( fpout, "clusterid = \"%d\" ", pseg[pseg_id].cluster);
     342            fprintf( fpout, "psegname = \"%s\" ", pseg[pseg_id].name);
     343            fprintf( fpout, "ident = \"%d\" >\n", vseg[vseg_id].ident);
    340344
    341345            for ( vobj_id = vseg[vseg_id].vobj_offset ;
     
    343347                  vobj_id++ )
    344348            {
    345                 fprintf( fpout, "                       <vobj name     = \"%s\"\n",    vobj[vobj_id].name);
    346                 fprintf( fpout, "                             type     = \"%s\" \n",  vobj_type[vobj[vobj_id].type]);
    347                 fprintf( fpout, "                             length   = \"0x%x\" \n", vobj[vobj_id].length);
    348                 fprintf( fpout, "                             align    = \"%d\" \n",  vobj[vobj_id].align);
    349                 fprintf( fpout, "                             init     = \"%d\" \n",  vobj[vobj_id].init);
    350                 fprintf( fpout, "                             binpath = \"%s\" />\n", vobj[vobj_id].binpath);
     349                fprintf( fpout, "             <vobj name = \"%s\" ", vobj[vobj_id].name);
     350                fprintf( fpout, "type = \"%s\" ", vobj_type[vobj[vobj_id].type]);
     351                fprintf( fpout, "length = \"0x%x\" ", vobj[vobj_id].length);
     352                fprintf( fpout, "align = \"%d\" ", vobj[vobj_id].align);
     353                fprintf( fpout, "init = \"%d\" ", vobj[vobj_id].init);
     354                fprintf( fpout, "binpath = \"%s\" />\n", vobj[vobj_id].binpath);
    351355            }
    352             fprintf( fpout, "                 </vseg>\n");
     356            fprintf( fpout, "            </vseg>\n\n");
    353357        }
    354358        for ( task_id = vspace[vspace_id].task_offset ;
     
    358362            unsigned int vobj_id = task[task_id].vobjlocid + vspace[vspace_id].vobj_offset;
    359363
    360             fprintf( fpout, "                 <task name      = \"%s\"\n",      task[task_id].name);
    361             fprintf( fpout, "                       clusterid = \"%d\"\n",      task[task_id].clusterid);
    362             fprintf( fpout, "                       proclocid = \"%d\"\n",      task[task_id].proclocid);
    363             fprintf( fpout, "                       stackname = \"%s\"\n",      vobj[vobj_id].name);
    364             fprintf( fpout, "                       startid   = \"%d\"\n",      task[task_id].startid);
    365             fprintf( fpout, "                       usetty    = \"%d\"\n",      task[task_id].use_tty);
    366             fprintf( fpout, "                       usenic    = \"%d\"\n",      task[task_id].use_nic);
    367             fprintf( fpout, "                       usetimer  = \"%d\"\n",      task[task_id].use_timer);
    368             fprintf( fpout, "                       usefbma   = \"%d\" />\n\n", task[task_id].use_fbdma);
     364            fprintf( fpout, "            <task name = \"%s\" ", task[task_id].name);
     365            fprintf( fpout, "clusterid = \"%d\" ", task[task_id].clusterid);
     366            fprintf( fpout, "proclocid = \"%d\" ", task[task_id].proclocid);
     367            fprintf( fpout, "stackname = \"%s\" ", vobj[vobj_id].name);
     368            fprintf( fpout, "startid = \"%d\" ", task[task_id].startid);
     369            fprintf( fpout, "usetty = \"%d\" ", task[task_id].use_tty);
     370            fprintf( fpout, "usenic = \"%d\" ", task[task_id].use_nic);
     371            fprintf( fpout, "usetimer = \"%d\" ", task[task_id].use_timer);
     372            fprintf( fpout, "usefbma = \"%d\" />\n", task[task_id].use_fbdma);
    369373        }
    370374        fprintf( fpout, "        </vspace>\n\n");
  • soft/giet_vm/xml/xml_parser.c

    r203 r204  
    15651565        else if ( strcmp(tag, "globalset") == 0 )
    15661566        {
    1567             // checking source file consistency
    1568             if ( vseg_index != header->globals )
    1569             {
    1570                 printf("[XML ERROR] Wrong number of global vsegs\n");
    1571                 exit(1);
    1572             }
    1573             else
    1574             {
    15751567#if XML_PARSER_DEBUG
    15761568printf("  end global set\n\n");
    15771569#endif
    1578                 vseg_loc_index = 0;
    1579                 return;
    1580             }
     1570            header->globals = vseg_index;
     1571            vseg_loc_index = 0;
     1572            return;
    15811573        }
    15821574        else
     
    17031695    }
    17041696
    1705     ////////// get globals attribute
    1706     value = getIntValue(reader, "globals", &ok);
    1707     if ( ok )
    1708     {
    1709         if ( value >= MAX_VSEGS )
    1710         {
    1711             printf("[XML ERROR] The number of globals is larger than %d\n", MAX_VSEGS);
    1712             exit(1);
    1713         }
    1714 #if XML_PARSER_DEBUG
    1715 printf("  globals = %d\n", value);
    1716 #endif
    1717         header->globals  = value;
    1718     }
    1719     else
    1720     {
    1721         printf("[XML ERROR] illegal or missing <globals> attribute in mapping_info_header\n");
    1722         exit(1);
    1723     }
    1724 
    17251697    //////// initialise non replicated peripherals cluster_id
    17261698    header->tty_clusterid = 0xFFFFFFFF;
Note: See TracChangeset for help on using the changeset viewer.