HD-HLAN ソース CD


ようやく HD-HLAN のソース CD が届いた。
「再配布禁止」って書いてある。なんだかなー

入っているもの

[yasunari@giga SourceCD]$ ls -lR
.:
合計 103572
drwxrwsr-x    2 yasunari root         4096 Apr 15 22:57 License/
-rw-rw-r--    1 yasunari root         2307 Nov  3  2002 connect-dos.patch
-rw-rw-r--    1 yasunari root        92160 Nov  3  2002 cron-3.0pl1.tar.gz
-rw-rw-r--    1 yasunari root       112640 Nov  3  2002 dhcpcd-1.3.19-pl5.tar.gz
-rw-rw-r--    1 yasunari root      1208320 Nov  3  2002 e2fsprogs-1.22-2.tar.gz
-rw-rw-r--    1 yasunari root        10675 Nov  3  2002 eucsjis1531.patch
-rw-rw-r--    1 yasunari root      4375426 Nov  3  2002 ghostscript-6.51.tar.gz
-rw-rw-r--    1 yasunari root       259380 Nov  3  2002 hhl-target-ash-0.3.8-mvl2.1.0.6.src.rpm
-rw-rw-r--    1 yasunari root         4694 Nov  3  2002 hhl-target-base-files-2.1.PRO-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root      1878261 Nov  3  2002 hhl-target-bash-2.05a-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root      9570551 Nov  3  2002 hhl-target-binutils-2.11.2-mvl2.1.0.5.src.rpm
-rw-rw-r--    1 yasunari root       847405 Nov  3  2002 hhl-target-busybox-0.60.2-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root       647320 Nov  3  2002 hhl-target-findutils-4.1.7-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root      1625478 Nov  3  2002 hhl-target-gawk-3.1.0-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root     19198309 Nov  3  2002 hhl-target-glibc-2.2.3-mvl2.1.0.21.src.rpm
-rw-rw-r--    1 yasunari root       469285 Nov  3  2002 hhl-target-grep-2.4.2-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root       235868 Nov  3  2002 hhl-target-gzip-1.2.4-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root        42033 Nov  3  2002 hhl-target-hdparm-3.9a-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root        16546 Nov  3  2002 hhl-target-hostname-2.09-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root        76828 Nov  3  2002 hhl-target-ifupdown-0.6.4-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root        18107 Nov  3  2002 hhl-target-kernel-headers-2.4.17_mvl21-mvl2.1.0.9.src.rpm
-rw-rw-r--    1 yasunari root       248219 Nov  3  2002 hhl-target-less-358-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root       498320 Nov  3  2002 hhl-target-libpng-1.0.8-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root        37472 Nov  3  2002 hhl-target-logrotate-3.5.7-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root        95079 Nov  3  2002 hhl-target-lpr-0.50-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root      2582276 Nov  3  2002 hhl-target-lprng-3.7.4-mvl2.1.0.3.src.rpm
-rw-rw-r--    1 yasunari root       242988 Nov  3  2002 hhl-target-modutils-2.4.13-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root       279712 Nov  3  2002 hhl-target-net-tools-1.60-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root        51288 Nov  3  2002 hhl-target-netbase-4.06-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root       373648 Nov  3  2002 hhl-target-netkit-base-0.10-mvl2.1.0.3.src.rpm
-rw-rw-r--    1 yasunari root      1310506 Nov  3  2002 hhl-target-nvi-1.79-mvl2.1.0.3.src.rpm
-rw-rw-r--    1 yasunari root      2201567 Nov  3  2002 hhl-target-openssl-0.9.6e-mvl2.1.0.5.src.rpm
-rw-rw-r--    1 yasunari root       479886 Nov  3  2002 hhl-target-pam-0.72-mvl2.1.0.4.src.rpm
-rw-rw-r--    1 yasunari root       154013 Nov  3  2002 hhl-target-pciutils-2.1.8-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root      6067471 Nov  3  2002 hhl-target-perl-5.6.1-mvl2.1.0.3.src.rpm
-rw-rw-r--    1 yasunari root       236437 Nov  3  2002 hhl-target-procps-2.0.7-mvl2.1.0.3.src.rpm
-rw-rw-r--    1 yasunari root       288371 Nov  3  2002 hhl-target-sed-3.02-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root      1706068 Nov  3  2002 hhl-target-shellutils-2.0.11-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root       107471 Nov  3  2002 hhl-target-sysklogd-1.3.31-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root       141623 Nov  3  2002 hhl-target-sysutils-1.3.8.1-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root      1171908 Nov  3  2002 hhl-target-tar-1.13.19-mvl2.1.0.3.src.rpm
-rw-rw-r--    1 yasunari root       119193 Nov  3  2002 hhl-target-tcp-wrappers-7.6-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root       118037 Nov  3  2002 hhl-target-time-1.7-mvl2.1.0.1.src.rpm
-rw-rw-r--    1 yasunari root       109361 Nov  3  2002 hhl-target-which-2.12-mvl2.1.0.2.src.rpm
-rw-rw-r--    1 yasunari root     27238400 Mar 12 08:10 linux-2.4.17_mvl21-sandpoint.tar.gz
-rw-rw-r--    1 yasunari root        31664 Nov  3  2002 murasaki-0.6.11.tar.gz
-rw-rw-r--    1 yasunari root       835649 Nov  3  2002 netatalk-1.5.5.tar.gz
-rw-rw-r--    1 yasunari root       471040 Nov  3  2002 nkf201-2002.12.07.tar.gz
-rw-rw-r--    1 yasunari root          533 Nov  3  2002 realpath.patch
-rw-rw-r--    1 yasunari root     14929920 Nov  3  2002 samba-2.2.8a-ja-1.1-beta5.tar.gz
-rw-rw-r--    1 yasunari root       819200 Nov  3  2002 shadow-20000902.tar.gz
-rw-rw-r--    1 yasunari root          540 Nov  3  2002 skeychallenge.patch
-rw-rw-r--    1 yasunari root       112640 Nov  3  2002 sysvinit-2.78.tar.gz
-rw-rw-r--    1 yasunari root       128696 Nov  3  2002 thttpd-2.23beta1.tar.gz
-rw-rw-r--    1 yasunari root      1423360 Nov  3  2002 util-linux-2.11h.tar.gz
-rw-rw-r--    1 yasunari root       354784 Nov  3  2002 wu-ftpd-2.6.2.tar.gz

./License:
合計 100
-rw-rw-r--    1 yasunari root         3406 May 29  2003 COPYRIGHT.txt
-rw-rw-r--    1 yasunari root        47786 May 24  2003 GNU_LICENSE.pdf
-rw-rw-r--    1 yasunari root        18347 May 20  2003 gpl.txt
-rw-rw-r--    1 yasunari root        26934 May 20  2003 lgpl.txt

カーネルソース

linux-2.4.17_mvl21-sandpoint.tar.gz を展開し、 玄箱のカーネルソースと比較してみる

どちらかにしかファイルはないようである。
差のあるファイルは、これだけ。
ファイル名ちがい
.hhl_target_lspname型番
Makefile型番
arch/ppc/boot/common/misc-simple.c改行
arch/ppc/boot/sandpoint/head.S改行
arch/ppc/kernel/melco_hwctl.c改行
arch/ppc/kernel/melco_rtc.c改行
arch/ppc/platforms/sandpoint_setup.c型番
drivers/block/flashdisk/flashdisk.c改行+差分
drivers/char/mel_rtc.c改行
firminfo.txt型番
fs/super.c差分
include/melco/bootinfo.h改行
include/melco/firminfo.h改行
include/melco/flashd.h改行
include/melco/melco_hwctl.h改行
include/melco/melco_rtc.h改行
include/melco/melco_serial.h改行
mm/mmap.c差分
mm/mremap.c差分
改行:改行コードの違い
型番:モデル(型番)の違いに伴う差分
差分:実質的な差あり
実質的な差はほんのわずか。

drivers/block/flashdisk/flashdisk.c

玄箱は、
! struct flashd_list area_list[] = {
! 	{ 0xFFF80000,  0x80000  , ROM_ON_BORD },
! 	{ 0xFFC00000,  0x300000 , ROM_ON_BORD },
! 	{ 0xFFF00000,  0x70000  , ROM_ON_BORD },
! 	{ 0xFFF70000,  0x10000  , ROM_ON_BORD },
! 	{ 0xFFF80000,  0x80000  , ROM_MINIPCI },
! 	{ 0xFF800000,  0x600000 , ROM_MINIPCI },
! 	{ 0xFFF00000,  0x80000  , ROM_MINIPCI },
! 	{ 0         ,  0        , 0           }
! 	};
HLAN は
! struct flashd_list area_list[] = {
! 	{ 0xFFF80000,  0x80000  , ROM_ON_BORD },
! 	{ 0xFFC00000,  0x300000 , ROM_ON_BORD },
! 	{ 0xFFF00000,  0x70000  , ROM_ON_BORD },
! 	{ 0xFFF70000,  0x10000  , ROM_ON_BORD },
! 	{ 0xFFC00000,  0x400000 , ROM_ON_BORD },
! 	{ 0xFFF80000,  0x80000  , ROM_MINIPCI },
! 	{ 0xFF800000,  0x600000 , ROM_MINIPCI },
! 	{ 0xFFF00000,  0x80000  , ROM_MINIPCI },
! 	{ 0         ,  0        , 0           }
! 	};
HLAN 1.40 で /dev/fl4 が増えたことを裏付けている。
ROM_MINIPCI ってなんだろう?

fs/super.c

以前「リファクタリングが足りんな」としたところ。
diff -arc kurobako/source_CD/linux-2.4.17_kuro-box/fs/super.c HLAN/source_CD/linux-2.4.17_mvl21-sandpoint/fs/super.c
*** kurobako/source_CD/linux-2.4.17_kuro-box/fs/super.c	2004-03-15 00:13:56.000000000 +0900
--- HLAN/source_CD/linux-2.4.17_mvl21-sandpoint/fs/super.c	2004-02-18 16:43:00.000000000 +0900
***************
*** 1035,1054 ****
  	{
  		unsigned long *flag_addr;
  		unsigned long ng_word;
- 		int boot_hdd = 1;
  
  		flag_addr = (unsigned long *)(0xFFF70000);
  		ng_word = 0x4e474e47;
  
! 		if (*flag_addr == ng_word) 
! 			boot_hdd = 0;
! 
! 		if (boot_hdd == 0) {
  			strcpy(root_device_name, "rd/0");
  			ROOT_DEV = MKDEV (1, 0);
! 			printk("Boot from initrd.\n");
! 		} else
! 			printk("Boot from /dev/hda1.\n");
  	}
  #endif /* CONFIG_CMDLINE */
  
--- 1035,1050 ----
  	{
  		unsigned long *flag_addr;
  		unsigned long ng_word;
  
  		flag_addr = (unsigned long *)(0xFFF70000);
  		ng_word = 0x4e474e47;
+ 		printk("%8x:%4x\n", flag_addr, *flag_addr);
  
! 		if (*flag_addr == ng_word) {
  			strcpy(root_device_name, "rd/0");
  			ROOT_DEV = MKDEV (1, 0);
! 			printk("changed boot device.\n");
! 		}
  	}
  #endif /* CONFIG_CMDLINE */
  
HLAN の方がきれいやん。
しかし、こんなところ、なんで HLAN と 玄箱 とで ソースが変わってるんだろう?

mm/mmap.c,mm/mremap.c

変わってるが、よくわからん。
こんなところ、BUFFALO が手を入れるとは思わないし。
ひょっとすると kernel のアップデートに追従したか???

まず、kernel 2.4.17 オリジナルソース の mremap.c と比較する。 HLAN は、

[yasunari@giga linkstation]$ diff -rc kernel/linux-2.4.17/mm/mremap.c firmware/HLAN/source_CD/linux-2.4.17_mvl21-sandpoint/mm/mremap.c
*** kernel/linux-2.4.17/mm/mremap.c     2001-09-21 12:31:26.000000000 +0900
--- firmware/HLAN/source_CD/linux-2.4.17_mvl21-sandpoint/mm/mremap.c    2004-02-18 16:43:00.000000000 +0900
***************
*** 118,124 ****
        flush_cache_range(mm, new_addr, new_addr + len);
        while ((offset += PAGE_SIZE) < len)
                move_one_page(mm, new_addr + offset, old_addr + offset);
!       zap_page_range(mm, new_addr, len);
        return -1;
  }

--- 118,124 ----
        flush_cache_range(mm, new_addr, new_addr + len);
        while ((offset += PAGE_SIZE) < len)
                move_one_page(mm, new_addr + offset, old_addr + offset);
!       zap_page_range(mm, new_addr, len, ZPR_NORMAL);
        return -1;
  }
と1行だけオリジナルと異なる。
玄箱は、
[yasunari@giga linkstation]$ diff -rc kernel/linux-2.4.17/mm/mremap.c firmware/kurobako/source_CD/linux-2.4.17_kuro-box/mm/m
remap.c
*** kernel/linux-2.4.17/mm/mremap.c     2001-09-21 12:31:26.000000000 +0900
--- firmware/kurobako/source_CD/linux-2.4.17_kuro-box/mm/mremap.c       2004-03-18 10:53:56.000000000 +0900
***************
*** 118,124 ****
        flush_cache_range(mm, new_addr, new_addr + len);
        while ((offset += PAGE_SIZE) < len)
                move_one_page(mm, new_addr + offset, old_addr + offset);
!       zap_page_range(mm, new_addr, len);
        return -1;
  }

--- 118,124 ----
        flush_cache_range(mm, new_addr, new_addr + len);
        while ((offset += PAGE_SIZE) < len)
                move_one_page(mm, new_addr + offset, old_addr + offset);
!       zap_page_range(mm, new_addr, len, ZPR_NORMAL);
        return -1;
  }

***************
*** 237,242 ****
--- 237,250 ----
                if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len)
                        goto out;

+               /*
+                * Allow new_len == 0 only if new_addr == addr
+                * to preserve truncation in place (that was working
+                * safe and some app may depend on it).
+                */
+               if (unlikely(!new_len && new_addr != addr))
+                       goto out;
+
                /* Check if the location we're moving into overlaps the
                 * old location at all, and fail if it does.
                 */
***************
*** 246,261 ****
                if ((addr <= new_addr) && (addr+old_len) > new_addr)
                        goto out;

!               do_munmap(current->mm, new_addr, new_len);
        }

        /*
         * Always allow a shrinking remap: that just unmaps
         * the unnecessary pages..
         */
-       ret = addr;
        if (old_len >= new_len) {
!               do_munmap(current->mm, addr+new_len, old_len - new_len);
                if (!(flags & MREMAP_FIXED) || (new_addr == addr))
                        goto out;
        }
--- 254,273 ----
                if ((addr <= new_addr) && (addr+old_len) > new_addr)
                        goto out;

!               ret = do_munmap(current->mm, new_addr, new_len);
!               if (ret && new_len)
!                       goto out;
        }

        /*
         * Always allow a shrinking remap: that just unmaps
         * the unnecessary pages..
         */
        if (old_len >= new_len) {
!               ret = do_munmap(current->mm, addr+new_len, old_len - new_len);
!               if (ret && old_len != new_len)
!                       goto out;
!               ret = addr;
                if (!(flags & MREMAP_FIXED) || (new_addr == addr))
                        goto out;
        }
と HLAN での変更に加えて、さらに変更が加えられている。
mm/mmap.c も同様に、
HLAN で 2.4.17 のオリジナルから変更されていて、
玄箱 では、さらに変更が加えられている

これが、Monta Vista によるものなのか、 Buffallo によるものかを見るために、 カーネルの差分を追いかけることにする。

mm/mremap.c は kernel-2.4.17 の後、
kernel-2.4.22 で変更が加えられているが、 これは、HLAN とも 玄箱 とも違う

kernel-2.4.24 で、

diff -urN linux-2.4.23/mm/mremap.c linux-2.4.24/mm/mremap.c
--- linux-2.4.23/mm/mremap.c    2003-08-25 04:44:44.000000000 -0700
+++ linux-2.4.24/mm/mremap.c    2004-01-05 05:53:56.000000000 -0800
@@ -241,6 +241,13 @@

                if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len)
                        goto out;
+               /*
+                * Allow new_len == 0 only if new_addr == addr
+                * to preserve truncation in place (that was working
+                * safe and some app may depend on it).
+                */
+               if (unlikely(!new_len && new_addr != addr))
+                       goto out;

                /* Check if the location we're moving into overlaps the
                 * old location at all, and fail if it does.
となっていて、これは 玄箱にのみ取り込まれている
この修正は、 CAN-2003-0985 のようである

kernel-2.4.25 で、

diff -urN linux-2.4.24/mm/mremap.c linux-2.4.25/mm/mremap.c
--- linux-2.4.24/mm/mremap.c    2004-01-05 05:53:56.000000000 -0800
+++ linux-2.4.25/mm/mremap.c    2004-02-18 05:36:32.000000000 -0800
@@ -258,16 +258,20 @@
                if ((addr <= new_addr) && (addr+old_len) > new_addr)
                        goto out;

-               do_munmap(current->mm, new_addr, new_len);
+               ret = do_munmap(current->mm, new_addr, new_len);
+               if (ret && new_len)
+                       goto out;
        }

        /*
         * Always allow a shrinking remap: that just unmaps
         * the unnecessary pages..
         */
-       ret = addr;
        if (old_len >= new_len) {
-               do_munmap(current->mm, addr+new_len, old_len - new_len);
+               ret = do_munmap(current->mm, addr+new_len, old_len - new_len);
+               if (ret && old_len != new_len)
+                       goto out;
+               ret = addr;
                if (!(flags & MREMAP_FIXED) || (new_addr == addr))
                        goto out;
        }
となっていて、これも 玄箱にのみ取り込まれている。
この修正は、 CAN-2004-0077

kernel-2.4.26 での修正は、取り込まれていない。

ということで、mm/mremap.c だけを見ると、 玄箱 のカーネルソースは(あくまでソースは) オリジナルのカーネルの修正を取り込んでいる部分もある。
どういう基準で取り込んでいるかは不明。
また、どの範囲で取り込んでいるのかも不明(調べれば判るけど)
セキュリティパッチを全部取り込んでくれていればいいのだけれど、、、
&&
このソースをコンパイルしたカーネルが動いてくれていると いいのだけれど、、、

また、Monta Vista か Buffalo かが手を入れた部分もある。
(zap_page_range() の引数の変更) これは、Monta Vista Linux の mm/mremap.c を見れば判るんだろうが、 結局 MVL のソースは手に入れてないし、、、

玄箱 1.01 のビルド日は2月9日、
HLAN 1.40 のビルド日は3月5日。
後に出た HLAN 1.40 の方がオクレているとは、、、

ちゃんとした構成管理、できていなさそう。


LinkStation/玄箱 をハックしよう → write_ok,write_ng(2)

Copyright (C) 2004 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp
山下康成京都府向日市