forked from PAWPAW-Mirror/lib_xua
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
|
#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
|
/* 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 */
|
* 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;
|
//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) \
|
#define do_interrupt_handler(f,args) \
|
||||||
asm("bu .L__" #f "_handler_skip;\n" \
|
asm(ISSUE_MODE_SINGLE\
|
||||||
".align 4\n" \
|
".align 4\n" \
|
||||||
"__" #f "_handler:\n" \
|
"__" #f "_handler:\n" \
|
||||||
|
"ENTSP_lu6 0\n" \
|
||||||
"kentsp " #args " + 19\n" \
|
"kentsp " #args " + 19\n" \
|
||||||
"__kent:" \
|
"__kent:" \
|
||||||
save_state(f,args) \
|
save_state(f,args) \
|
||||||
@@ -155,19 +164,24 @@
|
|||||||
restore_state(f,args) \
|
restore_state(f,args) \
|
||||||
"krestsp " #args " + 19 \n" \
|
"krestsp " #args " + 19 \n" \
|
||||||
"__kret:\n" \
|
"__kret:\n" \
|
||||||
"kret\n" \
|
"kret\n");
|
||||||
".L__" #f "_handler_skip:\n");
|
|
||||||
|
|
||||||
#define set_interrupt_handler(f, nstackwords, args, c, ...) \
|
#define register_interrupt_handler(f, args, nstackwords) \
|
||||||
asm (" .section .dp.data, \"adw\", @progbits\n" \
|
asm (" .section .dp.data, \"adw\", @progbits\n" \
|
||||||
|
" .globl __" #f "_kernel_stack_end\n" \
|
||||||
|
" .globl __" #f "_handler\n" \
|
||||||
" .align 8\n" \
|
" .align 8\n" \
|
||||||
"__" #f "_kernel_stack%=:\n" \
|
"__" #f "_kernel_stack:\n" \
|
||||||
" .space " #nstackwords ", 0\n" \
|
" .space " #nstackwords ", 0\n" \
|
||||||
" .text\n" \
|
"__" #f "_kernel_stack_end:\n" \
|
||||||
"mov r10, %0; ldaw r11, dp[__" #f "_kernel_stack%=];add r11, r11, r10;ldaw r10, sp[0]; "\
|
" .space 2\n"\
|
||||||
"set sp,r11;stw r10, sp[0]; krestsp 0"::"r"(nstackwords-8):"r10","r11"); \
|
" .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__) \
|
store_args ## args(c, __VA_ARGS__) \
|
||||||
do_interrupt_handler(f, args) \
|
|
||||||
asm("ldap r11, __" #f "_handler; setv res[%0],r11"::"r"(c):"r11"); \
|
asm("ldap r11, __" #f "_handler; setv res[%0],r11"::"r"(c):"r11"); \
|
||||||
asm("setc res[%0], 0xa; eeu res[%0]"::"r"(c)); \
|
asm("setc res[%0], 0xa; eeu res[%0]"::"r"(c)); \
|
||||||
asm("setsr (((0) & ~(((1 << 0x1) - 1) << 0x1)) | (((1) << 0x1) & (((1 << 0x1) - 1) << 0x1)))");
|
asm("setsr (((0) & ~(((1 << 0x1) - 1) << 0x1)) | (((1) << 0x1) & (((1 << 0x1) - 1) << 0x1)))");
|
||||||
|
|||||||
Reference in New Issue
Block a user