OpenBIOS
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2000 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1999 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1998 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1997 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1996 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1995 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1994 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1993 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1992 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1991 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1990 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1989 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1988 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1987 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1986 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1985 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1984 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1983 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1982 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1981 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1980 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1979 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1978 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1977 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1976 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1975 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1974 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1973 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1972 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1971 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1970 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1969 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1968 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1967 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1966 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1965 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1964 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1963 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1962 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1961 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1960 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1959 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1958 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1957 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1956 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1955 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1954 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1953 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1952 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1951 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1950 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1949 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1948 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1947 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1946 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1945 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1944 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1943 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1942 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1941 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1940 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1939 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1938 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1937 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1936 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1935 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1934 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1933 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1932 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1931 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1930 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1929 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1928 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1927 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1926 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1925 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1924 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1923 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1922 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1921 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1920 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1919 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1918 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1917 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1916 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1915 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1914 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1913 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1912 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1911 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1910 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1909 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1908 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1907 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1906 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1905 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1904 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
January 2011
- 10 participants
- 48 discussions
Jan. 9, 2011
Otherwise the device tree properties will not always get updated to reflect the current
memory ranges.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
---
openbios-devel/libopenbios/ofmem_common.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/openbios-devel/libopenbios/ofmem_common.c b/openbios-devel/libopenbios/ofmem_common.c
index 6d0f417..a2c69f8 100644
--- a/openbios-devel/libopenbios/ofmem_common.c
+++ b/openbios-devel/libopenbios/ofmem_common.c
@@ -481,6 +481,7 @@ static phys_addr_t ofmem_claim_phys_( phys_addr_t phys, ucell size, ucell align,
return -1;
}
add_entry( phys, size, &ofmem->phys_range );
+ ofmem_update_translations();
return phys;
}
phys = find_area( align, size, ofmem->phys_range, min, max, reverse );
@@ -515,6 +516,7 @@ static ucell ofmem_claim_virt_( ucell virt, ucell size, ucell align,
return -1;
}
add_entry( virt, size, &ofmem->virt_range );
+ ofmem_update_translations();
return virt;
}
@@ -524,6 +526,9 @@ static ucell ofmem_claim_virt_( ucell virt, ucell size, ucell align,
return -1;
}
add_entry( virt, size, &ofmem->virt_range );
+
+ ofmem_update_translations();
+
return virt;
}
--
1.7.2.3
1
0
Jan. 9, 2011
Make it similar to the OBP output with 2 entries consisting of half the virtual address space.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
---
openbios-devel/arch/sparc32/lib.c | 30 +++++++++++++++++++++++++-----
openbios-devel/drivers/iommu.c | 14 --------------
2 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c
index 90a070b..5b41dff 100644
--- a/openbios-devel/arch/sparc32/lib.c
+++ b/openbios-devel/arch/sparc32/lib.c
@@ -373,7 +373,10 @@ void obp_dumb_memfree(__attribute__((unused))char *va,
void
ob_init_mmu(void)
{
- ucell *reg;
+ ucell *memreg;
+ ucell *virtreg;
+ phys_addr_t virtregsize;
+ ofmem_t *ofmem = ofmem_arch_get_private();
init_romvec_mem();
@@ -391,18 +394,35 @@ ob_init_mmu(void)
ofmem_register(s_phandle_memory, s_phandle_mmu);
/* Setup /memory:reg (totphys) property */
- reg = malloc(3 * sizeof(ucell));
- ofmem_arch_encode_physaddr(reg, 0); /* physical base */
- reg[2] = (ucell)ofmem_arch_get_phys_top(); /* size */
+ memreg = malloc(3 * sizeof(ucell));
+ ofmem_arch_encode_physaddr(memreg, 0); /* physical base */
+ memreg[2] = (ucell)ofmem->ramsize; /* size */
push_str("/memory");
fword("find-device");
- PUSH(pointer2cell(reg));
+ PUSH(pointer2cell(memreg));
PUSH(3 * sizeof(ucell));
push_str("reg");
PUSH_ph(s_phandle_memory);
fword("encode-property");
+ /* Setup /virtual-memory:reg property */
+ virtregsize = ((phys_addr_t)((ucell)-1) + 1) / 2;
+
+ virtreg = malloc(6 * sizeof(ucell));
+ ofmem_arch_encode_physaddr(virtreg, 0);
+ virtreg[2] = virtregsize;
+ ofmem_arch_encode_physaddr(&virtreg[3], virtregsize);
+ virtreg[5] = virtregsize;
+
+ push_str("/virtual-memory");
+ fword("find-device");
+ PUSH(pointer2cell(virtreg));
+ PUSH(6 * sizeof(ucell));
+ push_str("reg");
+ PUSH_ph(s_phandle_mmu);
+ fword("encode-property");
+
PUSH(0);
fword("active-package!");
bind_func("pgmap@", pgmap_fetch);
diff --git a/openbios-devel/drivers/iommu.c b/openbios-devel/drivers/iommu.c
index 28f3b57..5eb8a60 100644
--- a/openbios-devel/drivers/iommu.c
+++ b/openbios-devel/drivers/iommu.c
@@ -155,20 +155,6 @@ ob_init_iommu(uint64_t base)
regs = iommu_init(&ciommu, base);
- push_str("/virtual-memory");
- fword("find-device");
-
- PUSH(base >> 32);
- fword("encode-int");
- PUSH(base & 0xffffffff);
- fword("encode-int");
- fword("encode+");
- PUSH(IOMMU_REGS);
- fword("encode-int");
- fword("encode+");
- push_str("reg");
- fword("property");
-
push_str("/iommu");
fword("find-device");
PUSH((unsigned long)regs);
--
1.7.2.3
1
0
[PATCH 3/6] Explicitly claim physical and virtual memory used by OpenBIOS in OFMEM under SPARC32.
by Mark Cave-Ayland Jan. 9, 2011
by Mark Cave-Ayland Jan. 9, 2011
Jan. 9, 2011
This is required to ensure that Solaris doesn't consider the memory used by OpenBIOS
as available when interpreting the memory lists.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
---
openbios-devel/arch/sparc32/ofmem_sparc32.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/openbios-devel/arch/sparc32/ofmem_sparc32.c b/openbios-devel/arch/sparc32/ofmem_sparc32.c
index b71f405..1f1cecf 100644
--- a/openbios-devel/arch/sparc32/ofmem_sparc32.c
+++ b/openbios-devel/arch/sparc32/ofmem_sparc32.c
@@ -161,4 +161,10 @@ void ofmem_init( void )
{
memset(&s_ofmem_data, 0, sizeof(s_ofmem_data));
s_ofmem_data.ofmem.ramsize = qemu_mem_size;
+
+ /* Claim reserved physical addresses at top of RAM */
+ ofmem_claim_phys(ofmem_arch_get_phys_top(), s_ofmem_data.ofmem.ramsize - ofmem_arch_get_phys_top(), 0);
+
+ /* Claim OpenBIOS reserved space */
+ ofmem_claim_virt(0xffd00000, 0x300000, 0);
}
--
1.7.2.3
1
0
[PATCH 2/6] Switch SPARC32 to use 2 address cells for addresses within the /virtual-memory available property.
by Mark Cave-Ayland Jan. 9, 2011
by Mark Cave-Ayland Jan. 9, 2011
Jan. 9, 2011
This matches the format of the /virtual-memory available property generated by OBP under QEMU.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
---
openbios-devel/arch/sparc32/ofmem_sparc32.c | 13 ++-----------
1 files changed, 2 insertions(+), 11 deletions(-)
diff --git a/openbios-devel/arch/sparc32/ofmem_sparc32.c b/openbios-devel/arch/sparc32/ofmem_sparc32.c
index ba47913..b71f405 100644
--- a/openbios-devel/arch/sparc32/ofmem_sparc32.c
+++ b/openbios-devel/arch/sparc32/ofmem_sparc32.c
@@ -127,11 +127,7 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
/* Return the size of a memory available entry given the phandle in cells */
int ofmem_arch_get_available_entry_size(phandle_t ph)
{
- if (ph == s_phandle_memory) {
- return 1 + ofmem_arch_get_physaddr_cellsize();
- } else {
- return 1 + 1;
- }
+ return 1 + ofmem_arch_get_physaddr_cellsize();
}
/* Generate memory available property entry for Sparc32 */
@@ -139,12 +135,7 @@ void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_add
{
int i = 0;
- if (ph == s_phandle_memory) {
- i += ofmem_arch_encode_physaddr(availentry, start);
- } else {
- availentry[i++] = start;
- }
-
+ i += ofmem_arch_encode_physaddr(availentry, start);
availentry[i] = size;
}
--
1.7.2.3
1
0
[PATCH 1/6] Delegate construction of memory "available" property to each architecture.
by Mark Cave-Ayland Jan. 9, 2011
by Mark Cave-Ayland Jan. 9, 2011
Jan. 9, 2011
This is required because some architectures do not strictly follow the convention
of using physical addresses sizes in the /memory node and virtual addresses in
the /virtual-memory node.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
---
openbios-devel/arch/ppc/qemu/ofmem.c | 24 ++++++++++++++++++++++++
openbios-devel/arch/sparc32/lib.c | 2 --
openbios-devel/arch/sparc32/ofmem_sparc32.c | 24 ++++++++++++++++++++++++
openbios-devel/arch/sparc64/ofmem_sparc64.c | 24 ++++++++++++++++++++++++
openbios-devel/include/libopenbios/ofmem.h | 6 ++++++
openbios-devel/libopenbios/ofmem_common.c | 27 +++++++--------------------
6 files changed, 85 insertions(+), 22 deletions(-)
diff --git a/openbios-devel/arch/ppc/qemu/ofmem.c b/openbios-devel/arch/ppc/qemu/ofmem.c
index 4c6825e..f654d0f 100644
--- a/openbios-devel/arch/ppc/qemu/ofmem.c
+++ b/openbios-devel/arch/ppc/qemu/ofmem.c
@@ -195,6 +195,30 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
transentry[i++] = t->mode;
}
+/* Return the size of a memory available entry given the phandle in cells */
+int ofmem_arch_get_available_entry_size(phandle_t ph)
+{
+ if (ph == s_phandle_memory) {
+ return 1 + ofmem_arch_get_physaddr_cellsize();
+ } else {
+ return 1 + 1;
+ }
+}
+
+/* Generate memory available property entry for PPC */
+void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
+{
+ int i = 0;
+
+ if (ph == s_phandle_memory) {
+ i += ofmem_arch_encode_physaddr(availentry, start);
+ } else {
+ availentry[i++] = start;
+ }
+
+ availentry[i] = size;
+}
+
/************************************************************************/
/* OF private allocations */
/************************************************************************/
diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c
index 72d3a87..90a070b 100644
--- a/openbios-devel/arch/sparc32/lib.c
+++ b/openbios-devel/arch/sparc32/lib.c
@@ -59,8 +59,6 @@ unsigned int va_shift;
static unsigned long *context_table;
static unsigned long *l1;
-static phandle_t s_phandle_memory = 0;
-static phandle_t s_phandle_mmu = 0;
static ucell *mem_reg = 0;
static ucell *mem_avail = 0;
static ucell *virt_avail = 0;
diff --git a/openbios-devel/arch/sparc32/ofmem_sparc32.c b/openbios-devel/arch/sparc32/ofmem_sparc32.c
index 6815349..ba47913 100644
--- a/openbios-devel/arch/sparc32/ofmem_sparc32.c
+++ b/openbios-devel/arch/sparc32/ofmem_sparc32.c
@@ -124,6 +124,30 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
transentry[2] = t->mode;
}
+/* Return the size of a memory available entry given the phandle in cells */
+int ofmem_arch_get_available_entry_size(phandle_t ph)
+{
+ if (ph == s_phandle_memory) {
+ return 1 + ofmem_arch_get_physaddr_cellsize();
+ } else {
+ return 1 + 1;
+ }
+}
+
+/* Generate memory available property entry for Sparc32 */
+void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
+{
+ int i = 0;
+
+ if (ph == s_phandle_memory) {
+ i += ofmem_arch_encode_physaddr(availentry, start);
+ } else {
+ availentry[i++] = start;
+ }
+
+ availentry[i] = size;
+}
+
/************************************************************************/
/* misc */
/************************************************************************/
diff --git a/openbios-devel/arch/sparc64/ofmem_sparc64.c b/openbios-devel/arch/sparc64/ofmem_sparc64.c
index 1655978..d4caddc 100644
--- a/openbios-devel/arch/sparc64/ofmem_sparc64.c
+++ b/openbios-devel/arch/sparc64/ofmem_sparc64.c
@@ -110,6 +110,30 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
transentry[2] = t->mode;
}
+/* Return the size of a memory available entry given the phandle in cells */
+int ofmem_arch_get_available_entry_size(phandle_t ph)
+{
+ if (ph == s_phandle_memory) {
+ return 1 + ofmem_arch_get_physaddr_cellsize();
+ } else {
+ return 1 + 1;
+ }
+}
+
+/* Generate memory available property entry for Sparc64 */
+void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
+{
+ int i = 0;
+
+ if (ph == s_phandle_memory) {
+ i += ofmem_arch_encode_physaddr(availentry, start);
+ } else {
+ availentry[i++] = start;
+ }
+
+ availentry[i] = size;
+}
+
/************************************************************************/
/* misc */
/************************************************************************/
diff --git a/openbios-devel/include/libopenbios/ofmem.h b/openbios-devel/include/libopenbios/ofmem.h
index 2269fd7..30f20d8 100644
--- a/openbios-devel/include/libopenbios/ofmem.h
+++ b/openbios-devel/include/libopenbios/ofmem.h
@@ -69,6 +69,8 @@ extern ucell ofmem_arch_get_iomem_top(void);
extern retain_t* ofmem_arch_get_retained(void);
extern int ofmem_arch_get_physaddr_cellsize(void);
extern int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value);
+extern int ofmem_arch_get_available_entry_size(phandle_t ph);
+extern void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size);
extern int ofmem_arch_get_translation_entry_size(void);
extern void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t);
extern ucell ofmem_arch_default_translation_mode( phys_addr_t phys );
@@ -120,6 +122,10 @@ extern void ofmem_release_phys( phys_addr_t phys, ucell size );
extern void ofmem_release_virt( ucell virt, ucell size );
extern phys_addr_t ofmem_translate( ucell virt, ucell *ret_mode );
+/* memory and virtual-memory nodes */
+extern phandle_t s_phandle_memory;
+extern phandle_t s_phandle_mmu;
+
/* Currently the same for all architectures */
#define PAGE_SHIFT 12
diff --git a/openbios-devel/libopenbios/ofmem_common.c b/openbios-devel/libopenbios/ofmem_common.c
index 7f6223b..6d0f417 100644
--- a/openbios-devel/libopenbios/ofmem_common.c
+++ b/openbios-devel/libopenbios/ofmem_common.c
@@ -222,8 +222,8 @@ ofmem_set_property( phandle_t ph, const char *name, const char *buf, int len )
fword("encode-property");
}
-static phandle_t s_phandle_memory = 0;
-static phandle_t s_phandle_mmu = 0;
+phandle_t s_phandle_memory = 0;
+phandle_t s_phandle_mmu = 0;
static void ofmem_update_mmu_translations( void )
{
@@ -290,8 +290,7 @@ static void ofmem_update_memory_available( phandle_t ph, range_t *range,
/* inverse of phys_range list could take 2 or more additional cells for the tail
For /memory, physical addresses may be wider than one ucell. */
- prop_used = (ncells + 1) * sizeof(ucell) *
- (((ph == s_phandle_memory) ? ofmem_arch_get_physaddr_cellsize() : 1) + 1);
+ prop_used = (ncells + 1) * sizeof(ucell) * ofmem_arch_get_available_entry_size(ph) + 1;
if (prop_used > *mem_prop_size) {
@@ -325,28 +324,16 @@ static void ofmem_update_memory_available( phandle_t ph, range_t *range,
size = r->start - start;
if (size) {
- if (ph == s_phandle_memory) {
- /* physical address for /memory */
- ncells += ofmem_arch_encode_physaddr(&prop[ncells], start);
- } else {
- /* virtual address for MMU */
- prop[ncells++] = start;
- }
- prop[ncells++] = size;
+ ofmem_arch_create_available_entry(ph, &prop[ncells], start, size);
+ ncells += ofmem_arch_get_available_entry_size(ph);
}
start = r->start + r->size;
}
/* tail */
if (start < top_address) {
- if (ph == s_phandle_memory) {
- /* physical address for /memory */
- ncells += ofmem_arch_encode_physaddr(&prop[ncells], start);
- } else {
- /* virtual address for MMU */
- prop[ncells++] = start;
- }
- prop[ncells++] = top_address - start;
+ ofmem_arch_create_available_entry(ph, &prop[ncells], start, top_address - start);
+ ncells += ofmem_arch_get_available_entry_size(ph);
}
ofmem_set_property(ph, "available",
--
1.7.2.3
1
0
This patchset fixes up a couple of minor bugs in OFMEM and also fixes up
the SPARC32 memory/virtual-memory properties so that they are similar as
to how they appear under OBP. This furthers Solaris 8 boot in my tests
here.
v2:
Fix original patchset based upon comments from Blue, and extend
to resolve some additional bugs.
v1:
Original submission.
Mark Cave-Ayland (6):
Delegate construction of memory "available" property to each
architecture.
Switch SPARC32 to use 2 address cells for addresses within the
/virtual-memory available property.
Explicitly claim physical and virtual memory used by OpenBIOS in
OFMEM under SPARC32.
Fix up /virtual-memory reg property on SPARC32.
OFMEM: Fix missing ofmem_update_translations() calls.
OFMEM: Fix bogus tail entry added to the end of the virtual memory
available list.
openbios-devel/arch/ppc/qemu/ofmem.c | 24 +++++++++++++++++++
openbios-devel/arch/sparc32/lib.c | 32 +++++++++++++++++++-----
openbios-devel/arch/sparc32/ofmem_sparc32.c | 21 ++++++++++++++++
openbios-devel/arch/sparc64/ofmem_sparc64.c | 24 +++++++++++++++++++
openbios-devel/drivers/iommu.c | 14 -----------
openbios-devel/include/libopenbios/ofmem.h | 6 ++++
openbios-devel/libopenbios/ofmem_common.c | 34 ++++++++++----------------
7 files changed, 113 insertions(+), 42 deletions(-)
--
1.7.2.3
1
0
Jan. 8, 2011
Author: blueswirl
Date: Sat Jan 8 20:44:38 2011
New Revision: 1014
URL: http://tracker.coreboot.org/trac/openbios/changeset/1014
Log:
Fix some memory leaks
Fix memory leaks reported by cppcheck:
[../packages/pc-parts.c:291]: (error) Memory leak: parstr
[../libopenbios/bootinfo_load.c:172]: (error) Memory leak: bootscript
Signed-off-by: Blue Swirl <blauwirbel(a)gmail.com>
Modified:
trunk/openbios-devel/libopenbios/bootinfo_load.c
trunk/openbios-devel/packages/pc-parts.c
Modified: trunk/openbios-devel/libopenbios/bootinfo_load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/bootinfo_load.c Sun Jan 2 10:56:19 2011 (r1013)
+++ trunk/openbios-devel/libopenbios/bootinfo_load.c Sat Jan 8 20:44:38 2011 (r1014)
@@ -169,6 +169,7 @@
if (!is_bootinfo(base)) {
DPRINTF("Not a valid bootinfo memory image\n");
+ free(bootscript);
return;
}
Modified: trunk/openbios-devel/packages/pc-parts.c
==============================================================================
--- trunk/openbios-devel/packages/pc-parts.c Sun Jan 2 10:56:19 2011 (r1013)
+++ trunk/openbios-devel/packages/pc-parts.c Sat Jan 8 20:44:38 2011 (r1014)
@@ -131,6 +131,7 @@
}
DPRINTF("parstr: %s argstr: %s parnum: %d\n", parstr, argstr, parnum);
+ free(parstr);
if( parnum < 0 )
parnum = 0;
1
0
[PATCH 1/2] Delegate construction of memory "available" property to each architecture.
by Mark Cave-Ayland Jan. 8, 2011
by Mark Cave-Ayland Jan. 8, 2011
Jan. 8, 2011
This is required because some architectures do not strictly follow the convention
of using physical addresses sizes in the /memory node and virtual addresses in
the /virtual-memory node.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland(a)siriusit.co.uk>
---
openbios-devel/arch/ppc/qemu/ofmem.c | 24 ++++++++++++++++++++++++
openbios-devel/arch/sparc32/lib.c | 2 --
openbios-devel/arch/sparc32/ofmem_sparc32.c | 24 ++++++++++++++++++++++++
openbios-devel/arch/sparc64/ofmem_sparc64.c | 24 ++++++++++++++++++++++++
openbios-devel/include/libopenbios/ofmem.h | 6 ++++++
openbios-devel/libopenbios/ofmem_common.c | 27 +++++++--------------------
6 files changed, 85 insertions(+), 22 deletions(-)
diff --git a/openbios-devel/arch/ppc/qemu/ofmem.c b/openbios-devel/arch/ppc/qemu/ofmem.c
index 4c6825e..25bbc39 100644
--- a/openbios-devel/arch/ppc/qemu/ofmem.c
+++ b/openbios-devel/arch/ppc/qemu/ofmem.c
@@ -195,6 +195,30 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
transentry[i++] = t->mode;
}
+/* Return the size of a memory available node given the phandle in cells */
+int ofmem_arch_get_available_entry_size(phandle_t ph)
+{
+ if (ph == s_phandle_memory) {
+ return 1 + ofmem_arch_get_physaddr_cellsize();
+ } else {
+ return 1 + 1;
+ }
+}
+
+/* Generate memory available property entry for PPC */
+void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
+{
+ int i = 0;
+
+ if (ph == s_phandle_memory) {
+ i += ofmem_arch_encode_physaddr(availentry, start);
+ } else {
+ availentry[i++] = start;
+ }
+
+ availentry[i++] = size;
+}
+
/************************************************************************/
/* OF private allocations */
/************************************************************************/
diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c
index 72d3a87..90a070b 100644
--- a/openbios-devel/arch/sparc32/lib.c
+++ b/openbios-devel/arch/sparc32/lib.c
@@ -59,8 +59,6 @@ unsigned int va_shift;
static unsigned long *context_table;
static unsigned long *l1;
-static phandle_t s_phandle_memory = 0;
-static phandle_t s_phandle_mmu = 0;
static ucell *mem_reg = 0;
static ucell *mem_avail = 0;
static ucell *virt_avail = 0;
diff --git a/openbios-devel/arch/sparc32/ofmem_sparc32.c b/openbios-devel/arch/sparc32/ofmem_sparc32.c
index 6815349..aee736a 100644
--- a/openbios-devel/arch/sparc32/ofmem_sparc32.c
+++ b/openbios-devel/arch/sparc32/ofmem_sparc32.c
@@ -124,6 +124,30 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
transentry[2] = t->mode;
}
+/* Return the size of a memory available node given the phandle in cells */
+int ofmem_arch_get_available_entry_size(phandle_t ph)
+{
+ if (ph == s_phandle_memory) {
+ return 1 + ofmem_arch_get_physaddr_cellsize();
+ } else {
+ return 1 + 1;
+ }
+}
+
+/* Generate memory available property entry for Sparc32 */
+void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
+{
+ int i = 0;
+
+ if (ph == s_phandle_memory) {
+ i += ofmem_arch_encode_physaddr(availentry, start);
+ } else {
+ availentry[i++] = start;
+ }
+
+ availentry[i++] = size;
+}
+
/************************************************************************/
/* misc */
/************************************************************************/
diff --git a/openbios-devel/arch/sparc64/ofmem_sparc64.c b/openbios-devel/arch/sparc64/ofmem_sparc64.c
index 1655978..6904fee 100644
--- a/openbios-devel/arch/sparc64/ofmem_sparc64.c
+++ b/openbios-devel/arch/sparc64/ofmem_sparc64.c
@@ -110,6 +110,30 @@ void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
transentry[2] = t->mode;
}
+/* Return the size of a memory available node given the phandle in cells */
+int ofmem_arch_get_available_entry_size(phandle_t ph)
+{
+ if (ph == s_phandle_memory) {
+ return 1 + ofmem_arch_get_physaddr_cellsize();
+ } else {
+ return 1 + 1;
+ }
+}
+
+/* Generate memory available property entry for Sparc64 */
+void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
+{
+ int i = 0;
+
+ if (ph == s_phandle_memory) {
+ i += ofmem_arch_encode_physaddr(availentry, start);
+ } else {
+ availentry[i++] = start;
+ }
+
+ availentry[i++] = size;
+}
+
/************************************************************************/
/* misc */
/************************************************************************/
diff --git a/openbios-devel/include/libopenbios/ofmem.h b/openbios-devel/include/libopenbios/ofmem.h
index 2269fd7..30f20d8 100644
--- a/openbios-devel/include/libopenbios/ofmem.h
+++ b/openbios-devel/include/libopenbios/ofmem.h
@@ -69,6 +69,8 @@ extern ucell ofmem_arch_get_iomem_top(void);
extern retain_t* ofmem_arch_get_retained(void);
extern int ofmem_arch_get_physaddr_cellsize(void);
extern int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value);
+extern int ofmem_arch_get_available_entry_size(phandle_t ph);
+extern void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size);
extern int ofmem_arch_get_translation_entry_size(void);
extern void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t);
extern ucell ofmem_arch_default_translation_mode( phys_addr_t phys );
@@ -120,6 +122,10 @@ extern void ofmem_release_phys( phys_addr_t phys, ucell size );
extern void ofmem_release_virt( ucell virt, ucell size );
extern phys_addr_t ofmem_translate( ucell virt, ucell *ret_mode );
+/* memory and virtual-memory nodes */
+extern phandle_t s_phandle_memory;
+extern phandle_t s_phandle_mmu;
+
/* Currently the same for all architectures */
#define PAGE_SHIFT 12
diff --git a/openbios-devel/libopenbios/ofmem_common.c b/openbios-devel/libopenbios/ofmem_common.c
index 7f6223b..6d0f417 100644
--- a/openbios-devel/libopenbios/ofmem_common.c
+++ b/openbios-devel/libopenbios/ofmem_common.c
@@ -222,8 +222,8 @@ ofmem_set_property( phandle_t ph, const char *name, const char *buf, int len )
fword("encode-property");
}
-static phandle_t s_phandle_memory = 0;
-static phandle_t s_phandle_mmu = 0;
+phandle_t s_phandle_memory = 0;
+phandle_t s_phandle_mmu = 0;
static void ofmem_update_mmu_translations( void )
{
@@ -290,8 +290,7 @@ static void ofmem_update_memory_available( phandle_t ph, range_t *range,
/* inverse of phys_range list could take 2 or more additional cells for the tail
For /memory, physical addresses may be wider than one ucell. */
- prop_used = (ncells + 1) * sizeof(ucell) *
- (((ph == s_phandle_memory) ? ofmem_arch_get_physaddr_cellsize() : 1) + 1);
+ prop_used = (ncells + 1) * sizeof(ucell) * ofmem_arch_get_available_entry_size(ph) + 1;
if (prop_used > *mem_prop_size) {
@@ -325,28 +324,16 @@ static void ofmem_update_memory_available( phandle_t ph, range_t *range,
size = r->start - start;
if (size) {
- if (ph == s_phandle_memory) {
- /* physical address for /memory */
- ncells += ofmem_arch_encode_physaddr(&prop[ncells], start);
- } else {
- /* virtual address for MMU */
- prop[ncells++] = start;
- }
- prop[ncells++] = size;
+ ofmem_arch_create_available_entry(ph, &prop[ncells], start, size);
+ ncells += ofmem_arch_get_available_entry_size(ph);
}
start = r->start + r->size;
}
/* tail */
if (start < top_address) {
- if (ph == s_phandle_memory) {
- /* physical address for /memory */
- ncells += ofmem_arch_encode_physaddr(&prop[ncells], start);
- } else {
- /* virtual address for MMU */
- prop[ncells++] = start;
- }
- prop[ncells++] = top_address - start;
+ ofmem_arch_create_available_entry(ph, &prop[ncells], start, top_address - start);
+ ncells += ofmem_arch_get_available_entry_size(ph);
}
ofmem_set_property(ph, "available",
--
1.7.2.3
2
2
The Forth dictionary was relocated at run time, incurring also
a copy operation. The source dictionary remained in memory.
It was not possible to run forthstrap without any input files
besides the base dictionary.
Make forthstrap generate a hex dump which can be included in C,
but also contains relocations, so that relocations are performed
by the linker at compile time. Allow dictionary compilation
with no source files.
Don't allocate the dictionary dynamically; reduce ofmem supply
accordingly.
Signed-off-by: Blue Swirl <blauwirbel(a)gmail.com>
---
arch/sparc32/build.xml | 6 +---
arch/sparc32/builtin.c | 9 ++++-
arch/sparc32/ofmem_sparc32.c | 2 +-
arch/sparc32/openbios.c | 10 ++---
include/libopenbios/sys_info.h | 2 +
kernel/bootstrap.c | 71 +++++++++++++++++++++++++++++++++++----
6 files changed, 78 insertions(+), 22 deletions(-)
diff --git a/arch/sparc32/build.xml b/arch/sparc32/build.xml
index 3d2f71d..47ad01a 100644
--- a/arch/sparc32/build.xml
+++ b/arch/sparc32/build.xml
@@ -42,11 +42,7 @@
<executable name="target/include/static-dict.h" target="target"
condition="IMAGE_ELF_EMBEDDED">
<rule><![CDATA[
- $(call quiet-command,true, " GEN $(TARGET_DIR)$@")
- @echo "static const char forth_dictionary[] = {" > $@
- @cat $< | hexdump -ve '1/0 "\t" 8/1 "0x%02x, " 1/0 "\n"' \
- | sed 's/0x ,//g' >> $@
- @echo "};" >> $@]]></rule>
+ $(call quiet-command,$(ODIR)/forthstrap -x -D $@ -d $< </dev/null, "
GEN $(TARGET_DIR)$@")]]></rule>
<external-object source="openbios-sparc32.dict"/>
</executable>
diff --git a/arch/sparc32/builtin.c b/arch/sparc32/builtin.c
index 8bcce4c..839ffd6 100644
--- a/arch/sparc32/builtin.c
+++ b/arch/sparc32/builtin.c
@@ -14,12 +14,17 @@
* wrap an array around the hex'ed dictionary file
*/
+/* 256K for the dictionary */
+#define DICTIONARY_SIZE (256 * 1024 / sizeof(ucell))
+
#include "static-dict.h"
void collect_multiboot_info(struct sys_info *info);
void collect_multiboot_info(struct sys_info *info)
{
info->dict_start=(unsigned long *)forth_dictionary;
- info->dict_end=(unsigned long *)((ucell)forth_dictionary +
- sizeof(forth_dictionary));
+ info->dict_end = (unsigned long *)FORTH_DICTIONARY_END;
+ info->dict_last = (ucell *)((unsigned char *)forth_dictionary +
+ FORTH_DICTIONARY_LAST);
+ info->dict_limit = sizeof(forth_dictionary);
}
diff --git a/arch/sparc32/ofmem_sparc32.c b/arch/sparc32/ofmem_sparc32.c
index 6815349..72079b2 100644
--- a/arch/sparc32/ofmem_sparc32.c
+++ b/arch/sparc32/ofmem_sparc32.c
@@ -21,7 +21,7 @@
#define OF_MALLOC_BASE ((char*)OFMEM + ALIGN_SIZE(sizeof(ofmem_t), 8))
-#define MEMSIZE (512 * 1024)
+#define MEMSIZE (256 * 1024)
static union {
char memory[MEMSIZE];
ofmem_t ofmem;
diff --git a/arch/sparc32/openbios.c b/arch/sparc32/openbios.c
index c940a5f..1d8842a 100644
--- a/arch/sparc32/openbios.c
+++ b/arch/sparc32/openbios.c
@@ -28,7 +28,6 @@
#include "libopenbios/ofmem.h"
#define MEMORY_SIZE (16*1024) /* 16K ram for hosted system */
-#define DICTIONARY_SIZE (256*1024) /* 256K for the dictionary */
#define UUID_FMT
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
#define FW_CFG_SUN4M_DEPTH (FW_CFG_ARCH_LOCAL + 0x00)
@@ -968,12 +967,11 @@ int openbios(void)
collect_sys_info(&sys_info);
- dict = malloc(DICTIONARY_SIZE);
- dictlimit = DICTIONARY_SIZE;
+ dict = (unsigned char *)sys_info.dict_start;
+ dicthead = (cell)sys_info.dict_end;
+ last = sys_info.dict_last;
+ dictlimit = sys_info.dict_limit;
- load_dictionary((char *)sys_info.dict_start,
- (unsigned long)sys_info.dict_end
- - (unsigned long)sys_info.dict_start);
forth_init();
#ifdef CONFIG_DEBUG_BOOT
diff --git a/include/libopenbios/sys_info.h b/include/libopenbios/sys_info.h
index 2eea9af..a8b3cce 100644
--- a/include/libopenbios/sys_info.h
+++ b/include/libopenbios/sys_info.h
@@ -20,6 +20,8 @@ struct sys_info {
} *memrange;
unsigned long *dict_start;
unsigned long *dict_end;
+ cell dict_limit;
+ ucell *dict_last;
};
extern void *elf_boot_notes;
diff --git a/kernel/bootstrap.c b/kernel/bootstrap.c
index 94aaeb8..68fe5dd 100644
--- a/kernel/bootstrap.c
+++ b/kernel/bootstrap.c
@@ -237,6 +237,48 @@ static void write_dictionary(const char *filename)
#endif
}
+static void write_dictionary_hex(const char *filename)
+{
+ FILE *f;
+ ucell *walk;
+
+ f = fopen(filename, "w");
+ if (!f) {
+ printk("panic: can't write to dictionary '%s'.\n", filename);
+ exit(1);
+ }
+
+ fprintf(f, "static ucell forth_dictionary[DICTIONARY_SIZE] = {\n");
+ for (walk = (ucell *)dict; walk < (ucell *)(dict + dicthead); walk++) {
+ int pos, bit, l;
+ ucell val;
+
+ l = (walk - (ucell *)dict);
+ pos = l / BITS;
+ bit = l & ~(-BITS);
+
+ val = read_ucell(walk);
+ if (relocation_address[pos] & target_ucell((ucell)1ULL << bit)) {
+ fprintf(f, "(ucell)((char *)&forth_dictionary + 0x%" FMT_CELL_x
+ "),\n", val);
+ } else {
+ fprintf(f, "0x%" FMT_CELL_x",\n", val);
+ }
+ }
+
+ fprintf(f, "};\n");
+
+ fprintf(f, "#define FORTH_DICTIONARY_LAST 0x%" FMT_CELL_x"\n",
+ (ucell)((unsigned long)last - (unsigned long)dict));
+ fprintf(f, "#define FORTH_DICTIONARY_END 0x%" FMT_CELL_x"\n",
+ (ucell)dicthead);
+ fclose(f);
+
+#ifdef CONFIG_DEBUG_DICTIONARY
+ printk("wrote dictionary to file %s.\n", filename);
+#endif
+}
+
static ucell read_dictionary(char *fil)
{
int ilen;
@@ -1032,7 +1074,8 @@ static void new_dictionary(const char *source)
" write kernel console output to log file\n" \
" -s|--segfault install segfault handler\n" \
" -M|--dependency-dump file\n" \
- " dump dependencies in Makefile
format\n\n"
+ " dump dependencies in Makefile
format\n\n" \
+ " -x|--hexdump output format is C language hex dump\n"
#else
#define USAGE "Usage: %s [options] [dictionary file|source file]\n\n" \
" -h show this help\n" \
@@ -1045,8 +1088,9 @@ static void new_dictionary(const char *source)
" write to output.dict\n" \
" -c output.log\n" \
" write kernel console output to log file\n" \
- " -s install segfault handler\n\n"
- " -M file dump dependencies in Makefile format\n\n"
+ " -s install segfault handler\n\n" \
+ " -M file dump dependencies in Makefile format\n\n" \
+ " -x output format is C language hex dump\n"
#endif
int main(int argc, char *argv[])
@@ -1054,15 +1098,15 @@ int main(int argc, char *argv[])
struct sigaction sa;
unsigned char *ressources=NULL; /* All memory used by us */
- char *dictname = NULL;
+ const char *dictname = NULL;
char *basedict = NULL;
char *consolefile = NULL;
char *depfilename = NULL;
unsigned char *bootstrapdict[2];
- int c, cnt;
+ int c, cnt, hexdump = 0;
- const char *optstring = "VvhsI:d:D:c:M:?";
+ const char *optstring = "VvhsI:d:D:c:M:x?";
while (1) {
#ifdef __GLIBC__
@@ -1077,6 +1121,7 @@ int main(int argc, char *argv[])
{"target-dictionary", 1, NULL, 'D'},
{"console", 1, NULL, 'c'},
{"dependency-dump", 1, NULL, 'M'},
+ {"hexdump", 0, NULL, 'x'},
};
/*
@@ -1132,11 +1177,17 @@ int main(int argc, char *argv[])
depfilename = optarg;
}
break;
+ case 'x':
+ hexdump = 1;
+ break;
default:
return 1;
}
}
+ if (!dictname) {
+ dictname = "bootstrap.dict";
+ }
if (verbose) {
printk(BANNER);
printk("Using source dictionary '%s'\n", basedict);
@@ -1144,7 +1195,7 @@ int main(int argc, char *argv[])
printk("Dumping dependencies to '%s'\n", depfilename);
}
- if (argc < optind + 1) {
+ if (argc < optind) {
printk(USAGE, argv[0]);
return 1;
}
@@ -1243,7 +1294,11 @@ int main(int argc, char *argv[])
#endif
{
relocation_table( bootstrapdict[0], bootstrapdict[1], dicthead);
- write_dictionary( dictname ? dictname : "bootstrap.dict");
+ if (hexdump) {
+ write_dictionary_hex(dictname);
+ } else {
+ write_dictionary(dictname);
+ }
}
free(ressources);
--
1.6.2.4
2
2
Hi all,
Currently attempting to boot a Solaris 8 install CD results in the
following output:
Configuration device id QEMU version 1 machine id 32
CPUs: 1 x FMI,MB86904
UUID: 00000000-0000-0000-0000-000000000000
Welcome to OpenBIOS v1.0 built on Jan 2 2011 00:28
Type 'help' for detailed information
Trying cdrom:d...
Not a bootable ELF image
Loading a.out image...
Loaded 7680 bytes
entry point is 0x4000
bootpath: /iommu/sbus/espdma/esp/sd@2,0:d
Jumping to entry point 00004000 for type 00000005...
switching to new context:
SunOS Release 5.8 Version Generic_108528-09 32-bit
Copyright 1983-2001 Sun Microsystems, Inc. All rights reserved.
qemu: fatal: Trap 0x29 while interrupts disabled, Error state
pc: f004127c npc: f0041280
General Registers:
%g0-7: 00000000 00000808 00000001 f0041b74 00000000 f0243b88 00000000
f0244020
Current Register Window:
%o0-7: f025831c f5a0f00c f0240374 f0240370 f024036c 00000004 f0240300
f005bd84
%l0-7: 04400cc2 f005bf94 f005bf98 00000004 00000209 00000004 00000000
f023fe60
%i0-7: 00000001 f02403f4 f5a0f00c f025831c 00000001 00000009 f023ff08
f005c6b8
Floating Point Registers:
%f00: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f04: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f08: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f12: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f16: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f20: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f24: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
%f28: 000000000.000000 000000000.000000 000000000.000000 000000000.000000
psr: 04000cc2 (icc: ---- SPE: SP-) wim: 00000004
fsr: 00080000 y: 00000000
Aborted
With the SPARC32 OFMEM migration complete, we can now get lots of
debugging information regarding the memory mappings being made at run
time. Setting a breakpoint at the crash address, it is possible to see
that it is part of a loop that called several times during boot. Using
this we can compare the successful iterations of the loop with the
failing version in order to determine where the crash is happening.
Here is the gdb output from the last successful iteration of the loop:
Breakpoint 1, 0xf004127c in ?? ()
(gdb) disas 0xf0041270 0xf00412a0
Dump of assembler code from 0xf0041270 to 0xf00412a0:
0xf0041270: rett %l2 + 4
0xf0041274: b 0xf004127c
0xf0041278: nop
0xf004127c: mov 1, %l5 ! 0x1
0xf0041280: sll %l5, %l0, %l5
0xf0041284: rd %wim, %l3
0xf0041288: btst 0x40, %l0
0xf004128c: be 0xf0041318
0xf0041290: btst %l3, %l5
0xf0041294: sub %fp, 0xa8, %l7
0xf0041298: st %g1, [ %l7 + 0x6c ]
0xf004129c: std %g2, [ %l7 + 0x70 ]
End of assembler dump.
(gdb) info regi
g0 0x0 0
g1 0x808 2056
g2 0xf5a0f000 -174002176
g3 0x19 25
g4 0x0 0
g5 0xf0243b88 -266060920
g6 0x0 0
g7 0xf0244020 -266059744
o0 0x0 0
o1 0xf02406b4 -266074444
o2 0xf5a0f00c -174002164
o3 0xf0258398 -265976936
o4 0xf0252b10 -265999600
o5 0x0 0
sp 0xf0240658 0xf0240658
o7 0xf0041b74 -268166284
l0 0x4400cc0 71306432
l1 0xf004b1f8 -268127752
l2 0xf004b1fc -268127748
l3 0xf0041000 -268169216
l4 0x209 521
l5 0x1 1
l6 0x7 7
l7 0xf0240658 -266074536
i0 0xf024d870 -266020752
i1 0x0 0
i2 0xff812201 -8314367
i3 0x0 0
i4 0x0 0
i5 0xf01582dc -267025700
fp 0xf0240290 0xf0240290
i7 0xf004ef98 -268111976
y 0x0 0
psr 0x4400cc0 [ PS S #10 #11 #22 #26 ]
wim 0x1 1
tbr 0xf0040090 -268173168
pc 0xf004127c 0xf004127c
npc 0xf0041280 0xf0041280
fsr 0x80000 [ #19 ]
csr 0x0 0
(gdb) stepi
0xf0041280 in ?? ()
(gdb)
0xf0041284 in ?? ()
(gdb)
0xf0041288 in ?? ()
(gdb)
0xf004128c in ?? ()
(gdb)
0xf0041290 in ?? ()
(gdb)
0xf0041294 in ?? ()
(gdb)
0xf0041298 in ?? ()
(gdb)
0xf004129c in ?? ()
(gdb) info regi
g0 0x0 0
g1 0x808 2056
g2 0xf5a0f000 -174002176
g3 0x19 25
g4 0x0 0
g5 0xf0243b88 -266060920
g6 0x0 0
g7 0xf0244020 -266059744
o0 0x0 0
o1 0xf02406b4 -266074444
o2 0xf5a0f00c -174002164
o3 0xf0258398 -265976936
o4 0xf0252b10 -265999600
o5 0x0 0
sp 0xf0240658 0xf0240658
o7 0xf0041b74 -268166284
l0 0x4400cc0 71306432
l1 0xf004b1f8 -268127752
l2 0xf004b1fc -268127748
l3 0x1 1
l4 0x209 521
l5 0x1 1
l6 0x7 7
l7 0xf02401e8 -266075672
i0 0xf024d870 -266020752
i1 0x0 0
i2 0xff812201 -8314367
i3 0x0 0
i4 0x0 0
i5 0xf01582dc -267025700
fp 0xf0240290 0xf0240290
i7 0xf004ef98 -268111976
y 0x0 0
psr 0x4000cc0 [ PS S #10 #11 #26 ]
wim 0x1 1
tbr 0xf0040090 -268173168
pc 0xf004129c 0xf004129c
npc 0xf00412a0 0xf00412a0
fsr 0x80000 [ #19 ]
csr 0x0 0
And here is the failing version:
(gdb) info regi
g0 0x0 0
g1 0x80 128
g2 0xf5a0f000 -174002176
g3 0x1a 26
g4 0x0 0
g5 0xf0243b88 -266060920
g6 0x0 0
g7 0xf0244020 -266059744
o0 0x0 0
o1 0xf024047c -266075012
o2 0xf5a0f00c -174002164
o3 0xf0258398 -265976936
o4 0xf0252b10 -265999600
o5 0x0 0
sp 0xf0240420 0xf0240420
o7 0xf0041b74 -268166284
l0 0x4400cc4 71306436
l1 0xf004b1f8 -268127752
l2 0xf004b1fc -268127748
l3 0x10 16
l4 0x209 521
l5 0x10 16
l6 0x7 7
l7 0xf023ffb0 -266076240
i0 0xf5a0f01c -174002148
i1 0x100 256
i2 0xf0000000 -268435456
i3 0xff000000 -16777216
i4 0x4100cc5 68160709
i5 0x4100ce5 68160741
fp 0xf0240058 0xf0240058
i7 0xf0054be8 -268088344
y 0x0 0
psr 0x4000cc4 [ #2 PS S #10 #11 #26 ]
wim 0x10 16
tbr 0xf0040090 -268173168
pc 0xf00412a4 0xf00412a4
npc 0xf00412a8 0xf00412a8
fsr 0x80000 [ #19 ]
csr 0x0 0
(gdb) cont
Continuing.
Breakpoint 1, 0xf004127c in ?? ()
(gdb) stepi
0xf0041280 in ?? ()
(gdb)
0xf0041284 in ?? ()
(gdb)
0xf0041288 in ?? ()
(gdb)
0xf004128c in ?? ()
(gdb)
0xf0041290 in ?? ()
(gdb)
0xf0041294 in ?? ()
(gdb)
0xf0041298 in ?? ()
(gdb)
Remote connection closed
(gdb)
So the failure appears to be happening on this instruction:
0xf0041298: st %g1, [ %l7 + 0x6c ]
For the successful iteration:
l7 0xf02401e8 -266075672
For the failing iteration:
l7 0xf023ffb0 -266076240
With OFMEM debugging enabled, it's fairly easy to see the following in
the console output:
Jumping to entry point 00004000 for type 00000005...
switching to new context:
OFMEM: ofmem_claim phys=ffffffffffffffff size=00040000 align=00000008
OFMEM: ofmem_claim_virt virt=f0040000 size=00040000 align=00000000
OFMEM: ofmem_map_page_range f0040000 -> 006fc0000 00040000 mode 000000bc
OFMEM: ofmem_claim phys=ffffffffffffffff size=00019000 align=00000008
OFMEM: ofmem_claim_virt virt=f0240000 size=00019000 align=00000000
OFMEM: ofmem_map_page_range f0240000 -> 006fa7000 00019000 mode 000000bc
So what is happening is that %l7 is getting set to below 0xf0240000 and
hence the trap is triggered because the kernel is attempting to write to
unmapped virtual memory.
Using Artyom's blog, I was able to fire up kadb to try and figure out
which part of the kernel is raising the exception:
kadb[0]: 0xf004127c?
sys_trap:
sys_trap: aa102001 = mov 0x1, %l5
kadb[0]:
Based upon this, it would seem that the Solaris kernel allocates a stack
for saving state when a trap is called with a base of 0xf0240000, but
for some reason we are stacking to a point where we go beyond the memory
region allocated for it. I suspect that this is a side effect of a
property/device not being setup correctly, but I'm not yet sure what it
is. Anyhow, I thought I'd post the results of my investigations so far
in case anyone else has any ideas as to what could cause this.
ATB,
Mark.
--
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063
Sirius Labs: http://www.siriusit.co.uk/labs
5
12