OpenBIOS
Threads by month
- ----- 2026 -----
- 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
October 2007
- 11 participants
- 63 discussions
Author: wmb
Date: 2007-10-16 20:24:46 +0200 (Tue, 16 Oct 2007)
New Revision: 680
Modified:
ofw/fs/jffs2/jffs2.fth
Log:
Fixed a bug introduced by r674, resolving OLPC Trac #4227.
Modified: ofw/fs/jffs2/jffs2.fth
===================================================================
--- ofw/fs/jffs2/jffs2.fth 2007-10-15 01:03:25 UTC (rev 679)
+++ ofw/fs/jffs2/jffs2.fth 2007-10-16 18:24:46 UTC (rev 680)
@@ -446,6 +446,7 @@
\ with millions (literally) of obsolete records.
variable prev-dirent -1 prev-dirent ! \ Needed for erasing old one
+variable prev-pino -1 prev-pino ! \ Needed for restoring old state for regenerating
variable prev-offset -1 prev-offset ! \ Needed for restoring old state for regenerating
d# 256 instance buffer: prev-name
@@ -457,6 +458,8 @@
2drop ( boffset pino )
dup cur-pino @ <> if exit then ( boffset pino )
+
+ prev-pino @ cur-pino !
prev-dirent @ 'next-dirent !
prev-offset @ dirent-offset !
;
@@ -478,6 +481,7 @@
swap pack-offset swap ( offset pino )
dup cur-pino @ <> if ( offset pino )
+ cur-pino @ prev-pino ! ( offset pino )
dup cur-pino ! ( offset pino )
encode-dirent-long ( offset dirent-len )
else ( offset pino )
1
0
I would like to know if it would be possible, now or in the future, to
instantly switch between two running operating systems on one machine. For
example by dividing the RAM on the machine to be dedicated to each OS, and
having a buffer for device states.
It would be really cool, for example, to launch a shortcut from within
windows that launches a program in Linux. Though some multitasking would be
lost, as processes in Windows would be suspended. Or maybe not, with
multi-processor systems? I don't know anything about this... just a dream.
Would be great to migrate people to Linux. M
3
3
[PATCH] Change qemu-loaded to linuxbios-loaded (and vice versa) in a few places
by Jens Freimann Oct. 15, 2007
by Jens Freimann Oct. 15, 2007
Oct. 15, 2007
Hi,
this patch only effects the biosload build. In a few places
linuxbios-loaded is used where qemu-loaded should be used and vice
versa. This patch changes that, so that running LinuxBIOS + OFW on real
hardware works by only enabling linuxbios-loaded in config.fth.
With kind regards,
Jens
3
3
Author: wmb
Date: 2007-10-15 03:03:25 +0200 (Mon, 15 Oct 2007)
New Revision: 679
Modified:
cpu/x86/pc/olpc/loaddropins.fth
Log:
OLPC build - hasher.img is no longer needed.
Modified: cpu/x86/pc/olpc/loaddropins.fth
===================================================================
--- cpu/x86/pc/olpc/loaddropins.fth 2007-10-12 09:23:29 UTC (rev 678)
+++ cpu/x86/pc/olpc/loaddropins.fth 2007-10-15 01:03:25 UTC (rev 679)
@@ -58,5 +58,3 @@
" fs.public" " fspubkey" $add-dropin \ Incompressible
" lease.public" " leasepubkey" $add-dropin \ Incompressible
" developer.public" " develpubkey" $add-dropin \ Incompressible
-
- " hasher.img" " hasher" $add-deflated-dropin
1
0
Author: wmb
Date: 2007-10-12 11:23:29 +0200 (Fri, 12 Oct 2007)
New Revision: 678
Modified:
ofw/fs/jffs2/jffs2.fth
Log:
Fixed a bug introduced by svn 674.
Modified: ofw/fs/jffs2/jffs2.fth
===================================================================
--- ofw/fs/jffs2/jffs2.fth 2007-10-12 09:03:59 UTC (rev 677)
+++ ofw/fs/jffs2/jffs2.fth 2007-10-12 09:23:29 UTC (rev 678)
@@ -551,7 +551,7 @@
\ If the first encoded dirent is short-form, the pino is the same as
\ before and thus matches.
ax ax xor 0 [si] al mov \ ax: b
- ax shr carry? if \ 1-byte form
+ al shr carry? if \ 1-byte form
2 # ax shl ax 0 [dx] add \ Update dirent-offset
1 # si add \ skip byte offset
4 [sp] si xchg \ Put adr back on stack and restore si
@@ -563,7 +563,7 @@
op: 0 [si] ax mov \ ax: w
ax ax and 0<> if \ 2-byte form
- 2 # ax shl ax 0 [dx] add \ Update dirent-offset
+ 1 # ax shl ax 0 [dx] add \ Update dirent-offset
2 # si add \ skip word offset
4 [sp] si xchg \ Put adr back on stack and restore si
0 [dx] bp mov \ bp: offset
@@ -575,14 +575,15 @@
long-offsets on
begin
- ax ax xor 0 [si] al mov \ ax: b
- ax shr carry? if \ 1-byte form
+ ax ax xor
+ 0 [si] al mov \ ax: b
+ al shr carry? if \ 1-byte form
2 # ax shl ax 0 [dx] add \ Update dirent-offset
1 # si add \ skip byte offset
else
op: 0 [si] ax mov \ ax: w
ax ax or 0<> if \ Short form
- 2 # ax shl ax 0 [dx] add \ Update dirent-offset
+ 1 # ax shl ax 0 [dx] add \ Update dirent-offset
2 # si add \ skip word offset
else
d# 6 [si] ax mov ax 0 [dx] mov \ Update dirent-offset
@@ -626,7 +627,7 @@
drop ( adr )
dup w@ ?dup if ( adr w )
- /l* dirent-offset +! ( adr )
+ /w* dirent-offset +! ( adr )
dirent-offset @ ( adr offset )
swap wa1+ swap ( adr' offset )
true ( adr offset true )
@@ -638,7 +639,7 @@
2/ /l* dirent-offset +! ( adr )
ca1+ ( adr' )
w@+ swap ?dup if ( adr' w )
- /l* dirent-offset +! ( adr' )
+ /w* dirent-offset +! ( adr' )
else ( adr' )
l@+ swap cur-pino ! ( adr' )
l@+ swap dirent-offset ! ( adr' )
1
0
Author: wmb
Date: 2007-10-12 11:03:59 +0200 (Fri, 12 Oct 2007)
New Revision: 677
Modified:
cpu/x86/pc/olpc/security.fth
Log:
Fixed a bug introduced by svn 671. Also reverted the Indexed I/O turn-off
because the kernel isn't ready for it yet.
Modified: cpu/x86/pc/olpc/security.fth
===================================================================
--- cpu/x86/pc/olpc/security.fth 2007-10-12 09:00:06 UTC (rev 676)
+++ cpu/x86/pc/olpc/security.fth 2007-10-12 09:03:59 UTC (rev 677)
@@ -361,7 +361,7 @@
: check-machine-signature ( sig$ expiration$ -- -1|1 )
machine-id-buf d# 51 + swap move ( sig$ )
- machine-id-buf d# 67 2swap sha-valid? if 1 else -1 then
+ machine-id-buf d# 67 2swap " sha256" invalid? if -1 else 1 then
;
: set-disposition ( adr -- ) c@ machine-id-buf d# 49 + c! ;
@@ -696,6 +696,7 @@
then ( list$ )
load-from-device if ( list$ )
+\ write-protect-fw ec-indexed-io-off ( list$ )
2drop ( )
['] secure-load-ramdisk to load-ramdisk
" init-program" $find if
1
0
Author: wmb
Date: 2007-10-12 11:00:06 +0200 (Fri, 12 Oct 2007)
New Revision: 676
Added:
cpu/x86/pc/olpc/keymap.fth
cpu/x86/pc/olpc/parsekbd.py
Modified:
cpu/x86/pc/olpc/mfgdata.fth
cpu/x86/pc/olpc/setwp.fth
dev/pckbd.fth
Log:
OLPC trac #3985 - ASCII keymaps from the KA manufacturing data tag.
Added: cpu/x86/pc/olpc/keymap.fth
===================================================================
--- cpu/x86/pc/olpc/keymap.fth (rev 0)
+++ cpu/x86/pc/olpc/keymap.fth 2007-10-12 09:00:06 UTC (rev 676)
@@ -0,0 +1,90 @@
+purpose: Populate keymaps from the KA manufacturing data tag
+\ See license at end of file
+
+\ Per http://wiki.laptop.org/Manufacturing_Data#Keyboard_ASCII_Map
+
+h# 60 constant /submap
+
+\ Special hack for the OLPC keyboard multiply/divide key, which is
+\ sometimes used for ASCII punctuation
+: ?multkey ( scancode -- scancode' )
+ \ Translate down to the range that fits in the ASCII keymaps
+ dup h# 73 = if drop h# 5f then
+;
+
+: !map ( scancode ascii submap# -- )
+ /submap * rot ?multkey + oem-keymap + 1+ c!
+;
+
+\ Clear out a range of map entries
+: zap ( first last -- )
+ 1+ swap ?do i 0 0 !map i 0 1 !map loop
+;
+
+: punctuation " 0123456789!""#$%&'()*+,-./:;<=>?@[\]^_`{|}~" drop ;
+: fill-keymap ( value$ -- )
+ oem-keymap /keymap 0 fill ( adr len )
+ 3 oem-keymap c! ( adr len ) \ #submaps
+ \ Prime the shift and unshift maps with special characters
+ [ also keyboards ] us [ previous ] 3 + oem-keymap 1+ /submap 2* move
+
+ \ Clear out some the map entries for the alphanumeric/punctuation stations,
+ \ so we don't have confusing leftovers from the US map
+ 2 h# d zap h# 10 h# 1b zap h# 1e h# 29 zap h# 2b h# 35 zap
+
+ \ Set the a-z entries - assume unshifted and infer shifted
+ 2dup d# 26 min 0 ?do ( value$ adr )
+ dup i + c@ ( value$ adr scancode )
+ [char] a i + ( value$ adr scancode ascii )
+ 2dup 0 !map ( value$ adr scancode ascii ) \ Unshifted
+ h# 20 xor 1 !map ( value$ adr ) \ Shifted
+ loop ( value$ adr )
+ drop ( value$ )
+ dup d# 26 min /string ( value$' )
+
+ \ Set the 0-9 and punctuation entries in specifed maps
+ d# 42 min 0 ?do ( adr )
+ dup i 2* + ( adr adr' )
+ dup c@ ( adr adr' scancode )
+ punctuation i + c@ ( adr adr' scancode ascii )
+ rot 1+ c@ !map ( adr )
+ loop ( adr )
+ drop
+;
+
+\ If a KA tag is present, parse it into a keymap
+: olpc-keymap? ( -- got? )
+ " KA" " find-tag" eval if ( value$ )
+ ?free-keymap
+ /keymap alloc-mem to oem-keymap ( adr' len' )
+ fill-keymap
+ oem-keymap to keymap
+ true
+ else
+ false
+ then
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2007 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: cpu/x86/pc/olpc/mfgdata.fth
===================================================================
--- cpu/x86/pc/olpc/mfgdata.fth 2007-10-12 00:11:50 UTC (rev 675)
+++ cpu/x86/pc/olpc/mfgdata.fth 2007-10-12 09:00:06 UTC (rev 676)
@@ -9,23 +9,39 @@
: invalid-tag? ( adr -- data-adr flag )
-1 hibit? if true exit then \ Name char must be 7-bit ASCII
-2 hibit? if true exit then \ Name char must be 7-bit ASCII
- -3 hibit? if true exit then \ Length must be 7 bits
- dup 3 - c@ ( adr len )
- over 4 - c@ ( adr len ~len )
- xor h# ff <> if true exit then ( adr )
- dup 3 - c@ - 4 - ( adr' )
+ -3 hibit? if \ Long (5-byte tag) format ( adr )
+ dup 4 - c@ dup h# 80 and if drop true exit then ( adr low )
+ over 5 - c@ dup h# 80 and if 2drop true exit then ( adr low high )
+ 2dup xor h# ff xor ( adr low high check )
+ 3 pick 3 - c@ <> if 3drop true exit then ( adr low high )
+ 7 << + ( adr length )
+ - 5 - ( data-adr )
+ else \ Short (4-byte tag) format
+ dup 3 - c@ ( adr len )
+ over 4 - c@ ( adr len ~len )
+ xor h# ff <> if true exit then ( adr )
+ dup 3 - c@ - 4 - ( data-adr )
+ then
+
false
;
: last-mfg-data ( top-adr -- adr ) begin invalid-tag? until ;
: another-tag? ( adr -- adr false | adr' data$ name-adr true )
- dup invalid-tag? if ( adr data-adr )
+ dup invalid-tag? if ( adr data-adr )
drop false exit
- then ( adr data-adr )
- dup rot ( data-adr data-adr adr )
- 2dup swap - 4 - ( data-adr data-adr adr data-len )
- swap 2- true ( adr' data$ adr )
+ then ( adr data-adr )
+ >r 2- ( name-adr r: data-adr )
+ dup 1- c@ h# 80 and if ( name-adr r: data-adr ) \ 5-byte format
+ dup 2- c@ ( name-adr lowlen r: data-adr )
+ over 3 - c@ 7 lshift + ( name-adr len r: data-adr )
+ else ( name-adr r: data-adr ) \ 4-byte format
+ dup 1- c@ ( name-adr len r: data-adr )
+ then ( name-adr len r: data-adr )
+ r> rot >r ( len data-adr r: name-adr )
+ dup rot r> ( adr data$ name-adr )
+ true ( adr data$ name-adr true )
;
\ Mfg data used to be at the end of the EC erase block, but
Added: cpu/x86/pc/olpc/parsekbd.py
===================================================================
--- cpu/x86/pc/olpc/parsekbd.py (rev 0)
+++ cpu/x86/pc/olpc/parsekbd.py 2007-10-12 09:00:06 UTC (rev 676)
@@ -0,0 +1,219 @@
+#!/usr/bin/python
+# parsekbd.py
+# Usage: python parsekbd.py OLPC_Nigeria_Keyboard
+#
+# Gets the wiki page (e.g.) http://wiki.laptop.org/go/OLPC_Nigeria_Keyboard
+# Parses the keyboard table contained therein and converts it to a KA
+# tag per http://wiki.laptop.org/go/Manufacturing_Data#Keyboard_ASCII_Map.
+#
+# The output is stored in a file named (e.g.) OLPC_Nigeria_Keyboard.ka
+#
+# Warnings on standard output tell you if duplicate entries are discarded
+# or if some ASCII characters are not present.
+#
+# In a few cases, this program substitutes dead_{grave,circumflex,tilde}
+# for {grave,asciicircumflex,asciitilde} because the ascii versions are
+# in inaccessible locations (the firmware has only shift, unshift, AltGr
+# maps, so a Shift-AltGr symbol is inaccessible).
+
+from sys import *
+from urllib import *
+from HTMLParser import HTMLParser
+
+state = 0
+keys = 128*[0]
+modifiers = 128*[0]
+column = 0
+keyid = 0
+
+# Convert from textual names of punctuation characters to the ASCII character
+punctuation = {
+ 'exclam':ord('!'),
+ 'at':ord('@'),
+ 'numbersign':ord('#'),
+ 'dollar':ord('$'),
+ 'percent':ord('%'),
+ 'asciicircum':ord('^'),
+ 'dead_circumflex':ord('^'),
+ 'ampersand':ord('&'),
+ 'asterisk':ord('*'),
+ 'parenleft':ord('('),
+ 'parenright':ord(')'),
+ 'underscore':ord('_'),
+ 'plus':ord('+'),
+ 'minus':ord('-'),
+ 'equal':ord('='),
+ 'semicolon':ord(';'),
+ 'colon':ord(':'),
+ 'apostrophe':ord('\''),
+ 'grave':ord('`'),
+ 'dead_grave':ord('`'),
+ 'quotedbl':ord('"'),
+ 'dblquote':ord('"'),
+ 'bar':ord('|'),
+ 'less':ord('<'),
+ 'greater':ord('>'),
+ 'period':ord('.'),
+ 'slash':ord('/'),
+ 'backslash':ord('\\'),
+ 'question':ord('?'),
+ 'comma':ord(','),
+ 'bracketleft':ord('['),
+ 'bracketright':ord(']'),
+ 'braceleft':ord('{'),
+ 'braceright':ord('}'),
+ 'asciitilde':ord('~') ,
+ 'dead_tilde':ord('~') ,
+ 'backspace':8,
+ 'space':32,
+ 'tab':9,
+ 'linefeed':10,
+ 'enter':13,
+ 'esc':27,
+ 'escape':27,
+ 'del':127,
+ 'delete':127,
+ '&':ord('&'),
+ '<':ord('<'),
+ '>':ord('>'),
+}
+
+def string_to_ascii(s):
+ if len(s) == 0:
+ return -1
+ if len(s) == 1:
+ return ord(s)
+ try:
+ i = punctuation[s]
+ return i
+ except:
+ pass
+ if (len(s) == 3) & (s[:2] == 'C-'):
+ return ord(s[2]) & 0x1f
+ return -1
+
+def handle_key(modifier, s):
+ global keyid
+ ascii = string_to_ascii(s)
+ if ascii == -1:
+ return
+ if keys[ascii] != 0:
+ if (ascii >= 0x20) & (((modifier & 1) == 0) & (keys[ascii] != keyid)):
+ print "Discard",hex(ascii),chr(ascii),modifier,keyid,modifiers[keyid]
+ return
+ if ascii < 0x20:
+ if (modifier & 2) != 0: # ctrl
+ if keys[ascii + 0x60] == keyid:
+ return
+ if keys[ascii + 0x40] == keyid:
+ return
+ keys[ascii] = keyid
+ modifiers[ascii] = modifier
+
+class MyHTMLParser(HTMLParser):
+ def handle_starttag(self, tag, attrs):
+ global state, column, keyid
+ if tag == 'table':
+ state = state + 1
+ elif tag == 'tr':
+ column = 0
+ keyid = 0
+ elif tag == 'td':
+ column = column + 1;
+
+ def handle_data(self, data):
+ global state, column, keyid
+ if state != 1:
+ return
+ s = data.strip()
+ if column == 1: # XKB key
+ pass
+ elif column == 2: # HID
+ pass
+ elif column == 3: # Key
+ if s.isdigit():
+ keyid = int(s)
+ elif column == 4: # Unmodified
+ handle_key(0,s)
+ elif column == 5: # Shift
+ handle_key(1,s)
+ elif column == 6: # AltGR
+ handle_key(4,s)
+ elif column == 7: # Shift AltGr
+ # handle_key(5,s)
+ pass
+ elif column == 8: # Ctrl
+ handle_key(2,s)
+ elif column == 9: # Fn
+ handle_key(8,s)
+ elif column == 10: # comment
+ pass
+
+
+# This table converts from the IBM physical keystation number to
+# the corresponding scancode value in scan set 1.
+
+# 0 1 3 3 4 5 6 7 8 9
+scan1_map = [
+ 0x00, 0x29, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, # 0x
+ 0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x0e, 0x0f, 0x10, 0x11, 0x12, # 1x
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x2b, # 2x
+ 0x3a, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, # 3x
+ 0x27, 0x28, 0x2b, 0x1c, 0x2a, 0x56, 0x2c, 0x2d, 0x2e, 0x2f, # 4x
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x73, 0x36, 0x1d, 0x00, # 5x
+ 0x38, 0x39, 0x38, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, # 6x
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # 7x
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # 8x
+ 0x45, 0x47, 0x4B, 0x4F, 0x00, 0x00, 0x48, 0x4C, 0x50, 0x52, # 9x
+ 0x37, 0x49, 0x4D, 0x51, 0x53, 0x4A, 0x4E, 0x00, 0x1c, 0x00, # 10x
+ 0x01, 0x00, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, # 11x
+ 0x43, 0x44, 0x57, 0x58, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, # 12x
+ 0x79, 0x01, 0x00, 0x5c, 0x73, 0x6e, 0x00, 0x00, 0x00, 0x00, # 13x (analog intermediates)
+ 0x00, 0x00, 0x00, 0x00, 0x00, # 14x
+]
+
+def put_ka_format(outfile):
+ global keys, modifiers
+ # a-z - output scancode only; unshifted map is implied
+ # and shifted map is derived automatically
+ for i in range(ord('a'),ord('a')+26):
+ if (keys[i] == 0):
+ print "Missing",chr(i)
+ if modifiers[i] != 0:
+ print chr(i),"is modified"
+ outfile.write(chr(scan1_map[keys[i]]))
+
+ # Numbers and punctuation - output scancode and keymap number
+ for i in '0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~':
+ ascii = ord(i)
+ if (keys[ascii] == 0):
+ print "Missing",i
+ if (modifiers[ascii] & 0xa) != 0:
+ print i,"is Ctrl or Fn"
+ outfile.write(chr(scan1_map[keys[ascii]]))
+
+ if (modifiers[ascii] & 0x4) != 0:
+ # modifier & 4 implies AltGr map
+ outfile.write(chr(2))
+ else:
+ # otherwise it's either the shift (1) or unshift (0) map
+ outfile.write(chr(modifiers[ascii] & 1))
+
+ outfile.write(chr(0)) # Null terminator
+
+ outfile.write(chr(111 ^ 0xff))
+ outfile.write(chr(111))
+ outfile.write('KA')
+
+if len(argv) != 2:
+ print "Usage: python parsekbd.py PageName"
+else:
+ infile = urlopen('http://wiki.laptop.org/go/' + argv[1])
+ myparser=MyHTMLParser()
+ myparser.feed(infile.read())
+ myparser.close()
+ infile.close()
+
+ outfile = open(argv[1] + '.ka', 'w')
+ put_ka_format(outfile)
+ outfile.close()
Property changes on: cpu/x86/pc/olpc/parsekbd.py
___________________________________________________________________
Name: svn:executable
+ *
Modified: cpu/x86/pc/olpc/setwp.fth
===================================================================
--- cpu/x86/pc/olpc/setwp.fth 2007-10-12 00:11:50 UTC (rev 675)
+++ cpu/x86/pc/olpc/setwp.fth 2007-10-12 09:00:06 UTC (rev 676)
@@ -117,19 +117,57 @@
: $add-tag ( value$ name$ -- )
?tagname-valid ( value$ name$ )
2dup find-tag abort" Tagname already exists" ( value$ name$ )
+
get-mfg-data
ram-last-mfg-data >r ( value$ name$ r: adr )
- 2 pick 1+ over + 3 + ( value$ name$ record-len r: adr )
+
+ \ Check for enough space for the new tag
+ 2 pick ( value$ name$ datalen r: adr )
+ dup d# 16383 > abort" Tag data too long"
+ dup d# 127 > if 4 else 3 then + ( value$ name$ datalen' r: adr )
+ over + ( value$ name$ record-len r: adr )
r@ over - mfg-data-buf u<= abort" Not enough space for new tag"
+
+ \ Ensure that the space is not being used for something else
r@ over - swap ?erased ( value$ name$ r: adr )
+
+ \ Copy the tag name
r@ 2- swap move ( value$ r: adr )
- dup 1+ dup r@ 3 - c! invert r@ 4 - c! ( value$ r: adr )
- 0 r@ 5 - c! ( value$ r: adr )
- r> 5 - over - ( value$ data-adr )
- swap move
- put-mfg-data
+
+ \ Set the length field
+ dup ( value$ len r: adr )
+ dup d# 127 > if ( value$ len r: adr )
+ \ 5-byte tag format - (top) check, lowlen, highlen (bottom)
+ dup 7 rshift swap h# 7f and ( value$ len-high len-low r: adr )
+ 2dup xor h# ff xor ( value$ len-high len-low check r: adr )
+ r@ 3 - c! r@ 4 - c! r@ 5 - c! ( value$ r: adr )
+ r> 5 - ( value$ end-adr )
+ else ( value$ len' r: adr )
+ \ 4-byte tag format - (top) len, ~len (bottom)
+ dup r@ 3 - c! invert r@ 4 - c! ( value$ r: adr )
+ r> 4 - ( value$ end-adr )
+ then ( value$ end-adr )
+
+ \ Copy the value data
+ over - swap move ( )
+
+ put-mfg-data ( )
;
+: add-null ( adr len -- adr' len' ) $cstr cscount 1+ ;
+
: add-tag ( "name$" "value$" -- )
- safe-parse-word 0 parse 2swap $add-tag
+ safe-parse-word 0 parse add-null 2swap $add-tag
;
+
+: $delete-tag ( name$ -- )
+ tag-setup ( ram-value$ )
+ 2dup + c@ h# 80 and ( ram-value$ tag-style )
+ if 4 else 5 then + >r ( tag-adr tag-len )
+ ram-last-mfg-data >r ( tag-adr r: len bot-adr )
+ r@ 2r@ + ( tag-adr src-adr dst-adr r: len bot-adr )
+ rot r@ - ( src-adr dst-adr copy-len r: len bot-adr )
+ move ( r: len bot-adr )
+ r> r> h# ff fill ( )
+ put-mfg-data
+;
Modified: dev/pckbd.fth
===================================================================
--- dev/pckbd.fth 2007-10-12 00:11:50 UTC (rev 675)
+++ dev/pckbd.fth 2007-10-12 09:00:06 UTC (rev 676)
@@ -211,6 +211,21 @@
oem-keymap if oem-keymap /keymap free-mem then
0 to oem-keymap
;
+[ifdef] olpc
+: ?olpc-keyboard ( -- )
+ " enable-intf" $call-parent
+ begin get-data? while
+ drop
+ true to keyboard-present?
+ 5 ms
+ repeat
+ keyboard-present? if exit then
+ kbd-reset 0= to keyboard-present?
+;
+
+fload ${BP}/cpu/x86/pc/olpc/keymap.fth
+[then]
+
: choose-type ( -- )
my-args dup if
[char] , left-parse-string 2swap 2drop ( $ )
@@ -231,6 +246,10 @@
exit
then
+[ifdef] olpc-keymap?
+ olpc-keymap? if exit then
+[then]
+
" us" set-keyboard
\ pc-keyboard-type set-keyboard
;
@@ -335,21 +354,10 @@
false
;
-: ?olpc-keyboard ( -- )
- " enable-intf" $call-parent
- begin get-data? while
- drop
- true to keyboard-present?
- 5 ms
- repeat
- keyboard-present? if exit then
- kbd-reset 0= to keyboard-present?
-;
-
: reset ( -- )
init-data
clear-state
-[ifdef] olpc
+[ifdef] ?olpc-keyboard
?olpc-keyboard
[else]
get-initial-state
@@ -677,6 +685,8 @@
\ Split the scancode into the up/down indicator and the key identifier
h# 80 /mod 0= swap ( down? scan )
+[ifdef] ?multkey ?multkey [then]
+
\ Exit if the scancode is one that is never used for ASCII characters
dup h# 60 >= if 2drop false exit then ( down? scan )
1
0
[PATCH] Add support for accessing the LinuxBIOS table from Open Firmware
by Jens Freimann Oct. 12, 2007
by Jens Freimann Oct. 12, 2007
Oct. 12, 2007
Hi,
this patch adds a new file lbtable.fth to cpu/x86/pc/biosload which
makes it possible to print the LinuxBIOS table or access single entries.
For instructions on how to use it type "help-lbtable" on the ok prompt.
With kind regards,
Jens
2
1
Author: wmb
Date: 2007-10-12 02:11:50 +0200 (Fri, 12 Oct 2007)
New Revision: 675
Modified:
dev/usb2/device/wlan/usb8388.fth
ofw/wifi/eapol.fth
Log:
OLPC trac 4185 - Use the Libertas wlan "filtered scan" feature so
association works even when there are too many APs to fit in one
scan response buffer.
Modified: dev/usb2/device/wlan/usb8388.fth
===================================================================
--- dev/usb2/device/wlan/usb8388.fth 2007-10-12 00:04:02 UTC (rev 674)
+++ dev/usb2/device/wlan/usb8388.fth 2007-10-12 00:11:50 UTC (rev 675)
@@ -710,6 +710,11 @@
constant /chan-list-IE
struct
+ /marvel-IE-hdr +
+ d# 34 field >ssid
+constant /ssid-IE
+
+struct
1 field >bss-type
6 field >bss-id
/chan-list-IE field >chan-list-IE
@@ -730,6 +735,8 @@
h# 0050.f202 constant amoui \ WPA authentication suite
+d# 34 instance buffer: ssid
+
: make-chan-list-param ( adr -- )
#channels 0 do
dup i /chan-list * +
@@ -742,23 +749,43 @@
;
: (scan) ( -- error? )
- /cmd_802_11_scan 6 ( CMD_802_11_SCAN ) prepare-cmd
- resp-wait-long to resp-wait
- BSS_ANY outbuf >fw-data tuck >bss-type c!
+ /cmd_802_11_scan ssid c@ if
+ /marvel-IE-hdr + ssid c@ +
+ then
+ 6 ( CMD_802_11_SCAN ) prepare-cmd ( )
+ resp-wait-long to resp-wait ( )
+ BSS_ANY outbuf >fw-data tuck >bss-type c! ( 'fw-data )
- dup >chan-list-IE h# 101 over >type-id le-w!
- #channels /chan-list * over >/payload le-w!
- >chan-list make-chan-list-param
+ dup >chan-list-IE ( 'fw-data 'chan-list )
+ h# 101 over >type-id le-w! ( 'fw-data 'chan-list )
+ #channels /chan-list * over >/payload le-w! ( 'fw-data 'chan-list )
+ >chan-list make-chan-list-param ( 'fw-data )
- >probes-IE h# 102 over >type-id le-w!
- 2 over >/payload le-w!
- #probes swap >probes le-w!
+ dup >probes-IE ( 'fw-data 'probes )
+ h# 102 over >type-id le-w! ( 'fw-data 'probes )
+ 2 over >/payload le-w! ( 'fw-data 'probes )
+ #probes swap >probes le-w! ( 'fw-data )
- /cmd_802_11_scan outbuf-bulk-out if true exit then
+ ssid c@ if ( 'fw-data )
+ \ Attach an SSID TLV to filter the result
+ /cmd_802_11_scan + ( 'ssid )
+ h# 000 over >type-id le-w! ( 'ssid )
+ ssid c@ over >/payload le-w! ( 'ssid )
+ ssid count rot /marvel-IE-hdr + swap move ( )
+ /cmd_802_11_scan /marvel-IE-hdr ssid c@ + + ( cmdlen )
+ else ( 'fw-data )
+ drop
+ /cmd_802_11_scan ( cmdlen )
+ then ( cmdlen )
+
+ outbuf-bulk-out if true exit then
wait-cmd-resp
;
external
+\ Ask the device to look for the indicated SSID.
+: set-ssid ( adr len -- ) h# 32 min ssid pack drop ;
+
: scan ( adr len -- actual )
(scan) if 2drop 0 exit then
respbuf /respbuf /fw-cmd /string ( adr len radr rlen )
Modified: ofw/wifi/eapol.fth
===================================================================
--- ofw/wifi/eapol.fth 2007-10-12 00:04:02 UTC (rev 674)
+++ ofw/wifi/eapol.fth 2007-10-12 00:11:50 UTC (rev 675)
@@ -730,6 +730,7 @@
disable-protection
do-scan? if
wifi-ssid$ ssid!
+ wifi-ssid$ " set-ssid" $call-parent
??cr ." Scan for: " ssid$ type cr
scanbuf /buf scan 0= if ." Failed to find: " ssid$ type cr false exit then
debug? if scanbuf .scan then
1
0
Author: wmb
Date: 2007-10-12 02:04:02 +0200 (Fri, 12 Oct 2007)
New Revision: 674
Modified:
cpu/x86/pc/olpc/addrs.fth
ofw/fs/jffs2/jffs2.fth
Log:
Workaround for OLPC trac 4184 - Increase the size of the JFFS2 dirent buffer,
shrink the footprint of entries in that buffer, and do not store dirents
that obsolete the immediately-preceding one, all with the goal of surviving
"millions of dirents" JFFS2 filesystem pathologies.
Modified: cpu/x86/pc/olpc/addrs.fth
===================================================================
--- cpu/x86/pc/olpc/addrs.fth 2007-10-11 22:15:10 UTC (rev 673)
+++ cpu/x86/pc/olpc/addrs.fth 2007-10-12 00:04:02 UTC (rev 674)
@@ -74,9 +74,9 @@
h# 20.0000 constant heap-size
h# 300.0000 constant jffs2-dirent-base
-h# 400.0000 constant jffs2-inode-base
-h# 600.0000 constant dma-base
-h# a00.0000 constant dma-size
+h# 500.0000 constant jffs2-inode-base
+h# 700.0000 constant dma-base
+h# 900.0000 constant dma-size
h# f.0000 constant suspend-base \ In the DOS hole
h# f.0008 constant resume-entry
Modified: ofw/fs/jffs2/jffs2.fth
===================================================================
--- ofw/fs/jffs2/jffs2.fth 2007-10-11 22:15:10 UTC (rev 673)
+++ ofw/fs/jffs2/jffs2.fth 2007-10-12 00:04:02 UTC (rev 674)
@@ -414,56 +414,117 @@
d# 18 ( len )
;
-: encode-dirent ( boffset pino adr len -- )
- 2 pick >r ( boffset pino adr len r: pino )
- crctab -rot ($crc) ( boffset hash )
- next-dirent ! ( boffset )
+\ There are three dirent record formats:
+\ delta is current-dirent-offset - last-dirent-offset
+\ 1-byte format: (delta >> 1) | 1 \ for delta < 0x200
+\ 2-byte format: (delta >> 1) | 0, (delta >> 9) \ for delta < 0x20000
+\ 10-byte format: 0.w, pino.l, offset.l \ For delta >= 0x20000 or different pino
+\
+\ The reason for this complexity is to save space in the dirent map in the
+\ face of JFFS2 pathologies that could cause the dirent map to overflow.
+\ An example would be a filesystem with millions of hard links to the same file.
- pack-offset ( offset )
+: +dirent ( adr -- adr' )
+ c@+ dup 1 and if drop exit then ( adr' c )
+ >r c@+ r> swap bwjoin ( adr' w )
+ 0= if 2 na+ then
+;
- dup dirent-offset @ - 2 rshift ( offset delta )
- dup h# 10000 < ( offset delta short-offset? )
- r@ cur-pino @ = and ( offset delta short-encode? )
+: #dirents ( -- n )
+ 0
+ next-dirent dirents ( n endadr adr )
+ begin 2dup > while +dirent rot 1+ -rot repeat ( n endadr adr )
+ 2drop
+;
- if ( offset delta )
- next-dirent na1+ w! ( offset )
- 6 ( offset de-len )
- else ( offset )
- drop 0 next-dirent na1+ w! ( offset )
- r@ next-dirent 6 + ! ( offset ) \ Encode pino
- dup next-dirent d# 10 + ! ( offset ) \ Encode offset
- d# 14 ( offset de-len )
- then ( offset r: pino )
- r> cur-pino ! ( offset de-len )
- 'next-dirent +! ( offset )
- dirent-offset ! ( )
+\ ?erase-previous is an optimization/workaround for a JFFS2 pathology
+\ in which multiple nearly-identical dirents appears one after another.
+\ The pathology is caused by a garbage collection bug; we don't
+\ know if the situation can also appear for other reasons.
+\ The optimization overwrites the previous dirent record if the next
+\ one supersedes it, thus preventing the dirent buffer from filling up
+\ with millions (literally) of obsolete records.
+
+variable prev-dirent -1 prev-dirent ! \ Needed for erasing old one
+variable prev-offset -1 prev-offset ! \ Needed for restoring old state for regenerating
+d# 256 instance buffer: prev-name
+
+: ?erase-previous ( boffset pino adr len -- boffset pino )
+ 2dup prev-name count $= 0= if ( boffset pino adr len )
+ d# 255 min prev-name place ( boffset pino )
+ exit
+ then ( boffset pino adr len )
+ 2drop ( boffset pino )
+
+ dup cur-pino @ <> if exit then ( boffset pino )
+ prev-dirent @ 'next-dirent !
+ prev-offset @ dirent-offset !
;
+: encode-dirent-long ( offset pino -- offset dirent-len )
+ 0 next-dirent w! ( offset pino)
+ next-dirent wa1+ ! ( offset )
+ dup next-dirent 6 + ! ( offset )
+ d# 10 ( offset dirent-len )
+;
+
+: encode-dirent ( boffset pino adr len -- )
+ ?erase-previous ( boffset pino )
+
+ next-dirent d# 10 + jffs2-inode-base > if
+ ." JFFS2 dirent overflow - " #dirents .d ." dirents" cr
+ abort
+ then
+
+ swap pack-offset swap ( offset pino )
+ dup cur-pino @ <> if ( offset pino )
+ dup cur-pino ! ( offset pino )
+ encode-dirent-long ( offset dirent-len )
+ else ( offset pino )
+ over dirent-offset @ - 1 rshift ( offset pino delta )
+ dup h# 10000 >= if ( offset pino delta )
+ drop encode-dirent-long ( offset dirent-len )
+ else ( offset pino delta )
+ dup h# 100 < if ( offset pino delta )
+ 1 or next-dirent c! ( offset pino )
+ drop 1 ( offset dirent-len )
+ else ( offset pino delta )
+ next-dirent le-w! ( offset pino )
+ drop 2 ( offset dirent-len )
+ then
+ then ( offset dirent-len )
+ then ( offset dirent-len )
+ next-dirent prev-dirent ! ( offset dirent-len )
+ 'next-dirent +! ( offset )
+ dirent-offset @ prev-offset ! ( offset )
+ dirent-offset ! ( )
+;
+
+: c@+ ( adr -- c adr' ) dup c@ swap ca1+ ;
: w@+ ( adr -- w adr' ) dup w@ swap wa1+ ;
: l@+ ( adr -- l adr' ) dup l@ swap la1+ ;
-: decode-dirent ( adr -- false | adr' offset pino hash true )
+: decode-dirent ( adr -- false | adr' offset pino true )
dup next-dirent >= if drop false exit then
- l@+ ( hash adr' )
- w@+ ( hash w adr' )
- swap ?dup if ( hash adr' w ) \ Short form
-\ swap -rot ( adr' hash w )
-\ /l* dirent-offset +! ( adr' hash )
-
- /l* dirent-offset +! ( hash adr' )
- swap ( adr' hash )
-
- dirent-offset @ ( adr' hash offset )
- cur-pino @ rot ( adr' offset pino hash )
- else ( hash adr' ) \ Long form
- l@+ over cur-pino ! ( hash pino adr' )
- l@+ over dirent-offset ! ( hash pino offset adr' )
- swap 2swap swap ( adr' offset pino hash )
- then
+ dup c@ dup 1 and if ( adr c ) \ 1-byte form
+ 2/ /l* dirent-offset +! ( adr )
+ ca1+ ( adr' )
+ dirent-offset @ ( adr offset )
+ cur-pino @ ( adr offset pino )
+ else ( adr c ) \ Longer form
+ w@+ ?dup if ( adr' w ) \ 2-byte form
+ /w* dirent-offset +! ( adr )
+ dirent-offset @ ( adr offset )
+ cur-pino @ ( adr offset pino )
+ else ( adr ) \ Long form
+ l@+ over cur-pino ! ( pino adr' )
+ l@+ over dirent-offset ! ( pino offset adr' )
+ swap rot ( adr offset pino )
+ then ( adr offset pino )
+ then ( adr offset pino )
true
;
-
\ Information that we need about the working file/directory
\ The working file changes at each level of a path search
@@ -472,7 +533,7 @@
0 instance value wf-type \ Type - 4 for directory, d# 10 for symlink, etc
1 [if]
-code (next-pino-match) ( adr next-dirent pino cur-pino dirent-offset -- false | adr' offset hash true )
+code (next-pino-match) ( adr next-dirent pino cur-pino dirent-offset -- false | adr' offset true )
dx pop \ dx: dirent-offset
cx pop \ cx: cur-pino
bx pop \ bx: pino
@@ -489,37 +550,51 @@
\ If the first encoded dirent is short-form, the pino is the same as
\ before and thus matches.
- ax ax xor op: 4 [si] ax mov \ ax: w
- ax ax or 0<> if \ Short form
+ ax ax xor 0 [si] al mov \ ax: b
+ ax shr carry? if \ 1-byte form
2 # ax shl ax 0 [dx] add \ Update dirent-offset
- 0 [si] cx mov \ cx: hash
- 6 # si add \ skip long hash and word offset
+ 1 # si add \ skip byte offset
4 [sp] si xchg \ Put adr back on stack and restore si
0 [dx] bp mov \ bp: offset
0 [sp] bp xchg \ Put offset on stack and restore bp
- cx push \ Put hash on stack
-1 # push \ Put true on stack
next
then
+ op: 0 [si] ax mov \ ax: w
+ ax ax and 0<> if \ 2-byte form
+ 2 # ax shl ax 0 [dx] add \ Update dirent-offset
+ 2 # si add \ skip word offset
+ 4 [sp] si xchg \ Put adr back on stack and restore si
+ 0 [dx] bp mov \ bp: offset
+ 0 [sp] bp xchg \ Put offset on stack and restore bp
+ -1 # push \ Put true on stack
+ next
+ then
+
+
long-offsets on
begin
- ax ax xor op: 4 [si] ax mov \ ax: w
- ax ax or 0<> if \ Short form
+ ax ax xor 0 [si] al mov \ ax: b
+ ax shr carry? if \ 1-byte form
2 # ax shl ax 0 [dx] add \ Update dirent-offset
- 6 # si add \ skip long hash and word offset
+ 1 # si add \ skip byte offset
else
- d# 10 [si] ax mov ax 0 [dx] mov \ Update dirent-offset
- d# 6 [si] ax mov ax 0 [cx] mov \ Update cur-pino
- d# 14 # si add \ skip record
- ax bx cmp = if
- d# -14 [si] cx mov \ cx: hash
- 4 [sp] si xchg \ Put adr back on stack and restore si
- 0 [dx] bp mov \ bp: offset
- 0 [sp] bp xchg \ Put offset on stack and restore bp
- cx push \ Put hash on stack
- -1 # push \ Put true on stack
- next
+ op: 0 [si] ax mov \ ax: w
+ ax ax or 0<> if \ Short form
+ 2 # ax shl ax 0 [dx] add \ Update dirent-offset
+ 2 # si add \ skip word offset
+ else
+ d# 6 [si] ax mov ax 0 [dx] mov \ Update dirent-offset
+ d# 2 [si] ax mov ax 0 [cx] mov \ Update cur-pino
+ d# 10 # si add \ skip record
+ ax bx cmp = if
+ 4 [sp] si xchg \ Put adr back on stack and restore si
+ 0 [dx] bp mov \ bp: offset
+ 0 [sp] bp xchg \ Put offset on stack and restore bp
+ -1 # push \ Put true on stack
+ next
+ then
then
then
bp si cmp = until
@@ -530,35 +605,46 @@
4 # sp add \ clean stack
ax ax xor 0 # 0 [sp] mov \ return false
c;
-: next-pino-match ( adr -- false | pino adr' offset hash true )
+: next-pino-match ( adr -- false | pino adr' offset true )
next-dirent wd-inum cur-pino dirent-offset (next-pino-match)
;
[then]
[ifndef] next-pino-match
-: next-pino-match ( adr -- false | adr' offset hash true )
+: next-pino-match ( adr -- false | adr' offset true )
dup next-dirent >= if drop false exit then
\ If the first encoded dirent is short-form, the pino is the same as
\ before and thus matches.
- dup la1+ w@ ?dup if ( adr w )
+ dup c@ dup 1 and if ( adr b )
+ 2/ /l* dirent-offset +! ( adr )
+ dirent-offset @ ( adr offset )
+ swap ca1+ swap ( adr' offset )
+ true ( adr offset true )
+ exit
+ then ( adr b )
+ drop ( adr )
+
+ dup w@ ?dup if ( adr w )
/l* dirent-offset +! ( adr )
dirent-offset @ ( adr offset )
- swap l@+ wa1+ ( offset hash adr' )
- -rot true ( offset hash adr' )
+ swap wa1+ swap ( adr' offset )
+ true ( adr offset true )
exit
then ( adr )
begin ( adr )
- la1+ w@+ swap ?dup if ( adr' w )
+ dup c@ dup 1 and if ( adr b )
+ 2/ /l* dirent-offset +! ( adr )
+ ca1+ ( adr' )
+ w@+ swap ?dup if ( adr' w )
/l* dirent-offset +! ( adr' )
else ( adr' )
l@+ swap cur-pino ! ( adr' )
l@+ swap dirent-offset ! ( adr' )
wd-inum cur-pino @ = if ( adr' )
dirent-offset @ ( adr' offset )
- over -3 la+ -1 wa+ l@ ( adr' offset hash )
- true ( adr' offset hash true )
+ true ( adr' offset true )
exit
then ( adr )
then ( adr )
@@ -575,7 +661,7 @@
r@ 1 j@ r@ 2 j@ ( offset pino )
r@ d# 22 + r> 5 la+ c@ ( offset pino adr namelen )
dup >r encode-dirent ( r: namelen )
- r> d# 24 + ( len )
+ r> d# 24 + ( len )
;
[ifdef] notdef
@@ -595,6 +681,7 @@
xattr-type of drop d# 18 ( ." XA" cr ) endof
xref-type of drop 6 ( ." R" cr ) endof
h# ffff of drop dup ( find-nonblank ) endof \ Keep scanning to end
+ debug-me
." Unrecognized summary node type " dup .x cr abort
endcase
;
@@ -1042,15 +1129,6 @@
then
;
-: +dirent ( adr -- adr' ) na1+ dup w@ 0= if 2 na+ then wa1+ ;
-
-: #dirents ( -- n )
- 0
- next-dirent dirents ( n endadr adr )
- begin 2dup > while +dirent rot 1+ -rot repeat ( n endadr adr )
- 2drop
-;
-
char \ instance value delimiter
defer $resolve-path
@@ -1083,19 +1161,13 @@
: $find-name ( name$ -- error? )
-1 to my-vers ( name$ )
- wd-inum crctab 2over ($crc) >r ( name$ r: hash )
0 dirent-offset !
- dirents begin next-pino-match while ( name$ adr' offset hash )
- \ Check for a hash match
- r@ = if ( name$ adr offset )
- 2over ?update-dirent ( name$ adr )
- else ( name$ adr offset )
- drop ( name$ adr )
- then ( name$ adr )
- repeat ( name$ r: hash )
- 2drop r> drop ( )
- my-vers 0< if true exit then ( )
+ dirents begin next-pino-match while ( name$ adr' offset )
+ 2over ?update-dirent ( name$ adr )
+ repeat ( name$ )
+ 2drop ( )
+ my-vers 0< if true exit then ( )
wf-type 4 = if wf-inum to wd-inum then
false
;
@@ -1209,8 +1281,8 @@
: prep-dirents ( -- )
minodes 'next-minode ! \ Empty the list
dirents ( adr )
- begin next-pino-match while ( adr' offset hash )
- drop insert-dirent ( adr )
+ begin next-pino-match while ( adr' offset )
+ insert-dirent ( adr )
repeat ( )
;
1
0