From 8b9eaa8f8747cfc2b5adc1760c16d1df883d15e6 Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@mutabah.net>
Date: Wed, 26 Sep 2018 21:36:24 +0800
Subject: [PATCH] Kernel Core - Fix handling of 64-bit BARs

---
 Kernel/Core/hw/bus_pci.rs | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/Kernel/Core/hw/bus_pci.rs b/Kernel/Core/hw/bus_pci.rs
index 3b228916..fb2365fb 100644
--- a/Kernel/Core/hw/bus_pci.rs
+++ b/Kernel/Core/hw/bus_pci.rs
@@ -271,6 +271,7 @@ fn get_device(bus_id: u8, devidx: u8, function: u8) -> Option<PCIDev>
 fn parse_bar(addr: u16, word: u8) -> BAR
 {
 	let value = read_word(addr, word);
+	log_trace!("parse_bar({}) value={:#x}", word-4, value);
 	if value == 0
 	{
 		log_debug!("parse_bar: None");
@@ -294,11 +295,13 @@ fn parse_bar(addr: u16, word: u8) -> BAR
 			assert!(word % 2 == 0);
 			let value2 = read_word(addr, word+1);
 			write_word(addr, word+1, !0);
-			let size2 = !read_word(addr, word+1) + 1;
+			let size2 = !read_word(addr, word+1);	// No +1
 			write_word(addr, word+1, value2);
-			assert_eq!(size2, 0);
+			assert!(size2 == 0, "TODO: Support 64-bit BARs with sizes >4GB - size={},size2={}", size, size2);
+			let addr = (value2 as u64) << 32 | (value as u64 & !0xF);
+			log_debug!("parse_bar: (memory 64) addr={:#x} size={:#x}", addr, size);
 			
-			BAR::Mem( (value2 as u64) << 32 | (value as u64 & !0xF), size, pf == 1 )
+			BAR::Mem( addr, size, pf == 1 )
 			},
 		3 => BAR::None,	// reserved
 		_ => unreachable!()
-- 
GitLab