Fixes to decouple interrupt for dual-issue compatibility purposes.

This commit is contained in:
Ross Owen
2015-04-09 14:55:39 +01:00
parent 31bae905ee
commit 37e73cde48
3 changed files with 29 additions and 12 deletions

View File

@@ -648,7 +648,7 @@ void decouple(chanend c_mix_out
}
#endif
set_interrupt_handler(handle_audio_request, 200, 1, c_mix_out, 0);
set_interrupt_handler(handle_audio_request, 1, c_mix_out, 0);
/* Wait for usb_buffer() to set up globals for us to use
* Note: assumed that buffer_aud_ctl_chan is also setup before these globals are !0 */

View File

@@ -0,0 +1,3 @@
#include <interrupt.h>
register_interrupt_handler(handle_audio_request, 1, 200)

View File

@@ -143,10 +143,19 @@
//int ksp_enter, ksp_exit, r11_store;
#ifdef __XS2A__
#define ISSUE_MODE_SINGLE ".issue_mode single\n"
#define ISSUE_MODE_DUAL ".issue_mode dual\n"
#else
#define ISSUE_MODE_SINGLE
#define ISSUE_MODE_DUAL
#endif
#define do_interrupt_handler(f,args) \
asm("bu .L__" #f "_handler_skip;\n" \
asm(ISSUE_MODE_SINGLE\
".align 4\n" \
"__" #f "_handler:\n" \
"ENTSP_lu6 0\n" \
"kentsp " #args " + 19\n" \
"__kent:" \
save_state(f,args) \
@@ -155,19 +164,24 @@
restore_state(f,args) \
"krestsp " #args " + 19 \n" \
"__kret:\n" \
"kret\n" \
".L__" #f "_handler_skip:\n");
"kret\n");
#define set_interrupt_handler(f, nstackwords, args, c, ...) \
asm (" .section .dp.data, \"adw\", @progbits\n" \
" .align 8\n" \
"__" #f "_kernel_stack%=:\n" \
#define register_interrupt_handler(f, args, nstackwords) \
asm (" .section .dp.data, \"adw\", @progbits\n" \
" .globl __" #f "_kernel_stack_end\n" \
" .globl __" #f "_handler\n" \
" .align 8\n" \
"__" #f "_kernel_stack:\n" \
" .space " #nstackwords ", 0\n" \
" .text\n" \
"mov r10, %0; ldaw r11, dp[__" #f "_kernel_stack%=];add r11, r11, r10;ldaw r10, sp[0]; "\
"set sp,r11;stw r10, sp[0]; krestsp 0"::"r"(nstackwords-8):"r10","r11"); \
"__" #f "_kernel_stack_end:\n" \
" .space 2\n"\
" .text\n"); \
do_interrupt_handler(f, args)
#define set_interrupt_handler(f, args, c, ...) \
asm("ldaw r11, dp[__" #f "_kernel_stack_end];ldaw r10, sp[0]; " \
"set sp,r11;stw r10, sp[0]; krestsp 0":::"r10","r11"); \
store_args ## args(c, __VA_ARGS__) \
do_interrupt_handler(f, args) \
asm("ldap r11, __" #f "_handler; setv res[%0],r11"::"r"(c):"r11"); \
asm("setc res[%0], 0xa; eeu res[%0]"::"r"(c)); \
asm("setsr (((0) & ~(((1 << 0x1) - 1) << 0x1)) | (((1) << 0x1) & (((1 << 0x1) - 1) << 0x1)))");