Changeset 8820544 in mainline for kernel


Ignore:
Timestamp:
2014-08-16T00:02:04Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
35b8bfe, 8cd680c
Parents:
83f29e0
Message:

support for kernel notification multiplexing in the async framework

  • rename SYS_EVENT_* and SYS_IRQ_* syscalls to unify the terminology
  • add SYS_IPC_EVENT_UNSUBSCRIBE
  • remove IRQ handler multiplexing from DDF, the generic mechanism replaces it (unfortunatelly the order of arguments used by interrupt_handler_t needs to be permutated to align with the async framework conventions)
Location:
kernel/generic
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/ipc/event.h

    r83f29e0 r8820544  
    100100    sysarg_t, sysarg_t, sysarg_t);
    101101
    102 extern sysarg_t sys_event_subscribe(sysarg_t, sysarg_t);
    103 extern sysarg_t sys_event_unmask(sysarg_t);
     102extern sysarg_t sys_ipc_event_subscribe(sysarg_t, sysarg_t);
     103extern sysarg_t sys_ipc_event_unsubscribe(sysarg_t);
     104extern sysarg_t sys_ipc_event_unmask(sysarg_t);
    104105
    105106#endif
  • kernel/generic/include/ipc/irq.h

    r83f29e0 r8820544  
    4747#include <adt/list.h>
    4848
    49 extern int ipc_irq_register(answerbox_t *, inr_t, devno_t, sysarg_t,
     49extern int ipc_irq_subscribe(answerbox_t *, inr_t, devno_t, sysarg_t,
    5050    irq_code_t *);
    5151
     
    5353extern void ipc_irq_top_half_handler(irq_t *);
    5454
    55 extern int ipc_irq_unregister(answerbox_t *, inr_t, devno_t);
     55extern int ipc_irq_unsubscribe(answerbox_t *, inr_t, devno_t);
    5656extern void ipc_irq_cleanup(answerbox_t *);
    5757
  • kernel/generic/include/ipc/sysipc.h

    r83f29e0 r8820544  
    5353    unsigned int);
    5454extern sysarg_t sys_ipc_hangup(sysarg_t);
    55 extern sysarg_t sys_irq_register(inr_t, devno_t, sysarg_t, irq_code_t *);
    56 extern sysarg_t sys_irq_unregister(inr_t, devno_t);
     55
     56extern sysarg_t sys_ipc_irq_subscribe(inr_t, devno_t, sysarg_t, irq_code_t *);
     57extern sysarg_t sys_ipc_irq_unsubscribe(inr_t, devno_t);
    5758
    5859#ifdef __32_BITS__
  • kernel/generic/src/ipc/event.c

    r83f29e0 r8820544  
    5858}
    5959
    60 static event_t *evno2event(int evno, task_t *t)
     60static event_t *evno2event(int evno, task_t *task)
    6161{
    6262        ASSERT(evno < EVENT_TASK_END);
    63 
     63       
    6464        event_t *event;
    65 
     65       
    6666        if (evno < EVENT_END)
    6767                event = &events[(event_type_t) evno];
    6868        else
    69                 event = &t->events[(event_task_type_t) evno - EVENT_END];
    70 
     69                event = &task->events[(event_task_type_t) evno - EVENT_END];
     70       
    7171        return event;
    7272}
     
    8686                event_initialize(evno2event(i, task));
    8787}
    88 
    8988
    9089/** Unsubscribe kernel events associated with an answerbox
     
    260259{
    261260        int res;
    262 
     261       
    263262        spinlock_lock(&event->lock);
    264263       
     
    277276}
    278277
     278/** Unsubscribe event notifications
     279 *
     280 * @param evno      Event type.
     281 * @param answerbox Answerbox used to send the notifications to.
     282 *
     283 * @return EOK if the subscription was successful.
     284 * @return EEXISTS if the notifications of the given type are
     285 *         already subscribed.
     286 *
     287 */
     288static int event_unsubscribe(event_t *event, answerbox_t *answerbox)
     289{
     290        int res;
     291       
     292        spinlock_lock(&event->lock);
     293       
     294        if (event->answerbox == answerbox) {
     295                event->answerbox = NULL;
     296                event->counter = 0;
     297                event->imethod = 0;
     298                event->masked = false;
     299                res = EOK;
     300        } else
     301                res = ENOENT;
     302       
     303        spinlock_unlock(&event->lock);
     304       
     305        return res;
     306}
     307
    279308/** Unmask event notifications
    280309 *
     
    297326}
    298327
    299 /** Event notification syscall wrapper
     328/** Event notification subscription syscall wrapper
    300329 *
    301330 * @param evno    Event type to subscribe.
     
    309338 *
    310339 */
    311 sysarg_t sys_event_subscribe(sysarg_t evno, sysarg_t imethod)
     340sysarg_t sys_ipc_event_subscribe(sysarg_t evno, sysarg_t imethod)
    312341{
    313342        if (evno >= EVENT_TASK_END)
     
    316345        return (sysarg_t) event_subscribe(evno2event(evno, TASK),
    317346            (sysarg_t) imethod, &TASK->answerbox);
     347}
     348
     349/** Event notification unsubscription syscall wrapper
     350 *
     351 * @param evno    Event type to unsubscribe.
     352 *
     353 * @return EOK on success.
     354 * @return ELIMIT on unknown event type.
     355 * @return ENOENT if the notification of the given type is not
     356           subscribed.
     357 *
     358 */
     359sysarg_t sys_ipc_event_unsubscribe(sysarg_t evno)
     360{
     361        if (evno >= EVENT_TASK_END)
     362                return ELIMIT;
     363       
     364        return (sysarg_t) event_unsubscribe(evno2event(evno, TASK),
     365            &TASK->answerbox);
    318366}
    319367
     
    331379 *
    332380 */
    333 sysarg_t sys_event_unmask(sysarg_t evno)
     381sysarg_t sys_ipc_event_unmask(sysarg_t evno)
    334382{
    335383        if (evno >= EVENT_TASK_END)
  • kernel/generic/src/ipc/irq.c

    r83f29e0 r8820544  
    3636 * @brief IRQ notification framework.
    3737 *
    38  * This framework allows applications to register to receive a notification
     38 * This framework allows applications to subscribe to receive a notification
    3939 * when interrupt is detected. The application may provide a simple 'top-half'
    4040 * handler as part of its registration, which can perform simple operations
     
    4242 *
    4343 * The structure of a notification message is as follows:
    44  * - IMETHOD: interface and method as registered by
    45  *            the SYS_IRQ_REGISTER syscall
     44 * - IMETHOD: interface and method as set by the SYS_IPC_IRQ_SUBSCRIBE syscall
    4645 * - ARG1: payload modified by a 'top-half' handler (scratch[1])
    4746 * - ARG2: payload modified by a 'top-half' handler (scratch[2])
     
    5251 *                  in multithreaded drivers)
    5352 *
    54  * Note on synchronization for ipc_irq_register(), ipc_irq_unregister(),
     53 * Note on synchronization for ipc_irq_subscribe(), ipc_irq_unsubscribe(),
    5554 * ipc_irq_cleanup() and IRQ handlers:
    5655 *
     
    289288}
    290289
    291 /** Register an answerbox as a receiving end for IRQ notifications.
     290/** Subscribe an answerbox as a receiving end for IRQ notifications.
    292291 *
    293292 * @param box     Receiving answerbox.
     
    301300 *
    302301 */
    303 int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno,
     302int ipc_irq_subscribe(answerbox_t *box, inr_t inr, devno_t devno,
    304303    sysarg_t imethod, irq_code_t *ucode)
    305304{
     
    369368}
    370369
    371 /** Unregister task from IRQ notification.
     370/** Unsubscribe task from IRQ notification.
    372371 *
    373372 * @param box   Answerbox associated with the notification.
     
    378377 *
    379378 */
    380 int ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno)
     379int ipc_irq_unsubscribe(answerbox_t *box, inr_t inr, devno_t devno)
    381380{
    382381        sysarg_t key[] = {
     
    432431 *
    433432 * This function is effective because the answerbox contains
    434  * list of all irq_t structures that are registered to
     433 * list of all irq_t structures that are subscribed to
    435434 * send notifications to it.
    436435 *
  • kernel/generic/src/ipc/sysipc.c

    r83f29e0 r8820544  
    736736 * @param ucode   Uspace pointer to the top-half pseudocode.
    737737 *
    738  * @return EPERM or a return code returned by ipc_irq_register().
    739  *
    740  */
    741 sysarg_t sys_irq_register(inr_t inr, devno_t devno, sysarg_t imethod,
     738 * @return EPERM or a return code returned by ipc_irq_subscribe().
     739 *
     740 */
     741sysarg_t sys_ipc_irq_subscribe(inr_t inr, devno_t devno, sysarg_t imethod,
    742742    irq_code_t *ucode)
    743743{
     
    745745                return EPERM;
    746746       
    747         return ipc_irq_register(&TASK->answerbox, inr, devno, imethod, ucode);
     747        return ipc_irq_subscribe(&TASK->answerbox, inr, devno, imethod, ucode);
    748748}
    749749
     
    756756 *
    757757 */
    758 sysarg_t sys_irq_unregister(inr_t inr, devno_t devno)
     758sysarg_t sys_ipc_irq_unsubscribe(inr_t inr, devno_t devno)
    759759{
    760760        if (!(cap_get(TASK) & CAP_IRQ_REG))
    761761                return EPERM;
    762762       
    763         ipc_irq_unregister(&TASK->answerbox, inr, devno);
     763        ipc_irq_unsubscribe(&TASK->answerbox, inr, devno);
    764764       
    765765        return 0;
  • kernel/generic/src/syscall/syscall.c

    r83f29e0 r8820544  
    165165       
    166166        /* Event notification syscalls. */
    167         (syshandler_t) sys_event_subscribe,
    168         (syshandler_t) sys_event_unmask,
     167        (syshandler_t) sys_ipc_event_subscribe,
     168        (syshandler_t) sys_ipc_event_unsubscribe,
     169        (syshandler_t) sys_ipc_event_unmask,
    169170       
    170171        /* Capabilities related syscalls. */
     
    180181        (syshandler_t) sys_iospace_enable,
    181182        (syshandler_t) sys_iospace_disable,
    182         (syshandler_t) sys_irq_register,
    183         (syshandler_t) sys_irq_unregister,
     183       
     184        (syshandler_t) sys_ipc_irq_subscribe,
     185        (syshandler_t) sys_ipc_irq_unsubscribe,
    184186       
    185187        /* Sysinfo syscalls. */
Note: See TracChangeset for help on using the changeset viewer.