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

uhid.h (4655B)


      1/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
      2#ifndef __UHID_H_
      3#define __UHID_H_
      4
      5/*
      6 * User-space I/O driver support for HID subsystem
      7 * Copyright (c) 2012 David Herrmann
      8 */
      9
     10/*
     11 * This program is free software; you can redistribute it and/or modify it
     12 * under the terms of the GNU General Public License as published by the Free
     13 * Software Foundation; either version 2 of the License, or (at your option)
     14 * any later version.
     15 */
     16
     17/*
     18 * Public header for user-space communication. We try to keep every structure
     19 * aligned but to be safe we also use __attribute__((__packed__)). Therefore,
     20 * the communication should be ABI compatible even between architectures.
     21 */
     22
     23#include <linux/input.h>
     24#include <linux/types.h>
     25#include <linux/hid.h>
     26
     27enum uhid_event_type {
     28	__UHID_LEGACY_CREATE,
     29	UHID_DESTROY,
     30	UHID_START,
     31	UHID_STOP,
     32	UHID_OPEN,
     33	UHID_CLOSE,
     34	UHID_OUTPUT,
     35	__UHID_LEGACY_OUTPUT_EV,
     36	__UHID_LEGACY_INPUT,
     37	UHID_GET_REPORT,
     38	UHID_GET_REPORT_REPLY,
     39	UHID_CREATE2,
     40	UHID_INPUT2,
     41	UHID_SET_REPORT,
     42	UHID_SET_REPORT_REPLY,
     43};
     44
     45struct uhid_create2_req {
     46	__u8 name[128];
     47	__u8 phys[64];
     48	__u8 uniq[64];
     49	__u16 rd_size;
     50	__u16 bus;
     51	__u32 vendor;
     52	__u32 product;
     53	__u32 version;
     54	__u32 country;
     55	__u8 rd_data[HID_MAX_DESCRIPTOR_SIZE];
     56} __attribute__((__packed__));
     57
     58enum uhid_dev_flag {
     59	UHID_DEV_NUMBERED_FEATURE_REPORTS			= (1ULL << 0),
     60	UHID_DEV_NUMBERED_OUTPUT_REPORTS			= (1ULL << 1),
     61	UHID_DEV_NUMBERED_INPUT_REPORTS				= (1ULL << 2),
     62};
     63
     64struct uhid_start_req {
     65	__u64 dev_flags;
     66};
     67
     68#define UHID_DATA_MAX 4096
     69
     70enum uhid_report_type {
     71	UHID_FEATURE_REPORT,
     72	UHID_OUTPUT_REPORT,
     73	UHID_INPUT_REPORT,
     74};
     75
     76struct uhid_input2_req {
     77	__u16 size;
     78	__u8 data[UHID_DATA_MAX];
     79} __attribute__((__packed__));
     80
     81struct uhid_output_req {
     82	__u8 data[UHID_DATA_MAX];
     83	__u16 size;
     84	__u8 rtype;
     85} __attribute__((__packed__));
     86
     87struct uhid_get_report_req {
     88	__u32 id;
     89	__u8 rnum;
     90	__u8 rtype;
     91} __attribute__((__packed__));
     92
     93struct uhid_get_report_reply_req {
     94	__u32 id;
     95	__u16 err;
     96	__u16 size;
     97	__u8 data[UHID_DATA_MAX];
     98} __attribute__((__packed__));
     99
    100struct uhid_set_report_req {
    101	__u32 id;
    102	__u8 rnum;
    103	__u8 rtype;
    104	__u16 size;
    105	__u8 data[UHID_DATA_MAX];
    106} __attribute__((__packed__));
    107
    108struct uhid_set_report_reply_req {
    109	__u32 id;
    110	__u16 err;
    111} __attribute__((__packed__));
    112
    113/*
    114 * Compat Layer
    115 * All these commands and requests are obsolete. You should avoid using them in
    116 * new code. We support them for backwards-compatibility, but you might not get
    117 * access to new feature in case you use them.
    118 */
    119
    120enum uhid_legacy_event_type {
    121	UHID_CREATE			= __UHID_LEGACY_CREATE,
    122	UHID_OUTPUT_EV			= __UHID_LEGACY_OUTPUT_EV,
    123	UHID_INPUT			= __UHID_LEGACY_INPUT,
    124	UHID_FEATURE			= UHID_GET_REPORT,
    125	UHID_FEATURE_ANSWER		= UHID_GET_REPORT_REPLY,
    126};
    127
    128/* Obsolete! Use UHID_CREATE2. */
    129struct uhid_create_req {
    130	__u8 name[128];
    131	__u8 phys[64];
    132	__u8 uniq[64];
    133	__u8 __user *rd_data;
    134	__u16 rd_size;
    135
    136	__u16 bus;
    137	__u32 vendor;
    138	__u32 product;
    139	__u32 version;
    140	__u32 country;
    141} __attribute__((__packed__));
    142
    143/* Obsolete! Use UHID_INPUT2. */
    144struct uhid_input_req {
    145	__u8 data[UHID_DATA_MAX];
    146	__u16 size;
    147} __attribute__((__packed__));
    148
    149/* Obsolete! Kernel uses UHID_OUTPUT exclusively now. */
    150struct uhid_output_ev_req {
    151	__u16 type;
    152	__u16 code;
    153	__s32 value;
    154} __attribute__((__packed__));
    155
    156/* Obsolete! Kernel uses ABI compatible UHID_GET_REPORT. */
    157struct uhid_feature_req {
    158	__u32 id;
    159	__u8 rnum;
    160	__u8 rtype;
    161} __attribute__((__packed__));
    162
    163/* Obsolete! Use ABI compatible UHID_GET_REPORT_REPLY. */
    164struct uhid_feature_answer_req {
    165	__u32 id;
    166	__u16 err;
    167	__u16 size;
    168	__u8 data[UHID_DATA_MAX];
    169} __attribute__((__packed__));
    170
    171/*
    172 * UHID Events
    173 * All UHID events from and to the kernel are encoded as "struct uhid_event".
    174 * The "type" field contains a UHID_* type identifier. All payload depends on
    175 * that type and can be accessed via ev->u.XYZ accordingly.
    176 * If user-space writes short events, they're extended with 0s by the kernel. If
    177 * the kernel writes short events, user-space shall extend them with 0s.
    178 */
    179
    180struct uhid_event {
    181	__u32 type;
    182
    183	union {
    184		struct uhid_create_req create;
    185		struct uhid_input_req input;
    186		struct uhid_output_req output;
    187		struct uhid_output_ev_req output_ev;
    188		struct uhid_feature_req feature;
    189		struct uhid_get_report_req get_report;
    190		struct uhid_feature_answer_req feature_answer;
    191		struct uhid_get_report_reply_req get_report_reply;
    192		struct uhid_create2_req create2;
    193		struct uhid_input2_req input2;
    194		struct uhid_set_report_req set_report;
    195		struct uhid_set_report_reply_req set_report_reply;
    196		struct uhid_start_req start;
    197	} u;
    198} __attribute__((__packed__));
    199
    200#endif /* __UHID_H_ */