OpenBIOS
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- 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
May 2006
- 8 participants
- 40 discussions
Author: stepan
Date: 2006-05-31 22:20:10 +0200 (Wed, 31 May 2006)
New Revision: 37
Modified:
openbios-devel/drivers/esp.c
Log:
keep stack clean
Modified: openbios-devel/drivers/esp.c
===================================================================
--- openbios-devel/drivers/esp.c 2006-05-31 18:09:18 UTC (rev 36)
+++ openbios-devel/drivers/esp.c 2006-05-31 20:20:10 UTC (rev 37)
@@ -144,7 +144,7 @@
short len, short sect_offset)
{
DPRINTF("ob_sd_read_sectors id %d %lx sector=%d len=%d soff %d\n",
- sd->id, (unsigned long)dest, offset, len, sect_offset);
+ sd->id, (unsigned long)dest, offset, len, sect_offset);
// Setup command = Read(10)
memset(esp->buffer, 0, 10);
@@ -262,7 +262,8 @@
phandle_t ph;
fword("my-unit");
- id = POP();
+ id = POP();
+ POP(); // unit id is 2 ints but we only need one.
*sd = &global_esp->sd[id];
#ifdef CONFIG_DEBUG_ESP
1
0
Author: stepan
Date: 2006-05-31 20:09:18 +0200 (Wed, 31 May 2006)
New Revision: 36
Modified:
openbios-devel/arch/sparc32/tree.fs
Log:
have the name match a real sparcstation (solaris wants that)
Modified: openbios-devel/arch/sparc32/tree.fs
===================================================================
--- openbios-devel/arch/sparc32/tree.fs 2006-05-28 18:48:47 UTC (rev 35)
+++ openbios-devel/arch/sparc32/tree.fs 2006-05-31 18:09:18 UTC (rev 36)
@@ -2,8 +2,8 @@
" /" find-device
2 encode-int " #address-cells" property
1 encode-int " #size-cells" property
- " SUNW,SparcStation-5" encode-string " name" property
- " SparcStation" encode-string " banner-name" property
+ " SUNW,SPARCstation-5" encode-string " name" property
+ " SPARCstation 5" encode-string " banner-name" property
" sun4m" encode-string " compatible" property
" /obio/zs@0,100000:a" encode-string " stdin-path" property
" /obio/zs@0,100000:a" encode-string " stdout-path" property
1
0
Author: stepan
Date: 2006-05-28 20:48:47 +0200 (Sun, 28 May 2006)
New Revision: 35
Modified:
openbios-devel/arch/sparc32/boot.c
openbios-devel/arch/sparc32/romvec.c
openbios-devel/drivers/esp.c
openbios-devel/drivers/iommu.c
openbios-devel/drivers/obio.c
Log:
blueswirl's sparc32 patches - boots linux.
Modified: openbios-devel/arch/sparc32/boot.c
===================================================================
--- openbios-devel/arch/sparc32/boot.c 2006-05-26 11:14:20 UTC (rev 34)
+++ openbios-devel/arch/sparc32/boot.c 2006-05-28 18:48:47 UTC (rev 35)
@@ -25,6 +25,7 @@
void boot(void)
{
char *path=pop_fstr_copy(), *param;
+ char altpath[256];
if (kernel_size) {
extern unsigned int qemu_mem_size;
@@ -69,8 +70,15 @@
if (elf_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
if (linux_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
- if (aout_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
- printk("Unsupported image format\n");
+ if (aout_load(&sys_info, path, param) == LOADER_NOT_SUPPORT) {
+ sprintf(altpath, "%s:d", path);
+
+ if (elf_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
+ if (linux_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
+ if (aout_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
+ printk("Unsupported image format\n");
+ }
+
free(path);
}
Modified: openbios-devel/arch/sparc32/romvec.c
===================================================================
--- openbios-devel/arch/sparc32/romvec.c 2006-05-26 11:14:20 UTC (rev 34)
+++ openbios-devel/arch/sparc32/romvec.c 2006-05-28 18:48:47 UTC (rev 35)
@@ -26,418 +26,6 @@
#define PAGE_SIZE 4096
-struct ob_property {
- struct ob_property *next;
- char *name;
- char *value;
- int length;
-};
-
-struct ob_node {
- struct ob_node *next;
- struct ob_node *peer;
- struct ob_node *child;
- struct ob_property *prop;
- int id;
-};
-
-// Workarounds:
-
-// Proll device tree happens to work, why?
-#define PROLL_TREE
-
-// Build a static device tree to avoid Forth access from deep kernel
-//#define STATIC_TREE
-
-#ifdef PROLL_TREE
-struct property {
- const char *name;
- const char *value;
- int length;
-};
-
-struct node {
- const struct property *properties;
- /* short */ const int sibling;
- /* short */ const int child;
-};
-
-static const unsigned char obp_idprom[32] = { 1, 0x80, 0x52, 0x54, 0x00, 0x12, 0x34, 0x56,
- 0,0,0,0, 0,0,0, 0xf7 };
-static const struct property null_properties = { NULL, NULL, -1 };
-static const int prop_true = -1;
-
-static const struct property propv_root[] = {
- {"name", "SUNW,SparcStation-5", sizeof("SUNW,SparcStation-5") },
- {"idprom", (char *)obp_idprom, 32},
- {"banner-name", "SparcStation", sizeof("SparcStation")},
- {"compatible", "sun4m", 6},
- {NULL, NULL, -1}
-};
-
-static const int prop_iommu_reg[] = {
- 0x0, 0x10000000, 0x00000300,
-};
-static const struct property propv_iommu[] = {
- {"name", "iommu", sizeof("iommu")},
- {"reg", (char*)&prop_iommu_reg[0], sizeof(prop_iommu_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_sbus_ranges[] = {
- 0x0, 0x0, 0x0, 0x30000000, 0x10000000,
- 0x1, 0x0, 0x0, 0x40000000, 0x10000000,
- 0x2, 0x0, 0x0, 0x50000000, 0x10000000,
- 0x3, 0x0, 0x0, 0x60000000, 0x10000000,
- 0x4, 0x0, 0x0, 0x70000000, 0x10000000,
-};
-static const struct property propv_sbus[] = {
- {"name", "sbus", 5},
- {"ranges", (char*)&prop_sbus_ranges[0], sizeof(prop_sbus_ranges)},
- {"device_type", "hierarchical", sizeof("hierarchical") },
- {NULL, NULL, -1}
-};
-
-static const int prop_tcx_regs[] = {
- 0x2, 0x00800000, 0x00100000,
- 0x2, 0x02000000, 0x00000001,
- 0x2, 0x04000000, 0x00800000,
- 0x2, 0x06000000, 0x00800000,
- 0x2, 0x0a000000, 0x00000001,
- 0x2, 0x0c000000, 0x00000001,
- 0x2, 0x0e000000, 0x00000001,
- 0x2, 0x00700000, 0x00001000,
- 0x2, 0x00200000, 0x00000004,
- 0x2, 0x00300000, 0x0000081c,
- 0x2, 0x00000000, 0x00010000,
- 0x2, 0x00240000, 0x00000004,
- 0x2, 0x00280000, 0x00000001,
-};
-
-#if 1 /* Zaitcev */
-static const int pixfreq = 0x03dfd240;
-static const int hbporch = 0xa0;
-static const int vfreq = 0x3c;
-#endif
-#if 0 /* Kevin Boone - 70Hz refresh */
-static const int pixfreq = 0x047868C0;
-static const int hbporch = 0x90;
-static const int vfreq = 0x46;
-#endif
-
-static const int vbporch = 0x1d;
-static const int vsync = 0x6;
-static const int hsync = 0x88;
-static const int vfporch = 0x3;
-static const int hfporch = 0x18;
-static const int height = 0x300;
-static const int width = 0x400;
-static const int linebytes = 0x400;
-static const int depth = 24;
-static const int tcx_intr[] = { 5, 0 };
-static const int tcx_interrupts = 5;
-static const struct property propv_sbus_tcx[] = {
- {"name", "SUNW,tcx", sizeof("SUNW,tcx")},
- {"vbporch", (char*)&vbporch, sizeof(int)},
- {"hbporch", (char*)&hbporch, sizeof(int)},
- {"vsync", (char*)&vsync, sizeof(int)},
- {"hsync", (char*)&hsync, sizeof(int)},
- {"vfporch", (char*)&vfporch, sizeof(int)},
- {"hfporch", (char*)&hfporch, sizeof(int)},
- {"pixfreq", (char*)&pixfreq, sizeof(int)},
- {"vfreq", (char*)&vfreq, sizeof(int)},
- {"height", (char*)&height, sizeof(int)},
- {"width", (char*)&width, sizeof(int)},
- {"linebytes", (char*)&linebytes, sizeof(int)},
- {"depth", (char*)&depth, sizeof(int)},
- {"reg", (char*)&prop_tcx_regs[0], sizeof(prop_tcx_regs)},
- {"tcx-8-bit", 0, -1},
- {"intr", (char*)&tcx_intr[0], sizeof(tcx_intr)},
- {"interrupts", (char*)&tcx_interrupts, sizeof(tcx_interrupts)},
- {"device_type", "display", sizeof("display")},
- {NULL, NULL, -1}
-};
-
-static const int prop_cs4231_reg[] = {
- 0x3, 0x0C000000, 0x00000040
-};
-static const int cs4231_interrupts = 5;
-static const int cs4231_intr[] = { 5, 0 };
-
-static const struct property propv_sbus_cs4231[] = {
- {"name", "SUNW,CS4231", sizeof("SUNW,CS4231") },
- {"intr", (char*)&cs4231_intr[0], sizeof(cs4231_intr) },
- {"interrupts", (char*)&cs4231_interrupts, sizeof(cs4231_interrupts) },
- {"reg", (char*)&prop_cs4231_reg[0], sizeof(prop_cs4231_reg) },
- {"device_type", "serial", sizeof("serial") },
- {"alias", "audio", sizeof("audio") },
- {NULL, NULL, -1}
-};
-
-static const int cpu_nctx = 256;
-static const int cpu_cache_line_size = 0x20;
-static const int cpu_cache_nlines = 0x200;
-static const struct property propv_cpu[] = {
- {"name", "STP1012PGA", sizeof("STP1012PGA") },
- {"device_type", "cpu", 4 },
- {"mmu-nctx", (char*)&cpu_nctx, sizeof(int)},
- {"cache-line-size", (char*)&cpu_cache_line_size, sizeof(int)},
- {"cache-nlines", (char*)&cpu_cache_nlines, sizeof(int)},
- {NULL, NULL, -1}
-};
-
-static const int prop_obio_ranges[] = {
- 0x0, 0x0, 0x0, 0x71000000, 0x01000000,
-};
-static const struct property propv_obio[] = {
- {"name", "obio", 5 },
- {"ranges", (char*)&prop_obio_ranges[0], sizeof(prop_obio_ranges) },
- {"device_type", "hierarchical", sizeof("hierarchical") },
- {NULL, NULL, -1}
-};
-
-static const int prop_auxio_reg[] = {
- 0x0, 0x00900000, 0x00000001,
-};
-static const struct property propv_obio_auxio[] = {
- {"name", "auxio", sizeof("auxio") },
- {"reg", (char*)&prop_auxio_reg[0], sizeof(prop_auxio_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_int_reg[] = {
- 0x0, 0x00e00000, 0x00000010,
- 0x0, 0x00e10000, 0x00000010,
-};
-static const struct property propv_obio_int[] = {
- {"name", "interrupt", sizeof("interrupt")},
- {"reg", (char*)&prop_int_reg[0], sizeof(prop_int_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_cnt_reg[] = {
- 0x0, 0x00d00000, 0x00000010,
- 0x0, 0x00d10000, 0x00000010,
-};
-static const struct property propv_obio_cnt[] = {
- {"name", "counter", sizeof("counter")},
- {"reg", (char*)&prop_cnt_reg[0], sizeof(prop_cnt_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_eeprom_reg[] = {
- 0x0, 0x00200000, 0x00002000,
-};
-static const struct property propv_obio_eep[] = {
- {"name", "eeprom", sizeof("eeprom")},
- {"reg", (char*)&prop_eeprom_reg[0], sizeof(prop_eeprom_reg) },
- {"model", "mk48t08", sizeof("mk48t08")},
- {NULL, NULL, -1}
-};
-
-static const int prop_su_reg[] = {
- 0x0, 0x003002f8, 0x00000008,
-};
-static const struct property propv_obio_su[] = {
- {"name", "su", sizeof("su")},
- {"reg", (char*)&prop_su_reg[0], sizeof(prop_su_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_zs_intr[] = { 0x2c, 0x0 };
-static const int prop_zs_reg[] = {
- 0x0, 0x00000000, 0x00000008,
-};
-static void *prop_zs_addr;
-static const int prop_zs_slave = 1;
-static const struct property propv_obio_zs[] = {
- {"name", "zs", sizeof("zs")},
- {"reg", (char*)&prop_zs_reg[0], sizeof(prop_zs_reg) },
- {"slave", (char*)&prop_zs_slave, sizeof(prop_zs_slave) },
- {"device_type", "serial", sizeof("serial") },
- {"intr", (char*)&prop_zs_intr[0], sizeof(prop_zs_intr) },
- {"address", (char*)&prop_zs_addr, sizeof(prop_zs_addr) },
- {"keyboard", (char*)&prop_true, 0},
- {"mouse", (char*)&prop_true, 0},
- {NULL, NULL, -1}
-};
-
-static const int prop_zs1_intr[] = { 0x2c, 0x0 };
-static const int prop_zs1_reg[] = {
- 0x0, 0x00100000, 0x00000008,
-};
-static void *prop_zs1_addr;
-static const int prop_zs1_slave = 0;
-static const struct property propv_obio_zs1[] = {
- {"name", "zs", sizeof("zs")},
- {"reg", (char*)&prop_zs1_reg[0], sizeof(prop_zs1_reg) },
- {"slave", (char*)&prop_zs1_slave, sizeof(prop_zs1_slave) },
- {"device_type", "serial", sizeof("serial") },
- {"intr", (char*)&prop_zs1_intr[0], sizeof(prop_zs1_intr) },
- {"address", (char*)&prop_zs1_addr, sizeof(prop_zs1_addr) },
- {NULL, NULL, -1}
-};
-
-static const int prop_ledma_reg[] = {
- 0x4, 0x08400010, 0x00000020,
-};
-static const int prop_ledma_burst = 0x3f;
-static const struct property propv_sbus_ledma[] = {
- {"name", "ledma", sizeof("ledma")},
- {"reg", (char*)&prop_ledma_reg[0], sizeof(prop_ledma_reg) },
- {"burst-sizes", (char*)&prop_ledma_burst, sizeof(int) },
- {NULL, NULL, -1}
-};
-
-static const int prop_le_reg[] = {
- 0x4, 0x08c00000, 0x00000004,
-};
-static const int prop_le_busmaster_regval = 0x7;
-static const int prop_le_intr[] = { 0x26, 0x0 };
-static const struct property propv_sbus_ledma_le[] = {
- {"name", "le", sizeof("le")},
- {"reg", (char*)&prop_le_reg[0], sizeof(prop_le_reg) },
- {"busmaster-regval", (char*)&prop_le_busmaster_regval, sizeof(int)},
- {"intr", (char*)&prop_le_intr[0], sizeof(prop_le_intr) },
- {NULL, NULL, -1}
-};
-
-static const int prop_espdma_reg[] = {
- 0x4, 0x08400000, 0x00000010,
-};
-
-static const struct property propv_sbus_espdma[] = {
- {"name", "espdma", sizeof("espdma")},
- {"reg", (char*)&prop_espdma_reg[0], sizeof(prop_espdma_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_esp_reg[] = {
- 0x4, 0x08800000, 0x00000040,
-};
-static const int prop_esp_intr[] = { 0x24, 0x0 };
-static const struct property propv_sbus_espdma_esp[] = {
- {"name", "esp", sizeof("esp")},
- {"reg", (char*)&prop_esp_reg[0], sizeof(prop_esp_reg) },
- {"intr", (char*)&prop_esp_intr[0], sizeof(prop_esp_intr) },
- {NULL, NULL, -1}
-};
-
-static const int prop_bpp_reg[] = {
- 0x4, 0x0c800000, 0x0000001c,
-};
-static const int prop_bpp_intr[] = { 0x33, 0x0 };
-static const struct property propv_sbus_bpp[] = {
- {"name", "SUNW,bpp", sizeof("SUNW,bpp")},
- {"reg", (char*)&prop_bpp_reg[0], sizeof(prop_bpp_reg) },
- {"intr", (char*)&prop_bpp_intr[0], sizeof(prop_bpp_intr) },
- {NULL, NULL, -1}
-};
-
-static const int prop_apc_reg[] = {
- 0x4, 0x0a000000, 0x00000010,
-};
-static const struct property propv_sbus_apc[] = {
- {"name", "xxxpower-management", sizeof("xxxpower-management")},
- {"reg", (char*)&prop_apc_reg[0], sizeof(prop_apc_reg) },
- {NULL, NULL, -1}
-};
-
-static const int prop_fd_intr[] = { 0x2b, 0x0 };
-static const int prop_fd_reg[] = {
- 0x0, 0x00400000, 0x0000000f,
-};
-static const struct property propv_obio_fd[] = {
- {"name", "SUNW,fdtwo", sizeof("SUNW,fdtwo")},
- {"reg", (char*)&prop_fd_reg[0], sizeof(prop_fd_reg) },
- {"device_type", "block", sizeof("block") },
- {"intr", (char*)&prop_fd_intr[0], sizeof(prop_fd_intr) },
- {NULL, NULL, -1}
-};
-
-static const int prop_pw_intr[] = { 0x22, 0x0 };
-static const int prop_pw_reg[] = {
- 0x0, 0x00910000, 0x00000001,
-};
-static const struct property propv_obio_pw[] = {
- {"name", "power", sizeof("power")},
- {"reg", (char*)&prop_pw_reg[0], sizeof(prop_pw_reg) },
- {"intr", (char*)&prop_pw_intr[0], sizeof(prop_pw_intr) },
- {NULL, NULL, -1}
-};
-
-static const int prop_cf_reg[] = {
- 0x0, 0x00800000, 0x00000001,
-};
-static const struct property propv_obio_cf[] = {
- {"name", "slavioconfig", sizeof("slavioconfig")},
- {"reg", (char*)&prop_cf_reg[0], sizeof(prop_cf_reg) },
- {NULL, NULL, -1}
-};
-
-static const struct property propv_options[] = {
- {"name", "options", sizeof("options")},
- {"screen-#columns", "80", sizeof("80")},
- {"screen-#rows", "25", sizeof("25")},
- {"tpe-link-test?", (char *)&prop_true, 0},
- {"ttya-mode", "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
- {"ttya-ignore-cd", (char *)&prop_true, 0},
- {"ttya-rts-dtr-off", 0, -1},
- {"ttyb-mode", "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
- {"ttyb-ignore-cd", (char *)&prop_true, 0},
- {"ttyb-rts-dtr-off", 0, -1},
- {NULL, NULL, -1}
-};
-
-static int prop_mem_reg[3];
-static int prop_mem_avail[3];
-
-static const struct property propv_memory[] = {
- {"name", "memory", sizeof("memory")},
- {"reg", (char*)&prop_mem_reg[0], sizeof(prop_mem_reg) },
- {"available", (char*)&prop_mem_avail[0], sizeof(prop_mem_avail) },
- {NULL, NULL, -1}
-};
-
-static int prop_vmem_avail[6];
-
-static const struct property propv_vmemory[] = {
- {"name", "virtual-memory", sizeof("virtual-memory")},
- {"available", (char*)&prop_vmem_avail[0], sizeof(prop_vmem_avail) },
- {NULL, NULL, -1}
-};
-
-static const struct node nodes[] = {
- { &null_properties, 1, 0 }, /* 0 = big brother of root */
- { propv_root, 0, 2 }, /* 1 "/" */
- { propv_iommu, 12, 3 }, /* 2 "/iommu" */
- { propv_sbus, 0, 4 }, /* 3 "/iommu/sbus" */
- { propv_sbus_tcx, 5, 0 }, /* 4 "/iommu/sbus/SUNW,tcx" */
- { propv_sbus_ledma, 7, 6 }, /* 5 "/iommu/sbus/ledma" */
- { propv_sbus_ledma_le, 0, 0 }, /* 6 "/iommu/sbus/ledma/le" */
- { propv_sbus_cs4231, 8, 0 }, /* 7 "/iommu/sbus/SUNW,CS4231 */
- { propv_sbus_bpp, 9, 0 }, /* 8 "/iommu/sbus/SUNW,bpp */
- { propv_sbus_espdma, 11, 10 }, /* 9 "/iommu/sbus/espdma" */
- { propv_sbus_espdma_esp, 0, 0 }, /* 10 "/iommu/sbus/espdma/esp" */
- { propv_sbus_apc, 0, 0 }, /* 11 "/iommu/sbus/power-management */
- { propv_cpu, 13, 0 }, /* 12 "/STP1012PGA" */
- { propv_obio, 23, 14 }, /* 13 "/obio" */
- { propv_obio_int, 15, 0 }, /* 14 "/obio/interrupt" */
- { propv_obio_cnt, 16, 0 }, /* 15 "/obio/counter" */
- { propv_obio_eep, 17, 0 }, /* 16 "/obio/eeprom" */
- { propv_obio_auxio, 18, 0 }, /* 17 "/obio/auxio" */
- { propv_obio_zs1, 19, 0 }, /* 18 "/obio/zs@0,100000"
- Must be before zs@0,0! */
- { propv_obio_zs, 20, 0 }, /* 19 "/obio/zs@0,0" */
- { propv_obio_fd, 21, 0 }, /* 20 "/obio/SUNW,fdtwo" */
- { propv_obio_pw, 22, 0 }, /* 21 "/obio/power" */
- { propv_obio_cf, 0, 0 }, /* 22 "/obio/slavioconfig@0,800000" */
- { propv_options, 24, 0 }, /* 23 "/options" */
- { propv_memory, 25, 0 }, /* 24 "/memory" */
- { propv_vmemory, 0, 0 }, /* 25 "/virtual-memory" */
-};
-#endif
-
static struct linux_mlist_v0 totphys[1];
static struct linux_mlist_v0 totmap[1];
static struct linux_mlist_v0 totavail[1];
@@ -469,83 +57,8 @@
{
}
-#ifdef PROLL_TREE
-static const struct property *find_property(int node,char *name)
-{
- const struct property *prop = &nodes[node].properties[0];
- while (prop && prop->name) {
- if (strcmp(prop->name, name) == 0)
- return prop;
- prop++;
- }
- return NULL;
-}
-
static int obp_nextnode(int node)
{
- DPRINTF("obp_nextnode(%d) = %d\n", node, nodes[node].sibling);
- return nodes[node].sibling;
-}
-
-static int obp_child(int node)
-{
- DPRINTF("obp_child(%d) = %d\n", node, nodes[node].child);
- return nodes[node].child;
-}
-
-static int obp_proplen(int node, char *name)
-{
- const struct property *prop = find_property(node,name);
- if (prop) {
- DPRINTF("obp_proplen(%d, %s) = %d\n", node, name, prop->length);
- return prop->length;
- }
- DPRINTF("obp_proplen(%d, %s) (no prop)\n", node, name);
- return -1;
-}
-
-static int obp_getprop(int node, char *name, char *value)
-{
- const struct property *prop;
-
- if (!name || *name == '\0') {
- // NULL name means get first property
- DPRINTF("obp_getprop(%d, (NULL)) = %s\n", node,
- nodes[node].properties[0].name);
- return (int)nodes[node].properties[0].name;
- }
- prop = find_property(node,name);
- if (prop) {
- memcpy(value,prop->value,prop->length);
- DPRINTF("obp_getprop(%d, %s) = %s\n", node, name, value);
- return prop->length;
- }
- DPRINTF("obp_getprop(%d, %s): not found\n", node, name);
- return -1;
-}
-
-static const char *obp_nextprop(int node,char *name)
-{
- const struct property *prop;
-
- if (!name || *name == '\0') {
- // NULL name means get first property
- DPRINTF("obp_nextprop(%d, NULL) = %s\n", node,
- nodes[node].properties[0].name);
- return nodes[node].properties[0].name;
- }
- prop = find_property(node,name);
- if (prop && prop[1].name) {
- DPRINTF("obp_nextprop(%d, %s) = %s\n", node, name, prop[1].name);
- return prop[1].name;
- }
- DPRINTF("obp_nextprop(%d, %s): not found\n", node, name);
- return "";
-}
-
-#else
-static int obp_nextnode(int node)
-{
int peer;
PUSH(node);
@@ -668,209 +181,7 @@
return str;
}
}
-#endif
-#ifdef STATIC_TREE
-static void
-get_props(struct ob_node *node)
-{
- struct ob_property *currprop;
- const char *name;
-
- name = obp_nextprop(node->id, NULL);
- if (!name || (int)name == -1) {
- node->prop = NULL;
- return;
- }
- node->prop = malloc(sizeof(*node->prop));
- currprop = node->prop;
- for (;;) {
- currprop->length = obp_proplen(node->id, (char *)name);
- currprop->name = malloc(strlen(name) + 1);
- strcpy(currprop->name, name);
- if (currprop->length > 0) {
- currprop->value = malloc(currprop->length);
- obp_getprop(node->id, currprop->name, currprop->value);
- }
-
- name = obp_nextprop(node->id, currprop->name);
- if (!name || *name == '\0') {
- currprop->next = NULL;
- return;
- } else {
- currprop->next = malloc(sizeof(*currprop->next));
- currprop = currprop->next;
- }
- }
-}
-
-static struct ob_node *
-get_node(struct ob_node *tree)
-{
- struct ob_node *chain = tree;
- int node;
-
- if (tree->id)
- get_props(tree);
-
- DPRINTF("visiting 0x%x\n", tree->id);
- node = obp_child(tree->id);
- if (node) {
- DPRINTF("visiting 0x%x's child 0x%x\n", tree->id, node);
- tree->child = malloc(sizeof(*tree->child));
- tree->child->id = node;
- chain->next = tree->child;
- chain = get_node(tree->child);
- } else {
- tree->child = NULL;
- }
- node = obp_nextnode(tree->id);
- if (node) {
- DPRINTF("visiting 0x%x's peer 0x%x\n", tree->id, node);
- tree->peer = malloc(sizeof(*tree->peer));
- tree->peer->id = node;
- chain->next = tree->peer;
- chain = get_node(tree->peer);
- } else {
- tree->peer = NULL;
- }
- return chain;
-}
-
-static struct ob_node *tree;
-
-static void
-get_tree(void)
-{
- tree = malloc(sizeof(*tree));
- tree->id = 0;
- (void)get_node(tree);
- DPRINTF("Static tree finished.\n");
-}
-
-static struct ob_node *find_node(int node)
-{
- struct ob_node *onode;
-
- for (onode = tree; onode != NULL && onode->id != node; onode = onode->next);
-
- return onode;
-}
-
-static struct ob_property *find_static_property(int node, char *name)
-{
- struct ob_node *onode = find_node(node);
- struct ob_property *prop = onode->prop;
-
- while (prop && prop->name) {
- if (strcmp(prop->name, name) == 0)
- return prop;
- prop = prop->next;
- }
-
- return NULL;
-}
-
-static int obp_static_nextnode(int node)
-{
- int nextnode = -1;
- struct ob_node *onode = find_node(node);
-
- if (onode && onode->peer)
- nextnode = onode->peer->id;
-
- DPRINTF("obp_static_nextnode(%d) = %d\n", node, nextnode);
-
- return nextnode;
-}
-
-static int obp_static_child(int node)
-{
- int child = -1;
- struct ob_node *onode = find_node(node);
-
- if (onode && onode->child)
- child = onode->child->id;
-
- DPRINTF("obp_static_child(%d) = %d\n", node, child);
-
- return child;
-}
-
-static int obp_static_proplen(int node, char *name)
-{
- struct ob_property *prop = find_static_property(node, name);
-
- if (prop) {
- DPRINTF("obp_static_proplen(%d, %s) = %d\n", node, name, prop->length);
-
- return prop->length;
- }
-
- DPRINTF("obp_static_proplen(%d, %s) (no prop)\n", node, name);
-
- return -1;
-}
-
-static int obp_static_getprop(int node, char *name, char *value)
-{
- struct ob_node *currnode;
- struct ob_property *prop;
-
- if (!name || *name == '\0') {
- // NULL name means get first property
- currnode = find_node(node);
- if (!currnode->prop) {
- DPRINTF("obp_static_getprop(%d, (NULL)): not found\n", node);
- return -1;
- }
- name = "NULL";
- prop = currnode->prop;
- } else {
- prop = find_static_property(node, name);
- }
- if (prop && prop->length > 0) {
- memcpy(value, prop->value, prop->length);
- DPRINTF("obp_static_getprop(%d, %s) = %s\n", node, name, value);
-
- return prop->length;
- }
-
- DPRINTF("obp_static_getprop(%d, %s): not found\n", node, name);
-
- return -1;
-}
-
-static const char *obp_static_nextprop(int node, char *name)
-{
- struct ob_property *prop;
- struct ob_node *currnode = find_node(node);
-
- if (!name || *name == '\0') {
- // NULL name means get first property
- if (!currnode->prop) {
- DPRINTF("obp_static_nextprop(%d, (NULL)): not found\n", node);
- return "";
- }
- prop = currnode->prop;
- } else {
- prop = find_static_property(node, name);
- prop = prop->next;
- }
- if (prop && prop->name) {
- DPRINTF("obp_static_nextprop(%d, %s) = %s\n", node, name, prop->name);
- return prop->name;
- }
- DPRINTF("obp_static_nextprop(%d, %s): not found\n", node, name);
- return "";
-}
-#define obp_nextnode obp_static_nextnode
-#define obp_child obp_static_child
-#define obp_proplen obp_static_proplen
-#define obp_getprop obp_static_getprop
-#define obp_nextprop obp_static_nextprop
-#endif
-
static int obp_setprop(__attribute__((unused)) int node,
__attribute__((unused)) char *name,
__attribute__((unused)) char *value,
@@ -953,7 +264,7 @@
{
int ret, hi, lo, bs;
- bs = 512; // XXX: real blocksize?
+ bs = 512;
hi = ((uint64_t)offset * bs) >> 32;
lo = ((uint64_t)offset * bs) & 0xffffffff;
@@ -1118,30 +429,15 @@
totavail[0].theres_more = NULL;
totavail[0].start_adr = (char *) 0;
- totavail[0].num_bytes = memsize;
+ totavail[0].num_bytes = va2pa((int)&_data) - PAGE_SIZE;
totmap[0].theres_more = NULL;
totmap[0].start_adr = &_start;
- totmap[0].num_bytes = (unsigned long) &_iomem - (unsigned long) &_start;
+ totmap[0].num_bytes = (unsigned long) &_iomem - (unsigned long) &_start + PAGE_SIZE;
-#ifdef PROLL_TREE
- prop_mem_reg[0] = 0;
- prop_mem_reg[1] = 0;
- prop_mem_reg[2] = memsize;
- prop_mem_avail[0] = 0;
- prop_mem_avail[1] = 0;
- prop_mem_avail[2] = va2pa((int)&_data) - 1;
- prop_vmem_avail[0] = 0;
- prop_vmem_avail[1] = 0;
- prop_vmem_avail[2] = (int)&_start - 1;
- prop_vmem_avail[3] = 0;
- prop_vmem_avail[4] = 0xffe00000;
- prop_vmem_avail[5] = 0x00200000;
-#endif
-
// Linux wants a R/W romvec table
romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;
- romvec0.pv_romvers = 0;
+ romvec0.pv_romvers = 3;
romvec0.pv_plugin_revision = 77;
romvec0.pv_printrev = 0x10203;
romvec0.pv_v0mem.v0_totphys = &ptphys;
@@ -1219,8 +515,5 @@
romvec0.v3_cpuidle = obp_cpuidle;
romvec0.v3_cpuresume = obp_cpuresume;
-#ifdef STATIC_TREE
- get_tree();
-#endif
return &romvec0;
}
Modified: openbios-devel/drivers/esp.c
===================================================================
--- openbios-devel/drivers/esp.c 2006-05-26 11:14:20 UTC (rev 34)
+++ openbios-devel/drivers/esp.c 2006-05-28 18:48:47 UTC (rev 35)
@@ -197,8 +197,7 @@
esp->buffer[0] = 0x80;
esp->buffer[1] = INQUIRY;
- esp->buffer[4] = BUFSIZE & 0xff;
- esp->buffer[5] = (BUFSIZE >> 8) & 0xff;
+ esp->buffer[5] = 36;
if (do_command(esp, sd, 7, 36)) {
sd->present = 0;
Modified: openbios-devel/drivers/iommu.c
===================================================================
--- openbios-devel/drivers/iommu.c 2006-05-26 11:14:20 UTC (rev 34)
+++ openbios-devel/drivers/iommu.c 2006-05-28 18:48:47 UTC (rev 35)
@@ -224,7 +224,7 @@
PUSH(0);
fword("encode-int");
fword("encode+");
- PUSH(va2pa((unsigned long)&_data) - 1);
+ PUSH(va2pa((unsigned long)&_data) - PAGE_SIZE);
fword("encode-int");
fword("encode+");
push_str("available");
@@ -249,7 +249,7 @@
PUSH(0);
fword("encode-int");
fword("encode+");
- PUSH(va2pa((unsigned long)&_start) - 1);
+ PUSH((unsigned long)&_start - PAGE_SIZE);
fword("encode-int");
fword("encode+");
Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c 2006-05-26 11:14:20 UTC (rev 34)
+++ openbios-devel/drivers/obio.c 2006-05-28 18:48:47 UTC (rev 35)
@@ -389,10 +389,11 @@
ob_set_obio_ranges(slavio_base);
#endif
+ // Must be before zs@0,0 or Linux won't boot
+ ob_zs_init(slavio_base, SLAVIO_ZS1, ZS_INTR, 0, 0);
+
ob_zs_init(slavio_base, SLAVIO_ZS, ZS_INTR, 1, 1);
- ob_zs_init(slavio_base, SLAVIO_ZS1, ZS_INTR, 0, 0);
-
ob_nvram_init(slavio_base, SLAVIO_NVRAM);
ob_fd_init(slavio_base, SLAVIO_FD, FD_INTR);
1
0
I finally remembered one trick I did in Proll, zs@0,0 must be after the
other zs node. This helped OpenBIOS also, now we get command prompt in Qemu
sparc-test using unbuffered Forth tree.
We can also bump the Prom version to 3, which was not possible before due to
mixed trees (inst2pkg didn't work with Proll ids).
Available memory length was not correct, and that caused memory corruption
problems.
Trying to boot from :d partition helps NetBSD booting.
The ESP fix is related to new SCSI handling code in Qemu CVS.
In my CD booting tests OpenBIOS matches Proll performance now, except Aurora
1.0 doesn't recognise the CDROM. The missing features remaining are
graphical console, SMP support (easy, but didn't work in Proll either) and
TFTP net booting (not very useful).
_________________________________________________________________
Don't just search. Find. Check out the new MSN Search!
http://search.msn.com/
1
0
Author: stepan
Date: 2006-05-26 13:14:20 +0200 (Fri, 26 May 2006)
New Revision: 34
Modified:
openbios-devel/arch/unix/unix.c
openbios-devel/forth/admin/devices.fs
openbios-devel/kernel/bootstrap.c
Log:
- update dates
- fix address output of ls
Modified: openbios-devel/arch/unix/unix.c
===================================================================
--- openbios-devel/arch/unix/unix.c 2006-05-26 10:37:37 UTC (rev 33)
+++ openbios-devel/arch/unix/unix.c 2006-05-26 11:14:20 UTC (rev 34)
@@ -350,7 +350,7 @@
* main loop
*/
-#define BANNER "OpenBIOS core. (C) 2003-2005 Patrick Mauritz, Stefan Reinauer\n"\
+#define BANNER "OpenBIOS core. (C) 2003-2006 Patrick Mauritz, Stefan Reinauer\n"\
"This software comes with absolutely no warranty. "\
"All rights reserved.\n\n"
Modified: openbios-devel/forth/admin/devices.fs
===================================================================
--- openbios-devel/forth/admin/devices.fs 2006-05-26 10:37:37 UTC (rev 33)
+++ openbios-devel/forth/admin/devices.fs 2006-05-26 11:14:20 UTC (rev 34)
@@ -2,7 +2,8 @@
\
\ this code implements IEEE 1275-1994
\
-\ Copyright (C) 2003 Samuel Rydh, Stefan Reinauer
+\ Copyright (C) 2003 Samuel Rydh
+\ Copyright (C) 2003-2006 Stefan Reinauer
\
\ See the file "COPYING" for further information about
\ the copyright and warranty status of this work.
@@ -204,7 +205,7 @@
cr
?active-package >dn.child @
begin dup while
- dup . dup pnodename type cr
+ dup u. dup pnodename type cr
>dn.peer @
repeat
drop
Modified: openbios-devel/kernel/bootstrap.c
===================================================================
--- openbios-devel/kernel/bootstrap.c 2006-05-26 10:37:37 UTC (rev 33)
+++ openbios-devel/kernel/bootstrap.c 2006-05-26 11:14:20 UTC (rev 34)
@@ -1,6 +1,6 @@
/* tag: forth bootstrap environment
*
- * Copyright (C) 2003-2005 Stefan Reinauer, Patrick Mauritz
+ * Copyright (C) 2003-2006 Stefan Reinauer, Patrick Mauritz
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
@@ -920,7 +920,7 @@
* main loop
*/
-#define BANNER "OpenBIOS bootstrap kernel. (C) 2003-2005 Patrick Mauritz, Stefan Reinauer\n"\
+#define BANNER "OpenBIOS bootstrap kernel. (C) 2003-2006 Patrick Mauritz, Stefan Reinauer\n"\
"This software comes with absolutely no warranty. "\
"All rights reserved.\n\n"
1
0
Author: stepan
Date: 2006-05-26 12:37:37 +0200 (Fri, 26 May 2006)
New Revision: 33
Modified:
openbios-devel/arch/sparc32/romvec.c
Log:
make sparc32 boot linux. This should be stripped down again
Modified: openbios-devel/arch/sparc32/romvec.c
===================================================================
--- openbios-devel/arch/sparc32/romvec.c 2006-05-25 21:02:53 UTC (rev 32)
+++ openbios-devel/arch/sparc32/romvec.c 2006-05-26 10:37:37 UTC (rev 33)
@@ -26,6 +26,418 @@
#define PAGE_SIZE 4096
+struct ob_property {
+ struct ob_property *next;
+ char *name;
+ char *value;
+ int length;
+};
+
+struct ob_node {
+ struct ob_node *next;
+ struct ob_node *peer;
+ struct ob_node *child;
+ struct ob_property *prop;
+ int id;
+};
+
+// Workarounds:
+
+// Proll device tree happens to work, why?
+#define PROLL_TREE
+
+// Build a static device tree to avoid Forth access from deep kernel
+//#define STATIC_TREE
+
+#ifdef PROLL_TREE
+struct property {
+ const char *name;
+ const char *value;
+ int length;
+};
+
+struct node {
+ const struct property *properties;
+ /* short */ const int sibling;
+ /* short */ const int child;
+};
+
+static const unsigned char obp_idprom[32] = { 1, 0x80, 0x52, 0x54, 0x00, 0x12, 0x34, 0x56,
+ 0,0,0,0, 0,0,0, 0xf7 };
+static const struct property null_properties = { NULL, NULL, -1 };
+static const int prop_true = -1;
+
+static const struct property propv_root[] = {
+ {"name", "SUNW,SparcStation-5", sizeof("SUNW,SparcStation-5") },
+ {"idprom", (char *)obp_idprom, 32},
+ {"banner-name", "SparcStation", sizeof("SparcStation")},
+ {"compatible", "sun4m", 6},
+ {NULL, NULL, -1}
+};
+
+static const int prop_iommu_reg[] = {
+ 0x0, 0x10000000, 0x00000300,
+};
+static const struct property propv_iommu[] = {
+ {"name", "iommu", sizeof("iommu")},
+ {"reg", (char*)&prop_iommu_reg[0], sizeof(prop_iommu_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_sbus_ranges[] = {
+ 0x0, 0x0, 0x0, 0x30000000, 0x10000000,
+ 0x1, 0x0, 0x0, 0x40000000, 0x10000000,
+ 0x2, 0x0, 0x0, 0x50000000, 0x10000000,
+ 0x3, 0x0, 0x0, 0x60000000, 0x10000000,
+ 0x4, 0x0, 0x0, 0x70000000, 0x10000000,
+};
+static const struct property propv_sbus[] = {
+ {"name", "sbus", 5},
+ {"ranges", (char*)&prop_sbus_ranges[0], sizeof(prop_sbus_ranges)},
+ {"device_type", "hierarchical", sizeof("hierarchical") },
+ {NULL, NULL, -1}
+};
+
+static const int prop_tcx_regs[] = {
+ 0x2, 0x00800000, 0x00100000,
+ 0x2, 0x02000000, 0x00000001,
+ 0x2, 0x04000000, 0x00800000,
+ 0x2, 0x06000000, 0x00800000,
+ 0x2, 0x0a000000, 0x00000001,
+ 0x2, 0x0c000000, 0x00000001,
+ 0x2, 0x0e000000, 0x00000001,
+ 0x2, 0x00700000, 0x00001000,
+ 0x2, 0x00200000, 0x00000004,
+ 0x2, 0x00300000, 0x0000081c,
+ 0x2, 0x00000000, 0x00010000,
+ 0x2, 0x00240000, 0x00000004,
+ 0x2, 0x00280000, 0x00000001,
+};
+
+#if 1 /* Zaitcev */
+static const int pixfreq = 0x03dfd240;
+static const int hbporch = 0xa0;
+static const int vfreq = 0x3c;
+#endif
+#if 0 /* Kevin Boone - 70Hz refresh */
+static const int pixfreq = 0x047868C0;
+static const int hbporch = 0x90;
+static const int vfreq = 0x46;
+#endif
+
+static const int vbporch = 0x1d;
+static const int vsync = 0x6;
+static const int hsync = 0x88;
+static const int vfporch = 0x3;
+static const int hfporch = 0x18;
+static const int height = 0x300;
+static const int width = 0x400;
+static const int linebytes = 0x400;
+static const int depth = 24;
+static const int tcx_intr[] = { 5, 0 };
+static const int tcx_interrupts = 5;
+static const struct property propv_sbus_tcx[] = {
+ {"name", "SUNW,tcx", sizeof("SUNW,tcx")},
+ {"vbporch", (char*)&vbporch, sizeof(int)},
+ {"hbporch", (char*)&hbporch, sizeof(int)},
+ {"vsync", (char*)&vsync, sizeof(int)},
+ {"hsync", (char*)&hsync, sizeof(int)},
+ {"vfporch", (char*)&vfporch, sizeof(int)},
+ {"hfporch", (char*)&hfporch, sizeof(int)},
+ {"pixfreq", (char*)&pixfreq, sizeof(int)},
+ {"vfreq", (char*)&vfreq, sizeof(int)},
+ {"height", (char*)&height, sizeof(int)},
+ {"width", (char*)&width, sizeof(int)},
+ {"linebytes", (char*)&linebytes, sizeof(int)},
+ {"depth", (char*)&depth, sizeof(int)},
+ {"reg", (char*)&prop_tcx_regs[0], sizeof(prop_tcx_regs)},
+ {"tcx-8-bit", 0, -1},
+ {"intr", (char*)&tcx_intr[0], sizeof(tcx_intr)},
+ {"interrupts", (char*)&tcx_interrupts, sizeof(tcx_interrupts)},
+ {"device_type", "display", sizeof("display")},
+ {NULL, NULL, -1}
+};
+
+static const int prop_cs4231_reg[] = {
+ 0x3, 0x0C000000, 0x00000040
+};
+static const int cs4231_interrupts = 5;
+static const int cs4231_intr[] = { 5, 0 };
+
+static const struct property propv_sbus_cs4231[] = {
+ {"name", "SUNW,CS4231", sizeof("SUNW,CS4231") },
+ {"intr", (char*)&cs4231_intr[0], sizeof(cs4231_intr) },
+ {"interrupts", (char*)&cs4231_interrupts, sizeof(cs4231_interrupts) },
+ {"reg", (char*)&prop_cs4231_reg[0], sizeof(prop_cs4231_reg) },
+ {"device_type", "serial", sizeof("serial") },
+ {"alias", "audio", sizeof("audio") },
+ {NULL, NULL, -1}
+};
+
+static const int cpu_nctx = 256;
+static const int cpu_cache_line_size = 0x20;
+static const int cpu_cache_nlines = 0x200;
+static const struct property propv_cpu[] = {
+ {"name", "STP1012PGA", sizeof("STP1012PGA") },
+ {"device_type", "cpu", 4 },
+ {"mmu-nctx", (char*)&cpu_nctx, sizeof(int)},
+ {"cache-line-size", (char*)&cpu_cache_line_size, sizeof(int)},
+ {"cache-nlines", (char*)&cpu_cache_nlines, sizeof(int)},
+ {NULL, NULL, -1}
+};
+
+static const int prop_obio_ranges[] = {
+ 0x0, 0x0, 0x0, 0x71000000, 0x01000000,
+};
+static const struct property propv_obio[] = {
+ {"name", "obio", 5 },
+ {"ranges", (char*)&prop_obio_ranges[0], sizeof(prop_obio_ranges) },
+ {"device_type", "hierarchical", sizeof("hierarchical") },
+ {NULL, NULL, -1}
+};
+
+static const int prop_auxio_reg[] = {
+ 0x0, 0x00900000, 0x00000001,
+};
+static const struct property propv_obio_auxio[] = {
+ {"name", "auxio", sizeof("auxio") },
+ {"reg", (char*)&prop_auxio_reg[0], sizeof(prop_auxio_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_int_reg[] = {
+ 0x0, 0x00e00000, 0x00000010,
+ 0x0, 0x00e10000, 0x00000010,
+};
+static const struct property propv_obio_int[] = {
+ {"name", "interrupt", sizeof("interrupt")},
+ {"reg", (char*)&prop_int_reg[0], sizeof(prop_int_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_cnt_reg[] = {
+ 0x0, 0x00d00000, 0x00000010,
+ 0x0, 0x00d10000, 0x00000010,
+};
+static const struct property propv_obio_cnt[] = {
+ {"name", "counter", sizeof("counter")},
+ {"reg", (char*)&prop_cnt_reg[0], sizeof(prop_cnt_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_eeprom_reg[] = {
+ 0x0, 0x00200000, 0x00002000,
+};
+static const struct property propv_obio_eep[] = {
+ {"name", "eeprom", sizeof("eeprom")},
+ {"reg", (char*)&prop_eeprom_reg[0], sizeof(prop_eeprom_reg) },
+ {"model", "mk48t08", sizeof("mk48t08")},
+ {NULL, NULL, -1}
+};
+
+static const int prop_su_reg[] = {
+ 0x0, 0x003002f8, 0x00000008,
+};
+static const struct property propv_obio_su[] = {
+ {"name", "su", sizeof("su")},
+ {"reg", (char*)&prop_su_reg[0], sizeof(prop_su_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_zs_intr[] = { 0x2c, 0x0 };
+static const int prop_zs_reg[] = {
+ 0x0, 0x00000000, 0x00000008,
+};
+static void *prop_zs_addr;
+static const int prop_zs_slave = 1;
+static const struct property propv_obio_zs[] = {
+ {"name", "zs", sizeof("zs")},
+ {"reg", (char*)&prop_zs_reg[0], sizeof(prop_zs_reg) },
+ {"slave", (char*)&prop_zs_slave, sizeof(prop_zs_slave) },
+ {"device_type", "serial", sizeof("serial") },
+ {"intr", (char*)&prop_zs_intr[0], sizeof(prop_zs_intr) },
+ {"address", (char*)&prop_zs_addr, sizeof(prop_zs_addr) },
+ {"keyboard", (char*)&prop_true, 0},
+ {"mouse", (char*)&prop_true, 0},
+ {NULL, NULL, -1}
+};
+
+static const int prop_zs1_intr[] = { 0x2c, 0x0 };
+static const int prop_zs1_reg[] = {
+ 0x0, 0x00100000, 0x00000008,
+};
+static void *prop_zs1_addr;
+static const int prop_zs1_slave = 0;
+static const struct property propv_obio_zs1[] = {
+ {"name", "zs", sizeof("zs")},
+ {"reg", (char*)&prop_zs1_reg[0], sizeof(prop_zs1_reg) },
+ {"slave", (char*)&prop_zs1_slave, sizeof(prop_zs1_slave) },
+ {"device_type", "serial", sizeof("serial") },
+ {"intr", (char*)&prop_zs1_intr[0], sizeof(prop_zs1_intr) },
+ {"address", (char*)&prop_zs1_addr, sizeof(prop_zs1_addr) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_ledma_reg[] = {
+ 0x4, 0x08400010, 0x00000020,
+};
+static const int prop_ledma_burst = 0x3f;
+static const struct property propv_sbus_ledma[] = {
+ {"name", "ledma", sizeof("ledma")},
+ {"reg", (char*)&prop_ledma_reg[0], sizeof(prop_ledma_reg) },
+ {"burst-sizes", (char*)&prop_ledma_burst, sizeof(int) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_le_reg[] = {
+ 0x4, 0x08c00000, 0x00000004,
+};
+static const int prop_le_busmaster_regval = 0x7;
+static const int prop_le_intr[] = { 0x26, 0x0 };
+static const struct property propv_sbus_ledma_le[] = {
+ {"name", "le", sizeof("le")},
+ {"reg", (char*)&prop_le_reg[0], sizeof(prop_le_reg) },
+ {"busmaster-regval", (char*)&prop_le_busmaster_regval, sizeof(int)},
+ {"intr", (char*)&prop_le_intr[0], sizeof(prop_le_intr) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_espdma_reg[] = {
+ 0x4, 0x08400000, 0x00000010,
+};
+
+static const struct property propv_sbus_espdma[] = {
+ {"name", "espdma", sizeof("espdma")},
+ {"reg", (char*)&prop_espdma_reg[0], sizeof(prop_espdma_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_esp_reg[] = {
+ 0x4, 0x08800000, 0x00000040,
+};
+static const int prop_esp_intr[] = { 0x24, 0x0 };
+static const struct property propv_sbus_espdma_esp[] = {
+ {"name", "esp", sizeof("esp")},
+ {"reg", (char*)&prop_esp_reg[0], sizeof(prop_esp_reg) },
+ {"intr", (char*)&prop_esp_intr[0], sizeof(prop_esp_intr) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_bpp_reg[] = {
+ 0x4, 0x0c800000, 0x0000001c,
+};
+static const int prop_bpp_intr[] = { 0x33, 0x0 };
+static const struct property propv_sbus_bpp[] = {
+ {"name", "SUNW,bpp", sizeof("SUNW,bpp")},
+ {"reg", (char*)&prop_bpp_reg[0], sizeof(prop_bpp_reg) },
+ {"intr", (char*)&prop_bpp_intr[0], sizeof(prop_bpp_intr) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_apc_reg[] = {
+ 0x4, 0x0a000000, 0x00000010,
+};
+static const struct property propv_sbus_apc[] = {
+ {"name", "xxxpower-management", sizeof("xxxpower-management")},
+ {"reg", (char*)&prop_apc_reg[0], sizeof(prop_apc_reg) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_fd_intr[] = { 0x2b, 0x0 };
+static const int prop_fd_reg[] = {
+ 0x0, 0x00400000, 0x0000000f,
+};
+static const struct property propv_obio_fd[] = {
+ {"name", "SUNW,fdtwo", sizeof("SUNW,fdtwo")},
+ {"reg", (char*)&prop_fd_reg[0], sizeof(prop_fd_reg) },
+ {"device_type", "block", sizeof("block") },
+ {"intr", (char*)&prop_fd_intr[0], sizeof(prop_fd_intr) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_pw_intr[] = { 0x22, 0x0 };
+static const int prop_pw_reg[] = {
+ 0x0, 0x00910000, 0x00000001,
+};
+static const struct property propv_obio_pw[] = {
+ {"name", "power", sizeof("power")},
+ {"reg", (char*)&prop_pw_reg[0], sizeof(prop_pw_reg) },
+ {"intr", (char*)&prop_pw_intr[0], sizeof(prop_pw_intr) },
+ {NULL, NULL, -1}
+};
+
+static const int prop_cf_reg[] = {
+ 0x0, 0x00800000, 0x00000001,
+};
+static const struct property propv_obio_cf[] = {
+ {"name", "slavioconfig", sizeof("slavioconfig")},
+ {"reg", (char*)&prop_cf_reg[0], sizeof(prop_cf_reg) },
+ {NULL, NULL, -1}
+};
+
+static const struct property propv_options[] = {
+ {"name", "options", sizeof("options")},
+ {"screen-#columns", "80", sizeof("80")},
+ {"screen-#rows", "25", sizeof("25")},
+ {"tpe-link-test?", (char *)&prop_true, 0},
+ {"ttya-mode", "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
+ {"ttya-ignore-cd", (char *)&prop_true, 0},
+ {"ttya-rts-dtr-off", 0, -1},
+ {"ttyb-mode", "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
+ {"ttyb-ignore-cd", (char *)&prop_true, 0},
+ {"ttyb-rts-dtr-off", 0, -1},
+ {NULL, NULL, -1}
+};
+
+static int prop_mem_reg[3];
+static int prop_mem_avail[3];
+
+static const struct property propv_memory[] = {
+ {"name", "memory", sizeof("memory")},
+ {"reg", (char*)&prop_mem_reg[0], sizeof(prop_mem_reg) },
+ {"available", (char*)&prop_mem_avail[0], sizeof(prop_mem_avail) },
+ {NULL, NULL, -1}
+};
+
+static int prop_vmem_avail[6];
+
+static const struct property propv_vmemory[] = {
+ {"name", "virtual-memory", sizeof("virtual-memory")},
+ {"available", (char*)&prop_vmem_avail[0], sizeof(prop_vmem_avail) },
+ {NULL, NULL, -1}
+};
+
+static const struct node nodes[] = {
+ { &null_properties, 1, 0 }, /* 0 = big brother of root */
+ { propv_root, 0, 2 }, /* 1 "/" */
+ { propv_iommu, 12, 3 }, /* 2 "/iommu" */
+ { propv_sbus, 0, 4 }, /* 3 "/iommu/sbus" */
+ { propv_sbus_tcx, 5, 0 }, /* 4 "/iommu/sbus/SUNW,tcx" */
+ { propv_sbus_ledma, 7, 6 }, /* 5 "/iommu/sbus/ledma" */
+ { propv_sbus_ledma_le, 0, 0 }, /* 6 "/iommu/sbus/ledma/le" */
+ { propv_sbus_cs4231, 8, 0 }, /* 7 "/iommu/sbus/SUNW,CS4231 */
+ { propv_sbus_bpp, 9, 0 }, /* 8 "/iommu/sbus/SUNW,bpp */
+ { propv_sbus_espdma, 11, 10 }, /* 9 "/iommu/sbus/espdma" */
+ { propv_sbus_espdma_esp, 0, 0 }, /* 10 "/iommu/sbus/espdma/esp" */
+ { propv_sbus_apc, 0, 0 }, /* 11 "/iommu/sbus/power-management */
+ { propv_cpu, 13, 0 }, /* 12 "/STP1012PGA" */
+ { propv_obio, 23, 14 }, /* 13 "/obio" */
+ { propv_obio_int, 15, 0 }, /* 14 "/obio/interrupt" */
+ { propv_obio_cnt, 16, 0 }, /* 15 "/obio/counter" */
+ { propv_obio_eep, 17, 0 }, /* 16 "/obio/eeprom" */
+ { propv_obio_auxio, 18, 0 }, /* 17 "/obio/auxio" */
+ { propv_obio_zs1, 19, 0 }, /* 18 "/obio/zs@0,100000"
+ Must be before zs@0,0! */
+ { propv_obio_zs, 20, 0 }, /* 19 "/obio/zs@0,0" */
+ { propv_obio_fd, 21, 0 }, /* 20 "/obio/SUNW,fdtwo" */
+ { propv_obio_pw, 22, 0 }, /* 21 "/obio/power" */
+ { propv_obio_cf, 0, 0 }, /* 22 "/obio/slavioconfig@0,800000" */
+ { propv_options, 24, 0 }, /* 23 "/options" */
+ { propv_memory, 25, 0 }, /* 24 "/memory" */
+ { propv_vmemory, 0, 0 }, /* 25 "/virtual-memory" */
+};
+#endif
+
static struct linux_mlist_v0 totphys[1];
static struct linux_mlist_v0 totmap[1];
static struct linux_mlist_v0 totavail[1];
@@ -45,16 +457,6 @@
static int obp_devread(int dev_desc, char *buf, int nbytes);
static int obp_devseek(int dev_desc, int hi, int lo);
-static const struct linux_nodeops nodeops0 = {
- obp_nextnode, /* int (*no_nextnode)(int node); */
- obp_child, /* int (*no_child)(int node); */
- obp_proplen, /* int (*no_proplen)(int node, char *name); */
- obp_getprop, /* int (*no_getprop)(int node,char *name,char *val); */
- obp_setprop, /* int (*no_setprop)(int node, char *name,
- char *val, int len); */
- obp_nextprop /* char * (*no_nextprop)(int node, char *name); */
-};
-
static struct linux_arguments_v0 obp_arg;
static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
@@ -67,8 +469,83 @@
{
}
+#ifdef PROLL_TREE
+static const struct property *find_property(int node,char *name)
+{
+ const struct property *prop = &nodes[node].properties[0];
+ while (prop && prop->name) {
+ if (strcmp(prop->name, name) == 0)
+ return prop;
+ prop++;
+ }
+ return NULL;
+}
+
static int obp_nextnode(int node)
{
+ DPRINTF("obp_nextnode(%d) = %d\n", node, nodes[node].sibling);
+ return nodes[node].sibling;
+}
+
+static int obp_child(int node)
+{
+ DPRINTF("obp_child(%d) = %d\n", node, nodes[node].child);
+ return nodes[node].child;
+}
+
+static int obp_proplen(int node, char *name)
+{
+ const struct property *prop = find_property(node,name);
+ if (prop) {
+ DPRINTF("obp_proplen(%d, %s) = %d\n", node, name, prop->length);
+ return prop->length;
+ }
+ DPRINTF("obp_proplen(%d, %s) (no prop)\n", node, name);
+ return -1;
+}
+
+static int obp_getprop(int node, char *name, char *value)
+{
+ const struct property *prop;
+
+ if (!name || *name == '\0') {
+ // NULL name means get first property
+ DPRINTF("obp_getprop(%d, (NULL)) = %s\n", node,
+ nodes[node].properties[0].name);
+ return (int)nodes[node].properties[0].name;
+ }
+ prop = find_property(node,name);
+ if (prop) {
+ memcpy(value,prop->value,prop->length);
+ DPRINTF("obp_getprop(%d, %s) = %s\n", node, name, value);
+ return prop->length;
+ }
+ DPRINTF("obp_getprop(%d, %s): not found\n", node, name);
+ return -1;
+}
+
+static const char *obp_nextprop(int node,char *name)
+{
+ const struct property *prop;
+
+ if (!name || *name == '\0') {
+ // NULL name means get first property
+ DPRINTF("obp_nextprop(%d, NULL) = %s\n", node,
+ nodes[node].properties[0].name);
+ return nodes[node].properties[0].name;
+ }
+ prop = find_property(node,name);
+ if (prop && prop[1].name) {
+ DPRINTF("obp_nextprop(%d, %s) = %s\n", node, name, prop[1].name);
+ return prop[1].name;
+ }
+ DPRINTF("obp_nextprop(%d, %s): not found\n", node, name);
+ return "";
+}
+
+#else
+static int obp_nextnode(int node)
+{
int peer;
PUSH(node);
@@ -117,16 +594,26 @@
static int obp_getprop(int node, char *name, char *value)
{
- int notfound;
+ int notfound, found;
+ int len;
+ char *str;
if (!name) {
// NULL name means get first property
- name = "NULL";
push_str("");
PUSH(node);
fword("next-property");
- notfound = POP();
- notfound = !notfound; // Different return value
+ found = POP();
+ if (found) {
+ len = POP();
+ str = (char *) POP();
+ DPRINTF("obp_getprop(0x%x, NULL) = %s\n", node, str);
+
+ return (int)str;
+ }
+ DPRINTF("obp_getprop(0x%x, NULL) (not found)\n", node);
+
+ return -1;
} else {
push_str(name);
PUSH(node);
@@ -138,12 +625,12 @@
return -1;
} else {
- int len;
- char *str;
-
len = POP();
str = (char *) POP();
- memcpy(value, str, len);
+ if (len > 0)
+ memcpy(value, str, len);
+ else
+ str = "NULL";
DPRINTF("obp_getprop(0x%x, %s) = %s\n", node, name, str);
@@ -151,16 +638,6 @@
}
}
-static int obp_setprop(__attribute__((unused)) int node,
- __attribute__((unused)) char *name,
- __attribute__((unused)) char *value,
- __attribute__((unused)) int len)
-{
- DPRINTF("obp_setprop(0x%x, %s) = %s (%d)\n", node, name, value, len);
-
- return -1;
-}
-
static const char *obp_nextprop(int node, char *name)
{
int found;
@@ -177,8 +654,6 @@
found = POP();
if (!found) {
DPRINTF("obp_nextprop(0x%x, %s) (not found)\n", node, name);
- (void) POP();
- (void) POP();
return "";
} else {
@@ -193,7 +668,229 @@
return str;
}
}
+#endif
+#ifdef STATIC_TREE
+static void
+get_props(struct ob_node *node)
+{
+ struct ob_property *currprop;
+ const char *name;
+
+ name = obp_nextprop(node->id, NULL);
+ if (!name || (int)name == -1) {
+ node->prop = NULL;
+ return;
+ }
+ node->prop = malloc(sizeof(*node->prop));
+ currprop = node->prop;
+ for (;;) {
+ currprop->length = obp_proplen(node->id, (char *)name);
+ currprop->name = malloc(strlen(name) + 1);
+ strcpy(currprop->name, name);
+ if (currprop->length > 0) {
+ currprop->value = malloc(currprop->length);
+ obp_getprop(node->id, currprop->name, currprop->value);
+ }
+
+ name = obp_nextprop(node->id, currprop->name);
+ if (!name || *name == '\0') {
+ currprop->next = NULL;
+ return;
+ } else {
+ currprop->next = malloc(sizeof(*currprop->next));
+ currprop = currprop->next;
+ }
+ }
+}
+
+static struct ob_node *
+get_node(struct ob_node *tree)
+{
+ struct ob_node *chain = tree;
+ int node;
+
+ if (tree->id)
+ get_props(tree);
+
+ DPRINTF("visiting 0x%x\n", tree->id);
+ node = obp_child(tree->id);
+ if (node) {
+ DPRINTF("visiting 0x%x's child 0x%x\n", tree->id, node);
+ tree->child = malloc(sizeof(*tree->child));
+ tree->child->id = node;
+ chain->next = tree->child;
+ chain = get_node(tree->child);
+ } else {
+ tree->child = NULL;
+ }
+ node = obp_nextnode(tree->id);
+ if (node) {
+ DPRINTF("visiting 0x%x's peer 0x%x\n", tree->id, node);
+ tree->peer = malloc(sizeof(*tree->peer));
+ tree->peer->id = node;
+ chain->next = tree->peer;
+ chain = get_node(tree->peer);
+ } else {
+ tree->peer = NULL;
+ }
+ return chain;
+}
+
+static struct ob_node *tree;
+
+static void
+get_tree(void)
+{
+ tree = malloc(sizeof(*tree));
+ tree->id = 0;
+ (void)get_node(tree);
+ DPRINTF("Static tree finished.\n");
+}
+
+static struct ob_node *find_node(int node)
+{
+ struct ob_node *onode;
+
+ for (onode = tree; onode != NULL && onode->id != node; onode = onode->next);
+
+ return onode;
+}
+
+static struct ob_property *find_static_property(int node, char *name)
+{
+ struct ob_node *onode = find_node(node);
+ struct ob_property *prop = onode->prop;
+
+ while (prop && prop->name) {
+ if (strcmp(prop->name, name) == 0)
+ return prop;
+ prop = prop->next;
+ }
+
+ return NULL;
+}
+
+static int obp_static_nextnode(int node)
+{
+ int nextnode = -1;
+ struct ob_node *onode = find_node(node);
+
+ if (onode && onode->peer)
+ nextnode = onode->peer->id;
+
+ DPRINTF("obp_static_nextnode(%d) = %d\n", node, nextnode);
+
+ return nextnode;
+}
+
+static int obp_static_child(int node)
+{
+ int child = -1;
+ struct ob_node *onode = find_node(node);
+
+ if (onode && onode->child)
+ child = onode->child->id;
+
+ DPRINTF("obp_static_child(%d) = %d\n", node, child);
+
+ return child;
+}
+
+static int obp_static_proplen(int node, char *name)
+{
+ struct ob_property *prop = find_static_property(node, name);
+
+ if (prop) {
+ DPRINTF("obp_static_proplen(%d, %s) = %d\n", node, name, prop->length);
+
+ return prop->length;
+ }
+
+ DPRINTF("obp_static_proplen(%d, %s) (no prop)\n", node, name);
+
+ return -1;
+}
+
+static int obp_static_getprop(int node, char *name, char *value)
+{
+ struct ob_node *currnode;
+ struct ob_property *prop;
+
+ if (!name || *name == '\0') {
+ // NULL name means get first property
+ currnode = find_node(node);
+ if (!currnode->prop) {
+ DPRINTF("obp_static_getprop(%d, (NULL)): not found\n", node);
+ return -1;
+ }
+ name = "NULL";
+ prop = currnode->prop;
+ } else {
+ prop = find_static_property(node, name);
+ }
+ if (prop && prop->length > 0) {
+ memcpy(value, prop->value, prop->length);
+ DPRINTF("obp_static_getprop(%d, %s) = %s\n", node, name, value);
+
+ return prop->length;
+ }
+
+ DPRINTF("obp_static_getprop(%d, %s): not found\n", node, name);
+
+ return -1;
+}
+
+static const char *obp_static_nextprop(int node, char *name)
+{
+ struct ob_property *prop;
+ struct ob_node *currnode = find_node(node);
+
+ if (!name || *name == '\0') {
+ // NULL name means get first property
+ if (!currnode->prop) {
+ DPRINTF("obp_static_nextprop(%d, (NULL)): not found\n", node);
+ return "";
+ }
+ prop = currnode->prop;
+ } else {
+ prop = find_static_property(node, name);
+ prop = prop->next;
+ }
+ if (prop && prop->name) {
+ DPRINTF("obp_static_nextprop(%d, %s) = %s\n", node, name, prop->name);
+ return prop->name;
+ }
+ DPRINTF("obp_static_nextprop(%d, %s): not found\n", node, name);
+ return "";
+}
+#define obp_nextnode obp_static_nextnode
+#define obp_child obp_static_child
+#define obp_proplen obp_static_proplen
+#define obp_getprop obp_static_getprop
+#define obp_nextprop obp_static_nextprop
+#endif
+
+static int obp_setprop(__attribute__((unused)) int node,
+ __attribute__((unused)) char *name,
+ __attribute__((unused)) char *value,
+ __attribute__((unused)) int len)
+{
+ DPRINTF("obp_setprop(0x%x, %s) = %s (%d)\n", node, name, value, len);
+
+ return -1;
+}
+
+static const struct linux_nodeops nodeops0 = {
+ obp_nextnode, /* int (*no_nextnode)(int node); */
+ obp_child, /* int (*no_child)(int node); */
+ obp_proplen, /* int (*no_proplen)(int node, char *name); */
+ obp_getprop, /* int (*no_getprop)(int node,char *name,char *val); */
+ obp_setprop, /* int (*no_setprop)(int node, char *name,
+ char *val, int len); */
+ obp_nextprop /* char * (*no_nextprop)(int node, char *name); */
+};
+
static int obp_nbgetchar(void)
{
return getchar();
@@ -209,21 +906,21 @@
static void obp_reboot(char *str)
{
printk("rebooting (%s)\n", str);
- outb(0x71f00000, 1);
+ outb(1, 0x71f00000);
for (;;) {}
}
static void obp_abort(void)
{
printk("abort, power off\n");
- outb(0x71910000, 1);
+ outb(1, 0x71910000);
for (;;) {}
}
static void obp_halt(void)
{
printk("halt, power off\n");
- outb(0x71910000, 1);
+ outb(1, 0x71910000);
for (;;) {}
}
@@ -427,6 +1124,21 @@
totmap[0].start_adr = &_start;
totmap[0].num_bytes = (unsigned long) &_iomem - (unsigned long) &_start;
+#ifdef PROLL_TREE
+ prop_mem_reg[0] = 0;
+ prop_mem_reg[1] = 0;
+ prop_mem_reg[2] = memsize;
+ prop_mem_avail[0] = 0;
+ prop_mem_avail[1] = 0;
+ prop_mem_avail[2] = va2pa((int)&_data) - 1;
+ prop_vmem_avail[0] = 0;
+ prop_vmem_avail[1] = 0;
+ prop_vmem_avail[2] = (int)&_start - 1;
+ prop_vmem_avail[3] = 0;
+ prop_vmem_avail[4] = 0xffe00000;
+ prop_vmem_avail[5] = 0x00200000;
+#endif
+
// Linux wants a R/W romvec table
romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;
romvec0.pv_romvers = 0;
@@ -462,7 +1174,7 @@
romvec0.pv_v2devops.v2_dev_seek = obp_devseek;
obp_arg.boot_dev_ctrl = 0;
obp_arg.boot_dev_unit = 0;
- obp_arg.dev_partition = 4;
+ obp_arg.dev_partition = 0;
obp_arg.argv[0] = "sd(0,0,0):d";
switch(boot_device) {
@@ -473,7 +1185,7 @@
obp_arg.boot_dev[1] = 'd';
break;
case 'd':
- obp_arg.boot_dev_unit = '2';
+ obp_arg.boot_dev_unit = 2;
obp_arg.argv[0] = "sd(0,2,0):d";
// Fall through
case 'c':
@@ -507,5 +1219,8 @@
romvec0.v3_cpuidle = obp_cpuidle;
romvec0.v3_cpuresume = obp_cpuresume;
+#ifdef STATIC_TREE
+ get_tree();
+#endif
return &romvec0;
}
1
0
May 25, 2006
Author: stepan
Date: 2006-05-25 23:02:53 +0200 (Thu, 25 May 2006)
New Revision: 32
Modified:
openbios-devel/arch/sparc32/aoutload.c
openbios-devel/arch/sparc32/ldscript
openbios-devel/drivers/esp.c
openbios-devel/forth/admin/nvram.fs
openbios-devel/modules/sun-parts.c
Log:
blueswirl sparc32 -17 (without romvec.c changes)
Modified: openbios-devel/arch/sparc32/aoutload.c
===================================================================
--- openbios-devel/arch/sparc32/aoutload.c 2006-05-24 11:10:55 UTC (rev 31)
+++ openbios-devel/arch/sparc32/aoutload.c 2006-05-25 21:02:53 UTC (rev 32)
@@ -65,6 +65,7 @@
goto out;
for (offset = 0; offset < 16 * 512; offset += 512) {
+ file_seek(offset);
if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) {
debug("Can't read a.out header\n");
retval = LOADER_NOT_SUPPORT;
@@ -72,8 +73,6 @@
}
if (!N_BADMAG(ehdr))
break;
-
- file_seek(offset);
}
if (N_BADMAG(ehdr)) {
Modified: openbios-devel/arch/sparc32/ldscript
===================================================================
--- openbios-devel/arch/sparc32/ldscript 2006-05-24 11:10:55 UTC (rev 31)
+++ openbios-devel/arch/sparc32/ldscript 2006-05-25 21:02:53 UTC (rev 32)
@@ -14,7 +14,7 @@
HEAP_SIZE = 16384;
STACK_SIZE = 16384;
VMEM_SIZE = 128 * 1024;
-IOMEM_SIZE = 128 * 1024;
+IOMEM_SIZE = 256 * 1024;
SECTIONS
{
Modified: openbios-devel/drivers/esp.c
===================================================================
--- openbios-devel/drivers/esp.c 2006-05-24 11:10:55 UTC (rev 31)
+++ openbios-devel/drivers/esp.c 2006-05-25 21:02:53 UTC (rev 32)
@@ -140,9 +140,11 @@
// offset is multiple of 512, len in bytes
static int
-ob_sd_read_sectors(esp_private_t *esp, sd_private_t *sd, int offset, void *dest, short len)
+ob_sd_read_sectors(esp_private_t *esp, sd_private_t *sd, int offset, void *dest,
+ short len, short sect_offset)
{
- DPRINTF("ob_sd_read_sectors id %d %lx block=%d len=%d\n", sd->id, (unsigned long)dest, offset, len);
+ DPRINTF("ob_sd_read_sectors id %d %lx sector=%d len=%d soff %d\n",
+ sd->id, (unsigned long)dest, offset, len, sect_offset);
// Setup command = Read(10)
memset(esp->buffer, 0, 10);
@@ -157,10 +159,10 @@
esp->buffer[8] = (len >> 8) & 0xff;
esp->buffer[9] = len & 0xff;
- if (do_command(esp, sd, 10, len * 512))
+ if (do_command(esp, sd, 10, len * 512 + sect_offset))
return 0;
- memcpy(dest, esp->buffer, len * 512);
+ memcpy(dest, esp->buffer + sect_offset, len * 512);
return 0;
}
@@ -179,12 +181,8 @@
return 0;
}
- sd->sectors = (esp->buffer[0] << 24) | (esp->buffer[1] << 16) | (esp->buffer[2] << 8) | esp->buffer[3];
-#if 0
sd->bs = (esp->buffer[4] << 24) | (esp->buffer[5] << 16) | (esp->buffer[6] << 8) | esp->buffer[7];
-#else
- sd->bs = 512;
-#endif
+ sd->sectors = ((esp->buffer[0] << 24) | (esp->buffer[1] << 16) | (esp->buffer[2] << 8) | esp->buffer[3]) * (sd->bs / 512);
return 1;
}
@@ -232,16 +230,20 @@
cell n = POP(), cnt = n;
ucell blk = POP();
char *dest = (char*)POP();
+ int pos, spb, sect_offset;
DPRINTF("ob_sd_read_blocks id %d %lx block=%d n=%d\n", (*sd)->id, (unsigned long)dest, blk, n );
- n *= (*sd)->bs / 512;
+ spb = (*sd)->bs / 512;
while (n) {
- if (ob_sd_read_sectors(global_esp, *sd, blk, dest, 1)) {
- DPRINTF("ob_ide_read_blocks: error\n");
+ sect_offset = blk / spb;
+ pos = (blk - sect_offset * spb) * 512;
+
+ if (ob_sd_read_sectors(global_esp, *sd, sect_offset, dest, 1, pos)) {
+ DPRINTF("ob_sd_read_blocks: error\n");
RET(0);
}
- dest += (*sd)->bs;
+ dest += 512;
n--;
blk++;
}
@@ -249,9 +251,9 @@
}
static void
-ob_sd_block_size(sd_private_t **sd)
+ob_sd_block_size(__attribute__((unused))sd_private_t **sd)
{
- PUSH((*sd)->bs);
+ PUSH(512);
}
static void
Modified: openbios-devel/forth/admin/nvram.fs
===================================================================
--- openbios-devel/forth/admin/nvram.fs 2006-05-24 11:10:55 UTC (rev 31)
+++ openbios-devel/forth/admin/nvram.fs 2006-05-25 21:02:53 UTC (rev 32)
@@ -344,6 +344,17 @@
" true" " little-endian?" bool-config
[THEN]
+[IFDEF] CONFIG_SPARC32
+\ ---- SPARC32 ----
+" true" " tpe-link-test?" bool-config
+" 9600,8,n,1,-" " ttya-mode" str-config
+" true" " ttya-ignore-cd" bool-config
+" false" " ttya-rts-dtr-off" bool-config
+" 9600,8,n,1,-" " ttyb-mode" str-config
+" true" " ttyb-ignore-cd" bool-config
+" false" " ttyb-rts-dtr-off" bool-config
+[THEN]
+
\ --- ??? ---
" " " boot-screen" str-config
" " " boot-script" str-config
Modified: openbios-devel/modules/sun-parts.c
===================================================================
--- openbios-devel/modules/sun-parts.c 2006-05-24 11:10:55 UTC (rev 31)
+++ openbios-devel/modules/sun-parts.c 2006-05-25 21:02:53 UTC (rev 32)
@@ -119,7 +119,7 @@
RET(0);
}
- bs = 512; // XXX get real block size?
+ bs = 512;
/* get partition data */
p = (struct sun_disklabel *)buf;
1
0
I found the cause for memory corruption, the IO map area (set in ldscript)
was not large enough. CD boot works, I fixed the block size issues. CPU halt
and reboot are OK.
There are still some problems with the device tree, somehow Proll tree is
still better than native one. The difference is that using the Forth tree
Linux hangs at some point, but with Proll tree we get shell prompt in Qemu
sparc-test. I'm not sure whether the static tree makes any difference
anymore.
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
1
0
Author: stepan
Date: 2006-05-24 13:10:55 +0200 (Wed, 24 May 2006)
New Revision: 31
Modified:
openbios-devel/fs/grubfs/fsys_ext2fs.c
openbios-devel/fs/grubfs/grubfs_fs.c
openbios-devel/fs/grubfs/iso9660.h
openbios-devel/libc/diskio.c
Log:
some filesystem fixes (mostly remainder from blueswirl's -15)
Modified: openbios-devel/fs/grubfs/fsys_ext2fs.c
===================================================================
--- openbios-devel/fs/grubfs/fsys_ext2fs.c 2006-05-24 10:59:54 UTC (rev 30)
+++ openbios-devel/fs/grubfs/fsys_ext2fs.c 2006-05-24 11:10:55 UTC (rev 31)
@@ -19,10 +19,15 @@
#ifdef FSYS_EXT2FS
+#include "openbios/config.h"
#include "shared.h"
#include "filesys.h"
#include <libc/byteorder.h>
+#ifdef CONFIG_DEBUG_EXT2FS
+#define E2DEBUG
+#endif
+
static int mapblock1, mapblock2;
/* sizes are always in bytes, BLOCK values are always in DEV_BSIZE (sectors) */
Modified: openbios-devel/fs/grubfs/grubfs_fs.c
===================================================================
--- openbios-devel/fs/grubfs/grubfs_fs.c 2006-05-24 10:59:54 UTC (rev 30)
+++ openbios-devel/fs/grubfs/grubfs_fs.c 2006-05-24 11:10:55 UTC (rev 31)
@@ -303,7 +303,7 @@
{
if (filepos < 0 || filepos > filemax)
filepos = filemax;
- if (len < 0 || len > filemax-filepos)
+ if (len > filemax-filepos)
len = filemax - filepos;
errnum = 0;
return curfs->fsys->read_func( buf, len );
Modified: openbios-devel/fs/grubfs/iso9660.h
===================================================================
--- openbios-devel/fs/grubfs/iso9660.h 2006-05-24 10:59:54 UTC (rev 30)
+++ openbios-devel/fs/grubfs/iso9660.h 2006-05-24 11:10:55 UTC (rev 31)
@@ -158,10 +158,13 @@
#define RRMAGIC(c1, c2) ((c1)|(c2) << 8)
-#define CHECK2(ptr, c1, c2) \
- (*(unsigned short *)(ptr) == (((c1) | (c2) << 8) & 0xFFFF))
-#define CHECK4(ptr, c1, c2, c3, c4) \
- (*(unsigned long *)(ptr) == ((c1) | (c2)<<8 | (c3)<<16 | (c4)<<24))
+#define CHECK2(ptr, c1, c2) \
+ (*(ptr) == (c1) && *(ptr + 1) == (c2))
+#define CHECK4(ptr, c1, c2, c3, c4) \
+ (*(unsigned char *)(ptr) == (c1) && \
+ *((unsigned char *)(ptr) + 1) == (c2) && \
+ *((unsigned char *)(ptr) + 2) == (c3) && \
+ *((unsigned char *)(ptr) + 3) == (c4))
#endif /* !ASM_FILE */
Modified: openbios-devel/libc/diskio.c
===================================================================
--- openbios-devel/libc/diskio.c 2006-05-24 10:59:54 UTC (rev 30)
+++ openbios-devel/libc/diskio.c 2006-05-24 11:10:55 UTC (rev 31)
@@ -184,7 +184,7 @@
DPUSH( offs );
call_package( fdp->seek_xt, fdp->ih );
- return ((POP() >= 0)? 0 : -1);
+ return ((((cell)POP()) >= 0)? 0 : -1);
}
llong
1
0
Author: stepan
Date: 2006-05-24 12:59:54 +0200 (Wed, 24 May 2006)
New Revision: 30
Modified:
openbios-devel/modules/disk-label.c
openbios-devel/modules/sun-parts.c
Log:
Added handling of alphabetic partition ids as used in Sparc. Fixed sizes
reported.
Modified: openbios-devel/modules/disk-label.c
===================================================================
--- openbios-devel/modules/disk-label.c 2006-05-22 22:37:46 UTC (rev 29)
+++ openbios-devel/modules/disk-label.c 2006-05-24 10:59:54 UTC (rev 30)
@@ -63,7 +63,9 @@
s = parstr;
filename = NULL;
if( s ) {
- if( *s == '-' || isdigit(*s) ) {
+ if( *s == '-' || isdigit(*s) ||
+ (*s >= 'a' && *s < ('a' + 8)
+ && (*(s + 1) == ',' || *(s + 1) == '\0'))) {
if( (s=strpbrk(parstr,",")) ) {
filename = s+1;
*s = 0;
Modified: openbios-devel/modules/sun-parts.c
===================================================================
--- openbios-devel/modules/sun-parts.c 2006-05-22 22:37:46 UTC (rev 29)
+++ openbios-devel/modules/sun-parts.c 2006-05-24 10:59:54 UTC (rev 30)
@@ -27,6 +27,7 @@
typedef struct {
ullong offs;
ullong size;
+ int type;
} sunparts_info_t;
DECLARE_NODE( sunparts, INSTALL_OPEN, sizeof(sunparts_info_t), "+/packages/sun-parts" );
@@ -93,15 +94,19 @@
int parnum = -1;
unsigned char buf[512];
struct sun_disklabel *p;
- unsigned int i;
+ unsigned int i, bs;
DPRINTF("sunparts_open '%s'\n", str );
if( str ) {
- parnum = atol(str);
- if( !strlen(str) )
- parnum = -1;
- free( str );
+ if( !strlen(str) )
+ parnum = -1;
+ else if (str[0] >= 'a' && str[0] < ('a' + 8))
+ parnum = str[0] - 'a';
+ else
+ parnum = atol(str);
+
+ free( str );
}
SEEK( 0 );
@@ -110,10 +115,11 @@
/* Check Magic */
if (!has_sun_part_magic(buf)) {
- DPRINTF("sun partition magic not found.\n");
+ DPRINTF("Sun partition magic not found.\n");
RET(0);
}
-
+
+ bs = 512; // XXX get real block size?
/* get partition data */
p = (struct sun_disklabel *)buf;
@@ -125,10 +131,16 @@
parnum = i;
}
}
+
+ if (parnum < 0)
+ parnum = 0;
+
+ DPRINTF("Selected partition %d\n", parnum);
di->offs = (llong)__be32_to_cpu(p->partitions[parnum].start_cylinder) *
- __be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect);
+ __be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect) * bs;
- di->size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) ;
+ di->size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) * bs;
+ di->type = __be32_to_cpu(p->infos[parnum].id);
DPRINTF("Found Sun partition table, offs %d size %d\n", (int)di->offs, (int)di->size);
RET( -1 );
@@ -147,7 +159,8 @@
static void
sunparts_get_info( sunparts_info_t *di )
{
- PUSH( -1 ); /* no type */
+ DPRINTF("Sun get_info\n");
+ PUSH( di->type );
DPUSH( di->offs );
DPUSH( di->size );
}
1
0