Changeset 457
- Timestamp:
- Aug 2, 2018, 11:47:13 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 243 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Makefile
r444 r457 90 90 $(MAKE) -C $(LIBC_PATH) clean 91 91 $(MAKE) -C $(LIBPTHREAD_PATH) clean 92 $(MAKE) -C $(LIBSEMAPHORE_PATH) clean 92 93 $(MAKE) -C $(LIBALMOSMKH_PATH) clean 93 94 $(MAKE) -C user/init clean … … 136 137 $(MAKE) -C $(LIBALMOSMKH_PATH) headers 137 138 $(MAKE) -C $(LIBPTHREAD_PATH) headers 139 $(MAKE) -C $(LIBSEMAPHORE_PATH) headers 138 140 $(MAKE) -C $(LIBC_PATH) 139 141 $(MAKE) -C $(LIBALMOSMKH_PATH) 140 142 $(MAKE) -C $(LIBPTHREAD_PATH) 143 $(MAKE) -C $(LIBSEMAPHORE_PATH) 141 144 142 145 ##################################################################### … … 146 149 dd if=$@ of=$(DISK_IMAGE) seek=2 conv=notrunc 147 150 148 ###################################################### ###############149 # Rule to generate boot.elf and place it in sector #2 of virtual disk151 ###################################################### 152 # Rule to generate HAL objects (depending on HAL_ARCH) 150 153 build_hal: 151 154 $(MAKE) -C $(HAL_ARCH) -
trunk/boot/tsar_mips32/Makefile
r439 r457 59 59 boot_utils.h \ 60 60 boot_config.h \ 61 $(HAL_ARCH)/core/hal_ types.h \61 $(HAL_ARCH)/core/hal_kernel_types.h \ 62 62 ../../hard_config.h 63 63 $(CC) $(BOOT_INCLUDE) $(CFLAGS) -c -o $@ $< … … 68 68 boot_utils.h \ 69 69 boot_config.h \ 70 $(HAL_ARCH)/core/hal_ types.h \70 $(HAL_ARCH)/core/hal_kernel_types.h \ 71 71 ../../hard_config.h 72 72 $(CC) $(BOOT_INCLUDE) $(CFLAGS) -c -o $@ $< … … 77 77 boot_utils.h \ 78 78 boot_config.h \ 79 $(HAL_ARCH)/core/hal_ types.h \79 $(HAL_ARCH)/core/hal_kernel_types.h \ 80 80 ../../hard_config.h 81 81 $(CC) $(BOOT_INCLUDE) $(CFLAGS) -c -o $@ $< … … 86 86 boot_utils.h \ 87 87 boot_config.h \ 88 $(HAL_ARCH)/core/hal_ types.h \88 $(HAL_ARCH)/core/hal_kernel_types.h \ 89 89 ../../hard_config.h 90 90 $(CC) $(BOOT_INCLUDE) $(CFLAGS) -c -o $@ $< … … 97 97 boot_utils.h \ 98 98 boot_config.h \ 99 $(HAL_ARCH)/core/hal_ types.h \99 $(HAL_ARCH)/core/hal_kernel_types.h \ 100 100 ../../hard_config.h 101 101 $(CC) $(BOOT_INCLUDE) $(CFLAGS) -c -o $@ $< … … 107 107 boot_utils.h \ 108 108 boot_tty_driver.h \ 109 $(HAL_ARCH)/core/hal_ types.h \109 $(HAL_ARCH)/core/hal_kernel_types.h \ 110 110 ../../hard_config.h 111 111 $(CC) $(BOOT_INCLUDE) $(CFLAGS) -c -o $@ $< … … 122 122 boot_mmc_driver.h \ 123 123 boot_config.h \ 124 $(HAL_ARCH)/core/hal_ types.h \124 $(HAL_ARCH)/core/hal_kernel_types.h \ 125 125 ../../hard_config.h 126 126 $(CC) $(BOOT_INCLUDE) $(CFLAGS) $(MACROS) -c -o $@ $< -
trunk/boot/tsar_mips32/boot.c
r439 r457 70 70 71 71 #include <elf-types.h> 72 #include <hal_ types.h>72 #include <hal_kernel_types.h> 73 73 74 74 #include <kernel_config.h> -
trunk/boot/tsar_mips32/boot_bdv_driver.h
r439 r457 19 19 #define BOOT_BDV_DRIVER_H 20 20 21 #include <hal_ types.h>21 #include <hal_kernel_types.h> 22 22 23 23 /**************************************************************************** -
trunk/boot/tsar_mips32/boot_fat32.h
r439 r457 318 318 ****************************************************************************/ 319 319 320 #include <hal_ types.h>320 #include <hal_kernel_types.h> 321 321 322 322 typedef struct fat_desc_s -
trunk/boot/tsar_mips32/boot_hba_driver.h
r439 r457 27 27 #define BOOT_HBA_DRIVER_H 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 31 31 /**************************************************************************** -
trunk/boot/tsar_mips32/boot_mmc_driver.h
r439 r457 13 13 #define _GIET_MMC_DRIVERS_H_ 14 14 15 #include <hal_ types.h>15 #include <hal_kernel_types.h> 16 16 17 17 /////////////////////////////////////////////////////////////////////////////////// -
trunk/boot/tsar_mips32/boot_tty_driver.c
r439 r457 24 24 #include <boot_config.h> 25 25 #include <boot_tty_driver.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <boot_utils.h> 28 28 -
trunk/boot/tsar_mips32/boot_tty_driver.h
r439 r457 33 33 #define BOOT_TTY_DRIVER_H 34 34 35 #include <hal_ types.h>35 #include <hal_kernel_types.h> 36 36 37 37 /**************************************************************************** -
trunk/boot/tsar_mips32/boot_utils.c
r439 r457 25 25 26 26 #include <boot_tty_driver.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <boot_utils.h> 29 29 -
trunk/boot/tsar_mips32/boot_utils.h
r439 r457 41 41 #define _BOOT_UTILS_H 42 42 43 #include <hal_ types.h>43 #include <hal_kernel_types.h> 44 44 #include <hard_config.h> 45 45 -
trunk/hal/generic/hal_atomic.h
r408 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 ////////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_context.h
r408 r457 43 43 * identified by the <thread> argument. The context is not initialised. 44 44 **************************************************************************************** 45 * @ thread : pointer on the thread descriptor. 45 46 * @ return 0 if success / return -1 if failure. 46 47 ***************************************************************************************/ … … 48 49 49 50 /**************************************************************************************** 50 * This function allocates memory for a CPU context, initialize it from scratch, 51 * and links it to the thread identified by the <thread> argument. 51 * This function initializes a CPU context from scratch. 52 52 **************************************************************************************** 53 53 * @ thread : pointer on the thread descriptor. 54 * @ return 0 if success / return -1 if failure.55 54 ***************************************************************************************/ 56 error_t hal_cpu_context_create( struct thread_s * thread );55 void hal_cpu_context_init( struct thread_s * thread ); 57 56 58 57 /**************************************************************************************** … … 71 70 72 71 /**************************************************************************************** 72 * This function is used to implement the exec() system call. 73 * 1) It initialize the relevant slots of the the calling thread CPU context. 74 * 2) It call the hal_do_cpu_restore() function to return to user mode and start 75 * execution of the new process. 76 **************************************************************************************** 77 * @ thread : pointer on the thread descriptor. 78 ***************************************************************************************/ 79 void hal_cpu_context_exec( struct thread_s * thread ); 80 81 /**************************************************************************************** 73 82 * This function display some slots of the CPU context. 74 * - For the MIPS32 :75 * . GPR : gp_28 , sp_29 , ra_3176 * . CP0 : c0_sr , c0_th , c0_epc77 * . CP2 : c2_ptpr , c2-mode78 * - For X86 TODO :79 83 **************************************************************************************** 80 84 * @ thread_xp : extended pointer on the thread descriptor. … … 103 107 ***************************************************************************************/ 104 108 error_t hal_fpu_context_alloc( struct thread_s * thread ); 109 110 /**************************************************************************************** 111 * This function initializes a FPU context from scratch. 112 **************************************************************************************** 113 * @ thread : pointer on the thread descriptor. 114 ***************************************************************************************/ 115 void hal_fpu_context_init( struct thread_s * thread ); 105 116 106 117 /**************************************************************************************** -
trunk/hal/generic/hal_exception.h
r455 r457 25 25 #define _HAL_EXCEPTION_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 ////////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_gpt.h
r432 r457 25 25 #define _GPT_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 ///////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_interrupt.h
r408 r457 25 25 #define _HAL_INTERRUPT_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 /////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_irqmask.h
r279 r457 26 26 #define _HAL_IRQMASK_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_shared_types.h> 29 29 30 30 -
trunk/hal/generic/hal_ppm.h
r409 r457 26 26 #define _HAL_PPM_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <boot_info.h> 30 30 -
trunk/hal/generic/hal_remote.h
r407 r457 26 26 #define _HAL_REMOTE_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 ////////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_special.h
r408 r457 25 25 #define _HAL_CPU_H_ 26 26 27 #include <hal_types.h> 27 #include <hal_shared_types.h> 28 #include <hal_kernel_types.h> 28 29 29 30 /**** Forward declarations ***/ -
trunk/hal/generic/hal_switch.h
r408 r457 28 28 29 29 /************************************************************************************* 30 * Th e hal_do_cpu_switch() function is an assembly level function, called by the31 * sched_yield() function,to make a CPU context switch.32 * The current thread CPU context is identified by the <ctx_ current> pointer.33 * The new thread CPU context is identified by the <ctx_ne xt> pointer.30 * This assembly level function is called by the sched_yield() function, 31 * to make a CPU context switch. 32 * The current thread CPU context is identified by the <ctx_old> pointer. 33 * The new thread CPU context is identified by the <ctx_new> pointer. 34 34 * The architecture specific hal_cpu_context_t structure used to store a CPU context 35 35 * is defined in the architecture specific hal_context.c file. … … 45 45 46 46 /************************************************************************************* 47 * The hal_do_cpu_save() function is an assembly level function, called by the 48 * hal_cpu_context_save() functio to save the calling CPU register values to a 49 * CPU context identified by the <ctx> pointer. 47 * This assembly level function is called by the hal_cpu_context_fork() function. 48 * It save the calling CPU register values to a CPU context identified by <ctx>. 50 49 * This function does NOT modify any register before saving values into context. 51 50 * The architecture specific hal_cpu_context_t structure used to store a CPU context … … 57 56 void hal_do_cpu_save( void * ctx ); 58 57 58 /************************************************************************************* 59 * This assembly level function, is called by the hal_cpu_context_exec() function. 60 * It restore the calling CPU register values from a CPU context identified by <ctx>. 61 * The architecture specific hal_cpu_context_t structure used to store a CPU context 62 * is defined in the architecture specific hal_context.c file. 63 * When the restore is completed, it simply jumps to the address contained in ra_31. 64 * In ALMOS-MKH, ra_31 must contain a pointer on the eret() function, and c0_epc 65 * must contain the new main thread entry point. 66 ************************************************************************************* 67 * @ ctx : local pointer on CPU context. 68 ************************************************************************************/ 69 void hal_do_cpu_restore( void * ctx ); 70 59 71 #endif /* _HAL_SWITCH_H_ */ -
trunk/hal/generic/hal_syscall.h
r408 r457 25 25 #define _HAL_KERNEL_SYSCALL_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 /////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_user.h
r445 r457 25 25 #define _HAL_USER_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_shared_types.h> 28 28 29 29 ////////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_uspace.h
r407 r457 25 25 #define _HAL_USPACE_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 ////////////////////////////////////////////////////////////////////////////////////////// -
trunk/hal/generic/hal_vmm.h
r411 r457 25 25 #define _HAL_PPM_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <boot_info.h> 29 29 -
trunk/hal/tsar_mips32/Makefile
r444 r457 72 72 $(HAL_ARCH)/drivers/%.h \ 73 73 $(KERNEL)/kernel_config.h \ 74 $(HAL_ARCH)/core/hal_ types.h74 $(HAL_ARCH)/core/hal_kernel_types.h 75 75 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 76 76 … … 80 80 $(HAL)/generic/%.h \ 81 81 $(KERNEL)/kernel_config.h \ 82 $(HAL_ARCH)/core/hal_ types.h82 $(HAL_ARCH)/core/hal_kernel_types.h 83 83 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 84 84 … … 86 86 $(HAL_ARCH)/core/hal_kentry.h \ 87 87 $(KERNEL)/kernel_config.h \ 88 $(HAL_ARCH)/core/hal_ types.h88 $(HAL_ARCH)/core/hal_kernel_types.h 89 89 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 90 90 -
trunk/hal/tsar_mips32/core/hal_atomic.c
r62 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 26 26 //////////////////////////////////// -
trunk/hal/tsar_mips32/core/hal_context.c
r432 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_switch.h> 26 26 #include <memcpy.h> … … 136 136 } // end hal_cpu_context_alloc() 137 137 138 ///////////////////////////////////////////////// //139 // The following context slots are initialised :138 ///////////////////////////////////////////////// 139 // The following context slots are initialised 140 140 // GPR : a0_04 / sp_29 / ra_31 141 141 // CP0 : c0_sr / c0_th / c0_epc 142 142 // CP2 : c2_ptpr / c2_mode 143 /////////////////////////////////////////////////// 144 error_t hal_cpu_context_create( thread_t * thread ) 145 { 146 // allocate memory for a CPU context 147 error_t error = hal_cpu_context_alloc( thread ); 148 149 if( error ) return error; 150 143 ///////////////////////////////////////////////// 144 void hal_cpu_context_init( thread_t * thread ) 145 { 151 146 hal_cpu_context_t * context = (hal_cpu_context_t *)thread->cpu_context; 147 148 assert( (context != NULL ), __FUNCTION__, "CPU context not allocated" ); 152 149 153 150 // initialisation depends on thread type … … 173 170 context->c2_mode = 0x3; 174 171 } 175 176 return 0; 177 178 } // end hal_cpu_context_create() 172 } // end hal_cpu_context_init() 179 173 180 174 //////////////////////////////////////////// … … 243 237 assert( (current == child_ptr) , __FUNCTION__ , "current = %x / child = %x\n"); 244 238 } 245 246 239 } // end hal_cpu_context_fork() 240 241 ////////////////////////////////////////////// 242 void hal_cpu_context_exec( thread_t * thread ) 243 { 244 // re_initialize CPU context 245 hal_cpu_context_init( thread ); 246 247 // restore CPU registers ... and jump 248 hal_do_cpu_restore( (hal_cpu_context_t *)thread->cpu_context ); 249 250 } // end hal_cpu_context_exec() 247 251 248 252 ///////////////////////////////////////////////// … … 312 316 313 317 } // end hal_fpu_context_alloc() 318 319 ////////////////////////////////////////////// 320 void hal_fpu_context_init( thread_t * thread ) 321 { 322 hal_fpu_context_t * context = thread->fpu_context; 323 324 assert( (context != NULL) , __FUNCTION__ , "fpu context not allocated" ); 325 326 memset( context , 0 , sizeof(hal_fpu_context_t) ); 327 } 314 328 315 329 ////////////////////////////////////////// -
trunk/hal/tsar_mips32/core/hal_drivers.c
r407 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <chdev.h> 24 24 #include <hal_drivers.h> -
trunk/hal/tsar_mips32/core/hal_exception.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_irqmask.h> 26 26 #include <hal_special.h> … … 134 134 core_t * core = this->core; 135 135 136 // enable FPU 136 // enable FPU (in core SR) 137 137 hal_fpu_enable(); 138 138 139 // save FPU contextin current owner thread if required139 // save FPU register values in current owner thread if required 140 140 if( core->fpu_owner != NULL ) 141 141 { 142 142 if( core->fpu_owner != this ) 143 143 { 144 // save the FPU registers to current owner thread context 144 145 hal_fpu_context_save( XPTR( local_cxy , core->fpu_owner ) ); 146 147 // restore FPU registers from requesting thread context 148 hal_fpu_context_restore( this->fpu_context ); 149 150 // attach the FPU to the requesting thread 151 core->fpu_owner = this; 145 152 } 146 153 } 147 148 // attach the FPU to the requesting thread 149 hal_fpu_context_restore( this->fpu_context ); 150 core->fpu_owner = this; 154 else 155 { 156 // restore FPU registers from requesting thread context 157 hal_fpu_context_restore( this->fpu_context ); 158 159 // attach the FPU to the requesting thread 160 core->fpu_owner = this; 161 } 151 162 152 163 return EXCP_NON_FATAL; … … 206 217 uint32_t cycle = (uint32_t)hal_get_cycles(); 207 218 if( DEBUG_HAL_EXCEPTIONS < cycle ) 208 printk("\n[DBG] %s : thread %x enter / is_ins %d / %s / vaddr %x / cycle %d\n",209 __FUNCTION__, this , is_ins, hal_mmu_exception_str(excp_code), bad_vaddr, cycle);219 printk("\n[DBG] %s : thread %x in process %x enter / is_ins %d / %s / vaddr %x / cycle %d\n", 220 __FUNCTION__, this->trdid, process->pid, is_ins, hal_mmu_exception_str(excp_code), bad_vaddr, cycle); 210 221 #endif 211 222 … … 235 246 cycle = (uint32_t)hal_get_cycles(); 236 247 if( DEBUG_HAL_EXCEPTIONS < cycle ) 237 printk("\n[DBG] %s : thread %x exit / page-fault handled for vaddr = %x\n",238 __FUNCTION__ , this, bad_vaddr );248 printk("\n[DBG] %s : thread %x in process %x exit / page-fault handled for vaddr = %x\n", 249 __FUNCTION__, this->trdid, process->pid, bad_vaddr ); 239 250 #endif 240 251 … … 275 286 cycle = (uint32_t)hal_get_cycles(); 276 287 if( DEBUG_HAL_EXCEPTIONS < cycle ) 277 printk("\n[DBG] %s : thread %x exit / copy-on-write handled for vaddr = %x\n",278 __FUNCTION__ , this, bad_vaddr );288 printk("\n[DBG] %s : thread %x in process %x exit / copy-on-write handled for vaddr = %x\n", 289 __FUNCTION__, this->trdid, process->pid, bad_vaddr ); 279 290 #endif 280 291 … … 300 311 { 301 312 assert( false , __FUNCTION__ , 302 "thread %x / core[%x,%d] / epc %x / vaddr %x / cycle %d\n", 303 this, local_cxy, this->core->lid, excPC, bad_vaddr, (uint32_t)hal_get_cycles() ); 313 "thread %x in process %x / core[%x,%d] / epc %x / vaddr %x / cycle %d\n", 314 this->trdid, this->process->pid, local_cxy, this->core->lid, 315 excPC, bad_vaddr, (uint32_t)hal_get_cycles() ); 304 316 305 317 return EXCP_KERNEL_PANIC; … … 398 410 uint32_t cycle = (uint32_t)hal_get_cycles(); 399 411 if( DEBUG_HAL_EXCEPTIONS < cycle ) 400 printk("\n[DBG] %s : thread %x enter / core[%x,%d] / pid %x/ epc %x / xcode %x / cycle %d\n",401 __FUNCTION__, this , local_cxy, this->core->lid, this->process->pid, excPC, excCode, cycle );412 printk("\n[DBG] %s : thread %x in process %x enter / core[%x,%d] / epc %x / xcode %x / cycle %d\n", 413 __FUNCTION__, this->trdid, this->process->pid, local_cxy, this->core->lid, excPC, excCode, cycle ); 402 414 #endif 403 415 … … 458 470 cycle = (uint32_t)hal_get_cycles(); 459 471 if( DEBUG_HAL_EXCEPTIONS < cycle ) 460 printk("\n[DBG] %s : thread %x exit / core[%x,%d] / pid %x/ epc %x / xcode %x / cycle %d\n",461 __FUNCTION__, this , local_cxy, this->core->lid, this->process->pid, excPC, excCode, cycle );472 printk("\n[DBG] %s : thread %x in process %x exit / core[%x,%d] / epc %x / xcode %x / cycle %d\n", 473 __FUNCTION__, this->trdid, this->process->pid, local_cxy, this->core->lid, excPC, excCode, cycle ); 462 474 #endif 463 475 -
trunk/hal/tsar_mips32/core/hal_gpt.c
r445 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_gpt.h> 26 26 #include <hal_special.h> -
trunk/hal/tsar_mips32/core/hal_interrupt.c
r435 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <kernel_config.h> -
trunk/hal/tsar_mips32/core/hal_irqmask.c
r285 r457 23 23 */ 24 24 25 #include <hal_types.h> 25 #include <hal_kernel_types.h> 26 #include <hal_shared_types.h> 26 27 27 28 ////////////////////////////////////////// -
trunk/hal/tsar_mips32/core/hal_ppm.c
r443 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_ppm.h> 27 27 #include <hal_special.h> -
trunk/hal/tsar_mips32/core/hal_remote.c
r313 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_irqmask.h> 27 27 -
trunk/hal/tsar_mips32/core/hal_special.c
r425 r457 23 23 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <core.h> -
trunk/hal/tsar_mips32/core/hal_switch.S
r408 r457 26 26 .global hal_do_cpu_switch 27 27 .global hal_do_cpu_save 28 .global hal_do_cpu_restore 28 29 29 30 .set noat … … 90 91 sw $27, 33*4($26) /* save c2_mode to slot 33 */ 91 92 93 sync 94 92 95 /* restore new thread context */ 93 96 … … 144 147 mtc2 $27, $1 /* restore c2_mode from slot 33 */ 145 148 mtc0 $26, $12 /* restore c0_sr from slot 34 */ 146 147 sync148 149 149 150 jr $31 /* return to caller */ … … 211 212 nop 212 213 214 #--------------------------------------------------------------------------------- 215 # The hal_do_cpu_restore()function makes the following assumption: 216 # - register $4 contains a pointer on the target thread context. 217 #--------------------------------------------------------------------------------- 218 hal_do_cpu_restore: 219 220 move $26, $4 /* $26 <= &context */ 221 222 lw $27, 0*4($26) 223 mtc0 $27, $14 /* restore C0_epc from slot 0 */ 224 225 lw $1, 1*4($26) 226 lw $2, 2*4($26) 227 lw $3, 3*4($26) 228 lw $4, 4*4($26) 229 lw $5, 5*4($26) 230 lw $6, 6*4($26) 231 lw $7, 7*4($26) 232 lw $8, 8*4($26) 233 lw $9, 9*4($26) 234 lw $10, 10*4($26) 235 lw $11, 11*4($26) 236 lw $12, 12*4($26) 237 lw $13, 13*4($26) 238 lw $14, 14*4($26) 239 lw $15, 15*4($26) 240 lw $16, 16*4($26) 241 lw $17, 17*4($26) 242 lw $18, 18*4($26) 243 lw $19, 19*4($26) 244 lw $20, 20*4($26) 245 lw $21, 21*4($26) 246 lw $22, 22*4($26) 247 lw $23, 23*4($26) 248 lw $24, 24*4($26) 249 lw $25, 25*4($26) 250 251 lw $27, 26*4($26) 252 mthi $27 /* restore hi from slot 26 */ 253 lw $27, 27*4($26) 254 mtlo $27 /* restore lo from slot 27 */ 255 256 lw $28, 28*4($26) 257 lw $29, 29*4($26) 258 lw $30, 30*4($26) 259 lw $31, 31*4($26) /* restore ra from slot 31 */ 260 261 lw $27, 32*4($26) 262 mtc2 $27, $0 /* restore c2_ptpr from slot 32 */ 263 264 lw $27, 35*4($26) 265 mtc0 $27, $4, 2 /* restore c0_th from slot 35 */ 266 267 lw $27, 33*4($26) 268 lw $26, 34*4($26) 269 270 mtc2 $27, $1 /* restore c2_mode from slot 33 */ 271 mtc0 $26, $12 /* restore c0_sr from slot 34 */ 272 273 jr $31 /* return to caller */ 274 nop 275 213 276 .set reorder 214 277 .set at -
trunk/hal/tsar_mips32/core/hal_syscall.c
r425 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_syscall.h> 26 26 #include <do_syscall.h> … … 48 48 enter_uzone = (uint32_t *)this->uzone_current; 49 49 50 //printk("\n@@@ enter %s : thread = %x / enter_uzone = %x / EPC = %x\n",51 //__FUNCTION__ , this , enter_uzone , enter_uzone[UZ_EPC] );52 53 50 // get syscall arguments from uzone 54 51 service_num = enter_uzone[UZ_V0]; … … 71 68 exit_uzone = (uint32_t *)this->uzone_current; 72 69 73 //printk("\n@@@ exit %s : thread = %x / exit_uzone = %x / EPC = %x\n",74 //__FUNCTION__ , this , exit_uzone , exit_uzone[UZ_EPC] );75 76 70 // set return value to uzone 77 71 exit_uzone[UZ_V0] = retval; -
trunk/hal/tsar_mips32/core/hal_uspace.c
r425 r457 25 25 #include <errno.h> 26 26 #include <vmm.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <hal_uspace.h> 29 29 #include <hal_irqmask.h> -
trunk/hal/tsar_mips32/core/hal_vmm.c
r411 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_vmm.h> 27 27 #include <hal_gpt.h> -
trunk/hal/tsar_mips32/drivers/soclib_pic.c
r451 r457 137 137 #endif 138 138 139 // analyse status and handle up to 3 pending IRQ (one WTI, one HWI, one PTI)139 // analyse status and handle up to 3 pending IRQs (one WTI, one HWI, one PTI) 140 140 141 141 if( wti_status ) // pending WTI … … 150 150 #if DEBUG_HAL_IRQS 151 151 if (DEBUG_HAL_IRQS < cycle ) 152 printk("\n[DBG] %s : core[%x,%d] received anIPI\n", __FUNCTION__ , local_cxy , core->lid );152 printk("\n[DBG] %s : core[%x,%d] handling IPI\n", __FUNCTION__ , local_cxy , core->lid ); 153 153 #endif 154 154 // acknowledge IRQ (this require an XCU read) … … 156 156 157 157 // check RPC FIFO, and activate or create a RPC thread 158 // condition is always true, but we must use the ack value 158 // condition is always true, but we use the ack value 159 // to avoid a GCC warning 159 160 if( ack + 1 ) rpc_check(); 160 161 } … … 182 183 #if DEBUG_HAL_IRQS 183 184 if (DEBUG_HAL_IRQS < cycle ) 184 printk("\n[DBG] %s : core[%x,%d] receivedexternal WTI %d\n",185 printk("\n[DBG] %s : core[%x,%d] handling external WTI %d\n", 185 186 __FUNCTION__ , local_cxy , core->lid , index ); 186 187 #endif … … 216 217 #if DEBUG_HAL_IRQS 217 218 if (DEBUG_HAL_IRQS < cycle ) 218 printk("\n[DBG] %s : core[%x,%d] receivedHWI %d\n",219 printk("\n[DBG] %s : core[%x,%d] handling HWI %d\n", 219 220 __FUNCTION__ , local_cxy , core->lid , index ); 220 221 #endif … … 232 233 #if DEBUG_HAL_IRQS 233 234 if (DEBUG_HAL_IRQS < cycle ) 234 printk("\n[DBG] %s : core[%x,%d] receivedPTI %d\n",235 printk("\n[DBG] %s : core[%x,%d] handling PTI %d\n", 235 236 __FUNCTION__ , core->lid , local_cxy , index ); 236 237 #endif … … 239 240 240 241 // execute all actions related to TICK event 241 // condition is always true, but we must use the ack value 242 // condition is always true, but we use the ack value 243 // to avoid a GCC warning 242 244 if( ack + 1 ) core_clock( core ); 243 245 } … … 515 517 { 516 518 // calling core local index 517 lid_t lid = CURRENT_ CORE->lid;519 lid_t lid = CURRENT_THREAD->core->lid; 518 520 519 521 // get XCU segment base … … 533 535 { 534 536 // calling core local index 535 lid_t lid = CURRENT_ CORE->lid;537 lid_t lid = CURRENT_THREAD->core->lid; 536 538 537 539 // get XCU segment base -
trunk/hal/tsar_mips32/drivers/soclib_tty.c
r451 r457 272 272 xptr_t parent_main_xp; // local pointer on parent process main thread 273 273 274 // get TXT chdev channel, direction and server thread274 // get TXT chdev channel, direction, server thread, and server core 275 275 channel = chdev->channel; 276 276 is_rx = chdev->is_rx; … … 455 455 thread_unblock( XPTR( local_cxy , server ) , THREAD_BLOCKED_ISR ); 456 456 457 // send IPI to core running server thread 458 dev_pic_send_ipi( local_cxy , server_lid ); 457 // send IPI to core running server thread if required 458 if( server_lid != CURRENT_THREAD->core->lid ) 459 { 460 dev_pic_send_ipi( local_cxy , server_lid ); 461 } 459 462 } 460 463 else … … 501 504 thread_unblock( XPTR( local_cxy , server ) , THREAD_BLOCKED_ISR ); 502 505 503 // send IPI to core running server thread 504 dev_pic_send_ipi( local_cxy , server_lid ); 506 // send IPI to core running server thread if required 507 if( server_lid != CURRENT_THREAD->core->lid ) 508 { 509 dev_pic_send_ipi( local_cxy , server_lid ); 510 } 505 511 506 512 } // end TX -
trunk/hal/tsar_mips32/drivers/soclib_tty.h
r436 r457 2 2 * soclib_tty.c - soclib tty driver definition. 3 3 * 4 * Author Alain Greiner (2016 )4 * Author Alain Greiner (2016,2017,2018) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 29 29 /**************************************************************************************** 30 30 * This driver supports the vci_tty_tsar component. 31 * It implements the generic TXT device API:31 * Regarding read/write request, it implements the generic TXT device API: 32 32 * - transfer one single character from TTY to command "buffer" if to_mem is non-zero. 33 33 * - transfer "count" characters from command "buffer" to TTY if "to_mem is zero. 34 * It handles asynchronous control characters (^C / ^Z), that are translated to signals 35 * transmited to the TXT owner process (foreground process). 34 36 ***************************************************************************************/ 35 37 … … 101 103 /**************************************************************************************** 102 104 * This ISR is executed to handle both the TTY_TX_IRQ and the TTY_RX_IRQ, even if 103 * The RX_IRQ is activated as soon as the TTY_STATUS_RX_FULL bit is 1 in the 105 * there is two different channel devices for TX and RX transfers. 106 * 107 * As the <chdev> argument is a local pointer, this ISR is always executed by a core 108 * that is in the same cluster as the core running the DEV server thread. 109 * 110 * - The RX_IRQ is activated as soon as the TTY_STATUS_RX_FULL bit is 1 in the 104 111 * TTY_STATUS register, when the TTY_RX_IRQ_ENABLE is non zero, indicating that 105 112 * the TTY_READ buffer is full and can be read. 106 * 113 * - The TX_IRQ is activated as soon as the TTY_STATUS_TX_FULL bit is 0 in the 107 114 * TTY_STATUS register, when the TTY_TX_IRQ_ENABLE is non zero, indicating that 108 115 * the TTY_WRITE buffer is empty, and can be written. 109 * WARNING : In ALMOS-MKH, the RX_IRQ is always enabled to catch the control signals, 116 * 117 * The RX_IRQ is always enabled to catch the control characters (^Z / ^C), 110 118 * but the TX_IRQ is dynamically enabled by the TXT_WRITE command, and disabled when 111 119 * the command is completed. 112 120 * 113 * 1) The ISR first read the TTY_STATUS to get the current state of the TTY_READ and 114 * the TTY_WRITE buffers. 121 * For normal characters The ISR uses two private TTY_RX and TTY_TX software FIFOs 122 * (two FIFOs per channel) to communicates with the DEV server thread executing the 123 * soclib_tty_cmd() function. 124 125 * For an RX transfer, this ISR executes a while loop moving bytes until the source 126 * TTY_READ buffer is empty: 127 * 1) The ISR read one byte from the TTY_READ register and acknowledge the RX_IRQ. 128 * 2) if the byte is a ^Z character, it uses a multicast RPC to block all treads of 129 * the TXT owner process, and transfer TXT ownership to another process of the group. 130 * 3) if the byte is a ^C character, it removes the process from the TXT group, and send 131 * a multicast RPC to delete all threads of the TXT owner process. 132 * 4) if the byte is a normal character and the destination TTY_RX_FIFO is not full, 133 * it writes the byte to this FIFO, unblock the TXT_RX server thread, and send an IPI 134 * to this server thread (only if it is running on another core than the ISR). 135 * 5) It discards the byte if the TTY_RX_FIFO is full, with a warning message on TXT0. 115 136 * 116 * 2) It try to read the first command registered in the server thread queue associated 117 * to the TTY channel 118 * 119 * 2) The ISR handles the RX when the TTY_READ buffer is full : 120 * . it read the available character from the TTY_READ buffer, and this 121 * acknowledges the RX_IRQ. 122 * . if it is a control character ( ^C / ^D / ^Z ) it translate it to the proper 123 * signal and execute the relevant sigaction for the foreground process. 124 * . if it is a normal character, it try to get the first command registered in the 125 * server thread queue. If it is a TXT_READ, it returns this character to the 126 * command buffer in the client thread. 127 * 128 * 3) The ISR handles the TX when the TTY_WRITE buffer is empty and a TXT_WRITE 129 * . it try to get it copies the 130 * character to the command buffer, acknowledges the TTY_RX_IRQ, and unblock the 131 * associated server thread. 132 133 * . the control characters ^C / ^D / ^Z are directly handled by the ISR and 134 * translated to the foreground process. 135 136 * - the 137 the TXT_READ and TXT_WRITE commands. 138 * It gets the command arguments from the first client thread in the TXT chdev queue: 139 * - if TXT_READ, it transfers one byte from the TTY_READ_REG to the command buffer. 140 * It simply returns for retry if TTY_READ_REG is empty. 141 * - if TXT_WRITE, it tries to transfer several bytes from the command buffer to the 142 * TTY_WRITE_REG. If the TTY_WRITE_REG is full, it updates the "count" and "buffer" 143 * command arguments and returns for retry. 144 * When the I/O operation is completed, it sets the status field in the command, unblocks 145 * the server thread, and unblocks the client thread. 137 * For a TX transfer, this ISR executes a while loop moving bytes until the source 138 * TTY_TX_FIFO is empty: 139 * 1) if the destination TTY_WRITE register is not full, it moves the byte from the 140 * TTY_TX_FIFO to the TTY_WRITE register. 141 * 2) if the TTY_WRITE register is full, it polls (busy waiting) the TTY_STATUS register, 142 * until the TTY_WRITE register is empty. 143 * 3) when the source TTY_TX_FIFO is empty, this ISR disable the TTY_TX_IRQ, unblock 144 * the TXT_TX server thread, and send an IPI to this server thread (only if it is 145 * running on another core than the ISR). 146 146 **************************************************************************************** 147 147 * @ chdev : local pointer on TXT chdev descriptor. -
trunk/hal/x86_64/Makefile
r444 r457 72 72 drivers/%.h \ 73 73 $(KERNEL)/kernel_config.h \ 74 core/hal_ types.h74 core/hal_kernel_types.h 75 75 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 76 76 … … 80 80 $(HAL)/generic/%.h \ 81 81 $(KERNEL)/kernel_config.h \ 82 core/hal_ types.h82 core/hal_kernel_types.h 83 83 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 84 84 … … 88 88 core/hal_segmentation.h \ 89 89 $(KERNEL)/kernel_config.h \ 90 core/hal_ types.h90 core/hal_kernel_types.h 91 91 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 92 92 … … 96 96 core/hal_segmentation.h \ 97 97 $(KERNEL)/kernel_config.h \ 98 core/hal_ types.h98 core/hal_kernel_types.h 99 99 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 100 100 … … 107 107 core/hal_internal.h \ 108 108 $(KERNEL)/kernel_config.h \ 109 core/hal_ types.h109 core/hal_kernel_types.h 110 110 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 111 111 … … 114 114 core/hal_segmentation.h \ 115 115 $(KERNEL)/kernel_config.h \ 116 core/hal_ types.h116 core/hal_kernel_types.h 117 117 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 118 118 … … 121 121 core/hal_boot.h \ 122 122 $(KERNEL)/kernel_config.h \ 123 core/hal_ types.h123 core/hal_kernel_types.h 124 124 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 125 125 … … 127 127 core/hal_acpi.h \ 128 128 $(KERNEL)/kernel_config.h \ 129 core/hal_ types.h129 core/hal_kernel_types.h 130 130 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 131 131 … … 133 133 core/hal_apic.h \ 134 134 $(KERNEL)/kernel_config.h \ 135 core/hal_ types.h135 core/hal_kernel_types.h 136 136 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 137 137 138 138 $(HAL_ARCH)/build/core/x86_printf.o: core/x86_printf.c \ 139 139 $(KERNEL)/kernel_config.h \ 140 core/hal_ types.h140 core/hal_kernel_types.h 141 141 $(CC) $(HAL_INCLUDE) $(CFLAGS) -c -o $@ $< 142 142 -
trunk/hal/x86_64/core/hal_acpi.c
r348 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_boot.h> 24 24 #include <hal_acpi.h> -
trunk/hal/x86_64/core/hal_apic.c
r327 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_boot.h> 24 24 #include <hal_register.h> -
trunk/hal/x86_64/core/hal_atomic.c
r234 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_internal.h> 24 24 -
trunk/hal/x86_64/core/hal_context.c
r368 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <memcpy.h> 24 24 #include <thread.h> -
trunk/hal/x86_64/core/hal_drivers.c
r346 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <chdev.h> 24 24 #include <hal_drivers.h> -
trunk/hal/x86_64/core/hal_exception.c
r403 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_irqmask.h> 24 24 #include <hal_exception.h> -
trunk/hal/x86_64/core/hal_gpt.c
r408 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_boot.h> /* XXX */ 24 24 #include <hal_gpt.h> -
trunk/hal/x86_64/core/hal_init.c
r365 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_boot.h> 24 24 #include <hal_multiboot.h> -
trunk/hal/x86_64/core/hal_interrupt.c
r344 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <kernel_config.h> 24 24 #include <thread.h> -
trunk/hal/x86_64/core/hal_irqmask.c
r370 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_internal.h> 24 24 #include <hal_segmentation.h> -
trunk/hal/x86_64/core/hal_ppm.c
r407 r457 21 21 22 22 #include <kernel_config.h> 23 #include <hal_ types.h>23 #include <hal_kernel_types.h> 24 24 #include <hal_ppm.h> 25 25 #include <hal_special.h> -
trunk/hal/x86_64/core/hal_remote.c
r314 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_internal.h> 24 24 -
trunk/hal/x86_64/core/hal_special.c
r371 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_apic.h> 24 24 #include <hal_special.h> -
trunk/hal/x86_64/core/hal_syscall.c
r145 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_syscall.h> 26 26 #include <do_syscall.h> -
trunk/hal/x86_64/core/hal_types.h
r407 r457 1 1 /* 2 * hal_ types.h - common kernel types for x86_642 * hal_kernel_types.h - common kernel types for x86_64 3 3 * 4 4 * Author Alain Greiner (2016) -
trunk/hal/x86_64/core/hal_uspace.c
r407 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <hal_irqmask.h> -
trunk/hal/x86_64/core/x86_printf.c
r242 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <hal_boot.h> 24 24 #include <hal_internal.h> -
trunk/hal/x86_64/drivers/ioc_ata.h
r215 r457 24 24 25 25 #include <chdev.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 28 28 void ioc_ata_init(chdev_t *chdev); -
trunk/hal/x86_64/drivers/pic_apic.c
r404 r457 20 20 */ 21 21 22 #include <hal_ types.h>22 #include <hal_kernel_types.h> 23 23 #include <chdev.h> 24 24 #include <pic_apic.h> -
trunk/hal/x86_64/drivers/pic_apic.h
r280 r457 23 23 #define _PIC_APIC_H_ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 27 27 void pic_apic_init(chdev_t *pic); -
trunk/kernel/Makefile
r444 r457 177 177 build/syscalls/sys_thread_wakeup.o \ 178 178 build/syscalls/sys_trace.o \ 179 build/syscalls/sys_fg.o 179 build/syscalls/sys_fg.o \ 180 build/syscalls/sys_is_fg.o 180 181 181 182 VFS_OBJS = build/fs/vfs.o \ … … 228 229 kern/%.h \ 229 230 kernel_config.h \ 230 $(HAL_ARCH)/core/hal_ types.h231 $(HAL_ARCH)/core/hal_kernel_types.h 231 232 $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $< 232 233 … … 237 238 devices/%.h \ 238 239 kernel_config.h \ 239 $(HAL_ARCH)/core/hal_ types.h240 $(HAL_ARCH)/core/hal_kernel_types.h 240 241 $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $< 241 242 … … 245 246 mm/%.h \ 246 247 kernel_config.h \ 247 $(HAL_ARCH)/core/hal_ types.h248 $(HAL_ARCH)/core/hal_kernel_types.h 248 249 $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $< 249 250 … … 253 254 libk/%.h \ 254 255 kernel_config.h \ 255 $(HAL_ARCH)/core/hal_ types.h256 $(HAL_ARCH)/core/hal_kernel_types.h 256 257 $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $< 257 258 … … 261 262 syscalls/syscalls.h \ 262 263 kernel_config.h \ 263 $(HAL_ARCH)/core/hal_ types.h264 $(HAL_ARCH)/core/hal_kernel_types.h 264 265 $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $< 265 266 … … 269 270 fs/%.h \ 270 271 kernel_config.h \ 271 $(HAL_ARCH)/core/hal_ types.h272 $(HAL_ARCH)/core/hal_kernel_types.h 272 273 $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $< 273 274 -
trunk/kernel/devices/dev_dma.c
r437 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <chdev.h> -
trunk/kernel/devices/dev_dma.h
r437 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <spinlock.h> 30 30 -
trunk/kernel/devices/dev_fbf.c
r440 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_gpt.h> 27 27 #include <thread.h> -
trunk/kernel/devices/dev_fbf.h
r188 r457 25 25 #define _DEV_FBF_H 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 /**** Forward declarations ****/ -
trunk/kernel/devices/dev_iob.c
r422 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <remote_spinlock.h> -
trunk/kernel/devices/dev_iob.h
r346 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <spinlock.h> 30 30 -
trunk/kernel/devices/dev_ioc.c
r440 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_gpt.h> 27 27 #include <hal_drivers.h> -
trunk/kernel/devices/dev_ioc.h
r437 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 /**** Forward declarations ****/ -
trunk/kernel/devices/dev_mmc.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <hal_drivers.h> -
trunk/kernel/devices/dev_mmc.h
r440 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <spinlock.h> 30 30 -
trunk/kernel/devices/dev_nic.c
r438 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <printk.h> -
trunk/kernel/devices/dev_nic.h
r437 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 /***************************************************************************************** -
trunk/kernel/devices/dev_pic.c
r438 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <chdev.h> … … 179 179 uint32_t cycle = (uint32_t)hal_get_cycles(); 180 180 if( DEBUG_DEV_PIC < cycle ) 181 printk("\n[DBG] %s : src_core[%x,%d] / dst_core[%x,%d] / cycle %d\n",182 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, cxy, lid, cycle );181 printk("\n[DBG] %s : thread %x in process %x / tgt_core[%x,%d] / cycle %d\n", 182 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, cxy, lid, cycle ); 183 183 #endif 184 184 -
trunk/kernel/devices/dev_pic.h
r437 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 /***************************************************************************************** -
trunk/kernel/devices/dev_txt.c
r438 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <hal_remote.h> -
trunk/kernel/devices/dev_txt.h
r435 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <xlist.h> 30 30 #include <remote_spinlock.h> -
trunk/kernel/fs/devfs.c
r438 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <hal_uspace.h> … … 99 99 #endif 100 100 101 // creates DEVFS "dev" inode in cluster IO102 error = vfs_add_child_in_parent( LOCAL_CLUSTER->io_cxy,101 // creates DEVFS "dev" inode in cluster 0 102 error = vfs_add_child_in_parent( 0, // cxy 103 103 INODE_TYPE_DIR, 104 104 FS_TYPE_DEVFS, … … 115 115 #endif 116 116 117 // create DEVFS "external" inode in cluster IO118 error = vfs_add_child_in_parent( LOCAL_CLUSTER->io_cxy,117 // create DEVFS "external" inode in cluster 0 118 error = vfs_add_child_in_parent( 0, // cxy 119 119 INODE_TYPE_DIR, 120 120 FS_TYPE_DEVFS, -
trunk/kernel/fs/fatfs.c
r440 r457 23 23 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <printk.h> -
trunk/kernel/fs/fatfs.h
r407 r457 26 26 #define _FATFS_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <rwlock.h> 30 30 #include <vfs.h> -
trunk/kernel/fs/ramfs.c
r188 r457 24 24 25 25 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <printk.h> -
trunk/kernel/fs/vfs.c
r441 r457 25 25 26 26 #include <kernel_config.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <hal_atomic.h> 29 29 #include <hal_special.h> -
trunk/kernel/fs/vfs.h
r437 r457 27 27 28 28 #include <kernel_config.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <hal_atomic.h> 31 31 #include <remote_rwlock.h> -
trunk/kernel/kern/chdev.c
r450 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <hal_remote.h> … … 127 127 xptr_t server_xp; // extended pointer on server thread 128 128 core_t * core_ptr; // local pointer on core running the server thread 129 uint32_t lid;// core running the server thread local index129 uint32_t server_lid; // core running the server thread local index 130 130 xptr_t lock_xp; // extended pointer on lock protecting the chdev queue 131 uint32_t different; // non zero if server thread core != client thread core132 131 uint32_t save_sr; // for critical section 133 132 … … 154 153 155 154 // get server core local index 156 lid = hal_remote_lw( XPTR( chdev_cxy , &core_ptr->lid ) );155 server_lid = hal_remote_lw( XPTR( chdev_cxy , &core_ptr->lid ) ); 157 156 158 157 #if (DEBUG_CHDEV_CMD_RX || DEBUG_CHDEV_CMD_TX) … … 210 209 #endif 211 210 211 #if (DEBUG_CHDEV_CMD_RX & 1) 212 if( (is_rx) && (DEBUG_CHDEV_CMD_RX < rx_cycle) ) 213 printk("\n[DBG] in %s : client thread %x blocked\n", __FUNCTION__, this ); 214 #endif 215 212 216 // unblock server thread if required 213 217 if( hal_remote_lw( blocked_xp ) & THREAD_BLOCKED_IDLE ) … … 216 220 #if (DEBUG_CHDEV_CMD_TX & 1) 217 221 if( (is_rx == 0) && (DEBUG_CHDEV_CMD_TX < tx_cycle) ) 218 { 219 printk("\n[DBG] in %s : server thread %x unblocked\n", __FUNCTION__, server_ptr ); 220 chdev_queue_display( chdev_xp ); 221 } 222 printk("\n[DBG] in %s : TX server thread %x unblocked\n", __FUNCTION__, server_ptr ); 223 #endif 224 225 #if (DEBUG_CHDEV_CMD_RX & 1) 226 if( (is_rx) && (DEBUG_CHDEV_CMD_RX < rx_cycle) ) 227 printk("\n[DBG] in %s : RX server thread %x unblocked\n", __FUNCTION__, server_ptr ); 222 228 #endif 223 229 … … 227 233 #if (DEBUG_CHDEV_CMD_TX & 1) 228 234 if( (is_rx == 0) && (DEBUG_CHDEV_CMD_TX < tx_cycle) ) 229 {230 235 printk("\n[DBG] in %s : thread %x registered write request in chdev\n", __FUNCTION__, this ); 231 chdev_queue_display( chdev_xp ); 232 } 236 #endif 237 238 #if (DEBUG_CHDEV_CMD_RX & 1) 239 if( (is_rx) && (DEBUG_CHDEV_CMD_RX < rx_cycle) ) 240 printk("\n[DBG] in %s : thread %x registered read request in chdev\n", __FUNCTION__, this ); 233 241 #endif 234 242 235 243 // send IPI to core running the server thread when server != client 236 different = (lid != this->core->lid) || (local_cxy != chdev_cxy); 237 if( different ) 238 { 239 dev_pic_send_ipi( chdev_cxy , lid ); 240 244 if( (server_lid != this->core->lid) || (local_cxy != chdev_cxy) ) 245 { 246 dev_pic_send_ipi( chdev_cxy , server_lid ); 247 241 248 #if (DEBUG_CHDEV_CMD_TX & 1) 242 249 if( (is_rx == 0) && (DEBUG_CHDEV_CMD_TX < tx_cycle) ) 243 printk("\n[DBG] in %s : client thread %x sent IPI to server thread %x\n", 250 printk("\n[DBG] in %s : client thread %x sent IPI to TX server thread %x\n", 251 __FUNCTION__, this, server_ptr ); 252 #endif 253 254 #if (DEBUG_CHDEV_CMD_RX & 1) 255 if( (is_rx) && (DEBUG_CHDEV_CMD_RX < rx_cycle) ) 256 printk("\n[DBG] in %s : client thread %x sent IPI to RX server thread %x\n", 244 257 __FUNCTION__, this, server_ptr ); 245 258 #endif -
trunk/kernel/kern/chdev.h
r450 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <xlist.h> 30 30 #include <remote_spinlock.h> -
trunk/kernel/kern/cluster.c
r456 r457 123 123 124 124 #if( DEBUG_CLUSTER_INIT & 1 ) 125 uint32_tcycle = (uint32_t)hal_get_cycles();125 cycle = (uint32_t)hal_get_cycles(); 126 126 if( DEBUG_CLUSTER_INIT < cycle ) 127 127 printk("\n[DBG] %s : KHM initialized in cluster %x at cycle %d\n", … … 133 133 134 134 #if( DEBUG_CLUSTER_INIT & 1 ) 135 uint32_tcycle = (uint32_t)hal_get_cycles();135 cycle = (uint32_t)hal_get_cycles(); 136 136 if( DEBUG_CLUSTER_INIT < cycle ) 137 137 printk("\n[DBG] %s : KCM initialized in cluster %x at cycle %d\n", -
trunk/kernel/kern/cluster.h
r443 r457 28 28 29 29 #include <kernel_config.h> 30 #include <hal_ types.h>30 #include <hal_kernel_types.h> 31 31 #include <bits.h> 32 32 #include <spinlock.h> -
trunk/kernel/kern/core.c
r443 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <errno.h> -
trunk/kernel/kern/core.h
r443 r457 27 27 28 28 #include <kernel_config.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <list.h> 31 31 #include <rpc.h> … … 65 65 } 66 66 core_t; 67 68 /****************************************************************************************69 * This macro returns a pointer on the calling core descriptor.70 ***************************************************************************************/71 72 #define CURRENT_CORE (CURRENT_THREAD->core)73 67 74 68 /*************************************************************************************** -
trunk/kernel/kern/do_interrupt.c
r248 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <kernel_config.h> 26 26 #include <thread.h> -
trunk/kernel/kern/do_interrupt.h
r16 r457 27 27 #define _DO_INTERRUPT_H_ 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <thread.h> 31 31 -
trunk/kernel/kern/do_syscall.c
r443 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_irqmask.h> 26 26 #include <do_syscall.h> … … 102 102 sys_trace, // 47 103 103 sys_fg, // 48 104 sys_ undefined,// 49104 sys_is_fg, // 49 105 105 }; 106 106 … … 160 160 else if( index == SYS_TRACE ) return "TRACE"; // 47 161 161 else if( index == SYS_FG ) return "FG"; // 48 162 else if( index == SYS_IS_FG ) return "IS_FG"; // 49 162 163 163 164 else return "undefined"; -
trunk/kernel/kern/do_syscall.h
r408 r457 27 27 #define _D0_SYSCALL_H_ 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <thread.h> 31 31 -
trunk/kernel/kern/dqdt.c
r438 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <hal_atomic.h> -
trunk/kernel/kern/dqdt.h
r438 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <hal_atomic.h> 30 30 -
trunk/kernel/kern/kernel_init.c
r443 r457 25 25 #include <kernel_config.h> 26 26 #include <errno.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <hal_special.h> 29 29 #include <hal_context.h> … … 186 186 " /_/ \\_\\ |______| |_| |_| \\_____/ |______/ |_| |_| |_| \\_\\ |_| |_| \n" 187 187 "\n\n\t\t Advanced Locality Management Operating System / Multi Kernel Hybrid\n" 188 "\n\n\t\t Version 0.0 / %d cluster(s) / %d core(s) per cluster / cycle %d\n\n",189 nclusters , ncores , hal_time_stamp());188 "\n\n\t\t %s / %d cluster(s) / %d core(s) per cluster\n\n", 189 CONFIG_ALMOS_VERSION , nclusters , ncores ); 190 190 } 191 191 … … 761 761 reg_t status; // running core status register 762 762 763 cxy_t io_cxy = info->io_cxy;764 765 assert( (io_cxy == ((info->x_size - 1)<<(info->y_width)) + (info->y_size - 1)) ,766 __FUNCTION__ , "illegal IO cluter identifier\n" );767 768 763 ///////////////////////////////////////////////////////////////////////////////// 769 764 // STEP 0 : Each core get its core identifier from boot_info, and makes … … 796 791 thread->remote_locks = 0; 797 792 798 // CP0 in I/O clusterinitialises TXT0 chdev descriptor799 if( (core_lid == 0) && (core_cxy == io_cxy) ) txt0_device_init( info );800 801 ///////////////////////////////////////////////////////////////////////////////// 802 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),793 // CP0 in cluster 0 initialises TXT0 chdev descriptor 794 if( (core_lid == 0) && (core_cxy == 0) ) txt0_device_init( info ); 795 796 ///////////////////////////////////////////////////////////////////////////////// 797 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 803 798 (info->x_size * info->y_size) ); 804 799 barrier_wait( &local_barrier , info->cores_nr ); … … 838 833 839 834 ///////////////////////////////////////////////////////////////////////////////// 840 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),835 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 841 836 (info->x_size * info->y_size) ); 842 837 barrier_wait( &local_barrier , info->cores_nr ); … … 865 860 866 861 //////////////////////////////////////////////////////////////////////////////// 867 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),862 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 868 863 (info->x_size * info->y_size) ); 869 864 barrier_wait( &local_barrier , info->cores_nr ); … … 898 893 899 894 ///////////////////////////////////////////////////////////////////////////////// 900 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),895 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 901 896 (info->x_size * info->y_size) ); 902 897 barrier_wait( &local_barrier , info->cores_nr ); … … 926 921 927 922 // all cores initialize the idle thread descriptor 928 error = thread_idle_init( thread, 929 THREAD_IDLE, 930 &thread_idle_func, 931 NULL, 932 core_lid ); 933 if( error ) 934 { 935 assert( false , __FUNCTION__ , 936 "core[%x][%d] cannot initialize idle thread", local_cxy , core_lid ); 937 } 923 thread_idle_init( thread, 924 THREAD_IDLE, 925 &thread_idle_func, 926 NULL, 927 core_lid ); 938 928 939 929 // all cores unblock idle thread, and register it in scheduler … … 1008 998 1009 999 ///////////////////////////////////////////////////////////////////////////////// 1010 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),1000 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 1011 1001 (info->x_size * info->y_size) ); 1012 1002 barrier_wait( &local_barrier , info->cores_nr ); … … 1069 1059 1070 1060 ///////////////////////////////////////////////////////////////////////////////// 1071 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),1061 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 1072 1062 (info->x_size * info->y_size) ); 1073 1063 barrier_wait( &local_barrier , info->cores_nr ); … … 1076 1066 #if DEBUG_KERNEL_INIT 1077 1067 if( (core_lid == 0) & (local_cxy == 0) ) 1078 printk("\n[DBG] %s : exit barrier 5 : VFS_root = %l in cluster %x/ cycle %d\n",1079 __FUNCTION__, vfs_root_inode_xp , io_cxy ,(uint32_t)hal_get_cycles());1068 printk("\n[DBG] %s : exit barrier 5 : VFS_root = %l in cluster 0 / cycle %d\n", 1069 __FUNCTION__, vfs_root_inode_xp , (uint32_t)hal_get_cycles()); 1080 1070 #endif 1081 1071 … … 1086 1076 ///////////////////////////////////////////////////////////////////////////////// 1087 1077 1088 if( (core_lid == 0) && (local_cxy == io_cxy) )1078 if( (core_lid == 0) && (local_cxy == 0) ) 1089 1079 { 1090 1080 // create "dev" and "external" directories. … … 1104 1094 1105 1095 ///////////////////////////////////////////////////////////////////////////////// 1106 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),1096 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 1107 1097 (info->x_size * info->y_size) ); 1108 1098 barrier_wait( &local_barrier , info->cores_nr ); … … 1111 1101 #if DEBUG_KERNEL_INIT 1112 1102 if( (core_lid == 0) & (local_cxy == 0) ) 1113 printk("\n[DBG] %s : exit barrier 6 : dev_root = %l in cluster %x/ cycle %d\n",1114 __FUNCTION__, devfs_dev_inode_xp , io_cxy ,(uint32_t)hal_get_cycles() );1103 printk("\n[DBG] %s : exit barrier 6 : dev_root = %l in cluster 0 / cycle %d\n", 1104 __FUNCTION__, devfs_dev_inode_xp , (uint32_t)hal_get_cycles() ); 1115 1105 #endif 1116 1106 … … 1125 1115 if( core_lid == 0 ) 1126 1116 { 1127 // get extended pointer on "extend" field of VFS context for DEVFS in cluster IO1128 xptr_t extend_xp = XPTR( io_cxy, &fs_context[FS_TYPE_DEVFS].extend );1129 1130 // get pointer on DEVFS context in cluster IO1117 // get extended pointer on "extend" field of VFS context for DEVFS in cluster 0 1118 xptr_t extend_xp = XPTR( 0 , &fs_context[FS_TYPE_DEVFS].extend ); 1119 1120 // get pointer on DEVFS context in cluster 0 1131 1121 devfs_ctx_t * devfs_ctx = hal_remote_lpt( extend_xp ); 1132 1122 1133 devfs_dev_inode_xp = hal_remote_lwd( XPTR( io_cxy , 1134 &devfs_ctx->dev_inode_xp ) ); 1135 devfs_external_inode_xp = hal_remote_lwd( XPTR( io_cxy , 1136 &devfs_ctx->external_inode_xp ) ); 1123 devfs_dev_inode_xp = hal_remote_lwd( XPTR( 0 , &devfs_ctx->dev_inode_xp ) ); 1124 devfs_external_inode_xp = hal_remote_lwd( XPTR( 0 , &devfs_ctx->external_inode_xp ) ); 1137 1125 1138 1126 // populate DEVFS in all clusters … … 1143 1131 1144 1132 ///////////////////////////////////////////////////////////////////////////////// 1145 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),1133 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 1146 1134 (info->x_size * info->y_size) ); 1147 1135 barrier_wait( &local_barrier , info->cores_nr ); … … 1158 1146 ///////////////////////////////////////////////////////////////////////////////// 1159 1147 1160 if( (core_lid == 1148 if( (core_lid == 0) && (local_cxy == 0) ) 1161 1149 { 1162 1150 … … 1169 1157 1170 1158 ///////////////////////////////////////////////////////////////////////////////// 1171 if( core_lid == 0 ) remote_barrier( XPTR( io_cxy, &global_barrier ),1159 if( core_lid == 0 ) remote_barrier( XPTR( 0 , &global_barrier ), 1172 1160 (info->x_size * info->y_size) ); 1173 1161 barrier_wait( &local_barrier , info->cores_nr ); … … 1189 1177 ///////////////////////////////////////////////////////////////////////////////// 1190 1178 1191 if( (core_lid == 0) && (local_cxy == io_cxy) )1179 if( (core_lid == 0) && (local_cxy == 0) ) 1192 1180 { 1193 1181 print_banner( (info->x_size * info->y_size) , info->cores_nr ); -
trunk/kernel/kern/printk.c
r446 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_irqmask.h> 26 26 #include <hal_special.h> -
trunk/kernel/kern/printk.h
r437 r457 41 41 #define _PRINTK_H 42 42 43 #include <hal_ types.h>43 #include <hal_kernel_types.h> 44 44 #include <stdarg.h> 45 45 -
trunk/kernel/kern/process.c
r450 r457 25 25 26 26 #include <kernel_config.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <hal_remote.h> 29 29 #include <hal_uspace.h> … … 89 89 void process_reference_init( process_t * process, 90 90 pid_t pid, 91 xptr_t parent_xp, 92 xptr_t model_xp ) 91 xptr_t parent_xp ) 93 92 { 94 93 cxy_t parent_cxy; 95 94 process_t * parent_ptr; 96 cxy_t model_cxy;97 process_t * model_ptr;98 95 xptr_t stdin_xp; 99 96 xptr_t stdout_xp; … … 110 107 chdev_t * chdev_ptr; 111 108 cxy_t chdev_cxy; 112 pid_t model_pid;113 109 pid_t parent_pid; 114 115 // get model process cluster and local pointer116 model_cxy = GET_CXY( model_xp );117 model_ptr = GET_PTR( model_xp );118 110 119 111 // get parent process cluster and local pointer … … 121 113 parent_ptr = GET_PTR( parent_xp ); 122 114 123 // get model_pid andparent_pid115 // get parent_pid 124 116 parent_pid = hal_remote_lw( XPTR( parent_cxy , &parent_ptr->pid ) ); 125 model_pid = hal_remote_lw( XPTR( model_cxy , &model_ptr->pid ) );126 117 127 118 #if DEBUG_PROCESS_REFERENCE_INIT 128 119 uint32_t cycle = (uint32_t)hal_get_cycles(); 129 120 if( DEBUG_PROCESS_REFERENCE_INIT ) 130 printk("\n[DBG] %s : thread %x enter / pid = %x / ppid = %x / model_pid =%x / cycle %d\n",131 __FUNCTION__ , CURRENT_THREAD , pid , parent_pid , model_pid , cycle );121 printk("\n[DBG] %s : thread %x in process %x enter to initalialize process %x / cycle %d\n", 122 __FUNCTION__, CURRENT_THREAD->trdid, parent_pid , pid , cycle ); 132 123 #endif 133 124 … … 146 137 cycle = (uint32_t)hal_get_cycles(); 147 138 if( DEBUG_PROCESS_REFERENCE_INIT ) 148 printk("\n[DBG] %s : thread %x / vmm empty for process %x / cycle %d\n",149 __FUNCTION__ , CURRENT_THREAD ,pid , cycle );139 printk("\n[DBG] %s : thread %x in process %x / vmm empty for process %x / cycle %d\n", 140 __FUNCTION__, CURRENT_THREAD->trdid, parent_pid , cycle ); 150 141 #endif 151 142 … … 154 145 155 146 // define the stdin/stdout/stderr pseudo files <=> select a TXT terminal. 156 // - if INIT (pid == 1) => link to kernel TXT[0] 157 // - if KSH[i] (model_pid == 1) => allocate a free TXT[i] 158 // - if USER process => same terminal as model 159 160 if( (pid == 1) || (model_pid == 1)) // INIT or KSH process 161 { 162 if (pid == 1 ) txt_id = 0; // INIT 163 else txt_id = process_txt_alloc(); // KSH[i] 164 165 // attach process to TXT[txt_id] 147 if( (pid == 1) || (parent_pid == 1)) // INIT or KSH process 148 { 149 // allocate a TXT channel 150 if( pid == 1 ) txt_id = 0; // INIT 151 else txt_id = process_txt_alloc(); // KSH 152 153 // attach process to TXT 166 154 process_txt_attach( process , txt_id ); 155 156 #if (DEBUG_PROCESS_REFERENCE_INIT & 1) 157 cycle = (uint32_t)hal_get_cycles(); 158 if( DEBUG_PROCESS_REFERENCE_INIT ) 159 printk("\n[DBG] %s : thread %x in process %x / process %x attached to TXT%d / cycle %d\n", 160 __FUNCTION__, CURRENT_THREAD->trdid, parent_pid, pid, txt_id, cycle ); 161 #endif 162 163 167 164 168 165 // build path to TXT_RX[i] and TXT_TX[i] chdevs … … 184 181 cycle = (uint32_t)hal_get_cycles(); 185 182 if( DEBUG_PROCESS_REFERENCE_INIT ) 186 printk("\n[DBG] %s : thread %x / stdin open for process %x / cycle %d\n",187 __FUNCTION__ , CURRENT_THREAD , pid, cycle );183 printk("\n[DBG] %s : thread %x in process %x / stdin open for process %x / cycle %d\n", 184 __FUNCTION__, CURRENT_THREAD->trdid, parent_pid, pid, cycle ); 188 185 #endif 189 186 … … 202 199 cycle = (uint32_t)hal_get_cycles(); 203 200 if( DEBUG_PROCESS_REFERENCE_INIT ) 204 printk("\n[DBG] %s : thread %x / stdout open for process %x / cycle %d\n",205 __FUNCTION__ , CURRENT_THREAD , pid, cycle );201 printk("\n[DBG] %s : thread %x in process %x / stdout open for process %x / cycle %d\n", 202 __FUNCTION__, CURRENT_THREAD->trdid, parent_pid, pid, cycle ); 206 203 #endif 207 204 … … 220 217 cycle = (uint32_t)hal_get_cycles(); 221 218 if( DEBUG_PROCESS_REFERENCE_INIT ) 222 printk("\n[DBG] %s : thread %x / stderr open for process %x / cycle %d\n",223 __FUNCTION__ , CURRENT_THREAD , pid, cycle );219 printk("\n[DBG] %s : thread %x in process %x / stderr open for process %x / cycle %d\n", 220 __FUNCTION__, CURRENT_THREAD->trdid, parent_pid, pid, cycle ); 224 221 #endif 225 222 … … 227 224 else // normal user process 228 225 { 229 // get extended pointer on stdin pseudo file in modelprocess230 file_xp = (xptr_t)hal_remote_lwd( XPTR( model_cxy , &model_ptr->fd_array.array[0] ) );231 232 // get extended pointer on modelprocess TXT chdev226 // get extended pointer on stdin pseudo file in parent process 227 file_xp = (xptr_t)hal_remote_lwd( XPTR( parent_cxy , &parent_ptr->fd_array.array[0] ) ); 228 229 // get extended pointer on parent process TXT chdev 233 230 chdev_xp = chdev_from_file( file_xp ); 234 231 … … 243 240 process_txt_attach( process , txt_id ); 244 241 245 // copy all open files from modelprocess fd_array to this process242 // copy all open files from parent process fd_array to this process 246 243 process_fd_remote_copy( XPTR( local_cxy , &process->fd_array ), 247 XPTR( model_cxy , &model_ptr->fd_array ) );244 XPTR( parent_cxy , &parent_ptr->fd_array ) ); 248 245 } 249 246 250 247 // initialize specific inodes root and cwd 251 process->vfs_root_xp = (xptr_t)hal_remote_lwd( XPTR( model_cxy,252 & model_ptr->vfs_root_xp ) );253 process->vfs_cwd_xp = (xptr_t)hal_remote_lwd( XPTR( model_cxy,254 & model_ptr->vfs_cwd_xp ) );248 process->vfs_root_xp = (xptr_t)hal_remote_lwd( XPTR( parent_cxy, 249 &parent_ptr->vfs_root_xp ) ); 250 process->vfs_cwd_xp = (xptr_t)hal_remote_lwd( XPTR( parent_cxy, 251 &parent_ptr->vfs_cwd_xp ) ); 255 252 vfs_inode_remote_up( process->vfs_root_xp ); 256 253 vfs_inode_remote_up( process->vfs_cwd_xp ); … … 469 466 //////////////////////////////////////// 470 467 void process_sigaction( pid_t pid, 471 uint32_t action_type )468 uint32_t type ) 472 469 { 473 470 cxy_t owner_cxy; // owner cluster identifier … … 479 476 xptr_t process_xp; // extended pointer on process copy 480 477 cxy_t process_cxy; // process copy cluster identifier 478 process_t * process_ptr; // local pointer on process copy 481 479 reg_t save_sr; // for critical section 482 480 rpc_desc_t rpc; // shared RPC descriptor 483 484 thread_t * client = CURRENT_THREAD; 481 thread_t * client; // pointer on client thread 482 xptr_t client_xp; // extended pointer on client thread 483 process_t * local; // pointer on process copy in local cluster 484 uint32_t remote_nr; // number of remote process copies 485 486 client = CURRENT_THREAD; 487 client_xp = XPTR( local_cxy , client ); 488 local = NULL; 489 remote_nr = 0; 485 490 486 491 #if DEBUG_PROCESS_SIGACTION 487 492 uint32_t cycle = (uint32_t)hal_get_cycles(); 488 493 if( DEBUG_PROCESS_SIGACTION < cycle ) 489 printk("\n[DBG] %s : thread %x enter to %s process %x / cycle %d\n", 490 __FUNCTION__ , client, process_action_str( action_type ) , pid , cycle ); 494 printk("\n[DBG] %s : thread %x in process %x enter to %s process %x / cycle %d\n", 495 __FUNCTION__ , client->trdid, client->process->pid, 496 process_action_str( type ) , pid , cycle ); 491 497 #endif 492 498 … … 503 509 504 510 // check action type 505 assert( (( action_type == DELETE_ALL_THREADS ) ||506 ( action_type == BLOCK_ALL_THREADS ) ||507 ( action_type == UNBLOCK_ALL_THREADS )), __FUNCTION__ , "illegal action type" );511 assert( ((type == DELETE_ALL_THREADS ) || 512 (type == BLOCK_ALL_THREADS ) || 513 (type == UNBLOCK_ALL_THREADS )), __FUNCTION__ , "illegal action type" ); 508 514 509 // allocate a - shared - RPC descriptor in client thread stack 510 // it can be shared because all parallel, non-blocking, server threads 511 // use the same input arguments, and use the shared RPC response field 512 513 // the client thread makes the following sequence: 514 // 1. mask interrupts 515 // 2. block itself 516 // 3. send RPC requests to all copies 517 // 4. unmask interrupts 518 // 5. deschedule 515 516 // The client thread send parallel RPCs to all remote clusters containing 517 // target process copies, wait all responses, and then handles directly the 518 // threads in local cluster, when required. 519 // The client thread allocates a - shared - RPC descriptor in the stack, 520 // because all parallel, non-blocking, server threads use the same input 521 // arguments, and use the shared RPC response field 519 522 520 523 // mask IRQs 521 524 hal_disable_irq( &save_sr); 522 525 523 // client register blocking condition foritself524 thread_block( XPTR( local_cxy , client ), THREAD_BLOCKED_RPC );526 // client thread blocks itself 527 thread_block( client_xp , THREAD_BLOCKED_RPC ); 525 528 526 529 // take the lock protecting the copies … … 533 536 rpc.thread = client; 534 537 rpc.lid = client->core->lid; 535 rpc.args[0] = action_type;538 rpc.args[0] = type; 536 539 rpc.args[1] = pid; 537 540 538 // send RPCs to all clusters containing process copiess 541 // scan list of process copies 542 // to send RPCs to remote copies 539 543 XLIST_FOREACH( root_xp , iter_xp ) 540 544 { 541 // atomically increment responses counter 542 hal_atomic_add( (void *)&rpc.responses , 1 ); 543 545 // get extended pointers and cluster on process 544 546 process_xp = XLIST_ELEMENT( iter_xp , process_t , copies_list ); 545 547 process_cxy = GET_CXY( process_xp ); 548 process_ptr = GET_PTR( process_xp ); 549 550 if( process_cxy == local_cxy ) // process is local 551 { 552 local = process_ptr; 553 } 554 else // process is remote 555 { 556 // update number of remote process copies 557 remote_nr++; 558 559 // atomically increment responses counter 560 hal_atomic_add( (void *)&rpc.responses , 1 ); 546 561 547 562 #if DEBUG_PROCESS_SIGACTION 548 563 if( DEBUG_PROCESS_SIGACTION < cycle ) 549 printk("\n[DBG] %s : send RPC to %s process %x in cluster %x\n", 550 __FUNCTION__ , process_action_str( action_type ) , pid , process_cxy ); 551 #endif 552 // call RPC in target cluster 553 rpc_process_sigaction_client( process_cxy , &rpc ); 554 } 555 564 printk("\n[DBG] %s : thread %x in process %x handles remote process %x in cluster %x\n", 565 __FUNCTION__, client->trdid, client->process->pid, pid , process_cxy ); 566 #endif 567 // call RPC in target cluster 568 rpc_process_sigaction_client( process_cxy , &rpc ); 569 } 570 } // end list of copies 571 556 572 // release the lock protecting process copies 557 573 remote_spinlock_unlock( lock_xp ); … … 560 576 hal_restore_irq( save_sr); 561 577 562 // client thread deschedule : will be unblocked by the last RPC server thread 563 sched_yield("blocked on rpc_process_sigaction"); 578 // - if there is remote process copies, the client thread deschedules, 579 // (it will be unblocked by the last RPC server thread). 580 // - if there is no remote copies, the client thread unblock itself. 581 if( remote_nr ) 582 { 583 sched_yield("blocked on rpc_process_sigaction"); 584 } 585 else 586 { 587 thread_unblock( client_xp , THREAD_BLOCKED_RPC ); 588 } 589 590 // handle the local process copy if required 591 if( local != NULL ) 592 { 593 594 #if DEBUG_PROCESS_SIGACTION 595 if( DEBUG_PROCESS_SIGACTION < cycle ) 596 printk("\n[DBG] %s : thread %x in process %x handles local process %x in cluster %x\n", 597 __FUNCTION__, client->trdid, client->process->pid, pid , local_cxy ); 598 #endif 599 if (type == DELETE_ALL_THREADS ) process_delete_threads ( local , client_xp ); 600 else if(type == BLOCK_ALL_THREADS ) process_block_threads ( local , client_xp ); 601 else if(type == UNBLOCK_ALL_THREADS ) process_unblock_threads( local ); 602 } 564 603 565 604 #if DEBUG_PROCESS_SIGACTION 566 605 cycle = (uint32_t)hal_get_cycles(); 567 606 if( DEBUG_PROCESS_SIGACTION < cycle ) 568 printk("\n[DBG] %s : thread %x exit after %s process %x in cluster %x / cycle %d\n", 569 __FUNCTION__ , client, process_action_str( action_type ) , pid , local_cxy , cycle ); 607 printk("\n[DBG] %s : thread %x in process %x exit after %s process %x / cycle %d\n", 608 __FUNCTION__, client->trdid, client->process->pid, 609 process_action_str( type ), pid, cycle ); 570 610 #endif 571 611 … … 1100 1140 uint32_t cycle = (uint32_t)hal_get_cycles(); 1101 1141 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1102 printk("\n[DBG] %s : thread %x enter for process %x/ cluster %x / cycle %d\n",1103 __FUNCTION__, CURRENT_THREAD , parent_pid, local_cxy, cycle );1142 printk("\n[DBG] %s : thread %x in process %x enter / cluster %x / cycle %d\n", 1143 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, local_cxy, cycle ); 1104 1144 #endif 1105 1145 … … 1123 1163 } 1124 1164 1165 #if DEBUG_PROCESS_MAKE_FORK 1166 cycle = (uint32_t)hal_get_cycles(); 1167 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1168 printk("\n[DBG] %s : thread %x in process %x allocated process %x / cycle %d\n", 1169 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, new_pid, cycle ); 1170 #endif 1171 1125 1172 // initializes child process descriptor from parent process descriptor 1126 1173 process_reference_init( process, 1127 1174 new_pid, 1128 parent_process_xp,1129 1175 parent_process_xp ); 1130 1176 … … 1132 1178 cycle = (uint32_t)hal_get_cycles(); 1133 1179 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1134 printk("\n[DBG] %s : thread %x created child_process %x / child_pid %x / cycle %d\n", 1135 __FUNCTION__, CURRENT_THREAD, process, new_pid, cycle ); 1136 #endif 1180 printk("\n[DBG] %s : thread %x in process %x initialized child_process %x / cycle %d\n", 1181 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, new_pid, cycle ); 1182 #endif 1183 1184 // give TXT ownership to child process 1185 process_txt_set_ownership( XPTR( local_cxy , process ) ); 1137 1186 1138 1187 // copy VMM from parent descriptor to child descriptor … … 1151 1200 cycle = (uint32_t)hal_get_cycles(); 1152 1201 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1153 printk("\n[DBG] %s : thread %x copied VMM from parent %x to child %x / cycle %d\n", 1154 __FUNCTION__ , CURRENT_THREAD , parent_pid, new_pid, cycle ); 1155 #endif 1202 printk("\n[DBG] %s : thread %x in process %x copied VMM from parent %x to child %x / cycle %d\n", 1203 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 1204 parent_pid, new_pid, cycle ); 1205 #endif 1206 1207 // parent process gives TXT ownership to child process if required 1208 if( process_txt_is_owner(parent_process_xp) ) 1209 { 1210 process_txt_set_ownership( XPTR( local_cxy , process ) ); 1211 1212 #if( DEBUG_PROCESS_MAKE_FORK & 1 ) 1213 cycle = (uint32_t)hal_get_cycles(); 1214 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1215 printk("\n[DBG] %s : thread %x in process %x gives TXT from parent %x to child %x / cycle %d\n", 1216 __FUNCTION__ , CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 1217 parent_pid, new_pid, cycle ); 1218 #endif 1219 1220 } 1156 1221 1157 1222 // update extended pointer on .elf file … … 1178 1243 cycle = (uint32_t)hal_get_cycles(); 1179 1244 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1180 printk("\n[DBG] %s : thread %x created child thread %x on core[%x,%d] / cycle %d\n", 1181 __FUNCTION__ , CURRENT_THREAD, thread, local_cxy, thread->core->lid, cycle ); 1245 printk("\n[DBG] %s : thread %x in process %x created main thread %x on core[%x,%d] / cycle %d\n", 1246 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 1247 thread, local_cxy, thread->core->lid, cycle ); 1182 1248 #endif 1183 1249 … … 1200 1266 cycle = (uint32_t)hal_get_cycles(); 1201 1267 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1202 printk("\n[DBG] %s : thread %x set COW in parent and child / cycle %d\n",1203 __FUNCTION__ , CURRENT_THREAD, cycle );1268 printk("\n[DBG] %s : thread %x in process %x set COW in parent and child / cycle %d\n", 1269 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, cycle ); 1204 1270 #endif 1205 1271 … … 1222 1288 cycle = (uint32_t)hal_get_cycles(); 1223 1289 if( DEBUG_PROCESS_MAKE_FORK < cycle ) 1224 printk("\n[DBG] %s : thread %x exit/ cycle %d\n",1225 __FUNCTION__, CURRENT_THREAD , cycle );1290 printk("\n[DBG] %s : thread %x in process %x exit / created process %x / cycle %d\n", 1291 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, new_pid, cycle ); 1226 1292 #endif 1227 1293 … … 1229 1295 1230 1296 } // end process_make_fork() 1231 1232 1297 1233 1298 ///////////////////////////////////////////////////// 1234 1299 error_t process_make_exec( exec_info_t * exec_info ) 1235 1300 { 1236 char * path; // pathname to .elf file 1237 pid_t pid; // old_process PID, given to new_process 1238 pid_t temp_pid; // temporary PID / given to old_process 1239 process_t * old_process; // local pointer on old process 1240 thread_t * old_thread; // local pointer on old thread 1241 process_t * new_process; // local pointer on new process 1242 thread_t * new_thread; // local pointer on new thread 1243 xptr_t parent_xp; // extended pointer on parent process 1244 process_t * parent_ptr; // local pointer on parent process 1245 cxy_t parent_cxy; // parent process cluster identifier 1246 xptr_t children_lock_xp; // extended pointer on children lock in parent 1247 xptr_t children_root_xp; // extended pointer on children root in parent 1248 xptr_t children_nr_xp; // extended pointer on children number in parent 1249 thread_t * parent_main_ptr; // local pointer on parent main thread 1250 xptr_t parent_main_xp; // extended pointer on parent main thread 1251 pthread_attr_t attr; // new thread attributes 1252 lid_t lid; // selected core local index 1301 thread_t * thread; // local pointer on this thread 1302 process_t * process; // local pointer on this process 1303 pid_t pid; // this process identifier 1253 1304 error_t error; // value returned by called functions 1254 1255 // get old_thread, old_process & PID1256 old_thread = CURRENT_THREAD;1257 old_process = old_thread->process;1258 pid = old_process->pid;1259 1260 // get .elf pathname from exec_info 1261 path = exec_info->path;1262 1263 // this function must be executed by a thread running in owner cluster1264 assert( (CXY_FROM_PID( pid ) == local_cxy), __FUNCTION__, 1265 "local_cluster must be owner_cluster\n" ); 1266 1267 a ssert( (LTID_FROM_TRDID( old_thread->trdid ) == 0) , __FUNCTION__,1268 "must be called by the main thread\n" );1269 1305 char * path; // path to .elf file 1306 xptr_t file_xp; // extended pointer on .elf file descriptor 1307 uint32_t file_id; // file index in fd_array 1308 uint32_t args_nr; // number of main thread arguments 1309 char ** args_pointers; // array of pointers on main thread arguments 1310 1311 // get thread, process & PID 1312 thread = CURRENT_THREAD; 1313 process = thread->process; 1314 pid = process->pid; 1315 1316 // get relevant infos from exec_info 1317 path = exec_info->path; 1318 args_nr = exec_info->args_nr; 1319 args_pointers = exec_info->args_pointers; 1320 1270 1321 #if DEBUG_PROCESS_MAKE_EXEC 1271 1322 uint32_t cycle = (uint32_t)hal_get_cycles(); 1272 1323 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1273 1324 printk("\n[DBG] %s : thread %x in process %x enters / path %s / cycle %d\n", 1274 __FUNCTION__, old_thread->trdid, pid, path, cycle ); 1275 #endif 1276 1277 // get parent process pointers 1278 parent_xp = old_process->parent_xp; 1279 parent_cxy = GET_CXY( parent_xp ); 1280 parent_ptr = GET_PTR( parent_xp ); 1281 1325 __FUNCTION__, thread->trdid, pid, path, cycle ); 1326 #endif 1327 1328 // open the file identified by <path> 1329 file_xp = XPTR_NULL; 1330 file_id = -1; 1331 error = vfs_open( process, 1332 path, 1333 O_RDONLY, 1334 0, 1335 &file_xp, 1336 &file_id ); 1337 if( error ) 1338 { 1339 printk("\n[ERROR] in %s : failed to open file <%s>\n", __FUNCTION__ , path ); 1340 return -1; 1341 } 1342 1282 1343 #if (DEBUG_PROCESS_MAKE_EXEC & 1) 1283 1344 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1284 printk("\n[DBG] %s : thread %x in process %x get parent process %x in cluster %x\n", 1285 __FUNCTION__, old_thread->trdid, pid, parent_ptr, parent_cxy ); 1286 #endif 1287 1288 // get extended pointers on parent children_root, children_lock and children_nr 1289 children_root_xp = XPTR( parent_cxy , &parent_ptr->children_root ); 1290 children_lock_xp = XPTR( parent_cxy , &parent_ptr->children_lock ); 1291 children_nr_xp = XPTR( parent_cxy , &parent_ptr->children_nr ); 1292 1293 // get pointers on the parent process main thread 1294 parent_main_ptr = hal_remote_lpt( XPTR( parent_cxy , &parent_ptr->th_tbl[0] ) ); 1295 parent_main_xp = XPTR( parent_cxy , parent_main_ptr ); 1296 1297 // allocate memory for new_process descriptor 1298 new_process = process_alloc(); 1299 1300 if( new_process == NULL ) 1301 { 1302 printk("\n[ERROR] in %s : cannot allocate process for %s\n", __FUNCTION__ , path ); 1345 printk("\n[DBG] %s : open file <%s>\n", __FUNCTION__, path ); 1346 #endif 1347 1348 // delete all threads other than this main thread in all clusters 1349 process_sigaction( pid , DELETE_ALL_THREADS ); 1350 1351 // reset local process VMM 1352 vmm_destroy( process ); 1353 1354 #if( DEBUG_PROCESS_MAKE_EXEC & 1 ) 1355 cycle = (uint32_t)hal_get_cycles(); 1356 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1357 printk("\n[DBG] %s : thread %x in process %x / reset VMM / cycle %d\n", 1358 __FUNCTION__, thread->trdid, pid, cycle ); 1359 #endif 1360 1361 // re-initialize the VMM (kentry/args/envs vsegs registration) 1362 error = vmm_init( process ); 1363 if( error ) 1364 { 1365 printk("\n[ERROR] in %s : cannot initialise VMM for %s\n", __FUNCTION__ , path ); 1366 vfs_close( file_xp , file_id ); 1367 // FIXME restore old process VMM 1303 1368 return -1; 1304 1369 } 1305 1306 // get a temporary PID for old_process 1307 error = cluster_pid_alloc( old_process , &temp_pid ); 1308 if( error ) 1309 { 1310 printk("\n[ERROR] in %s : cannot get PID in cluster %x\n", 1311 __FUNCTION__ , local_cxy ); 1312 process_free( new_process ); 1313 return -1; 1314 } 1315 1316 // set temporary PID to old_process 1317 old_process->pid = temp_pid; 1318 1319 // initialize new process descriptor 1320 process_reference_init( new_process, 1321 pid, 1322 parent_xp, // parent_process_xp 1323 XPTR(local_cxy , old_process) ); // model_process 1324 1325 // give TXT ownership to new_process 1326 process_txt_set_ownership( XPTR( local_cxy , new_process) ); 1327 1370 1328 1371 #if( DEBUG_PROCESS_MAKE_EXEC & 1 ) 1329 1372 cycle = (uint32_t)hal_get_cycles(); 1330 1373 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1331 printk("\n[DBG] %s : thread %x in process %x created new process %x\n",1332 __FUNCTION__ , old_thread->trdid, pid, new_process);1333 #endif 1334 1335 // register code & data vsegs as well as entry-point in newprocess VMM,1374 printk("\n[DBG] %s : thread %x in process %x / kentry/args/envs vsegs registered / cycle %d\n", 1375 __FUNCTION__, thread->trdid, pid, cycle ); 1376 #endif 1377 1378 // register code & data vsegs as well as entry-point in process VMM, 1336 1379 // and register extended pointer on .elf file in process descriptor 1337 error = elf_load_process( path , new_process ); 1338 1380 error = elf_load_process( file_xp , process ); 1339 1381 if( error ) 1340 1382 { 1341 1383 printk("\n[ERROR] in %s : failed to access <%s>\n", __FUNCTION__ , path ); 1342 process_txt_set_ownership( XPTR( local_cxy , old_process) ); 1343 process_txt_detach( XPTR( local_cxy , new_process) ); 1344 process_destroy( new_process ); 1345 old_process->pid = pid; 1384 vfs_close( file_xp , file_id ); 1385 // FIXME restore old process VMM 1346 1386 return -1; 1347 1387 } … … 1350 1390 cycle = (uint32_t)hal_get_cycles(); 1351 1391 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1352 printk("\n[DBG] %s : thread %x registered code/data vsegs in new process %x / cycle %d\n", 1353 __FUNCTION__, old_thread , new_process->pid , cycle ); 1354 #endif 1355 1356 // select a core in local cluster to execute the main thread 1357 lid = cluster_select_local_core(); 1358 1359 // initialize pthread attributes for main thread 1360 attr.attributes = PT_ATTR_DETACH | PT_ATTR_CLUSTER_DEFINED | PT_ATTR_CORE_DEFINED; 1361 attr.cxy = local_cxy; 1362 attr.lid = lid; 1363 1364 // create and initialize main thread in local cluster 1365 error = thread_user_create( pid, 1366 (void *)new_process->vmm.entry_point, 1367 exec_info->args_pointers, 1368 &attr, 1369 &new_thread ); 1370 if( error ) 1371 { 1372 printk("\n[ERROR] in %s : cannot create thread for %s\n", __FUNCTION__ , path ); 1373 process_txt_set_ownership( XPTR( local_cxy , old_process) ); 1374 process_txt_detach( XPTR( local_cxy , new_process) ); 1375 process_destroy( new_process ); 1376 old_process->pid = pid; 1392 printk("\n[DBG] %s : thread %x in process %x / code/data vsegs registered / cycle %d\n", 1393 __FUNCTION__, thread->trdid, pid, cycle ); 1394 #endif 1395 1396 // update the existing main thread descriptor... and jump to user code 1397 error = thread_user_exec( (void *)process->vmm.entry_point, 1398 args_nr, 1399 args_pointers ); 1400 if( error ) 1401 { 1402 printk("\n[ERROR] in %s : cannot reset main thread for %s\n", __FUNCTION__ , path ); 1403 vfs_close( file_xp , file_id ); 1404 // FIXME restore old process VMM 1377 1405 return -1; 1378 } 1379 1380 // check main thread LTID 1381 assert( (LTID_FROM_TRDID(new_thread->trdid) == 0) , __FUNCTION__ , 1382 "main thread must have LTID == 0\n" ); 1383 1384 #if( DEBUG_PROCESS_MAKE_EXEC & 1 ) 1385 cycle = (uint32_t)hal_get_cycles(); 1386 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1387 printk("\n[DBG] %s : thread %x created new_process main thread %x / cycle %d\n", 1388 __FUNCTION__ , old_thread , new_thread , cycle ); 1389 #endif 1390 1391 // register new_process in parent children list 1392 remote_spinlock_lock( children_lock_xp ); 1393 xlist_add_last( children_root_xp , XPTR( local_cxy , &new_process->children_list ) ); 1394 hal_remote_atomic_add( children_nr_xp , 1 ); 1395 remote_spinlock_unlock( children_lock_xp ); 1396 1397 // activate new thread 1398 thread_unblock( XPTR( local_cxy , new_thread ) , THREAD_BLOCKED_GLOBAL ); 1399 1400 // detach old_process from TXT 1401 process_txt_detach( XPTR( local_cxy , old_process ) ); 1402 1403 // block old_thread 1404 thread_block( XPTR( local_cxy , old_thread ) , THREAD_BLOCKED_GLOBAL ); 1405 1406 // atomically update old_process termination state 1407 hal_atomic_or( &old_process->term_state , PROCESS_TERM_EXIT ); 1408 1409 // take the children lock and unblock the parent process main thread 1410 remote_spinlock_lock( children_lock_xp ); 1411 thread_unblock( parent_main_xp , THREAD_BLOCKED_WAIT ); 1412 remote_spinlock_unlock( children_lock_xp ); 1413 1414 hal_fence(); 1415 1416 #if DEBUG_PROCESS_MAKE_EXEC 1417 cycle = (uint32_t)hal_get_cycles(); 1418 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1419 printk("\n[DBG] %s : old thread %x blocked for delete / new thread %x activated / cycle %d\n", 1420 __FUNCTION__ , old_thread , new_thread , cycle ); 1421 #endif 1422 1406 } 1407 1408 assert( false, __FUNCTION__, "we should not execute this code"); 1409 1423 1410 return 0; 1424 1411 1425 1412 } // end process_make_exec() 1413 1426 1414 1427 1415 /////////////////////////////////////////////// … … 1474 1462 pthread_attr_t attr; // main thread attributes 1475 1463 lid_t lid; // selected core local index for main thread 1464 xptr_t file_xp; // extended pointer on .elf file descriptor 1465 uint32_t file_id; // file index in fd_array 1476 1466 error_t error; 1477 1467 … … 1479 1469 uint32_t cycle = (uint32_t)hal_get_cycles(); 1480 1470 if( DEBUG_PROCESS_INIT_CREATE < cycle ) 1481 printk("\n[DBG] %s : thread %x enter / cycle %d\n", __FUNCTION__, CURRENT_THREAD, cycle ); 1471 printk("\n[DBG] %s : thread %x in process %x enter / cycle %d\n", 1472 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, cycle ); 1482 1473 #endif 1483 1474 1484 1475 // allocates memory for process descriptor from local cluster 1485 1476 process = process_alloc(); 1486 if( process == NULL ) 1487 { 1488 printk("\n[PANIC] in %s : no memory for process descriptor in cluster %x\n", 1489 __FUNCTION__, local_cxy ); 1490 } 1477 1478 assert( (process != NULL), __FUNCTION__, 1479 "no memory for process descriptor in cluster %x\n", local_cxy ); 1491 1480 1492 1481 // get PID from local cluster 1493 1482 error = cluster_pid_alloc( process , &pid ); 1494 if( error ) 1495 { 1496 printk("\n[PANIC] in %s : cannot allocate PID in cluster %x\n", 1497 __FUNCTION__, local_cxy ); 1498 process_free( process ); 1499 } 1500 1501 // check allocated PID 1502 assert( (pid == 1) , __FUNCTION__ , "process INIT must be first process in cluster 0\n" ); 1483 1484 assert( (error == 0), __FUNCTION__, 1485 "cannot allocate PID in cluster %x\n", local_cxy ); 1486 1487 assert( (pid == 1) , __FUNCTION__, 1488 "process INIT must be first process in cluster 0\n" ); 1503 1489 1504 1490 // initialize process descriptor / parent is local process_zero 1505 1491 process_reference_init( process, 1506 1492 pid, 1507 XPTR( local_cxy , &process_zero ), // parent 1508 XPTR( local_cxy , &process_zero ) ); // model 1493 XPTR( local_cxy , &process_zero ) ); 1494 1495 // open the file identified by CONFIG_PROCESS_INIT_PATH 1496 file_xp = XPTR_NULL; 1497 file_id = -1; 1498 error = vfs_open( process, 1499 CONFIG_PROCESS_INIT_PATH, 1500 O_RDONLY, 1501 0, 1502 &file_xp, 1503 &file_id ); 1504 1505 assert( (error == 0), __FUNCTION__, 1506 "failed to open file <%s>\n", CONFIG_PROCESS_INIT_PATH ); 1509 1507 1510 1508 // register "code" and "data" vsegs as well as entry-point 1511 1509 // in process VMM, using information contained in the elf file. 1512 if( elf_load_process( CONFIG_PROCESS_INIT_PATH , process ) ) 1513 { 1514 printk("\n[PANIC] in %s : cannot access .elf file / path = %s\n", 1515 __FUNCTION__, CONFIG_PROCESS_INIT_PATH ); 1516 process_destroy( process ); 1517 } 1510 error = elf_load_process( file_xp , process ); 1511 1512 assert( (error == 0), __FUNCTION__, 1513 "cannot access .elf file <%s>\n", CONFIG_PROCESS_INIT_PATH ); 1518 1514 1519 1515 // get extended pointers on process_zero children_root, children_lock … … 1541 1537 &attr, 1542 1538 &thread ); 1543 if( error ) 1544 { 1545 printk("\n[PANIC] in %s : cannot create main thread / path = %s\n", 1546 __FUNCTION__, CONFIG_PROCESS_INIT_PATH ); 1547 process_destroy( process ); 1548 } 1549 1550 // check main thread index 1551 assert( (thread->trdid == 0) , __FUNCTION__ , "main thread must have index 0\n" ); 1539 1540 assert( (error == 0), __FUNCTION__, 1541 "cannot create main thread for <%s>\n", CONFIG_PROCESS_INIT_PATH ); 1542 1543 assert( (thread->trdid == 0), __FUNCTION__, 1544 "main thread must have index 0 for <%s>\n", CONFIG_PROCESS_INIT_PATH ); 1552 1545 1553 1546 // activate thread … … 1559 1552 cycle = (uint32_t)hal_get_cycles(); 1560 1553 if( DEBUG_PROCESS_INIT_CREATE < cycle ) 1561 printk("\n[DBG] %s : thread %x exit / cycle %d\n", __FUNCTION__, CURRENT_THREAD, cycle ); 1554 printk("\n[DBG] %s : thread %x in process %x exit / cycle %d\n", 1555 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, cycle ); 1562 1556 #endif 1563 1557 … … 1702 1696 xptr_t lock_xp; // extended pointer on list lock in chdev 1703 1697 1704 #if DEBUG_PROCESS_TXT1705 uint32_t cycle = (uint32_t)hal_get_cycles();1706 if( DEBUG_PROCESS_TXT < cycle )1707 printk("\n[DBG] %s : thread %x enter for process %x / txt_id = %d / cycle %d\n",1708 __FUNCTION__, CURRENT_THREAD, process->pid, txt_id, cycle );1709 #endif1710 1711 1698 // check process is in owner cluster 1712 1699 assert( (CXY_FROM_PID( process->pid ) == local_cxy) , __FUNCTION__ , … … 1732 1719 1733 1720 #if DEBUG_PROCESS_TXT 1734 cycle = (uint32_t)hal_get_cycles();1721 uint32_t cycle = (uint32_t)hal_get_cycles(); 1735 1722 if( DEBUG_PROCESS_TXT < cycle ) 1736 printk("\n[DBG] %s : thread %x exit for process %x / txt_id = %d / cycle %d\n", 1737 __FUNCTION__, CURRENT_THREAD, process->pid, txt_id , cycle ); 1723 printk("\n[DBG] %s : thread %x in process %x attached process %x to TXT %d / cycle %d\n", 1724 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 1725 process->pid, txt_id , cycle ); 1738 1726 #endif 1739 1727 … … 1755 1743 process_cxy = GET_CXY( process_xp ); 1756 1744 process_ptr = GET_PTR( process_xp ); 1745 1746 // check process descriptor in owner cluster 1757 1747 process_pid = hal_remote_lw( XPTR( process_cxy , &process_ptr->pid ) ); 1758 1759 // check process descriptor in owner cluster1760 1748 assert( (CXY_FROM_PID( process_pid ) == process_cxy ) , __FUNCTION__ , 1761 1749 "process descriptor not in owner cluster" ); 1762 1763 #if DEBUG_PROCESS_TXT1764 uint32_t cycle = (uint32_t)hal_get_cycles();1765 if( DEBUG_PROCESS_TXT < cycle )1766 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n",1767 __FUNCTION__, CURRENT_THREAD, process_pid, cycle );1768 #endif1769 1750 1770 1751 // release TXT ownership (does nothing if not TXT owner) … … 1788 1769 1789 1770 #if DEBUG_PROCESS_TXT 1790 cycle = (uint32_t)hal_get_cycles();1771 uint32_t cycle = (uint32_t)hal_get_cycles(); 1791 1772 uint32_t txt_id = hal_remote_lw( XPTR( chdev_cxy , &chdev_ptr->channel ) ); 1792 1773 if( DEBUG_PROCESS_TXT < cycle ) 1793 printk("\n[DBG] %s : thread %x exit / process %x detached from TXT %d / cycle %d\n", 1794 __FUNCTION__, CURRENT_THREAD, process_pid, txt_id, cycle ); 1774 printk("\n[DBG] %s : thread %x in process %x detached process %x from TXT %d / cycle %d\n", 1775 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 1776 process_pid, txt_id, cycle ); 1795 1777 #endif 1796 1778 … … 1811 1793 process_cxy = GET_CXY( process_xp ); 1812 1794 process_ptr = GET_PTR( process_xp ); 1813 1814 // get process PID1815 1795 process_pid = hal_remote_lw( XPTR( process_cxy , &process_ptr->pid ) ); 1816 1796 … … 1818 1798 assert( (process_cxy == CXY_FROM_PID( process_pid )) , __FUNCTION__, 1819 1799 "process descriptor not in owner cluster\n" ); 1820 1821 #if DEBUG_PROCESS_TXT1822 uint32_t cycle = (uint32_t)hal_get_cycles();1823 if( DEBUG_PROCESS_TXT < cycle )1824 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n",1825 __FUNCTION__, CURRENT_THREAD, process_pid, cycle );1826 #endif1827 1800 1828 1801 // get extended pointer on stdin pseudo file … … 1838 1811 1839 1812 #if DEBUG_PROCESS_TXT 1840 cycle = (uint32_t)hal_get_cycles(); 1813 uint32_t cycle = (uint32_t)hal_get_cycles(); 1814 uint32_t txt_id = hal_remote_lw( XPTR( txt_cxy , &txt_ptr->channel ) ); 1841 1815 if( DEBUG_PROCESS_TXT < cycle ) 1842 printk("\n[DBG] %s : thread %x exit forprocess %x / cycle %d\n",1843 __FUNCTION__, CURRENT_THREAD , process_pid, cycle );1816 printk("\n[DBG] %s : thread %x in process %x give TXT %d to process %x / cycle %d\n", 1817 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, txt_id, process_pid, cycle ); 1844 1818 #endif 1845 1819 … … 1865 1839 cxy_t current_cxy; // cluster for current process 1866 1840 1841 #if DEBUG_PROCESS_TXT 1842 uint32_t cycle; 1843 #endif 1844 1867 1845 // get pointers on process in owner cluster 1868 1846 process_cxy = GET_CXY( process_xp ); 1869 1847 process_ptr = GET_PTR( process_xp ); 1870 1871 // get process PID1872 1848 process_pid = hal_remote_lw( XPTR( process_cxy , &process_ptr->pid ) ); 1873 1849 … … 1875 1851 assert( (process_cxy == CXY_FROM_PID( process_pid )) , __FUNCTION__, 1876 1852 "process descriptor not in owner cluster\n" ); 1877 1878 #if DEBUG_PROCESS_TXT1879 uint32_t cycle = (uint32_t)hal_get_cycles();1880 if( DEBUG_PROCESS_TXT < cycle )1881 printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n",1882 __FUNCTION__, CURRENT_THREAD, process_pid, cycle );1883 #endif1884 1853 1885 1854 // get extended pointer on stdin pseudo file … … 1895 1864 txt_id = hal_remote_lw ( XPTR( txt_cxy , &txt_ptr->channel ) ); 1896 1865 1897 #if( DEBUG_PROCESS_TXT & 1 )1898 if( DEBUG_PROCESS_TXT < cycle )1899 printk("\n[DBG] %s : file_ptr %x / txt_ptr %x / txt_id %d / owner_ptr = %x\n",1900 __FUNCTION__, GET_PTR(file_xp), txt_ptr, txt_id, GET_PTR(owner_xp) );1901 #endif1902 1903 1866 // transfer ownership only if process is the TXT owner 1904 1867 if( (owner_xp == process_xp) && (txt_id > 0) ) … … 1913 1876 if( process_get_ppid( process_xp ) != 1 ) // process is not KSH 1914 1877 { 1915 1916 #if( DEBUG_PROCESS_TXT & 1 )1917 if( DEBUG_PROCESS_TXT < cycle )1918 printk("\n[DBG] %s : process is not the KSH process => search the KSH\n", __FUNCTION__ );1919 #endif1920 1878 // scan attached process list to find KSH process 1921 1879 XLIST_FOREACH( root_xp , iter_xp ) … … 1934 1892 1935 1893 #if DEBUG_PROCESS_TXT 1936 cycle = (uint32_t)hal_get_cycles(); 1894 cycle = (uint32_t)hal_get_cycles(); 1895 uint32_t ksh_pid = hal_remote_lw( XPTR( current_cxy , ¤t_ptr->pid ) ); 1937 1896 if( DEBUG_PROCESS_TXT < cycle ) 1938 printk("\n[DBG] %s : thread %x exit / process %x to KSH process%x / cycle %d\n",1939 __FUNCTION__, CURRENT_THREAD , process_pid,1940 hal_remote_lw( XPTR( current_cxy , ¤t_ptr->pid ) ), cycle);1897 printk("\n[DBG] %s : thread %x in process %x release TXT %d to KSH %x / cycle %d\n", 1898 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, txt_id, ksh_pid, cycle ); 1899 process_txt_display( txt_id ); 1941 1900 #endif 1942 1901 return; … … 1954 1913 else // process is KSH 1955 1914 { 1956 1957 #if( DEBUG_PROCESS_TXT & 1 )1958 if( DEBUG_PROCESS_TXT < cycle )1959 printk("\n[DBG] %s : process is the KSH process => search another\n", __FUNCTION__ );1960 #endif1961 1962 1915 // scan attached process list to find another process 1963 1916 XLIST_FOREACH( root_xp , iter_xp ) … … 1976 1929 1977 1930 #if DEBUG_PROCESS_TXT 1978 cycle = (uint32_t)hal_get_cycles(); 1931 cycle = (uint32_t)hal_get_cycles(); 1932 uint32_t new_pid = hal_remote_lw( XPTR( current_cxy , ¤t_ptr->pid ) ); 1979 1933 if( DEBUG_PROCESS_TXT < cycle ) 1980 printk("\n[DBG] %s : thread %x exit / KSH process %xto process %x / cycle %d\n",1981 __FUNCTION__, CURRENT_THREAD , process_pid,1982 hal_remote_lw( XPTR( current_cxy , ¤t_ptr->pid ) ), cycle);1934 printk("\n[DBG] %s : thread %x in process %x release TXT %d to process %x / cycle %d\n", 1935 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, txt_id, new_pid, cycle ); 1936 process_txt_display( txt_id ); 1983 1937 #endif 1984 1938 return; … … 1995 1949 cycle = (uint32_t)hal_get_cycles(); 1996 1950 if( DEBUG_PROCESS_TXT < cycle ) 1997 printk("\n[DBG] %s : thread %x exit / KSH process %x to nobody / cycle %d\n", 1998 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); 1951 printk("\n[DBG] %s : thread %x in process %x release TXT %d to nobody / cycle %d\n", 1952 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, txt_id, cycle ); 1953 process_txt_display( txt_id ); 1999 1954 #endif 2000 1955 return; … … 2007 1962 cycle = (uint32_t)hal_get_cycles(); 2008 1963 if( DEBUG_PROCESS_TXT < cycle ) 2009 printk("\n[DBG] %s : thread %x exit / process %x is not TXT owner / cycle %d\n", 2010 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); 1964 printk("\n[DBG] %s : thread %x in process %d does nothing (not TXT owner) / cycle %d\n", 1965 __FUNCTION__, CURRENT_THREAD->trdid, process_pid, cycle ); 1966 process_txt_display( txt_id ); 2011 1967 #endif 2012 1968 … … 2014 1970 } // end process_txt_transfer_ownership() 2015 1971 1972 1973 ////////////////////////////////////////////////// 1974 uint32_t process_txt_is_owner( xptr_t process_xp ) 1975 { 1976 // get local pointer and cluster of process in owner cluster 1977 cxy_t process_cxy = GET_CXY( process_xp ); 1978 process_t * process_ptr = GET_PTR( process_xp ); 1979 1980 // check owner cluster 1981 pid_t process_pid = hal_remote_lw( XPTR( process_cxy , &process_ptr->pid ) ); 1982 assert( (process_cxy == CXY_FROM_PID( process_pid )) , __FUNCTION__, 1983 "process descriptor not in owner cluster\n" ); 1984 1985 // get extended pointer on stdin pseudo file 1986 xptr_t file_xp = hal_remote_lwd( XPTR( process_cxy , &process_ptr->fd_array.array[0] ) ); 1987 1988 // get pointers on TXT chdev 1989 xptr_t txt_xp = chdev_from_file( file_xp ); 1990 cxy_t txt_cxy = GET_CXY( txt_xp ); 1991 chdev_t * txt_ptr = GET_PTR( txt_xp ); 1992 1993 // get extended pointer on TXT_RX owner process 1994 xptr_t owner_xp = hal_remote_lwd( XPTR( txt_cxy , &txt_ptr->ext.txt.owner_xp ) ); 1995 1996 return (process_xp == owner_xp); 1997 1998 } // end process_txt_is_owner() 2016 1999 2017 2000 //////////////////////////////////////////////// … … 2023 2006 2024 2007 return (xptr_t)hal_remote_lwd( XPTR( txt_rx_cxy , &txt_rx_ptr->ext.txt.owner_xp ) ); 2025 } 2008 2009 } // end process_txt_get_owner() 2026 2010 2027 2011 /////////////////////////////////////////// -
trunk/kernel/kern/process.h
r450 r457 29 29 #include <kernel_config.h> 30 30 #include <errno.h> 31 #include <hal_ types.h>31 #include <hal_kernel_types.h> 32 32 #include <list.h> 33 33 #include <xlist.h> … … 146 146 147 147 uint32_t term_state; /*! termination status (flags & exit status) */ 148 149 bool_t txt_owner; /*! current TXT owner */150 148 } 151 149 process_t; … … 213 211 /********************************************************************************************* 214 212 * This function initializes a local, reference, user process descriptor from another process 215 * descriptor, defined by the <model_xp> argument. The <process> and <pid> arguments must 216 * be previously allocated by he caller. This function can be called by three functions: 217 * 1) process_init_create() : process is the reference INIT process / pid = 1 / 218 * the parent and model process descriptors are both the kernel process_zero. 219 * 2) process_make_fork() : the model process descriptor is the (generally remote) 220 * parent process. 221 * 3) process_make exec() : the model process is the local old_process, the new_process 222 * parent is the same as the old_process parent. 213 * descriptor, defined by the <parent_xp> argument. The <process> and <pid> arguments must 214 * be previously allocated by the caller. This function can be called by two functions: 215 * 1) process_init_create() : process is the INIT process; parent is process-zero. 216 * 2) process_make_fork() : the parent process descriptor is generally remote. 223 217 * The following fields are initialised : 224 218 * - It set the pid / ppid / ref_xp / parent_xp / state fields. 225 219 * - It initializes the VMM (register the kentry, args, envs vsegs in VSL) 226 220 * - It initializes the FDT, defining the three pseudo files STDIN / STDOUT / STDERR. 221 * . if INIT process => link to kernel TXT[0]. 222 * . if KSH[i] process => allocate a free TXT[i] and give TXT ownership. 223 * . if USER process => same TXT[i] as parent process and give TXT ownership. 227 224 * - It set the root_xp, bin_xp, cwd_xp fields. 228 225 * - It reset the children list as empty, but does NOT register it in parent children list. … … 236 233 * @ pid : [in] process identifier. 237 234 * @ parent_xp : [in] extended pointer on parent process descriptor. 238 * @ model_xp : [in] extended pointer on model process descriptor.239 235 ********************************************************************************************/ 240 236 void process_reference_init( process_t * process, 241 237 pid_t pid, 242 xptr_t parent_xp, 243 xptr_t model_xp ); 238 xptr_t parent_xp ); 244 239 245 240 /********************************************************************************************* … … 515 510 * It is called only by the process_reference_init() function when creating a KSH process. 516 511 * It makes a kernel panic if no free TXT terminal is found. 517 * The allocated TXT terminal is only released if the KSH process is deleted, 518 * which is a rare and abnormal event. 512 * The allocated TXT terminal is only released when the KSH process is deleted. 519 513 ********************************************************************************************* 520 514 * @ return TXT terminal index if succes / kernel panic if no terminal found. … … 547 541 548 542 /********************************************************************************************* 549 * This function gives t o a process identified by the <owner_xp> argument, and attached550 * to terminal TXT[i] the exclusive ownership of the TXT_RX[i] terminal.551 * The process descriptor must be in the process owner cluster.543 * This function gives the TXT ownership to a process identified by the <process_xp> argument. 544 * It can be called by a thread running in any cluster, but the <process_xp> must be the 545 * owner cluster process descriptor. 552 546 ********************************************************************************************* 553 547 * @ owner_xp : extended pointer on process descriptor in owner cluster. 554 548 ********************************************************************************************/ 555 void process_txt_set_ownership( xptr_t owner_xp );556 557 /********************************************************************************************* 558 * When the process dentified by the <owner_xp> argument has the exclusive ownership of549 void process_txt_set_ownership( xptr_t process_xp ); 550 551 /********************************************************************************************* 552 * When the process identified by the <owner_xp> argument has the exclusive ownership of 559 553 * the TXT_RX terminal, this function transfer this ownership to another attached process. 560 554 * The process descriptor must be the process owner. … … 565 559 * - If there is no other attached process, the TXT has no more defined owner. 566 560 ********************************************************************************************* 567 * @ owner_xp : extended pointer on process descriptor in owner cluster. 568 ********************************************************************************************/ 569 void process_txt_transfer_ownership( xptr_t owner_xp ); 570 571 /********************************************************************************************* 572 * This function returns the TXT owner process (foreground process) 573 * for a given TXT terminal identified by its <channel> index. 574 ********************************************************************************************* 575 * @ channel : TXT terminal channel. 576 * @ return extentded pointer on TXT owner process in owner cluster. 561 * @ process_xp : extended pointer on process descriptor in owner cluster. 562 ********************************************************************************************/ 563 void process_txt_transfer_ownership( xptr_t process_xp ); 564 565 /********************************************************************************************* 566 * This function returns true if the process identified by the <process_xp> argument 567 * is the TXT owner. It can be called by a thread running in any cluster, but the 568 * process_xp must be the owner cluster process descriptor. 569 ********************************************************************************************* 570 * @ return a non-zero value if target process is TXT owner. 571 ********************************************************************************************/ 572 uint32_t process_txt_is_owner( xptr_t process_xp ); 573 574 /********************************************************************************************* 575 * This function returns an extended ponter on the current TXT owner process, 576 * for the TXT terminal identified by the <channel> index. 577 ********************************************************************************************* 578 * @ channel : TXT channel. 579 * @ return extended pointer on TXT owner process. 577 580 ********************************************************************************************/ 578 581 xptr_t process_txt_get_owner( uint32_t channel ); -
trunk/kernel/kern/rpc.c
r450 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_atomic.h> 27 27 #include <hal_remote.h> … … 100 100 volatile error_t full; 101 101 thread_t * this; 102 cluster_t * cluster;103 104 #if DEBUG_RPC_CLIENT_GENERIC105 uint32_t cycle = (uint32_t)hal_get_cycles();106 if( DEBUG_RPC_CLIENT_GENERIC < cycle )107 printk("\n[DBG] %s : thread %x in cluster %x enter for rpc[%d] / rpc_ptr %x / cycle %d\n",108 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index, rpc, cycle );109 #endif110 102 111 103 full = 0; 112 104 this = CURRENT_THREAD; 113 cluster = LOCAL_CLUSTER;114 105 client_core_lid = this->core->lid; 115 106 107 #if DEBUG_RPC_CLIENT_GENERIC 108 uint32_t cycle = (uint32_t)hal_get_cycles(); 109 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 110 printk("\n[DBG] %s : thread %x in process %x enter for rpc[%d] / cycle %d\n", 111 __FUNCTION__, this->trdid, this->process->pid, rpc->index, cycle ); 112 #endif 113 116 114 // select a server_core : use client core index if possible / core 0 otherwise 117 if( client_core_lid < hal_remote_lw( XPTR( server_cxy , & cluster->cores_nr ) ) )115 if( client_core_lid < hal_remote_lw( XPTR( server_cxy , &LOCAL_CLUSTER->cores_nr ) ) ) 118 116 { 119 117 server_core_lid = client_core_lid; … … 150 148 151 149 hal_fence(); 150 151 #if DEBUG_RPC_CLIENT_GENERIC 152 cycle = (uint32_t)hal_get_cycles(); 153 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 154 printk("\n[DBG] %s : thread %x in process %x / rpc[%d] / rpc_ptr %x / cycle %d\n", 155 __FUNCTION__, this->trdid, this->process->pid, rpc->index, rpc, cycle ); 156 #endif 152 157 153 154 158 // send IPI to the selected server core 159 dev_pic_send_ipi( server_cxy , server_core_lid ); 155 160 156 161 // wait RPC completion before returning if blocking RPC … … 165 170 cycle = (uint32_t)hal_get_cycles(); 166 171 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 167 printk("\n[DBG] %s : thread %x in cluster %x busy waiting /rpc[%d] / cycle %d\n",168 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index , cycle );172 printk("\n[DBG] %s : thread %x in process %x busy waiting for rpc[%d] / cycle %d\n", 173 __FUNCTION__, this->trdid, this->process->pid, rpc->index , cycle ); 169 174 #endif 170 175 … … 174 179 cycle = (uint32_t)hal_get_cycles(); 175 180 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 176 printk("\n[DBG] %s : thread %x in cluster %x resumes /rpc[%d] / cycle %d\n",177 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index, cycle );181 printk("\n[DBG] %s : thread %x in process %x resumes for rpc[%d] / cycle %d\n", 182 __FUNCTION__, this->trdid, this->process->pid, rpc->index, cycle ); 178 183 #endif 179 184 } … … 184 189 cycle = (uint32_t)hal_get_cycles(); 185 190 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 186 printk("\n[DBG] %s : thread %x in cluster %x blocks & deschedules /rpc[%d] / cycle %d\n",187 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index , cycle );191 printk("\n[DBG] %s : thread %x in process %x blocks & deschedules for rpc[%d] / cycle %d\n", 192 __FUNCTION__, this->trdid, this->process->pid, rpc->index , cycle ); 188 193 #endif 189 194 thread_block( XPTR( local_cxy , this ) , THREAD_BLOCKED_RPC ); … … 193 198 cycle = (uint32_t)hal_get_cycles(); 194 199 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 195 printk("\n[DBG] %s : thread %x in cluster %x resumes / rpcr[%d] / cycle %d\n",196 __FUNCTION__, CURRENT_THREAD, local_cxy, rpc->index, cycle );200 printk("\n[DBG] %s : thread %x in process %x resumes for rpc[%d] / cycle %d\n", 201 __FUNCTION__, this->trdid, this->process->pid, rpc->index, cycle ); 197 202 #endif 198 203 } … … 207 212 cycle = (uint32_t)hal_get_cycles(); 208 213 if( DEBUG_RPC_CLIENT_GENERIC < cycle ) 209 printk("\n[DBG] %s : non blocking rpc[%d] => thread %x return/ cycle %d\n",210 __FUNCTION__, rpc->index, CURRENT_THREAD, cycle );214 printk("\n[DBG] %s : thread %x in process %x returns for non blocking rpc[%d] / cycle %d\n", 215 __FUNCTION__, this->trdid, this->process->pid, rpc->index, cycle ); 211 216 #endif 212 217 … … 225 230 thread_t * thread; 226 231 uint32_t sr_save; 232 233 #if DEBUG_RPC_SERVER_GENERIC 234 uint32_t cycle; 235 #endif 227 236 228 237 bool_t found = false; … … 232 241 remote_fifo_t * rpc_fifo = &LOCAL_CLUSTER->rpc_fifo[core->lid]; 233 242 234 #if DEBUG_RPC_SERVER_GENERIC235 uint32_t cycle = (uint32_t)hal_get_cycles();236 if( DEBUG_RPC_SERVER_GENERIC < cycle )237 printk("\n[DBG] %s : thread %x interrupted in cluster %x / cycle %d\n",238 __FUNCTION__, this, local_cxy, cycle );239 #endif240 241 243 // interrupted thread not preemptable during RPC chek 242 244 hal_disable_irq( &sr_save ); … … 249 251 cycle = (uint32_t)hal_get_cycles(); 250 252 if( DEBUG_RPC_SERVER_GENERIC < cycle ) 251 printk("\n[DBG] %s : RPC FIFO non empty in cluster %x/ cycle %d\n",252 __FUNCTION__, local_cxy, c ycle );253 printk("\n[DBG] %s : RPC FIFO non empty for core[%x,%d] / cycle %d\n", 254 __FUNCTION__, local_cxy, core->lid, cycle ); 253 255 #endif 254 256 … … 290 292 cycle = (uint32_t)hal_get_cycles(); 291 293 if( DEBUG_RPC_SERVER_GENERIC < cycle ) 292 printk("\n[DBG] %s : create a new RPC thread %x in cluster %x/ cycle %d\n",293 __FUNCTION__, thread, local_cxy, c ycle );294 printk("\n[DBG] %s : new RPC thread %x created for core[%x,%d] / cycle %d\n", 295 __FUNCTION__, thread, local_cxy, core->lid, cycle ); 294 296 #endif 295 297 } … … 299 301 cycle = (uint32_t)hal_get_cycles(); 300 302 if( DEBUG_RPC_SERVER_GENERIC < cycle ) 301 printk("\n[DBG] %s : interrupted thread %x deschedules in cluster %x/ cycle %d\n",302 __FUNCTION__, this, local_cxy, c ycle );303 printk("\n[DBG] %s : interrupted thread %x deschedules on core[%x,%d] / cycle %d\n", 304 __FUNCTION__, this, local_cxy, core->lid, cycle ); 303 305 #endif 304 306 … … 309 311 cycle = (uint32_t)hal_get_cycles(); 310 312 if( DEBUG_RPC_SERVER_GENERIC < cycle ) 311 printk("\n[DBG] %s : interrupted thread %x resumes in cluster %x/ cycle %d\n",312 __FUNCTION__, this, local_cxy, c ycle );313 printk("\n[DBG] %s : interrupted thread %x resumes on core[%x,%d] / cycle %d\n", 314 __FUNCTION__, this, local_cxy, core->lid, cycle ); 313 315 #endif 314 316 … … 410 412 #endif 411 413 // send IPI to client core 412 dev_pic_send_ipi( desc_cxy , client_core_lid );414 // dev_pic_send_ipi( desc_cxy , client_core_lid ); 413 415 } 414 416 } … … 872 874 pid_t pid = rpc->args[1]; 873 875 if( DEBUG_RPC_PROCESS_SIGACTION < cycle ) 874 printk("\n[DBG] %s : enter to %sprocess %x in cluster %x / cycle %d\n",876 printk("\n[DBG] %s : enter to request %s of process %x in cluster %x / cycle %d\n", 875 877 __FUNCTION__ , process_action_str( action ) , pid , cxy , cycle ); 876 878 #endif … … 949 951 950 952 // send an IPI to client core 951 dev_pic_send_ipi( client_cxy , client_lid );953 // dev_pic_send_ipi( client_cxy , client_lid ); 952 954 } 953 955 -
trunk/kernel/kern/rpc.h
r450 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <hal_atomic.h> 30 30 #include <bits.h> -
trunk/kernel/kern/scheduler.c
r450 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_switch.h> 27 27 #include <hal_irqmask.h> -
trunk/kernel/kern/scheduler.h
r450 r457 25 25 #define _SCHEDULER_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <list.h> 29 29 #include <spinlock.h> -
trunk/kernel/kern/signal.c
r409 r457 24 24 */ 25 25 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <printk.h> 28 28 #include <signal.h> -
trunk/kernel/kern/signal.h
r435 r457 27 27 #define _SIGNAL_H_ 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 31 31 -
trunk/kernel/kern/thread.c
r450 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_context.h> 28 28 #include <hal_irqmask.h> … … 167 167 thread->quantum = 0; // TODO 168 168 thread->ticks_nr = 0; // TODO 169 thread->time_last_check = 0; 169 thread->time_last_check = 0; // TODO 170 170 thread->core = &local_cluster->core_tbl[core_lid]; 171 171 thread->process = process; … … 243 243 uint32_t cycle = (uint32_t)hal_get_cycles(); 244 244 if( DEBUG_THREAD_USER_CREATE < cycle ) 245 printk("\n[DBG] %s : thread %x enter for process %xin cluster %x / cycle %d\n",246 __FUNCTION__, CURRENT_THREAD , pid , local_cxy , cycle );245 printk("\n[DBG] %s : thread %x in process %x enter in cluster %x / cycle %d\n", 246 __FUNCTION__, CURRENT_THREAD->trdid, pid , local_cxy , cycle ); 247 247 #endif 248 248 … … 301 301 } 302 302 303 #if( DEBUG_THREAD_USER_CREATE & 1) 304 if( DEBUG_THREAD_USER_CREATE < cycle ) 305 printk("\n[DBG] %s : stack vseg created / vpn_base %x / %d pages\n", 306 __FUNCTION__, vseg->vpn_base, vseg->vpn_size ); 307 #endif 308 303 309 // allocate memory for thread descriptor 304 310 thread = thread_alloc(); … … 313 319 #if( DEBUG_THREAD_USER_CREATE & 1) 314 320 if( DEBUG_THREAD_USER_CREATE < cycle ) 315 printk("\n[DBG] %s : thread descriptor %x allocated\n",321 printk("\n[DBG] %s : new thread descriptor %x allocated\n", 316 322 __FUNCTION__, thread ); 317 323 #endif … … 336 342 #if( DEBUG_THREAD_USER_CREATE & 1) 337 343 if( DEBUG_THREAD_USER_CREATE < cycle ) 338 printk("\n[DBG] %s : thread descriptor %x initialised / trdid =%x\n",339 __FUNCTION__, thread , thread->trdid );344 printk("\n[DBG] %s : new thread descriptor initialised / trdid %x\n", 345 __FUNCTION__, thread->trdid ); 340 346 #endif 341 347 … … 347 353 348 354 // allocate & initialize CPU context 349 if( hal_cpu_context_ create( thread ) )355 if( hal_cpu_context_alloc( thread ) ) 350 356 { 351 357 printk("\n[ERROR] in %s : cannot create CPU context\n", __FUNCTION__ ); … … 354 360 return ENOMEM; 355 361 } 356 357 // allocate FPU context 362 hal_cpu_context_init( thread ); 363 364 // allocate & initialize FPU context 358 365 if( hal_fpu_context_alloc( thread ) ) 359 366 { … … 363 370 return ENOMEM; 364 371 } 372 hal_fpu_context_init( thread ); 373 374 #if( DEBUG_THREAD_USER_CREATE & 1) 375 if( DEBUG_THREAD_USER_CREATE < cycle ) 376 printk("\n[DBG] %s : CPU & FPU contexts created\n", 377 __FUNCTION__, thread->trdid ); 378 vmm_display( process , true ); 379 #endif 365 380 366 381 #if DEBUG_THREAD_USER_CREATE 367 382 cycle = (uint32_t)hal_get_cycles(); 368 383 if( DEBUG_THREAD_USER_CREATE < cycle ) 369 printk("\n[DBG] %s : thread %x exit / new_thread %x in process%x / core %d / cycle %d\n",370 __FUNCTION__, CURRENT_THREAD , thread->trdid , pid, core_lid, cycle );384 printk("\n[DBG] %s : thread %x in process %x exit / new_thread %x / core %d / cycle %d\n", 385 __FUNCTION__, CURRENT_THREAD->trdid , pid, thread->trdid, core_lid, cycle ); 371 386 #endif 372 387 … … 554 569 } // end thread_user_fork() 555 570 571 //////////////////////////////////////////////// 572 error_t thread_user_exec( void * entry_func, 573 uint32_t argc, 574 char ** argv ) 575 { 576 thread_t * thread = CURRENT_THREAD; 577 process_t * process = thread->process; 578 579 #if DEBUG_THREAD_USER_EXEC 580 uint32_t cycle = (uint32_t)hal_get_cycles(); 581 if( DEBUG_THREAD_USER_EXEC < cycle ) 582 printk("\n[DBG] %s : thread %x in process %x enter / cycle %d\n", 583 __FUNCTION__, thread->trdid, process->pid, cycle ); 584 #endif 585 586 assert( (thread->type == THREAD_USER ) , __FUNCTION__, "bad type" ); 587 assert( (thread->signature == THREAD_SIGNATURE) , __FUNCTION__, "bad signature" ); 588 assert( (thread->local_locks == 0) , __FUNCTION__, "bad local locks" ); 589 assert( (thread->remote_locks == 0) , __FUNCTION__, "bad remote locks" ); 590 591 // re-initialize various thread descriptor fields 592 thread->quantum = 0; // TODO 593 thread->ticks_nr = 0; // TODO 594 thread->time_last_check = 0; // TODO 595 596 #if CONFIG_LOCKS_DEBUG 597 list_root_init( &thread->locks_root ); 598 xlist_root_init( XPTR( local_cxy , &thread->xlocks_root ) ); 599 #endif 600 601 thread->entry_func = entry_func; 602 thread->main_argc = argc; 603 thread->main_argv = argv; 604 605 // the main thread is always detached 606 thread->flags = THREAD_FLAG_DETACHED; 607 thread->blocked = 0; 608 thread->errno = 0; 609 thread->fork_user = 0; // not inherited 610 thread->fork_cxy = 0; // not inherited 611 612 // reset thread info 613 memset( &thread->info , 0 , sizeof(thread_info_t) ); 614 615 // initialize join_lock 616 remote_spinlock_init( XPTR( local_cxy , &thread->join_lock ) ); 617 618 // allocate an user stack vseg for main thread 619 vseg_t * vseg = vmm_create_vseg( process, 620 VSEG_TYPE_STACK, 621 0, // size unused 622 0, // length unused 623 0, // file_offset unused 624 0, // file_size unused 625 XPTR_NULL, // mapper_xp unused 626 local_cxy ); 627 if( vseg == NULL ) 628 { 629 printk("\n[ERROR] in %s : cannot create stack vseg for main thread\n", __FUNCTION__ ); 630 return -1; 631 } 632 633 // update user stack in stack descriptor 634 thread->u_stack_base = vseg->min; 635 thread->u_stack_size = vseg->max - vseg->min; 636 637 // release FPU ownership if required 638 if( thread->core->fpu_owner == thread ) thread->core->fpu_owner = NULL; 639 640 // re-initialize FPU context 641 hal_fpu_context_init( thread ); 642 643 #if DEBUG_THREAD_USER_EXEC 644 cycle = (uint32_t)hal_get_cycles(); 645 if( DEBUG_THREAD_USER_EXEC < cycle ) 646 printk("\n[DBG] %s : thread %x in process %x set CPU context & jump to user code / cycle %d\n", 647 __FUNCTION__, thread->trdid, process->pid, cycle ); 648 vmm_display( process , true ); 649 #endif 650 651 // re-initialize CPU context... and jump to user code 652 hal_cpu_context_exec( thread ); 653 654 assert( false, __FUNCTION__, "we should execute this code"); 655 656 return 0; 657 658 } // end thread_user_exec() 659 556 660 ///////////////////////////////////////////////////////// 557 661 error_t thread_kernel_create( thread_t ** new_thread, … … 594 698 { 595 699 thread_release( thread ); 700 return ENOMEM; 701 } 702 703 // allocate & initialize CPU context 704 error = hal_cpu_context_alloc( thread ); 705 if( error ) 706 { 707 thread_release( thread ); 596 708 return EINVAL; 597 709 } 598 599 // allocate & initialize CPU context 600 hal_cpu_context_create( thread ); 710 hal_cpu_context_init( thread ); 711 601 712 602 713 #if DEBUG_THREAD_KERNEL_CREATE … … 612 723 } // end thread_kernel_create() 613 724 614 ////////////////////////////////////////////// ///615 error_tthread_idle_init( thread_t * thread,616 617 618 619 725 ////////////////////////////////////////////// 726 void thread_idle_init( thread_t * thread, 727 thread_type_t type, 728 void * func, 729 void * args, 730 lid_t core_lid ) 620 731 { 621 732 assert( (type == THREAD_IDLE) , __FUNCTION__ , "illegal thread type" ); 622 623 733 assert( (core_lid < LOCAL_CLUSTER->cores_nr) , __FUNCTION__ , "illegal core index" ); 624 734 735 // initialize thread descriptor 625 736 error_t error = thread_init( thread, 626 737 &process_zero, … … 631 742 0 , 0 ); // no user stack for a kernel thread 632 743 744 assert( (error == 0), __FUNCTION__, "cannot create thread idle" ); 745 633 746 // allocate & initialize CPU context if success 634 if( error == 0 ) hal_cpu_context_create( thread ); 635 636 return error; 747 error = hal_cpu_context_alloc( thread ); 748 749 assert( (error == 0), __FUNCTION__, "cannot allocate CPU context" ); 750 751 hal_cpu_context_init( thread ); 637 752 638 753 } // end thread_idle_init() … … 798 913 799 914 #if DEBUG_THREAD_BLOCK 800 uint32_t cycle = (uint32_t)hal_get_cycles(); 915 uint32_t cycle = (uint32_t)hal_get_cycles(); 916 process_t * process = hal_remote_lpt( XPTR( cxy , &ptr->process ) ); 801 917 if( DEBUG_THREAD_BLOCK < cycle ) 802 printk("\n[DBG] %s : thread %x in cxy %x blocked thread %x in cxy %x / cause %x / cycle %d\n", 803 __FUNCTION__ , CURRENT_THREAD , local_cxy , ptr , cxy , cause , cycle ); 918 printk("\n[DBG] %s : thread %x in process %x blocked thread %x in process %x / cause %x\n", 919 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 920 ptr->trdid, hal_remote_lw(XPTR( cxy , &process->pid )), cause ); 804 921 #endif 805 922 … … 819 936 820 937 #if DEBUG_THREAD_BLOCK 821 uint32_t cycle = (uint32_t)hal_get_cycles(); 938 uint32_t cycle = (uint32_t)hal_get_cycles(); 939 process_t * process = hal_remote_lpt( XPTR( cxy , &ptr->process ) ); 822 940 if( DEBUG_THREAD_BLOCK < cycle ) 823 printk("\n[DBG] %s : thread %x in cxy %x unblocked thread %x in cxy %x / cause %x / cycle %d\n", 824 __FUNCTION__ , CURRENT_THREAD , local_cxy , ptr , cxy , cause , cycle ); 941 printk("\n[DBG] %s : thread %x in process %x unblocked thread %x in process %x / cause %x\n", 942 __FUNCTION__, CURRENT_THREAD->trdid, CURRENT_THREAD->process->pid, 943 ptr->trdid, hal_remote_lw(XPTR( cxy , &process->pid )), cause ); 825 944 #endif 826 945 -
trunk/kernel/kern/thread.h
r446 r457 26 26 #define _THREAD_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <shared_syscalls.h> 30 30 #include <hal_special.h> … … 161 161 void * entry_func; /*! pointer on entry function */ 162 162 void * entry_args; /*! pointer on entry function arguments */ 163 uint32_t main_argc; /*! main thread number of arguments */ 164 char ** main_argv; /*! main thread array of strings arguments */ 163 165 164 166 uint32_t flags; /*! bit vector of flags */ … … 218 220 * The CPU context is initialized from scratch. 219 221 * It is registered in the local process descriptor specified by the <pid> argument. 220 * The THREAD_BLOCKED_GLOBAL bit is set => the thread must be activated to start. 222 * The THREAD_BLOCKED_GLOBAL bit is set => the thread must be activated by the caller 223 * to start at the next scheduling point. 221 224 *************************************************************************************** 222 225 * @ pid : process identifier. … … 258 261 259 262 /*************************************************************************************** 263 * This function is called by the process_make_exec() function to re-initialise the 264 * thread descriptor of the calling thread (that will become the new process main 265 * thread), and immediately jump to user code without returning to kentry!!! 266 * It must be called by the main thread of the calling process. 267 * - A new user stack vseg is created and initialised. 268 * - The kernel stack (currently in use) is not modified. 269 * - The function calls the hal_cpu_context_exec() to re-initialize the CPU context 270 * an jump to user code. 271 *************************************************************************************** 272 * @ entry_func : main thread entry point. 273 * @ argc : number of main thread arguments. 274 * @ argv : array of pointers on stringarguments. 275 * @ returns 0 if success / returns ENOMEM if error. 276 **************************************************************************************/ 277 error_t thread_user_exec( void * entry_func, 278 uint32_t argc, 279 char ** argv); 280 281 /*************************************************************************************** 260 282 * This function allocates memory for a kernel thread descriptor in the local cluster, 261 283 * and initializes it from arguments values. … … 281 303 * descriptor from arguments values. 282 304 * The THREAD_BLOCKED_GLOBAL bit is set, and the thread must be activated to start. 305 * It returns a kernel panic if failure. 283 306 *************************************************************************************** 284 307 * @ thread : pointer on existing thread descriptor. … … 287 310 * @ args : function arguments. 288 311 * @ core_lid : local core index. 289 * @ returns 0 if success / returns EINVAL if error 290 **************************************************************************************/ 291 error_t thread_idle_init( thread_t * thread, 292 thread_type_t type, 293 void * func, 294 void * args, 295 lid_t core_lid ); 312 **************************************************************************************/ 313 void thread_idle_init( thread_t * thread, 314 thread_type_t type, 315 void * func, 316 void * args, 317 lid_t core_lid ); 296 318 297 319 /*************************************************************************************** -
trunk/kernel/kernel_config.h
r450 r457 27 27 #define _ALMOS_CONFIG_H_ 28 28 29 #define CONFIG_ALMOS_VERSION "Version 1.0 / March2018"29 #define CONFIG_ALMOS_VERSION "Version 1.0 / August 2018" 30 30 31 31 //////////////////////////////////////////////////////////////////////////////////////////// … … 76 76 #define DEBUG_HAL_IOC_RX 0 77 77 #define DEBUG_HAL_IOC_TX 0 78 #define DEBUG_HAL_GPT 78 #define DEBUG_HAL_GPT 0 79 79 80 80 #define DEBUG_KCM 0 … … 117 117 118 118 #define DEBUG_SCHED_HANDLE_SIGNALS 2 119 #define DEBUG_SCHED_YIELD 2// must be activated by the trace() syscall119 #define DEBUG_SCHED_YIELD 1 // must be activated by the trace() syscall 120 120 121 121 #define DEBUG_SYSCALLS_ERROR 2 122 122 123 123 #define DEBUG_SYS_DISPLAY 0 124 #define DEBUG_SYS_EXEC 1125 #define DEBUG_SYS_EXIT 1124 #define DEBUG_SYS_EXEC 0 125 #define DEBUG_SYS_EXIT 0 126 126 #define DEBUG_SYS_FG 0 127 127 #define DEBUG_SYS_FORK 0 128 128 #define DEBUG_SYS_GET_CONFIG 0 129 129 #define DEBUG_SYS_ISATTY 0 130 #define DEBUG_SYS_IS_FG 0 130 131 #define DEBUG_SYS_KILL 0 131 132 #define DEBUG_SYS_MMAP 0 … … 154 155 #define DEBUG_THREAD_USER_CREATE 0 155 156 #define DEBUG_THREAD_USER_FORK 0 157 #define DEBUG_THREAD_USER_EXEC 0 156 158 #define DEBUG_THREAD_BLOCK 0 157 159 -
trunk/kernel/libk/barrier.c
r16 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_atomic.h> -
trunk/kernel/libk/barrier.h
r423 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 /***************************************************************************************** -
trunk/kernel/libk/bits.c
r351 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <bits.h> 27 27 -
trunk/kernel/libk/bits.h
r454 r457 27 27 28 28 #include <kernel_config.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 31 31 /********************************************************************************************* -
trunk/kernel/libk/ctype.c
r1 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 26 26 //////////////////// -
trunk/kernel/libk/elf.c
r441 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <hal_uspace.h> … … 210 210 } // end elf_segments_register() 211 211 212 ////////////////////////////////////////////// /213 error_t elf_load_process( char * pathname,214 process_t * process )212 ////////////////////////////////////////////// 213 error_t elf_load_process( xptr_t file_xp, 214 process_t * process ) 215 215 { 216 216 kmem_req_t req; // kmem request for program header … … 218 218 void * segs_base; // pointer on buffer for segment descriptors array 219 219 uint32_t segs_size; // size of buffer for segment descriptors array 220 xptr_t file_xp; // extended pointer on created file descriptor 221 uint32_t file_id; // file descriptor index (unused) 220 char name[CONFIG_VFS_MAX_NAME_LENGTH]; 222 221 error_t error; 223 222 223 // get file name for error reporting and debug 224 cxy_t file_cxy = GET_CXY( file_xp ); 225 vfs_file_t * file_ptr = GET_PTR( file_xp ); 226 vfs_inode_t * inode = hal_remote_lpt( XPTR( file_cxy , &file_ptr->inode ) ); 227 vfs_inode_get_name( XPTR( file_cxy , inode ) , name ); 228 224 229 #if DEBUG_ELF_LOAD 225 uint32_t cycle = (uint32_t)hal_get_cycles(); 226 if( DEBUG_ELF_LOAD < cycle ) 227 printk("\n[DBG] %s : thread %d enter for <%s> / cycle %d\n", 228 __FUNCTION__, CURRENT_THREAD, pathname, cycle ); 229 #endif 230 231 // avoid GCC warning 232 file_xp = XPTR_NULL; 233 file_id = -1; 234 235 // open file 236 error = vfs_open( process, 237 pathname, 238 O_RDONLY, 239 0, 240 &file_xp, 241 &file_id ); 242 if( error ) 243 { 244 printk("\n[ERROR] in %s : failed to open file <%s>\n", __FUNCTION__ , pathname ); 245 return -1; 246 } 247 248 #if (DEBUG_ELF_LOAD & 1) 249 if( DEBUG_ELF_LOAD < cycle ) 250 printk("\n[DBG] %s : open file <%s>\n", __FUNCTION__, pathname ); 230 uint32_t cycle = (uint32_t)hal_get_cycles(); 231 if( DEBUG_ELF_LOAD < cycle ) 232 printk("\n[DBG] %s : thread %d in process %x enter for <%s> / cycle %d\n", 233 __FUNCTION__, CURRENT_THREAD->trdid, process->pid, name, cycle ); 251 234 #endif 252 235 … … 257 240 if( error ) 258 241 { 259 printk("\n[ERROR] in %s : cannot get header for <%s>\n", __FUNCTION__ , pathname ); 260 vfs_close( file_xp , file_id ); 242 printk("\n[ERROR] in %s : cannot get header for <%s>\n", __FUNCTION__ , name ); 261 243 return -1; 262 244 } … … 264 246 #if (DEBUG_ELF_LOAD & 1) 265 247 if( DEBUG_ELF_LOAD < cycle ) 266 printk("\n[DBG] %s : loaded elf header for <%s>\n", __FUNCTION__ , pathname );248 printk("\n[DBG] %s : loaded elf header for <%s>\n", __FUNCTION__ , name ); 267 249 #endif 268 250 … … 270 252 { 271 253 printk("\n[ERROR] in %s : no segments found\n", __FUNCTION__ ); 272 vfs_close( file_xp , file_id );273 254 return -1; 274 255 } … … 286 267 { 287 268 printk("\n[ERROR] in %s : no memory for segment descriptors\n", __FUNCTION__ ); 288 vfs_close( file_xp , file_id );289 269 return -1; 290 270 } … … 296 276 { 297 277 printk("\n[ERROR] in %s : cannot seek for descriptors array\n", __FUNCTION__ ); 298 vfs_close( file_xp , file_id );299 278 req.ptr = segs_base; 300 279 kmem_free( &req ); … … 304 283 #if (DEBUG_ELF_LOAD & 1) 305 284 if( DEBUG_ELF_LOAD < cycle ) 306 printk("\n[DBG] %s : segments array allocated for <%s>\n", __FUNCTION__ , pathname );285 printk("\n[DBG] %s : segments array allocated for <%s>\n", __FUNCTION__ , name ); 307 286 #endif 308 287 … … 316 295 { 317 296 printk("\n[ERROR] in %s : cannot read segments descriptors\n", __FUNCTION__ ); 318 vfs_close( file_xp , file_id );319 297 req.ptr = segs_base; 320 298 kmem_free( &req ); … … 324 302 #if (DEBUG_ELF_LOAD & 1) 325 303 if( DEBUG_ELF_LOAD < cycle ) 326 printk("\n[DBG] %s loaded segments descriptors for <%s>\n", __FUNCTION__ , pathname );304 printk("\n[DBG] %s loaded segments descriptors for <%s>\n", __FUNCTION__ , name ); 327 305 #endif 328 306 … … 334 312 if( error ) 335 313 { 336 vfs_close( file_xp , file_id );337 314 req.ptr = segs_base; 338 315 kmem_free( &req ); … … 353 330 cycle = (uint32_t)hal_get_cycles(); 354 331 if( DEBUG_ELF_LOAD < cycle ) 355 printk("\n[DBG] %s : thread % dexit for <%s> / entry_point %x / cycle %d\n",356 __FUNCTION__, CURRENT_THREAD , pathname, header.e_entry, cycle );332 printk("\n[DBG] %s : thread %x in process %x exit for <%s> / entry_point %x / cycle %d\n", 333 __FUNCTION__, CURRENT_THREAD->trdid, process->pid, name, header.e_entry, cycle ); 357 334 #endif 358 335 -
trunk/kernel/libk/elf.h
r273 r457 22 22 #define _ELF_H_ 1 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 26 26 /* … … 204 204 #define PF_MASKPROC 0xf0000000 /* Processor-specific */ 205 205 206 #if defined(HAL_ 32BIT)206 #if defined(HAL_ELF_32_BITS) 207 207 #define Elf_Half Elf32_Half 208 208 #define Elf_Word Elf32_Word … … 213 213 #define Elf_Phdr Elf32_Phdr 214 214 #define ELFCLASS ELFCLASS32 215 #elif defined (HAL_ 64BIT)215 #elif defined (HAL_ELF_64_BITS) 216 216 #define Elf_Half Elf64_Half 217 217 #define Elf_Word Elf64_Word … … 224 224 #define ELFCLASS ELFCLASS64 225 225 #else 226 #error "Must define HAL_ 64BIT/HAL_32BIT"226 #error "Must define HAL_ELF_64_BITS / HAL_ELF_32_BITS" 227 227 #endif 228 228 229 229 /**************************************************************************************** 230 * This function registers in VMM the CODE and DATA vsegs defined in the .elf file. 230 * This function registers in VMM of the process identified by the <process> argument 231 * the CODE and DATA vsegs defined in the .elf open file descriptor <file_xp>. 231 232 * The segments are not loaded in memory. 232 233 * It also registers the process entry point in VMM. 233 234 **************************************************************************************** 234 * @ pathname : local pointer on .elf file pathname (in kernel space).235 * @ file_xp : extended pointer on .elf file descriptor. 235 236 * @ process : local pointer on target process descriptor. 236 237 ***************************************************************************************/ 237 error_t elf_load_process( char * pathname,238 error_t elf_load_process( xptr_t file_xp, 238 239 process_t * process); 239 240 -
trunk/kernel/libk/grdxt.c
r423 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <errno.h> -
trunk/kernel/libk/grdxt.h
r406 r457 25 25 #define _GRDXT_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 29 29 /******************************************************************************************* -
trunk/kernel/libk/htab.c
r423 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <htab.h> -
trunk/kernel/libk/htab.h
r23 r457 26 26 #define _HTAB_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <rwlock.h> 30 30 #include <list.h> -
trunk/kernel/libk/list.h
r450 r457 27 27 28 28 #include <kernel_config.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 31 31 #ifndef NULL -
trunk/kernel/libk/memcpy.c
r113 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <printk.h> 26 26 -
trunk/kernel/libk/memcpy.h
r113 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 26 26 -
trunk/kernel/libk/readlock.c
r124 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_atomic.h> 27 27 #include <hal_special.h> -
trunk/kernel/libk/readlock.h
r14 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 /******************************************************************************************* -
trunk/kernel/libk/remote_barrier.c
r436 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_irqmask.h> -
trunk/kernel/libk/remote_barrier.h
r23 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <remote_spinlock.h> 30 30 #include <xlist.h> -
trunk/kernel/libk/remote_condvar.c
r436 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_irqmask.h> -
trunk/kernel/libk/remote_condvar.h
r23 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <remote_spinlock.h> 30 30 #include <xlist.h> -
trunk/kernel/libk/remote_fifo.c
r408 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_irqmask.h> 27 27 #include <hal_remote.h> -
trunk/kernel/libk/remote_fifo.h
r407 r457 27 27 28 28 #include <kernel_config.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <printk.h> 31 31 #include <errno.h> -
trunk/kernel/libk/remote_mutex.c
r436 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_special.h> -
trunk/kernel/libk/remote_mutex.h
r23 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <xlist.h> 30 30 -
trunk/kernel/libk/remote_rwlock.c
r438 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_irqmask.h> -
trunk/kernel/libk/remote_rwlock.h
r438 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <xlist.h> 30 30 -
trunk/kernel/libk/remote_sem.c
r436 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <thread.h> … … 75 75 76 76 /////////////////////////////////////////// 77 error_t remote_sem_create( intptr_t vaddr, 78 uint32_t value ) 79 { 77 error_t remote_sem_create( intptr_t vaddr, 78 uint32_t value, 79 xptr_t sem_xp_xp ) 80 { 81 remote_sem_t * sem_ptr; 80 82 xptr_t sem_xp; 81 remote_sem_t * sem_ptr;82 83 83 84 // get pointer on local process descriptor … … 103 104 { 104 105 rpc_kcm_alloc_client( ref_cxy , KMEM_SEM , &sem_xp ); 105 sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );106 } 107 108 if( sem_xp == XPTR_NULL ) return ENOMEM;106 sem_ptr = GET_PTR( sem_xp ); 107 } 108 109 if( sem_xp == XPTR_NULL ) return -1; 109 110 110 111 // initialise semaphore 111 112 hal_remote_sw ( XPTR( ref_cxy , &sem_ptr->count ) , value ); 112 113 hal_remote_spt( XPTR( ref_cxy , &sem_ptr->ident ) , (void *)vaddr ); 113 114 114 remote_spinlock_init( XPTR( ref_cxy , &sem_ptr->lock ) ); 115 115 xlist_root_init( XPTR( ref_cxy , &sem_ptr->root ) ); … … 119 119 xptr_t root_xp = XPTR( ref_cxy , &ref_ptr->sem_root ); 120 120 xptr_t xp_list = XPTR( ref_cxy , &sem_ptr->list ); 121 122 121 remote_spinlock_lock( XPTR( ref_cxy , &ref_ptr->sync_lock ) ); 123 122 xlist_add_first( root_xp , xp_list ); 124 123 remote_spinlock_unlock( XPTR( ref_cxy , &ref_ptr->sync_lock ) ); 125 124 125 // write extended pointer on semaphore in calling thread buffer 126 hal_remote_swd( sem_xp_xp , sem_xp ); 127 126 128 return 0; 127 129 128 } // en remote_sem_ init()130 } // en remote_sem_create() 129 131 130 132 //////////////////////////////////////// … … 139 141 // get reference process cluster and local pointer 140 142 cxy_t ref_cxy = GET_CXY( ref_xp ); 141 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );143 process_t * ref_ptr = GET_PTR( ref_xp ); 142 144 143 145 // get semaphore cluster and local pointer … … 148 150 remote_spinlock_lock( XPTR( sem_cxy , &sem_ptr->lock ) ); 149 151 150 // get remote pointer on waiting queue 151 xptr_t root_xp = (xptr_t)hal_remote_lwd( XPTR( sem_cxy , &sem_ptr->root ));152 // get remote pointer on waiting queue root 153 xptr_t root_xp = XPTR( sem_cxy , &sem_ptr->root ); 152 154 153 155 if( !xlist_is_empty( root_xp ) ) // user error … … 184 186 } // end remote_sem_destroy() 185 187 186 ////////////////////////////////// 188 ///////////////////////////////////// 187 189 void remote_sem_wait( xptr_t sem_xp ) 188 190 { 189 191 // get semaphore cluster and local pointer 190 192 cxy_t sem_cxy = GET_CXY( sem_xp ); 191 remote_sem_t * sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );193 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 192 194 193 195 // get lock protecting semaphore … … 210 212 211 213 // register thread in waiting queue 212 xptr_t root_xp = (xptr_t)hal_remote_lwd( XPTR( sem_cxy , &sem_ptr->root ));213 xptr_t thread_xp = XPTR( local_cxy , this);214 xlist_add_last( root_xp , thread_xp );214 xptr_t root_xp = XPTR( sem_cxy , &sem_ptr->root ); 215 xptr_t list_xp = XPTR( local_cxy , &this->wait_list ); 216 xlist_add_last( root_xp , list_xp ); 215 217 216 218 // release lock … … 228 230 // get semaphore cluster and local pointer 229 231 cxy_t sem_cxy = GET_CXY( sem_xp ); 230 remote_sem_t * sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );232 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 231 233 232 234 // get lock protecting semaphore 233 235 remote_spinlock_lock( XPTR( sem_cxy , &sem_ptr->lock ) ); 234 236 237 // get semaphore current value 238 uint32_t count = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) ); 239 235 240 // get remote pointer on waiting queue root 236 xptr_t root_xp = (xptr_t)hal_remote_lwd( XPTR( sem_cxy , &sem_ptr->root ));241 xptr_t root_xp = XPTR( sem_cxy , &sem_ptr->root ); 237 242 238 243 if( xlist_is_empty( root_xp ) ) // no waiting thread 239 244 { 240 // get semaphore current value241 uint32_t count = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) );242 243 245 // increment semaphore value 244 246 hal_remote_sw( XPTR( sem_cxy , &sem_ptr->count ) , count + 1 ); … … 251 253 // get thread cluster and local poiner 252 254 cxy_t thread_cxy = GET_CXY( thread_xp ); 253 thread_t * thread_ptr = (thread_t *)GET_PTR( thread_xp );254 255 // remove th e thread from the waiting queue, and unblock255 thread_t * thread_ptr = GET_PTR( thread_xp ); 256 257 // remove this thread from the waiting queue, and unblock it 256 258 xlist_unlink( XPTR( thread_cxy , &thread_ptr->wait_list ) ); 257 259 thread_unblock( thread_xp , THREAD_BLOCKED_SEM ); … … 270 272 // get semaphore cluster and local pointer 271 273 cxy_t sem_cxy = GET_CXY( sem_xp ); 272 remote_sem_t * sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );274 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 273 275 274 276 *data = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) ); -
trunk/kernel/libk/remote_sem.h
r23 r457 25 25 #define _SEMAPHORE_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <xlist.h> 29 29 #include <remote_spinlock.h> … … 77 77 * This function implements the SEM_INIT operation. 78 78 * It allocates memory for a remote semaphore in reference cluster, using a RPC if required, 79 * and initializes it, using remote accesses. 79 * and initializes it, using remote accesses from values defined by the <vaddr> and <value> 80 * arguments. It uses also a remote access to return the extended pointer on the semaphore 81 * in the buffer identified by the <buf_xp> argument. 80 82 ********************************************************************************************* 81 * @ vaddr : semaphore virtual address, used as identifier. 82 * @ value : semaphore initial value. 83 * @ returns 0 if success / returns ENOMEM if error. 83 * @ vaddr : [in] semaphore virtual address, used as identifier. 84 * @ value : [in] semaphore initial value. 85 * @ sem_xp_xp : [out] extended pointer on buffer to store extended pointer on semaphore. 86 * @ returns 0 if success / returns -1 if no memory. 84 87 ********************************************************************************************/ 85 88 error_t remote_sem_create( intptr_t vaddr, 86 uint32_t value ); 89 uint32_t value, 90 xptr_t sem_xp_xp ); 87 91 88 92 /****************************yy*************************************************************** … … 91 95 * reference cluster, using a RPC if required. 92 96 ********************************************************************************************* 93 * @ sem_xp : extended pointer on semaphore.97 * @ sem_xp : [in] extended pointer on semaphore. 94 98 ********************************************************************************************/ 95 99 void remote_sem_destroy( xptr_t sem_xp ); … … 102 106 * waiting queue, block the thread, and yield. 103 107 ********************************************************************************************* 104 * @ sem_xp : extended pointer on semaphore.108 * @ sem_xp : [in] extended pointer on semaphore. 105 109 ********************************************************************************************/ 106 110 void remote_sem_wait( xptr_t sem_xp ); … … 111 115 * - If the waiting queue is not empty, it wakes up the first waiting thread. 112 116 ********************************************************************************************* 113 * @ sem_xp : extended pointer on semaphore.117 * @ sem_xp : [in] extended pointer on semaphore. 114 118 ********************************************************************************************/ 115 119 void remote_sem_post( xptr_t sem_xp ); … … 119 123 * It returns in the <data> buffer the semaphore current value. 120 124 ********************************************************************************************* 121 * @ sem_xp : extended pointer on semaphore.122 * @ data : [out] returned value.125 * @ sem_xp : [in] extended pointer on semaphore. 126 * @ data : [out] local pointer on buffer for returned value. 123 127 ********************************************************************************************/ 124 128 void remote_sem_get_value( xptr_t sem_xp, -
trunk/kernel/libk/remote_spinlock.c
r443 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_irqmask.h> -
trunk/kernel/libk/remote_spinlock.h
r438 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <xlist.h> 30 30 -
trunk/kernel/libk/rwlock.c
r438 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_atomic.h> 27 27 #include <hal_special.h> -
trunk/kernel/libk/rwlock.h
r438 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <list.h> 30 30 -
trunk/kernel/libk/spinlock.c
r438 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_atomic.h> 28 28 #include <hal_special.h> -
trunk/kernel/libk/spinlock.h
r438 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <list.h> 30 30 -
trunk/kernel/libk/string.c
r337 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <ctype.h> 27 27 #include <string.h> -
trunk/kernel/libk/string.h
r323 r457 26 26 #define _STRING_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 30 30 -
trunk/kernel/libk/xhtab.c
r423 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <hal_remote.h> -
trunk/kernel/libk/xhtab.h
r204 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <remote_rwlock.h> 30 30 #include <xlist.h> -
trunk/kernel/libk/xlist.h
r435 r457 26 26 27 27 #include <kernel_config.h> 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <hal_remote.h> 30 30 -
trunk/kernel/mm/kcm.c
r438 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <list.h> -
trunk/kernel/mm/kcm.h
r437 r457 27 27 28 28 #include <list.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <spinlock.h> 31 31 #include <page.h> -
trunk/kernel/mm/khm.c
r315 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <spinlock.h> -
trunk/kernel/mm/khm.h
r18 r457 28 28 29 29 #include <kernel_config.h> 30 #include <hal_ types.h>30 #include <hal_kernel_types.h> 31 31 #include <spinlock.h> 32 32 -
trunk/kernel/mm/kmem.c
r438 r457 25 25 26 26 #include <kernel_config.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <hal_special.h> 29 29 #include <printk.h> -
trunk/kernel/mm/kmem.h
r188 r457 27 27 #define _KMEM_H_ 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <kcm.h> 31 31 -
trunk/kernel/mm/mapper.c
r440 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <hal_uspace.h> -
trunk/kernel/mm/mapper.h
r440 r457 26 26 #define _MAPPER_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <hal_atomic.h> 30 30 #include <xlist.h> -
trunk/kernel/mm/page.c
r436 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <hal_atomic.h> -
trunk/kernel/mm/page.h
r433 r457 27 27 28 28 #include <kernel_config.h> 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <spinlock.h> 31 31 #include <list.h> -
trunk/kernel/mm/ppm.c
r438 r457 24 24 25 25 #include <kernel_config.h> 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <printk.h> -
trunk/kernel/mm/ppm.h
r433 r457 26 26 #define _PPM_H_ 27 27 28 #include <hal_ types.h>28 #include <hal_kernel_types.h> 29 29 #include <list.h> 30 30 #include <spinlock.h> -
trunk/kernel/mm/vmm.c
r443 r457 25 25 26 26 #include <kernel_config.h> 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <hal_special.h> 29 29 #include <hal_gpt.h> … … 170 170 vmm->stack_mgr.bitmap = 0; 171 171 vmm->stack_mgr.vpn_base = CONFIG_VMM_STACK_BASE; 172 spinlock_init( &vmm->stack_mgr.lock ); 172 173 173 174 // initialize MMAP allocator … … 175 176 vmm->mmap_mgr.vpn_size = CONFIG_VMM_STACK_BASE - CONFIG_VMM_HEAP_BASE; 176 177 vmm->mmap_mgr.first_free_vpn = CONFIG_VMM_HEAP_BASE; 178 spinlock_init( &vmm->mmap_mgr.lock ); 179 177 180 uint32_t i; 178 181 for( i = 0 ; i < 32 ; i++ ) list_root_init( &vmm->mmap_mgr.zombi_list[i] ); … … 201 204 gpt_t * gpt = &vmm->gpt; 202 205 203 printk("\n***** VSL and GPT for process %x in cluster %x\n\n", process->pid , local_cxy ); 206 printk("\n***** VSL and GPT(%x) for process %x in cluster %x\n\n", 207 process->vmm.gpt.ptr , process->pid , local_cxy ); 204 208 205 209 // get lock protecting the vseg list -
trunk/kernel/mm/vmm.h
r440 r457 27 27 #define _VMM_H_ 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <bits.h> 31 31 #include <list.h> -
trunk/kernel/mm/vseg.c
r453 r457 24 24 */ 25 25 26 #include <hal_ types.h>26 #include <hal_kernel_types.h> 27 27 #include <hal_special.h> 28 28 #include <hal_remote.h> … … 171 171 switch (vseg->type) 172 172 { 173 case VSEG_TYPE_DATA: { 173 case VSEG_TYPE_DATA: 174 { 174 175 vseg->cxy = 0xffff; 175 176 break; 176 177 } 177 178 case VSEG_TYPE_CODE: 178 case VSEG_TYPE_STACK: { 179 case VSEG_TYPE_STACK: 180 { 179 181 vseg->cxy = local_cxy; 180 182 break; … … 182 184 case VSEG_TYPE_ANON: 183 185 case VSEG_TYPE_FILE: 184 case VSEG_TYPE_REMOTE: { 186 case VSEG_TYPE_REMOTE: 187 { 185 188 vseg->cxy = (cxy_t) hal_remote_lw( XPTR(cxy, &ptr->cxy) ); 186 189 break; 187 190 } 188 default: { 191 default: 192 { 189 193 assert( false, __FUNCTION__, "Illegal vseg type" ); 190 194 break; -
trunk/kernel/mm/vseg.h
r454 r457 27 27 #define _VSEG_H_ 28 28 29 #include <hal_ types.h>29 #include <hal_kernel_types.h> 30 30 #include <spinlock.h> 31 31 #include <vfs.h> -
trunk/kernel/syscalls/shared_include/shared_pthread.h
r445 r457 29 29 ******************************************************************************************/ 30 30 31 typedef unsigned int sem_t;32 31 typedef unsigned int pthread_cond_t; 33 32 typedef unsigned int pthread_condattr_t; … … 56 55 PT_ATTR_CORE_DEFINED = 0x0004, /*! user defined core index in cluster */ 57 56 }; 58 59 /*******************************************************************************************60 * This enum defines the operation mnemonics for operations on POSIX unnamed semaphores.61 ******************************************************************************************/62 63 typedef enum64 {65 SEM_INIT,66 SEM_DESTROY,67 SEM_GETVALUE,68 SEM_WAIT,69 SEM_POST,70 }71 sem_operation_t;72 57 73 58 /******************************************************************************************* -
trunk/kernel/syscalls/shared_include/syscalls_numbers.h
r444 r457 62 62 SYS_TRACE = 47, 63 63 SYS_FG = 48, 64 SYS_ UNDEFINED_49 = 49, ///64 SYS_IS_FG = 49, 65 65 66 66 SYSCALLS_NR = 50, -
trunk/kernel/syscalls/sys_alarm.c
r23 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <thread.h> 26 26 #include <printk.h> -
trunk/kernel/syscalls/sys_barrier.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <errno.h> -
trunk/kernel/syscalls/sys_chdir.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <chdev.h> -
trunk/kernel/syscalls/sys_chmod.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <vfs.h> -
trunk/kernel/syscalls/sys_close.c
r124 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_special.h> 27 27 #include <vfs.h> -
trunk/kernel/syscalls/sys_closedir.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <vfs.h> 26 26 #include <printk.h> -
trunk/kernel/syscalls/sys_condvar.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <errno.h> -
trunk/kernel/syscalls/sys_creat.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <vfs.h> 26 26 #include <syscalls.h> -
trunk/kernel/syscalls/sys_display.c
r450 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <errno.h> -
trunk/kernel/syscalls/sys_exec.c
r441 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <errno.h> … … 152 152 // It build an exec_info_t structure containing all informations 153 153 // required to initialize the new process descriptor and the associated thread. 154 // It includes the process main() arguments, the environment variables,154 // It includes the new process main() arguments, the environment variables, 155 155 // and the pathname to the new process .elf file. 156 156 // It calls the process_exec_get_strings() functions to copy the main() arguments and 157 157 // the environment variables from user buffers to the exec_info_t structure, allocate 158 158 // and call the process_make_exec() function. 159 // As it must destroy all parent process copies, and all parent threads in all clusters, 160 // the process_make_exec() function must be executed in the parent owner cluster, 161 // and this sys_exec() function uses a RPC to access the owner cluster if required. 159 // As it must destroy all process copies, and all othert threads in all clusters, 160 // the process_make_exec() function must be executed in the owner cluster. 162 161 // 163 162 // TODO : the args & envs arguments are not supported yet : both must be NULL [AG] … … 187 186 "args not supported yet\n" ); 188 187 189 // get owner cluster190 191 188 // check pathname length 192 189 if( hal_strlen_from_uspace( pathname ) >= CONFIG_VFS_MAX_PATH_LENGTH ) … … 205 202 #if DEBUG_SYS_EXEC 206 203 uint64_t tm_start; 207 uint64_t tm_end;208 204 tm_start = hal_get_cycles(); 209 205 if( DEBUG_SYS_EXEC < tm_start ) 210 206 printk("\n[DBG] %s : thread %x in process %x enter for path <%s> / cycle = %d\n", 211 __FUNCTION__, this , pid, exec_info.path, (uint32_t)tm_start );207 __FUNCTION__, this->trdid, pid, exec_info.path, (uint32_t)tm_start ); 212 208 #endif 213 209 … … 220 216 #if DEBUG_SYSCALLS_ERROR 221 217 printk("\n[ERROR] in %s : thread %x in process %x cannot access args\n", 222 __FUNCTION__ , this , pid );218 __FUNCTION__ , this->trdid, pid ); 223 219 #endif 224 220 this->errno = EINVAL; … … 235 231 #if DEBUG_SYCALLS_ERROR 236 232 printk("\n[ERROR] in %s : thread %x in process %x cannot access envs\n", 237 __FUNCTION__ , this , pid );233 __FUNCTION__ , this->trdid, pid ); 238 234 #endif 239 235 this->errno = EINVAL; … … 250 246 #if DEBUG_SYSCALLS_ERROR 251 247 printk("\n[ERROR] in %s : thread %x in process %x cannot create process for <%s>\n", 252 __FUNCTION__, this , pid, exec_info.path );248 __FUNCTION__, this->trdid, pid, exec_info.path ); 253 249 #endif 254 250 this->errno = error; … … 256 252 } 257 253 258 #if DEBUG_SYS_EXEC 259 tm_end = hal_get_cycles(); 260 if( DEBUG_SYS_EXEC < tm_end ) 261 printk("\n[DBG] %s : thread %x in process %x exit / cost = %d / cycle %d\n", 262 __FUNCTION__, this, pid, (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 263 #endif 264 265 // In case of success, this calling thread deschedules, causing suicide, 266 // because a new process descriptor and its associated main thread 267 // have been created by the process_make_exec() function, and the 268 // BLOCKED_GLOBAL & FLAG_REQ_DELETE bits have been set for the calling thread. 269 sched_yield( "old process suicide in sys_exec()" ); 254 assert( false , __FUNCTION__, "we should not execute this code" ); 270 255 271 256 return 0; -
trunk/kernel/syscalls/sys_exit.c
r446 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_irqmask.h> 27 27 #include <errno.h> … … 59 59 tm_start = hal_get_cycles(); 60 60 if( DEBUG_SYS_EXIT < tm_start ) 61 printk("\n[DBG] %s : thread %x enter / process %x/ status %x / cycle %d\n",62 __FUNCTION__ , this,pid , status , (uint32_t)tm_start );61 printk("\n[DBG] %s : thread %x in process %x enter / status %x / cycle %d\n", 62 __FUNCTION__, this->trdid, process->pid , status , (uint32_t)tm_start ); 63 63 #endif 64 64 … … 70 70 #if (DEBUG_SYS_EXIT & 1) 71 71 if( DEBUG_SYS_EXIT < tm_start ) 72 printk("\n[DBG] %s : thread %x get owner process %x in cluster %x\n",73 __FUNCTION__ , this, owner_ptr, owner_cxy );72 printk("\n[DBG] %s : thread %x in process %x get owner process %x in cluster %x\n", 73 __FUNCTION__, this->trdid, process->pid, owner_ptr, owner_cxy ); 74 74 #endif 75 75 76 // get pointer on the process main thread76 // get local pointer on the process main thread 77 77 main_ptr = hal_remote_lpt( XPTR( owner_cxy , &owner_ptr->th_tbl[0] ) ); 78 78 … … 84 84 #if (DEBUG_SYS_EXIT & 1) 85 85 if( DEBUG_SYS_EXIT < tm_start ) 86 printk("\n[DBG] %s : thread %x get parent process %x in cluster %x\n",87 __FUNCTION__ , this, parent_ptr, parent_cxy );86 printk("\n[DBG] %s : thread %x in process %x get parent process %x in cluster %x\n", 87 __FUNCTION__, this->trdid, process->pid, parent_ptr, parent_cxy ); 88 88 #endif 89 89 … … 99 99 100 100 #if( DEBUG_SYS_EXIT & 1) 101 if( tm_start > DEBUG_SYS_EXIT)102 printk("\n[DBG] %s : thread %x removed process %x from TXT list\n",103 __FUNCTION__ , this,pid );101 if( DEBUG_SYS_EXIT < tm_start ) 102 printk("\n[DBG] %s : thread %x in process %x detached process from TXT\n", 103 __FUNCTION__, this->trdid, process->pid ); 104 104 #endif 105 105 … … 107 107 // but the main thread and this calling thread 108 108 hal_enable_irq( &save_sr ); 109 process_sigaction( p id , DELETE_ALL_THREADS );109 process_sigaction( process->pid , DELETE_ALL_THREADS ); 110 110 hal_restore_irq( save_sr ); 111 111 112 112 #if( DEBUG_SYS_EXIT & 1) 113 if( tm_start > DEBUG_SYS_EXIT)114 printk("\n[DBG] %s : thread %x deleted threads for process %x\n",115 __FUNCTION__ , this,pid );113 if( DEBUG_SYS_EXIT < tm_start ) 114 printk("\n[DBG] %s : thread %x in process %x deleted all threads but itself\n", 115 __FUNCTION__, this->trdid, process->pid ); 116 116 #endif 117 117 … … 122 122 #if( DEBUG_SYS_EXIT & 1) 123 123 if( tm_start > DEBUG_SYS_EXIT ) 124 printk("\n[DBG] %s : calling thread %x marked iself for delete in process %x\n",125 __FUNCTION__ , this,pid );124 printk("\n[DBG] %s : thread %x in process %x marked iself for delete\n", 125 __FUNCTION__, this->trdid, process->pid ); 126 126 #endif 127 127 thread_delete( XPTR( local_cxy , this ) , pid , true ); … … 133 133 #if( DEBUG_SYS_EXIT & 1) 134 134 if( tm_start > DEBUG_SYS_EXIT ) 135 printk("\n[DBG] %s : thread %x blocked main thread for process %x\n",136 __FUNCTION__, this ,pid );135 printk("\n[DBG] %s : thread %x in process %x blocked main thread\n", 136 __FUNCTION__, this->trdid, process->pid ); 137 137 #endif 138 138 … … 144 144 #if( DEBUG_SYS_EXIT & 1) 145 145 if( tm_start > DEBUG_SYS_EXIT ) 146 printk("\n[DBG] %s : thread %x set exit status in process %x / term_state %x\n",147 __FUNCTION__ , this,pid, term_state );146 printk("\n[DBG] %s : thread %x in process %x set exit status %x in owner process\n", 147 __FUNCTION__, this->trdid, process->pid, term_state ); 148 148 #endif 149 149 150 // take the children lock andunblock the parent process main thread150 // unblock the parent process main thread 151 151 remote_spinlock_lock( children_lock_xp ); 152 152 thread_unblock( parent_main_xp , THREAD_BLOCKED_WAIT ); … … 155 155 #if( DEBUG_SYS_EXIT & 1) 156 156 if( tm_start > DEBUG_SYS_EXIT ) 157 printk("\n[DBG] %s : thread %x in cluster %x unblock parent main thread %x in cluster %x\n", 158 __FUNCTION__ , this, local_cxy, parent_main_ptr, parent_cxy ); 157 printk("\n[DBG] %s : thread %x in process %x unblock parent main thread in process %x\n", 158 __FUNCTION__ , this->trdid, process->pid, 159 hal_remote_lw( XPTR( parent_cxy , &parent_ptr->pid) ) ); 159 160 #endif 160 161 … … 164 165 tm_end = hal_get_cycles(); 165 166 if( DEBUG_SYS_EXIT < tm_end ) 166 printk("\n[DBG] %s : thread %x exit / process %x / status %x / cost = %d / cycle %d\n", 167 __FUNCTION__, this, pid, status, (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 167 printk("\n[DBG] %s : thread %x in process %x exit / status %x / cost = %d / cycle %d\n", 168 __FUNCTION__, this->trdid, process->pid, status, 169 (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 168 170 #endif 169 171 -
trunk/kernel/syscalls/sys_fg.c
r446 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_irqmask.h> 27 27 #include <errno.h> -
trunk/kernel/syscalls/sys_fork.c
r440 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_context.h> 27 27 #include <hal_switch.h> … … 70 70 tm_start = hal_get_cycles(); 71 71 if( DEBUG_SYS_FORK < tm_start ) 72 printk("\n[DBG] %s : parent_thread %x enter / parent_pid %x/ cycle = %d\n",73 __FUNCTION__, parent_thread_ptr , parent_pid, (uint32_t)tm_start );72 printk("\n[DBG] %s : thread %x in process %x enter / cycle = %d\n", 73 __FUNCTION__, parent_thread_ptr->trdid, parent_pid, (uint32_t)tm_start ); 74 74 #endif 75 75 … … 106 106 #if (DEBUG_SYS_FORK & 1 ) 107 107 if( DEBUG_SYS_FORK < tm_start ) 108 printk("\n[DBG] %s : parent_thread%x selected cluster %x\n",109 __FUNCTION__, parent_thread_ptr , child_cxy );108 printk("\n[DBG] %s : thread %x in process %x selected cluster %x\n", 109 __FUNCTION__, parent_thread_ptr->trdid, parent_pid, child_cxy ); 110 110 #endif 111 111 … … 165 165 tm_end = hal_get_cycles(); 166 166 if( DEBUG_SYS_FORK < tm_end ) 167 printk("\n[DBG] %s : p arent_thread %x on cluster%x exit / cost = %d / cycle %d\n",168 __FUNCTION__, parent_ thread_ptr, parent_cxy, (uint32_t)(tm_end - tm_start), (uint32_t)tm_end );167 printk("\n[DBG] %s : process %x exit / cost = %d / cycle %d\n", 168 __FUNCTION__, parent_pid, (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 169 169 #endif 170 171 170 return child_pid; 172 171 } … … 177 176 tm_end = hal_get_cycles(); 178 177 if( DEBUG_SYS_FORK < tm_end ) 179 printk("\n[DBG] %s : child_thread %x on cluster%x exit / cost = %d / cycle %d\n",180 __FUNCTION__, child_ thread_ptr, child_cxy, (uint32_t)(tm_end - tm_start), (uint32_t)tm_end );178 printk("\n[DBG] %s : process %x exit / cost = %d / cycle %d\n", 179 __FUNCTION__, child_pid, (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 181 180 #endif 182 183 181 return 0; 184 182 } -
trunk/kernel/syscalls/sys_get_config.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <hal_special.h> -
trunk/kernel/syscalls/sys_get_core.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <hal_special.h> -
trunk/kernel/syscalls/sys_get_cycle.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <hal_special.h> -
trunk/kernel/syscalls/sys_getcwd.c
r440 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <hal_special.h> -
trunk/kernel/syscalls/sys_isatty.c
r438 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <hal_irqmask.h> -
trunk/kernel/syscalls/sys_kill.c
r448 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_irqmask.h> 27 27 #include <errno.h> -
trunk/kernel/syscalls/sys_lseek.c
r23 r457 22 22 23 23 #include <kernel_config.h> 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <errno.h> -
trunk/kernel/syscalls/sys_mkdir.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <vfs.h> -
trunk/kernel/syscalls/sys_mkfifo.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <printk.h> -
trunk/kernel/syscalls/sys_mmap.c
r440 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <hal_irqmask.h> -
trunk/kernel/syscalls/sys_munmap.c
r438 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <shared_syscalls.h> -
trunk/kernel/syscalls/sys_mutex.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <errno.h> -
trunk/kernel/syscalls/sys_open.c
r407 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <errno.h> -
trunk/kernel/syscalls/sys_opendir.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <thread.h> 26 26 #include <process.h> -
trunk/kernel/syscalls/sys_pipe.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <vfs.h> 26 26 #include <process.h> -
trunk/kernel/syscalls/sys_read.c
r450 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <hal_irqmask.h> -
trunk/kernel/syscalls/sys_readdir.c
r407 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <errno.h> -
trunk/kernel/syscalls/sys_rmdir.c
r407 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <printk.h> -
trunk/kernel/syscalls/sys_sem.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 #include <shared_semaphore.h> 26 27 #include <errno.h> 27 28 #include <thread.h> … … 31 32 #include <syscalls.h> 32 33 34 #if DEBUG_SYS_SEM 35 ////////////////////////////////////////////////// 36 static char * sys_sem_op_str( uint32_t operation ) 37 { 38 if ( operation == SEM_INIT ) return "INIT"; 39 else if( operation == SEM_WAIT ) return "WAIT"; 40 else if( operation == SEM_POST ) return "POST"; 41 else if( operation == SEM_GETVALUE ) return "GETVALUE"; 42 else if( operation == SEM_DESTROY ) return "DESTROY"; 43 else return "undefined"; 44 } 45 #endif 46 33 47 ////////////////////////////////// 34 int sys_sem( void * vaddr, // semaphore virtual address 35 uint32_t operation, // requested operation type 36 uint32_t * value ) // pointer on in/out argument 48 int sys_sem( void * vaddr, // semaphore virtual address 49 uint32_t operation, // requested operation type 50 uint32_t init_value, // initial value 51 uint32_t * current_value ) // pointer on current value buffer 37 52 { 38 uint32_t data;39 53 vseg_t * vseg; 40 54 error_t error; 55 uint32_t current; // semaphore current value 56 xptr_t sem_xp; // extended pointer on semaphore 41 57 42 58 thread_t * this = CURRENT_THREAD; 43 59 process_t * process = this->process; 60 61 #if DEBUG_SYS_SEM 62 uint64_t tm_start; 63 uint64_t tm_end; 64 tm_start = hal_get_cycles(); 65 if( DEBUG_SYS_SEM < tm_start ) 66 printk("\n[DBG] %s : thread %x in process %x enter for %s / cycle %d\n", 67 __FUNCTION__, this->trdid, process->pid, sys_sem_op_str( operation ), (uint32_t)tm_start ); 68 #endif 44 69 45 70 // check vaddr in user vspace … … 49 74 50 75 #if DEBUG_SYSCALLS_ERROR 51 printk("\n[ERROR] in %s : unmapped semaphore %x / thread %x / process %x\n", 52 __FUNCTION__ , (intptr_t)vaddr, this->trdid, process->pid ); 53 vmm_display( process , false ); 54 #endif 55 this->errno = EINVAL; 56 return -1; 57 } 58 59 // check value in user vspace 60 error = vmm_get_vseg( process , (intptr_t)value , &vseg ); 61 if( error ) 62 { 63 64 #if DEBUG_SYSCALLS_ERROR 65 printk("\n[ERROR] in %s : unmapped value %x / thread %x / process %x\n", 76 printk("\n[ERROR] in %s : unmapped semaphore pointer %x / thread %x in process %x\n", 66 77 __FUNCTION__ , (intptr_t)vaddr, this->trdid, process->pid ); 67 78 vmm_display( process , false ); … … 77 88 case SEM_INIT: 78 89 { 79 // get argument 80 hal_copy_from_uspace( &data , value , sizeof(uint32_t) ); 81 82 // call init function 83 error = remote_sem_create( (intptr_t)vaddr , data ); 90 // call relevant kernel function to initialize semaphore 91 error = remote_sem_create( (intptr_t)vaddr , 92 init_value, 93 XPTR( local_cxy , &sem_xp ) ); 84 94 85 95 if ( error ) 86 96 { 87 printk("\n[ERROR] in %s : cannot create semaphore = %x\n", 88 __FUNCTION__ , (intptr_t)value ); 89 this->errno = error; 90 return -1; 91 } 97 98 #if DEBUG_SYSCALLS_ERROR 99 printk("\n[ERROR] in %s : cannot create semaphore / thread %x in process %x\n", 100 __FUNCTION__, this->trdid, process->pid ); 101 #endif 102 this->errno = ENOMEM; 103 return -1; 104 } 105 92 106 break; 93 107 } … … 95 109 case SEM_GETVALUE: 96 110 { 97 // get extended pointer on remote semaphore 98 xptr_t sem_xp = remote_sem_from_vaddr( (intptr_t)vaddr ); 99 100 if( sem_xp == XPTR_NULL ) // user error 101 { 102 103 #if DEBUG_SYSCALLS_ERROR 104 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x / process %x\n", 105 __FUNCTION__ , (intptr_t)value, this->trdid, process->pid ); 106 #endif 107 this->errno = EINVAL; 108 return -1; 109 } 110 else // success 111 { 112 // get semaphore current value 113 remote_sem_get_value( sem_xp , &data ); 111 // check current_value buffer in user vspace 112 error = vmm_get_vseg( process , (intptr_t)current_value , &vseg ); 113 if( error ) 114 { 115 116 #if DEBUG_SYSCALLS_ERROR 117 printk("\n[ERROR] in %s : unmapped buffer for current value %x / thread %x in process %x\n", 118 __FUNCTION__ , (intptr_t)current_value, this->trdid, process->pid ); 119 vmm_display( process , false ); 120 #endif 121 this->errno = EINVAL; 122 return -1; 123 } 124 125 // get extended pointer on remote semaphore 126 sem_xp = remote_sem_from_vaddr( (intptr_t)vaddr ); 127 128 // check semaphore registered 129 if( sem_xp == XPTR_NULL ) 130 { 131 132 #if DEBUG_SYSCALLS_ERROR 133 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x in process %x\n", 134 __FUNCTION__ , (intptr_t)vaddr, this->trdid, process->pid ); 135 #endif 136 this->errno = EINVAL; 137 return -1; 138 } 139 140 // call relevant kernel function to get semaphore current value 141 remote_sem_get_value( sem_xp , ¤t ); 114 142 115 116 hal_copy_to_uspace( value , &data, sizeof(uint32_t) );117 } 143 // return value to user 144 hal_copy_to_uspace( current_value , ¤t , sizeof(uint32_t) ); 145 118 146 break; 119 147 } … … 122 150 { 123 151 // get extended pointer on remote semaphore 124 xptr_tsem_xp = remote_sem_from_vaddr( (intptr_t)vaddr );125 126 if( sem_xp == XPTR_NULL ) // user error127 {128 129 #if DEBUG_SYSCALLS_ERROR 130 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x / process %x\n", 131 __FUNCTION__ , (intptr_t)value, this->trdid, process->pid ); 132 #endif 133 this->errno = EINVAL; 134 return -1;135 }136 else // success137 { 138 //wait semaphore available139 140 }152 sem_xp = remote_sem_from_vaddr( (intptr_t)vaddr ); 153 154 // check semaphore registered 155 if( sem_xp == XPTR_NULL ) 156 { 157 158 #if DEBUG_SYSCALLS_ERROR 159 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x in process %x\n", 160 __FUNCTION__ , (intptr_t)vaddr, this->trdid, process->pid ); 161 #endif 162 this->errno = EINVAL; 163 return -1; 164 } 165 166 // call relevant kernel function to wait semaphore available 167 remote_sem_wait( sem_xp ); 168 141 169 break; 142 170 } … … 145 173 { 146 174 // get extended pointer on remote semaphore 147 xptr_tsem_xp = remote_sem_from_vaddr( (intptr_t)vaddr );148 149 if( sem_xp == XPTR_NULL ) // user error150 {151 152 #if DEBUG_SYSCALLS_ERROR 153 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x / process %x\n", 154 __FUNCTION__ , (intptr_t)value, this->trdid, process->pid ); 155 #endif 156 this->errno = EINVAL; 157 return -1;158 }159 else // success160 { 161 //release semaphore162 163 } 175 sem_xp = remote_sem_from_vaddr( (intptr_t)vaddr ); 176 177 // check semaphore registered 178 if( sem_xp == XPTR_NULL ) 179 { 180 181 #if DEBUG_SYSCALLS_ERROR 182 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x in process %x\n", 183 __FUNCTION__ , (intptr_t)vaddr, this->trdid, process->pid ); 184 #endif 185 this->errno = EINVAL; 186 return -1; 187 } 188 189 // call relevant kernel function to release semaphore 190 remote_sem_post( sem_xp ); 191 164 192 break; 165 193 } … … 168 196 { 169 197 // get extended pointer on remote semaphore 170 xptr_tsem_xp = remote_sem_from_vaddr( (intptr_t)vaddr );171 172 if( sem_xp == XPTR_NULL ) // user error173 {174 175 #if DEBUG_SYSCALLS_ERROR 176 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x / process %x\n", 177 __FUNCTION__ , (intptr_t)value, this->trdid, process->pid ); 178 #endif 179 this->errno = EINVAL; 180 return -1;181 }182 else // success183 { 184 185 186 } 198 sem_xp = remote_sem_from_vaddr( (intptr_t)vaddr ); 199 200 // check semaphore registered 201 if( sem_xp == XPTR_NULL ) 202 { 203 204 #if DEBUG_SYSCALLS_ERROR 205 printk("\n[ERROR] in %s : semaphore %x not registered / thread %x in process %x\n", 206 __FUNCTION__ , (intptr_t)vaddr, this->trdid, process->pid ); 207 #endif 208 this->errno = EINVAL; 209 return -1; 210 } 211 212 // destroy semaphore 213 remote_sem_destroy( sem_xp ); 214 187 215 break; 188 216 } … … 190 218 default: // undefined operation 191 219 { 192 printk("\n[PANIC] in %s : illegal operation type\n", __FUNCTION__ ); 193 hal_core_sleep(); 220 221 #if DEBUG_SYSCALLS_ERROR 222 printk("\n[ERROR] in %s : undefined operation type %d / thread %x in process %x\n", 223 __FUNCTION__ , operation, this->trdid, process->pid ); 224 #endif 225 this->errno = EINVAL; 226 return -1; 194 227 } 195 228 } 196 229 230 hal_fence(); 231 232 #if DEBUG_SYS_SEM 233 tm_end = hal_get_cycles(); 234 if( DEBUG_SYS_SEM < tm_end ) 235 { 236 cxy_t sem_cxy = GET_CXY( sem_xp ); 237 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 238 uint32_t value = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) ); 239 printk("\n[DBG] %s : thread %x in process %x exit for %s / value %d / cost = %d / cycle %d\n", 240 __FUNCTION__, this->trdid, process->pid, sys_sem_op_str( operation ), value, 241 (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 242 } 243 #endif 244 197 245 return 0; 198 246 -
trunk/kernel/syscalls/sys_signal.c
r435 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <errno.h> 27 27 #include <thread.h> -
trunk/kernel/syscalls/sys_stat.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <hal_special.h> -
trunk/kernel/syscalls/sys_thread_cancel.c
r443 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_irqmask.h> 26 26 #include <hal_remote.h> -
trunk/kernel/syscalls/sys_thread_create.c
r440 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <printk.h> -
trunk/kernel/syscalls/sys_thread_detach.c
r23 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_special.h> -
trunk/kernel/syscalls/sys_thread_exit.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_irqmask.h> 26 26 #include <thread.h> -
trunk/kernel/syscalls/sys_thread_join.c
r438 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <hal_special.h> -
trunk/kernel/syscalls/sys_thread_wakeup.c
r438 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <thread.h> 26 26 #include <printk.h> -
trunk/kernel/syscalls/sys_thread_yield.c
r445 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <scheduler.h> -
trunk/kernel/syscalls/sys_timeofday.c
r440 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <thread.h> -
trunk/kernel/syscalls/sys_trace.c
r443 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_special.h> 26 26 #include <printk.h> -
trunk/kernel/syscalls/sys_unlink.c
r407 r457 21 21 */ 22 22 23 #include <hal_ types.h>23 #include <hal_kernel_types.h> 24 24 #include <hal_uspace.h> 25 25 #include <vfs.h> -
trunk/kernel/syscalls/sys_utls.c
r23 r457 23 23 */ 24 24 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <errno.h> 27 27 #include <thread.h> -
trunk/kernel/syscalls/sys_wait.c
r446 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_uspace.h> 26 26 #include <hal_irqmask.h> -
trunk/kernel/syscalls/sys_write.c
r443 r457 23 23 24 24 #include <kernel_config.h> 25 #include <hal_ types.h>25 #include <hal_kernel_types.h> 26 26 #include <hal_uspace.h> 27 27 #include <hal_irqmask.h> -
trunk/kernel/syscalls/syscalls.h
r445 r457 2 2 * syscalls.h - Kernel side services for syscall handling. 3 3 * 4 * Author Alain Greiner (2016,2017 )4 * Author Alain Greiner (2016,2017,2018) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 25 25 #define _SYSCALLS_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <shared_syscalls.h> 29 29 … … 116 116 * and the code implementing the operations is in the remore_sem.c file. 117 117 ****************************************************************************************** 118 * @ vaddr : semaphore virtual address in user space == identifier. 119 * @ operation : SEM_INIT / SEM_DESTROY / SEM_GETVALUE / SEM_POST / SEM_WAIT. 120 * @ value : pointer on in/out argument in user space. 118 * @ vaddr : semaphore virtual address in user space == identifier. 119 * @ operation : SEM_INIT / SEM_DESTROY / SEM_GETVALUE / SEM_POST / SEM_WAIT. 120 * @ init_value : initial semaphore value. 121 * @ current_value : pointer on buffer for current semaphore value. 121 122 * @ return 0 if success / return -1 if failure. 122 123 *****************************************************************************************/ 123 124 int sys_sem( void * vaddr, 124 125 uint32_t operation, 125 uint32_t * value ); 126 uint32_t init_value, 127 uint32_t * current_value ); 126 128 127 129 /****************************************************************************************** … … 584 586 585 587 /****************************************************************************************** 588 * [44] TBD 589 ****************************************************************************************** 590 * @ cxy : cluster identifier. 591 * @ lid : core local index. 592 * @ return 0 if success / return -1 if failure. 593 *****************************************************************************************/ 594 int sys_place( uint32_t cxy, 595 uint32_t lid ); 596 597 /****************************************************************************************** 586 598 * [45] This function block the calling thread on the THREAD_BLOCKED_GLOBAL condition, 587 599 * and deschedule. … … 624 636 625 637 /****************************************************************************************** 626 * [49] TBD 627 ****************************************************************************************** 628 * @ cxy : cluster identifier. 629 * @ lid : core local index. 630 * @ return 0 if success / return -1 if failure. 631 *****************************************************************************************/ 632 int sys_place( uint32_t cxy, 633 uint32_t lid ); 638 * [49] This function returns a non-zero value in the <is_fg> buffer when the process 639 * identified by the <pid> argument is the current TXT owner. 640 ****************************************************************************************** 641 * @ pid : process identifier. 642 * @ is_fg : pointer on buffer. 643 * @ return 0 if success / return -1 if failure. 644 *****************************************************************************************/ 645 int sys_is_fg( pid_t pid, 646 uint32_t * is_fg ); 634 647 635 648 #endif // _SYSCALLS_H_ -
trunk/libs/libalmosmkh/almosmkh.c
r445 r457 24 24 #include <almosmkh.h> 25 25 #include <hal_user.h> 26 #include <hal_ types.h>26 #include <hal_shared_types.h> 27 27 #include <syscalls_numbers.h> 28 28 #include <string.h> … … 39 39 return hal_user_syscall( SYS_FG, 40 40 (reg_t)pid, 0, 0, 0 ); 41 } 42 43 ////////////////////////////// 44 int is_fg( unsigned int pid, 45 unsigned int * owner ) 46 { 47 return hal_user_syscall( SYS_IS_FG, 48 (reg_t)pid, 49 (reg_t)owner, 0, 0 ); 41 50 } 42 51 … … 224 233 ////////////////////////////////// 225 234 int trace( unsigned int active, 226 unsigned int pid,235 unsigned int cxy, 227 236 unsigned int lid ) 228 237 { 229 238 return hal_user_syscall( SYS_TRACE, 230 239 (reg_t)active, 231 (reg_t) pid,240 (reg_t)cxy, 232 241 (reg_t)lid, 0 ); 233 242 } … … 316 325 317 326 318 /////////////// non standard debugfunctions //////////////////////////327 /////////////// non standard malloc functions ////////////////////////// 319 328 320 329 #define MALLOC_DEBUG 0 -
trunk/libs/libalmosmkh/almosmkh.h
r450 r457 26 26 27 27 /*************************************************************************************** 28 * various the user level, ALMOS-MKH specific library. It contains:28 * This file defines an user level, ALMOS-MKH specific library, containing: 29 29 * - non standard system calls. 30 30 * - debug functions. … … 40 40 /*************************************************************************************** 41 41 * This function is used to give the process identified by the <pid> argument the 42 * exclusive ownership of the attached TXT_RXterminal.42 * exclusive ownership of its TXT terminal. 43 43 *************************************************************************************** 44 44 * @ pid : process identifier. … … 46 46 **************************************************************************************/ 47 47 int fg( unsigned int pid ); 48 49 /*************************************************************************************** 50 * This function stores in the buffer identified by the <owner> argument a non zero 51 * value when the process identified by the <pid> argument is currently the exclusive 52 * owner of its TXT terminal. 53 *************************************************************************************** 54 * @ pid : [in] process identifier. 55 * @ owner : [out] pointer on buffer to store the 56 * @ returns O if success / returns -1 if process not found. 57 **************************************************************************************/ 58 int is_fg( unsigned int pid, 59 unsigned int * owner ); 48 60 49 61 /*************************************************************************************** -
trunk/libs/libpthread/Makefile
r445 r457 9 9 endif 10 10 11 SRCS = pthread.c 12 13 OBJS = $(addprefix build/, $(SRCS:.c=.o)) \ 11 OBJS = build/pthread.o \ 14 12 $(HAL_ARCH)/build/core/hal_user.o 15 13 … … 37 35 38 36 headers: build 39 cp $(SRCS:.c=.h)build/include/.37 cp pthread.h build/include/. 40 38 41 39 -
trunk/libs/libpthread/pthread.c
r445 r457 1 1 /* 2 * pthread.c - User leve <pthread> library implementation.2 * pthread.c - User level <pthread> library implementation. 3 3 * 4 4 * Author Alain Greiner (2016,2017,2018) … … 23 23 24 24 #include <hal_user.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <stdio.h> 27 27 #include <stdlib.h> 28 28 #include <pthread.h> 29 #include <shared_pthread.h> 29 30 #include <almosmkh.h> 30 31 #include <syscalls_numbers.h> -
trunk/libs/libpthread/pthread.h
r445 r457 25 25 #define _PTHREAD_H_ 26 26 27 ////////////////////////////////////////////////////////////////////////////////////////////// 28 // POSIX Threads related functions (including barriers and mutexes) 29 ////////////////////////////////////////////////////////////////////////////////////////////// 30 27 31 #include <shared_pthread.h> 28 29 //////////////////////////////////////////////////////////////////////////////////////////////30 // POSIX Threads related functions31 //////////////////////////////////////////////////////////////////////////////////////////////32 32 33 33 /********************************************************************************************* -
trunk/libs/mini-libc/dirent.c
r449 r457 23 23 24 24 #include <dirent.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <hal_user.h> 27 27 #include <syscalls_numbers.h> -
trunk/libs/mini-libc/fcntl.c
r449 r457 23 23 24 24 #include <fcntl.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <hal_user.h> 27 27 #include <syscalls_numbers.h> -
trunk/libs/mini-libc/mman.c
r449 r457 23 23 24 24 #include <mman.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <hal_user.h> 27 27 #include <syscalls_numbers.h> -
trunk/libs/mini-libc/signal.c
r449 r457 1 1 /* 2 * signal.c - User side signals related syscallsimplementation.2 * signal.c - User side signals related library implementation. 3 3 * 4 4 * Author Alain Greiner (2016,2017,2018) … … 23 23 24 24 #include <signal.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <hal_user.h> 27 27 #include <syscalls_numbers.h> -
trunk/libs/mini-libc/stat.c
r449 r457 1 1 /* 2 * stat.c - User side file stat related syscallsimplementation.2 * stat.c - User side file statistics related library implementation. 3 3 * 4 4 * Author Alain Greiner (2016,2017,2018) … … 24 24 #include <stat.h> 25 25 #include <hal_user.h> 26 #include <hal_ types.h>26 #include <hal_shared_types.h> 27 27 #include <syscalls_numbers.h> 28 28 -
trunk/libs/mini-libc/stdio.c
r445 r457 266 266 if ( count == -1 ) 267 267 { 268 display_string( " stdlib: xprintf failure" );268 display_string( "printf : xprintf failure" ); 269 269 return -1; 270 270 } … … 272 272 { 273 273 string[count] = 0; 274 return write( 1 , &string , count + 1);274 return write( 1 , &string , count ); 275 275 } 276 276 } -
trunk/libs/mini-libc/stdlib.c
r445 r457 23 23 24 24 #include <stdlib.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <hal_user.h> 27 #include <syscalls_numbers.h> 27 28 #include <almosmkh.h> 28 29 #include <stdio.h> 29 #include <syscalls_numbers.h>30 30 31 31 ////////////////////////// -
trunk/libs/mini-libc/time.c
r449 r457 24 24 #include <time.h> 25 25 #include <hal_user.h> 26 #include <hal_user.h> 27 #include <hal_types.h> 26 #include <hal_shared_types.h> 28 27 #include <syscalls_numbers.h> 29 28 … … 32 31 struct timezone * tz ) 33 32 { 34 return hal_user_syscall( SYS_TIMEOFDAY, // TODO SYS_SIGNAL ?33 return hal_user_syscall( SYS_TIMEOFDAY, 35 34 (reg_t)tv, 36 35 (reg_t)tz, 0, 0 ); -
trunk/libs/mini-libc/unistd.c
r449 r457 23 23 24 24 #include <unistd.h> 25 #include <hal_ types.h>25 #include <hal_shared_types.h> 26 26 #include <hal_user.h> 27 27 #include <syscalls_numbers.h> -
trunk/libs/mini-libc/wait.c
r449 r457 24 24 #include <wait.h> 25 25 #include <hal_user.h> 26 #include <hal_ types.h>26 #include <hal_shared_types.h> 27 27 #include <syscalls_numbers.h> 28 28 -
trunk/libs/mini-libc/wait.h
r449 r457 37 37 * This blocking function returns only when one child process of the calling process 38 38 * changes state (from RUNNING to STOPPED / EXITED / KILLED). It returns the terminating 39 * child process PID, and set in the <status> buffer the newchild process state.39 * child process PID, and set in the <status> buffer the terminating child process state. 40 40 ***************************************************************************************** 41 * @ status : [out] terminating child process state.41 * @ status : [out] pointer on buffer for terminating child process state. 42 42 * @ returns terminating child process pid. 43 43 ****************************************************************************************/ -
trunk/params-hard.mk
r446 r457 5 5 Y_SIZE = 2 6 6 NB_PROCS = 1 7 NB_TTYS = 27 NB_TTYS = 3 8 8 FBF_WIDTH = 128 9 9 IOC_TYPE = IOC_BDV -
trunk/params-soft.mk
r445 r457 40 40 LIBPTHREAD = $(LIBPTHREAD_PATH)/build/lib/ 41 41 LIBPTHREAD_INCLUDE = $(LIBPTHREAD_PATH)/build/include/ 42 43 # define paths for LIBSEMAPHORE 44 LIBSEMAPHORE_PATH = $(ALMOSMKH_DIR)/libs/libsemaphore 45 LIBSEMAPHORE = $(LIBSEMAPHORE_PATH)/build/lib/ 46 LIBSEMAPHORE_INCLUDE = $(LIBSEMAPHORE_PATH)/build/include/ 42 47 43 48 # define paths for LIBALMOSMKH -
trunk/tools/arch_info/arch_info.h
r6 r457 49 49 ***************************************************************************************/ 50 50 51 #include <hal_ types.h>51 #include <hal_kernel_types.h> 52 52 53 53 #define ARCHINFO_HEADER_SIZE sizeof(archinfo_header_t) -
trunk/tools/arch_info/boot_info.h
r296 r457 25 25 #define _BOOT_INFO_H_ 26 26 27 #include <hal_ types.h>27 #include <hal_kernel_types.h> 28 28 #include <kernel_config.h> 29 29 … … 135 135 // kernel segments 136 136 137 reg_tkcode_base; /*! kernel code base paddr */138 reg_tkcode_size; /*! kernel code size */139 reg_tkdata_base; /*! kernel data base paddr */140 reg_tkdata_size; /*! kernel data size */141 reg_tkentry_base; /*! kernel entry base paddr */142 reg_tkentry_size; /*! kernel entry size */137 intptr_t kcode_base; /*! kernel code base paddr */ 138 intptr_t kcode_size; /*! kernel code size */ 139 intptr_t kdata_base; /*! kernel data base paddr */ 140 intptr_t kdata_size; /*! kernel data size */ 141 intptr_t kentry_base; /*! kernel entry base paddr */ 142 intptr_t kentry_size; /*! kernel entry size */ 143 143 } 144 144 boot_info_t; -
trunk/user/idbg/idbg.c
r450 r457 21 21 printf( "\n[IDBG] starts at cycle %d\n", (unsigned int)cycle ); 22 22 23 // idbg(); 24 25 exit( 0 ); 23 idbg(); 26 24 27 25 } // end main() -
trunk/user/init/init.c
r445 r457 50 50 for( i = 1 ; i < NB_TXT_CHANNELS ; i++ ) 51 51 { 52 53 #if DEBUG_PROCESS_INIT 54 snprintf( string , 64 , "[INIT] start child[%d] creation" , i ); 55 display_string( string ); 56 #endif 57 52 58 // INIT process fork process CHILD[i] 53 59 ret_fork = fork(); … … 56 62 { 57 63 // INIT display error message 58 snprintf( string , 64 , "[INIT ] cannot fork child[%d] => suicide" , i );64 snprintf( string , 64 , "[INIT ERROR] cannot fork child[%d] => suicide" , i ); 59 65 display_string( string ); 60 66 … … 77 83 else // we are in INIT process 78 84 { 79 80 81 85 // INIT display CHILD[i] process PID 86 snprintf( string , 64 , "[INIT] created KSH[%d] / pid = %x", i , ret_fork ); 87 display_string( string ); 82 88 } 83 84 // INIT wait CHILD[i] process deletion before creating KSH[i+1]85 // int n;86 // for( n = 0 ; n < 100000 ; n++ ) asm volatile ( "nop" );87 wait( &status );88 89 } 89 90 90 91 #if DEBUG_PROCESS_INIT 92 unsigned int x_size; // number of clusters in a row 93 unsigned int y_size; // number of clusters in a column 94 unsigned int ncores; // number of cores per cluster 95 unsigned int x; // cluster x coordinate 96 unsigned int y; // cluster y coordinate 97 unsigned int cxy; // cluster identifier 98 unsigned int lid; // core local index 91 99 92 unsigned int x_size; // number of clusters in a row 93 unsigned int y_size; // number of clusters in a column 94 unsigned int ncores; // number of cores per cluster 95 unsigned int x; // cluster x coordinate 96 unsigned int y; // cluster y coordinate 97 unsigned int cxy; // cluster identifier 98 unsigned int lid; // core local index 99 100 // get hardware config 101 get_config( &x_size , &y_size , &ncores ); 100 // get hardware config 101 get_config( &x_size , &y_size , &ncores ); 102 102 103 // INIT displays processes and threads in all clusters 104 for( x = 0 ; x < x_size ; x++ ) 103 // INIT displays processes and threads in all clusters 104 for( x = 0 ; x < x_size ; x++ ) 105 { 106 for( y = 0 ; y < y_size ; y++ ) 105 107 { 106 for( y = 0 ; y < y_size ; y++ ) 107 { 108 cxy = CXY_FROM_XY( x , y ); 109 display_cluster_processes( cxy ); 110 for( lid = 0 ; lid < ncores ; lid++ ) 111 { 112 display_sched( cxy , lid ); 113 } 108 cxy = CXY_FROM_XY( x , y ); 109 display_cluster_processes( cxy ); 110 for( lid = 0 ; lid < ncores ; lid++ ) 111 { 112 display_sched( cxy , lid ); 114 113 } 115 114 } 116 115 } 117 116 #endif 118 117 -
trunk/user/ksh/Makefile
r445 r457 11 11 OBJS = build/ksh.o 12 12 13 INCLUDES = -I. \ 14 -I$(LIBC_INCLUDE) \ 15 -I$(LIBPTHREAD_INCLUDE) \ 16 -I$(LIBALMOSMKH_INCLUDE) \ 13 INCLUDES = -I. \ 14 -I$(LIBC_INCLUDE) \ 15 -I$(LIBPTHREAD_INCLUDE) \ 16 -I$(LIBALMOSMKH_INCLUDE) \ 17 -I$(LIBSEMAPHORE_INCLUDE) \ 17 18 -I$(SHARED_INCLUDE) 18 19 … … 20 21 21 22 build/ksh.elf : $(OBJS) ksh.ld 22 $(LD) -o $@ -T ksh.ld $(OBJS) -L$(LIBC) -L$(LIBPTHREAD) -L$(LIBALMOSMKH) -lc -lpthread -lalmosmkh -lpthread -lc 23 $(LD) -o $@ -T ksh.ld $(OBJS) -L$(LIBC) -L$(LIBPTHREAD) -L$(LIBALMOSMKH) -L$(LIBSEMAPHORE) \ 24 -lc -lpthread -lalmosmkh -lpthread -lsemaphore -lc 23 25 $(DU) -D $@ > $@.txt 24 26 -
trunk/user/ksh/ksh.c
r446 r457 4 4 // Author : Alain Greiner 5 5 /////////////////////////////////////////////////////////////////////////////// 6 // This applications implement a minimal shell for ALMOS-MKH. 7 // This user process contains two POSIX threads: 6 // This application implements a minimal shell for ALMOS-MKH. 7 // 8 // This user KSH process contains two POSIX threads: 8 9 // - the "main" thread contains the infinite loop implementing 9 // the children processes termination monitoring (children processes 10 // are created by the <load> command and attached to the KSH TXT terminal). 10 // the children processes termination monitoring using the wait syscall. 11 11 // - the "interactive" thread contains the infinite loop implementing 12 12 // the command interpreter attached to the TXT terminal. 13 // This "interactive" thread block and deschedules when the KSH process 14 // loses the TXT terminal ownership. It is reactivated when the KSH 15 // process returns in background. 16 // 17 // Note: the children processes are created by the <load> command, and are 18 // attached to the same TXT terminal as the KSH process itself. 19 // . A child process can be lauched in foreground: the KSH process loses 20 // the TXT terminal ownership, that is transfered to the new process. 21 // . A child process can be lauched in background: the KSH process keeps 22 // the TXT terminal ownership. that is transfered to the new process. 13 23 /////////////////////////////////////////////////////////////////////////////// 14 24 … … 20 30 #include <unistd.h> 21 31 #include <almosmkh.h> 32 #include <semaphore.h> 22 33 23 34 #define CMD_MAX_SIZE (256) // max number of characters in one command … … 25 36 #define MAX_ARGS (32) // max number of arguments in a command 26 37 #define FIFO_SIZE (1024) // FIFO depth for recursive ls 38 39 #define KSH_DEBUG 0 27 40 28 41 //////////////////////////////////////////////////////////////////////////////// … … 59 72 unsigned int ptr; // read pointer in log_entries[] 60 73 61 pthread_attr_t attr; // monitor thread attributes 74 pthread_attr_t attr; // interactive thread attributes 75 76 sem_t semaphore; // block interactive thread when zero 62 77 63 78 //////////////////////////////////////////////////////////////////////////////// … … 119 134 */ 120 135 136 // release semaphore to get next command 137 sem_post( &semaphore ); 138 121 139 } // end cmd_cat() 122 140 … … 135 153 136 154 printf(" error: not implemented yet\n"); 137 /* 138 path = argv[1]; 139 140 if (chdir(path) == -1) 141 { 142 printf(" error: cannot cd to %s\n", path); 143 } 144 */ 155 156 // release semaphore to get next command 157 sem_post( &semaphore ); 145 158 146 159 } // end cmd_cd() … … 237 250 */ 238 251 252 // release semaphore to get next command 253 sem_post( &semaphore ); 254 239 255 } // end cmd_cp() 240 256 … … 343 359 printf(" usage: display (vmm/sched/process/vfs/chdev/txt) [arg2] [arg3]\n"); 344 360 } 361 362 // release semaphore to get next command 363 sem_post( &semaphore ); 364 345 365 } // end cmd_display() 346 366 … … 367 387 printf(" error: cannot find process %x\n", pid ); 368 388 } 389 390 // release semaphore to get next command 391 sem_post( &semaphore ); 392 369 393 } // end cmd_fg() 370 394 … … 385 409 printf("\t%s\t : %s\n", cmd[i].name , cmd[i].desc); 386 410 } 411 412 // release semaphore to get next command 413 sem_post( &semaphore ); 414 387 415 } // end cmd_help() 388 416 … … 409 437 printf(" error: process %x cannot be killed\n", pid ); 410 438 } 439 440 // release semaphore to get next command 441 sem_post( &semaphore ); 442 411 443 } // end cmd_kill() 412 444 … … 419 451 char * pathname; // path to .elf file 420 452 unsigned int background; // background execution if non zero 421 int status; // new process exit status422 453 423 454 if( (argc < 2) || (argc > 3) ) … … 435 466 ksh_pid = getpid(); 436 467 468 #if KSH_DEBUG 469 printf("\n[KSH_DEBUG] in %s : ksh PID %x / path %s / background %d\n", 470 __FUNCTION__, ksh_pid, argv[1], background ); 471 #endif 472 437 473 // KSH process fork CHILD process 438 474 ret_fork = fork(); 439 475 440 if ( ret_fork < 0 ) 476 if ( ret_fork < 0 ) // it is a failure reported to KSH 441 477 { 442 478 printf(" error: ksh process unable to fork\n"); 443 479 return; 444 480 } 445 else if (ret_fork == 0) 481 else if (ret_fork == 0) // it is the CHILD process 446 482 { 447 483 // CHILD process exec NEW process … … 455 491 } 456 492 } 457 else // it is the parent KSH : ret_fork is the new process PID 458 { 459 // give back terminal ownership to KSH 460 // when new process created in background 461 if( background ) fg( ksh_pid ); 462 463 // return to command interpreter 464 return; 493 else // it is the KSH process : ret_fork is the new process PID 494 { 495 496 #if KSH_DEBUG 497 int sem_value; 498 sem_getvalue( &semaphore , &sem_value ); 499 printf("\n[KSH_DEBUG] in %s : child PID %x / background %d / sem_value %d\n", 500 ret_fork, background, sem_value ); 501 #endif 502 503 if( background ) // child in background => KSH keeps TXT ownership 504 { 505 // execve() tranfered TXT ownership to child => give it back to KSH 506 fg( ksh_pid ); 507 508 // release semaphore to get next command 509 sem_post( &semaphore ); 510 } 465 511 } 466 512 } // end cmd_load … … 476 522 printf(" - %d\t: %s\n", i, &log_entries[i].buf); 477 523 } 478 } 524 525 // release semaphore to get next command 526 sem_post( &semaphore ); 527 528 } // end cmd_log() 529 479 530 480 531 //////////////////////////////////////////// … … 509 560 closedir(dir); 510 561 */ 511 } 562 563 // release semaphore to get next command 564 sem_post( &semaphore ); 565 566 } // end cmd_ls() 512 567 513 568 /////////////////////////////////////////////// … … 525 580 526 581 printf(" error: not implemented yet\n"); 527 /* 528 if ( mkdir( path, 0x700) == -1 ) 529 { 530 printf(" error: cannot create directory %s\n", path); 531 } 532 */ 533 } 582 583 // release semaphore to get next command 584 sem_post( &semaphore ); 585 586 } // end cmd_mkdir() 534 587 535 588 //////////////////////////////////////////// … … 545 598 printf(" error: not implemented yet\n"); 546 599 547 /* 548 int ret = giet_fat_rename(argv[1], argv[2]); 549 if (ret < 0) 550 { 551 printf(" error : cannot move %s to %s / err = %d\n", argv[1], argv[2], ret ); 552 } 553 */ 554 555 } 600 // release semaphore to get next command 601 sem_post( &semaphore ); 602 603 } // end cmd_mv 556 604 557 605 ///////////////////////////////////////////// … … 574 622 printf("%s\n", buf); 575 623 } 576 } 624 625 // release semaphore to get next command 626 sem_post( &semaphore ); 627 628 } // end cmd_pwd() 577 629 578 630 //////////////////////////////////////////// … … 590 642 591 643 printf(" error: not implemented yet\n"); 592 /* 593 if (remove(path) == -1) 594 { 595 printf(" error: cannot remove %s\n", path); 596 } 597 */ 598 599 } 644 645 // release semaphore to get next command 646 sem_post( &semaphore ); 647 648 } // end_cmd_rm() 600 649 601 650 /////////////////////////////////////////////// 602 651 static void cmd_rmdir( int argc , char **argv ) 603 652 { 653 // same as cmd_rm() 604 654 cmd_rm(argc, argv); 605 655 } … … 624 674 printf(" error: core[%x,%d] not found\n", cxy, lid ); 625 675 } 626 } 676 677 // release semaphore to get next command 678 sem_post( &semaphore ); 679 680 } // end cmd_trace 627 681 628 682 /////////////////////////////////////////////// … … 645 699 printf(" error: core[%x,%d] not found\n", cxy, lid ); 646 700 } 647 } 648 649 ////////////////////////////////////////////////////////////////// 701 702 // release semaphore to get next command 703 sem_post( &semaphore ); 704 705 } // end cmd_untrace() 706 707 /////////////////////////////////////////////////////////////////////////////////// 650 708 // Array of commands 651 ////////////////////////////////////////////////////////////////// 709 /////////////////////////////////////////////////////////////////////////////////// 652 710 653 711 ksh_cmd_t cmd[] = … … 660 718 { "load", "load an user application", cmd_load }, 661 719 { "help", "list available commands", cmd_help }, 662 { "kill", "kill a n application (all threads)",cmd_kill },720 { "kill", "kill a process (all threads)", cmd_kill }, 663 721 { "log", "list registered commands", cmd_log }, 664 722 { "ls", "list directory entries", cmd_ls }, … … 674 732 675 733 //////////////////////////////////////////////////////////////////////////////////// 676 // This function analyses one command (with arguments), execute it, and return.734 // This function analyses one command (with arguments), executes it, and returns. 677 735 //////////////////////////////////////////////////////////////////////////////////// 678 static void parse( char *buf)736 static void parse( char * buf ) 679 737 { 680 738 int argc = 0; … … 717 775 } 718 776 719 if (!found) 720 { 721 printf(" undefined command <%s>\n", argv[0]); 777 if (!found) // undefined command 778 { 779 printf(" error : undefined command <%s>\n", argv[0]); 780 781 // release semaphore to get next command 782 sem_post( &semaphore ); 722 783 } 723 784 } … … 729 790 char c; // read character 730 791 char buf[CMD_MAX_SIZE]; // buffer for one command 731 unsigned int count; // pointer in buf 792 unsigned int end_command; // last character found in a command 793 unsigned int count; // pointer in command buffer 732 794 unsigned int i; // index for loops 795 unsigned int state; // escape sequence state 796 797 char string[80]; 733 798 734 799 enum fsm_states 735 800 { 736 NORMAL ,737 ESCAPE ,738 BRAKET ,801 NORMAL = 0, 802 ESCAPE = 1, 803 BRAKET = 2, 739 804 }; 740 805 741 // initialize command buffer 742 memset( buf, 0x20 , sizeof(buf) ); 743 count = 0; 744 745 // display first prompt 746 printf("# "); 747 748 // This lexical analyser writes one command line in the buf buffer. 749 // It is implemented as a 3 states FSM to handle the following sequences: 806 // This lexical analyser writes one command line in the command buffer. 807 // It is implemented as a 3 states FSM to handle the following escape sequences: 750 808 // - ESC [ A : up arrow 751 809 // - ESC [ B : down arrow … … 757 815 // - BRAKET : the wo characters (ESC,[) have been found 758 816 759 unsigned int state = NORMAL; 760 761 // @@@ 762 parse("load /bin/user/idbg.elf"); 763 // @@@ 764 817 // external loop on the commands 818 // the in teractive thread should not exit this loop 765 819 while (1) 766 820 { 767 c = (char)getchar(); 768 769 if( c == 0 ) continue; 770 771 switch (state) 772 { 773 case NORMAL: 774 { 821 // initialize command buffer 822 memset( buf, 0x20 , sizeof(buf) ); // TODO useful ? 823 count = 0; 824 state = NORMAL; 825 826 // block if the KSH process is not the TXT owner 827 // - if the command is not a "load" 828 // the semaphore must be released by the cmd_***() 829 // - if the command is a load, it depends on 830 // the "background" argument 831 sem_wait( &semaphore ); 832 833 // display prompt on a new line 834 printf("\n[ksh] "); 835 836 end_command = 0; 837 838 // internal loop on characters in one command 839 while( end_command == 0 ) 840 { 841 // get one character from TXT_RX 842 c = (char)getchar(); 843 844 if( c == 0 ) continue; 845 846 if( state == NORMAL ) // we are not in an escape sequence 847 { 775 848 if ((c == '\b') || (c == 0x7F)) // backspace => remove one character 776 849 { 777 if (count > 0) { 778 printf("\b \b"); 779 count--; 850 if (count > 0) 851 { 852 printf("\b \b"); 853 count--; 854 } 855 } 856 else if (c == '\n') // new line => end of command 857 { 858 if (count > 0) // analyse & execute command 859 { 860 // complete command with NUL character 861 buf[count] = 0; 862 count++; 863 864 // register command in log arrays 865 strcpy(log_entries[ptw].buf, buf); 866 log_entries[ptw].count = count; 867 ptw = (ptw + 1) % LOG_DEPTH; 868 ptr = ptw; 869 870 // echo character 871 putchar( c ); 872 873 // call parser to analyse and execute command 874 parse( buf ); 875 } 876 else // no command registered 877 { 878 // release semaphore to get next command 879 sem_post( &semaphore ); 880 } 881 882 // exit internal loop on characters 883 end_command = 1; 884 } 885 else if (c == '\t') // tabulation => do nothing 886 { 887 } 888 else if (c == (char)0x1B) // ESC => start an escape sequence 889 { 890 state = ESCAPE; 891 } 892 else // normal character 893 { 894 if (count < sizeof(buf) - 1) 895 { 896 // register character in command buffer 897 buf[count] = c; 898 count++; 899 900 // echo character 901 putchar( c ); 780 902 } 781 903 } 782 else if (c == '\n') // new line => call parser to execute command783 {784 if (count > 0)785 {786 // complete command787 buf[count] = '\0';788 789 // register command in log arrays790 strcpy(log_entries[ptw].buf, buf);791 log_entries[ptw].count = count;792 ptw = (ptw + 1) % LOG_DEPTH;793 ptr = ptw;794 795 // execute command796 printf("\n");797 parse((char *)&buf);798 799 // reinitialise buffer and display prompt800 for ( i = 0 ; i < sizeof(buf) ; i++ ) buf[i] = 0x20;801 count = 0;802 printf("# ");803 }804 else805 {806 printf("\n# ");807 }808 }809 else if (c == '\t') // tabulation => do nothing810 {811 }812 else if (c == (char)0x1B) // ESC => start an escape sequence813 {814 state = ESCAPE;815 }816 else // register character in command buffer817 {818 if (count < sizeof(buf) - 1)819 {820 putchar( c );821 buf[count] = c;822 count++;823 }824 }825 break;826 904 } 827 case ESCAPE:905 else if( state == ESCAPE ) 828 906 { 829 907 if (c == '[') // valid sequence => continue … … 835 913 state = NORMAL; 836 914 } 837 break;838 915 } 839 case BRAKET:916 else if( state == BRAKET ) 840 917 { 841 918 if (c == 'D') // valid LEFT sequence => move buf pointer left … … 900 977 state = NORMAL; 901 978 } 902 break;903 979 } 904 } 905 } 980 } // end internal while loop on characters 981 } // end external while loop on commands 906 982 } // end interactive() 907 983 … … 912 988 unsigned int lid; // core identifier for this KSH main thread 913 989 int status; // child process termination status 914 int pid; // chils process identifier 990 int child_pid; // child process identifier 991 int parent_pid; // parent process identifier 915 992 pthread_t trdid; // kernel allocated index for interactive thread 993 unsigned int is_owner; // non-zero if KSH process is TXT owner 916 994 917 995 // initialize log buffer … … 920 998 ptr = 0; 921 999 1000 // get KSH process pid and core 1001 parent_pid = getpid(); 922 1002 get_core( &cxy , & lid ); 1003 923 1004 printf( "\n\n~~~ KSH on core[%x,%d] ~~~\n\n", cxy , lid ); 1005 1006 // initializes the semaphore used to unblock the interactive thread 1007 sem_init( &semaphore , 0 , 1 ); 924 1008 925 1009 // initialize interactive thread attributes … … 936 1020 while( 1 ) 937 1021 { 938 pid = wait( &status );939 940 #if 0 941 if ( WIFEXITED (status) ) printf("\n[KSH] process %x exited\n" , pid ); 942 else if( WIFSIGNALED(status) ) printf("\n[KSH] process %x killed\n" ,pid );943 else if( WIFSTOPPED (status) ) printf("\n[KSH] process %x stopped\n",pid );944 else printf("\n[KSH] process %x strange\n", pid ); 1022 // wait children termination 1023 child_pid = wait( &status ); 1024 1025 #if KSH_DEBUG 1026 if( WIFEXITED (status) ) printf("\n[KSH] child process %x exited\n" , child_pid ); 1027 if( WIFSIGNALED(status) ) printf("\n[KSH] child process %x killed\n" , child_pid ); 1028 if( WIFSTOPPED (status) ) printf("\n[KSH] child process %x stopped\n", child_pid ); 945 1029 #endif 946 1030 1031 // release semaphore if KSH process is TXT owner, to unblock interactive thread 1032 is_fg( parent_pid , &is_owner ); 1033 if( is_owner ) sem_post( &semaphore ); 1034 947 1035 } 948 1036 } // end main() -
trunk/user/sort/sort.c
r445 r457 32 32 33 33 #define DISPLAY_ARRAY 0 34 #define INTERACTIVE_MODE 134 #define INTERACTIVE_MODE 0 35 35 36 36 /////////////////////////////////////////////////////// … … 328 328 329 329 #if INTERACTIVE_MODE 330 //idbg();330 idbg(); 331 331 #endif 332 332 }
Note: See TracChangeset
for help on using the changeset viewer.