Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1693 → Rev 1692

/kernel/trunk/generic/src/ipc/sysipc.c
518,12 → 518,7
 
if (call->flags & IPC_CALL_NOTIF) {
ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC));
 
/* Set in_phone_hash to the interrupt counter */
call->data.phone = (void *)call->private;
STRUCT_TO_USPACE(calldata, &call->data);
 
STRUCT_TO_USPACE(&calldata->args, &call->data.args);
ipc_call_free(call);
return ((__native)call) | IPC_CALLID_NOTIFICATION;
/kernel/trunk/generic/src/ipc/irq.c
34,11 → 34,10
* (read/write port/memory, add information to notification ipc message).
*
* The structure of a notification message is as follows:
* - 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
* - 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
* in multithreaded drivers)
*/
 
67,7 → 66,6
static void code_execute(call_t *call, irq_code_t *code)
{
int i;
__native dstval = 0;
if (!code)
return;
75,16 → 73,16
for (i=0; i < code->cmdcount;i++) {
switch (code->cmds[i].cmd) {
case CMD_MEM_READ_1:
dstval = *((__u8 *)code->cmds[i].addr);
IPC_SET_ARG2(call->data, *((__u8 *)code->cmds[i].addr));
break;
case CMD_MEM_READ_2:
dstval = *((__u16 *)code->cmds[i].addr);
IPC_SET_ARG2(call->data, *((__u16 *)code->cmds[i].addr));
break;
case CMD_MEM_READ_4:
dstval = *((__u32 *)code->cmds[i].addr);
IPC_SET_ARG2(call->data, *((__u32 *)code->cmds[i].addr));
break;
case CMD_MEM_READ_8:
dstval = *((__u64 *)code->cmds[i].addr);
IPC_SET_ARG2(call->data, *((__u64 *)code->cmds[i].addr));
break;
case CMD_MEM_WRITE_1:
*((__u8 *)code->cmds[i].addr) = code->cmds[i].value;
100,7 → 98,7
break;
#if defined(ia32) || defined(amd64)
case CMD_PORT_READ_1:
dstval = inb((long)code->cmds[i].addr);
IPC_SET_ARG2(call->data, inb((long)code->cmds[i].addr));
break;
case CMD_PORT_WRITE_1:
outb((long)code->cmds[i].addr, code->cmds[i].value);
108,20 → 106,17
#endif
#if defined(ia64)
case CMD_IA64_GETCHAR:
dstval = _getc(&ski_uconsole);
IPC_SET_ARG2(call->data, _getc(&ski_uconsole));
break;
#endif
#if defined(ppc32)
case CMD_PPC32_GETCHAR:
dstval = cuda_get_scancode();
IPC_SET_ARG2(call->data, 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;
}
}
}
 
229,7 → 224,7
/** Send notification message
*
*/
void ipc_irq_send_msg(int irq, __native a1, __native a2, __native a3)
void ipc_irq_send_msg(int irq, __native a2, __native a3)
{
call_t *call;
int mq = irq + IPC_IRQ_RESERVED_VIRTUAL;
243,12 → 238,10
return;
}
call->flags |= IPC_CALL_NOTIF;
IPC_SET_METHOD(call->data, irq);
IPC_SET_ARG1(call->data, a1);
IPC_SET_METHOD(call->data, IPC_M_INTERRUPT);
IPC_SET_ARG1(call->data, irq);
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);
}
274,10 → 267,9
return;
}
call->flags |= IPC_CALL_NOTIF;
/* Put a counter to the message */
call->private = atomic_preinc(&irq_conns[mq].counter);
/* Set up args */
IPC_SET_METHOD(call->data, irq);
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));
 
/* Execute code to handle irq */
code_execute(call, irq_conns[mq].code);
/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, 0);
ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret);
klogpos += ret;
if (klogpos >= klogsize)
klogpos = 0;
/kernel/trunk/generic/include/ipc/ipc.h
121,6 → 121,8
* 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,7 → 57,6
irq_cmd_type cmd;
void *addr;
unsigned long long value;
int dstarg;
} irq_cmd_t;
 
typedef struct {
72,7 → 71,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 a1, __native a2, __native a3);
extern void ipc_irq_send_msg(int irq, __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);