From: Vladimir 'phcoder' Serbinenko Date: Wed, 25 Jan 2012 17:32:08 +0000 (+0100) Subject: IEEE1275 disk write support. X-Git-Tag: 2.00~767 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7626111087ebe45e59d79e81e1bb97a6319dbf85;p=thirdparty%2Fgrub.git IEEE1275 disk write support. * grub-core/kern/ieee1275/ieee1275.c (grub_ieee1275_write): Make buffer const void *. * include/grub/ieee1275/ieee1275.h (grub_ieee1275_write): Likewise. * grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_read): Move open and seek loginc to ... (grub_ofdisk_prepare): ... here. (grub_ofdisk_write): Implement. --- diff --git a/ChangeLog b/ChangeLog index b1f664731..595810037 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2012-01-25 Vladimir Serbinenko + + IEEE1275 disk write support. + + * grub-core/kern/ieee1275/ieee1275.c (grub_ieee1275_write): Make buffer + const void *. + * include/grub/ieee1275/ieee1275.h (grub_ieee1275_write): Likewise. + * grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_read): Move open + and seek loginc to ... + (grub_ofdisk_prepare): ... here. + (grub_ofdisk_write): Implement. + 2012-01-25 Vladimir Serbinenko ARC disk write support. diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c index 0cbeab802..4481837de 100644 --- a/grub-core/disk/ieee1275/ofdisk.c +++ b/grub-core/disk/ieee1275/ofdisk.c @@ -311,10 +311,9 @@ grub_ofdisk_close (grub_disk_t disk) } static grub_err_t -grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector, - grub_size_t size, char *buf) +grub_ofdisk_prepare (grub_disk_t disk, grub_disk_addr_t sector) { - grub_ssize_t status, actual; + grub_ssize_t status; unsigned long long pos; if (disk->data != last_devpath) @@ -343,15 +342,28 @@ grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector, last_devpath = disk->data; } - pos = sector * 512UL; + pos = sector << GRUB_DISK_SECTOR_BITS; grub_ieee1275_seek (last_ihandle, pos, &status); if (status < 0) return grub_error (GRUB_ERR_READ_ERROR, "seek error, can't seek block %llu", (long long) sector); - grub_ieee1275_read (last_ihandle, buf, size * 512UL, &actual); - if (actual != (grub_ssize_t) (size * 512UL)) + return 0; +} + +static grub_err_t +grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector, + grub_size_t size, char *buf) +{ + grub_err_t err; + grub_ssize_t actual; + err = grub_ofdisk_prepare (disk, sector); + if (err) + return err; + grub_ieee1275_read (last_ihandle, buf, size << GRUB_DISK_SECTOR_BITS, + &actual); + if (actual != (grub_ssize_t) (size << GRUB_DISK_SECTOR_BITS)) return grub_error (GRUB_ERR_READ_ERROR, "read error on block: %llu", (long long) sector); @@ -359,12 +371,21 @@ grub_ofdisk_read (grub_disk_t disk, grub_disk_addr_t sector, } static grub_err_t -grub_ofdisk_write (grub_disk_t disk __attribute ((unused)), - grub_disk_addr_t sector __attribute ((unused)), - grub_size_t size __attribute ((unused)), - const char *buf __attribute ((unused))) +grub_ofdisk_write (grub_disk_t disk, grub_disk_addr_t sector, + grub_size_t size, const char *buf) { - return GRUB_ERR_NOT_IMPLEMENTED_YET; + grub_err_t err; + grub_ssize_t actual; + err = grub_ofdisk_prepare (disk, sector); + if (err) + return err; + grub_ieee1275_write (last_ihandle, buf, size << GRUB_DISK_SECTOR_BITS, + &actual); + if (actual != (grub_ssize_t) (size << GRUB_DISK_SECTOR_BITS)) + return grub_error (GRUB_ERR_WRITE_ERROR, "write error on block: %llu", + (long long) sector); + + return 0; } static struct grub_disk_dev grub_ofdisk_dev = diff --git a/grub-core/kern/ieee1275/ieee1275.c b/grub-core/kern/ieee1275/ieee1275.c index b20f64d68..98217029f 100644 --- a/grub-core/kern/ieee1275/ieee1275.c +++ b/grub-core/kern/ieee1275/ieee1275.c @@ -232,7 +232,7 @@ grub_ieee1275_instance_to_path (grub_ieee1275_ihandle_t ihandle, } int -grub_ieee1275_write (grub_ieee1275_ihandle_t ihandle, void *buffer, +grub_ieee1275_write (grub_ieee1275_ihandle_t ihandle, const void *buffer, grub_size_t len, grub_ssize_t *actualp) { struct write_args diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h index b84d75697..647374d0e 100644 --- a/include/grub/ieee1275/ieee1275.h +++ b/include/grub/ieee1275/ieee1275.h @@ -148,7 +148,7 @@ int EXPORT_FUNC(grub_ieee1275_instance_to_path) (grub_ieee1275_ihandle_t ihandle, char *path, grub_size_t len, grub_ssize_t *actual); int EXPORT_FUNC(grub_ieee1275_write) (grub_ieee1275_ihandle_t ihandle, - void *buffer, grub_size_t len, + const void *buffer, grub_size_t len, grub_ssize_t *actualp); int EXPORT_FUNC(grub_ieee1275_read) (grub_ieee1275_ihandle_t ihandle, void *buffer, grub_size_t len,