cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

irq_kern.h (2757B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
      4 */
      5
      6#ifndef __IRQ_KERN_H__
      7#define __IRQ_KERN_H__
      8
      9#include <linux/interrupt.h>
     10#include <linux/time-internal.h>
     11#include <asm/ptrace.h>
     12#include "irq_user.h"
     13
     14#define UM_IRQ_ALLOC	-1
     15
     16int um_request_irq(int irq, int fd, enum um_irq_type type,
     17		   irq_handler_t handler, unsigned long irqflags,
     18		   const char *devname, void *dev_id);
     19
     20#ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
     21/**
     22 * um_request_irq_tt - request an IRQ with timetravel handler
     23 *
     24 * @irq: the IRQ number, or %UM_IRQ_ALLOC
     25 * @fd: The file descriptor to request an IRQ for
     26 * @type: read or write
     27 * @handler: the (generic style) IRQ handler
     28 * @irqflags: Linux IRQ flags
     29 * @devname: name for this to show
     30 * @dev_id: data pointer to pass to the IRQ handler
     31 * @timetravel_handler: the timetravel interrupt handler, invoked with the IRQ
     32 *	number, fd, dev_id and time-travel event pointer.
     33 *
     34 * Returns: The interrupt number assigned or a negative error.
     35 *
     36 * Note that the timetravel handler is invoked only if the time_travel_mode is
     37 * %TT_MODE_EXTERNAL, and then it is invoked even while the system is suspended!
     38 * This function must call time_travel_add_irq_event() for the event passed with
     39 * an appropriate delay, before sending an ACK on the socket it was invoked for.
     40 *
     41 * If this was called while the system is suspended, then adding the event will
     42 * cause the system to resume.
     43 *
     44 * Since this function will almost certainly have to handle the FD's condition,
     45 * a read will consume the message, and after that it is up to the code using
     46 * it to pass such a message to the @handler in whichever way it can.
     47 *
     48 * If time_travel_mode is not %TT_MODE_EXTERNAL the @timetravel_handler will
     49 * not be invoked at all and the @handler must handle the FD becoming
     50 * readable (or writable) instead. Use um_irq_timetravel_handler_used() to
     51 * distinguish these cases.
     52 *
     53 * See virtio_uml.c for an example.
     54 */
     55int um_request_irq_tt(int irq, int fd, enum um_irq_type type,
     56		      irq_handler_t handler, unsigned long irqflags,
     57		      const char *devname, void *dev_id,
     58		      void (*timetravel_handler)(int, int, void *,
     59						 struct time_travel_event *));
     60#else
     61static inline
     62int um_request_irq_tt(int irq, int fd, enum um_irq_type type,
     63		      irq_handler_t handler, unsigned long irqflags,
     64		      const char *devname, void *dev_id,
     65		      void (*timetravel_handler)(int, int, void *,
     66						 struct time_travel_event *))
     67{
     68	return um_request_irq(irq, fd, type, handler, irqflags,
     69			      devname, dev_id);
     70}
     71#endif
     72
     73static inline bool um_irq_timetravel_handler_used(void)
     74{
     75	return time_travel_mode == TT_MODE_EXTERNAL;
     76}
     77
     78void um_free_irq(int irq, void *dev_id);
     79#endif