diff options
Diffstat (limited to 'src/exceptions/svc.S')
| -rw-r--r-- | src/exceptions/svc.S | 56 | 
1 files changed, 43 insertions, 13 deletions
| diff --git a/src/exceptions/svc.S b/src/exceptions/svc.S index 88716db..a95c7a6 100644 --- a/src/exceptions/svc.S +++ b/src/exceptions/svc.S @@ -6,20 +6,12 @@ svc:  	// Get the SVC Exception #  	ldr r0, [lr, #-4]  	bic r0, #0xFF000000 -	// Jump to the appropriate Call -	cmp r0, #5 +	cmp r0, #7 +	// Check it is within our defined SVC  	bgt svc_exit -	beq svc_000005 -	cmp r0, #4 -	beq svc_000004 -	cmp r0, #3 -	beq svc_000003 -	cmp r0, #2 -	beq svc_000002 -	cmp r0, #1 -	beq svc_000001 -	cmp r0, #0 -	beq svc_000000 +	//// Jump to the appropriate Call +	adr r3, svc_table +	ldr pc, [r3, r0, LSL #2]  svc_000000: // SYS_YIELD  	bl yield  	ldmfd sp!, {r0-r12,lr} @@ -79,5 +71,43 @@ svc_000005: // Release Lock  	ldmfd sp!, {r0-r12,lr}  	b schedule  	b svc_exit +svc_000006: // Semaphore decrease +	ldr r0, [sp, #0] // struct Semaphore* s +1:	clrex +	ldrex r2, [r0, #0] +	cmp r2, #0 +	beq svc_000006_delay_semaphore +	sub r1, r2, #1 +	strexeq r2, r1, [r0, #0] +	teq r2, #0 +	bne 1b +	dmb +	b svc_exit +svc_000006_delay_semaphore: +	bl sched_semaphore_yield +	ldmfd sp!, {r0-r12,lr} +	sub lr, #4 +	b schedule +svc_000007: // Semaphore increase +	ldr r0, [sp, #0] // struct Semaphore* s +1:	clrex +	ldrex r2, [r0, #0] +	add r1, r2, #1 +	strexeq r2, r1, [r0, #0] +	teq r2, #0 +	bne 1b +	dmb +	bl sched_semaphore_resurrect +	b svc_exit  svc_exit:  	ldmfd sp!, {r0-r12,pc}^ + +svc_table: +	.word svc_000000 +	.word svc_000001 +	.word svc_000002 +	.word svc_000003 +	.word svc_000004 +	.word svc_000005 +	.word svc_000006 +	.word svc_000007 | 
