Changeset 407 for trunk/hal/tsar_mips32/core/hal_uspace.c
- Timestamp:
- Nov 7, 2017, 3:08:12 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/tsar_mips32/core/hal_uspace.c
r315 r407 45 45 hal_disable_irq( &save_sr ); 46 46 47 47 48 for( i = 0 ; i < wsize ; i++ ) // transfer one word per iteration 48 49 { … … 129 130 } // end hal_copy_to_uspace() 130 131 131 ////////////////////////////////////////// 132 error_t hal_strcpy_from_uspace( char * k_dst, 133 char * u_src, 134 uint32_t max_size ) 135 136 { 137 138 // TODO implement the max_size handling, and error handling 139 140 uint32_t save_sr; 132 ////////////////////////////////////////////// 133 void hal_strcpy_from_uspace( char * k_dst, 134 char * u_src, 135 uint32_t size ) 136 { 137 uint32_t save_sr; 138 141 139 uint32_t src = (uint32_t)u_src; 142 140 uint32_t dst = (uint32_t)k_dst; 143 uint32_t length; 144 error_t error; 145 paddr_t paddr; 146 147 // XXX XXX XXX: must be converted, to handle faults 148 error = vmm_v2p_translate( false , u_src , &paddr ); 149 if( error ) 150 { 151 return EFAULT; 152 } 153 154 length = hal_strlen_from_uspace( u_src ); 155 if( length >= max_size ) 156 { 157 return EFAULT; 158 } 159 160 hal_disable_irq( &save_sr ); 161 162 // loop on characters while non NUL 141 142 hal_disable_irq( &save_sr ); 143 144 // loop on characters while ( (character != NUL) and (count < size ) 163 145 asm volatile( 164 "mfc2 $15, $1 \n" /* save current MMU_MODE */ 165 "1: \n" /* loop entry */ 166 "ori $14, $0, 0x7 \n" 167 "mtc2 $14, $1 \n" /* MMU_MODE <= DTLB ON */ 168 "lb $13, 0(%0) \n" /* read char from user space */ 169 "mtc2 $15, $1 \n" /* restore MMU_MODE */ 170 "sb $13, 0(%1) \n" /* store char to kernel space */ 171 "addi %0, %0, 1 \n" /* increment SRC pointer */ 172 "addi %1, %1, 1 \n" /* increment DST pointer */ 173 "bne $13, $0, 1b \n" /* test NUL */ 146 ".set noreorder \n" 147 "move $11, %0 \n" /* $11 <= count == size */ 148 "move $12, %1 \n" /* $12 <= u_src */ 149 "move $13, %2 \n" /* $13 <= k_dst */ 150 "mfc2 $15, $1 \n" /* $15 <= MMU_MODE */ 151 "ori $14, $15, 0x7 \n" /* $14 <= mode DTLB on */ 152 "1: \n" 153 "mtc2 $14, $1 \n" /* MMU_MODE <= DTLB ON */ 154 "lb $10, 0($12) \n" /* read char from user space */ 155 "mtc2 $15, $1 \n" /* restore MMU_MODE */ 156 "sb $10, 0($13) \n" /* store char to kernel space */ 157 "beq $13, $0, 2f \n" /* exit if char = 0 */ 158 "addi $11, $11, -1 \n" /* decrement count */ 159 "addi $12, $12, 1 \n" /* increment u_src pointer */ 160 "beq $11, $0, 2f \n" /* exit if count == 0 */ 161 "addi $13, $13, 1 \n" /* increment k_src pointer */ 162 "j 1b \n" /* jump to next iteration */ 163 "2: \n" 174 164 "nop \n" 175 : : "r"( src ) , "r"( dst ) : "$13","$14","$15", "memory" ); 176 177 hal_restore_irq( save_sr ); 178 179 return 0; 165 ".set reorder \n" 166 : 167 : "r"(size),"r"(src),"r"(dst) 168 : "$10","$11","$12","$13","$14","$15" ); 169 170 hal_restore_irq( save_sr ); 171 180 172 } // hal_strcpy_from_uspace() 181 173 182 174 //////////////////////////////////////////// 183 error_t hal_strcpy_to_uspace( char * u_dst, 184 char * k_src, 185 uint32_t max_size ) 186 { 187 188 // TODO implement the max_size handling, and error handling 189 190 uint32_t save_sr; 175 void hal_strcpy_to_uspace( char * u_dst, 176 char * k_src, 177 uint32_t size ) 178 { 179 uint32_t save_sr; 180 191 181 uint32_t src = (uint32_t)k_src; 192 182 uint32_t dst = (uint32_t)u_dst; … … 194 184 hal_disable_irq( &save_sr ); 195 185 196 // loop on characters while non NUL186 // loop on characters while ( (character != NUL) and (count < size) ) 197 187 asm volatile( 198 "mfc2 $15, $1 \n" /* save current MMU_MODE */ 199 "1: \n" /* loop entry */ 200 "lb $13, 0(%0) \n" /* read char from kernel space */ 201 "ori $14, $0, 0x7 \n" 202 "mtc2 $14, $1 \n" /* MMU_MODE <= DTLB ON */ 203 "sb $13, 0(%1) \n" /* store char to user space */ 204 "mtc2 $15, $1 \n" /* restore MMU_MODE */ 205 "addi %0, %0, 1 \n" /* increment SRC pointer */ 206 "addi %1, %1, 1 \n" /* increment DST pointer */ 207 "bne $13, $0, 1b \n" /* test NUL */ 188 ".set noreorder \n" 189 "move $11, %0 \n" /* $11 <= count == size */ 190 "move $12, %1 \n" /* $12 <= k_src */ 191 "move $13, %2 \n" /* $13 <= u_dst */ 192 "mfc2 $15, $1 \n" /* $15 <= MMU_MODE */ 193 "ori $14, $15, 0x7 \n" /* $14 <= mode DTLB on */ 194 "1: \n" 195 "lb $10, 0($12) \n" /* read char from kernel space */ 196 "mtc2 $14, $1 \n" /* MMU_MODE <= DTLB ON */ 197 "sb $10, 0($13) \n" /* store char to user space */ 198 "mtc2 $15, $1 \n" /* restore MMU_MODE */ 199 "beq $13, $0, 2f \n" /* exit if char == 0 */ 200 "addi $11, $11, -1 \n" /* decrement count */ 201 "addi $12, $12, 1 \n" /* increment k_src pointer */ 202 "beq $11, $0, 2f \n" /* exit if count == size */ 203 "addi $13, $13, 1 \n" /* increment u_src pointer */ 204 "j 1b \n" /* jump to next iteration */ 205 "2: \n" 208 206 "nop \n" 209 : : "r"( src ) , "r"( dst ) : "$13","$14","$15", "memory" ); 210 211 hal_restore_irq( save_sr ); 212 213 return 0; 207 ".set reorder \n" 208 : 209 : "r"(size),"r"(src),"r"(dst) 210 : "$10","$11","$12","$13","$14","$15" ); 211 212 hal_restore_irq( save_sr ); 213 214 214 } // hal_strcpy_to_uspace() 215 215 … … 218 218 { 219 219 uint32_t save_sr; 220 uint32_t str = (uint32_t)u_str; 221 uint32_t count = 0; 220 uint32_t count = 0; 221 222 uint32_t str = (uint32_t)u_str; 222 223 223 224 hal_disable_irq( &save_sr ); 224 225 225 226 asm volatile( 226 " ori $15, %0, 0 \n" /* $15 <= count */227 ".set noreorder \n" 227 228 "ori $13, %1, 0 \n" /* $13 <= str */ 228 229 "mfc2 $15, $1 \n" /* save MMU_MODE */ 230 "ori $14, $0, 0x7 \n" /* $14 <= mode DTLB on */ 231 "mtc2 $14, $1 \n" /* MMU_MODE <= DTLB ON */ 232 229 "mfc2 $15, $1 \n" /* $15 <= MMU_MODE */ 230 "ori $14, $15, 0x7 \n" /* $14 <= mode DTLB on */ 231 "mtc2 $14, $1 \n" /* MMU_MODE <= DTLB ON */ 233 232 "1: \n" 234 "lb $1 3, 0(%0) \n" /* read char from kernel space*/233 "lb $12, 0($13) \n" /* read char from user space */ 235 234 "addi $13, $13, 1 \n" /* increment address */ 236 "bne $13, $0, 1b \n" /* loop until NUL found */ 237 "addi $15, $15, 1 \n" /* increment counter */ 238 239 "mtc2 $14, $1 \n" /* restore MMU_MODE */ 240 : "+r"(count) : "r"(str) : "$13","$14","$15" ); 235 "bne $12, $0, 1b \n" /* loop until NUL found */ 236 "addi %0, %0, 1 \n" /* increment count */ 237 "mtc2 $15, $1 \n" /* restore MMU_MODE */ 238 ".set reorder \n" 239 : "+r"(count) 240 : "r"(str) 241 : "$12","$13","$14","$15" ); 241 242 242 243 hal_restore_irq( save_sr );
Note: See TracChangeset
for help on using the changeset viewer.