文件管理 · 2022年7月25日

u32头文件linux|linux kernel 怎么读cpu写寄存器 inw

Ⅰ 如何将 ucgui移植到 linux上

关键修改代码记录:修改点1:注:为了使ucgui 适配 32 bit per pixsel typedef union { U32 aColorIndex8[2]; U32 aColorIndex16[2];} LCD_COLORINDEX_UNION;关键修改点2:注:此处修改主要是为适配linuxframbufferstruct fb_var_screeninfo g_vinfo;int g_fbfd, g_fbsize;unsigned char *g_fbbuf;void init_mmy_driver(void){/* Open video memory */if ((g_fbfd = open("/dev/fb0", O_RDWR)) < 0) { exit(1);

Ⅱ u32等类型是在哪个头文件中定义

#include//设定插入点#include//字符处理#include//定义错误码#include//浮点数处理#include//文件输入/输出回#include//参数化输入/输出#include//数据流输入/输出#include//定义各种数答据类型最值常量#include//定义本地化函数#include//定义数学函数#include//定义输入/输出函数#include//定义杂项函数及内存分配函数#include//字符串处理#include//基于数组的输入/输出#include//定义关于时间的函数#include//宽字符处理及输入/输出#include//宽字符分类

Ⅲ 在linux环境下,loff_t是一个什么类型啊具体定义在哪儿看到把

//Type of file sizes and offsets (LFS) __STD_TYPE __OFF64_T_TYPE __off64_t; typedef __off64_t __loff_t; typedef __loff_t loff_t; grep -rn loff_t /usr/include/ 可以搜到,ubuntu18.04 grep结果如下:/usr/include/x86_64-linux-gnu/sys/types.h:44:typedef __loff_t loff_t;/usr/include/x86_64-linux-gnu/sys/quota.h:117:#define dqoff(UID) ((loff_t)((UID) * sizeof (struct dqblk)))/usr/include/x86_64-linux-gnu/bits/types.h:190:typedef __off64_t __loff_t; /* Type of file sizes and offsets (LFS). */引用头方件stdlib.h就可以,可以认为是long int类型

Ⅳ 如何在Linux内核中为IPv6添加一种新的扩展头

IPv6头部的设计是一个简洁的基本头部后面根据需要加上多种不同类型的扩展头部,这种设计可以将不常用的功能通过选择性的添加不同的扩展头部实现,从而在保证了基本头部的简洁和处理的快速性。以Linux2.6.28版本内核为例,IPv6扩展首部的定义在Linux-2.6.28/include/linux/in6.h和linux-2.6.28/include/net/ipv6.h两个目录下,我们以添加一种IPPROTO_MY类型的扩展头为例:1、在头文件中添加新类型扩展头的定义,在linux-2.6.28/include/linux/in6.h中/** NextHeader field of IPv6 header*/#define NEXTHDR_HOP 0 /* Hop-by-hop option header. */#define NEXTHDR_TCP 6 /* TCP segment. */#define NEXTHDR_UDP 17 /* UDP message. */#define NEXTHDR_IPV6 41 /* IPv6 in IPv6 */#define NEXTHDR_ROUTING 43 /* Routing header. */#define NEXTHDR_FRAGMENT 44 /* Fragmentation/reassembly header. */#define NEXTHDR_ESP 50 /* Encapsulating security payload. */#define NEXTHDR_AUTH 51 /* Authentication header. */#define NEXTHDR_ICMP 58 /* ICMP for IPv6. */#define NEXTHDR_NONE 59 /* No next header */#define NEXTHDR_DEST 60 /* Destination options header. */#define NEXTHDR_MOBILITY 135 /* Mobility header. */#define IPPROTO_MY 200 /*自己定义的头部类型 */2、在linux-2.6.28/include/net/ipv6.h中定义结构体/** IPV6 extension headers*/#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */#define IPPROTO_ROUTING 43 /* IPv6 routing header */#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */#define IPPROTO_ICMPV6 58 /* ICMPv6 */#define IPPROTO_NONE 59 /* IPv6 no next header */#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */#define IPPROTO_MH 135 /* IPv6 mobility header */自己定义新的扩展头类型如:#define NEXTHDR_INDEX 200 /*IPv6 next header */自己定义新的扩展头类型:struct index_hdr{ /*index扩展头结构*/__u8 nexthdr;__u8 hdrlen;__u16 reserved;__u32 skb_index;};3、在需要添加头部和删除头部的源文件中添加添加和删除函数,届时直接调用这两个函数即可static void ip6_index_add(struct sk_buff *skb,unsigned char *data,unsigned int len){struct ipv6hdr *tmp_hdr;struct ipv6hdr *old_hdr;struct index_hdr *ih;u8 prevhdr;unsigned int hlen;unsigned int ilen;ilen=sizeof(struct index_hdr);hlen=sizeof(struct ipv6hdr);old_hdr=skb_network_header(skb);prevhdr=old_hdr->nexthdr;if(prevhdr!=200){old_hdr->nexthdr=NEXTHDR_INDEX;tmp_hdr = kmemp(skb_network_header(skb), hlen, GFP_ATOMIC);__skb_pull(skb, hlen); /*使data指针下移hlen长度,将ipv6头部去掉*/ih = (struct index_hdr*)__skb_push(skb, ilen); /*上移data指针,将index头部添加进去*/__skb_push(skb, hlen); /*继续上移data指针,将原来的ipv6头部加进去*/skb_reset_network_header(skb);memcpy(skb_network_header(skb), tmp_hdr, hlen);/*为index扩展头赋值*/ih->nexthdr = prevhdr;ih->hdrlen = 8;ih->reserved = 0;ih->skb_index = htonl(skb->xfrm_index);skb->truesize += ilen;ipv6_hdr(skb)->payload_len += ilen;data = skb->data;len = skb->len;kfree(tmp_hdr);}}static void ip6_index_del(struct sk_buff *skb,unsigned char *data,unsigned int len){struct ipv6hdr *tmp_hdr;struct ipv6hdr *old_hdr;struct index_hdr *ih;u8 prevhdr;unsigned int hlen;unsigned int ilen;ilen=sizeof(struct index_hdr);hlen=sizeof(struct ipv6hdr);if(ipv6_hdr(skb)->nexthdr == 200){tmp_hdr = kmemp(skb_network_header(skb), hlen, GFP_ATOMIC); /*保存ipv6头*/__skb_pull(skb, hlen); /*下移data指针,去掉ipv6头*/skb_reset_network_header(skb);ih=(struct index_hdr *)skb_network_header(skb);prevhdr = ih->nexthdr;tmp_hdr->nexthdr = prevhdr;__skb_pull(skb, ilen); /*下移data指针,去掉index扩展头*/__skb_push(skb, hlen); /*上移data指针,将原来的ipv6头添加回去*/skb_reset_network_header(skb);memcpy(skb_network_header(skb), tmp_hdr, hlen);skb_reset_network_header(skb);skb->truesize -= ilen;ipv6_hdr(skb)->payload_len -= ilen;kfree(tmp_hdr);}}

Ⅳ 程序中定义变量有时u8,u16,u32怎么选择

任意选择,u8是unsigned char,u16是unsigned short,u32是unsigned long。

U8、u16和u32都是C语言中的数据类型,分别表示8位、16位和32位长度的数据类型。一个字节是8位,所以u8是1字节,u16是2字节,u32是4字节。

可以在stm32库头文件中找到数据类型的声明

在stdint.h中:

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

typedef unsigned long uint32_t;

在stm32f10x.h 中:

typedef uint32_t u32;

typedef uint16_t u16;

(5)u32头文件linux扩展阅读:

CPU按照其处理信息的字长可以分为:

8位微处理器、16位微处理器、32位微处理器以及64位微处理器等。字、半字是根据处理器的特性决定的,字节则都是8bit。

Stm32是一个32位处理器,所以它的字是32位(一次处理4个字节的数据),半字是16位(2个字节)。存储半字数据的寄存器是由类型为u16的变量访问的,但是如果类型为u8的变量只能访问更低的8位数据,那么u32变量将被很好地读取,并且根据编译器的不同将以不同的方式写入。

与传统arm相比,stm32最大的优点是不需要对齐,三种类型的数据都可以无缝地存储在内存中。传统的arm7、arm9等是按地址对齐的,这意味着8或16位数据占用4字节的空间,导致内存的浪费。

Ⅵ ubuntu下ioport和iomem有什么不同

1)cat /proc/iomem看到的内容:IO memory空间的地址资源分配情况,以树状结构显示。request_mem_regionioremap2)cat /proc/ioports看到的内容IO port空间的地址资源分配情况,以树状结构显示。[源于x86平台的设计思想,目前基本不用了]request_regionioremap# define __iomem __attribute__((noderef, address_space(2)))void __iomem *fpga_vbase;__iomem是linux2.6.9内核中加入的特性。是用来个表示指针是指向一个I/O的内存空间。主要是为了驱动程序的通用性考虑。由于不同的CPU体系结构对I/O空间的表示可能不同。当使用__iomem时,编译器会忽略对变量的检查(因为用的是void __iomem)。若要对它进行检查,当__iomem的指针和正常的指针混用时,就会发出一些警告。include/linux/compiler.h , make C=1 时会有检查,C=0则无任何作用。 $ grep -RIn 'define __iomem' include/linux#ifdef __CHECKER__# define __user __attribute__((noderef, address_space(1)))# define __kernel /* default address space */# define __safe __attribute__((safe))# define __force __attribute__((force))# define __nocast __attribute__((nocast))# define __iomem __attribute__((noderef, address_space(2)))# define __acquires(x) __attribute__((context(0,1)))# define __releases(x) __attribute__((context(1,0)))# define __acquire(x) __context__(1)# define __release(x) __context__(-1)# define __cond_lock(x) ((x) ? ({ __context__(1); 1; }) : 0)extern void __chk_user_ptr(void __user *);extern void __chk_io_ptr(void __iomem *);#else# define __user# define __kernel# define __safe# define __force# define __nocast# define __iomem# define __chk_user_ptr(x) (void)0# define __chk_io_ptr(x) (void)0# define __builtin_warning(x, y…) (1)# define __acquires(x)# define __releases(x)# define __acquire(x) (void)0# define __release(x) (void)0# define __cond_lock(x) (x)#endif概念性的东西:几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可象访问一个内存单元那样访问外设I/O端口,而无需设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或“I/O端口空间”。这是个和CPU地RAM物理地址空间不同的地址空间,任何外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。和RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。Linux设计了一个通用的数据结构resource来描述各种I/O资源(如:I/O端口、外设内存、DMA和IRQ等)。该结构定义在include/linux/ioport.h头文件中。Linux是以一种倒置的树形结构来管理每一类I/O资源(如:I/O端口、外设内存、DMA和IRQ)的。每一类I/O资源都对应有一颗倒置的资源树,树中的每一个节点都是个resource结构,而树的根结点root则描述了该类资源的整个资源空间。基于上述这个思想,Linux将基于I/O映射方式的I/O端口和基于内存映射方式的I/O端口资源统称为“I/O区域”(I/O Region)。参考:linux/kernel/resource.cinclude/linux/Ioport.h__user表示是一个用户空间的指针,所以kernel不可能直接使用。#ifdef __CHECKER__# define __user __attribute__((noderef, address_space(1)))# define __kernel /* default address space */#else# define __user# define __kernel#endifnoderef告诉编译器,不应该解除该指针的引用,因为在当前地址空间中它是没有意义的。这里的CHECKER表示是否使用了Sprase(就是一种静态分析工具,用来分析内核源码中的BUG)。是不是想研究一下了?呵呵。可以参见http://sparse.wiki.kernel.org/index.php/Main_Page所以对于这种变量,在kernel中使用要用到_to_user和_from_user。__iomem是2.6.9中加入的特性。是用来个表示指会指向一个I/O的内存空间。主要是为了driver的通用性考虑。由于不同的CPU体系结构对I/O空间的表示可能不同。当使用__iomem时,compiler会忽略对变量的检查(因为用的是void __iomem)。但sparse会对它进行检查,当__iomem的指针和正常的指针混用时,就会发出一些warnings。下面还有一些为个变量新加入的函数: unsigned int ioread8(void __iomem *addr); unsigned int ioread16(void __iomem *addr); unsigned int ioread32(void __iomem *addr); void iowrite8(u8 value, void __iomem *addr); void iowrite16(u16 value, void __iomem *addr); void iowrite32(u32 value, void __iomem *addr);

Ⅶ 有关stm32的问题,程序里面的u8、u16这些是什么意思啊

u8是unsigned char,u16是unsigned short,u32是unsigned long。

u8,u16,u32都是C语言数据类型,分别代表8位,16位,32位长度的数据类型,一个字节是8位,所以u8是1个字节,u16是2个字节,u32是4个字节。

可以在stm32库头文件中找到数据类型的声明

在stdint.h中:

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

typedef unsigned long uint32_t;

在stm32f10x.h 中:

typedef uint32_t u32;

typedef uint16_t u16;

typedef uint8_t u8;

(7)u32头文件linux扩展阅读

CPU按照其处理信息的字长可以分为:8位微处理器、16位微处理器、32位微处理器以及64位微处理器等。字、半字是根据处理器的特性决定的,字节则都是8bit。

stm32是32bit处理器,所以它的字是32bit的(一次处理4字节长度的数据),半字自然就是16bit(2字节)。存储半字类型数据的寄存器由u16类型的变量访问,但是如果用u8类型变量只能访问该数据低8位,用u32类型变量读的时候没问题,写的时候会因编译器的不同而出现偏差。

stm32和传统的arm相比最大的好处就是不需要对齐,三种类型的数据可以在内存中无缝的存放。而传统的arm7或arm9等是照着地址对齐的,就是说不管8bit或者16bit的数据都要占用4个字节的空间,这样的结果就是造成内存的浪费。

Ⅷ u8 u16 u32这种宏定义在哪个文件中

这样写非常直观,不用担心平台的不同可移植性好,它的字节数一看就知道,u16是16位内2个字节, u8一个字节,不会出容现像int在vc下4个字节,在tc和gnu中2个字节这种情况,u16,u8这样表示不会有二义性!

Ⅸ linux kernel 怎么读cpu写寄存器 inw

arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU。比如arm和x86就不一样,具体的差别我暂时也说不上来,这个涉及到CPU体系的设计。目前我只关心:linux为了支持多个硬件体系,在IO访问上做了自己的接口。可以通过IO内存和IO端口这两种方式进行IO访问。在LED的例子上给出这两种方式的具体实现: 1.利用IO Port的方式:[cpp] view plain #include <linux/mole.h> #include <linux/moleparam.h> #include <linux/init.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything… */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/seq_file.h> #include <linux/cdev.h> #include <linux/ioport.h> #include <mach/regs-gpio.h> #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* _*_user */ #include <asm/io.h> #define LED_NUM 4 struct led_dev { struct cdev dev; unsigned port; unsigned long offset; }; struct led_dev led[4]; dev_t dev = 0; static struct resource *led_resource; int led_open(struct inode *inode, struct file *filp) { struct led_dev *led; /* device information */ led = container_of(inode->i_cdev, struct led_dev, dev); filp->private_data = led; /* for other methods */ return 0; /* success */ } int led_release(struct inode *inode, struct file *filp) { return 0; } ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { return 0; } ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { char data; struct led_dev *led; u32 value; printk(KERN_INFO "debug by kal: led dev write\n"); led = (struct led_dev *)filp->private_data; _from_user(&data,buf,count); if(data == '0') { printk(KERN_INFO "debug by kal: led off\n"); value = inl((unsigned)(S3C2410_GPBDAT)); outl(value | 1<<led->offset,(unsigned)(S3C2410_GPBDAT)); //value = ioread32(led->base); //iowrite32( value | 1<<led->offset, led->base); } else { printk(KERN_INFO "debug by kal: led on\n"); value = inl((unsigned)(S3C2410_GPBDAT)); outl(value & ~(1<<led->offset),(unsigned)(S3C2410_GPBDAT)); //value = ioread32(led->base); //iowrite32( value & ~(1<<led->offset), led->base); } } struct file_operations led_fops = { .owner = THIS_MODULE, .read = led_read, .write = led_write, //.ioctl = led_ioctl, .open = led_open, .release = led_release, }; static int led_init(void) { int result, i; result = alloc_chrdev_region(&dev, 0, LED_NUM,"LED"); if (result < 0) { printk(KERN_WARNING "LED: can't get major %d\n", MAJOR(dev)); return result; } led_resource = request_region(0x56000014,0x4,"led"); if(led_resource == NULL) { printk(KERN_ERR " Unable to register LED I/O addresses\n"); return -1; } for(i = 0; i < LED_NUM; i++) { cdev_init( &led[i].dev, &led_fops); //led[i].port = ioport_map(0x56000014,0x4); //led[i].base = ioremap(0x56000014,0x4); led[i].offset = i + 5; //leds GPB5\6\7\8 led[i].dev.owner = THIS_MODULE; led[i].dev.ops = &led_fops; result = cdev_add(&led[i].dev,MKDEV(MAJOR(dev),i),1); if(result < 0) { printk(KERN_ERR "LED: can't add led%d\n",i); return result; } } return 0; } static void led_exit(void) { int i; release_region(0x56000014,0x4); for( i = 0; i < LED_NUM; i++) { //iounmap(led[i].base); cdev_del(&led[i].dev); } unregister_chrdev_region(dev, LED_NUM); } mole_init(led_init); mole_exit(led_exit); MODULE_AUTHOR("Baikal"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple LED Driver"); 2.利用IO Mem的方式:[cpp] view plain #include <linux/mole.h> #include <linux/moleparam.h> #include <linux/init.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything… */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/seq_file.h> #include <linux/cdev.h> #include <linux/ioport.h> #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* _*_user */ #include <asm/io.h> #define LED_NUM 4 struct led_dev { struct cdev dev; void __iomem *base; unsigned long offset; }; struct led_dev led[4]; dev_t dev = 0; int led_open(struct inode *inode, struct file *filp) { struct led_dev *led; /* device information */ led = container_of(inode->i_cdev, struct led_dev, dev); filp->private_data = led; /* for other methods */ return 0; /* success */ } int led_release(struct inode *inode, struct file *filp) { return 0; } ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { return 0; } ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { char data; struct led_dev *led; u32 value; printk(KERN_INFO "debug by kal: led dev write\n"); led = (struct led_dev *)filp->private_data; _from_user(&data,buf,count); if(data == '0') { printk(KERN_INFO "debug by kal: led off\n"); value = ioread32(led->base); iowrite32( value | 1<<led->offset, led->base); } else { printk(KERN_INFO "debug by kal: led on\n"); value = ioread32(led->base); iowrite32( value & ~(1<<led->offset), led->base); } } struct file_operations led_fops = { .owner = THIS_MODULE, .read = led_read, .write = led_write, //.ioctl = led_ioctl, .open = led_open, .release = led_release, }; static int led_init(void) { int result, i; result = alloc_chrdev_region(&dev, 0, LED_NUM,"LED"); if (result < 0) { printk(KERN_WARNING "LED: can't get major %d\n", MAJOR(dev)); return result; } for(i = 0; i < LED_NUM; i++) { cdev_init( &led[i].dev, &led_fops); request_mem_region(0x56000014,0x4,"led"); led[i].base = ioremap(0x56000014,0x4); led[i].offset = i + 5; //leds GPB5\6\7\8 led[i].dev.owner = THIS_MODULE; led[i].dev.ops = &led_fops; result = cdev_add(&led[i].dev,MKDEV(MAJOR(dev),i),1); if(result < 0) { printk(KERN_ERR "LED: can't add led%d\n",i); return result; } } return 0; } static void led_exit(void) { int i; release_mem_region(0x56000014,0x4); for( i = 0; i < LED_NUM; i++) { iounmap(led[i].base); cdev_del(&led[i].dev); } unregister_chrdev_region(dev, LED_NUM); } mole_init(led_init); mole_exit(led_exit); MODULE_AUTHOR("Baikal"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple LED Driver");

Ⅹ 哪里能下载bios.h这个头文件呢

bios.h 涉及输入输出的头文件,与软件和硬件都有关系,网上可以搜到bios.h,但你要判断是否是你需要的。例如 linux 的:#ifndef _ASM_X86_UV_BIOS_H#define _ASM_X86_UV_BIOS_H#include <linux/rtc.h>/* * Values for the BIOS calls. It is passed as the first * argument in the * BIOS call. Passing any other value in the first argument will result * in a BIOS_STATUS_UNIMPLEMENTED return status. */enum uv_bios_cmd { UV_BIOS_COMMON, UV_BIOS_GET_SN_INFO, UV_BIOS_FREQ_BASE, UV_BIOS_WATCHLIST_ALLOC, UV_BIOS_WATCHLIST_FREE, UV_BIOS_MEMPROTECT, UV_BIOS_GET_PARTITION_ADDR};/* * Status values returned from a BIOS call. */enum { BIOS_STATUS_MORE_PASSES = 1, BIOS_STATUS_SUCCESS = 0, BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, BIOS_STATUS_EINVAL = -EINVAL, BIOS_STATUS_UNAVAIL = -EBUSY};/* * The UV system table describes specific firmware * capabilities available to the Linux kernel at runtime. */struct uv_systab { char signature[4]; /* must be "UVST" */ u32 revision; /* distinguish different firmware revs */ u64 function; /* BIOS runtime callback function ptr */};enum { BIOS_FREQ_BASE_PLATFORM = 0, BIOS_FREQ_BASE_INTERVAL_TIMER = 1, BIOS_FREQ_BASE_REALTIME_CLOCK = 2};union partition_info_u { u64 val; struct { u64 hub_version : 8, partition_id : 16, coherence_id : 16, region_size : 24; };};union uv_watchlist_u { u64 val; struct { u64 blade : 16, size : 32, filler : 16; };};enum uv_memprotect { UV_MEMPROT_RESTRICT_ACCESS, UV_MEMPROT_ALLOW_AMO, UV_MEMPROT_ALLOW_RW};/* * bios calls have 6 parameters */extern s64 uv_bios_call(enum uv_bios_cmd, u64, u64, u64, u64, u64);extern s64 uv_bios_call_irqsave(enum uv_bios_cmd, u64, u64, u64, u64, u64);extern s64 uv_bios_call_reentrant(enum uv_bios_cmd, u64, u64, u64, u64, u64);extern s64 uv_bios_get_sn_info(int, int *, long *, long *, long *);extern s64 uv_bios_freq_base(u64, u64 *);extern int uv_bios_mq_watchlist_alloc(int, unsigned long, unsigned int, unsigned long *);extern int uv_bios_mq_watchlist_free(int, int);extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect);extern s64 uv_bios_reserved_page_pa(u64, u64 *, u64 *, u64 *);extern void uv_bios_init(void);extern unsigned long sn_rtc_cycles_per_second;extern int uv_type;extern long sn_partition_id;extern long sn_coherency_id;extern long sn_region_size;#define partition_coherence_id() (sn_coherency_id)extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */#endif /* _ASM_X86_UV_BIOS_H */