Changeset b6b576c in mainline


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)

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/src/boot/boot.S

    r8dfef11 rb6b576c  
    173173               
    174174                mods_invalid:
    175                 movq %rcx, init_size
    176                 movq %rdx, init_addr
     175#               movq %rcx, init_size
     176#               movq %rdx, init_addr
    177177               
    178178                bt $6, %eax                                                             # mbi->flags[6] (mmap_length, mmap_addr valid) 
  • arch/ia32/src/boot/boot.S

    r8dfef11 rb6b576c  
    100100                movl %ecx, e801memorysize
    101101               
    102                 bt $3, %eax                                                             # mbi->flags[3] (mods_count, mods_addr valid)   
     102                bt $3, %eax                                                             # mbi->flags[3] (mods_count, mods_addr valid)
    103103                jc mods_valid
    104104                       
    105105                        xorl %ecx, %ecx
    106                         xorl %edx, %edx
    107                         jmp mods_invalid
     106                        movl %ecx, init
     107                        jmp mods_end
    108108               
    109109                mods_valid:
     110               
    110111                movl 20(%ebx), %ecx                                             # mbi->mods_count
     112                movl %ecx, init
     113               
    111114                cmpl $0, %ecx
    112                 je mods_invalid
     115                je mods_end
    113116               
    114117                movl 24(%ebx), %esi                                             # mbi->mods_addr
    115                 movl 0(%esi), %edx                                              # mods->mod_start
    116                 movl 4(%esi), %ecx                                              # mods->mod_end
    117                 subl %edx, %ecx
    118                 addl $0x80000000, %edx
    119                
    120                 mods_invalid:
    121                 movl %ecx, init_size
    122                 movl %edx, init_addr
     118                movl $init, %edi
     119               
     120                mods_loop:
     121               
     122                        movl 0(%esi), %edx                                      # mods->mod_start
     123                        addl $0x80000000, %edx
     124                        movl %edx, 4(%edi)
     125                       
     126                        movl 4(%esi), %edx
     127                        subl 0(%esi), %edx                                      # mods->mod_end - mods->mod_start
     128                        movl %edx, 8(%edi)
     129                       
     130                        addl $16, %esi
     131                        addl $8 , %edi
     132                       
     133                        loop mods_loop
     134                       
     135                mods_end:
    123136               
    124137                bt $6, %eax                                                             # mbi->flags[6] (mmap_length, mmap_addr valid) 
  • arch/mips32/src/mips32.c

    r8dfef11 rb6b576c  
    9494        console_init();
    9595        debugger_init();
    96         /* Setup usermode...*/
    97         config.init_addr = INIT_ADDRESS;
    98         config.init_size = INIT_SIZE;
     96       
     97        /* Setup usermode */
     98        init.cnt = 1;
     99        init.tasks[0].addr = INIT_ADDRESS;
     100        init.tasks[0].size = INIT_SIZE;
    99101}
    100102
  • generic/include/config.h

    r8dfef11 rb6b576c  
    3636#define STACK_SIZE              PAGE_SIZE
    3737
    38 #define CONFIG_MEMORY_SIZE      (8*1024*1024)
     38#define CONFIG_MEMORY_SIZE      (8 * 1024 * 1024)
    3939#define CONFIG_STACK_SIZE       STACK_SIZE
     40#define CONFIG_INIT_TASKS       32
    4041
    41 struct config {
     42typedef struct {
     43        __address addr;
     44        size_t size;
     45} init_task_t;
     46
     47typedef struct {
     48        count_t cnt;
     49        init_task_t tasks[CONFIG_INIT_TASKS];
     50} init_t;
     51
     52typedef struct {
    4253        count_t cpu_count;
    4354        volatile count_t cpu_active;
     
    4556        __address base;
    4657        size_t memory_size;
    47        
    48         __address init_addr;
    49         size_t init_size;
    50        
    5158        size_t kernel_size;           /**< Size of memory in bytes taken by kernel and stack */
    52 };
     59} config_t;
    5360
    5461extern config_t config;
     62extern init_t init;
    5563
    5664#endif
  • generic/include/typedefs.h

    r8dfef11 rb6b576c  
    4141typedef unsigned long long task_id_t;
    4242
    43 typedef struct config config_t;
    4443typedef struct cpu_info cpu_info_t;
    4544
  • 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.