Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1692 → Rev 1693

/kernel/trunk/generic/include/ipc/ipc.h
121,8 → 121,6
* is hung up
*/
#define IPC_M_PHONE_HUNGUP 3
/** Interrupt notification */
#define IPC_M_INTERRUPT 4
 
/** Send as_area over IPC
* - ARG1 - src base address
/kernel/trunk/generic/include/ipc/irq.h
57,6 → 57,7
irq_cmd_type cmd;
void *addr;
unsigned long long value;
int dstarg;
} irq_cmd_t;
 
typedef struct {
71,7 → 72,7
extern void ipc_irq_make_table(int irqcount);
extern int ipc_irq_register(answerbox_t *box, int irq, irq_code_t *ucode);
extern void ipc_irq_send_notif(int irq);
extern void ipc_irq_send_msg(int irq, __native a2, __native a3);
extern void ipc_irq_send_msg(int irq, __native a1, __native a2, __native a3);
extern void ipc_irq_unregister(answerbox_t *box, int irq);
extern void irq_ipc_bind_arch(__native irq);
extern void ipc_irq_cleanup(answerbox_t *box);
/kernel/trunk/generic/src/console/klog.c
78,7 → 78,7
if (ret >= klogsize)
goto out;
}
ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret);
ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret, 0);
klogpos += ret;
if (klogpos >= klogsize)
klogpos = 0;
/kernel/trunk/generic/src/ipc/sysipc.c
518,7 → 518,12
 
if (call->flags & IPC_CALL_NOTIF) {
ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC));
STRUCT_TO_USPACE(&calldata->args, &call->data.args);
 
/* Set in_phone_hash to the interrupt counter */
call->data.phone = (void *)call->private;
STRUCT_TO_USPACE(calldata, &call->data);
 
ipc_call_free(call);
return ((__native)call) | IPC_CALLID_NOTIFICATION;
/kernel/trunk/generic/src/ipc/irq.c
34,10 → 34,11
* (read/write port/memory, add information to notification ipc message).
*
* The structure of a notification message is as follows:
* - METHOD: IPC_M_INTERRUPT
* - ARG1: interrupt number
* - ARG2: payload modified by a 'top-half' handler
* - ARG3: interrupt counter (may be needed to assure correct order
* - METHOD: interrupt number
* - ARG1: payload modified by a 'top-half' handler
* - ARG2: payload
* - ARG3: payload
* - in_phone_hash: interrupt counter (may be needed to assure correct order
* in multithreaded drivers)
*/
 
66,6 → 67,7
static void code_execute(call_t *call, irq_code_t *code)
{
int i;
__native dstval = 0;
if (!code)
return;
73,16 → 75,16
for (i=0; i < code->cmdcount;i++) {
switch (code->cmds[i].cmd) {
case CMD_MEM_READ_1:
IPC_SET_ARG2(call->data, *((__u8 *)code->cmds[i].addr));
dstval = *((__u8 *)code->cmds[i].addr);
break;
case CMD_MEM_READ_2:
IPC_SET_ARG2(call->data, *((__u16 *)code->cmds[i].addr));
dstval = *((__u16 *)code->cmds[i].addr);
break;
case CMD_MEM_READ_4:
IPC_SET_ARG2(call->data, *((__u32 *)code->cmds[i].addr));
dstval = *((__u32 *)code->cmds[i].addr);
break;
case CMD_MEM_READ_8:
IPC_SET_ARG2(call->data, *((__u64 *)code->cmds[i].addr));
dstval = *((__u64 *)code->cmds[i].addr);
break;
case CMD_MEM_WRITE_1:
*((__u8 *)code->cmds[i].addr) = code->cmds[i].value;
98,7 → 100,7
break;
#if defined(ia32) || defined(amd64)
case CMD_PORT_READ_1:
IPC_SET_ARG2(call->data, inb((long)code->cmds[i].addr));
dstval = inb((long)code->cmds[i].addr);
break;
case CMD_PORT_WRITE_1:
outb((long)code->cmds[i].addr, code->cmds[i].value);
106,17 → 108,20
#endif
#if defined(ia64)
case CMD_IA64_GETCHAR:
IPC_SET_ARG2(call->data, _getc(&ski_uconsole));
dstval = _getc(&ski_uconsole);
break;
#endif
#if defined(ppc32)
case CMD_PPC32_GETCHAR:
IPC_SET_ARG2(call->data, cuda_get_scancode());
dstval = cuda_get_scancode();
break;
#endif
default:
break;
}
if (code->cmds[i].dstarg && code->cmds[i].dstarg < 4) {
call->data.args[code->cmds[i].dstarg] = dstval;
}
}
}
 
224,7 → 229,7
/** Send notification message
*
*/
void ipc_irq_send_msg(int irq, __native a2, __native a3)
void ipc_irq_send_msg(int irq, __native a1, __native a2, __native a3)
{
call_t *call;
int mq = irq + IPC_IRQ_RESERVED_VIRTUAL;
238,10 → 243,12
return;
}
call->flags |= IPC_CALL_NOTIF;
IPC_SET_METHOD(call->data, IPC_M_INTERRUPT);
IPC_SET_ARG1(call->data, irq);
IPC_SET_METHOD(call->data, irq);
IPC_SET_ARG1(call->data, a1);
IPC_SET_ARG2(call->data, a2);
IPC_SET_ARG3(call->data, a3);
/* Put a counter to the message */
call->private = atomic_preinc(&irq_conns[mq].counter);
send_call(mq, call);
}
267,9 → 274,10
return;
}
call->flags |= IPC_CALL_NOTIF;
IPC_SET_METHOD(call->data, IPC_M_INTERRUPT);
IPC_SET_ARG1(call->data, irq);
IPC_SET_ARG3(call->data, atomic_preinc(&irq_conns[mq].counter));
/* Put a counter to the message */
call->private = atomic_preinc(&irq_conns[mq].counter);
/* Set up args */
IPC_SET_METHOD(call->data, irq);
 
/* Execute code to handle irq */
code_execute(call, irq_conns[mq].code);