Fixes to decouple interrupt for dual-issue compatibility purposes.
This commit is contained in:
@@ -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 */
|
||||
|
||||
3
module_usb_audio/usb_buffer/decouple_interrupt.c
Normal file
3
module_usb_audio/usb_buffer/decouple_interrupt.c
Normal file
@@ -0,0 +1,3 @@
|
||||
#include <interrupt.h>
|
||||
|
||||
register_interrupt_handler(handle_audio_request, 1, 200)
|
||||
@@ -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)))");
|
||||
|
||||
Reference in New Issue
Block a user