HvCall.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * HvCall.c
  3.  * Copyright (C) 2001  Mike Corrigan IBM Corporation
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  */
  10. #include <linux/stddef.h>
  11. #include <linux/kernel.h>
  12. #include <linux/mm.h>
  13. #include <linux/slab.h>
  14. #include <asm/system.h>
  15. #include <asm/page.h>
  16. #include <asm/iSeries/HvCall.h>
  17. #ifndef  _HVCALLSC_H
  18. #include <asm/iSeries/HvCallSc.h>
  19. #endif
  20. #include <asm/iSeries/LparData.h>
  21. #ifndef  _HVTYPES_H
  22. #include <asm/iSeries/HvTypes.h>
  23. #endif
  24. /*=====================================================================
  25.  * Note that this call takes at MOST one page worth of data
  26.  */
  27. int HvCall_readLogBuffer(HvLpIndex lpIndex, void *buffer, u64 bufLen)
  28. {
  29. struct HvLpBufferList *bufList;
  30. u64 bytesLeft = bufLen;
  31. u64 leftThisPage;
  32. u64 curPtr = virt_to_absolute( (unsigned long) buffer );
  33. u64 retVal;
  34. int npages;
  35. int i;
  36. npages = 0;
  37. while (bytesLeft) {
  38. npages++;
  39. leftThisPage = ((curPtr & PAGE_MASK) + PAGE_SIZE) - curPtr;
  40. if (leftThisPage > bytesLeft)
  41. bytesLeft = 0;
  42. else
  43. bytesLeft -= leftThisPage;
  44. curPtr = (curPtr & PAGE_MASK) + PAGE_SIZE;
  45. }
  46. if (npages == 0)
  47. return 0;
  48. bufList = (struct HvLpBufferList *)
  49. kmalloc(npages * sizeof(struct HvLpBufferList), GFP_ATOMIC);
  50. bytesLeft = bufLen;
  51. curPtr = virt_to_absolute( (unsigned long) buffer );
  52. for(i=0; i<npages; i++) {
  53. bufList[i].addr = curPtr;
  54.       
  55. leftThisPage = ((curPtr & PAGE_MASK) + PAGE_SIZE) - curPtr;
  56. if (leftThisPage > bytesLeft) {
  57. bufList[i].len = bytesLeft;
  58. bytesLeft = 0;
  59. } else {
  60. bufList[i].len = leftThisPage;
  61. bytesLeft -= leftThisPage;
  62. }
  63. curPtr = (curPtr & PAGE_MASK) + PAGE_SIZE;
  64. }
  65. retVal = HvCall3(HvCallBaseReadLogBuffer, lpIndex,
  66.  virt_to_absolute((unsigned long)bufList), bufLen);
  67. kfree(bufList);
  68. return (int)retVal;
  69. }
  70. /*=====================================================================
  71.  */
  72. void HvCall_writeLogBuffer(const void *buffer, u64 bufLen)
  73. {
  74. struct HvLpBufferList bufList;
  75. u64 bytesLeft = bufLen;
  76. u64 leftThisPage;
  77. u64 curPtr = virt_to_absolute( (unsigned long) buffer );
  78. while (bytesLeft) {
  79. bufList.addr = curPtr;
  80.       
  81. leftThisPage = ((curPtr & PAGE_MASK) + PAGE_SIZE) - curPtr;
  82. if (leftThisPage > bytesLeft) {
  83. bufList.len = bytesLeft;
  84. bytesLeft = 0;
  85. } else {
  86. bufList.len = leftThisPage;
  87. bytesLeft -= leftThisPage;
  88. }
  89. curPtr = (curPtr & PAGE_MASK) + PAGE_SIZE;
  90. }
  91. HvCall2(HvCallBaseWriteLogBuffer,
  92. virt_to_absolute((unsigned long)&bufList), bufLen);
  93. }