| /* { dg-do compile } */ |
| /* { dg-options "-O2" } */ |
| |
| typedef unsigned char __uint8_t; |
| typedef short unsigned int __uint16_t; |
| typedef long unsigned int __uint32_t; |
| typedef __uint8_t uint8_t ; |
| typedef __uint16_t uint16_t ; |
| typedef __uint32_t uint32_t ; |
| typedef __builtin_va_list __gnuc_va_list; |
| typedef __gnuc_va_list va_list; |
| typedef enum rtems_blkdev_request_op { |
| RTEMS_BLKDEV_REQ_READ, |
| } rtems_fdisk_segment_desc; |
| typedef struct rtems_fdisk_driver_handlers |
| { |
| int (*blank) (const rtems_fdisk_segment_desc* sd, |
| uint32_t device, |
| uint32_t segment, |
| uint32_t offset, |
| uint32_t size); |
| } rtems_fdisk_driver_handlers; |
| typedef struct rtems_fdisk_page_desc |
| { |
| uint16_t flags; |
| uint32_t block; |
| } rtems_fdisk_page_desc; |
| typedef struct rtems_fdisk_segment_ctl |
| { |
| rtems_fdisk_page_desc* page_descriptors; |
| uint32_t pages_active; |
| } rtems_fdisk_segment_ctl; |
| typedef struct rtems_fdisk_segment_ctl_queue |
| { |
| } rtems_fdisk_segment_ctl_queue; |
| typedef struct rtems_fdisk_device_ctl |
| { |
| uint32_t flags; |
| uint8_t* copy_buffer; |
| } rtems_flashdisk; |
| |
| extern void rtems_fdisk_error (const char *, ...); |
| extern int rtems_fdisk_seg_write(const rtems_flashdisk*, |
| rtems_fdisk_segment_ctl*, |
| uint32_t, |
| const rtems_fdisk_page_desc* page_desc, |
| uint32_t); |
| |
| void rtems_fdisk_printf (const rtems_flashdisk* fd, const char *format, ...) |
| { |
| { |
| va_list args; |
| __builtin_va_start(args,format); |
| } |
| } |
| static int |
| rtems_fdisk_seg_blank_check (const rtems_flashdisk* fd, |
| rtems_fdisk_segment_ctl* sc, |
| uint32_t offset, |
| uint32_t size) |
| { |
| uint32_t device; |
| uint32_t segment; |
| const rtems_fdisk_segment_desc* sd; |
| const rtems_fdisk_driver_handlers* ops; |
| return ops->blank (sd, device, segment, offset, size); |
| } |
| static int |
| rtems_fdisk_seg_write_page_desc (const rtems_flashdisk* fd, |
| rtems_fdisk_segment_ctl* sc, |
| uint32_t page, |
| const rtems_fdisk_page_desc* page_desc) |
| { |
| uint32_t offset = page * sizeof (rtems_fdisk_page_desc); |
| if ((fd->flags & (1 << 3))) |
| { |
| int ret = rtems_fdisk_seg_blank_check (fd, sc, |
| offset, |
| sizeof (rtems_fdisk_page_desc)); |
| } |
| return rtems_fdisk_seg_write (fd, sc, offset, |
| page_desc, sizeof (rtems_fdisk_page_desc)); |
| } |
| void |
| rtems_fdisk_recycle_segment (rtems_flashdisk* fd, |
| rtems_fdisk_segment_ctl* ssc, |
| rtems_fdisk_segment_ctl* dsc, |
| uint32_t *pages) |
| { |
| int ret; |
| uint32_t spage; |
| uint32_t used = 0; |
| uint32_t active = 0; |
| { |
| rtems_fdisk_page_desc* spd = &ssc->page_descriptors[spage]; |
| { |
| rtems_fdisk_page_desc* dpd; |
| uint32_t dpage; |
| dpd = &dsc->page_descriptors[dpage]; |
| *dpd = *spd; |
| ret = rtems_fdisk_seg_write_page_desc (fd, |
| dsc, |
| dpage, dpd); |
| } |
| } |
| rtems_fdisk_printf (fd, "ssc end: %d-%d: p=%ld, a=%ld, u=%ld", |
| pages, active, used); |
| { |
| rtems_fdisk_error ("compacting: ssc pages not 0: %d", |
| ssc->pages_active); |
| } |
| } |