Changeset 407 for trunk/kernel
- Timestamp:
- Nov 7, 2017, 3:08:12 PM (7 years ago)
- Location:
- trunk/kernel
- Files:
-
- 2 deleted
- 79 edited
- 4 copied
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/devices/dev_dma.c
r406 r407 88 88 thread_t * this = CURRENT_THREAD; 89 89 90 dma_dmsg("\n[D MSG] %s : enters for thread %x / dst = %l /src = %l / size = %x\n",90 dma_dmsg("\n[DBG] %s : enters for thread %x / dst = %l /src = %l / size = %x\n", 91 91 __FUNCTION__ , this->trdid , dst_xp , src_xp , size ); 92 92 … … 108 108 // block client thread on THREAD_BLOCKED_IO and deschedule. 109 109 // it is re-activated by the ISR signaling IO operation completion. 110 chdev_register_command( dev_xp , this);110 chdev_register_command( dev_xp ); 111 111 112 dma_dmsg("\n[D MSG] %s : completes for thread %x / error = %d\n",112 dma_dmsg("\n[DBG] %s : completes for thread %x / error = %d\n", 113 113 __FUNCTION__ , this->trdid , this->dma_cmd.error ); 114 114 -
trunk/kernel/devices/dev_fbf.c
r406 r407 143 143 } 144 144 145 fbf_dmsg("\n[D MSG] %s : thread %x in process %x / vaddr = %p / paddr = %l\n",145 fbf_dmsg("\n[DBG] %s : thread %x in process %x / vaddr = %p / paddr = %l\n", 146 146 __FUNCTION__ , this->trdid , this->process->pid , buffer , buf_paddr ); 147 147 -
trunk/kernel/devices/dev_ioc.c
r406 r407 51 51 52 52 // set chdev name 53 snprintf( ioc->name , 16 , "ioc _%d" , channel );53 snprintf( ioc->name , 16 , "ioc%d" , channel ); 54 54 55 55 // call driver init function … … 90 90 // It builds and registers the command in the calling thread descriptor. 91 91 // Then, it registers the calling thead in chdev waiting queue. 92 // Finally it blocks on the THREAD_BLOCKED_ DEVcondition and deschedule.92 // Finally it blocks on the THREAD_BLOCKED_IO condition and deschedule. 93 93 ////////////////////////////////////i///////////////////////////////////////////// 94 94 static error_t dev_ioc_access( uint32_t cmd_type, … … 99 99 thread_t * this = CURRENT_THREAD; // pointer on client thread 100 100 101 ioc_dmsg("\n[D MSG] %s : thread %x in process %x"101 ioc_dmsg("\n[DBG] %s : thread %x in process %x" 102 102 " for lba = %x / buffer = %x / at cycle %d\n", 103 103 __FUNCTION__ , this->trdid , this->process->pid , … … 126 126 // block client thread on THREAD_BLOCKED_IO and deschedule. 127 127 // it is re-activated by the ISR signaling IO operation completion. 128 chdev_register_command( dev_xp , this);129 130 ioc_dmsg("\n[D MSG] in %s : thread %x in process %x"128 chdev_register_command( dev_xp ); 129 130 ioc_dmsg("\n[DBG] in %s : thread %x in process %x" 131 131 " completes / error = %d / at cycle %d\n", 132 132 __FUNCTION__ , this->trdid , this->process->pid , … … 162 162 thread_t * this = CURRENT_THREAD; 163 163 164 ioc_dmsg("\n[D MSG] %s : core[%x,%d] enter for %d blocks / lba = %x / cycle %d\n",164 ioc_dmsg("\n[DBG] %s : core[%x,%d] enter for %d blocks / lba = %x / cycle %d\n", 165 165 __FUNCTION__ , local_cxy , this->core->lid , count , lba , hal_time_stamp() ); 166 166 … … 199 199 dev_pic_enable_irq( lid , ioc_xp ); 200 200 201 ioc_dmsg("\n[D MSG] %s : core[%x,%d] exit / error = %d / cycle %d\n",201 ioc_dmsg("\n[DBG] %s : core[%x,%d] exit / error = %d / cycle %d\n", 202 202 __FUNCTION__ , local_cxy , this->core->lid , this->ioc_cmd.error , hal_time_stamp() ); 203 203 -
trunk/kernel/devices/dev_mmc.c
r406 r407 99 99 thread_t * this = CURRENT_THREAD; 100 100 101 mmc_dmsg("\n[D MSG] %s enters for thread %x in process %x / buf_xp = %l\n",101 mmc_dmsg("\n[DBG] %s enters for thread %x in process %x / buf_xp = %l\n", 102 102 __FUNCTION__ , this->trdid , this->process->pid , buf_xp ); 103 103 … … 124 124 error = dev_mmc_access( this ); 125 125 126 mmc_dmsg("\n[D MSG] %s completes for thread %x in process %x / error = %d\n",126 mmc_dmsg("\n[DBG] %s completes for thread %x in process %x / error = %d\n", 127 127 __FUNCTION__ , this->trdid , this->process->pid , error ); 128 128 … … 139 139 thread_t * this = CURRENT_THREAD; 140 140 141 mmc_dmsg("\n[D MSG] %s enters for thread %x in process %x / buf_xp = %l\n",141 mmc_dmsg("\n[DBG] %s enters for thread %x in process %x / buf_xp = %l\n", 142 142 __FUNCTION__ , this->trdid , this->process->pid , buf_xp ); 143 143 … … 164 164 error = dev_mmc_access( this ); 165 165 166 mmc_dmsg("\n[D MSG] %s completes for thread %x in process %x / error = %d\n",166 mmc_dmsg("\n[DBG] %s completes for thread %x in process %x / error = %d\n", 167 167 __FUNCTION__ , this->trdid , this->process->pid , error ); 168 168 -
trunk/kernel/devices/dev_nic.c
r406 r407 51 51 52 52 // set chdev name 53 if( is_rx ) snprintf( nic->name , 16 , "nic _rx_%d" , channel );54 else snprintf( nic->name , 16 , "nic _tx_%d" , channel );53 if( is_rx ) snprintf( nic->name , 16 , "nic%d_rx" , channel ); 54 else snprintf( nic->name , 16 , "nic%d_tx" , channel ); 55 55 56 56 // call driver init function … … 97 97 core_t * core = thread_ptr->core; 98 98 99 nic_dmsg("\n[D MSG] %s enters for NIC-RX thread on core %d in cluster %x\n",99 nic_dmsg("\n[DBG] %s enters for NIC-RX thread on core %d in cluster %x\n", 100 100 __FUNCTION__ , core->lid , local_cxy ); 101 101 … … 129 129 // block on THREAD_BLOCKED_IO condition and deschedule 130 130 thread_block( thread_ptr , THREAD_BLOCKED_IO ); 131 sched_yield( NULL);131 sched_yield(); 132 132 133 133 // disable NIC-RX IRQ … … 147 147 pkd->length = thread_ptr->nic_cmd.length; 148 148 149 nic_dmsg("\n[D MSG] %s exit for NIC-RX thread on core %d in cluster %x\n",149 nic_dmsg("\n[DBG] %s exit for NIC-RX thread on core %d in cluster %x\n", 150 150 __FUNCTION__ , core->lid , local_cxy ); 151 151 … … 167 167 core_t * core = thread_ptr->core; 168 168 169 nic_dmsg("\n[D MSG] %s enters for NIC-RX thread on core %d in cluster %x\n",169 nic_dmsg("\n[DBG] %s enters for NIC-RX thread on core %d in cluster %x\n", 170 170 __FUNCTION__ , core->lid , local_cxy ); 171 171 … … 199 199 // block on THREAD_BLOCKED I/O condition and deschedule 200 200 thread_block( thread_ptr , THREAD_BLOCKED_IO ); 201 sched_yield( NULL);201 sched_yield(); 202 202 203 203 // disable NIC-TX IRQ … … 215 215 if( error ) return error; 216 216 217 nic_dmsg("\n[D MSG] %s exit for NIC-TX thread on core %d in cluster %x\n",217 nic_dmsg("\n[DBG] %s exit for NIC-TX thread on core %d in cluster %x\n", 218 218 __FUNCTION__ , core->lid , local_cxy ); 219 219 -
trunk/kernel/devices/dev_nic.h
r14 r407 107 107 enum nic_impl_e 108 108 { 109 IMPL_NIC_ SOC= 0,109 IMPL_NIC_CBF = 0, 110 110 IMPL_NIC_I86 = 1, 111 111 } -
trunk/kernel/devices/dev_pic.c
r406 r407 36 36 37 37 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 38 extern iopic_input_t iopic_input; // allocated in kernel_init.c 38 39 39 40 /////////////////////////////////// … … 83 84 xptr_t src_chdev_xp ) 84 85 { 85 irq_dmsg("\n[DMSG] %s : core = [%x,%d] / src_chdev_cxy = %x / src_chdev_ptr = %x\n", 86 __FUNCTION__ , local_cxy , lid , GET_CXY(src_chdev_xp) , GET_PTR(src_chdev_xp) ); 86 87 irq_dmsg("\n[DBG] %s : core = [%x,%d] / src_chdev_cxy = %x / src_chdev_ptr = %x\n", 88 __FUNCTION__ , local_cxy , lid , GET_CXY(src_chdev_xp) , GET_PTR(src_chdev_xp) ); 87 89 88 90 // get pointer on PIC chdev … … 101 103 xptr_t src_chdev_xp ) 102 104 { 103 irq_dmsg("\n[DMSG] %s : core = [%x,%d] / src_chdev_cxy = %x / src_chdev_ptr = %x\n", 104 __FUNCTION__ , local_cxy , lid , GET_CXY(src_chdev_xp) , GET_PTR(src_chdev_xp) ); 105 106 irq_dmsg("\n[DBG] %s : core = [%x,%d] / src_chdev_cxy = %x / src_chdev_ptr = %x\n", 107 __FUNCTION__ , local_cxy , lid , GET_CXY(src_chdev_xp) , GET_PTR(src_chdev_xp) ); 105 108 106 109 // get pointer on PIC chdev … … 118 121 void dev_pic_enable_timer( uint32_t period ) 119 122 { 120 irq_dmsg("\n[DMSG] %s : core = [%x,%d] / period = %d\n", 121 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , period ); 123 124 irq_dmsg("\n[DBG] %s : core = [%x,%d] / period = %d\n", 125 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , period ); 122 126 123 127 // get pointer on PIC chdev … … 135 139 void dev_pic_enable_ipi() 136 140 { 137 irq_dmsg("\n[DMSG] %s : core = [%x,%d]\n", 138 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid ); 141 142 irq_dmsg("\n[DBG] %s : core = [%x,%d] / cycle %d\n", 143 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , hal_time_stamp() ); 139 144 140 145 // get pointer on PIC chdev … … 153 158 lid_t lid ) 154 159 { 155 irq_dmsg("\n[DMSG] %s : enter / src_core = [%x,%d] / dst_core = [%x,%d] / cycle %d\n", 156 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, cxy, lid, hal_time_stamp() ); 160 161 irq_dmsg("\n[DBG] %s : src_core = [%x,%d] / dst_core = [%x,%d] / cycle %d\n", 162 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, cxy, lid, hal_time_stamp() ); 157 163 158 164 // get pointer on PIC chdev … … 165 171 // call relevant driver function 166 172 f( cxy , lid ); 167 168 irq_dmsg("\n[DMSG] %s : exit / src_core = [%x,%d] / dst_core = [%x,%d] / cycle %d\n", 169 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, cxy, lid, hal_time_stamp() ); 170 } 171 173 } 174 175 ////////////////////// 176 void dev_pic_ack_ipi() 177 { 178 179 irq_dmsg("\n[DBG] %s : core = [%x,%d] / cycle %d\n", 180 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, hal_time_stamp() ); 181 182 // get pointer on PIC chdev 183 chdev_t * pic_ptr = (chdev_t *)GET_PTR( chdev_dir.pic ); 184 cxy_t pic_cxy = GET_CXY( chdev_dir.pic ); 185 186 // get pointer on ack_ipi function 187 ack_ipi_t * f = hal_remote_lpt( XPTR( pic_cxy , &pic_ptr->ext.pic.ack_ipi ) ); 188 189 // call relevant driver function 190 f(); 191 } 192 193 ///////////////////////////// 194 void dev_pic_inputs_display() 195 { 196 uint32_t k; 197 uint32_t save_sr; 198 199 // get pointers on TXT0 chdev 200 xptr_t txt0_xp = chdev_dir.txt_tx[0]; 201 cxy_t txt0_cxy = GET_CXY( txt0_xp ); 202 chdev_t * txt0_ptr = GET_PTR( txt0_xp ); 203 204 // get extended pointer on remote TXT0 chdev lock 205 xptr_t lock_xp = XPTR( txt0_cxy , &txt0_ptr->wait_lock ); 206 207 // get TXT0 lock in busy waiting mode 208 remote_spinlock_lock_busy( lock_xp , &save_sr ); 209 210 nolock_printk("\n***** iopic_inputs\n"); 211 212 for( k = 0 ; k < CONFIG_MAX_IOC_CHANNELS ; k++ ) 213 { 214 nolock_printk(" - IOC[%d] hwi_id = %d\n", k , iopic_input.ioc[k] ); 215 } 216 217 for( k = 0 ; k < CONFIG_MAX_TXT_CHANNELS ; k++ ) 218 { 219 nolock_printk(" - TXT_TX[%d] hwi_id = %d\n", k , iopic_input.txt_tx[k] ); 220 nolock_printk(" - TXT_RX[%d] hwi_id = %d\n", k , iopic_input.txt_rx[k] ); 221 } 222 223 for( k = 0 ; k < CONFIG_MAX_NIC_CHANNELS ; k++ ) 224 { 225 nolock_printk(" - NIC_TX[%d] hwi_id = %d\n", k , iopic_input.nic_tx[k] ); 226 nolock_printk(" - NIC_RX[%d] hwi_id = %d\n", k , iopic_input.nic_rx[k] ); 227 } 228 229 // release TXT0 lock 230 remote_spinlock_unlock_busy( lock_xp , save_sr ); 231 } 232 233 -
trunk/kernel/devices/dev_pic.h
r406 r407 80 80 /***************************************************************************************** 81 81 * This defines the specific extension for the PIC chdev descriptor. 82 * It contains four function pointers on the four PIC command types,83 * that must be implemented by alldrivers.82 * It contains the function pointers for all functions that mus be implemented 83 * by all implementation specific drivers. 84 84 ****************************************************************************************/ 85 85 … … 90 90 typedef void (enable_ipi_t) ( ); 91 91 typedef void (send_ipi_t) ( cxy_t cxy , lid_t lid ); 92 typedef void (ack_ipi_t) ( ); 92 93 typedef void (extend_init_t) ( uint32_t * lapic_base ); 93 94 … … 98 99 disable_irq_t * disable_irq; /*! pointer on the driver "disable_irq" function */ 99 100 enable_timer_t * enable_timer; /*! pointer on the driver "enable_timer" function */ 100 enable_ timer_t* enable_ipi; /*! pointer on the driver "enable_ipi" function */101 enable_ipi_t * enable_ipi; /*! pointer on the driver "enable_ipi" function */ 101 102 send_ipi_t * send_ipi; /*! pointer on the driver "send_ipi" function */ 103 ack_ipi_t * ack_ipi; /*! pointer on the driver "ack_ipi" function */ 102 104 extend_init_t * extend_init; /*! pointer on the driver "init_extend" function */ 103 105 } … … 109 111 * It describes the hardware wiring of IRQs between external peripherals and the IOPIC, 110 112 * as each entry contains the input IRQ index in IOPIC. 111 * For a multi-channels peripheral, there is one chdev and one IRQ per channel.113 * For a multi-channels/multi_IRQ peripheral, there is one chdev per IRQ. 112 114 * This structure is replicated in each cluster. It is allocated as a global variable 113 115 * in the kernel_init.c file. … … 116 118 typedef struct iopic_input_s 117 119 { 118 uint32_t txt[CONFIG_MAX_TXT_CHANNELS];119 120 uint32_t ioc[CONFIG_MAX_IOC_CHANNELS]; 121 uint32_t txt_rx[CONFIG_MAX_TXT_CHANNELS]; 122 uint32_t txt_tx[CONFIG_MAX_TXT_CHANNELS]; 120 123 uint32_t nic_rx[CONFIG_MAX_NIC_CHANNELS]; 121 124 uint32_t nic_tx[CONFIG_MAX_NIC_CHANNELS]; … … 180 183 * This is a static binding, defined during kernel init: IRQ can be enabled/disabled, 181 184 * but the binding cannot be released. It can be used for both internal & external IRQs. 185 * The configuration is actually done by the - implementation specific - driver, 186 * and this function just call the relevant driver. 182 187 * WARNING : the IRQ must be explicitely enabled by the dev_pic_enable_irq() function. 183 188 ***************************************************************************************** … … 234 239 lid_t lid ); 235 240 241 /***************************************************************************************** 242 * This function acknowledges the IPI identified by the calling core local index, 243 * in the local LAPIC component. 244 ****************************************************************************************/ 245 void dev_pic_ack_ipi(); 246 247 /***************************************************************************************** 248 * This debug function displays the content of the iopic_input structure, 249 * that register the input IRQS for the external IOPIC controller. 250 ****************************************************************************************/ 251 void dev_pic_inputs_display(); 236 252 237 253 #endif /* _DEV_PIC_H_ */ -
trunk/kernel/devices/dev_txt.c
r406 r407 27 27 #include <hal_drivers.h> 28 28 #include <thread.h> 29 #include <chdev.h> 29 30 #include <rpc.h> 30 31 #include <printk.h> … … 36 37 37 38 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 39 40 #if CONFIG_READ_DEBUG 41 extern uint32_t enter_txt_read; 42 extern uint32_t exit_txt_read; 43 #endif 38 44 39 45 ////////////////////////////////// … … 47 53 uint32_t channel = txt->channel; 48 54 uint32_t impl = txt->impl; 55 bool_t is_rx = txt->is_rx; 49 56 50 57 assert( (pic_xp != XPTR_NULL) || (channel == 0) , __FUNCTION__ , … … 52 59 53 60 // set chdev name 54 snprintf( txt->name , 16 , "txt_%d" , channel ); 61 if( is_rx ) snprintf( txt->name , 16 , "txt%d_rx" , channel ); 62 else snprintf( txt->name , 16 , "txt%d_tx" , channel ); 55 63 56 64 // call driver init function … … 61 69 if( channel != 0 && impl != IMPL_TXT_RS2 ) 62 70 { 63 // select a core to execute the TXTserver thread71 // select a core to execute the server thread 64 72 lid_t lid = cluster_select_local_core(); 65 73 66 // bind TXTIRQ to the selected core74 // bind IRQ to the selected core 67 75 dev_pic_bind_irq( lid , txt ); 68 76 69 // enable TXTIRQ77 // enable IRQ 70 78 dev_pic_enable_irq( lid , XPTR( local_cxy , txt ) ); 71 79 … … 99 107 uint32_t count ) 100 108 { 109 xptr_t dev_xp; 101 110 thread_t * this = CURRENT_THREAD; 102 111 103 txt_dmsg("\n[DMSG] in %s : thread %x in process %x enters\n",104 __FUNCTION__ , this->trdid , this->process->pid);112 txt_dmsg("\n[DBG] %s : core[%x,%d] (thread %s) enters / cycle %d\n", 113 __FUNCTION__, local_cxy, this->core->lid, thread_type_str(this->type), hal_time_stamp() ); 105 114 106 115 // check channel argument … … 108 117 109 118 // get extended pointer on remote TXT chdev descriptor 110 xptr_t dev_xp = chdev_dir.txt[channel]; 119 if( type == TXT_WRITE ) dev_xp = chdev_dir.txt_tx[channel]; 120 else dev_xp = chdev_dir.txt_rx[channel]; 111 121 112 122 assert( (dev_xp != XPTR_NULL) , __FUNCTION__ , "undefined TXT chdev descriptor" ); … … 121 131 // block client thread on THREAD_BLOCKED_IO and deschedule. 122 132 // it is re-activated by the ISR signaling IO operation completion. 123 chdev_register_command( dev_xp , this);133 chdev_register_command( dev_xp ); 124 134 125 txt_dmsg("\n[DMSG] in %s : thread %x in process %x completes / error =%d\n",126 __FUNCTION__ , this->trdid , this->process->pid , this->txt_cmd.error);135 txt_dmsg("\n[DBG] %s : core[%x,%d] (thread %s) exit / cycle %d\n", 136 __FUNCTION__, local_cxy, this->core->lid, thread_type_str(this->type), hal_time_stamp() ); 127 137 128 138 // return I/O operation status from calling thread descriptor … … 135 145 uint32_t count ) 136 146 { 137 return dev_txt_access( TXT_WRITE , channel , buffer , count ); 147 error_t error = dev_txt_access( TXT_WRITE , channel , buffer , count ); 148 return error; 138 149 } 139 150 … … 142 153 char * buffer ) 143 154 { 144 return dev_txt_access( TXT_READ , channel , buffer , 1 ); 155 156 #if CONFIG_READ_DEBUG 157 enter_txt_read = hal_time_stamp(); 158 #endif 159 160 error_t error = dev_txt_access( TXT_READ , channel , buffer , 1 ); 161 162 #if CONFIG_READ_DEBUG 163 exit_txt_read = hal_time_stamp(); 164 #endif 165 166 return error; 167 145 168 } 146 169 147 /////////////////////////////////////////////// 148 error_t dev_txt_sync_write( uint32_t channel, 149 char * buffer, 170 ////////////////////////////////////////////// 171 error_t dev_txt_sync_write( char * buffer, 150 172 uint32_t count ) 151 173 { 152 // get pointer on calling thread153 thread_t * this = CURRENT_THREAD;174 // get extended pointer on TXT[0] chdev 175 xptr_t dev_xp = chdev_dir.txt_tx[0]; 154 176 155 // get extended pointer on TXT[0] chdev156 xptr_t dev_xp = chdev_dir.txt[channel];177 assert( (dev_xp != XPTR_NULL) , __FUNCTION__ , 178 "undefined TXT0 chdev descriptor" ); 157 179 158 assert( (dev_xp != XPTR_NULL) , __FUNCTION__ , "undefined TXT0 chdev descriptor" ); 159 160 // register command in calling thread descriptor 161 this->txt_cmd.dev_xp = dev_xp; 162 this->txt_cmd.type = TXT_SYNC_WRITE; 163 this->txt_cmd.buf_xp = XPTR( local_cxy , buffer ); 164 this->txt_cmd.count = count; 180 // get TXTO chdev cluster and local pointer 181 cxy_t dev_cxy = GET_CXY( dev_xp ); 182 chdev_t * dev_ptr = (chdev_t *)GET_PTR( dev_xp ); 165 183 166 184 // get driver command function 167 cxy_t dev_cxy = GET_CXY( dev_xp ); 168 chdev_t * dev_ptr = (chdev_t *)GET_PTR( dev_xp ); 169 dev_cmd_t * cmd = (dev_cmd_t *)hal_remote_lpt( XPTR( dev_cxy , &dev_ptr->cmd ) ); 185 dev_aux_t * aux = (dev_aux_t *)hal_remote_lpt( XPTR( dev_cxy , &dev_ptr->aux ) ); 186 187 // build arguments structure 188 txt_aux_t args; 189 args.dev_xp = dev_xp; 190 args.buffer = buffer; 191 args.count = count; 170 192 171 193 // call driver function 172 cmd( XPTR( local_cxy , this ));194 aux( &args ); 173 195 174 // return I/O operation status from calling thread descriptor 175 return this->txt_cmd.error; 196 return 0; 176 197 } 177 198 -
trunk/kernel/devices/dev_txt.h
r254 r407 36 36 * 37 37 * This multi-channels generic TXT device provides access to a text terminal. 38 * It supports three operation types : 38 * 39 * It supports two operations that must be implemented by the driver cmd() function: 39 40 * - TXT_READ : read a single character from the text terminal identified by its channel 40 41 * index, using a descheduling strategy for the calling thread. 41 42 * - TXT_WRITE : write a character string to the text terminal identified by its channel 42 43 * index, using a descheduling strategy for the calling thread. 43 * - TXT_SYNC_WRITE : write a character string to the terminal identified by its channel 44 * index, using a busy waiting strategy for the calling thread. 44 * 45 * It supports one operation, that must be implemented by the driver aux() function 46 * - TXT_SYNC_WRITE write a character string to the TXT0 kernel terminal, using a busy 47 * waiting strategy for the calling thread. 45 48 *****************************************************************************************/ 46 49 … … 58 61 59 62 /****************************************************************************************** 60 * This defines the (implementation independent) command passed to the driver.63 * This defines the arguments passed to the driver CMD function. 61 64 *****************************************************************************************/ 62 65 … … 65 68 TXT_READ = 0, 66 69 TXT_WRITE = 1, 67 TXT_SYNC_WRITE = 2,68 70 }; 69 71 … … 77 79 } 78 80 txt_command_t; 81 82 /****************************************************************************************** 83 * This defines the arguments passed to the driver AUX function. 84 * This function implement the TXT_SYNC_WRITE operation. 85 *****************************************************************************************/ 86 87 typedef struct txt_aux_s 88 { 89 xptr_t dev_xp; /*! extended pointer on the TXT0 device descriptor */ 90 char * buffer; /*! local pointer on characters array */ 91 uint32_t count; /*! number of characters in buffer */ 92 } 93 txt_aux_t; 79 94 80 95 /****************************************************************************************** … … 122 137 123 138 /*************************************************************************************** 124 * This low-level blocking function is used by the kernel to display one string on a 125 * given TXT channel without descheduling the calling thread, without registering it 126 * in the TXT device waiting queue, and without using the TXT irq. 139 * This blocking function is used by the kernel to display a string on the TXT0 140 * terminal, without descheduling the calling thread, without registering it 141 * in the TXT0 device waiting queue, without using the TXT0 irq, and without 142 * interfering with another possible TXT access to another terminal. 143 * As it is used for debug, the command arguments <buffer> and <count> are registerd 144 * in a specific "dbg_cmd" field of the calling thread. 145 * other TXT accesses. 127 146 **************************************************************************************** 128 * @ channel : TXT channel index.129 147 * @ buffer : local pointer on source buffer containing the string. 130 148 * @ count : number of characters. 131 149 * @ returns 0 if success / returns EINVAL if error. 132 150 ***************************************************************************************/ 133 error_t dev_txt_sync_write( uint32_t channel, 134 char * buffer, 151 error_t dev_txt_sync_write( char * buffer, 135 152 uint32_t count ); 136 153 -
trunk/kernel/fs/devfs.c
r406 r407 25 25 #include <hal_types.h> 26 26 #include <hal_special.h> 27 #include <hal_uspace.h> 27 28 #include <printk.h> 28 29 #include <chdev.h> 30 #include <dev_txt.h> 29 31 #include <cluster.h> 30 32 #include <vfs.h> … … 39 41 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 40 42 43 #if CONFIG_READ_DEBUG 44 extern uint32_t enter_devfs_move; 45 extern uint32_t exit_devfs_move; 46 #endif 47 41 48 /////////////////////////////// 42 49 devfs_ctx_t * devfs_ctx_alloc() … … 79 86 error_t error; 80 87 81 devfs_dmsg("\n[D MSG] %s : enter in cluster %x\n",88 devfs_dmsg("\n[DBG] %s : enter in cluster %x\n", 82 89 __FUNCTION__ , local_cxy ); 83 90 … … 93 100 assert( (error == 0) , __FUNCTION__ , "cannot create <dev>\n" ); 94 101 95 devfs_dmsg("\n[D MSG] %s : <dev> created in cluster %x\n",102 devfs_dmsg("\n[DBG] %s : <dev> created in cluster %x\n", 96 103 __FUNCTION__ , local_cxy ); 97 104 … … 107 114 assert( (error == 0) , __FUNCTION__ , "cannot create <external>\n" ); 108 115 109 devfs_dmsg("\n[D MSG] %s : <external> created in cluster %x\n",116 devfs_dmsg("\n[DBG] %s : <external> created in cluster %x\n", 110 117 __FUNCTION__ , local_cxy ); 111 118 } … … 119 126 xptr_t chdev_xp; 120 127 cxy_t chdev_cxy; 128 chdev_t * chdev_ptr; 121 129 xptr_t inode_xp; 122 130 uint32_t channel; … … 132 140 devfs_internal_inode_xp ); 133 141 142 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 143 __FUNCTION__ , node_name , local_cxy ); 144 134 145 // create MMC chdev inode 135 chdev_xp = chdev_dir.mmc[local_cxy];146 chdev_xp = chdev_dir.mmc[local_cxy]; 136 147 if( chdev_xp != XPTR_NULL) 137 148 { 149 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 138 150 vfs_add_child_in_parent( local_cxy, 139 151 INODE_TYPE_DEV, 140 152 FS_TYPE_DEVFS, 141 153 *devfs_internal_inode_xp, 142 "mmc",154 chdev_ptr->name, 143 155 GET_PTR( chdev_xp ), 144 156 &inode_xp ); 157 158 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 159 __FUNCTION__ , chdev_ptr->name , local_cxy ); 160 145 161 } 146 162 … … 151 167 if( chdev_xp != XPTR_NULL) 152 168 { 153 snprintf( node_name , 16 , "dma_%d" , channel);169 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 154 170 vfs_add_child_in_parent( local_cxy, 155 171 INODE_TYPE_DEV, 156 172 FS_TYPE_DEVFS, 157 173 *devfs_internal_inode_xp, 158 node_name,174 chdev_ptr->name, 159 175 GET_PTR( chdev_xp ), 160 176 &inode_xp ); 177 178 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 179 __FUNCTION__ , chdev_ptr->name , local_cxy ); 180 161 181 } 162 182 } … … 167 187 { 168 188 chdev_cxy = GET_CXY( chdev_xp ); 189 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 169 190 if( chdev_cxy == local_cxy ) 170 191 { … … 173 194 FS_TYPE_DEVFS, 174 195 devfs_external_inode_xp, 175 "iob",196 chdev_ptr->name, 176 197 GET_PTR( chdev_xp ), 177 198 &inode_xp ); 199 200 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 201 __FUNCTION__ , chdev_ptr->name , local_cxy ); 202 178 203 } 179 204 } … … 184 209 { 185 210 chdev_cxy = GET_CXY( chdev_xp ); 211 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 186 212 if( chdev_cxy == local_cxy ) 187 213 { … … 190 216 FS_TYPE_DEVFS, 191 217 devfs_external_inode_xp, 192 "pic",218 chdev_ptr->name, 193 219 GET_PTR( chdev_xp ), 194 220 &inode_xp ); 195 } 196 } 197 198 // create a TXT inode in each cluster containing a TXT chdev 221 222 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 223 __FUNCTION__ , chdev_ptr->name , local_cxy ); 224 225 } 226 } 227 228 // create a TXT_RX inode in each cluster containing a TXT_RX chdev 199 229 for( channel = 0 ; channel < CONFIG_MAX_TXT_CHANNELS ; channel++ ) 200 230 { 201 chdev_xp = chdev_dir.txt[channel]; 202 if( chdev_xp != XPTR_NULL ) 203 { 204 chdev_cxy = GET_CXY( chdev_xp ); 205 if( chdev_cxy == local_cxy ) 206 { 207 snprintf( node_name , 16 , "txt_%d" , channel ); 208 vfs_add_child_in_parent( local_cxy, 209 INODE_TYPE_DEV, 210 FS_TYPE_DEVFS, 211 devfs_external_inode_xp, 212 node_name, 213 GET_PTR( chdev_xp ), 214 &inode_xp ); 231 chdev_xp = chdev_dir.txt_rx[channel]; 232 if( chdev_xp != XPTR_NULL ) 233 { 234 chdev_cxy = GET_CXY( chdev_xp ); 235 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 236 if( chdev_cxy == local_cxy ) 237 { 238 vfs_add_child_in_parent( local_cxy, 239 INODE_TYPE_DEV, 240 FS_TYPE_DEVFS, 241 devfs_external_inode_xp, 242 chdev_ptr->name, 243 GET_PTR( chdev_xp ), 244 &inode_xp ); 245 246 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 247 __FUNCTION__ , chdev_ptr->name , local_cxy ); 248 249 } 250 } 251 } 252 253 // create a TXT_TX inode in each cluster containing a TXT_TX chdev 254 for( channel = 0 ; channel < CONFIG_MAX_TXT_CHANNELS ; channel++ ) 255 { 256 chdev_xp = chdev_dir.txt_tx[channel]; 257 if( chdev_xp != XPTR_NULL ) 258 { 259 chdev_cxy = GET_CXY( chdev_xp ); 260 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 261 if( chdev_cxy == local_cxy ) 262 { 263 vfs_add_child_in_parent( local_cxy, 264 INODE_TYPE_DEV, 265 FS_TYPE_DEVFS, 266 devfs_external_inode_xp, 267 chdev_ptr->name, 268 GET_PTR( chdev_xp ), 269 &inode_xp ); 270 271 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 272 __FUNCTION__ , chdev_ptr->name , local_cxy ); 273 215 274 } 216 275 } … … 224 283 { 225 284 chdev_cxy = GET_CXY( chdev_xp ); 226 if( chdev_cxy == local_cxy ) 227 { 228 snprintf( node_name , 16 , "ioc_%d" , channel ); 229 vfs_add_child_in_parent( local_cxy, 230 INODE_TYPE_DEV, 231 FS_TYPE_DEVFS, 232 devfs_external_inode_xp, 233 node_name, 234 GET_PTR( chdev_xp ), 235 &inode_xp ); 285 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 286 if( chdev_cxy == local_cxy ) 287 { 288 vfs_add_child_in_parent( local_cxy, 289 INODE_TYPE_DEV, 290 FS_TYPE_DEVFS, 291 devfs_external_inode_xp, 292 chdev_ptr->name, 293 GET_PTR( chdev_xp ), 294 &inode_xp ); 295 296 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 297 __FUNCTION__ , chdev_ptr->name , local_cxy ); 298 236 299 } 237 300 } … … 245 308 { 246 309 chdev_cxy = GET_CXY( chdev_xp ); 247 if( chdev_cxy == local_cxy ) 248 { 249 snprintf( node_name , 16 , "fbf_%d" , channel ); 250 vfs_add_child_in_parent( local_cxy, 251 INODE_TYPE_DEV, 252 FS_TYPE_DEVFS, 253 devfs_external_inode_xp, 254 node_name, 255 GET_PTR( chdev_xp ), 256 &inode_xp ); 310 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 311 if( chdev_cxy == local_cxy ) 312 { 313 vfs_add_child_in_parent( local_cxy, 314 INODE_TYPE_DEV, 315 FS_TYPE_DEVFS, 316 devfs_external_inode_xp, 317 chdev_ptr->name, 318 GET_PTR( chdev_xp ), 319 &inode_xp ); 320 321 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 322 __FUNCTION__ , chdev_ptr->name , local_cxy ); 323 257 324 } 258 325 } … … 266 333 { 267 334 chdev_cxy = GET_CXY( chdev_xp ); 268 if( chdev_cxy == local_cxy ) 269 { 270 snprintf( node_name , 16 , "nic_rx_%d" , channel ); 271 vfs_add_child_in_parent( local_cxy, 272 INODE_TYPE_DEV, 273 FS_TYPE_DEVFS, 274 devfs_external_inode_xp, 275 node_name, 276 GET_PTR( chdev_xp ), 277 &inode_xp ); 335 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 336 if( chdev_cxy == local_cxy ) 337 { 338 vfs_add_child_in_parent( local_cxy, 339 INODE_TYPE_DEV, 340 FS_TYPE_DEVFS, 341 devfs_external_inode_xp, 342 chdev_ptr->name, 343 GET_PTR( chdev_xp ), 344 &inode_xp ); 345 346 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 347 __FUNCTION__ , chdev_ptr->name , local_cxy ); 348 278 349 } 279 350 } … … 287 358 { 288 359 chdev_cxy = GET_CXY( chdev_xp ); 289 if( chdev_cxy == local_cxy ) 290 { 291 snprintf( node_name , 16 , "nic_tx_%d" , channel ); 292 vfs_add_child_in_parent( local_cxy, 293 INODE_TYPE_DEV, 294 FS_TYPE_DEVFS, 295 devfs_external_inode_xp, 296 node_name, 297 GET_PTR( chdev_xp ), 298 &inode_xp ); 360 chdev_ptr = (chdev_t *)GET_PTR( chdev_xp ); 361 if( chdev_cxy == local_cxy ) 362 { 363 vfs_add_child_in_parent( local_cxy, 364 INODE_TYPE_DEV, 365 FS_TYPE_DEVFS, 366 devfs_external_inode_xp, 367 chdev_ptr->name, 368 GET_PTR( chdev_xp ), 369 &inode_xp ); 370 371 devfs_dmsg("\n[DBG] %s : created <%s> inode in cluster %x\n", 372 __FUNCTION__ , chdev_ptr->name , local_cxy ); 373 299 374 } 300 375 } … … 302 377 } // end devfs_local_init() 303 378 379 ////////////////////////////////////////// 380 int devfs_user_move( bool_t to_buffer, 381 xptr_t file_xp, 382 void * u_buf, 383 uint32_t size ) 384 { 385 assert( ( file_xp != XPTR_NULL ) , __FUNCTION__ , "file_xp == XPTR_NULL" ); 386 387 assert( ( size < CONFIG_TXT_KBUF_SIZE ) , __FUNCTION__ , "string size too large" ); 388 389 cxy_t file_cxy; // remote file descriptor cluster 390 vfs_file_t * file_ptr; // remote file descriptor local pointer 391 vfs_inode_type_t inode_type; // associated inode type 392 vfs_inode_t * inode_ptr; // associated inode local pointer 393 chdev_t * chdev_ptr; // associated chdev type 394 uint32_t func; // chdev functionnal type 395 uint32_t channel; // chdev channel index 396 error_t error; 397 398 char k_buf[CONFIG_TXT_KBUF_SIZE]; // local kernel buffer 399 400 devfs_dmsg("\n[DBG] %s enter / cycle %d\n", 401 __FUNCTION__ , hal_time_stamp() ); 402 403 #if CONFIG_READ_DEBUG 404 enter_devfs_move = hal_time_stamp(); 405 #endif 406 407 // get cluster and local pointer on remote file descriptor 408 // associated inode and chdev are stored in same cluster as the file desc. 409 file_cxy = GET_CXY( file_xp ); 410 file_ptr = (vfs_file_t *)GET_PTR( file_xp ); 411 412 // get inode type from remote file descriptor 413 inode_type = hal_remote_lw( XPTR( file_cxy , &file_ptr->type ) ); 414 inode_ptr = (vfs_inode_t *)hal_remote_lpt( XPTR( file_cxy , &file_ptr->inode ) ); 415 416 assert( (inode_type == INODE_TYPE_DEV) , __FUNCTION__ , 417 "inode type is not INODE_TYPE_DEV" ); 418 419 // get chdev local pointer from remote inode extension 420 chdev_ptr = (chdev_t *)hal_remote_lpt( XPTR( file_cxy , &inode_ptr->extend ) ); 421 422 // get chdev functionnal type and channel 423 func = hal_remote_lw( XPTR( file_cxy , &chdev_ptr->func ) ); 424 channel = hal_remote_lw( XPTR( file_cxy , &chdev_ptr->channel ) ); 425 426 // action depends on "func" and "to_buffer" 427 if( func == DEV_FUNC_TXT ) 428 { 429 if( to_buffer ) // TXT read 430 { 431 uint32_t i; 432 for( i = 0 ; i < size ; i++ ) 433 { 434 error = dev_txt_read( channel , &k_buf[i] ); 435 436 if( error ) 437 { 438 439 devfs_dmsg("\n[DBG] %s exit error / cycle %d\n", 440 __FUNCTION__ , hal_time_stamp() ); 441 442 return -1; 443 } 444 else 445 { 446 hal_strcpy_to_uspace( u_buf , k_buf , size ); 447 } 448 } 449 450 #if CONFIG_READ_DEBUG 451 exit_devfs_move = hal_time_stamp(); 452 #endif 453 454 devfs_dmsg("\n[DBG] %s exit success / size = %d / cycle %d\n", 455 __FUNCTION__ , size , hal_time_stamp() ); 456 457 return size; 458 } 459 else // TXT write 460 { 461 hal_strcpy_from_uspace( k_buf , u_buf , size ); 462 463 error = dev_txt_write( channel , k_buf , size ); 464 if( error ) 465 { 466 467 devfs_dmsg("\n[DBG] %s exit error / cycle %d\n", 468 __FUNCTION__ , hal_time_stamp() ); 469 470 return -1; 471 } 472 else 473 { 474 475 devfs_dmsg("\n[DBG] %s exit success / size = %d / cycle %d\n", 476 __FUNCTION__ , size , hal_time_stamp() ); 477 478 return size; 479 } 480 } 481 } 482 else 483 { 484 panic("device type %s does not support direct user access", chdev_func_str(func) ); 485 486 return -1; 487 } 488 } // end devfs_user_move() 489 490 -
trunk/kernel/fs/devfs.h
r238 r407 41 41 // 42 42 // The DEVFS extensions to the generic VFS are the following: 43 // 1) The vfs_ctx_t "extend" field is a void*pointing on the devfs_ctx_t structure.43 // 1) The vfs_ctx_t "extend" void* field is pointing on the devfs_ctx_t structure. 44 44 // This structure contains two extended pointers on the DEVFS "dev" directory inode, 45 45 // and on the "external" directory inode. 46 // 2) The vfs_inode_t "extend" field is a void*, pointing on the associated 47 // chdev descriptor. 46 // 2) The vfs_inode_t "extend" void* field is pointing on the chdev descriptor. 48 47 ////////////////////////////////////////////////////////////////////////////////////////// 49 48 … … 119 118 xptr_t * devfs_internal_inode_xp ); 120 119 120 /****************************************************************************************** 121 * This function moves <size> bytes between a device, and a - possibly distributed - 122 * user space <buffer>. It uses the <file_xp> and <to_buffer> arguments, to call the 123 * relevant device access function. 124 * It is called by the sys_read() and sys_write() functions. 125 * The <size> argument cannot be larger than the CONFIG_TXT_KBUF_SIZE configuration 126 * parameter, as this function makes a copy between the user space buffer, and a local 127 * kernel buffer allocated in the kernel stack. 128 ****************************************************************************************** 129 * @ to_buffer : device -> buffer if true / buffer -> device if false. 130 * @ file_xp : extended pointer on the remote file descriptor. 131 * @ u_buf : user space buffer (virtual address). 132 * @ size : requested number of bytes from offset. 133 * @ returns number of bytes actually moved if success / -1 if error. 134 *****************************************************************************************/ 135 int devfs_user_move( bool_t to_buffer, 136 xptr_t file_xp, 137 void * u_buf, 138 uint32_t size ); 139 140 121 141 #endif /* _DEVFS_H_ */ -
trunk/kernel/fs/fatfs.c
r406 r407 262 262 "no FAT access required for first page\n"); 263 263 264 fatfs_dmsg("\n[DMSG] %s : enter / first_cluster_id = %d / searched_page_index = %d\n",265 __FUNCTION__ , first_cluster_id, searched_page_index );264 fatfs_dmsg("\n[DBG] %s : core[%x,%d] enters / first_cluster_id = %d / searched_index = %d\n", 265 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, first_cluster_id, searched_page_index ); 266 266 267 267 // get number of FAT slots per page … … 289 289 next_cluster_id = current_page_buffer[current_page_offset]; 290 290 291 fatfs_dmsg("\n[DMSG] %s : traverse FAT / current_page_index = %d\n" 292 " current_page_offset = %d / next_cluster_id = %d\n", 293 __FUNCTION__ , current_page_index , current_page_offset , next_cluster_id ); 291 fatfs_dmsg("\n[DBG] %s : core[%x,%d] traverse FAT / current_page_index = %d\n" 292 "current_page_offset = %d / next_cluster_id = %d\n", 293 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, current_page_index, 294 current_page_offset , next_cluster_id ); 294 295 295 296 // update loop variables … … 301 302 if( next_cluster_id == 0xFFFFFFFF ) return EIO; 302 303 303 fatfs_dmsg("\n[DMSG] %s : exit / cluster_id = %d\n", __FUNCTION__ , next_cluster_id ); 304 fatfs_dmsg("\n[DBG] %s : core[%x;%d] exit / cluster_id = %d\n", 305 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, next_cluster_id ); 304 306 305 307 *searched_cluster_id = next_cluster_id; … … 333 335 uint8_t * buffer; 334 336 335 fatfs_dmsg("\n[D MSG] %s : enter for fatfs_ctx = %x\n",337 fatfs_dmsg("\n[DBG] %s : enter for fatfs_ctx = %x\n", 336 338 __FUNCTION__ , fatfs_ctx ); 337 339 … … 347 349 "cannot allocate memory for 512 bytes buffer\n" ); 348 350 349 fatfs_dmsg("\n[D MSG] %s : allocated 512 bytes buffer\n", __FUNCTION__ );351 fatfs_dmsg("\n[DBG] %s : allocated 512 bytes buffer\n", __FUNCTION__ ); 350 352 351 353 // load the boot record from device … … 353 355 error = dev_ioc_sync_read( buffer , 0 , 1 ); 354 356 355 fatfs_dmsg("\n[DMSG] %s : buffer loaded\n", __FUNCTION__ );357 fatfs_dmsg("\n[DBG] %s : buffer loaded\n", __FUNCTION__ ); 356 358 357 359 assert( (error == 0) , __FUNCTION__ , "cannot access boot record\n" ); … … 415 417 kmem_free( &req ); 416 418 417 fatfs_dmsg("\n[D MSG] %s : boot record read & released\n",419 fatfs_dmsg("\n[DBG] %s : boot record read & released\n", 418 420 __FUNCTION__ ); 419 421 … … 437 439 fatfs_ctx->fat_mapper_xp = XPTR( local_cxy , fat_mapper ); 438 440 439 fatfs_dmsg("\n[DMSG] %s : exit for fatfs_ctx = %x\n", 440 __FUNCTION__ , fatfs_ctx ); 441 fatfs_dmsg("\n[DBG] %s : exit for fatfs_ctx = %x\n", __FUNCTION__ , fatfs_ctx ); 441 442 442 443 } // end fatfs_ctx_init() … … 471 472 inode = mapper->inode; 472 473 473 fatfs_dmsg("\n[DMSG] %s : core[%x,%d] enter for page %d / inode %x / mapper %x\n",474 474 fatfs_dmsg("\n[DBG] %s : core[%x,%d] enter for page %d / inode %x / mapper %x\n", 475 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , index , inode , mapper ); 475 476 476 477 // get page base address … … 488 489 lba = fatfs_ctx->fat_begin_lba + (count * index); 489 490 490 fatfs_dmsg("\n[DMSG] %s : core[%x,%d] access FAT on device / lba = %d\n",491 491 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access FAT on device / lba = %d\n", 492 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , lba ); 492 493 493 494 // access device … … 511 512 else // FAT mapper access required 512 513 { 513 fatfs_dmsg("\n[DMSG] %s : core[%x,%d] must access FAT\n",514 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid );515 516 514 // get cluster and local pointer on FAT mapper 517 515 xptr_t fat_mapper_xp = fatfs_ctx->fat_mapper_xp; … … 522 520 if( fat_mapper_cxy == local_cxy ) // FAT mapper is local 523 521 { 522 523 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access local FAT mapper\n" 524 "fat_mapper_cxy = %x / fat_mapper_ptr = %x / first_cluster_id = %d / index = %d\n", 525 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , 526 fat_mapper_cxy , fat_mapper_ptr , first_cluster_id , index ); 527 524 528 error = fatfs_get_cluster( fat_mapper_ptr, 525 529 first_cluster_id, … … 529 533 else // FAT mapper is remote 530 534 { 535 536 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access remote FAT mapper\n" 537 "fat_mapper_cxy = %x / fat_mapper_ptr = %x / first_cluster_id = %d / index = %d\n", 538 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , 539 fat_mapper_cxy , fat_mapper_ptr , first_cluster_id , index ); 540 531 541 rpc_fatfs_get_cluster_client( fat_mapper_cxy, 532 542 fat_mapper_ptr, … … 540 550 } 541 551 542 fatfs_dmsg("\n[DMSG] %s : core[%x,%d] access device for inode %x / cluster_id %d\n",543 552 fatfs_dmsg("\n[DBG] %s : core[%x,%d] access device for inode %x / cluster_id %d\n", 553 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , inode , searched_cluster_id ); 544 554 545 555 // get lba from cluster_id … … 553 563 } 554 564 555 fatfs_dmsg("\n[DMSG] %s : core[%x,%d] exit for page %d / inode %x / mapper %x\n",556 565 fatfs_dmsg("\n[DBG] %s : core[%x,%d] exit for page %d / inode %x / mapper %x\n", 566 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , index , inode , mapper ); 557 567 558 568 #if (CONFIG_FATFS_DEBUG & 0x1) … … 584 594 // - scan the directory entries in each 4 Kbytes page 585 595 586 fatfs_dmsg("\n[DMSG] %s : enter for child <%s> in parent inode %l\n",587 596 fatfs_dmsg("\n[DBG] %s : enter for child <%s> in parent inode %l\n", 597 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 588 598 589 599 mapper_t * mapper = parent_inode->mapper; … … 705 715 if ( found == -1 ) // found end of directory => failure 706 716 { 707 fatfs_dmsg("\n[DMSG] %s : exit / child <%s> not found in parent inode %l\n", 708 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 717 718 fatfs_dmsg("\n[DBG] %s : exit / child <%s> not found in parent inode %l\n", 719 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 709 720 710 721 return ENOENT; … … 723 734 hal_remote_sw( XPTR( child_cxy , &child_ptr->extend ) , cluster ); 724 735 725 fatfs_dmsg("\n[DMSG] %s : exit / child <%s> found in parent inode %l\n",726 736 fatfs_dmsg("\n[DBG] %s : exit / child <%s> found in parent inode %l\n", 737 __FUNCTION__ , name , XPTR( local_cxy , parent_inode ) ); 727 738 728 739 return 0; -
trunk/kernel/fs/vfs.c
r406 r407 156 156 error_t error; 157 157 158 vfs_dmsg("\n[INFO] %s : core[%x,%d] enter / dentry_xp = %l\n",159 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , dentry_xp);158 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter / dentry = %x in cluster %x\n", 159 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, GET_PTR(dentry_xp), GET_CXY(dentry_xp) ); 160 160 161 161 // check fs type and get pointer on context … … 229 229 remote_spinlock_init( XPTR( local_cxy , &inode->main_lock ) ); 230 230 231 vfs_dmsg("\n[INFO] %s : core[%x,%d] exit / inode_xp = %l / dentry_xp = %l\n",232 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, XPTR(local_cxy,inode), dentry_xp);231 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit / inode = %x in cluster %x\n", 232 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, inode , local_cxy ); 233 233 234 234 // return extended pointer on inode … … 262 262 xptr_t child_xp ) 263 263 { 264 vfs_dmsg("\n[INFO] %s : core[%x,%d] enter for <%s> / cycle %d\n",265 264 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter for <%s> / cycle %d\n", 265 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , name , hal_time_stamp() ); 266 266 267 267 error_t error = 0; … … 292 292 } 293 293 294 vfs_dmsg("\n[INFO] %s : core[%x,%d] exit for <%s> / cycle %d\n",295 294 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit for <%s> / cycle %d\n", 295 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , name , hal_time_stamp() ); 296 296 297 297 return error; … … 413 413 414 414 // display inode header 415 printk("\n*** inode <%s> / inode_xp = %l / dentry_xp = %l ***\n",416 name , inode_xp , dentry_xp);415 printk("\n***** inode <%s> [%x in cluster %x]\n", 416 name , GET_PTR(inode_xp) , GET_CXY(inode_xp) ); 417 417 418 418 // display children from xhtab … … 435 435 kmem_req_t req; // request to kernel memory allocator 436 436 437 vfs_dmsg("\n[INFO] %s : core[%x,%d] enter for <%s> / parent inode = %x / cycle %d\n",438 437 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter for <%s> / parent inode = %x / cycle %d\n", 438 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, name, parent, hal_time_stamp() ); 439 439 440 440 // get pointer on context … … 484 484 *dentry_xp = XPTR( local_cxy , dentry ); 485 485 486 vfs_dmsg("\n[INFO] %s : core[%x,%d] exit for <%s> / dentry = %l/ cycle %d\n",487 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, name, *dentry_xp, hal_time_stamp() );486 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit for <%s> / dentry = %x in cluster %x / cycle %d\n", 487 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, name, dentry, local_cxy , hal_time_stamp() ); 488 488 489 489 return 0; … … 586 586 ////////////////////////////////////////////////////////////////////////////////////////// 587 587 588 //////////////////////////////////// 589 error_t vfs_open( xptr_t cwd_xp,590 char * path,591 uint32_t flags,592 uint32_t mode,593 xptr_t * new_file_xp,594 uint32_t * new_file_id )588 ////////////////////////////////////// 589 error_t vfs_open( process_t * process, 590 char * path, 591 uint32_t flags, 592 uint32_t mode, 593 xptr_t * new_file_xp, 594 uint32_t * new_file_id ) 595 595 { 596 596 error_t error; … … 603 603 uint32_t file_id; // created file descriptor index in reference fd_array 604 604 605 vfs_dmsg("\n[INFO] %s : core[%x,%d] enter for <%s> / cycle %d\n",606 605 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter for <%s> / cycle %d\n", 606 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path, (uint32_t)hal_time_stamp() ); 607 607 608 608 // compute lookup working mode … … 614 614 // compute attributes for the created file 615 615 file_attr = 0; 616 if( (flags & O_RDONLY ) == 0 ) file_attr |= FD_ATTR_ READ_ENABLE;617 if( (flags & O_WRONLY ) == 0 ) file_attr |= FD_ATTR_ WRITE_ENABLE;616 if( (flags & O_RDONLY ) == 0 ) file_attr |= FD_ATTR_WRITE_ENABLE; 617 if( (flags & O_WRONLY ) == 0 ) file_attr |= FD_ATTR_READ_ENABLE; 618 618 if( (flags & O_SYNC ) ) file_attr |= FD_ATTR_SYNC; 619 619 if( (flags & O_APPEND ) ) file_attr |= FD_ATTR_APPEND; … … 621 621 622 622 // get extended pointer on target inode 623 error = vfs_lookup( cwd_xp , path , lookup_mode , &inode_xp );623 error = vfs_lookup( process->vfs_cwd_xp , path , lookup_mode , &inode_xp ); 624 624 625 625 if( error ) return error; … … 629 629 inode_ptr = (vfs_inode_t *)GET_PTR( inode_xp ); 630 630 631 vfs_dmsg("\n[DBG] %s : core[%x,%d] found inode for <%s> in cluster %x / cycle %d\n", 632 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path, inode_cxy , (uint32_t)hal_time_stamp() ); 633 631 634 // create a new file descriptor in cluster containing inode 632 635 if( inode_cxy == local_cxy ) // target cluster is local … … 641 644 if( error ) return error; 642 645 643 // allocate and register a new file descriptor index in reference cluster fd_array644 error = process_fd_register( file_xp , &file_id );646 // allocate and register a new file descriptor index in reference process 647 error = process_fd_register( process , file_xp , &file_id ); 645 648 646 649 if( error ) return error; 647 650 648 vfs_dmsg("\n[INFO] %s : core[%x,%d] exit for <%s> / file_xp = %l / cycle %d\n", 649 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path, file_xp, hal_time_stamp() ); 651 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit for <%s> / file = %x in cluster %x / cycle %d\n", 652 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path, 653 GET_PTR(file_xp), GET_CXY(file_xp), hal_time_stamp() ); 650 654 651 655 // success … … 656 660 } // end vfs_open() 657 661 658 //////////////////////////////////////////// 659 error_t vfs_user_move( bool_t to_buffer, 660 xptr_t file_xp, 661 void * buffer, 662 uint32_t size ) 663 { 664 assert( ( file_xp != XPTR_NULL ) , __FUNCTION__ , "file_xp == XPTR_NULL" ); 662 ////////////////////////////////////// 663 int vfs_user_move( bool_t to_buffer, 664 xptr_t file_xp, 665 void * buffer, 666 uint32_t size ) 667 { 668 assert( ( file_xp != XPTR_NULL ) , __FUNCTION__ , 669 "file_xp == XPTR_NULL" ); 665 670 666 671 cxy_t file_cxy; // remote file descriptor cluster … … 678 683 inode_type = hal_remote_lw( XPTR( file_cxy , &file_ptr->type ) ); 679 684 680 // action depends on inode type 681 if( inode_type == INODE_TYPE_FILE ) 682 { 683 // get mapper pointer and file offset from file descriptor 684 file_offset = hal_remote_lw( XPTR( file_cxy , &file_ptr->offset ) ); 685 mapper = (mapper_t *)hal_remote_lpt( XPTR( file_cxy , &file_ptr->mapper ) ); 686 687 // move data between mapper and buffer 688 if( file_cxy == local_cxy ) 689 { 690 error = mapper_move_user( mapper, 691 to_buffer, 692 file_offset, 693 buffer, 694 size ); 695 } 696 else 697 { 698 rpc_mapper_move_buffer_client( file_cxy, 699 mapper, 700 to_buffer, 701 true, // user buffer 702 file_offset, 703 (uint64_t)(intptr_t)buffer, 704 size, 705 &error ); 706 } 707 708 if( error ) return -1; 709 else return 0; 710 } 711 else 712 { 713 printk("\n[ERROR] in %s : inode is not a file", __FUNCTION__ ); 714 return -1; 715 } 685 assert( (inode_type == INODE_TYPE_FILE) , __FUNCTION__ , 686 "inode type is not INODE_TYPE_FILE" ); 687 688 // get mapper pointer and file offset from file descriptor 689 file_offset = hal_remote_lw( XPTR( file_cxy , &file_ptr->offset ) ); 690 mapper = (mapper_t *)hal_remote_lpt( XPTR( file_cxy , &file_ptr->mapper ) ); 691 692 // move data between mapper and buffer 693 if( file_cxy == local_cxy ) 694 { 695 error = mapper_move_user( mapper, 696 to_buffer, 697 file_offset, 698 buffer, 699 size ); 700 } 701 else 702 { 703 rpc_mapper_move_buffer_client( file_cxy, 704 mapper, 705 to_buffer, 706 true, // user buffer 707 file_offset, 708 (uint64_t)(intptr_t)buffer, 709 size, 710 &error ); 711 } 712 713 if( error ) return -1; 714 else return size; 715 716 716 } // end vfs_user_move() 717 717 … … 905 905 panic("not implemented"); 906 906 return 0; 907 } // vfs_unlink()908 909 /////////////////////////////////////// 910 error_t vfs_stat( xptr_t file_xp,911 vfs_stat_t * k_stat )907 } 908 909 //////////////////////////////////////// 910 error_t vfs_stat( xptr_t file_xp, 911 struct stat * k_stat ) 912 912 { 913 913 panic("not implemented"); … … 915 915 } 916 916 917 //////////////////////////////////////////// 918 error_t vfs_readdir( xptr_t file_xp,919 vfs_dirent_t * k_dirent )917 ///////////////////////////////////////////// 918 error_t vfs_readdir( xptr_t file_xp, 919 struct dirent * k_dirent ) 920 920 { 921 921 panic("not implemented"); … … 1094 1094 1095 1095 // display inode 1096 nolock_printk("%s%s <%s> : inode = % l / mapper = %l / dentry = %l\n",1096 nolock_printk("%s%s <%s> : inode = %x / mapper = %x / cluster %x\n", 1097 1097 indent_str[indent], vfs_inode_type_str( inode_type ), name, 1098 inode_ xp , XPTR( inode_cxy , mapper_ptr ) , dentry_xp);1098 inode_ptr , mapper_ptr , inode_cxy ); 1099 1099 1100 1100 // scan directory entries … … 1171 1171 1172 1172 // get pointers on TXT0 chdev 1173 xptr_t txt0_xp = chdev_dir.txt [0];1173 xptr_t txt0_xp = chdev_dir.txt_tx[0]; 1174 1174 cxy_t txt0_cxy = GET_CXY( txt0_xp ); 1175 1175 chdev_t * txt0_ptr = GET_PTR( txt0_xp ); … … 1338 1338 process = this->process; 1339 1339 1340 vfs_dmsg("\n[INFO] %s : core[%x,%d] enter for <%s> / cycle %d\n",1341 1340 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter for <%s> / cycle %d\n", 1341 __FUNCTION__ , local_cxy , this->core->lid , pathname , hal_time_stamp() ); 1342 1342 1343 1343 // get extended pointer on first inode to search … … 1362 1362 vfs_get_name_from_path( current , name , &next , &last ); 1363 1363 1364 vfs_dmsg("\n[INFO] %s : core[%x,%d] look for <%s> / last = %d\n",1365 1364 vfs_dmsg("\n[DBG] %s : core[%x,%d] look for <%s> / last = %d\n", 1365 __FUNCTION__ , local_cxy , this->core->lid , name , last ); 1366 1366 1367 1367 // search a child dentry matching name in parent inode … … 1380 1380 if (found == false ) // child node not found in inode tree 1381 1381 { 1382 vfs_dmsg("\n[INFO] %s : core[%x,%d] miss <%s> => load it\n", 1383 __FUNCTION__ , local_cxy , this->core->lid , name ); 1382 1383 vfs_dmsg("\n[DBG] %s : core[%x,%d] miss <%s> => load it\n", 1384 __FUNCTION__ , local_cxy , this->core->lid , name ); 1384 1385 1385 1386 // release lock on parent inode … … 1405 1406 if( error ) 1406 1407 { 1407 printk("\n[ERROR] in %s : no memory for inode %s in path %s\n",1408 printk("\n[ERROR] in %s : no memory for inode <%s> in path <%s>\n", 1408 1409 __FUNCTION__ , name , pathname ); 1409 1410 return ENOMEM; … … 1428 1429 if ( error ) 1429 1430 { 1430 printk("\n[ERROR] in %s : core[%x,%d] / <%s> no t found in parent\n",1431 __FUNCTION__ , local_cxy , this->core->lid , name );1431 printk("\n[ERROR] in %s : core[%x,%d] / <%s> node not found in <%s>\n", 1432 __FUNCTION__ , local_cxy , this->core->lid , name , pathname ); 1432 1433 return ENOENT; 1433 1434 } … … 1464 1465 vfs_inode_lock( parent_xp ); 1465 1466 1466 vfs_dmsg("\n[INFO] %s : core[%x,%d] created node <%s>\n", 1467 __FUNCTION__ , local_cxy , this->core->lid , name ); 1467 vfs_dmsg("\n[DBG] %s : core[%x,%d] created node <%s>\n", 1468 __FUNCTION__ , local_cxy , this->core->lid , name ); 1469 1468 1470 } 1469 1471 1470 vfs_dmsg("\n[INFO] %s : core[%x,%d] found <%s> / parent = %l / child = %l\n",1471 __FUNCTION__ , local_cxy , this->core->lid , name , parent_xp , child_xp);1472 vfs_dmsg("\n[DBG] %s : core[%x,%d] found <%s> / inode = %x in cluster %x\n", 1473 __FUNCTION__ , local_cxy , this->core->lid , name , GET_PTR(child_xp) , GET_CXY(child_xp) ); 1472 1474 1473 1475 // TODO check access rights here [AG] … … 1494 1496 vfs_inode_unlock( parent_xp ); 1495 1497 1496 vfs_dmsg("\n[INFO] %s : exit <%s> found / inode = %l\n",1497 __FUNCTION__ , pathname , child_xp);1498 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit for <%s> / inode = %x in cluster %x\n", 1499 __FUNCTION__,local_cxy,this->core->lid,pathname,GET_PTR(child_xp),GET_CXY(child_xp) ); 1498 1500 1499 1501 // return searched pointer … … 1593 1595 parent_ptr = (vfs_inode_t *)GET_PTR( parent_xp ); 1594 1596 1595 vfs_dmsg("\n[INFO] %s : enter for <%s> / core[%x,%d] / child_cxy = %x / parent_xp = %l\n",1596 __FUNCTION__ , name , local_cxy , CURRENT_THREAD->core->lid , child_cxy , parent_xp);1597 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter for <%s> / child_cxy = %x / parent_cxy = %x\n", 1598 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , name , child_cxy , parent_cxy ); 1597 1599 1598 1600 // 1. create dentry … … 1604 1606 &dentry_xp ); 1605 1607 1606 vfs_dmsg("\n[INFO] %s : dentry <%s> created in local cluster %x\n", 1607 __FUNCTION__ , name , local_cxy ); 1608 vfs_dmsg("\n[DBG] %s : dentry <%s> created in local cluster %x\n", 1609 __FUNCTION__ , name , local_cxy ); 1610 1608 1611 } 1609 1612 else // parent cluster is remote … … 1616 1619 &error ); 1617 1620 1618 vfs_dmsg("\n[INFO] %s : dentry <%s> created in remote cluster %x\n", 1619 __FUNCTION__ , name , parent_cxy ); 1621 vfs_dmsg("\n[DBG] %s : dentry <%s> created in remote cluster %x\n", 1622 __FUNCTION__ , name , parent_cxy ); 1623 1620 1624 } 1621 1625 … … 1623 1627 { 1624 1628 printk("\n[ERROR] in %s : cannot create dentry in cluster %x\n", 1625 1629 __FUNCTION__ , parent_cxy ); 1626 1630 return ENOMEM; 1627 1631 } … … 1645 1649 &inode_xp ); 1646 1650 1647 vfs_dmsg("\n[INFO] %s : inode %l created in local cluster %x\n", 1648 __FUNCTION__ , inode_xp , local_cxy ); 1651 vfs_dmsg("\n[DBG] %s : inode %x created in local cluster %x\n", 1652 __FUNCTION__ , GET_PTR(inode_xp) , local_cxy ); 1653 1649 1654 } 1650 1655 else // child cluster is remote … … 1662 1667 &error ); 1663 1668 1664 vfs_dmsg("\n[INFO] %s : inode %l created in remote cluster %x\n", 1665 __FUNCTION__ , inode_xp , child_cxy ); 1669 vfs_dmsg("\n[DBG] %s : inode %x created in remote cluster %x\n", 1670 __FUNCTION__ , GET_PTR(inode_xp) , child_cxy ); 1671 1666 1672 } 1667 1673 … … 1682 1688 hal_remote_swd( XPTR( dentry_cxy , &dentry_ptr->child_xp ) , inode_xp ); 1683 1689 1684 vfs_dmsg("\n[INFO] %s : exit in cluster %x for <%s>\n",1685 1690 vfs_dmsg("\n[DBG] %s : exit in cluster %x for <%s>\n", 1691 __FUNCTION__ , local_cxy , name ); 1686 1692 1687 1693 // success : return extended pointer on child inode … … 1707 1713 assert( (mapper != NULL) , __FUNCTION__ , "no mapper for page\n" ); 1708 1714 1709 vfs_dmsg("\n[DMSG] %s : enters for page %d / inode_cxy = %x / inode_ptr= %x\n",1710 __FUNCTION__ , page->index , local_cxy, mapper->inode );1715 vfs_dmsg("\n[DBG] %s : core[%x,%d] enters for page %d / mapper = %x / inode = %x\n", 1716 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid , page->index , mapper, mapper->inode ); 1711 1717 1712 1718 // get FS type … … 1733 1739 } 1734 1740 1735 vfs_dmsg("\n[DMSG] %s : exit for page %d / inode_cxy = %x / inode_ptr= %x\n",1736 __FUNCTION__ , page->index , local_cxy, mapper->inode );1741 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit for page %d / mapper = %x / inode = %x\n", 1742 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, page->index, mapper, mapper->inode ); 1737 1743 1738 1744 return error; … … 1753 1759 assert( (mapper != NULL) , __FUNCTION__ , "mapper pointer is NULL\n" ); 1754 1760 1755 vfs_dmsg("\n[INFO] %s : core[%x,%d] enter for inode %l/ cycle %d\n",1756 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, XPTR(local_cxy , inode) );1761 vfs_dmsg("\n[DBG] %s : core[%x,%d] enter for inode %x in cluster %x/ cycle %d\n", 1762 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, inode , local_cxy , hal_time_stamp() ); 1757 1763 1758 1764 // compute number of pages … … 1770 1776 } 1771 1777 1772 vfs_dmsg("\n[INFO] %s : core[%x,%d] exit for inode %l/ cycle %d\n",1773 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, XPTR(local_cxy , inode) );1778 vfs_dmsg("\n[DBG] %s : core[%x,%d] exit for inode %x in cluster %x / cycle %d\n", 1779 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, inode , local_cxy , hal_time_stamp() ); 1774 1780 1775 1781 return 0; -
trunk/kernel/fs/vfs.h
r317 r407 38 38 #include <xhtab.h> 39 39 #include <errno.h> 40 #include <metafs.h> 41 40 #include <shared_syscalls.h> 42 41 #include <fatfs.h> 43 42 #include <ramfs.h> … … 235 234 typedef enum 236 235 { 237 VFS_SEEK_SET,238 VFS_SEEK_CUR,239 VFS_SEEK_END,240 }241 vfs_lseek_cmd_t;242 243 typedef enum244 {245 236 FD_ATTR_READ_ENABLE = 0x01, /*! read access possible */ 246 237 FD_ATTR_WRITE_ENABLE = 0x02, /*! write access possible */ … … 267 258 vfs_file_t; 268 259 269 /******************************************************************************************270 * This structure define the informations associated to a file descriptor,271 * returned to user space by the stat() system call.272 *****************************************************************************************/273 274 typedef struct vfs_stat_s275 {276 uint32_t dev; /*! ID of device containing file */277 uint32_t ino; /*! inode number */278 uint32_t mode; /*! protection */279 uint32_t nlink; /*! number of hard links */280 uint32_t uid; /*! user ID of owner */281 uint32_t gid; /*! group ID of owner */282 uint32_t rdev; /*! device ID (if special file) */283 uint64_t size; /*! total size, in bytes */284 uint32_t blksize; /*! blocksize for file system I/O */285 uint32_t blocks; /*! number of 512B blocks allocated */286 uint64_t atime; /*! time of last access */287 uint64_t mtime; /*! time of last modification */288 uint64_t ctime; /*! time of last status change */289 }290 vfs_stat_t;291 292 /*********************************************************************************************293 * This structure defines the information associated to a directory entry,294 * returned to user space by the readdir() system call.295 ********************************************************************************************/296 297 typedef struct vfs_dirent_s298 {299 uint32_t inum; /*! inode identifier */300 uint32_t type; /*! inode type */301 char name[CONFIG_VFS_MAX_NAME_LENGTH]; /*! dentry name */302 }303 vfs_dirent_t;304 305 306 260 307 261 /*****************************************************************************************/ … … 503 457 error_t vfs_inode_unlink( vfs_inode_t * inode ); 504 458 505 /******************************************************************************************506 * This function TODO507 *****************************************************************************************/508 error_t vfs_inode_stat( vfs_inode_t * inode,509 uint32_t inum );510 511 /******************************************************************************************512 * This function TODO513 *****************************************************************************************/514 error_t vfs_icache_del( vfs_inode_t * inode );515 516 517 /******************************************************************************************518 * This function TODO Pourquoi 2 arguments ?519 *****************************************************************************************/520 error_t vfs_stat_inode( vfs_inode_t * inode,521 uint32_t inum );522 523 459 524 460 /*****************************************************************************************/ … … 643 579 * @ lookup_mode : flags defining the working mode (defined above in this file). 644 580 * @ inode_xp : [out] buffer for extended pointer on searched inode. 645 * @ return 0 if success / ENOENT if inode not found , EACCES if permisso pn denied,646 * EAGAIN if a new complete lookup must be made581 * @ return 0 if success / ENOENT if inode not found , EACCES if permisson denied, 582 * EAGAIN if a new complete lookup must be made 647 583 *****************************************************************************************/ 648 584 error_t vfs_lookup( xptr_t cwd_xp, … … 653 589 /****************************************************************************************** 654 590 * This function creates a new couple dentry/inode, and insert it in the Inode-Tree. 655 * It can be executed by any thread running in any cluster ( can be differentefrom both591 * It can be executed by any thread running in any cluster (can be different from both 656 592 * the child cluster and the parent cluster), as it uses the rpc_dentry_create_client() 657 593 * and rpc_inode_create client() if required. This is done in three steps: … … 707 643 /****************************************************************************************** 708 644 * This function allocates a vfs_file_t structure in the cluster containing the inode 709 * associated to the file identified by <cwd_xp> & <path>. 710 * It initializes it, register it in the reference process fd_array, and returns both 711 * the extended pointer on the remote file descriptor, and the index in the fd_array. 645 * associated to the file identified by the <cwd_xp> & <path> arguments. 646 * It initializes it, register it in the reference process fd_array identified by the 647 * <process> argument, and returns both the extended pointer on the file descriptor, 648 * and the allocated index in the fd_array. 712 649 * The pathname can be relative to current directory or absolute. 713 650 * If the inode does not exist in the inode cache, it try to find the file on the mounted 714 651 * device, and creates an inode on a pseudo randomly selected cluster if found. 715 652 * It the requested file does not exist on device, it creates a new inode if the 716 * O_CREAT flag is set and return an error otherwise.717 ****************************************************************************************** 718 * @ cwd_xp : extended pointer on current working directory file descriptor.653 * O_CREAT flag is set, and return an error otherwise. 654 ****************************************************************************************** 655 * @ process : local pointer on local process descriptor copy. 719 656 * @ path : file pathname (absolute or relative to current directory). 720 * @ flags : defined above 657 * @ flags : defined above. 721 658 * @ mode : access rights (as defined by chmod) 722 659 * @ file_xp : [out] buffer for extended pointer on created remote file descriptor. … … 724 661 * @ return 0 if success / return non-zero if error. 725 662 *****************************************************************************************/ 726 error_t vfs_open( xptr_t cwd_xp,727 char * path,728 uint32_t flags,729 uint32_t mode,730 xptr_t * file_xp,731 uint32_t * file_id );663 error_t vfs_open( struct process_s * process, 664 char * path, 665 uint32_t flags, 666 uint32_t mode, 667 xptr_t * file_xp, 668 uint32_t * file_id ); 732 669 733 670 /****************************************************************************************** … … 735 672 * <file_xp> argument, and a - possibly distributed - user space <buffer>, taken into 736 673 * account the offset in <file_xp>. The transfer direction is defined by <to_buffer>. 737 * This function is called by the elf_load_process() function.674 * It is called by the sys_read() and sys_write() functions. 738 675 ****************************************************************************************** 739 676 * @ to_buffer : mapper -> buffer if true / buffer -> mapper if false. … … 741 678 * @ buffer : user space pointer on buffer (can be physically distributed). 742 679 * @ size : requested number of bytes from offset. 743 * @ returns 0f success / -1 if error.744 *****************************************************************************************/ 745 error_t vfs_user_move( bool_t to_buffer,746 747 748 680 * @ returns number of bytes actually moved if success / -1 if error. 681 *****************************************************************************************/ 682 int vfs_user_move( bool_t to_buffer, 683 xptr_t file_xp, 684 void * buffer, 685 uint32_t size ); 749 686 750 687 /****************************************************************************************** … … 752 689 * <file_xp> argument, and a - possibly remote - kernel <buffer_xp>, taken into 753 690 * account the offset in <file_xp>. The transfer direction is defined by <to_buffer>. 754 * This function is called by the system calls.691 * It is called by the elf_load_process() function. 755 692 ****************************************************************************************** 756 693 * @ to_buffer : mapper -> buffer if true / buffer -> mapper if false. … … 758 695 * @ buffer_xp : user space pointer on buffer (can be physically distributed). 759 696 * @ size : requested number of bytes from offset. 760 * @ returns number of bytes actually transfered/ -1 if error.697 * @ returns 0 if success / -1 if error. 761 698 *****************************************************************************************/ 762 699 error_t vfs_kernel_move( bool_t to_buffer, … … 814 751 ****************************************************************************************** 815 752 * @ file_xp : extended pointer on the file descriptor of the searched directory . 816 * @ k_ dirent : local pointer on the dirent_t structure in kernel space.753 * @ k_stat : local pointer on the stat structure in kernel space. 817 754 * @ returns 0 if success / -1 if error. 818 755 *****************************************************************************************/ 819 error_t vfs_stat( xptr_t file_xp,820 vfs_stat_t * k_stat );756 error_t vfs_stat( xptr_t file_xp, 757 struct stat * k_stat ); 821 758 822 759 /****************************************************************************************** … … 826 763 ****************************************************************************************** 827 764 * @ file_xp : extended pointer on the file descriptor of the searched directory . 828 * @ k_dirent : local pointer on the dirent _tstructure in kernel space.765 * @ k_dirent : local pointer on the dirent structure in kernel space. 829 766 * @ returns 0 if success / -1 if error. 830 767 *****************************************************************************************/ 831 error_t vfs_readdir( xptr_t file_xp,832 vfs_dirent_t * k_dirent );768 error_t vfs_readdir( xptr_t file_xp, 769 struct dirent * k_dirent ); 833 770 834 771 /****************************************************************************************** -
trunk/kernel/kern/chdev.c
r317 r407 25 25 #include <hal_types.h> 26 26 #include <hal_special.h> 27 #include <hal_irqmask.h> 27 28 #include <printk.h> 28 29 #include <boot_info.h> 29 30 #include <xlist.h> 30 31 #include <kmem.h> 32 #include <scheduler.h> 31 33 #include <thread.h> 32 34 #include <rpc.h> … … 37 39 extern chdev_directory_t chdev_dir; // allocated in kernel_init.c 38 40 41 #if CONFIG_READ_DEBUG 42 extern uint32_t enter_chdev_cmd; 43 extern uint32_t exit_chdev_cmd; 44 extern uint32_t enter_chdev_server; 45 extern uint32_t exit_chdev_server; 46 #endif 39 47 40 48 //////////////////////////////////////////// … … 105 113 } 106 114 107 //////////////////////////////////////////////// 108 void chdev_register_command( xptr_t chdev_xp, 109 thread_t * thread ) 110 { 111 thread_t * thread_ptr = CURRENT_THREAD; 115 ////////////////////////////////////////////////// 116 void chdev_register_command( xptr_t chdev_xp ) 117 { 118 thread_t * server_ptr; // local pointer on server thread associated to chdev 119 core_t * core_ptr; // local pointer on core running the server thread 120 uint32_t lid; // core running the server thread local index 121 xptr_t lock_xp; // extended pointer on lock protecting the chdev queue 122 uint32_t modified; // non zero if the server thread state was modified 123 uint32_t save_sr; // for critical section 124 125 thread_t * this = CURRENT_THREAD; 126 127 chdev_dmsg("\n[DBG] %s : core[%x,%d] (thread %s) enter / cycle %d\n", 128 __FUNCTION__, local_cxy, this->core->lid, thread_type_str(this->type) , hal_time_stamp() ); 112 129 113 130 // get device descriptor cluster and local pointer … … 116 133 117 134 // build extended pointers on client thread xlist and device root 118 xptr_t xp_list = XPTR( local_cxy , &thread_ptr->wait_list ); 119 xptr_t xp_root = XPTR( chdev_cxy , &chdev_ptr->wait_root ); 120 121 // get lock protecting queue 122 remote_spinlock_lock( XPTR( chdev_cxy , &chdev_ptr->wait_lock ) ); 135 xptr_t list_xp = XPTR( local_cxy , &this->wait_list ); 136 xptr_t root_xp = XPTR( chdev_cxy , &chdev_ptr->wait_root ); 137 138 // get local pointer on server thread 139 server_ptr = (thread_t *)hal_remote_lpt( XPTR( chdev_cxy , &chdev_ptr->server) ); 140 141 chdev_dmsg("\n[DBG] %s : core[%x,%d] (thread %s) / server_cxy %x / server_ptr %x / server_type %\n", 142 __FUNCTION__, local_cxy, this->core->lid, server_cxy, server_ptr, 143 thread_type_str( hal_remote_lw( XPTR( server_cxy , &server_ptr->type) ) ) ); 144 145 // build extended pointer on chdev lock protecting queue 146 lock_xp = XPTR( chdev_cxy , &chdev_ptr->wait_lock ); 147 148 // get local pointer on core running the server thread 149 core_ptr = (core_t *)hal_remote_lpt( XPTR( chdev_cxy , &server_ptr->core ) ); 150 151 // get core local index 152 lid = hal_remote_lw( XPTR( chdev_cxy , &core_ptr->lid ) ); 153 154 // enter critical section 155 hal_disable_irq( &save_sr ); 123 156 124 157 // register client thread in waiting queue 125 xlist_add_last( xp_root , xp_list ); 158 remote_spinlock_lock( lock_xp ); 159 xlist_add_last( root_xp , list_xp ); 160 remote_spinlock_unlock( lock_xp ); 126 161 127 162 // unblock server thread 128 thread_unblock( XPTR( chdev_cxy , &chdev_ptr->server ) , THREAD_BLOCKED_DEV_QUEUE ); 129 130 // release lock 131 remote_spinlock_unlock( XPTR( chdev_cxy , &chdev_ptr->wait_lock ) ); 132 133 // client thread goes to blocked state and deschedule 134 thread_block( thread_ptr , THREAD_BLOCKED_IO ); 135 sched_yield( NULL ); 163 modified = thread_unblock( XPTR( chdev_cxy , server_ptr ), THREAD_BLOCKED_DEV_QUEUE ); 164 165 // send IPI to core running the server thread 166 if( modified ) dev_pic_send_ipi( chdev_cxy , lid ); 167 168 // block client thread 169 assert( thread_can_yield( this ) , __FUNCTION__ , "illegal sched_yield\n" ); 170 171 chdev_dmsg("\n[DBG] %s : core[%x,%d] (thread %s) deschedules / cycle %d\n", 172 __FUNCTION__, local_cxy, this->core->lid, thread_type_str(this->type) , hal_time_stamp() ); 173 174 thread_block( CURRENT_THREAD , THREAD_BLOCKED_IO ); 175 sched_yield(); 176 177 chdev_dmsg("\n[DBG] %s : core[%x,%d] (thread %s) resumes / cycle %d\n", 178 __FUNCTION__, local_cxy, this->core->lid, thread_type_str(this->type) , hal_time_stamp() ); 179 180 // exit critical section 181 hal_restore_irq( save_sr ); 136 182 137 183 } // end chdev_register_command() … … 143 189 cxy_t client_cxy; // cluster of client thread 144 190 thread_t * client_ptr; // local pointer on client thread 145 thread_t * server; // local pointer on thisthread191 thread_t * server; // local pointer on server thread 146 192 xptr_t root_xp; // extended pointer on device waiting queue root 193 xptr_t lock_xp; // extended pointer on lock ptotecting chdev queue 147 194 148 195 server = CURRENT_THREAD; 149 196 197 chdev_dmsg("\n[DBG] %s : enter / server = %x / chdev = %x / cycle %d\n", 198 __FUNCTION__ , server , chdev , hal_time_stamp() ); 199 150 200 root_xp = XPTR( local_cxy , &chdev->wait_root ); 151 152 // take the lock protecting the chdev waiting queue, before entering the 153 // infinite loop handling commands registered in this queue. 154 // In the loop, the lock is released during the handling of one command. 155 156 remote_spinlock_lock( XPTR( local_cxy , &chdev->wait_lock ) ); 157 201 lock_xp = XPTR( local_cxy , &chdev->wait_lock ); 202 203 // This infinite loop is executed by the DEV thread 204 // to handle commands registered in the chdev queue. 158 205 while( 1 ) 159 206 { 207 // get the lock protecting the waiting queue 208 remote_spinlock_lock( lock_xp ); 209 160 210 // check waiting queue state 161 if( xlist_is_empty( root_xp ) ) // block and deschedule ifwaiting queue empty211 if( xlist_is_empty( root_xp ) ) // waiting queue empty 162 212 { 163 213 // release lock 164 remote_spinlock_unlock( XPTR( local_cxy , &chdev->wait_lock ) ); 214 remote_spinlock_unlock( lock_xp ); 215 216 chdev_dmsg("\n[DBG] %s : thread %x deschedule /cycle %d\n", 217 __FUNCTION__ , server , hal_time_stamp() ); 165 218 166 219 // block and deschedule 167 220 thread_block( server , THREAD_BLOCKED_DEV_QUEUE ); 168 sched_yield( NULL ); 221 sched_yield(); 222 223 chdev_dmsg("\n[DBG] %s : thread %x resume /cycle %d\n", 224 __FUNCTION__ , server , hal_time_stamp() ); 225 169 226 } 170 else 227 else // waiting queue not empty 171 228 { 229 230 #if CONFIG_READ_DEBUG 231 enter_chdev_server = hal_time_stamp(); 232 #endif 172 233 // release lock 173 remote_spinlock_unlock( XPTR( local_cxy , &chdev->wait_lock ) ); 234 remote_spinlock_unlock( lock_xp ); 235 236 // get extended pointer on first client thread 237 client_xp = XLIST_FIRST_ELEMENT( root_xp , thread_t , wait_list ); 238 239 // get client thread cluster, local pointer, and identifier 240 client_cxy = GET_CXY( client_xp ); 241 client_ptr = (thread_t *)GET_PTR( client_xp ); 242 243 // call driver command function to execute I/O operation 244 chdev->cmd( client_xp ); 245 246 // remove the client thread from waiting queue 247 remote_spinlock_lock( lock_xp ); 248 xlist_unlink( XPTR( client_cxy , &client_ptr->wait_list ) ); 249 remote_spinlock_unlock( lock_xp ); 250 251 chdev_dmsg("\n[DBG] %s : thread %x complete operation for client %x / cycle %d\n", 252 __FUNCTION__ , server , client_ptr , hal_time_stamp() ); 253 254 #if CONFIG_READ_DEBUG 255 exit_chdev_server = hal_time_stamp(); 256 #endif 257 174 258 } 175 176 // get extended pointer on first client thread177 client_xp = XLIST_FIRST_ELEMENT( root_xp , thread_t , wait_list );178 179 // call driver command function to execute I/O operation180 chdev->cmd( client_xp );181 182 // get client thread cluster and local pointer183 client_cxy = GET_CXY( client_xp );184 client_ptr = (thread_t *)GET_PTR( client_xp );185 186 // take the lock, and remove the client thread from waiting queue187 remote_spinlock_lock( XPTR( local_cxy , &chdev->wait_lock ) );188 xlist_unlink( XPTR( client_cxy , &client_ptr->wait_list ) );189 190 259 } // end while 191 192 260 } // end chdev_sequencial_server() 193 261 … … 197 265 cxy_t iob_cxy = GET_CXY( chdev_dir.iob ); 198 266 chdev_t * iob_ptr = (chdev_t *)GET_PTR( chdev_dir.iob ); 199 xptr_t iob_base =hal_remote_lwd( XPTR( iob_cxy , &iob_ptr->base ) );267 uint32_t iob_base = (uint32_t)hal_remote_lwd( XPTR( iob_cxy , &iob_ptr->base ) ); 200 268 201 269 cxy_t pic_cxy = GET_CXY( chdev_dir.pic ); 202 270 chdev_t * pic_ptr = (chdev_t *)GET_PTR( chdev_dir.pic ); 203 xptr_t pic_base = hal_remote_lwd( XPTR( pic_cxy , &pic_ptr->base ) ); 204 205 cxy_t txt0_cxy = GET_CXY( chdev_dir.txt[0] ); 206 chdev_t * txt0_ptr = (chdev_t *)GET_PTR( chdev_dir.txt[0] ); 207 xptr_t txt0_base = hal_remote_lwd( XPTR( txt0_cxy , &txt0_ptr->base ) ); 208 209 cxy_t txt1_cxy = GET_CXY( chdev_dir.txt[1] ); 210 chdev_t * txt1_ptr = (chdev_t *)GET_PTR( chdev_dir.txt[1] ); 211 xptr_t txt1_base = hal_remote_lwd( XPTR( txt1_cxy , &txt1_ptr->base ) ); 212 213 cxy_t txt2_cxy = GET_CXY( chdev_dir.txt[2] ); 214 chdev_t * txt2_ptr = (chdev_t *)GET_PTR( chdev_dir.txt[2] ); 215 xptr_t txt2_base = hal_remote_lwd( XPTR( txt2_cxy , &txt2_ptr->base ) ); 271 uint32_t pic_base = (uint32_t)hal_remote_lwd( XPTR( pic_cxy , &pic_ptr->base ) ); 272 273 cxy_t txt0_tx_cxy = GET_CXY( chdev_dir.txt_tx[0] ); 274 chdev_t * txt0_tx_ptr = (chdev_t *)GET_PTR( chdev_dir.txt_tx[0] ); 275 uint32_t txt0_tx_base = (uint32_t)hal_remote_lwd( XPTR( txt0_tx_cxy , &txt0_tx_ptr->base ) ); 276 277 cxy_t txt0_rx_cxy = GET_CXY( chdev_dir.txt_rx[0] ); 278 chdev_t * txt0_rx_ptr = (chdev_t *)GET_PTR( chdev_dir.txt_rx[0] ); 279 uint32_t txt0_rx_base = (uint32_t)hal_remote_lwd( XPTR( txt0_rx_cxy , &txt0_rx_ptr->base ) ); 280 281 cxy_t txt1_tx_cxy = GET_CXY( chdev_dir.txt_tx[1] ); 282 chdev_t * txt1_tx_ptr = (chdev_t *)GET_PTR( chdev_dir.txt_tx[1] ); 283 uint32_t txt1_tx_base = (uint32_t)hal_remote_lwd( XPTR( txt1_tx_cxy , &txt1_tx_ptr->base ) ); 284 285 cxy_t txt1_rx_cxy = GET_CXY( chdev_dir.txt_rx[1] ); 286 chdev_t * txt1_rx_ptr = (chdev_t *)GET_PTR( chdev_dir.txt_rx[1] ); 287 uint32_t txt1_rx_base = (uint32_t)hal_remote_lwd( XPTR( txt1_rx_cxy , &txt1_rx_ptr->base ) ); 288 289 cxy_t txt2_tx_cxy = GET_CXY( chdev_dir.txt_tx[2] ); 290 chdev_t * txt2_tx_ptr = (chdev_t *)GET_PTR( chdev_dir.txt_tx[2] ); 291 uint32_t txt2_tx_base = (uint32_t)hal_remote_lwd( XPTR( txt2_tx_cxy , &txt2_tx_ptr->base ) ); 292 293 cxy_t txt2_rx_cxy = GET_CXY( chdev_dir.txt_rx[2] ); 294 chdev_t * txt2_rx_ptr = (chdev_t *)GET_PTR( chdev_dir.txt_rx[2] ); 295 uint32_t txt2_rx_base = (uint32_t)hal_remote_lwd( XPTR( txt2_rx_cxy , &txt2_rx_ptr->base ) ); 216 296 217 297 cxy_t ioc_cxy = GET_CXY( chdev_dir.ioc[0] ); 218 298 chdev_t * ioc_ptr = (chdev_t *)GET_PTR( chdev_dir.ioc[0] ); 219 xptr_t ioc_base =hal_remote_lwd( XPTR( ioc_cxy , &ioc_ptr->base ) );299 uint32_t ioc_base = (uint32_t)hal_remote_lwd( XPTR( ioc_cxy , &ioc_ptr->base ) ); 220 300 221 301 cxy_t fbf_cxy = GET_CXY( chdev_dir.fbf[0] ); 222 302 chdev_t * fbf_ptr = (chdev_t *)GET_PTR( chdev_dir.fbf[0] ); 223 xptr_t fbf_base =hal_remote_lwd( XPTR( fbf_cxy , &fbf_ptr->base ) );224 225 cxy_t nic _rx_cxy = GET_CXY( chdev_dir.nic_rx[0] );226 chdev_t * nic _rx_ptr = (chdev_t *)GET_PTR( chdev_dir.nic_rx[0] );227 xptr_t nic_rx_base = hal_remote_lwd( XPTR( nic_rx_cxy , &nic_rx_ptr->base ) );228 229 cxy_t nic _tx_cxy = GET_CXY( chdev_dir.nic_tx[0] );230 chdev_t * nic _tx_ptr = (chdev_t *)GET_PTR( chdev_dir.nic_tx[0] );231 xptr_t nic_tx_base = hal_remote_lwd( XPTR( nic_tx_cxy , &nic_tx_ptr->base ) );303 uint32_t fbf_base = (uint32_t)hal_remote_lwd( XPTR( fbf_cxy , &fbf_ptr->base ) ); 304 305 cxy_t nic0_rx_cxy = GET_CXY( chdev_dir.nic_rx[0] ); 306 chdev_t * nic0_rx_ptr = (chdev_t *)GET_PTR( chdev_dir.nic_rx[0] ); 307 uint32_t nic0_rx_base = (uint32_t)hal_remote_lwd( XPTR( nic0_rx_cxy , &nic0_rx_ptr->base ) ); 308 309 cxy_t nic0_tx_cxy = GET_CXY( chdev_dir.nic_tx[0] ); 310 chdev_t * nic0_tx_ptr = (chdev_t *)GET_PTR( chdev_dir.nic_tx[0] ); 311 uint32_t nic0_tx_base = (uint32_t)hal_remote_lwd( XPTR( nic0_tx_cxy , &nic0_tx_ptr->base ) ); 232 312 233 313 printk("\n***** external chdev directory in cluster %x\n" 234 " - iob = %l / base = %l\n" 235 " - pic = %l / base = %l\n" 236 " - txt[0] = %l / base = %l\n" 237 " - txt[1] = %l / base = %l\n" 238 " - txt[2] = %l / base = %l\n" 239 " - ioc[0] = %l / base = %l\n" 240 " - fbf[0] = %l / base = %l\n" 241 " - nic_rx[0] = %l / base = %l\n" 242 " - nic_tx[0] = %l / base = %l\n", 314 " - iob : cxy = %X / ptr = %X / base = %X\n" 315 " - pic : cxy = %X / ptr = %X / base = %X\n" 316 " - ioc : cxy = %X / ptr = %X / base = %X\n" 317 " - fbf : cxy = %X / ptr = %X / base = %X\n" 318 " - txt_rx[0] : cxy = %X / ptr = %X / base = %X\n" 319 " - txt_tx[0] : cxy = %X / ptr = %X / base = %X\n" 320 " - txt_rx[1] : cxy = %X / ptr = %X / base = %X\n" 321 " - txt_tx[1] : cxy = %X / ptr = %X / base = %X\n" 322 " - txt_rx[2] : cxy = %X / ptr = %X / base = %X\n" 323 " - txt_tx[2] : cxy = %X / ptr = %X / base = %X\n" 324 " - nic_rx[0] : cxy = %X / ptr = %X / base = %X\n" 325 " - nic_tx[0] : cxy = %X / ptr = %X / base = %X\n", 243 326 local_cxy, 244 chdev_dir.iob, iob_base, 245 chdev_dir.pic, pic_base, 246 chdev_dir.txt[0], txt0_base, 247 chdev_dir.txt[1], txt1_base, 248 chdev_dir.txt[2], txt2_base, 249 chdev_dir.ioc[0], ioc_base, 250 chdev_dir.fbf[0], fbf_base, 251 chdev_dir.nic_rx[0], nic_rx_base, 252 chdev_dir.nic_tx[0], nic_tx_base ); 327 iob_cxy , iob_ptr , iob_base , 328 pic_cxy , pic_ptr , pic_base , 329 ioc_cxy , ioc_ptr , ioc_base , 330 fbf_cxy , fbf_ptr , fbf_base , 331 txt0_rx_cxy , txt0_rx_ptr , txt0_rx_base , 332 txt0_tx_cxy , txt0_tx_ptr , txt0_tx_base , 333 txt1_rx_cxy , txt1_rx_ptr , txt1_rx_base , 334 txt1_tx_cxy , txt1_tx_ptr , txt1_tx_base , 335 txt2_rx_cxy , txt2_rx_ptr , txt2_rx_base , 336 txt2_tx_cxy , txt2_tx_ptr , txt2_tx_base , 337 nic0_rx_cxy , nic0_rx_ptr , nic0_rx_base , 338 nic0_tx_cxy , nic0_tx_ptr , nic0_tx_base ); 253 339 254 340 } // end chdev_dir_display() -
trunk/kernel/kern/chdev.h
r346 r407 66 66 67 67 /****************************************************************************************** 68 * This define the generic prototypes for the t wofunctions that must be defined69 * by alldrivers implementing a generic device:70 * - "cmd" : start a nI/O operation.68 * This define the generic prototypes for the three functions that must be defined 69 * by the drivers implementing a generic device: 70 * - "cmd" : start a blocking I/O operation. 71 71 * - "isr" : complete an I/O operation. 72 * The "cmd" and "isr" are registered in the generic chdev descriptor at kernel init, 73 * and are called to start and complete an I/O operation. 72 * - "aux" : not for all drivers (implement special functions) 73 * The "cmd", "isr", and "aux" driver functions are registered in the generic chdev 74 * descriptor at kernel init, and are called to start and complete an I/O operation. 74 75 *****************************************************************************************/ 75 76 … … 77 78 typedef void (dev_cmd_t) ( xptr_t thread ); 78 79 typedef void (dev_isr_t) ( struct chdev_s * dev ); 80 typedef void (dev_aux_t) ( void * args ); 79 81 80 82 /****************************************************************************************** … … 121 123 uint32_t impl; /*! peripheral inplementation subtype */ 122 124 uint32_t channel; /*! channel index */ 123 bool_t is_rx; /*! relevant for NIC peripheral channels only*/125 bool_t is_rx; /*! relevant for NIC and TXT peripherals */ 124 126 xptr_t base; /*! extended pointer on channel device segment */ 125 127 char name[16]; /*! name (required by DEVFS) */ 126 128 127 dev_cmd_t * cmd; /*! local pointer on driver command function */ 128 dev_isr_t * isr; /*! local pointer on driver ISR function */ 129 dev_cmd_t * cmd; /*! local pointer on driver CMD function */ 130 dev_isr_t * isr; /*! local pointer on driver ISR function */ 131 dev_aux_t * aux; /*! local pointer on driver AUX function */ 132 129 133 struct thread_s * server; /*! local pointer on associated server thread */ 130 134 … … 165 169 xptr_t pic; // external / single channel / shared 166 170 167 xptr_t txt[CONFIG_MAX_TXT_CHANNELS]; // external / multi-channels / shared168 171 xptr_t ioc[CONFIG_MAX_IOC_CHANNELS]; // external / multi-channels / shared 169 172 xptr_t fbf[CONFIG_MAX_FBF_CHANNELS]; // external / multi-channels / shared 173 xptr_t txt_rx[CONFIG_MAX_TXT_CHANNELS]; // external / multi-channels / shared 174 xptr_t txt_tx[CONFIG_MAX_TXT_CHANNELS]; // external / multi-channels / shared 170 175 xptr_t nic_rx[CONFIG_MAX_NIC_CHANNELS]; // external / multi-channels / shared 171 176 xptr_t nic_tx[CONFIG_MAX_NIC_CHANNELS]; // external / multi-channels / shared … … 211 216 212 217 /****************************************************************************************** 213 * This function registers a local clientthread in the waiting queue of a remote218 * This function registers the calling thread in the waiting queue of a remote 214 219 * chdev descriptor, activates (i.e. unblock) the server thread associated to chdev, 215 220 * and blocks itself on the THREAD_BLOCKED_IO condition. 216 221 ****************************************************************************************** 217 222 * @ chdev_xp : extended pointer on remote chdev descriptor. 218 * @ thread : local pointer on client thread. 219 *****************************************************************************************/ 220 void chdev_register_command( xptr_t chdev_xp, 221 struct thread_s * thread ); 223 *****************************************************************************************/ 224 void chdev_register_command( xptr_t chdev_xp ); 222 225 223 226 /****************************************************************************************** -
trunk/kernel/kern/cluster.c
r406 r407 29 29 #include <hal_special.h> 30 30 #include <hal_ppm.h> 31 #include <remote_fifo.h> 31 32 #include <printk.h> 32 33 #include <errno.h> … … 77 78 // initialize cluster local parameters 78 79 cluster->cores_nr = info->cores_nr; 79 cluster->cores_in_kernel = 0;80 80 81 81 // initialize the lock protecting the embedded kcm allocator 82 82 spinlock_init( &cluster->kcm_lock ); 83 83 84 cluster_dmsg("\n[DMSG] %s for cluster %x enters\n",85 84 cluster_dmsg("\n[DBG] %s for cluster %x enters\n", 85 __FUNCTION__ , local_cxy ); 86 86 87 87 // initialises DQDT … … 102 102 } 103 103 104 cluster_dmsg("\n[DMSG] %s : PPM initialized in cluster %x at cycle %d\n",105 104 cluster_dmsg("\n[DBG] %s : PPM initialized in cluster %x at cycle %d\n", 105 __FUNCTION__ , local_cxy , hal_get_cycles() ); 106 106 107 107 // initialises embedded KHM 108 108 khm_init( &cluster->khm ); 109 109 110 cluster_dmsg("\n[D MSG] %s : KHM initialized in cluster %x at cycle %d\n",110 cluster_dmsg("\n[DBG] %s : KHM initialized in cluster %x at cycle %d\n", 111 111 __FUNCTION__ , local_cxy , hal_get_cycles() ); 112 112 … … 114 114 kcm_init( &cluster->kcm , KMEM_KCM ); 115 115 116 cluster_dmsg("\n[D MSG] %s : KCM initialized in cluster %x at cycle %d\n",116 cluster_dmsg("\n[DBG] %s : KCM initialized in cluster %x at cycle %d\n", 117 117 __FUNCTION__ , local_cxy , hal_get_cycles() ); 118 118 … … 125 125 } 126 126 127 cluster_dmsg("\n[DMSG] %s : cores initialized in cluster %x at cycle %d\n",128 127 cluster_dmsg("\n[DBG] %s : cores initialized in cluster %x at cycle %d\n", 128 __FUNCTION__ , local_cxy , hal_get_cycles() ); 129 129 130 130 // initialises RPC fifo 131 rpc_fifo_init( &cluster->rpc_fifo );131 local_fifo_init( &cluster->rpc_fifo ); 132 132 cluster->rpc_threads = 0; 133 133 134 cluster_dmsg("\n[DMSG] %s : RPC fifo inialized in cluster %x at cycle %d\n",135 134 cluster_dmsg("\n[DBG] %s : RPC fifo inialized in cluster %x at cycle %d\n", 135 __FUNCTION__ , local_cxy , hal_get_cycles() ); 136 136 137 137 // initialise pref_tbl[] in process manager … … 157 157 } 158 158 159 cluster_dmsg("\n[DMSG] %s Process Manager initialized in cluster %x at cycle %d\n",160 159 cluster_dmsg("\n[DBG] %s Process Manager initialized in cluster %x at cycle %d\n", 160 __FUNCTION__ , local_cxy , hal_get_cycles() ); 161 161 162 162 hal_fence(); … … 184 184 // Cores related functions 185 185 //////////////////////////////////////////////////////////////////////////////////// 186 187 ////////////////////////////////188 void cluster_core_kernel_enter()189 {190 cluster_t * cluster = LOCAL_CLUSTER;191 hal_atomic_add( &cluster->cores_in_kernel , 1 );192 }193 194 ///////////////////////////////195 void cluster_core_kernel_exit()196 {197 cluster_t * cluster = LOCAL_CLUSTER;198 hal_atomic_add( &cluster->cores_in_kernel , -1 );199 }200 186 201 187 ///////////////////////////////// … … 353 339 void cluster_process_local_link( process_t * process ) 354 340 { 341 uint32_t irq_state; 355 342 pmgr_t * pm = &LOCAL_CLUSTER->pmgr; 356 343 357 344 // get lock protecting the process manager local list 358 remote_spinlock_lock ( XPTR( local_cxy , &pm->local_lock ));345 remote_spinlock_lock_busy( XPTR( local_cxy , &pm->local_lock ) , & irq_state ); 359 346 360 347 xlist_add_first( XPTR( local_cxy , &pm->local_root ), … … 363 350 364 351 // release lock protecting the process manager local list 365 remote_spinlock_unlock ( XPTR( local_cxy , &pm->local_lock ));352 remote_spinlock_unlock_busy( XPTR( local_cxy , &pm->local_lock ) , irq_state ); 366 353 } 367 354 … … 369 356 void cluster_process_local_unlink( process_t * process ) 370 357 { 358 uint32_t irq_state; 371 359 pmgr_t * pm = &LOCAL_CLUSTER->pmgr; 372 360 373 361 // get lock protecting the process manager local list 374 remote_spinlock_lock ( XPTR( local_cxy , &pm->local_lock ));362 remote_spinlock_lock_busy( XPTR( local_cxy , &pm->local_lock ) , &irq_state ); 375 363 376 364 xlist_unlink( XPTR( local_cxy , &process->local_list ) ); … … 378 366 379 367 // release lock protecting the process manager local list 380 remote_spinlock_unlock ( XPTR( local_cxy , &pm->local_lock ));368 remote_spinlock_unlock_busy( XPTR( local_cxy , &pm->local_lock ) , irq_state ); 381 369 } 382 370 … … 384 372 void cluster_process_copies_link( process_t * process ) 385 373 { 374 uint32_t irq_state; 386 375 pmgr_t * pm = &LOCAL_CLUSTER->pmgr; 387 376 … … 401 390 402 391 // get lock protecting copies_list[lpid] 403 remote_spinlock_lock ( copies_lock);392 remote_spinlock_lock_busy( copies_lock , &irq_state ); 404 393 405 394 xlist_add_first( copies_root , copies_entry ); … … 407 396 408 397 // release lock protecting copies_list[lpid] 409 remote_spinlock_unlock ( copies_lock);398 remote_spinlock_unlock_busy( copies_lock , irq_state ); 410 399 } 411 400 … … 413 402 void cluster_process_copies_unlink( process_t * process ) 414 403 { 404 uint32_t irq_state; 415 405 pmgr_t * pm = &LOCAL_CLUSTER->pmgr; 416 406 … … 427 417 428 418 // get lock protecting copies_list[lpid] 429 remote_spinlock_lock ( copies_lock);419 remote_spinlock_lock_busy( copies_lock , &irq_state ); 430 420 431 421 xlist_unlink( copies_entry ); … … 433 423 434 424 // release lock protecting copies_list[lpid] 435 remote_spinlock_unlock ( copies_lock);425 remote_spinlock_unlock_busy( copies_lock , irq_state ); 436 426 } 437 427 -
trunk/kernel/kern/cluster.h
r279 r407 108 108 109 109 // local parameters 110 uint32_t cores_nr; /*! number of cores in cluster */ 111 uint32_t cores_in_kernel; /*! number of cores currently in kernel mode */ 112 110 uint32_t cores_nr; /*! actual number of cores in cluster */ 113 111 uint32_t ram_size; /*! physical memory size */ 114 112 uint32_t ram_base; /*! physical memory base (local address) */ … … 125 123 126 124 // RPC 127 r pc_fifo_t rpc_fifo; /*! RPC fifo*/128 uint32_t rpc_threads; /*! current number of RPC threads 125 remote_fifo_t rpc_fifo; /*! RPC fifo (one per cluster) */ 126 uint32_t rpc_threads; /*! current number of RPC threads in cluster */ 129 127 130 128 // DQDT … … 173 171 174 172 /****************************************************************************************** 175 * This function checks the validity of a cluster identifier. TODO useful ??? [AG]173 * This function checks the validity of a cluster identifier. 176 174 ****************************************************************************************** 177 175 * @ cxy : cluster identifier to be checked. … … 179 177 *****************************************************************************************/ 180 178 bool_t cluster_is_undefined( cxy_t cxy ); 181 182 /******************************************************************************************183 * This function register sysfs information in cluster TODO ??? [AG]184 *****************************************************************************************/185 void cluster_sysfs_register();186 179 187 180 -
trunk/kernel/kern/core.c
r406 r407 107 107 ticks = core->ticks_nr++; 108 108 109 // handle pending alarms TODO ??? [AG] 110 // alarm_clock( &core->alarm_mgr , ticks);109 // handle signals for all threads executing on this core 110 sched_handle_signals( core ); 111 111 112 112 // handle scheduler 113 if( (ticks % CONFIG_SCHED_TICKS_PER_QUANTUM) == 0 ) sched_yield( NULL);113 if( (ticks % CONFIG_SCHED_TICKS_PER_QUANTUM) == 0 ) sched_yield(); 114 114 115 115 // update DQDT -
trunk/kernel/kern/do_syscall.c
r406 r407 31 31 32 32 ///////////////////////////////////////////////////////////////////////////////////////////// 33 // This ƒonction should never be called... 33 34 ///////////////////////////////////////////////////////////////////////////////////////////// 34 static in line int sys_undefined()35 static int sys_undefined() 35 36 { 36 37 panic("undefined system call"); … … 40 41 ///////////////////////////////////////////////////////////////////////////////////////////// 41 42 // This array of pointers define the kernel functions implementing the syscalls. 42 // It must be kept consistent with the enum in syscalls.h43 // It must be kept consistent with the enum in "shared_syscalls.h" file. 43 44 ///////////////////////////////////////////////////////////////////////////////////////////// 44 45 … … 48 49 { 49 50 sys_thread_exit, // 0 50 sys_ mmap, // 151 sys_thread_yield, // 1 51 52 sys_thread_create, // 2 52 53 sys_thread_join, // 3 53 54 sys_thread_detach, // 4 54 sys_ thread_yield,// 555 sys_undefined, // 5 55 56 sys_sem, // 6 56 57 sys_condvar, // 7 57 58 sys_barrier, // 8 58 59 sys_mutex, // 9 59 sys_thread_sleep, // 10 60 sys_thread_wakeup, // 11 60 61 sys_undefined, // 10 62 sys_munmap, // 11 61 63 sys_open, // 12 62 sys_ creat,// 1364 sys_mmap, // 13 63 65 sys_read, // 14 64 66 sys_write, // 15 … … 67 69 sys_unlink, // 18 68 70 sys_pipe, // 19 71 69 72 sys_chdir, // 20 70 73 sys_mkdir, // 21 … … 74 77 sys_closedir, // 25 75 78 sys_getcwd, // 26 76 sys_ clock, // 2779 sys_undefined, // 27 77 80 sys_alarm, // 28 78 81 sys_rmdir, // 29 82 79 83 sys_utls, // 30 80 84 sys_chmod, // 31 … … 87 91 sys_stat, // 38 88 92 sys_trace, // 39 93 94 sys_get_config, // 40 95 sys_get_core, // 41 96 sys_get_cycle, // 42 97 sys_get_sched, // 43 98 sys_panic, // 44 99 sys_thread_sleep, // 45 100 sys_thread_wakeup, // 46 89 101 }; 90 102 … … 102 114 thread_user_time_update( this ); 103 115 104 // enable IRQs116 // enable interrupts 105 117 hal_enable_irq( NULL ); 106 118 … … 116 128 } 117 129 118 syscall_dmsg("\n[DMSG] %s : pid = %x / trdid = %x / service #%d\n" 119 " arg0 = %x / arg1 = %x / arg2 = %x / arg3 = %x\n", 120 __FUNCTION__ , this->process->pid , this->trdid , service_num , 121 arg0 , arg1 , arg2 , arg3 ); 130 #if( CONFIG_SYSCALL_DEBUG & 0x1) 131 printk("\n[DBG] %s : pid = %x / trdid = %x / service #%d\n" 132 " arg0 = %x / arg1 = %x / arg2 = %x / arg3 = %x\n", 133 __FUNCTION__ , this->process->pid , this->trdid , service_num , arg0 , arg1 , arg2 , arg3 ); 134 #endif 122 135 123 136 // reset errno … … 127 140 error = syscall_tbl[service_num] ( arg0 , arg1 , arg2 , arg3 ); 128 141 129 // handle pending signals for the calling thread 130 thread_signals_handle( this ); 131 132 // disable IRQs 142 // disable interrupt 133 143 hal_disable_irq( NULL ); 134 144 -
trunk/kernel/kern/do_syscall.h
r16 r407 1 1 /* 2 * do_syscall.h - kernel service numbers asked by userland2 * do_syscall.h - generic syscall handler. 3 3 * 4 4 * Authors Ghassan Almaless (2008,2009,2010,2011,2012) … … 32 32 /******************************************************************************************** 33 33 * This function calls the kernel function defined by the <service_num> argument. 34 * The possible values for servic_num are defined in the syscalls/syscalls.h file. 34 35 ******************************************************************************************** 35 36 * @ this : pointer on calling thread descriptor -
trunk/kernel/kern/kernel_init.c
r406 r407 32 32 #include <barrier.h> 33 33 #include <remote_barrier.h> 34 #include <remote_fifo.h> 34 35 #include <core.h> 35 36 #include <list.h> … … 85 86 cluster_t cluster_manager CONFIG_CACHE_LINE_ALIGNED; 86 87 87 // This variable defines the TXT0 kernel terminal 88 // This variable defines the TXT0 kernel terminal (TX only) 88 89 __attribute__((section(".kdata"))) 89 90 chdev_t txt0_chdev CONFIG_CACHE_LINE_ALIGNED; … … 121 122 vfs_ctx_t fs_context[FS_TYPES_NR] CONFIG_CACHE_LINE_ALIGNED; 122 123 124 // These variables are used by the sched_yield function to save SR value 125 __attribute__((section(".kdata"))) 126 uint32_t switch_save_sr[CONFIG_MAX_LOCAL_CORES] CONFIG_CACHE_LINE_ALIGNED; 127 128 #if CONFIG_READ_DEBUG 129 uint32_t enter_sys_read; 130 uint32_t exit_sys_read; 131 132 uint32_t enter_devfs_move; 133 uint32_t exit_devfs_move; 134 135 uint32_t enter_txt_read; 136 uint32_t exit_txt_read; 137 138 uint32_t enter_chdev_cmd; 139 uint32_t exit_chdev_cmd; 140 141 uint32_t enter_chdev_server; 142 uint32_t exit_chdev_server; 143 144 uint32_t enter_tty_cmd; 145 uint32_t exit_tty_cmd; 146 147 uint32_t enter_tty_isr; 148 uint32_t exit_tty_isr; 149 #endif 123 150 124 151 /////////////////////////////////////////////////////////////////////////////////////////// … … 137 164 " /_/ \\_\\ |______| |_| |_| \\_____/ |______/ |_| |_| |_| \\_\\ |_| |_| \n" 138 165 "\n\n\t\t Advanced Locality Management Operating System / Multi Kernel Hybrid\n" 139 "\n\n\t\t\t Version 0.0 / %d cluster(s) / %d core(s) per cluster\n\n", nclusters , ncores ); 166 "\n\n\t\t Version 0.0 / %d cluster(s) / %d core(s) per cluster / cycle %d\n\n", 167 nclusters , ncores , hal_time_stamp() ); 140 168 } 141 169 … … 201 229 { 202 230 cxy_t cxy = (x<<info->y_width) + y; 203 hal_remote_swd( XPTR( cxy , &chdev_dir.txt [0] ) ,231 hal_remote_swd( XPTR( cxy , &chdev_dir.txt_tx[0] ) , 204 232 XPTR( local_cxy , &txt0_chdev ) ); 205 233 } … … 273 301 } 274 302 275 #if( CONFIG_KINIT_DEBUG > 1 ) 276 printk("\n[DMSG] %s : created MMC in cluster %x / chdev = %x\n", 277 __FUNCTION__ , channel , local_cxy , chdev_ptr ); 303 #if( CONFIG_KINIT_DEBUG & 0x1 ) 304 if( hal_time_stamp() > CONFIG_KINIT_DEBUG ) 305 printk("\n[DBG] %s : created MMC in cluster %x / chdev = %x\n", 306 __FUNCTION__ , local_cxy , chdev_ptr ); 278 307 #endif 279 308 } … … 301 330 chdev_dir.dma[channel] = XPTR( local_cxy , chdev_ptr ); 302 331 303 #if( CONFIG_KINIT_DEBUG > 1 ) 304 printk("\n[DMSG] %s : created DMA[%d] in cluster %x / chdev = %x\n", 332 #if( CONFIG_KINIT_DEBUG & 0x1 ) 333 if( hal_time_stamp() > CONFIG_KINIT_DEBUG ) 334 printk("\n[DBG] %s : created DMA[%d] in cluster %x / chdev = %x\n", 305 335 __FUNCTION__ , channel , local_cxy , chdev_ptr ); 306 336 #endif … … 355 385 impl = IMPL_FROM_TYPE( dev_tbl[i].type ); 356 386 357 // There is one chdev per direction for NIC 358 if (func == DEV_FUNC_NIC) directions = 2;359 else directions = 1;387 // There is one chdev per direction for NIC and for TXT 388 if((func == DEV_FUNC_NIC) || (func == DEV_FUNC_TXT)) directions = 2; 389 else directions = 1; 360 390 361 391 // The TXT0 chdev has already been created … … 363 393 else first_channel = 0; 364 394 365 // do nothing for RO , that does not require a device descriptor.395 // do nothing for ROM, that does not require a device descriptor. 366 396 if( func == DEV_FUNC_ROM ) continue; 367 397 … … 394 424 395 425 // allocate and initialize a local chdev 396 // iflocal cluster matches target cluster426 // when local cluster matches target cluster 397 427 if( target_cxy == local_cxy ) 398 428 { … … 420 450 if(func==DEV_FUNC_IOB ) entry = &chdev_dir.iob; 421 451 if(func==DEV_FUNC_IOC ) entry = &chdev_dir.ioc[channel]; 422 if(func==DEV_FUNC_TXT ) entry = &chdev_dir.txt[channel];423 452 if(func==DEV_FUNC_FBF ) entry = &chdev_dir.fbf[channel]; 453 if((func==DEV_FUNC_TXT) && (rx==0)) entry = &chdev_dir.txt_tx[channel]; 454 if((func==DEV_FUNC_TXT) && (rx==1)) entry = &chdev_dir.txt_rx[channel]; 424 455 if((func==DEV_FUNC_NIC) && (rx==0)) entry = &chdev_dir.nic_tx[channel]; 425 456 if((func==DEV_FUNC_NIC) && (rx==1)) entry = &chdev_dir.nic_rx[channel]; … … 435 466 } 436 467 437 #if( CONFIG_KINIT_DEBUG > 1 ) 438 printk("\n[DMSG] %s : create chdev %s[%d] in cluster %x / chdev = %x\n", 439 __FUNCTION__ , chdev_func_str( func ), channel , local_cxy , chdev ); 468 #if( CONFIG_KINIT_DEBUG & 0x1 ) 469 if( hal_time_stamp() > CONFIG_KINIT_DEBUG ) 470 printk("\n[DBG] %s : create chdev %s / channel = %d / rx = %d / cluster %x / chdev = %x\n", 471 __FUNCTION__ , chdev_func_str( func ), channel , rx , local_cxy , chdev ); 440 472 #endif 441 473 } // end if match … … 451 483 /////////////////////////////////////////////////////////////////////////////////////////// 452 484 // This function is called by CP0 in cluster 0 to allocate memory and initialize the PIC 453 // device, namely the informations attached to the external IOPIC controller. 485 // device, namely the informations attached to the external IOPIC controller, that 486 // must be replicated in all clusters (struct iopic_input). 454 487 // This initialisation must be done before other devices initialisation because the IRQ 455 // routing infrastructure is required for internal and external devices initialisation.488 // routing infrastructure is required for both internal and external devices init. 456 489 /////////////////////////////////////////////////////////////////////////////////////////// 457 490 // @ info : pointer on the local boot-info structure. … … 490 523 assert( found , __FUNCTION__ , "PIC device not found\n" ); 491 524 492 // allocate and initialize the PIC chdev in local cluster493 chdev = chdev_create( func,525 // allocate and initialize the PIC chdev in cluster 0 526 chdev = chdev_create( DEV_FUNC_PIC, 494 527 impl, 495 528 0, // channel … … 502 535 dev_pic_init( chdev ); 503 536 504 // register extended pointer on PIC chdev in "chdev_dir" array in all clusters 537 // register, in all clusters, the extended pointer 538 // on PIC chdev in "chdev_dir" array 505 539 xptr_t * entry = &chdev_dir.pic; 506 540 … … 515 549 } 516 550 517 // initialize the "iopic_input" structure551 // initialize, in all clusters, the "iopic_input" structure 518 552 // defining how external IRQs are connected to IOPIC 519 uint32_t id; 520 uint8_t valid; 521 uint32_t type; 522 uint8_t channel; 523 uint8_t is_rx; 553 554 // register default value for unused inputs 555 for( x = 0 ; x < info->x_size ; x++ ) 556 { 557 for( y = 0 ; y < info->y_size ; y++ ) 558 { 559 cxy_t cxy = (x<<info->y_width) + y; 560 hal_remote_memset( XPTR( cxy , &iopic_input ) , 0xFF , sizeof(iopic_input_t) ); 561 } 562 } 563 564 // register input IRQ index for valid inputs 565 uint32_t id; // input IRQ index 566 uint8_t valid; // input IRQ is connected 567 uint32_t type; // source device type 568 uint8_t channel; // source device channel 569 uint8_t is_rx; // source device direction 570 uint32_t * ptr; // local pointer on one field in iopic_input stucture 524 571 525 572 for( id = 0 ; id < CONFIG_MAX_EXTERNAL_IRQS ; id++ ) … … 529 576 channel = dev_tbl[i].irq[id].channel; 530 577 is_rx = dev_tbl[i].irq[id].is_rx; 531 532 if( valid ) // only valid inputs are registered 533 { 534 uint32_t * index; // local pointer on one entry 535 uint16_t func = FUNC_FROM_TYPE( type ); 536 537 if ( func == DEV_FUNC_TXT ) 538 index = &iopic_input.txt[channel]; 539 else if( func == DEV_FUNC_IOC ) 540 index = &iopic_input.ioc[channel]; 541 else if( (func == DEV_FUNC_NIC) && (is_rx == 0) ) 542 index = &iopic_input.nic_tx[channel]; 543 else if( (func == DEV_FUNC_NIC) && (is_rx != 0) ) 544 index = &iopic_input.nic_rx[channel]; 545 else if( func == DEV_FUNC_IOB ) 546 index = &iopic_input.iob; 547 else 548 assert( false , __FUNCTION__ , "illegal source device for IOPIC input" ); 549 550 // set entry in local structure 551 *index = id; 578 func = FUNC_FROM_TYPE( type ); 579 580 // get pointer on relevant field in iopic_input 581 if( valid ) 582 { 583 if ( func == DEV_FUNC_IOC ) ptr = &iopic_input.ioc[channel]; 584 else if((func == DEV_FUNC_TXT) && (is_rx == 0)) ptr = &iopic_input.txt_tx[channel]; 585 else if((func == DEV_FUNC_TXT) && (is_rx != 0)) ptr = &iopic_input.txt_rx[channel]; 586 else if((func == DEV_FUNC_NIC) && (is_rx == 0)) ptr = &iopic_input.nic_tx[channel]; 587 else if((func == DEV_FUNC_NIC) && (is_rx != 0)) ptr = &iopic_input.nic_rx[channel]; 588 else if( func == DEV_FUNC_IOB ) ptr = &iopic_input.iob; 589 else panic( "illegal source device for IOPIC input" ); 590 591 // set one entry in all "iopic_input" structures 592 for( x = 0 ; x < info->x_size ; x++ ) 593 { 594 for( y = 0 ; y < info->y_size ; y++ ) 595 { 596 cxy_t cxy = (x<<info->y_width) + y; 597 hal_remote_swd( XPTR( cxy , ptr ) , id ); 598 } 599 } 552 600 } 553 601 } 554 602 555 #if( CONFIG_KINIT_DEBUG > 1 ) 556 printk("\n[DMSG] %s created PIC chdev in cluster %x at cycle %d\n", 557 __FUNCTION__ , local_cxy , (uint32_t)hal_time_stamp() ); 603 #if( CONFIG_KINIT_DEBUG & 0x1 ) 604 if( hal_time_stamp() > CONFIG_KINIT_DEBUG ) 605 { 606 printk("\n[DBG] %s created PIC chdev in cluster %x at cycle %d\n", 607 __FUNCTION__ , local_cxy , (uint32_t)hal_time_stamp() ); 608 dev_pic_inputs_display(); 609 } 558 610 #endif 559 611 … … 715 767 hal_set_current_thread( thread ); 716 768 717 // each core initializes the idle thread "locks_root" and "xlocks_root" fields 769 // each core register core descriptor pointer in idle thread descriptor 770 thread->core = &LOCAL_CLUSTER->core_tbl[core_lid]; 771 772 // each core initializes locks_root" and "xlocks_root" in idle thread descriptor 718 773 list_root_init( &thread->locks_root ); 719 774 xlist_root_init( XPTR( local_cxy , &thread->xlocks_root ) ); … … 728 783 729 784 if( (core_lid == 0) && (local_cxy == 0) ) 730 printk("\n[KINIT] %s : exit barrier 0 : TXT0 initialized / cycle %d\n",785 kinit_dmsg("\n[DBG] %s : exit barrier 0 : TXT0 initialized / cycle %d\n", 731 786 __FUNCTION__, hal_time_stamp() ); 732 787 733 788 ///////////////////////////////////////////////////////////////////////////// 734 // STEP 1 : all cores check itscore identifier.789 // STEP 1 : all cores check core identifier. 735 790 // CP0 initializes the local cluster manager. 736 791 // This includes the memory allocators. … … 762 817 763 818 if( (core_lid == 0) && (local_cxy == 0) ) 764 printk("\n[KINIT] %s : exit barrier 1 : clusters initialised / cycle %d\n",819 kinit_dmsg("\n[DBG] %s : exit barrier 1 : clusters initialised / cycle %d\n", 765 820 __FUNCTION__, hal_time_stamp() ); 766 821 767 822 ///////////////////////////////////////////////////////////////////////////////// 768 // STEP 2 : all CP0s initializethe process_zero descriptor.823 // STEP 2 : CP0 initializes the process_zero descriptor. 769 824 // CP0 in cluster 0 initializes the IOPIC device. 770 825 ///////////////////////////////////////////////////////////////////////////////// … … 787 842 788 843 if( (core_lid == 0) && (local_cxy == 0) ) 789 printk("\n[KINIT] %s : exit barrier 2 : PIC initialised / cycle %d\n",844 kinit_dmsg("\n[DBG] %s : exit barrier 2 : PIC initialised / cycle %d\n", 790 845 __FUNCTION__, hal_time_stamp() ); 791 846 792 847 //////////////////////////////////////////////////////////////////////////////// 793 // STEP 3 : all CP0s initializethe distibuted LAPIC descriptor.794 // all CP0s initializethe internal chdev descriptors795 // all CP0sinitialize the local external chdev descriptors848 // STEP 3 : CP0 initializes the distibuted LAPIC descriptor. 849 // CP0 initializes the internal chdev descriptors 850 // CP0 initialize the local external chdev descriptors 796 851 //////////////////////////////////////////////////////////////////////////////// 797 852 … … 818 873 819 874 if( (core_lid == 0) && (local_cxy == 0) ) 820 printk("\n[KINIT] %s : exit barrier 3 : all chdev initialised / cycle %d\n",875 kinit_dmsg("\n[DBG] %s : exit barrier 3 : all chdev initialised / cycle %d\n", 821 876 __FUNCTION__, hal_time_stamp()); 822 877 823 878 ///////////////////////////////////////////////////////////////////////////////// 824 879 // STEP 4 : All cores enable IPI (Inter Procesor Interrupt), 825 // All cores initialise specific core registers826 880 // Alh cores initialize IDLE thread. 827 881 // Only CP0 in cluster 0 creates the VFS root inode. … … 837 891 hal_enable_irq( &status ); 838 892 839 // All cores initialize specific core registers840 hal_core_init( info );841 842 893 // all cores initialize the idle thread descriptor 843 894 error = thread_kernel_init( thread, … … 857 908 858 909 #if CONFIG_KINIT_DEBUG 859 sched_display( );910 sched_display( core_lid ); 860 911 #endif 861 912 … … 928 979 929 980 if( (core_lid == 0) && (local_cxy == 0) ) 930 printk("\n[KINIT] %s : exit barrier 4 : VFS_root = %l in cluster 0 / cycle %d\n",981 kinit_dmsg("\n[DBG] %s : exit barrier 4 : VFS_root = %l in cluster 0 / cycle %d\n", 931 982 __FUNCTION__, vfs_root_inode_xp , hal_time_stamp()); 932 983 … … 987 1038 988 1039 if( (core_lid == 0) && (local_cxy == 0) ) 989 printk("\n[KINIT] %s : exit barrier 5 : VFS_root = %l in cluster IO / cycle %d\n",1040 kinit_dmsg("\n[DBG] %s : exit barrier 5 : VFS_root = %l in cluster IO / cycle %d\n", 990 1041 __FUNCTION__, vfs_root_inode_xp , hal_time_stamp() ); 991 1042 … … 1020 1071 1021 1072 if( (core_lid == 0) && (local_cxy == 0) ) 1022 printk("\n[KINIT] %s : exit barrier 6 : dev_root = %l in cluster IO / cycle %d\n",1073 kinit_dmsg("\n[DBG] %s : exit barrier 6 : dev_root = %l in cluster IO / cycle %d\n", 1023 1074 __FUNCTION__, devfs_dev_inode_xp , hal_time_stamp() ); 1024 1075 … … 1057 1108 1058 1109 if( (core_lid == 0) && (local_cxy == 0) ) 1059 printk("\n[KINIT] %s : exit barrier 7 : dev_root = %l in cluster 0 / cycle %d\n",1110 kinit_dmsg("\n[DBG] %s : exit barrier 7 : dev_root = %l in cluster 0 / cycle %d\n", 1060 1111 __FUNCTION__, devfs_dev_inode_xp , hal_time_stamp() ); 1061 1112 … … 1075 1126 ///////////////////////////////////////////////////////////////////////////////// 1076 1127 1128 #if CONFIG_KINIT_DEBUG 1129 sched_display( core_lid ); 1130 #endif 1131 1077 1132 if( (core_lid == 0) && (local_cxy == 0) ) 1078 printk("\n[KINIT] %s : exit barrier 8 : process init created / cycle %d\n",1133 kinit_dmsg("\n[DBG] %s : exit barrier 8 : process init created / cycle %d\n", 1079 1134 __FUNCTION__ , hal_time_stamp() ); 1080 1135 … … 1118 1173 sizeof( core_t ), 1119 1174 sizeof( scheduler_t ), 1120 sizeof( r pc_fifo_t),1175 sizeof( remote_fifo_t ), 1121 1176 sizeof( page_t ), 1122 1177 sizeof( mapper_t ), … … 1139 1194 dev_pic_enable_timer( CONFIG_SCHED_TICK_MS_PERIOD ); 1140 1195 1141 // each core jump to idle thread1196 // each core jump to thread_idle_func 1142 1197 thread_idle_func(); 1143 1198 } -
trunk/kernel/kern/printk.c
r406 r407 190 190 goto xprintf_text; 191 191 } 192 } // end xprintf() 193 194 /////////////////////////////////////////////////////////////////////////////////// 195 // This static function is called by kernel_printf() to display a string on the 196 // TXT channel defined by the <channel> argument. 197 // The access mode is defined by the <busy> argument: 198 // - if <busy> is true, it uses the dev_txt_sync_write() function, that takes the 199 // TXT lock, and call directly the relevant TXT driver, without descheduling. 200 // - if <busy is false, it uses the dev_txt_write() function, that register the 201 // write buffer in the relevant TXT chdev queue, and uses a descheduling policy. 202 /////////////////////////////////////////////////////////////////////////////////// 203 // @ channel : TXT channel. 204 // @ busy : TXT device acces mode (busy waiting if non zero). 205 // @ buf : buffer containing the characters. 206 // @ nc : number of characters. 207 // return 0 if success / return -1 if TTY0 busy after 10000 retries. 208 /////////////////////////////////////////////////////////////////////////////////// 209 static error_t txt_write( uint32_t channel, 210 uint32_t busy, 211 char * buffer, 212 uint32_t count ) 213 { 214 if( busy ) return dev_txt_sync_write( channel , buffer , count ); 215 else return dev_txt_write( channel , buffer , count ); 216 } 192 } // end snprintf() 217 193 218 194 ////////////////////////////////////////////////////////////////////////////////////// 219 // This static function is called by printk(), assert() and nolock_printk() to build220 // a formated string.195 // This static function is called by printk(), assert() and nolock_printk() 196 // to display a formated string on TXT0, using a busy waiting policy. 221 197 ////////////////////////////////////////////////////////////////////////////////////// 222 // @ channel : channel index.223 // @ busy : TXT device access mode (busy waiting if non zero).224 198 // @ format : printf like format. 225 // @ args : formatarguments.199 // @ args : va_list of arguments. 226 200 ////////////////////////////////////////////////////////////////////////////////////// 227 static void kernel_printf( uint32_t channel, 228 uint32_t busy, 229 char * format, 201 static void kernel_printf( char * format, 230 202 va_list * args ) 231 203 { … … 239 211 if (i) 240 212 { 241 txt_write( channel, busy,format, i );213 dev_txt_sync_write( format, i ); 242 214 format += i; 243 215 } … … 276 248 { 277 249 val = -val; 278 txt_write( channel, busy,"-" , 1 );250 dev_txt_sync_write( "-" , 1 ); 279 251 } 280 252 for(i = 0; i < 10; i++) … … 302 274 { 303 275 uint32_t val = va_arg( *args , uint32_t ); 304 txt_write( channel, busy,"0x" , 2 );276 dev_txt_sync_write( "0x" , 2 ); 305 277 for(i = 0; i < 8; i++) 306 278 { … … 315 287 { 316 288 uint32_t val = va_arg( *args , uint32_t ); 317 txt_write( channel, busy,"0x" , 2 );289 dev_txt_sync_write( "0x" , 2 ); 318 290 for(i = 0; i < 8; i++) 319 291 { … … 328 300 { 329 301 unsigned long long val = va_arg( *args , unsigned long long ); 330 txt_write( channel, busy,"0x" , 2 );302 dev_txt_sync_write( "0x" , 2 ); 331 303 for(i = 0; i < 16; i++) 332 304 { … … 341 313 { 342 314 unsigned long long val = va_arg( *args , unsigned long long ); 343 txt_write( channel, busy,"0x" , 2 );315 dev_txt_sync_write( "0x" , 2 ); 344 316 for(i = 0; i < 16; i++) 345 317 { … … 363 335 default: 364 336 { 365 txt_write( channel , busy, 366 "\n[PANIC] in kernel_printf() : illegal format\n", 45 ); 367 } 368 } 369 370 if( pbuf != NULL ) txt_write( channel, busy, pbuf, len ); 337 dev_txt_sync_write( "\n[PANIC] in kernel_printf() : illegal format\n", 45 ); 338 } 339 } 340 341 if( pbuf != NULL ) dev_txt_sync_write( pbuf, len ); 371 342 372 343 goto printf_text; … … 382 353 383 354 // get pointers on TXT0 chdev 384 xptr_t txt0_xp = chdev_dir.txt [0];355 xptr_t txt0_xp = chdev_dir.txt_tx[0]; 385 356 cxy_t txt0_cxy = GET_CXY( txt0_xp ); 386 357 chdev_t * txt0_ptr = GET_PTR( txt0_xp ); … … 394 365 // call kernel_printf on TXT0, in busy waiting mode 395 366 va_start( args , format ); 396 kernel_printf( 0 , 1 ,format , &args );367 kernel_printf( format , &args ); 397 368 va_end( args ); 398 369 … … 408 379 // call kernel_printf on TXT0, in busy waiting mode 409 380 va_start( args , format ); 410 kernel_printf( 0 , 1 ,format , &args );381 kernel_printf( format , &args ); 411 382 va_end( args ); 412 383 } … … 419 390 420 391 // get pointers on TXT0 chdev 421 xptr_t txt0_xp = chdev_dir.txt [0];392 xptr_t txt0_xp = chdev_dir.txt_tx[0]; 422 393 cxy_t txt0_cxy = GET_CXY( txt0_xp ); 423 394 chdev_t * txt0_ptr = GET_PTR( txt0_xp ); … … 431 402 // call kernel_printf on TXT0, in busy waiting mode 432 403 va_start( args , format ); 433 kernel_printf( 0 , 1 ,format , &args );404 kernel_printf( format , &args ); 434 405 va_end( args ); 435 406 … … 456 427 { 457 428 // get pointers on TXT0 chdev 458 xptr_t txt0_xp = chdev_dir.txt [0];429 xptr_t txt0_xp = chdev_dir.txt_tx[0]; 459 430 cxy_t txt0_cxy = GET_CXY( txt0_xp ); 460 431 chdev_t * txt0_ptr = GET_PTR( txt0_xp ); … … 471 442 // call kernel_printf on TXT0, in busy waiting to print format 472 443 va_start( args , format ); 473 kernel_printf( 0 , 1 ,format , &args );444 kernel_printf( format , &args ); 474 445 va_end( args ); 475 446 -
trunk/kernel/kern/printk.h
r406 r407 102 102 char * format , ... ); 103 103 104 #define panic(fmt, ...) _panic(" [PANIC] %s(): " fmt "\n", __func__, ##__VA_ARGS__)104 #define panic(fmt, ...) _panic("\n[PANIC] %s(): " fmt "\n", __func__, ##__VA_ARGS__) 105 105 106 106 /////////////////////////////////////////////////////////////////////////////////// … … 108 108 /////////////////////////////////////////////////////////////////////////////////// 109 109 110 #if CONFIG_CHDEV_DEBUG 111 #define chdev_dmsg(...) if(hal_time_stamp() > CONFIG_CHDEV_DEBUG) printk(__VA_ARGS__) 112 #else 113 #define chdev_dmsg(...) 114 #endif 115 110 116 #if CONFIG_CLUSTER_DEBUG 111 117 #define cluster_dmsg(...) if(hal_time_stamp() > CONFIG_CLUSTER_DEBUG) printk(__VA_ARGS__) … … 186 192 #endif 187 193 194 #if CONFIG_GRPC_DEBUG 195 #define grpc_dmsg(...) if(hal_time_stamp() > CONFIG_GRPC_DEBUG) printk(__VA_ARGS__) 196 #else 197 #define grpc_dmsg(...) 198 #endif 199 188 200 #if CONFIG_IDLE_DEBUG 189 201 #define idle_dmsg(...) if(hal_time_stamp() > CONFIG_IDLE_DEBUG) printk(__VA_ARGS__) … … 234 246 #endif 235 247 248 #if CONFIG_MMAP_DEBUG 249 #define mmap_dmsg(...) if(hal_time_stamp() > CONFIG_MMAP_DEBUG) printk(__VA_ARGS__) 250 #else 251 #define mmap_dmsg(...) 252 #endif 253 236 254 #if CONFIG_MMC_DEBUG 237 255 #define mmc_dmsg(...) if(hal_time_stamp() > CONFIG_MMC_DEBUG) printk(__VA_ARGS__) … … 264 282 #endif 265 283 284 #if CONFIG_READ_DEBUG 285 #define read_dmsg(...) if(hal_time_stamp() > CONFIG_READ_DEBUG) printk(__VA_ARGS__) 286 #else 287 #define read_dmsg(...) 288 #endif 289 266 290 #if CONFIG_RPC_DEBUG 267 291 #define rpc_dmsg(...) if(hal_time_stamp() > CONFIG_RPC_DEBUG) printk(__VA_ARGS__) … … 310 334 #else 311 335 #define vmm_dmsg(...) 336 #endif 337 338 #if CONFIG_WRITE_DEBUG 339 #define write_dmsg(...) if(hal_time_stamp() > CONFIG_WRITE_DEBUG) printk(__VA_ARGS__) 340 #else 341 #define write_dmsg(...) 312 342 #endif 313 343 -
trunk/kernel/kern/process.c
r406 r407 39 39 #include <thread.h> 40 40 #include <list.h> 41 #include <string.h> 41 42 #include <scheduler.h> 42 43 #include <remote_spinlock.h> … … 90 91 pid_t parent_pid; 91 92 92 process_dmsg("\n[DMSG] %s : core[%x,%d] enters for process %x\n", 93 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 93 error_t error1; 94 error_t error2; 95 error_t error3; 96 xptr_t stdin_xp; 97 xptr_t stdout_xp; 98 xptr_t stderr_xp; 99 uint32_t stdin_id; 100 uint32_t stdout_id; 101 uint32_t stderr_id; 102 103 process_dmsg("\n[DBG] %s : core[%x,%d] enters for process %x\n", 104 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 94 105 95 106 // get parent process cluster, local pointer, and pid 96 // for all processes other than process_zero97 if( process == &process_zero ) 107 // for all processes other than kernel process 108 if( process == &process_zero ) // kernel process 98 109 { 99 110 assert( (pid == 0) , __FUNCTION__ , "process_zero must have PID = 0\n"); … … 101 112 parent_cxy = 0; 102 113 parent_ptr = NULL; 103 parent_pid = 0; // process_zero is its own parent... 104 } 105 else 106 { 107 assert( (parent_xp != XPTR_NULL) , __FUNCTION__ , "parent_xp cannot be NULL\n"); 108 114 parent_pid = 0; 115 } 116 else // user process 117 { 109 118 parent_cxy = GET_CXY( parent_xp ); 110 119 parent_ptr = (process_t *)GET_PTR( parent_xp ); … … 112 121 } 113 122 114 // initialize PID and PPID 115 process->pid = pid; 116 process->ppid = parent_pid; 117 118 // initialize reference process vmm (not for kernel process) 119 if( pid ) vmm_init( process ); 120 121 // reset reference process file descriptors array 122 process_fd_init( process ); 123 124 // reset reference process files structures and cwd_lock 125 process->vfs_root_xp = XPTR_NULL; 126 process->vfs_bin_xp = XPTR_NULL; 127 process->vfs_cwd_xp = XPTR_NULL; 128 remote_rwlock_init( XPTR( local_cxy , &process->cwd_lock ) ); 129 130 // reset children list root 131 xlist_root_init( XPTR( local_cxy , &process->children_root ) ); 132 process->children_nr = 0; 133 134 // reset semaphore / mutex / barrier / condvar list roots 135 xlist_root_init( XPTR( local_cxy , &process->sem_root ) ); 136 xlist_root_init( XPTR( local_cxy , &process->mutex_root ) ); 137 xlist_root_init( XPTR( local_cxy , &process->barrier_root ) ); 138 xlist_root_init( XPTR( local_cxy , &process->condvar_root ) ); 139 remote_spinlock_init( XPTR( local_cxy , &process->sync_lock ) ); 140 141 // register new process in the parent children list (not for kernel process) 123 // initialize PID, PPID, and REF 124 process->pid = pid; 125 process->ppid = parent_pid; 126 process->ref_xp = XPTR( local_cxy , process ); 127 128 // initialize vmm, fd array and others structures for user processes. 129 // These structures are not used by the kernel process. 142 130 if( pid ) 143 131 { 132 // initialize vmm (not for kernel) 133 vmm_init( process ); 134 135 process_dmsg("\n[DBG] %s : core[%x,%d] / vmm initialised for process %x\n", 136 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 137 138 // initialize fd_array (not for kernel) 139 process_fd_init( process ); 140 141 // create stdin / stdout / stderr pseudo-files (not for kernel) 142 if( parent_pid == 0 ) // process_init 143 { 144 error1 = vfs_open( process, 145 CONFIG_INIT_STDIN, 146 O_RDONLY, 147 0, // FIXME chmod 148 &stdin_xp, 149 &stdin_id ); 150 151 error2 = vfs_open( process, 152 CONFIG_INIT_STDOUT, 153 O_WRONLY, 154 0, // FIXME chmod 155 &stdout_xp, 156 &stdout_id ); 157 158 error3 = vfs_open( process, 159 CONFIG_INIT_STDERR, 160 O_WRONLY, 161 0, // FIXME chmod 162 &stderr_xp, 163 &stderr_id ); 164 } 165 else // user process 166 { 167 error1 = vfs_open( process, 168 CONFIG_USER_STDIN, 169 O_RDONLY, 170 0, // FIXME chmod 171 &stdin_xp, 172 &stdin_id ); 173 174 error2 = vfs_open( process, 175 CONFIG_USER_STDOUT, 176 O_WRONLY, 177 0, // FIXME chmod 178 &stdout_xp, 179 &stdout_id ); 180 181 error3 = vfs_open( process, 182 CONFIG_USER_STDERR, 183 O_WRONLY, 184 0, // FIXME chmod 185 &stderr_xp, 186 &stderr_id ); 187 } 188 189 assert( ((error1 == 0) && (error2 == 0) && (error3 == 0)) , __FUNCTION__ , 190 "cannot open stdin/stdout/stderr pseudo files\n"); 191 192 assert( ((stdin_id == 0) && (stdout_id == 1) && (stderr_id == 2)) , __FUNCTION__ , 193 "bad indexes : stdin %d / stdout %d / stderr %d \n", stdin_id , stdout_id , stderr_id ); 194 195 process_dmsg("\n[DBG] %s : core[%x,%d] / fd array initialised for process %x\n", 196 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 197 198 199 // reset reference process files structures and cwd_lock (not for kernel) 200 process->vfs_root_xp = XPTR_NULL; 201 process->vfs_bin_xp = XPTR_NULL; 202 process->vfs_cwd_xp = XPTR_NULL; 203 remote_rwlock_init( XPTR( local_cxy , &process->cwd_lock ) ); 204 205 // reset children list root (not for kernel) 206 xlist_root_init( XPTR( local_cxy , &process->children_root ) ); 207 process->children_nr = 0; 208 209 // reset semaphore / mutex / barrier / condvar list roots (nor for kernel) 210 xlist_root_init( XPTR( local_cxy , &process->sem_root ) ); 211 xlist_root_init( XPTR( local_cxy , &process->mutex_root ) ); 212 xlist_root_init( XPTR( local_cxy , &process->barrier_root ) ); 213 xlist_root_init( XPTR( local_cxy , &process->condvar_root ) ); 214 remote_spinlock_init( XPTR( local_cxy , &process->sync_lock ) ); 215 216 // register new process in the parent children list (nor for kernel) 144 217 xptr_t entry = XPTR( local_cxy , &process->brothers_list ); 145 218 xptr_t root = XPTR( parent_cxy , &parent_ptr->children_root ); … … 156 229 spinlock_init( &process->th_lock ); 157 230 158 // set ref_xp field159 process->ref_xp = XPTR( local_cxy , process );160 161 231 // register new process descriptor in local cluster manager local_list 162 232 cluster_process_local_link( process ); … … 169 239 hal_fence(); 170 240 171 process_dmsg("\n[DMSG] %s : exit for process %x in cluster%x\n",172 __FUNCTION__, pid );241 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x\n", 242 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 173 243 174 244 } // process_reference init() … … 181 251 cxy_t ref_cxy = GET_CXY( reference_process_xp ); 182 252 process_t * ref_ptr = (process_t *)GET_PTR( reference_process_xp ); 253 254 // set the pid, ppid, ref_xp fields in local process 255 local_process->pid = hal_remote_lw( XPTR( ref_cxy , &ref_ptr->pid ) ); 256 local_process->ppid = hal_remote_lw( XPTR( ref_cxy , &ref_ptr->ppid ) ); 257 local_process->ref_xp = reference_process_xp; 258 259 process_dmsg("\n[DBG] %s : core[%x,%d] enters for process %x in cluster %x\n", 260 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , local_process->pid ); 183 261 184 262 // reset local process vmm … … 192 270 local_process->vfs_bin_xp = hal_remote_lwd( XPTR( ref_cxy , &ref_ptr->vfs_bin_xp ) ); 193 271 local_process->vfs_cwd_xp = XPTR_NULL; 194 195 // set the pid, ppid, ref_xp fields196 local_process->pid = hal_remote_lw( XPTR( ref_cxy , &ref_ptr->pid ) );197 local_process->ppid = hal_remote_lw( XPTR( ref_cxy , &ref_ptr->ppid ) );198 local_process->ref_xp = reference_process_xp;199 200 process_dmsg("\n[DMSG] %s : enter for process %x in cluster %x\n",201 __FUNCTION__ , local_process->pid );202 272 203 273 // reset children list root (not used in a process descriptor copy) … … 233 303 hal_fence(); 234 304 235 process_dmsg("\n[DMSG] %s :exit for process %x in cluster %x\n",236 __FUNCTION__, local_process->pid );305 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x in cluster %x\n", 306 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , local_process->pid ); 237 307 238 308 return 0; … … 288 358 vmm_destroy( process ); 289 359 290 process_dmsg("\n[D MSG] %s for pid %d / page_faults = %d\n",360 process_dmsg("\n[DBG] %s for pid %d / page_faults = %d\n", 291 361 __FUNCTION__ , process->pid, process->vmm.pgfault_nr ); 292 } 362 363 } // end process_destroy() 293 364 294 365 //////////////////////////////////////// … … 298 369 uint32_t ltid; // index in process th_tbl 299 370 uint32_t count; // thread counter 371 372 printk("\n@@@ %s enter\n", __FUNCTION__ ); 300 373 301 374 // get lock protecting th_tbl[] … … 317 390 } 318 391 319 volatile uint32_t ko;392 printk("\n@@@ %s : %d signal(s) sent\n", __FUNCTION__, count ); 320 393 321 394 // second loop on threads to wait acknowledge from scheduler, … … 329 402 if( thread != NULL ) 330 403 { 331 // wait scheduler acknowledge 332 do { ko = (thread->signals & THREAD_SIG_KILL); } while( ko ); 333 334 // unlink thread from brothers list if required 335 if( (thread->flags & THREAD_FLAG_DETACHED) == 0 ) 336 xlist_unlink( XPTR( local_cxy , &thread->brothers_list ) ); 404 405 printk("\n@@@ %s start polling at cycle %d\n", __FUNCTION__ , hal_time_stamp() ); 406 407 // poll the THREAD_SIG_KILL bit until reset 408 while( thread->signals & THREAD_SIG_KILL ) asm volatile( "nop" ); 409 410 printk("\n@@@ %s exit polling\n", __FUNCTION__ ); 411 412 // detach target thread from parent if attached 413 if( (thread->flags & THREAD_FLAG_DETACHED) != 0 ) 414 thread_child_parent_unlink( thread->parent , XPTR( local_cxy , thread ) ); 337 415 338 416 // unlink thread from process … … 346 424 } 347 425 426 printk("\n@@@ %s : %d ack(s) received\n", __FUNCTION__, count ); 427 348 428 // release lock protecting th_tbl[] 349 429 spinlock_unlock( &process->th_lock ); … … 351 431 // release memory allocated for process descriptor 352 432 process_destroy( process ); 353 } 433 434 printk("\n[@@@] %s : core[%x,%d] exit\n", 435 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid ); 436 437 } // end process_kill() 354 438 355 439 /////////////////////////////////////////////// … … 440 524 441 525 ///////////////////////////////////////////////// 442 error_t process_fd_register( xptr_t file_xp, 443 uint32_t * file_id ) 526 error_t process_fd_register( process_t * process, 527 xptr_t file_xp, 528 uint32_t * fdid ) 444 529 { 445 530 bool_t found; … … 447 532 xptr_t xp; 448 533 449 // get extended pointer on reference process450 xptr_t ref_xp = CURRENT_THREAD->process->ref_xp;451 452 534 // get reference process cluster and local pointer 535 xptr_t ref_xp = process->ref_xp; 453 536 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp ); 454 537 cxy_t ref_cxy = GET_CXY( ref_xp ); … … 467 550 hal_remote_swd( XPTR( ref_cxy , &ref_ptr->fd_array.array[id] ) , file_xp ); 468 551 hal_remote_atomic_add( XPTR( ref_cxy , &ref_ptr->fd_array.current ) , 1 ); 469 *f ile_id = id;552 *fdid = id; 470 553 break; 471 554 } … … 481 564 //////////////////////////////////////////////// 482 565 xptr_t process_fd_get_xptr( process_t * process, 483 uint32_t f ile_id )566 uint32_t fdid ) 484 567 { 485 568 xptr_t file_xp; 486 569 487 570 // access local copy of process descriptor 488 file_xp = process->fd_array.array[f ile_id];571 file_xp = process->fd_array.array[fdid]; 489 572 490 573 if( file_xp == XPTR_NULL ) … … 496 579 497 580 // access reference process descriptor 498 file_xp = hal_remote_lwd( XPTR( ref_cxy , &ref_ptr->fd_array.array[f ile_id] ) );581 file_xp = hal_remote_lwd( XPTR( ref_cxy , &ref_ptr->fd_array.array[fdid] ) ); 499 582 500 583 // update local fd_array if found 501 584 if( file_xp != XPTR_NULL ) 502 585 { 503 process->fd_array.array[f ile_id] = file_xp;586 process->fd_array.array[fdid] = file_xp; 504 587 } 505 588 } 506 589 507 590 return file_xp; 508 } 591 592 } // end process_fd_get_xptr() 509 593 510 594 /////////////////////////////////////////// … … 543 627 // release lock on source process fd_array 544 628 remote_spinlock_unlock( XPTR( src_cxy , &src_ptr->lock ) ); 545 } 629 630 } // end process_fd_remote_copy() 546 631 547 632 //////////////////////////////////////////////////////////////////////////////////// … … 561 646 assert( (thread != NULL) , __FUNCTION__ , "thread argument is NULL" ); 562 647 563 // search a free slot in th_tbl[] 648 // search a free slot in th_tbl[] 649 // 0 is not a valid ltid value 564 650 found = false; 565 for( ltid = 0; ltid < CONFIG_THREAD_MAX_PER_CLUSTER ; ltid++ )651 for( ltid = 1 ; ltid < CONFIG_THREAD_MAX_PER_CLUSTER ; ltid++ ) 566 652 { 567 653 if( process->th_tbl[ltid] == NULL ) … … 606 692 { 607 693 char * path; // pathname to .elf file 694 bool_t keep_pid; // new process keep parent PID if true 608 695 process_t * process; // local pointer on new process 609 696 pid_t pid; // new process pid 610 697 xptr_t parent_xp; // extended pointer on parent process 611 cxy_t parent_cxy; 612 process_t * parent_ptr; 613 uint32_t parent_pid; 698 cxy_t parent_cxy; // parent process local cluster 699 process_t * parent_ptr; // local pointer on parent process 700 uint32_t parent_pid; // parent process identifier 614 701 thread_t * thread; // pointer on new thread 615 702 pthread_attr_t attr; // main thread attributes … … 618 705 error_t error; 619 706 620 // get parent and .elf pathnamefrom exec_info707 // get .elf pathname, parent_xp, and keep_pid flag from exec_info 621 708 path = exec_info->path; 622 709 parent_xp = exec_info->parent_xp; 710 keep_pid = exec_info->keep_pid; 711 712 process_dmsg("\n[DBG] %s : core[%x,%d] enters for path = %s\n", 713 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path ); 623 714 624 715 // get parent process cluster and local pointer … … 627 718 parent_pid = hal_remote_lw( XPTR( parent_cxy , &parent_ptr->pid ) ); 628 719 629 exec_dmsg("\n[DMSG] %s : thread %x on core[%x,%d] enters for path = %s\n", 630 __FUNCTION__, CURRENT_THREAD->trdid, local_cxy, CURRENT_THREAD->core->lid , path ); 631 632 // create new process descriptor 633 process = process_alloc(); 634 635 if( process == NULL ) 636 { 637 printk("\n[ERROR] in %s : no memory / cluster = %x / ppid = %x / path = %s\n", 638 __FUNCTION__ , local_cxy , parent_pid , path ); 639 return ENOMEM; 640 } 641 642 // get a pid from the local cluster 643 error = cluster_pid_alloc( XPTR( local_cxy , process ) , &pid ); 644 645 if( error ) 646 { 647 printk("\n[ERROR] in %s : cannot get PID / cluster = %x / ppid = %x / path = %s\n", 648 __FUNCTION__ , local_cxy , parent_pid , path ); 649 process_free( process ); 650 return ENOMEM; 651 } 720 // allocates memory for process descriptor 721 process = process_alloc(); 722 if( process == NULL ) return -1; 723 724 // get PID 725 if( keep_pid ) // keep parent PID 726 { 727 pid = parent_pid; 728 } 729 else // get new PID from local cluster 730 { 731 error = cluster_pid_alloc( XPTR( local_cxy , process ) , &pid ); 732 if( error ) return -1; 733 } 734 735 process_dmsg("\n[DBG] %s : core[%x,%d] created process %x for path = %s\n", 736 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, pid, path ); 652 737 653 738 // initialize the process descriptor as the reference 654 739 process_reference_init( process , pid , parent_xp ); 655 740 656 exec_dmsg("\n[DMSG] %s : thread %x on core[%x,%d] created process %x / path = %s\n",657 __FUNCTION__, CURRENT_THREAD->trdid, local_cxy, CURRENT_THREAD->core->lid, pid, path );741 process_dmsg("\n[DBG] %s : core[%x,%d] initialized process %x / path = %s\n", 742 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, pid, path ); 658 743 659 744 // initialize vfs_root and vfs_cwd from parent process … … 670 755 XPTR( parent_cxy , &parent_ptr->fd_array) ); 671 756 672 exec_dmsg("\n[DMSG] %s : fd_array copied from process %x to process %x\n", 673 __FUNCTION__, parent_pid , pid ); 674 675 // initialize signal manager TODO ??? [AG] 676 // signal_manager_init( process ); 757 process_dmsg("\n[DBG] %s : core[%x,%d] copied fd_array for process %x\n", 758 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, pid ); 677 759 678 760 // register "code" and "data" vsegs as well as the process entry-point in VMM, … … 682 764 if( error ) 683 765 { 684 printk("\n[ERROR] in %s : failed to access elf file for process %x / path = %s\n",766 printk("\n[ERROR] in %s : failed to access .elf file for process %x / path = %s\n", 685 767 __FUNCTION__, pid , path ); 686 768 process_destroy( process ); … … 688 770 } 689 771 690 exec_dmsg("\n[DMSG] %s : code and data vsegs registeredfor process %x / path = %s\n",691 __FUNCTION__ , pid, path );772 process_dmsg("\n[DBG] %s : core[%x,%d] registered code/data vsegs for process %x / path = %s\n", 773 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, pid, path ); 692 774 693 775 // select a core in cluster … … 709 791 { 710 792 printk("\n[ERROR] in %s : cannot create thread for process %x / path = %s\n", 711 __FUNCTION__, pid );793 __FUNCTION__, pid , path ); 712 794 process_destroy( process ); 713 795 return error; 714 796 } 715 797 716 exec_dmsg("\n[DMSG] %s : thread created for process %x on core %d in cluster %x\n", 717 __FUNCTION__ , pid , core->lid , local_cxy ); 718 719 #if CONFIG_EXEC_DEBUG 720 if( hal_time_stamp() > CONFIG_EXEC_DEBUG ) 721 { 722 grdxt_print( &process->vmm.grdxt , GRDXT_TYPE_VSEG , process->pid ); 723 hal_gpt_print( &process->vmm.gpt , process->pid ); 724 } 725 #endif 798 process_dmsg("\n[DBG] %s : core[%x,%d] created thread %x for process %x / path = %s\n", 799 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, thread->trdid, pid, path ); 726 800 727 801 // update children list in parent process … … 733 807 thread_unblock( XPTR( local_cxy , thread ) , THREAD_BLOCKED_GLOBAL ); 734 808 735 exec_dmsg("\n[DMSG] %s : exit for process %x\n",736 __FUNCTION__, process->pid);809 process_dmsg("\n[DBG] %s : core[%x,%d] exit for path = %s\n", 810 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path ); 737 811 738 812 return 0; 739 813 740 } // end proces _make_exec()814 } // end process_make_exec() 741 815 742 816 ////////////////////////// … … 744 818 { 745 819 exec_info_t exec_info; // structure to be passed to process_make_exec() 746 747 error_t error1; 748 error_t error2; 749 error_t error3; 750 xptr_t stdin_xp; 751 xptr_t stdout_xp; 752 xptr_t stderr_xp; 753 uint32_t stdin_id; 754 uint32_t stdout_id; 755 uint32_t stderr_id; 756 757 process_dmsg("\n[DMSG] %s : enters in cluster %x\n", __FUNCTION__ , local_cxy ); 758 759 // open stdin / stdout / stderr pseudo-files 760 error1 = vfs_open( XPTR_NULL, CONFIG_DEV_STDIN , O_RDONLY, 0, &stdin_xp , &stdin_id ); 761 error2 = vfs_open( XPTR_NULL, CONFIG_DEV_STDOUT, O_WRONLY, 0, &stdout_xp, &stdout_id ); 762 error3 = vfs_open( XPTR_NULL, CONFIG_DEV_STDERR, O_WRONLY, 0, &stderr_xp, &stderr_id ); 763 764 assert( ((error1 == 0) && (error2 == 0) && (error3 == 0)) , __FUNCTION__ , 765 "cannot open stdin/stdout/stderr pseudo files\n"); 766 767 assert( ((stdin_id == 0) && (stdout_id == 1) && (stderr_id == 2)) , __FUNCTION__ , 768 "bad indexes for stdin/stdout/stderr\n"); 820 xptr_t parent_xp; // extended pointer on parent process. 821 error_t error; 822 823 process_dmsg("\n[DBG] %s : enters in cluster %x\n", 824 __FUNCTION__ , local_cxy ); 825 826 // parent process is local kernel process 827 parent_xp = XPTR( local_cxy , &process_zero ); 769 828 770 829 // initialize the exec_info structure 771 exec_info.parent_xp = XPTR( local_cxy , &process_zero ); 830 exec_info.keep_pid = false; 831 exec_info.parent_xp = parent_xp; 772 832 strcpy( exec_info.path , CONFIG_PROCESS_INIT_PATH ); 773 833 exec_info.args_nr = 0; 774 834 exec_info.envs_nr = 0; 775 835 776 // create process_init and thread_init 777 error1 = process_make_exec( &exec_info ); 778 779 assert( (error1 == 0) , __FUNCTION__ , "cannot create process_init\n"); 780 781 process_dmsg("\n[DMSG] %s : exit in cluster %x\n", __FUNCTION__ , local_cxy ); 836 // initialize process_init and create thread_init 837 error = process_make_exec( &exec_info ); 838 839 if( error ) panic("cannot initialize process_init in cluster %x", local_cxy ); 840 841 process_dmsg("\n[DBG] %s : exit in cluster %x\n", 842 __FUNCTION__ , local_cxy ); 782 843 783 844 hal_fence(); -
trunk/kernel/kern/process.h
r204 r407 143 143 { 144 144 xptr_t parent_xp; /*! extended pointer on parent process descriptor */ 145 bool_t keep_pid; /*! keep parent PID if true / new PID if false */ 145 146 146 147 char path[CONFIG_VFS_MAX_PATH_LENGTH]; /*! .elf file path */ … … 175 176 /********************************************************************************************* 176 177 * This function allocates memory and initializes the "process_init" descriptor and the 177 * associated "thread_init" descriptor . It should be called once at the end of the kernel178 * initialisation procedure, by the kernel "process_zero".178 * associated "thread_init" descriptor in the local cluster. It is called once at the end 179 * of the kernel initialisation procedure, by the local kernel process. 179 180 * The "process_init" is the first user process, and all other user processes will be forked 180 181 * from this process. The code executed by "process_init" is stored in a .elf file, whose 181 * pathname is defined by the CONFIG_PROCESS_INIT_PATH argument. It uses fork/exec syscalls 182 * to create the "shell" user process, and various other user daemon processes. 183 * Practically, it builds the exec_info structure, registers the stdin / stdout / stderr 184 * pseudo-file descriptors and the vfs_root and vfs_cwd in parent process_zero, and calls 185 * the generic process_make_exec() function, that makes the real job. 182 * pathname is defined by the CONFIG_PROCESS_INIT_PATH argument. 183 * Practically, it builds the exec_info structure, and calls the process_make_exec() 184 * function, that make the real job. 186 185 ********************************************************************************************/ 187 186 void process_init_create(); … … 253 252 * and the associated main thread, from information found in the <exec_info> structure 254 253 * (defined in the process.h file), that must be built by the caller. 254 * - If the <keep_pid> field is true, the new process inherits its PID from the parent PID. 255 * - If the <keep_pid> field is false, a new PID is allocated from the local cluster manager. 255 256 * The new process inherits from the parent process (i) the open file descriptors, (ii) the 256 257 * vfs_root and the vfs_cwd inodes. … … 268 269 269 270 270 /******************** Signal Management Operations **************************************/271 272 /*********************************************************************************************273 * This function TODO [AG]274 ********************************************************************************************/275 void process_signal_handler( process_t * process );276 277 278 271 /******************** File Management Operations ****************************************/ 279 272 … … 287 280 /********************************************************************************************* 288 281 * This function uses as many remote accesses as required, to reset an entry in fd_array[], 289 * in all clusters containing a copy. The entry is identified by the <f ile_id> argument.282 * in all clusters containing a copy. The entry is identified by the <fdid> argument. 290 283 * This function must be executed by a thread running reference cluster, that contains 291 284 * the complete list of process descriptors copies. 292 285 ********************************************************************************************* 293 286 * @ process : pointer on the local process descriptor. 294 * @ f ile_id: file descriptor index in the fd_array.287 * @ fdid : file descriptor index in the fd_array. 295 288 ********************************************************************************************/ 296 289 void process_fd_remove( process_t * process, 297 uint32_t f ile_id );290 uint32_t fdid ); 298 291 299 292 /********************************************************************************************* … … 306 299 ********************************************************************************************* 307 300 * @ process : pointer on the local process descriptor. 308 * @ f ile_id: file descriptor index in the fd_array.301 * @ fdid : file descriptor index in the fd_array. 309 302 * @ return extended pointer on file descriptor if success / return XPTR_NULL if not found. 310 303 ********************************************************************************************/ 311 304 xptr_t process_fd_get_xptr( process_t * process, 312 uint32_t f ile_id );305 uint32_t fdid ); 313 306 314 307 /********************************************************************************************* … … 328 321 ********************************************************************************************* 329 322 * @ file_xp : extended pointer on the file descriptor to be registered. 330 * @ f ile_id: [out] buffer for fd_array slot index.323 * @ fdid : [out] buffer for fd_array slot index. 331 324 * @ return 0 if success / return EMFILE if array full. 332 325 ********************************************************************************************/ 333 error_t process_fd_register( xptr_t file_xp, 334 uint32_t * file_id ); 326 error_t process_fd_register( process_t * process, 327 xptr_t file_xp, 328 uint32_t * fdid ); 335 329 336 330 /********************************************************************************************* -
trunk/kernel/kern/rpc.c
r406 r407 76 76 &rpc_mapper_move_buffer_server, // 24 77 77 &rpc_mapper_get_page_server, // 25 78 &rpc_ undefined,// 2679 &rpc_ undefined,// 2778 &rpc_vmm_create_vseg_server, // 26 79 &rpc_sched_display_server, // 27 80 80 &rpc_undefined, // 28 81 81 &rpc_undefined, // 29 … … 97 97 page_t ** page ) // out 98 98 { 99 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",99 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 100 100 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 101 101 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 115 115 116 116 // get output arguments from RPC descriptor 117 *page 118 119 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",117 *page = (page_t *)(intptr_t)rpc.args[1]; 118 119 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 120 120 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 121 121 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 125 125 void rpc_pmem_get_pages_server( xptr_t xp ) 126 126 { 127 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",127 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 128 128 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 129 129 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 142 142 hal_remote_swd( XPTR( cxy , &desc->args[1] ) , (uint64_t)(intptr_t)page ); 143 143 144 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",144 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 145 145 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 146 146 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 157 157 pid_t * pid ) // out 158 158 { 159 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",159 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 160 160 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 161 161 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 178 178 *error = (error_t)rpc.args[2]; 179 179 180 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",180 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 181 181 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 182 182 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 190 190 pid_t pid; // output : process identifier 191 191 192 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",192 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 193 193 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 194 194 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 209 209 hal_remote_sw( XPTR( client_cxy , &desc->args[1] ) , (uint64_t)pid ); 210 210 211 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",211 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 212 212 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 213 213 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 224 224 error_t * error ) // out 225 225 { 226 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",226 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 227 227 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 228 228 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 244 244 *error = (error_t)rpc.args[1]; 245 245 246 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",246 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 247 247 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 248 248 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 256 256 error_t error; // local error error status 257 257 258 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",258 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 259 259 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 260 260 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 278 278 hal_remote_swd( XPTR( client_cxy , &desc->args[1] ) , (uint64_t)error ); 279 279 280 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",280 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 281 281 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 282 282 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 291 291 void rpc_process_kill_client( process_t * process ) 292 292 { 293 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",293 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 294 294 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 295 295 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 325 325 } 326 326 327 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",327 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 328 328 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 329 329 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 336 336 process_t * process; 337 337 338 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",338 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 339 339 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 340 340 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 360 360 } 361 361 362 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",362 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 363 363 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 364 364 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 379 379 error_t * error ) // out 380 380 { 381 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",381 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 382 382 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 383 383 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 387 387 // initialise RPC descriptor header 388 388 rpc_desc_t rpc; 389 rpc.index = RPC_THREAD_USER_CREATE;390 rpc.response = 1;389 rpc.index = RPC_THREAD_USER_CREATE; 390 rpc.response = 1; 391 391 392 392 // set input arguments in RPC descriptor … … 403 403 *error = (error_t)rpc.args[5]; 404 404 405 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",405 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 406 406 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 407 407 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 421 421 error_t error; 422 422 423 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",423 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 424 424 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 425 425 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 442 442 sizeof(pthread_attr_t) ); 443 443 444 assert( (attr_copy.cxy == local_cxy) , __FUNCTION__ , "bad target cluster\n" );445 446 444 // call kernel function 447 445 error = thread_user_create( pid, … … 453 451 // set output arguments 454 452 thread_xp = XPTR( local_cxy , thread_ptr ); 455 hal_remote_swd( XPTR( client_cxy , &desc->args[ 1] ) , (uint64_t)error);456 hal_remote_swd( XPTR( client_cxy , &desc->args[ 2] ) , (uint64_t)thread_xp);457 458 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",453 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)thread_xp ); 454 hal_remote_swd( XPTR( client_cxy , &desc->args[5] ) , (uint64_t)error ); 455 456 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 459 457 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 460 458 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 473 471 error_t * error ) // out 474 472 { 475 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",473 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 476 474 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 477 475 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 496 494 *error = (error_t)rpc.args[4]; 497 495 498 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",496 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 499 497 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 500 498 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 509 507 error_t error; 510 508 511 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",509 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 512 510 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 513 511 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 533 531 hal_remote_swd( XPTR( client_cxy , &desc->args[2] ) , (uint64_t)thread_xp ); 534 532 535 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",533 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 536 534 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 537 535 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 547 545 uint32_t sig_id ) // in 548 546 { 549 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",547 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 550 548 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 551 549 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 565 563 rpc_send_sync( cxy , &rpc ); 566 564 567 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",565 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 568 566 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 569 567 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 576 574 uint32_t sig_id; // signal index 577 575 578 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",576 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 579 577 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 580 578 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 591 589 signal_rise( process , sig_id ); 592 590 593 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",591 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 594 592 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 595 593 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 613 611 error_t * error ) // out 614 612 { 615 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",613 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 616 614 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 617 615 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 641 639 *error = (error_t)rpc.args[9]; 642 640 643 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",641 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 644 642 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 645 643 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 660 658 error_t error; 661 659 662 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",660 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 663 661 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 664 662 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 693 691 hal_remote_swd( XPTR( client_cxy , &desc->args[9] ) , (uint64_t)error ); 694 692 695 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",693 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 696 694 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 697 695 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 706 704 struct vfs_inode_s * inode ) 707 705 { 708 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",706 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 709 707 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 710 708 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 723 721 rpc_send_sync( cxy , &rpc ); 724 722 725 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",723 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 726 724 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 727 725 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 733 731 vfs_inode_t * inode; 734 732 735 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",733 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 736 734 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 737 735 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 747 745 vfs_inode_destroy( inode ); 748 746 749 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",747 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 750 748 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 751 749 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 764 762 error_t * error ) // out 765 763 { 766 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",764 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 767 765 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 768 766 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 787 785 *error = (error_t)rpc.args[4]; 788 786 789 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",787 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 790 788 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 791 789 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 803 801 char name_copy[CONFIG_VFS_MAX_NAME_LENGTH]; 804 802 805 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",803 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 806 804 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 807 805 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 829 827 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)error ); 830 828 831 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",829 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 832 830 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 833 831 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 843 841 vfs_dentry_t * dentry ) 844 842 { 845 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",843 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 846 844 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 847 845 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 860 858 rpc_send_sync( cxy , &rpc ); 861 859 862 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",860 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 863 861 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 864 862 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 870 868 vfs_dentry_t * dentry; 871 869 872 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",870 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 873 871 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 874 872 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 884 882 vfs_dentry_destroy( dentry ); 885 883 886 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",884 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 887 885 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 888 886 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 901 899 error_t * error ) // out 902 900 { 903 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",901 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 904 902 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 905 903 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 923 921 *error = (error_t)rpc.args[3]; 924 922 925 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",923 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 926 924 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 927 925 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 936 934 error_t error; 937 935 938 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",936 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 939 937 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 940 938 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 957 955 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 958 956 959 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",957 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 960 958 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 961 959 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 970 968 vfs_file_t * file ) 971 969 { 972 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",970 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 973 971 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 974 972 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 987 985 rpc_send_sync( cxy , &rpc ); 988 986 989 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",987 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 990 988 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 991 989 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 997 995 vfs_file_t * file; 998 996 999 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",997 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1000 998 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1001 999 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1011 1009 vfs_file_destroy( file ); 1012 1010 1013 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1011 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1014 1012 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1015 1013 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1027 1025 error_t * error ) // out 1028 1026 { 1029 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1027 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1030 1028 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1031 1029 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1049 1047 *error = (error_t)rpc.args[3]; 1050 1048 1051 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1049 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1052 1050 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1053 1051 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1064 1062 char name_copy[CONFIG_VFS_MAX_NAME_LENGTH]; 1065 1063 1066 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1064 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1067 1065 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1068 1066 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1087 1085 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 1088 1086 1089 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1087 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1090 1088 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1091 1089 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1101 1099 error_t * error ) // out 1102 1100 { 1103 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1101 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1104 1102 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1105 1103 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1121 1119 *error = (error_t)rpc.args[1]; 1122 1120 1123 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1121 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1124 1122 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1125 1123 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1132 1130 vfs_inode_t * inode; 1133 1131 1134 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1132 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1135 1133 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1136 1134 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1149 1147 hal_remote_swd( XPTR( client_cxy , &desc->args[1] ) , (uint64_t)error ); 1150 1148 1151 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1149 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1152 1150 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1153 1151 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1162 1160 mapper_t * mapper, // in 1163 1161 uint32_t first, // in 1164 uint32_t page,// in1162 uint32_t index, // in 1165 1163 uint32_t * cluster, // out 1166 1164 error_t * error ) // out 1167 1165 { 1168 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1166 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1169 1167 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1170 1168 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1180 1178 rpc.args[0] = (uint64_t)(intptr_t)mapper; 1181 1179 rpc.args[1] = (uint64_t)first; 1182 rpc.args[2] = (uint64_t) page;1180 rpc.args[2] = (uint64_t)index; 1183 1181 1184 1182 // register RPC request in remote RPC fifo … … 1189 1187 *error = (error_t)rpc.args[4]; 1190 1188 1191 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1189 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1192 1190 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1193 1191 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1199 1197 mapper_t * mapper; 1200 1198 uint32_t first; 1201 uint32_t page;1199 uint32_t index; 1202 1200 uint32_t cluster; 1203 1201 error_t error; 1204 1202 1205 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1203 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1206 1204 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1207 1205 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1214 1212 mapper = (mapper_t *)(intptr_t)hal_remote_lpt( XPTR( client_cxy , &desc->args[0] ) ); 1215 1213 first = (uint32_t) hal_remote_lw ( XPTR( client_cxy , &desc->args[1] ) ); 1216 page= (uint32_t) hal_remote_lw ( XPTR( client_cxy , &desc->args[2] ) );1214 index = (uint32_t) hal_remote_lw ( XPTR( client_cxy , &desc->args[2] ) ); 1217 1215 1218 1216 // call the kernel function 1219 error = fatfs_get_cluster( mapper , first , page, &cluster );1217 error = fatfs_get_cluster( mapper , first , index , &cluster ); 1220 1218 1221 1219 // set output argument … … 1223 1221 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)error ); 1224 1222 1225 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1223 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1226 1224 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1227 1225 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1239 1237 error_t * error ) // out 1240 1238 { 1241 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1239 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1242 1240 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1243 1241 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1261 1259 *error = (error_t)rpc.args[3]; 1262 1260 1263 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1261 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1264 1262 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1265 1263 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1275 1273 error_t error; 1276 1274 1277 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1275 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1278 1276 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1279 1277 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1295 1293 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)error ); 1296 1294 1297 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1295 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1298 1296 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1299 1297 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1309 1307 process_t * process, // in 1310 1308 vpn_t vpn, // in 1309 bool_t cow, // in 1311 1310 uint32_t * attr, // out 1312 1311 ppn_t * ppn, // out 1313 1312 error_t * error ) // out 1314 1313 { 1315 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1314 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1316 1315 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1317 1316 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1327 1326 rpc.args[0] = (uint64_t)(intptr_t)process; 1328 1327 rpc.args[1] = (uint64_t)vpn; 1328 rpc.args[2] = (uint64_t)cow; 1329 1329 1330 1330 // register RPC request in remote RPC fifo (blocking function) … … 1332 1332 1333 1333 // get output argument from rpc descriptor 1334 *attr = (uint32_t)rpc.args[ 2];1335 *ppn = (ppn_t)rpc.args[ 3];1336 *error = (error_t)rpc.args[ 4];1337 1338 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1334 *attr = (uint32_t)rpc.args[3]; 1335 *ppn = (ppn_t)rpc.args[4]; 1336 *error = (error_t)rpc.args[5]; 1337 1338 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1339 1339 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1340 1340 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1346 1346 process_t * process; 1347 1347 vpn_t vpn; 1348 bool_t cow; 1348 1349 uint32_t attr; 1349 1350 ppn_t ppn; 1350 1351 error_t error; 1351 1352 1352 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1353 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1353 1354 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1354 1355 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1361 1362 process = (process_t *)(intptr_t)hal_remote_lwd( XPTR( client_cxy , &desc->args[0] ) ); 1362 1363 vpn = (vpn_t) hal_remote_lwd( XPTR( client_cxy , &desc->args[1] ) ); 1364 cow = (bool_t) hal_remote_lwd( XPTR( client_cxy , &desc->args[2] ) ); 1363 1365 1364 1366 // call local kernel function 1365 error = vmm_get_pte( process , vpn , &attr , &ppn );1367 error = vmm_get_pte( process , vpn , cow , &attr , &ppn ); 1366 1368 1367 1369 // set output argument "attr" & "ppn" to client RPC descriptor 1368 hal_remote_swd( XPTR( client_cxy , &desc->args[ 2] ) , (uint64_t)attr );1369 hal_remote_swd( XPTR( client_cxy , &desc->args[ 3] ) , (uint64_t)ppn );1370 hal_remote_swd( XPTR( client_cxy , &desc->args[ 4] ) , (uint64_t)error );1371 1372 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1370 hal_remote_swd( XPTR( client_cxy , &desc->args[3] ) , (uint64_t)attr ); 1371 hal_remote_swd( XPTR( client_cxy , &desc->args[4] ) , (uint64_t)ppn ); 1372 hal_remote_swd( XPTR( client_cxy , &desc->args[5] ) , (uint64_t)error ); 1373 1374 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1373 1375 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1374 1376 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1384 1386 xptr_t * buf_xp ) // out 1385 1387 { 1386 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1388 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1387 1389 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1388 1390 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1404 1406 *buf_xp = (xptr_t)rpc.args[1]; 1405 1407 1406 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1408 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1407 1409 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1408 1410 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1412 1414 void rpc_kcm_alloc_server( xptr_t xp ) 1413 1415 { 1414 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1416 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1415 1417 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1416 1418 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1433 1435 hal_remote_swd( XPTR( client_cxy , &desc->args[1] ) , (uint64_t)buf_xp ); 1434 1436 1435 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1437 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1436 1438 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1437 1439 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1447 1449 uint32_t kmem_type ) // in 1448 1450 { 1449 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1451 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1450 1452 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1451 1453 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1465 1467 rpc_send_sync( cxy , &rpc ); 1466 1468 1467 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1469 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1468 1470 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1469 1471 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1473 1475 void rpc_kcm_free_server( xptr_t xp ) 1474 1476 { 1475 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1477 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1476 1478 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1477 1479 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1491 1493 kmem_free( &req ); 1492 1494 1493 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1495 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1494 1496 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1495 1497 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1510 1512 error_t * error ) // out 1511 1513 { 1512 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1514 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1513 1515 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1514 1516 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1535 1537 *error = (error_t)rpc.args[6]; 1536 1538 1537 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1539 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1538 1540 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1539 1541 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1552 1554 error_t error; 1553 1555 1554 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1556 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1555 1557 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1556 1558 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1592 1594 hal_remote_swd( XPTR( client_cxy , &desc->args[6] ) , (uint64_t)error ); 1593 1595 1594 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1596 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1595 1597 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1596 1598 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1607 1609 page_t ** page ) // out 1608 1610 { 1609 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1611 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1610 1612 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1611 1613 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1628 1630 *page = (page_t *)(intptr_t)rpc.args[2]; 1629 1631 1630 rpc_dmsg("\n[D MSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n",1632 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1631 1633 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1632 1634 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1636 1638 void rpc_mapper_get_page_server( xptr_t xp ) 1637 1639 { 1638 rpc_dmsg("\n[D MSG] %s : enter / thread %x on core[%x,%d] / cycle %d\n",1640 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1639 1641 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1640 1642 CURRENT_THREAD->core->lid , hal_time_stamp() ); … … 1654 1656 hal_remote_swd( XPTR( cxy , &desc->args[1] ) , (uint64_t)(intptr_t)page ); 1655 1657 1656 rpc_dmsg("\n[DMSG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1657 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1658 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1659 } 1660 1658 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1659 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1660 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1661 } 1662 1663 ///////////////////////////////////////////////////////////////////////////////////////// 1664 // [26] Marshaling functions attached to RPC_VMM_CREATE_VSEG 1665 ///////////////////////////////////////////////////////////////////////////////////////// 1666 1667 //////////////////////////////////////////////////////// 1668 void rpc_vmm_create_vseg_client( cxy_t cxy, 1669 struct process_s * process, 1670 vseg_type_t type, 1671 intptr_t base, 1672 uint32_t size, 1673 uint32_t file_offset, 1674 uint32_t file_size, 1675 xptr_t mapper_xp, 1676 cxy_t vseg_cxy, 1677 struct vseg_s ** vseg ) 1678 { 1679 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1680 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1681 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1682 1683 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1684 1685 // initialise RPC descriptor header 1686 rpc_desc_t rpc; 1687 rpc.index = RPC_VMM_CREATE_VSEG; 1688 rpc.response = 1; 1689 1690 // set input arguments in RPC descriptor 1691 rpc.args[0] = (uint64_t)(intptr_t)process; 1692 rpc.args[1] = (uint64_t)type; 1693 rpc.args[2] = (uint64_t)base; 1694 rpc.args[3] = (uint64_t)size; 1695 rpc.args[4] = (uint64_t)file_offset; 1696 rpc.args[5] = (uint64_t)file_size; 1697 rpc.args[6] = (uint64_t)mapper_xp; 1698 rpc.args[7] = (uint64_t)vseg_cxy; 1699 1700 // register RPC request in remote RPC fifo (blocking function) 1701 rpc_send_sync( cxy , &rpc ); 1702 1703 // get output values from RPC descriptor 1704 *vseg = (vseg_t *)(intptr_t)rpc.args[8]; 1705 1706 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1707 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1708 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1709 } 1710 1711 //////////////////////////////////////////// 1712 void rpc_vmm_create_vseg_server( xptr_t xp ) 1713 { 1714 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1715 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1716 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1717 1718 // get client cluster identifier and pointer on RPC descriptor 1719 cxy_t cxy = (cxy_t)GET_CXY( xp ); 1720 rpc_desc_t * desc = (rpc_desc_t *)GET_PTR( xp ); 1721 1722 // get input arguments from client RPC descriptor 1723 process_t * process = (process_t *)(intptr_t)hal_remote_lwd( XPTR(cxy , &desc->args[0])); 1724 vseg_type_t type = (vseg_type_t)(uint32_t)hal_remote_lwd( XPTR(cxy , &desc->args[1])); 1725 intptr_t base = (intptr_t) hal_remote_lwd( XPTR(cxy , &desc->args[2])); 1726 uint32_t size = (uint32_t) hal_remote_lwd( XPTR(cxy , &desc->args[3])); 1727 uint32_t file_offset = (uint32_t) hal_remote_lwd( XPTR(cxy , &desc->args[4])); 1728 uint32_t file_size = (uint32_t) hal_remote_lwd( XPTR(cxy , &desc->args[5])); 1729 xptr_t mapper_xp = (xptr_t) hal_remote_lwd( XPTR(cxy , &desc->args[6])); 1730 cxy_t vseg_cxy = (cxy_t)(uint32_t) hal_remote_lwd( XPTR(cxy , &desc->args[7])); 1731 1732 // call local kernel function 1733 vseg_t * vseg = vmm_create_vseg( process, 1734 type, 1735 base, 1736 size, 1737 file_offset, 1738 file_size, 1739 mapper_xp, 1740 vseg_cxy ); 1741 1742 // set output arguments into client RPC descriptor 1743 hal_remote_swd( XPTR( cxy , &desc->args[8] ) , (uint64_t)(intptr_t)vseg ); 1744 1745 rpc_dmsg("\n[DBG] %s : exit / thread %x on core[%x,%d] / cycle %d\n", 1746 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1747 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1748 } 1749 1750 ///////////////////////////////////////////////////////////////////////////////////////// 1751 // [27] Marshaling functions attached to RPC_SCHED_DISPLAY 1752 ///////////////////////////////////////////////////////////////////////////////////////// 1753 1754 //////////////////////////////////////////////////////// 1755 void rpc_sched_display_client( cxy_t cxy, 1756 lid_t lid) 1757 { 1758 rpc_dmsg("\n[DBG] %s : enter / thread %x on core[%x,%d] / cycle %d\n", 1759 __FUNCTION__ , CURRENT_THREAD->trdid , local_cxy, 1760 CURRENT_THREAD->core->lid , hal_time_stamp() ); 1761 1762 assert( (cxy != local_cxy) , __FUNCTION__ , "target cluster is not remote\n"); 1763 1764 // initialise RPC descriptor header 1765 rpc_desc_t rpc; 1766 rpc.index = RPC_SCHED_DISPLAY; 1767 rpc.response = 1; 1768 1769 // set input arguments in RPC des