Commit Graph

1223 Commits

Author SHA1 Message Date
Randall Spangler
0222355d8a Fix LoadKernel() not returning LOAD_KERNEL_RECOVERY
Change-Id: Ib147be7442b93ef429a9796e2b76bee27347e0b3

R=adlr@chromium.org
BUG=13150
TEST=manual

On a current firmware (0052G1+), use 'crossystem vbtest_errfunc=3
vbtest_errno=3' to force a reboot to recovery mode.  Then use
'crossystem recovery_reason' to check the recovery reason.

It should be 71.  It's not.  (You'll get a range of other error reasons
due to a different firmware bug.)

Review URL: http://codereview.chromium.org/6670040
2011-03-15 19:20:25 -07:00
Gaurav Shah
61388bb53e Add wrapper script for easy signing of firmware
Thought I might as well put this is in the repo since I use it very often.

Change-Id: Iecbb2340dce1522b15aab8eefb3b2c346cb7c24f

BUG=none
TEST=manually signed an image.

Review URL: http://codereview.chromium.org/6698014
2011-03-15 18:37:18 -07:00
Gaurav Shah
b64faaa7f4 Update PCR state with the state of the firmware keyblock flags too.
I re-factored the extend call into its own module, since it doesn't necessarily
need to be couple with rollbackfirmwaresetup.

BUG=chrome-os-partner:2372
TEST=Tried emerge-x86-generic and emerge-arm-generic vboot_reference.

Change-Id: I0d3115b10b686133e63e304570325ebdbd50ae3a

Review URL: http://codereview.chromium.org/6696006
2011-03-15 16:36:29 -07:00
Stefan Reinauer
55db6a6717 only update tpm if version if not default value
Change-Id: I697de80aa2f0454164cd3651e5a53d06e60a837e

BUG=2782
TEST=in progress

Review URL: http://codereview.chromium.org/6677067
2011-03-15 16:23:41 -07:00
Luigi Semenzato
0d2d139204 Run TPM timing test to completion instead of stopping at the first error.
Change-Id: Iae764bfeb2c766abb550f338db3d35d1d7eebf1d

BUG=433
TEST=compiled and ran.  (QA NOTE: no testing required)

Review URL: http://codereview.chromium.org/6462013
2011-03-15 15:49:49 -07:00
Randall Spangler
99ca3466ba LoadFirmware() and LoadKernel() handling for test errors
Change-Id: Icecfcab8f5cc30e80da7a2d77a1b1729f5094fee

R=wfrichar@chromium.org
BUG=13107
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6673048
2011-03-15 15:28:31 -07:00
Stéphane Marchesin
bc7a84d9a1 Revert "Add --kloadaddr option to utilities"
This reverts commit 1a0975f5f4.
This fixes chromeos-install on x86-mario with a kernel-next profile.

BUG=None
TEST=Build an x86-mario image with kernel-next, check that /usr/sbin/chromeos-install works.

Review URL: http://codereview.chromium.org/6677033

Change-Id: I67fc5c0f70a05a4d662952105542edf454da8022
2011-03-15 10:13:31 -07:00
Randall Spangler
b17e8d353c Add VB test error func/num
Change-Id: Ibe253963f0424935554fe91f166ef5040a723c6f

BUG=13107
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6698032
2011-03-15 09:50:38 -07:00
Vadim Bendebury
2008423d5f Add function for VDAT processing.
This CL is a user space counterpart of
http://codereview.chromium.org/6690023, which provided the
ability to retrieve buffers through chromeos_acpi driver.

The buffer contents is communicated as a multi line string
with each buffer byte represented as a two symbol hex
number. `crosstool', on the other has to map the buffer
contents into a certain binary structure. This CL add
conversion of the multiline string into a binary buffer and
also adds a temp. routine to dump the buffer contents on the
screen when `crosstool' is invoked.

Change-Id: I8dd3eb935332f9bc8769c71de0db302365f12d70

BUG=chromium-os:13069, chromium-os:13091
TEST=manual

- Install the new image on a target with firmware providing
 the VDAT ACPI method.

- Run crosstool and watch for the last line:
vdat                   =  11 22 33 44 ff 1f 1c 40 ff 57 74 41 ff ff ff ff # Raw VDAT contents.
localhost tmp #

Review URL: http://codereview.chromium.org/6695012
2011-03-15 09:29:48 -07:00
Bill Richardson
192d7e14f6 Add --leave_firmware_alone flag for BIOS testing purposes.
BUG=chromium-os:13100
TEST=none (BIOS team will test by using it)

Change-Id: Ifedeac1a0d13d36a069531bfaba4bdb7b3457406

Review URL: http://codereview.chromium.org/6696013
2011-03-14 22:21:08 -07:00
Gaurav Shah
276f846a14 Do not modify the input image while signing.
Change-Id: I17e1a5abcc4f2fab970a587b338594a7d51ecb2e

BUG=chromium-os:13026
TEST=manually tested all signing modes(usb, ssd, recovery, install), input image was not modified in each case.

Review URL: http://codereview.chromium.org/6686004
2011-03-14 11:32:01 -07:00
Nick Sanders
d221f223bd Don't modify fv old-style bitmaps
* Just make new "bmp" files as necessary

BUG=chrome-os-partner:2558
TEST=runs as expected

Change-Id: I3046630ea3e3f0a40429bb63a986c6044b83c6a6

Review URL: http://codereview.chromium.org/6623008
2011-03-11 21:34:43 -08:00
Randall Spangler
227f792c1b Add check-value support and check /proc/cmdline for cros_nodebug
Change-Id: I35158810184be03f18d98893e4dd640088384579

BUG=12904
TEST=manual

crossystem fwb_tries=1
crossystem fwb_tries?1 && echo YES || echo NO --> YES
crossystem fwb_tries?0x01 && echo YES || echo NO --> YES
crossystem fwb_tries?0 && echo YES || echo NO --> NO

crossystem fwb_tries=0
crossystem fwb_tries?0 && echo YES || echo NO --> YES
crossystem fwb_tries?1 && echo YES || echo NO --> NO
crossystem fwb_tries?0x01 && echo YES || echo NO --> NO

crossystem ecfw_act --> RW (if it's not, change RW to RO in the tests below)
crossystem ecfw_act?RW && echo YES || echo NO --> YES
crossystem ecfw_act?BOB && echo YES || echo NO --> NO

For the following tests, boot Alex with dev switch on and fwb_tries=1
Expected output of `crossystem mainfw_type mainfw_act cros_debug` under each of the following scenarios:
* Neither "cros_debug" nor" cros_nodebug" in kernel command line: normal B 1
* Kernel command line changed to include "cros_nodebug": normal B 0
* Kernel command line changed to include "cros_nodebugg": normal B 1
* Kernel command line changed to include "ccros_nodebug": normal B 1

Review URL: http://codereview.chromium.org/6665005
2011-03-11 13:34:56 -08:00
Che-Liang Chiou
1a0975f5f4 Add --kloadaddr option to utilities
Kernel body load address was hard-coded to CROS_32BIT_ENTRY_ADDR, which
could be an invalid/unavailable memory location on other platforms.

This CL adds an option for setting the load address, and it is default to
CROS_32BIT_ENTRY_ADDR to maintain backward-compatibility.

BUG=chromium-os:1304
TEST=emerge vboot_reference successfully

Review URL: http://codereview.chromium.org/6651022

Change-Id: I158cfce10ac59bd019bca41cb061039d0085d5cc
2011-03-11 15:02:17 +08:00
Randall Spangler
196e1772ed Add cros_debug option to crossystem
Change-Id: Ie62364a87f7f144ee647054d2a9ef83522cdbe7d

BUG=12904
TEST=manual

Expected output of `crossystem mainfw_type cros_debug` under each of the following scenarios:

* Boot Alex with dev switch off: normal 0
* Boot Alex with dev switch on (and dev firmware): developer 1
* Boot Alex with dev switch on (and normal firmware): normal 1
* Boot Alex with recovery firmware: recovery 0
* Boot Alex with dev switch off, then turn the dev switch on after booting: normal 0
* Boot Cr-48 with dev switch off: normal 0
* Boot Cr-48 with dev switch on: developer 1
* Boot Cr-48 with recovery firmware: recovery 0

* Boot Alex with dev switch off and kernel command line changed to include "cros_debug": normal 1
* Boot Alex with dev switch off and kernel command line changed to include "cros_debugg": normal 0
* Boot Alex with dev switch off and kernel command line changed to include "ccros_debug": normal 0

* Boot H2O BIOS with kernel command line changed to include "cros_debug": nonchrome 1
* Boot H2O BIOS with kernel command line changed to include "cros_debugg": nonchrome 0
* Boot H2O BIOS with kernel command line changed to include "ccros_debug": nonchrome 0

Review URL: http://codereview.chromium.org/6659021
2011-03-10 11:31:06 -08:00
Randall Spangler
95c4031ce9 This is necessary to pass additional information about whether firmware A or B is being run. This change also passes the GBB directly into LoadFirmware() and LoadKernel().
Change-Id: I976c11c82c3d665a4feb88226e919f16c2440f60

BUG=chrome-os-partner:1657
TEST=manual - see below

make && make runtests

Then test verifying a test image in both dev mode (-b1, no key specified) and recovery mode (key specified)

build/utility/load_kernel_test -b1 ~/b/USB_images/0.11.224.0-alex/chromiumos_test_image.bin

build/utility/load_kernel_test ~/b/USB_images/0.11.224.0-alex/chromiumos_test_image.bin tests/devkeys/recovery_key.vbpubk

And make sure the firmware with this change actually boots to USB and SSD.

NOTE: u-boot-next needs to change to work with this change.  will attempt a follow-up CL with that change

Review URL: http://codereview.chromium.org/6626045
2011-03-09 15:54:16 -08:00
Randall Spangler
c324fbfb6d Only advance kernel version when the booted partition has a valid key block
Change-Id: I879c18cc139f8a02bcaa6eb80437eaf836a5e851

BUG=chrome-os-partner:2597
TEST=manual

install pvt-signed image
flip dev switch on and boot
install dev-signed firmware
reboot
reboot
sudo bash
stop tcsd
tpmc read 0x1008 0x0d

bytes 6-10 should be 1 0 1 0, not FF FF FF FF

Review URL: http://codereview.chromium.org/6626020
2011-03-04 12:19:25 -08:00
Bill Richardson
ccdaa47b4d Support new flashmap layout in dev_debug_vboot.
Make dev_debug_vboot look first for the new section names, then the old ones.

Change-Id: I723f022bbbb23257c7c57db9543d7c35f524f95d

BUG=chromium-os:12611
TEST=manual

Rerun the steps that reproduce the problem as reported in the initial bug
report. You should see much more information.

Review URL: http://codereview.chromium.org/6621003
2011-03-03 18:08:18 -08:00
Hung-Te Lin
f82f4ae920 vboot/make_dev_firmware: extract bitmaps from system firmware instead of prebuilts.
make_dev_firmware should trust system firmware blobs instead of using its own
prebuilt binaries.

BUG=chromium-os:12400
TEST=1. make a build with .49+ BIOS, and create the firmware updater
     2. install the new BIOS, turn on developer switch and reboot
     3. an ugly "DEV" screen (in .49) is shown on screen
     4. run the new make_dev_firmware.sh
     5. reboot. seeing the ugly DEV instead of the prebuilt blue screen
     (verified successfully)

Change-Id: If75d2821170649fa869db6a82d879b697f7588e6

Review URL: http://codereview.chromium.org/6614006
2011-03-04 09:04:36 +08:00
Nick Sanders
e328d56354 Bitmap generator for components files
BUG=chrome-os-partner:2558
TEST=some files are generated

Change-Id: I6a69bce20d626e9a273711db099d7ec5c3b08686

Review URL: http://codereview.chromium.org/6598091
2011-03-03 11:37:54 -08:00
Randall Spangler
8478ece80f Fix missing brackets
Change-Id: I9d4fefdd128c087f9495055dbf3b6aa63ac62fd2

BUG=none
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6610023
2011-03-03 11:00:17 -08:00
Randall Spangler
640fb51d86 Reapply patch from http://codereview.chromium.org/6594092/
(somehow that never got committed)

Change-Id: I304e594066c5dd72fc7cf37d31e27b1096ae1a38

BUG=12282
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6610019
2011-03-03 10:11:17 -08:00
Bill Richardson
a933d11df8 Add "File->Save snapshot" menu item to export the displayed screen.
Change-Id: Ia0e14a768d6ba6dadd520cd7c3961759771dab08

BUG=chromium-os:12643
TEST=none

Review URL: http://codereview.chromium.org/6588139
2011-03-03 09:35:02 -08:00
Bill Richardson
34092799b1 Fix mistakes in scripts/newbitmaps/README
Change-Id: I743060a27ab9d3caeeadde295883a18bdd864a1f

BUG=chrome-os-partner:2558
TEST=none

Documentation change only. No tests needed.

Review URL: http://codereview.chromium.org/6588127
2011-03-02 15:23:01 -08:00
Gaurav Shah
5746845500 Add support for using separate developer firmware keyblock while signing.
Also re-factor the key generation script to its own directory, including wrappers for generating key pairs and keyblocks without needing to start keyset generation process from scratch. (Useful for generating new kernel keyblocks, and for retroactively adding new keys to an existing keyset - as in this case).

Finally, change hard coded algorithm ids and keyblock modes to bash variables, for each changes and telling keyset configuration from a glance.

BUG=chrome-os-partner:2218
TEST=manually tried the following:
1) Generating an entire new keyset.
2) Generating a new key pair and creating a keyblock from an existing key (for generating dev firmware keyblock for existing PVT keysets)
3) Firmware signing via sign_official_build.sh of an image with a firmware payload/

Change-Id: I4e9bb96ac7e5fe4cc0d95af6162ad6d37bbd4bda

Review URL: http://codereview.chromium.org/6594131
2011-03-02 14:50:46 -08:00
Bill Richardson
340335447f Add instructions for modifying the HWID.
Change-Id: I0b364103e3b93d7fd3deebd72b4cb58239729aeb

BUG=chrome-os-partner:416
TEST=manual

Be sure you're running BIOS 49 or later, including the read-only portion.

Follow the instructions in
src/platform/vboot_reference/scripts/newbitmaps/{README,HWID.txt}

Review URL: http://codereview.chromium.org/6588093
2011-03-01 13:18:56 -08:00
Randall Spangler
b416714a10 Add crossystem support for nvram_cleared and kern_nv
Fix try_b processing

And move key block flags check up in LoadFirmware(), which speeds up
boot when the dev switch is off because it doesn't do a signature
check and then throw it out.

BUG=12282
TEST=build firmware, try by hand

Review URL: http://codereview.chromium.org/6596081

Change-Id: I10474e9e0ae324906dfe02a351347d04ce847f67
2011-03-01 13:04:22 -08:00
Bill Richardson
dfe4ca5e40 Add stuff to support new bitmap format.
Add bitmap_viewer program (to run OUTSIDE of chroot) and example bitmaps (to
be replaced by the REAL bitmaps for each platform).

BUG=chromium-os:10949
TEST=none

These are just nonessential tools and examples. No regression testing needed.

Change-Id: I7f9aab30809251e4c62d71bfa73293d0b4d97196

Review URL: http://codereview.chromium.org/6598046
2011-03-01 12:58:27 -08:00
Randall Spangler
618d17d48c Add kern_nv field to crossystem
Change-Id: Ifa5cc3bd8367a258fb720162572f450a1be99c03

BUG=none
TEST=manual

crossystem kern_nv=0x12345678
crossystem kern_nv

Review URL: http://codereview.chromium.org/6602040
2011-03-01 10:33:11 -08:00
Randall Spangler
c4d21025bb Add LoadFirmware() support for NvStorage API
Change-Id: I19f402904978581eb5ca990ffbdf2f762b48c217

BUG=12282
TEST=make H2C firmware and verify using crossystem utility

(set fwb_tries, reboot, verify that mainfw_act is B)

Review URL: http://codereview.chromium.org/6597018
2011-02-25 14:57:39 -08:00
Randall Spangler
92e378e453 rename tried_fwb constants
Change-Id: Ib8018bfe29eed50766c699d832efe4f1afcabb1a

BUG=none
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6597015
2011-02-25 13:56:53 -08:00
Randall Spangler
172602829d Add NV storage fields for firmware flags
1) Did firmware attempt RW slot B before slot A?

2) Did firmware check the kernel keyblock signature, or just its hash?

Added crossystem support as well.

BUG=chrome-os-partner:1657
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6597011

Change-Id: I0d743ae87cedd938ba988170793717d3fdbd8ce9
2011-02-25 12:06:26 -08:00
Randall Spangler
0f8ffb11f5 crossystem uses VbNvStorage
Change-Id: I3f158115c8514bda0b271674870d68717c4816e6

BUG=12282
TEST=manual

crossystem fwb_tries=0 && crossystem fwb_tries

This should print 0 on both BIOSes.

crossystem fwb_tries=6 && crossystem fwb_tries

This should print 1 on an older BIOS and 6 on a new BIOS (0050+)

Then reboot and run

crossystem mainfw_act

This should print 'B', since fwb_tries was non-zero.

Review URL: http://codereview.chromium.org/6576059
2011-02-25 09:50:54 -08:00
Randall Spangler
0ca76fcc0c Print addresses as hex
Change-Id: I37b42088f94ee838e0d82f155ab0674323d859fc

BUG=none
TEST=manual (run crossystem and see that it prints hex values for savedmem_base and fmap_base)

Review URL: http://codereview.chromium.org/6582004
2011-02-24 14:33:20 -08:00
Randall Spangler
2b59a07c54 Add flashmap base address
Change-Id: If2106cbde445edc0970862a06d3837d2e466d9ef

BUG=chrome-os-partner:2487
TEST=manual

From a root shell, type: crossystem fmap_base
Should match the contents of /sys/devices/platform/chromeos_acpi/FMAP
(note that you need a new BIOS >0049 to get one that supports FMAP)

Review URL: http://codereview.chromium.org/6580037
2011-02-24 11:17:24 -08:00
Randall Spangler
efa40aa21d Add dev firmware key to devkeys.
The existing keys are kept the same, so that old dev kernels and
firmware remain compatible with new kernels and firmware.

Change-Id: I4177d1868904a477d79b9f2e6de88ed756ed57b4

BUG=chrome-os-partner:2218
TEST=manual:

Build firmware with new keys.

Boot with dev switch on.
Run 'crossystem mainfw_act mainfw_type'.
Should see "A developer"

Boot with dev switch off.
Run 'crossystem mainfw_act mainfw_type'.
Should see "B normal"

Review URL: http://codereview.chromium.org/6580035
2011-02-24 11:05:34 -08:00
Gaurav Shah
e77bec95d5 Add script to in-place modify a recovery image to ssd
Change-Id: I6435a4b0f40a571f8e44830e6d32f42d2d3213ff

BUG=none
TEST=manually tested with a signed image and comparing the kernel, and rootfs partitions.

Review URL: http://codereview.chromium.org/6533015
2011-02-23 16:35:42 -08:00
Randall Spangler
b47ed5a8fb Add more properties to crossystem
crossystem now covers all data currently provided by chromeos_acpi.

Change-Id: I3364c4d65ddf63fe788d3d9c1e9d05e64be22856

BUG=chromium-os:12282
TEST=manual - test on Cr-48 and compare with ACPI values

Review URL: http://codereview.chromium.org/6557001
2011-02-23 13:05:40 -08:00
Rong Chang
baa3bbe7a5 Move tpm lite API to common include path
In order to run test cases in both Linux user mode and u-boot command
mode. The API header tlcl.h must be accessed by both ebuilds.

Change-Id: Ic027dc118f26666b88bf54c511e2455a55e4eb8f

BUG=chromium-os:10497
TEST=emerge vboot_reference-firmware successfully

Review URL: http://codereview.chromium.org/6469089
2011-02-23 10:41:38 +08:00
Randall Spangler
9e162cdaa7 VbNvStorage cleanup and comments
BUG=12282
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6469059

Change-Id: I912b53ae33d65305353a747cc0bdd2b1ea62a04f
2011-02-22 13:06:53 -08:00
Che-Liang Chiou
0376203b41 Add --arch flag to pack mode of vbutil_kernel
When --arch flag is not x86, x86-only operations in pack mode are
turned off so that we can reuse vbutil_kernel to generate kernel partition
images for other targets, such as arm.

See CL:6538014 for its application.

BUG=chromium-os:3790
TEST=Run "emerge vboot_reference" successfully

Review URL: http://codereview.chromium.org/6538015

Change-Id: If45cf092d1ecc762fad6fda1aa57d23e26a7e47a
2011-02-22 11:16:51 +08:00
Gaurav Shah
f6af9dde86 Signer script to add update verification public key to an image
Change-Id: If51dd4f7d9e84f2f0f30506a3a9c354bc6a4b07b

BUG=chromium-os:7388
TEST=manually tested on an image, verified that the permissions on the copied key were correct.

Review URL: http://codereview.chromium.org/6543027
2011-02-18 15:51:52 -08:00
Randall Spangler
e73302caae Add support for CHNV settings to crossystem.
crossystem can now be used in place of reboot_mode.

BUG=12327
TEST=manual by comparing with the old reboot_mode utility

crossystem recovery_request=1
reboot_mode
crossystem dbg_reset=1
reboot_mode
crossystem fwb_tries=1
reboot_mode

crossystem recovery_request=0
reboot_mode
crossystem dbg_reset=0
reboot_mode
crossystem fwb_tries=0
reboot_mode

Review URL: http://codereview.chromium.org/6538066

Change-Id: Ifde661d4621129d52e757654d85e386e65f90df5
2011-02-18 14:53:01 -08:00
Jim Hebert
00b7d48f39 Fix issue where params which are sub-strings of other params caused problems e.g. ro and cros_secure
Change-Id: Ic6dd5a883646103b32cfb58712df7d34725c5f62

BUG=chromium-os:12285
TEST=Ran ./ensure_secure_kernelparams.sh chromiumos_base_image.bin on today's mario build which had repro'd the bug

Review URL: http://codereview.chromium.org/6538034
2011-02-17 16:54:24 -08:00
Randall Spangler
b944534edd Add NV storage API to vboot reference
BUG=chromium-os:12282
TEST=make && make runtests

Review URL: http://codereview.chromium.org/6532040

Change-Id: I57099de54ed56aa722f1944568bbb58b71b14379
2011-02-17 15:57:39 -08:00
Bill Richardson
a7209ee2de Allow yaml file to specify default compression for images
BUG=chromium-os:11490
TEST=manual

  cd src/platform/vboot_reference
  make
  make runbmptests

Change-Id: Ia887fc1aa1de873c6da6c04995bc0a9ad6b364aa

Review URL: http://codereview.chromium.org/6541001
2011-02-17 14:30:14 -08:00
Bill Richardson
f456e83dfd Correctly handle reuse of screens in yaml file.
BUG=chromium-os:12161
TEST=manual

  cd src/platform/vboot_reference
  make
  make runbmptests

Change-Id: Ic7708474ce7009744c9f12154d1967bdae8e55d2

Review URL: http://codereview.chromium.org/6534025
2011-02-17 11:29:51 -08:00
Randall Spangler
c80fe65f9e Fix WP polarity on Mario
Note that both the current and boot settings are incorrect as reported
by the BIOS.  This fixes both.

Change-Id: Iebd2b4ac91232444e538f6e2763a22cb227f2e4f

BUG=chrome-os-partner:2078
TEST=manual

Run crossystem on Mario and Alex with WP enabled, disabled and check
Verify true hardware WP status by doing:
   flashrom --wp-enable
   flashrom --wp-status
   flashrom --wp-disable
   flashrom --wp-status
On a system with hardware WP enabled, the disable step should fail and write
protect will still report enabled.

Review URL: http://codereview.chromium.org/6531035
2011-02-17 11:06:47 -08:00
Bill Richardson
f82f941b80 Write images to the bmpblock in the order they appear in the yaml.
This ensures that equivalent yaml files produce identical bmpblock binaries.

BUG=chromium-os:12158
TEST=manual

  cd src/platform/vboot_reference
  make
  make runbmptests

Change-Id: Ic8103ff90e57034d72fb3920a6c198c77768f162

Review URL: http://codereview.chromium.org/6533012
2011-02-17 08:56:33 -08:00
Che-Liang Chiou
39dfafd840 Fix tree break due to printf argument type mismatch
BUG=none
TEST=emerge-${BOARD} vboot_reference

TBR=rspangler@chromium.org

Change-Id: I4cfec460fbc036d16f80b81cf8582209abb5945a
2011-02-17 18:50:19 +08:00