1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
4 typedef unsigned char __uint8_t
;
5 typedef short unsigned int __uint16_t
;
6 typedef long unsigned int __uint32_t
;
7 typedef __uint8_t
uint8_t ;
8 typedef __uint16_t
uint16_t ;
9 typedef __uint32_t
uint32_t ;
10 typedef __builtin_va_list __gnuc_va_list
;
11 typedef __gnuc_va_list
va_list;
12 typedef enum rtems_blkdev_request_op
{
13 RTEMS_BLKDEV_REQ_READ
,
14 } rtems_fdisk_segment_desc
;
15 typedef struct rtems_fdisk_driver_handlers
17 int (*blank
) (const rtems_fdisk_segment_desc
* sd
,
22 } rtems_fdisk_driver_handlers
;
23 typedef struct rtems_fdisk_page_desc
27 } rtems_fdisk_page_desc
;
28 typedef struct rtems_fdisk_segment_ctl
30 rtems_fdisk_page_desc
* page_descriptors
;
31 uint32_t pages_active
;
32 } rtems_fdisk_segment_ctl
;
33 typedef struct rtems_fdisk_segment_ctl_queue
35 } rtems_fdisk_segment_ctl_queue
;
36 typedef struct rtems_fdisk_device_ctl
42 extern void rtems_fdisk_error (const char *, ...);
43 extern int rtems_fdisk_seg_write(const rtems_flashdisk
*,
44 rtems_fdisk_segment_ctl
*,
46 const rtems_fdisk_page_desc
* page_desc
,
49 void rtems_fdisk_printf (const rtems_flashdisk
* fd
, const char *format
, ...)
53 __builtin_va_start(args
,format
);
57 rtems_fdisk_seg_blank_check (const rtems_flashdisk
* fd
,
58 rtems_fdisk_segment_ctl
* sc
,
64 const rtems_fdisk_segment_desc
* sd
;
65 const rtems_fdisk_driver_handlers
* ops
;
66 return ops
->blank (sd
, device
, segment
, offset
, size
);
69 rtems_fdisk_seg_write_page_desc (const rtems_flashdisk
* fd
,
70 rtems_fdisk_segment_ctl
* sc
,
72 const rtems_fdisk_page_desc
* page_desc
)
74 uint32_t offset
= page
* sizeof (rtems_fdisk_page_desc
);
75 if ((fd
->flags
& (1 << 3)))
77 int ret
= rtems_fdisk_seg_blank_check (fd
, sc
,
79 sizeof (rtems_fdisk_page_desc
));
81 return rtems_fdisk_seg_write (fd
, sc
, offset
,
82 page_desc
, sizeof (rtems_fdisk_page_desc
));
85 rtems_fdisk_recycle_segment (rtems_flashdisk
* fd
,
86 rtems_fdisk_segment_ctl
* ssc
,
87 rtems_fdisk_segment_ctl
* dsc
,
95 rtems_fdisk_page_desc
* spd
= &ssc
->page_descriptors
[spage
];
97 rtems_fdisk_page_desc
* dpd
;
99 dpd
= &dsc
->page_descriptors
[dpage
];
101 ret
= rtems_fdisk_seg_write_page_desc (fd
,
106 rtems_fdisk_printf (fd
, "ssc end: %d-%d: p=%ld, a=%ld, u=%ld",
107 pages
, active
, used
);
109 rtems_fdisk_error ("compacting: ssc pages not 0: %d",