| [1] | 1 | 1-Event Manager: | 
|---|
 | 2 | The even manager has been changed in the fallowing ways : | 
|---|
 | 3 |         - the API has been changed to avoid given a pointer to the second argumern to event_send we give only the  | 
|---|
 | 4 |         the gpid of the target processor. | 
|---|
 | 5 |         - local event handling is gloablly the same | 
|---|
 | 6 |         - remote event has been changed. Must be carrefully handled with physical access: | 
|---|
 | 7 |                 - the kfifo of the remote cpu is physically accessed | 
|---|
 | 8 |                 - the event_notifier must notify after copying the event structure (on the stack ?).  | 
|---|
 | 9 |                         !!! This does not aplying that the pointer arguments are copied !!!  | 
|---|
 | 10 |                         => modify event handler | 
|---|
 | 11 |  | 
|---|
 | 12 | 3-Processes/Thread Management | 
|---|
 | 13 |  | 
|---|
 | 14 |         3.1) Task Management | 
|---|
 | 15 |  | 
|---|
 | 16 |                 There's one gloabal table that index all process by pid. | 
|---|
 | 17 |                 Replicaing the kernel will also replicate this structure... | 
|---|
 | 18 |                 The fatest way to corrdinate the replica :  | 
|---|
 | 19 |                         - Consiste of using the table of cluster 0 as the main table. Each table will contain | 
|---|
 | 20 |                         a pointer to the task structure if the task is local, other ways the table entry is  | 
|---|
 | 21 |                         either marked and contains the cluster id wich handle the task or a NULL value.  | 
|---|
 | 22 |                         A NULL value at the main table mean that the entry has not been allocated. | 
|---|
 | 23 |                         A NULL value in other table must be confirmed by cheching the main table. | 
|---|
 | 24 |  | 
|---|
 | 25 |                         This imply a change in pid allocate, wich must allocate from the main table by setting | 
|---|
 | 26 |                         the cluster id and marking the entry with a remote flag (0x1). // TODO more on synch | 
|---|
 | 27 |                  | 
|---|
 | 28 |                         The lookup need to check for the task in local, if we find a task address we return' it.  | 
|---|
 | 29 |                         If we find a remote entry we go to the indicate cluster. If the remote cluster does not contain  | 
|---|
 | 30 |                         the address of the task ... | 
|---|
 | 31 |  | 
|---|
 | 32 |  | 
|---|
 | 33 |                 Excuse me!  the fastest way is to directly use the main table as the only table and ignore other tables!!! | 
|---|
 | 34 |                 This will require putting a physical addresse on the table to point to task structures and synchronised  | 
|---|
 | 35 |                 with a lock. | 
|---|
 | 36 |  | 
|---|
 | 37 |         3.2)Task descriptor | 
|---|
 | 38 |  | 
|---|
 | 39 |         This structure contain the following structures that are shared between threads: | 
|---|
 | 40 |                 - vmm (Virtual Memory Manager) : see 2-. | 
|---|
 | 41 |                 - pointer to root/cwd file, fdinfo and binary file: use physical addresses | 
|---|
 | 42 |                 - pointer to task parent: use a parent cluster id field, or directly a physical addresse ? | 
|---|
 | 43 |                 - 2 list : one for the children and one for the siblings | 
|---|
 | 44 |                 - a signal manager (NULL par default ?) | 
|---|
 | 45 |                 - thread handling structures :  | 
|---|
 | 46 |                         - a table containing a reference to all the threads (and a pointer to it's page struct) | 
|---|
 | 47 |                         - a list entry root that englobe all thread: not really used, can be deleted | 
|---|
 | 48 |                  | 
|---|
 | 49 |         How to manipulate these fields ? => by message passing ? | 
|---|
 | 50 |         for thread's pointer we directly placed the ppn: thread's structures are aligned on a page. | 
|---|
 | 51 |         Other pointers fd_info, bin are to locals strutures. | 
|---|
 | 52 |         vmm handling is local if a single threaded task, otherwise the handling is done by message passing. | 
|---|
 | 53 |  | 
|---|
 | 54 |         3.3) Thread Management | 
|---|
 | 55 |         In the second stage... | 
|---|
 | 56 |          | 
|---|
 | 57 |                  | 
|---|
 | 58 |                  | 
|---|
 | 59 | 2-Memory Management: | 
|---|
 | 60 |         vmm: message passing to the processor that contain the main structure.  | 
|---|
 | 61 |         There is no need to acess the thread data except for statistique pupose! | 
|---|
 | 62 |         There is a part that could be done by the thread with passing a message... look in the page table part | 
|---|
 | 63 |  | 
|---|
 | 64 |         To think : page fault at the same addresses how to avoid them (merge the messages of page fault) ? | 
|---|
 | 65 |  | 
|---|
 | 66 |         kmem: all remote allocation are forbiden except for user pages (at least for now). | 
|---|
 | 67 |         (user remote allocation have been done in the second stage.) | 
|---|
 | 68 |  | 
|---|
 | 69 |  | 
|---|
 | 70 | 3-Cluster Manager: | 
|---|
 | 71 |         One cluster manager for each cluster: no need for the global table...no need for the replication of cluster addresses | 
|---|
 | 72 |         ...no needs for procs base addresses: the cpu_s are directly put into the cluster structures with the cluster base  | 
|---|
 | 73 |         address the compiler will offset to the good addresse. | 
|---|
 | 74 |  | 
|---|
 | 75 |  | 
|---|
 | 76 | 3-DQDT: | 
|---|
 | 77 |         initialisation has been modified to not require the remote allocation API. We set a table of two dqdt in the  | 
|---|
 | 78 |  | 
|---|
 | 79 |  | 
|---|
 | 80 |  | 
|---|
 | 81 | 4-Drivers | 
|---|
 | 82 |  | 
|---|
 | 83 |  | 
|---|
 | 84 |  | 
|---|
 | 85 |  | 
|---|
 | 86 | 5-Boot: | 
|---|
 | 87 |         A) The main proc of the boot cluster enter the boot loader, initiliase the stack bases for | 
|---|
 | 88 |         all other procs in the boot_tbl and wait for all other proc to copy the needed info (kernel, boot, | 
|---|
 | 89 |         boot info) from the boot cluster. | 
|---|
 | 90 |  | 
|---|
 | 91 |         B) All other procs enter the boot_loader allocate a stack a the end of the cluster ram and | 
|---|
 | 92 |         wait for their cluster to be initilised by their main proc. (except for those of the boot cluster ?) | 
|---|
 | 93 |  | 
|---|
 | 94 |         C) The main procs of other clusters enter the boot loader, set the sp register to point to | 
|---|
 | 95 |         the stack at the end of the current cluster ram.  | 
|---|
 | 96 |         (Enter the C code and) Copy the kernel/boot/boot_info from the main cluster to their cluster | 
|---|
 | 97 |         increment a value  and sleep  back (wait instruction). | 
|---|
 | 98 |  | 
|---|
 | 99 |         D) All procs sleep after incrementing a counter in the in the original BI (boot cluster). | 
|---|
 | 100 |  | 
|---|
 | 101 |         E) Once the counter reach the number of proc, the main proc of the boot cluster can then | 
|---|
 | 102 |         copy the kernel/boot/boot_info in the same cluster but at the correct adresses. This will erase the | 
|---|
 | 103 |         code of the preloader. (the sp pointer of the boot cluster is good, the preloader should set it to | 
|---|
 | 104 |         point | 
|---|
 | 105 |  | 
|---|
 | 106 |         !!! moving the boot code is dangerous, since we are currently executing it ... and the | 
|---|
 | 107 |         addreses in it are fixed ?!!! If we really want this space, we need to give up at this stage on the | 
|---|
 | 108 |         boot code, BI can be kept. | 
|---|
 | 109 |          | 
|---|
 | 110 |         *********************************************************************************************************** | 
|---|
 | 111 |         Initital memory content at boot (TODO): | 
|---|
 | 112 |  | 
|---|
 | 113 |         ------------------ 0x0000 0000 | 
|---|
 | 114 |         Preloader | 
|---|
 | 115 |         ------------------ ENDPRELOADER | 
|---|
 | 116 |         Kernel | 
|---|
 | 117 |         ------------------ END kernel paddr (important here, the charging addresse (paddr) is differente than vaddr) | 
|---|
 | 118 |         BI | 
|---|
 | 119 |         ------------------ | 
|---|
 | 120 |         Boot code | 
|---|
 | 121 |         ------------------ End of boot | 
|---|
 | 122 |         ..... | 
|---|
 | 123 |         ------------------ end of cluster space - 4 boot stacks | 
|---|
 | 124 |         Boot stacks (x nbproc) | 
|---|
 | 125 |         ----------------- End of cluster space | 
|---|
 | 126 |  | 
|---|
 | 127 |          | 
|---|
 | 128 |         Boot code role is to set: | 
|---|
 | 129 |                 1 - the kernel and boot info: deplace it to the address 0 | 
|---|
 | 130 |                 2 - the stacks for each proc | 
|---|
 | 131 |                 3 - initialise the info structure (allocated on the stack): don't forget to put the BI info address | 
|---|
 | 132 |                         that resulted from displacing it. | 
|---|
 | 133 |                 4 - initialise the page table and the mmu if we are booting in virtual mode | 
|---|
 | 134 |  | 
|---|
 | 135 |         ***** Phase 1: boot proc of the boot cluster | 
|---|
 | 136 |         - after the preloader, there's only the boot_proc who has a stack and all other proc are waiting (an WTI). | 
|---|
 | 137 |         - jump to C code | 
|---|
 | 138 |         - wakeup all proc (possible improvement: set a distributed wakeup) | 
|---|
 | 139 |  | 
|---|
 | 140 |         ***** Phase 2: all proc (the boot cluster proc) | 
|---|
 | 141 |  | 
|---|
 | 142 |         - start by setting a stack at the end of current cluster | 
|---|
 | 143 |         - jump to C code | 
|---|
 | 144 |         - set info structure | 
|---|
 | 145 |         - copy the kernel and BI info (only one proc per cluster) at the start of the current cluster  | 
|---|
 | 146 |         (- set the page table and the mmu) | 
|---|
 | 147 |         - jump to the kernel (of the cuurrent cluster) and wait in it ? yes wait for the | 
|---|
 | 148 |           kernel image of cluster 0 to be set (since we will probably synchronise with it) | 
|---|
 | 149 |            | 
|---|
 | 150 |  | 
|---|
 | 151 |         ? how to signal to the current cluster proc to jump to kernel ? | 
|---|
 | 152 |  | 
|---|
 | 153 |         --> the boot code is now used by only the boot cluster | 
|---|
 | 154 |         --> the preloader code is used by only the boot cluster other procs | 
|---|
 | 155 |  | 
|---|
 | 156 |         ***** Phase 3: | 
|---|
 | 157 |         - put a barrier to be sure that all procs have entred the boot code | 
|---|
 | 158 |         - all proc set their stack: to put after the boot proc stack | 
|---|
 | 159 |         (- set the page table and the mmu) | 
|---|
 | 160 |  | 
|---|
 | 161 |         --> the preloader code is no longer in use | 
|---|
 | 162 |  | 
|---|
 | 163 |         - copy the kernel and BI of the boot cluster (by the boot proc) | 
|---|
 | 164 |         - all proc of the boot cluster can now jump to the kernel and wait | 
|---|
 | 165 |         - the boot proc enters the kernels and wake up a proc per cluster (except for the current | 
|---|
 | 166 |           boot cluster) | 
|---|
 | 167 |  | 
|---|
 | 168 |         --> the boot code is no longer in use | 
|---|
 | 169 |                  | 
|---|
 | 170 |  | 
|---|
 | 171 |         !! be careful the stack of all the procs are still in use !! | 
|---|
 | 172 |         put the in the reserved zone ? | 
|---|
 | 173 |  | 
|---|
 | 174 |         N.B.: all addresses of the boot cluster are found using compiled in variables | 
|---|
 | 175 |  | 
|---|
 | 176 |  | 
|---|
 | 177 |         ****** It's up to the kernel now... | 
|---|
 | 178 |          | 
|---|
 | 179 | Kernel boot: | 
|---|
 | 180 |         ***** Phase 1: only the boot proc | 
|---|
 | 181 |         wake up one proc per cluster | 
|---|
 | 182 |         !!! Must be sure that they are sleeping (waiting) ? !!! | 
|---|
 | 183 |  | 
|---|
 | 184 |         ***** Phase 2: A proc per cluster | 
|---|
 | 185 |         Tasks: '->' indicate dependance | 
|---|
 | 186 |  | 
|---|
 | 187 |         1) initialise task bootstap and task manager and set idle arg | 
|---|
 | 188 |                 reported: devfs/sysfs roots | 
|---|
 | 189 |  | 
|---|
 | 190 |         2) initialise arch_memory : (initialise boot_tbl: done in the boot phase); initialise | 
|---|
 | 191 |                 clusters_tbl ? | 
|---|
 | 192 |         initialise arch: initialise current cluster: initialise ppm (physical page memory) (can | 
|---|
 | 193 |                                 alloc now!), cpu_init : event listener! | 
|---|
 | 194 |                          initialise devices (printk) (put all in cluster devices lists, root all | 
|---|
 | 195 |                         interruptions locally (to the proc handling them));  | 
|---|
 | 196 |                          and register them (!!!to be reported!!!) -> depend on message api | 
|---|
 | 197 |  | 
|---|
 | 198 |  | 
|---|
 | 199 |         3) --Barrier--: here we should wait that everybody has set there event listener. | 
|---|
 | 200 |  | 
|---|
 | 201 |         only main proc of I/O cluster: initialise fs cache locally(?);  | 
|---|
 | 202 |                                         initialise devfs/sysfs roots and set devices. | 
|---|
 | 203 |         ----Barier ?------ | 
|---|
 | 204 |  | 
|---|
 | 205 |  | 
|---|
 | 206 |         4) task_bootstarp_finalize :  should not be needed all should be done in task_init (TODO) | 
|---|
 | 207 |            kdmsg_init : a set of lock (isr, exception, printk)_lock  and printk_sync | 
|---|
 | 208 |          | 
|---|
 | 209 |         5) DQDT init: arch_dqdt_init and dqdt_init (TODO) | 
|---|
 | 210 |  | 
|---|
 | 211 |         6) Forget about bootstrap_replicate_task and cluster_init_table  | 
|---|
 | 212 |                 a local cluster_init_cores is needed ? | 
|---|
 | 213 |  | 
|---|
 | 214 |         register devices in fs ? | 
|---|
 | 215 |          | 
|---|
 | 216 |         **** Phase 3: all procs (thread idle) | 
|---|
 | 217 |  | 
|---|
 | 218 |         set thread_idle for each proc (parrallèle ?) | 
|---|
 | 219 |  | 
|---|
 | 220 |         load thread_idle: free reserved page (the boot loader reserved pages...), create the event | 
|---|
 | 221 |                                 thread event manager, kvfsd only in the cluster_IO. | 
|---|
 | 222 |  | 
|---|
 | 223 |  | 
|---|
 | 224 |         *** Phase 4: kvfsd (only main cpu of cluster IO) | 
|---|
 | 225 |          | 
|---|
 | 226 |         enable all irq. | 
|---|
 | 227 |  | 
|---|
 | 228 |         initialise fs -> need __sys_blk | 
|---|
 | 229 |         task load init require devfs file system | 
|---|
 | 230 |         if failed set kminishell | 
|---|
 | 231 |          | 
|---|
 | 232 |  | 
|---|
 | 233 |  | 
|---|
 | 234 |  | 
|---|
 | 235 |  | 
|---|
 | 236 |  | 
|---|
 | 237 |  | 
|---|
 | 238 |  | 
|---|
 | 239 |  | 
|---|
 | 240 | Kernel Runing Modifications: | 
|---|
 | 241 |  | 
|---|
 | 242 |         *** DQDT (Ressource handling): Must be set using physical addresses ? | 
|---|
 | 243 |  | 
|---|
 | 244 |         *** FS support: Open, read, write ... all physical access or just when reaching the device ? | 
|---|
 | 245 |  | 
|---|
 | 246 |         *** Memory support: when there is no multithreaded application (only kthread) the memory | 
|---|
 | 247 |                 management is all done localy. Cross cluster messaging for remote creation. | 
|---|
 | 248 |  | 
|---|
 | 249 |         *** Task support: a replicated taskmanager, pids are now composed of XYN, X and Y are the | 
|---|
 | 250 |                 cluster offset, N is the offset in the current cluster. Remote creation can be done | 
|---|
 | 251 |                 only using message passing. | 
|---|
 | 252 |  | 
|---|
 | 253 |         *** Device support: | 
|---|
 | 254 |  | 
|---|
 | 255 |         *** Exception, Interruptions (not syscalls): all device interruptions are rooted and handled | 
|---|
 | 256 |                         locally, as configured at boot time. | 
|---|
 | 257 |  | 
|---|
 | 258 |         Add cluster span to the arch config or in the cluster_entry. Yes it must be defined by the | 
|---|
 | 259 |         boot code since this the code that decide the offset when using virtual memory. | 
|---|
 | 260 |  | 
|---|
 | 261 |         *** User space support: | 
|---|
 | 262 |                 - Syscall: switch adressing mode in case we come or go from a syscall; save the coproc2 extend register  | 
|---|
 | 263 |                 - copy from/to user must be modified | 
|---|
 | 264 |  | 
|---|
 | 265 |  | 
|---|
 | 266 | Developement process: | 
|---|
 | 267 |         ********** Phase one ******************* | 
|---|
 | 268 |         Consiste of boting the kernel with no user space support and with a dummy dqdt suport | 
|---|
 | 269 |  | 
|---|
 | 270 |         *** Stage 0: | 
|---|
 | 271 |                 Rewrite the kernel in the view of passing to 40 bits: | 
|---|
 | 272 |                         Handle gloabal variables: | 
|---|
 | 273 |                         1) remove inused gloabl variables | 
|---|
 | 274 |                         2) simplifie the message passing API | 
|---|
 | 275 |                         3) do a simplified DQDT : replace dqdt files by a dummy : next_cluster++ | 
|---|
 | 276 |                         4) task and thread creation only using message passing | 
|---|
 | 277 |                    5) do a true copy_from_usr and copy_to_usr ! | 
|---|
 | 278 |                    6) delete the assumption that all address superior to KERNEL_OFFSET belongs  | 
|---|
 | 279 |                                          to the kernel(genarally used to verify if an address belongd to user space) | 
|---|
 | 280 |                                          replace by checking that the address is between USR_OFFSET and _LIMIT  | 
|---|
 | 281 |                                          (see libk/elf.c) for an example. | 
|---|
 | 282 |                          | 
|---|
 | 283 |  | 
|---|
 | 284 |         *** Stage 1:  | 
|---|
 | 285 |                 Develloping boot code: require setting the disk, develloping virtual memory for | 
|---|
 | 286 |                         the perspective of a dooble mode of booting, replicate the kernel and put it | 
|---|
 | 287 |                         at address zero. | 
|---|
 | 288 |                 Develloping kernel boot code (reaching kern_init and printing a message ?), setting boot_dmsg  | 
|---|
 | 289 |  | 
|---|
 | 290 |         *** Stage 2: (TODO: synchronise with stage 0) | 
|---|
 | 291 |                 Rewrite of most of the kernel: | 
|---|
 | 292 |                         ******* GOALS: | 
|---|
 | 293 |                         1) delete (replace) reference to (unused) global variables:  | 
|---|
 | 294 |                                 - cluster_tbl : no such a thing as cluster init... | 
|---|
 | 295 |                                         reference to cluster struct should be removed to keep only cids: this will affect allot of code! | 
|---|
 | 296 |                                         No more a access to remote listener ptr (event.c), nor cpu struct, not cluster, nor ppm of remote cluster ... | 
|---|
 | 297 |  | 
|---|
 | 298 |                                 - devfs_db replaced by the root dentry/inode of the devfs file system and since | 
|---|
 | 299 |                                 there is only one kernel that use it => allocate it dynamically | 
|---|
 | 300 |                                 - similar for sysfs_root_entry ? | 
|---|
 | 301 |                                 - devfs_n_op/devfs_f_op : are const  | 
|---|
 | 302 |                                 - (dma,fb,icu,iopic,sda,timer,xicu,tty)_count are per cluster the | 
|---|
 | 303 |                                   new naming scheme is device_cidn | 
|---|
 | 304 |                                 - rt_timer: Not used => removet it | 
|---|
 | 305 |                                 - (exception, isr, printk, boot)_lock: are all used to lock the printing | 
|---|
 | 306 |                                 - kexcept_tty, klog_tty, tty_tbl, kisr_tty, kboot_tty ??? | 
|---|
 | 307 |  | 
|---|
 | 308 |                                 - soclib_(any device)_driver are RO: can we mark them as const ? | 
|---|
 | 309 |                                 - boot_stage_done: not used | 
|---|
 | 310 |  | 
|---|
 | 311 |                         2) Event Manager to use physical adresses. | 
|---|
 | 312 |                         3) fs | 
|---|
 | 313 |                         4) all interruption (produced by device and WTI) are handled locally | 
|---|
 | 314 |                         5) all exception are handled locally (there is no remote page fault, since | 
|---|
 | 315 |                                 there is no user space => no multithreaded user space application) | 
|---|
 | 316 |                         6) Complete the kernel boot phase. | 
|---|
 | 317 |                         7) Context switch: adding the saving of the coproc registers: DATA_extend register and Virtual | 
|---|
 | 318 |                                 mode register | 
|---|
 | 319 |         ?cpu_gid2ptr: should be modified to fetch only local cluster, if a remote cluster is called, it should return an error | 
|---|
 | 320 |  | 
|---|
 | 321 |         *** Stage N: user space support | 
|---|
 | 322 |                 $27 is now used by the kerntry code! user space should no longer used it | 
|---|
 | 323 |                 Switch to user space need to modify to set off the MMU and reset when going back... | 
|---|
 | 324 |                 set in init context the mmu register value (0xF) | 
|---|
 | 325 |  | 
|---|
 | 326 | ***Structures modif (with study only struct fields)**** | 
|---|
 | 327 |  | 
|---|
 | 328 | ** NOTATIONS: | 
|---|
 | 329 | -PB: problem,  | 
|---|
 | 330 | -HD: handled in the corresponding structure. This is for structure that are  | 
|---|
 | 331 | directly embeded in the structure and wich contain a non local pointer | 
|---|
 | 332 | -NPB: no problem | 
|---|
 | 333 | -LPTR: local pointer | 
|---|
 | 334 | -RPTR: remote pointer | 
|---|
 | 335 | -RPTR-S: RPTR  that is static => point to a structure that cannot be moved across clusters   | 
|---|
 | 336 | -RPTR-D: RPTR that is dynmic=> point to a structure that can be moved across clusters  | 
|---|
 | 337 | (which mean that the  ptr need to be updated!) | 
|---|
 | 338 |  | 
|---|
 | 339 |  | 
|---|
 | 340 | ** Structures that need to accessed remotly (and does they need to be dynamic ?) | 
|---|
 | 341 | struct task_s; | 
|---|
 | 342 | struct thread_s; | 
|---|
 | 343 |  | 
|---|
 | 344 |  | 
|---|
 | 345 | ** Structures details | 
|---|
 | 346 |  | 
|---|
 | 347 |         + thread structure (thread.h) | 
|---|
 | 348 |         struct thread_s | 
|---|
 | 349 |         { | 
|---|
 | 350 |                 struct cpu_uzone_s uzone;//NOPB | 
|---|
 | 351 |                 spinlock_t lock;//PB:HD | 
|---|
 | 352 |                 thread_state_t state;//NOPB | 
|---|
 | 353 |                 ...//NOPB | 
|---|
 | 354 |                 struct cpu_s *lcpu;//NOPB: LPTR   /*! pointer to the local CPU description structure */ | 
|---|
 | 355 |                 struct sched_s *local_sched; //NOPB LPTR /*! pointer to the local scheduler structure */ | 
|---|
 | 356 |  | 
|---|
 | 357 | *               struct task_s *task; //PB: RPTR | 
|---|
 | 358 |  | 
|---|
 | 359 |                 thread_attr_t type;//NOPB           /*! 3 types : usr (PTHREAD), kernel (KTHREAD) or idle (TH_IDLE) */ | 
|---|
 | 360 |                 struct cpu_context_s pws;//NOPB     /*! processor work state (register saved zone) */ | 
|---|
 | 361 |  | 
|---|
 | 362 | *               struct list_entry list;//PB       /*! next/pred threads at the same state */ | 
|---|
 | 363 | *               struct list_entry rope;//OB       /*! next/pred threads in the __rope list of thread */ | 
|---|
 | 364 |                 struct thread_info info;//HD      /*! (exit value, statistics, ...) */ | 
|---|
 | 365 |  | 
|---|
 | 366 |                 uint_t signature;//NOPB | 
|---|
 | 367 |         }; | 
|---|
 | 368 |         struct thread_info | 
|---|
 | 369 |         { | 
|---|
 | 370 |                 ...//NOPB | 
|---|
 | 371 |                 struct cpu_s *ocpu;//PB: RPTR-S | 
|---|
 | 372 |                 uint_t wakeup_date;//NOPB           /*! wakeup date in seconds */ | 
|---|
 | 373 |                 void *exit_value;//NOPB                  /*! exit value returned by thread or joined one */ | 
|---|
 | 374 | *               struct thread_s *join;//PB:RPTR-D              /*! points to waiting thread in join case */ | 
|---|
 | 375 | *               struct thread_s *waker;//RPTR-D | 
|---|
 | 376 |                 struct wait_queue_s wait_queue;//PB:HD | 
|---|
 | 377 | *               struct wait_queue_s *queue;//PB | 
|---|
 | 378 |                 struct cpu_context_s pss;//NPB      /*! Processor Saved State */ | 
|---|
 | 379 |                 pthread_attr_t attr;//HD | 
|---|
 | 380 |                 void  *kstack_addr;//NPB:LPTR (always moved with the thread) | 
|---|
 | 381 |                 uint_t kstack_size;//OK | 
|---|
 | 382 |                 struct event_s *e_info;//never used!!!!!!!!!!! | 
|---|
 | 383 |                 struct page_s *page;//LTPR ? | 
|---|
 | 384 |         }; | 
|---|
 | 385 |         typedef struct | 
|---|
 | 386 |         { | 
|---|
 | 387 |                 ...//NOPB | 
|---|
 | 388 |                 void *stack_addr;//user space ? | 
|---|
 | 389 |                 size_t stack_size; | 
|---|
 | 390 |                 void *entry_func;//USP                  /* mandatory */ | 
|---|
 | 391 |                 void *exit_func;//USP                   /* mandatory */ | 
|---|
 | 392 |                 void *arg1;//? | 
|---|
 | 393 |                 void *arg2;//? | 
|---|
 | 394 |                 void *sigreturn_func;//? | 
|---|
 | 395 |                 void *sigstack_addr;//USP todo | 
|---|
 | 396 |                 size_t sigstack_size;//? | 
|---|
 | 397 |                 struct sched_param  sched_param;//PPB | 
|---|
 | 398 |                 ...//NOPB                        /* mandatory */ | 
|---|
 | 399 |         } pthread_attr_t; | 
|---|
 | 400 |          | 
|---|
 | 401 |         + task structure | 
|---|
 | 402 |         struct task_s | 
|---|
 | 403 |         { | 
|---|
 | 404 |                 /* Various Locks */ | 
|---|
 | 405 |                 mcs_lock_t block;//HD | 
|---|
 | 406 |                 spinlock_t lock;//HD | 
|---|
 | 407 |                 spinlock_t th_lock;//HD | 
|---|
 | 408 |                 struct rwlock_s cwd_lock;//HD | 
|---|
 | 409 |                 spinlock_t tm_lock;//local:HD | 
|---|
 | 410 |  | 
|---|
 | 411 |                 /* Memory Management */ | 
|---|
 | 412 |                 struct vmm_s vmm;//HD | 
|---|
 | 413 |  | 
|---|
 | 414 |                 /* Placement Info */ | 
|---|
 | 415 |                 struct cluster_s *cluster;//local | 
|---|
 | 416 |                 struct cpu_s *cpu;//local | 
|---|
 | 417 |  | 
|---|
 | 418 |                 /* File system * | 
|---|
 | 419 |                 //for cwd and root they should always point to the same  | 
|---|
 | 420 |                 //file struct (not node) to avoid ensurring the coherence | 
|---|
 | 421 |                 //if one of them change | 
|---|
 | 422 |                 struct vfs_inode_s *vfs_root;// | 
|---|
 | 423 |                 struct vfs_inode_s *vfs_cwd;// | 
|---|
 | 424 |                 struct fd_info_s  *fd_info;//embed it | 
|---|
 | 425 |                 struct vfs_file_s *bin;//Static: embed it | 
|---|
 | 426 |            | 
|---|
 | 427 |                 /* Task management */ | 
|---|
 | 428 |                 pid_t pid;//NPB | 
|---|
 | 429 |                 uid_t uid;//NPB | 
|---|
 | 430 |                 gid_t gid;//NPB | 
|---|
 | 431 |                 uint_t state;//NPB | 
|---|
 | 432 |                 atomic_t childs_nr;//NPB | 
|---|
 | 433 |                 uint16_t childs_limit;//NPB | 
|---|
 | 434 |  | 
|---|
 | 435 |                 //make them of type faddr | 
|---|
 | 436 |                 struct task_s *parent;//PB | 
|---|
 | 437 |                 struct list_entry children;//PB  | 
|---|
 | 438 |                 struct list_entry list;//PB | 
|---|
 | 439 |  | 
|---|
 | 440 |                 /* Threads */ | 
|---|
 | 441 |                 uint_t threads_count; | 
|---|
 | 442 |                 uint_t threads_nr; | 
|---|
 | 443 |                 uint_t threads_limit; | 
|---|
 | 444 |                 uint_t next_order; | 
|---|
 | 445 |                 uint_t max_order; | 
|---|
 | 446 |  | 
|---|
 | 447 |                 //add a function to register after we creat it ? | 
|---|
 | 448 |                 BITMAP_DECLARE(bitmap, (CONFIG_PTHREAD_THREADS_MAX >> 3)); | 
|---|
 | 449 |                 struct thread_s **th_tbl;//PB: TODO: local table of pointer to avoid the page below? | 
|---|
 | 450 |                 struct list_entry th_root; | 
|---|
 | 451 |                 struct page_s *th_tbl_pg;//NPB: local (make it local) | 
|---|
 | 452 |  | 
|---|
 | 453 |                 /* Signal management */ | 
|---|
 | 454 |                 struct sig_mgr_s sig_mgr; | 
|---|
 | 455 |  | 
|---|
 | 456 |         #if CONFIG_FORK_LOCAL_ALLOC | 
|---|
 | 457 |                 struct cluster_s *current_clstr; | 
|---|
 | 458 |         #endif | 
|---|
 | 459 |         }; | 
|---|
 | 460 |  | 
|---|
 | 461 |                  | 
|---|
 | 462 |                  | 
|---|
 | 463 |          | 
|---|
 | 464 |          | 
|---|
 | 465 | File per file modif: | 
|---|
 | 466 |         *** kern dir files: | 
|---|
 | 467 | *PKB            - kern_init.c (see up) | 
|---|
 | 468 |                 - atomic.c: handle atomic_t and refcount_t objects (try to keep them local ? It will | 
|---|
 | 469 |                   be hard (fs, event handler?)) | 
|---|
 | 470 |                 - barrier.c: used only by sys_barrier.c | 
|---|
 | 471 |                 - blkio.c: this layer allow an fs to send request to block device, all request pass | 
|---|
 | 472 |                   here.(manipulate a device struct. With this it's best to replicate the notion | 
|---|
 | 473 |                   of device ? NO). Use blkio async to send an IPI blokio request. | 
|---|
 | 474 |                 - cluster.c : some init functions, cid2ptr (to delete ?), manager, key_op (never used) | 
|---|
 | 475 |                 - cond_var.c: used only by user space (at least for now) | 
|---|
 | 476 |                 - cpu.c : the function cpu_gid2ptr access the cluster structure! see the structure for more | 
|---|
 | 477 |                 - do_exec : use copy_uspace! | 
|---|
 | 478 |                 - do_interupt : remove thread migration handling ? | 
|---|
 | 479 |                 - do_syscall : (N.B. the context save is for the fork syscall) remove thread migration ? | 
|---|
 | 480 |                 - event : modify to support the ... | 
|---|
 | 481 |                 - (keysdb/kfifo/mwmr/mcs_sync/radix/rwlock/semaphore/spinlock).c: their modification depend on the scope in which their are used | 
|---|
 | 482 |                 - kthread_create: local | 
|---|
 | 483 |                 - rr-sched: should be local | 
|---|
 | 484 |                 - scheduler: (thread_local_cpu) should be local | 
|---|
 | 485 |                 - task.c: should get simplified => removing replicate calls (they should may be used to see how the migration goes) | 
|---|
 | 486 |                 - thread_create.c: use of cpu_gid2ptr, should be local | 
|---|
 | 487 |                 - destroy|dup|idle.c: should be local | 
|---|
 | 488 |                 - thread migrate.c: need to be modified | 
|---|
 | 489 |         SYSCALLS | 
|---|
 | 490 |         Miscelanious: | 
|---|
 | 491 |                 - sys_alarm.c: manipulte local data (And thread migration is initiated by each thread indepndantly...) | 
|---|
 | 492 | *PKB            - sys_barier.c: not local, to complexe for no reason except performance, we should pospone this functionnality? | 
|---|
 | 493 |                                 I think we need such a struc for the boot. This mean that posponing is not possible, but we can simplify it | 
|---|
 | 494 |                 - sys_clock.c: local | 
|---|
 | 495 |                 - sys_cond_var.c: | 
|---|
 | 496 |                 - sys_dma_memcpy.c: | 
|---|
 | 497 |                 - sys_rwlock.c | 
|---|
 | 498 |                 - sys_sem.c | 
|---|
 | 499 |         Task: | 
|---|
 | 500 |                 - sys_exec.c | 
|---|
 | 501 |                 - sys_fork.c | 
|---|
 | 502 |                 - sys_getpid.c | 
|---|
 | 503 |                 - sys_ps.c | 
|---|
 | 504 |                 - sys_signal.c | 
|---|
 | 505 |                 - sys_thread_create.c | 
|---|
 | 506 |                 - sys_thread_detach.c | 
|---|
 | 507 |                 - sys_thread_exit.c | 
|---|
 | 508 |                 - sys_thread_getattr.c | 
|---|
 | 509 |                 - sys_thread_join.c | 
|---|
 | 510 |                 - sys_thread_migrate.c | 
|---|
 | 511 |                 - sys_thread_sleep.c | 
|---|
 | 512 |                 - sys_thread_wakeup.c | 
|---|
 | 513 |                 - sys_thread_yield.c | 
|---|
 | 514 |         Task Mem: | 
|---|
 | 515 |                 - sys_madvise.c | 
|---|
 | 516 |                 - sys_mcntl.c | 
|---|
 | 517 |                 - sys_mmap.c | 
|---|
 | 518 |                 - sys_sbrk.c | 
|---|
 | 519 |                 - sys_utls.c | 
|---|
 | 520 |         FS: | 
|---|
 | 521 |                 - sys_chdir.c: | 
|---|
 | 522 |                 - sys_close.c: | 
|---|
 | 523 |                 - sys_closedir.c: | 
|---|
 | 524 |                 - sys_creat.c: | 
|---|
 | 525 |                 - sys_getcwd.c | 
|---|
 | 526 |                 - sys_lseek.c | 
|---|
 | 527 |                 - sys_mkdir.c | 
|---|
 | 528 |                 - sys_mkfifo.c | 
|---|
 | 529 |                 - sys_open.c | 
|---|
 | 530 |                 - sys_opendir.c | 
|---|
 | 531 |                 - sys_pipe.c | 
|---|
 | 532 |                 - sys_read.c | 
|---|
 | 533 |                 - sys_readdir.c | 
|---|
 | 534 |                 - sys_stat.c | 
|---|
 | 535 |                 - sys_unlink.c | 
|---|
 | 536 |                 - sys_write.c | 
|---|
 | 537 |         mm/: | 
|---|
 | 538 |                 Task related: | 
|---|
 | 539 |                 vmm.c: munmap (region:detach, split, resize); mmap (shared, private | file, anomymous);  | 
|---|
 | 540 |                         skbrk(resize heap region TODO: use the resize func), madvise_migrate, vmm_auto_migrate, | 
|---|
 | 541 |                         (modify page table attribute and set migrate flag), madvise_will_need; | 
|---|
 | 542 |                 vm_region.c:... | 
|---|
 | 543 |                 Other: | 
|---|
 | 544 |                 ppm.c: handle page descriptors. We find some use of cluster ptr that should be removed ? | 
|---|
 | 545 |                 page.c: to make local | 
|---|
 | 546 |                  | 
|---|
 | 547 |                  | 
|---|
 | 548 |  | 
|---|
 | 549 | Question: | 
|---|
 | 550 | 1) How is the time handled in almos. Does we use a unique timer to keep the time seamleese across node ? | 
|---|
 | 551 | 2) Copy to/from userspace | 
|---|
 | 552 | 3) Cross cluster lists: thread lists | 
|---|
 | 553 | 4) Only the kentry is mapped when entring the kernel from user space... This is going to be a complexe point. | 
|---|
 | 554 | Three new things need to be done: | 
|---|
 | 555 | 1- if from user space (or simply if we were in the vitual mode was actif), switch to physical mode of local cluster | 
|---|
 | 556 | 2- if from kernel save DATA_EXT register. Also, if we do cpy_uspace by switchin to the virtulle space, we need to  | 
|---|
 | 557 | do what we do in one. | 
|---|
 | 558 |  | 
|---|
 | 559 |  | 
|---|
 | 560 | Remark: | 
|---|
 | 561 | cross cluster access also keep in mind that other access are possible, like page based access (temporarely map a page). | 
|---|
 | 562 |  | 
|---|
 | 563 |  | 
|---|
 | 564 |  | 
|---|
 | 565 |  | 
|---|
 | 566 | Task and thread subsystems: | 
|---|
 | 567 | Per cluster vmm or per thread ? | 
|---|
 | 568 |  | 
|---|
 | 569 | Per cluster: 1) interest: less physical space cosummed and less coherence to handle | 
|---|
 | 570 |              2) Problems: "resharing" of the stack zone could complex (make it impossible to migrate the stack of thread and thus the thread) ? | 
|---|
 | 571 |  | 
|---|
 | 572 | Per thread:  1) interest: virtualise the virtual mapping between thread become easy  (for stack and TLS) | 
|---|
 | 573 |                                 and temporary mappping are allot easier... | 
|---|
 | 574 |                                 (and we could free the $27 register!) | 
|---|
 | 575 |              2) Problems: to much use of physical space (cache) + require more coherence message | 
|---|
 | 576 |  | 
|---|
 | 577 |  | 
|---|
 | 578 |  | 
|---|
 | 579 | Files need to accessible across cluster, since they could be share by tasks! | 
|---|
 | 580 |  | 
|---|
 | 581 |  | 
|---|
 | 582 |  | 
|---|
 | 583 | TODO: | 
|---|
 | 584 | Check that we have mapped enough of the kernel, for the kentry ? | 
|---|
 | 585 |  | 
|---|
 | 586 |  | 
|---|
 | 587 |  | 
|---|
 | 588 | VMM replicated region (mapper) require that the insertion to the page cache be atomic! | 
|---|
 | 589 |  | 
|---|
 | 590 |  | 
|---|
 | 591 | DEveloppement results: | 
|---|
 | 592 | event_fifo.c | 
|---|
 | 593 | remote operation.c | 
|---|
 | 594 | arch_init.c:ongoing for devices | 
|---|
 | 595 | cluster_init.c | 
|---|
 | 596 | kentry.c:k1 is now used by the kernel! No, it's that we k1 only when we were in | 
|---|
 | 597 | kernel mode... Otherwise when coming in usert mode we don't need it and save it? | 
|---|