forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-09-20 cf4ce59b3b70238352c7f1729f0f7223214828ad
kernel/arch/nios2/kernel/entry.S
....@@ -185,6 +185,7 @@
185185 ldw r5, PT_R5(sp)
186186
187187 local_restart:
188
+ stw r2, PT_ORIG_R2(sp)
188189 /* Check that the requested system call is within limits */
189190 movui r1, __NR_syscalls
190191 bgeu r2, r1, ret_invsyscall
....@@ -192,7 +193,6 @@
192193 movhi r11, %hiadj(sys_call_table)
193194 add r1, r1, r11
194195 ldw r1, %lo(sys_call_table)(r1)
195
- beq r1, r0, ret_invsyscall
196196
197197 /* Check if we are being traced */
198198 GET_THREAD_INFO r11
....@@ -213,6 +213,9 @@
213213 translate_rc_and_ret:
214214 movi r1, 0
215215 bge r2, zero, 3f
216
+ ldw r1, PT_ORIG_R2(sp)
217
+ addi r1, r1, 1
218
+ beq r1, zero, 3f
216219 sub r2, zero, r2
217220 movi r1, 1
218221 3:
....@@ -255,9 +258,9 @@
255258 ldw r6, PT_R6(sp)
256259 ldw r7, PT_R7(sp)
257260
258
- /* Fetch the syscall function, we don't need to check the boundaries
259
- * since this is already done.
260
- */
261
+ /* Fetch the syscall function. */
262
+ movui r1, __NR_syscalls
263
+ bgeu r2, r1, traced_invsyscall
261264 slli r1, r2, 2
262265 movhi r11,%hiadj(sys_call_table)
263266 add r1, r1, r11
....@@ -276,6 +279,9 @@
276279 translate_rc_and_ret2:
277280 movi r1, 0
278281 bge r2, zero, 4f
282
+ ldw r1, PT_ORIG_R2(sp)
283
+ addi r1, r1, 1
284
+ beq r1, zero, 4f
279285 sub r2, zero, r2
280286 movi r1, 1
281287 4:
....@@ -286,6 +292,11 @@
286292 call do_syscall_trace_exit
287293 RESTORE_SWITCH_STACK
288294 br ret_from_exception
295
+
296
+ /* If the syscall number was invalid return ENOSYS */
297
+traced_invsyscall:
298
+ movi r2, -ENOSYS
299
+ br translate_rc_and_ret2
289300
290301 Luser_return:
291302 GET_THREAD_INFO r11 /* get thread_info pointer */
....@@ -336,9 +347,6 @@
336347 /* skip if no interrupt is pending */
337348 beq r12, r0, ret_from_interrupt
338349
339
- movi r24, -1
340
- stw r24, PT_ORIG_R2(sp)
341
-
342350 /*
343351 * Process an external hardware interrupt.
344352 */
....@@ -365,7 +373,7 @@
365373 ldw r1, PT_ESTATUS(sp) /* check if returning to kernel */
366374 TSTBNZ r1, r1, ESTATUS_EU, Luser_return
367375
368
-#ifdef CONFIG_PREEMPT
376
+#ifdef CONFIG_PREEMPTION
369377 GET_THREAD_INFO r1
370378 ldw r4, TI_PREEMPT_COUNT(r1)
371379 bne r4, r0, restore_all
....@@ -389,12 +397,10 @@
389397 */
390398 ENTRY(sys_clone)
391399 SAVE_SWITCH_STACK
392
- addi sp, sp, -4
393
- stw r7, 0(sp) /* Pass 5th arg thru stack */
394
- mov r7, r6 /* 4th arg is 3rd of clone() */
395
- mov r6, zero /* 3rd arg always 0 */
396
- call do_fork
397
- addi sp, sp, 4
400
+ subi sp, sp, 4 /* make space for tls pointer */
401
+ stw r8, 0(sp) /* pass tls pointer (r8) via stack (5th argument) */
402
+ call nios2_clone
403
+ addi sp, sp, 4
398404 RESTORE_SWITCH_STACK
399405 ret
400406