FixupForRawSection.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. ## @file
  2. # Apply fixup to VTF binary image for FFS Raw section
  3. #
  4. # Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
  5. #
  6. # SPDX-License-Identifier: BSD-2-Clause-Patent
  7. #
  8. import sys
  9. filename = sys.argv[1]
  10. if filename.lower().find('ia32') >= 0:
  11. d = open(sys.argv[1], 'rb').read()
  12. c = ((len(d) + 4 + 7) & ~7) - 4
  13. if c > len(d):
  14. c -= len(d)
  15. f = open(sys.argv[1], 'wb')
  16. f.write('\x90' * c)
  17. f.write(d)
  18. f.close()
  19. else:
  20. from struct import pack
  21. PAGE_PRESENT = 0x01
  22. PAGE_READ_WRITE = 0x02
  23. PAGE_USER_SUPERVISOR = 0x04
  24. PAGE_WRITE_THROUGH = 0x08
  25. PAGE_CACHE_DISABLE = 0x010
  26. PAGE_ACCESSED = 0x020
  27. PAGE_DIRTY = 0x040
  28. PAGE_PAT = 0x080
  29. PAGE_GLOBAL = 0x0100
  30. PAGE_2M_MBO = 0x080
  31. PAGE_2M_PAT = 0x01000
  32. def NopAlign4k(s):
  33. c = ((len(s) + 0xfff) & ~0xfff) - len(s)
  34. return ('\x90' * c) + s
  35. def PageDirectoryEntries4GbOf2MbPages(baseAddress):
  36. s = ''
  37. for i in range(0x800):
  38. i = (
  39. baseAddress + long(i << 21) +
  40. PAGE_2M_MBO +
  41. PAGE_CACHE_DISABLE +
  42. PAGE_ACCESSED +
  43. PAGE_DIRTY +
  44. PAGE_READ_WRITE +
  45. PAGE_PRESENT
  46. )
  47. s += pack('Q', i)
  48. return s
  49. def PageDirectoryPointerTable4GbOf2MbPages(pdeBase):
  50. s = ''
  51. for i in range(0x200):
  52. i = (
  53. pdeBase +
  54. (min(i, 3) << 12) +
  55. PAGE_CACHE_DISABLE +
  56. PAGE_ACCESSED +
  57. PAGE_READ_WRITE +
  58. PAGE_PRESENT
  59. )
  60. s += pack('Q', i)
  61. return s
  62. def PageMapLevel4Table4GbOf2MbPages(pdptBase):
  63. s = ''
  64. for i in range(0x200):
  65. i = (
  66. pdptBase +
  67. (min(i, 0) << 12) +
  68. PAGE_CACHE_DISABLE +
  69. PAGE_ACCESSED +
  70. PAGE_READ_WRITE +
  71. PAGE_PRESENT
  72. )
  73. s += pack('Q', i)
  74. return s
  75. def First4GbPageEntries(topAddress):
  76. PDE = PageDirectoryEntries4GbOf2MbPages(0L)
  77. pml4tBase = topAddress - 0x1000
  78. pdptBase = pml4tBase - 0x1000
  79. pdeBase = pdptBase - len(PDE)
  80. PDPT = PageDirectoryPointerTable4GbOf2MbPages(pdeBase)
  81. PML4T = PageMapLevel4Table4GbOf2MbPages(pdptBase)
  82. return PDE + PDPT + PML4T
  83. def AlignAndAddPageTables():
  84. d = open(sys.argv[1], 'rb').read()
  85. code = NopAlign4k(d)
  86. topAddress = 0x100000000 - len(code)
  87. d = ('\x90' * 4) + First4GbPageEntries(topAddress) + code
  88. f = open(sys.argv[1], 'wb')
  89. f.write(d)
  90. f.close()
  91. AlignAndAddPageTables()