Changeset b6b576c in mainline for generic/src


Ignore:
Timestamp:
2006-03-16T11:34:51Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d764ddc
Parents:
8dfef11
Message:

support for more init tasks
(might break some archs yet)

Location:
generic/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • generic/src/main/kinit.c

    r8dfef11 rb6b576c  
    133133
    134134        interrupts_enable();
    135 
    136         if (config.init_size > 0) {
     135       
     136        count_t i;
     137        for (i = 0; i < init.cnt; i++) {
    137138                /*
    138                  * Create the first user task.
     139                 * Run user tasks.
    139140                 */
    140141               
    141                 if (config.init_addr % FRAME_SIZE)
    142                         panic("config.init_addr is not frame aligned");
     142                if (init.tasks[i].addr % FRAME_SIZE)
     143                        panic("init[%d].addr is not frame aligned", i);
    143144
    144                 utask = task_run_program((void *)config.init_addr);
     145                utask = task_run_program((void *) init.tasks[i].addr);
    145146                if (utask)
    146147                        ipc_phone_0 = &utask->answerbox;
  • generic/src/main/main.c

    r8dfef11 rb6b576c  
    6464
    6565config_t config;        /**< Global configuration structure. */
     66init_t init = {0};  /**< Initial user-space tasks */
    6667
    6768context_t ctx;
     
    7576size_t hardcoded_ktext_size = 0;
    7677size_t hardcoded_kdata_size = 0;
    77 
    78 __address init_addr = 0;
    79 size_t init_size = 0;
    8078
    8179void main_bsp(void);
     
    111109        config.base = hardcoded_load_address;
    112110        config.memory_size = get_memory_size();
    113         config.init_addr = init_addr;
    114         config.init_size = init_size;
    115111       
    116112        config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE);
    117113        stackaddr = config.base + config.kernel_size;
     114       
    118115        /* Avoid placing kernel on top of init */
    119         if (overlaps(stackaddr,CONFIG_STACK_SIZE,
    120                      config.init_addr, config.init_size)) {
    121                
    122                 stackaddr = ALIGN_UP(config.init_addr+config.init_size,
    123                                      CONFIG_STACK_SIZE);
    124                 config.init_size = ALIGN_UP(config.init_size,CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE;
    125         } else {
     116        count_t i;
     117        bool overlap = false;
     118        for (i = 0; i < init.cnt; i++)
     119                if (overlaps(stackaddr, CONFIG_STACK_SIZE, init.tasks[i].addr, init.tasks[i].size)) {
     120                        stackaddr = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, CONFIG_STACK_SIZE);
     121                        init.tasks[i].size = ALIGN_UP(init.tasks[i].size, CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE;
     122                        overlap = true;
     123                }
     124       
     125        if (!overlap)
    126126                config.kernel_size += CONFIG_STACK_SIZE;
    127         }
    128127       
    129128        context_save(&ctx);
     
    152151         */
    153152        kconsole_init();
    154 
     153       
    155154        /*
    156155         * Exception handler initialization, before architecture
     
    190189        thread_init();
    191190       
    192         if (config.init_size > 0)
    193                 printf("config.init_addr=%P, config.init_size=%d\n", config.init_addr, config.init_size);
     191        count_t i;
     192        for (i = 0; i < init.cnt; i++)
     193                printf("init[%d].addr=%P, init[%d].size=%d\n", i, init.tasks[i].addr, i, init.tasks[i].size);
    194194       
    195195        ipc_init();
  • generic/src/mm/frame.c

    r8dfef11 rb6b576c  
    135135        spinlock_lock(&zones.lock);
    136136        /* Try to merge */
    137         if (zones.count+1 == ZONES_MAX)
     137        if (zones.count + 1 == ZONES_MAX)
    138138                panic("Maximum zone(%d) count exceeded.", ZONES_MAX);
    139         for (i=0; i < zones.count; i++) {
     139        for (i = 0; i < zones.count; i++) {
    140140                /* Check for overflow */
    141141                z = zones.info[i];
     
    149149        }
    150150        /* Move other zones up */
    151         for (j=i;j < zones.count;j++)
    152                 zones.info[j+1] = zones.info[j];
     151        for (j = i;j < zones.count; j++)
     152                zones.info[j + 1] = zones.info[j];
    153153        zones.info[i] = newzone;
    154154        zones.count++;
     
    690690        /* Replace existing zones in zoneinfo list */
    691691        zones.info[z1] = newzone;
    692         for (i=z2+1;i < zones.count;i++)
    693                 zones.info[i-1] = zones.info[i];
     692        for (i = z2 + 1; i < zones.count; i++)
     693                zones.info[i - 1] = zones.info[i];
    694694        zones.count--;
    695695
     
    809809        confcount = SIZE2FRAMES(zone_conf_size(count));
    810810        if (confframe >= start && confframe < start+count) {
    811                 for (;confframe < start+count;confframe++) {
     811                for (;confframe < start + count; confframe++) {
    812812                        addr = PFN2ADDR(confframe);
    813                         if (overlaps(addr, PFN2ADDR(confcount),
    814                                      KA2PA(config.base),config.kernel_size))
     813                        if (overlaps(addr, PFN2ADDR(confcount), KA2PA(config.base), config.kernel_size))
    815814                                continue;
    816                         if (config.init_addr)
    817                                 if (overlaps(addr,PFN2ADDR(confcount),
    818                                              KA2PA(config.init_addr),
    819                                              config.init_size))
    820                                         continue;
     815                       
     816                        bool overlap = false;
     817                        count_t i;
     818                        for (i = 0; i < init.cnt; i++)
     819                                if (overlaps(addr, PFN2ADDR(confcount), KA2PA(init.tasks[i].addr), init.tasks[i].size)) {
     820                                        overlap = true;
     821                                        break;
     822                                }
     823                        if (overlap)
     824                                continue;
     825                       
    821826                        break;
    822827                }
    823                 if (confframe >= start+count)
     828                if (confframe >= start + count)
    824829                        panic("Cannot find configuration data for zone.");
    825830        }
     
    990995                pfn_t lastframe = ADDR2PFN(KA2PA(config.base+config.kernel_size));
    991996                frame_mark_unavailable(firstframe,lastframe-firstframe+1);
    992                 if (config.init_size > 0)
    993                         frame_mark_unavailable(ADDR2PFN(KA2PA(config.init_addr)),
    994                                                SIZE2FRAMES(config.init_size));
     997               
     998                count_t i;
     999                for (i = 0; i < init.cnt; i++)
     1000                        frame_mark_unavailable(ADDR2PFN(KA2PA(init.tasks[i].addr)), SIZE2FRAMES(init.tasks[i].size));
    9951001        }
    9961002}
     
    10101016        printf("#  Base address\tFree Frames\tBusy Frames\n");
    10111017        printf("   ------------\t-----------\t-----------\n");
    1012         for (i=0;i<zones.count;i++) {
     1018        for (i = 0; i < zones.count; i++) {
    10131019                zone = zones.info[i];
    10141020                spinlock_lock(&zone->lock);
     
    10331039        spinlock_lock(&zones.lock);
    10341040
    1035         for (i=0;i < zones.count; i++) {
     1041        for (i = 0; i < zones.count; i++) {
    10361042                if (i == num || PFN2ADDR(zones.info[i]->base) == num) {
    10371043                        zone = zones.info[i];
Note: See TracChangeset for help on using the changeset viewer.