summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--amtider.c16
-rw-r--r--ider.c67
-rw-r--r--redir.h2
3 files changed, 36 insertions, 49 deletions
diff --git a/amtider.c b/amtider.c
index d266f31..3f0fefd 100644
--- a/amtider.c
+++ b/amtider.c
@@ -171,6 +171,7 @@ static void usage(FILE *fp)
" -h print this text\n"
" -v verbose (default)\n"
" -q quiet\n"
+ " -c use CD-ROM emulation\n"
" -g start redirection gracefully\n"
" -r start redirection on reboot\n"
" -f file file to use as device data\n"
@@ -204,14 +205,14 @@ int main(int argc, char *argv[])
r.cb_data = &r;
r.cb_recv = recv_ider;
r.cb_state = state_ider;
+ r.device = 0xa0;
r.enable_options = IDER_START_NOW;
- r.lba_size = (unsigned int)1 << 11;
if (NULL != (h = getenv("AMT_PASSWORD")))
snprintf(r.pass, sizeof(r.pass), "%s", h);
for (;;) {
- if (-1 == (c = getopt(argc, argv, "f:ghvqu:p:LC:")))
+ if (-1 == (c = getopt(argc, argv, "df:ghvqu:p:LC:")))
break;
switch (c) {
case 'v':
@@ -226,6 +227,9 @@ int main(int argc, char *argv[])
case 'u':
snprintf(r.user, sizeof(r.user), "%s", optarg);
break;
+ case 'c':
+ r.device = 0xb0;
+ break;
case 'g':
r.enable_options = IDER_START_GRACEFUL;
break;
@@ -289,7 +293,13 @@ int main(int argc, char *argv[])
perror("mmap");
exit(1);
}
-
+ if (r.device == 0xa0) {
+ r.lba_size = 512;
+ r.lba_shift = 9;
+ } else {
+ r.lba_size = 2048;
+ r.lba_shift = 11;
+ }
if (0 == strlen(r.pass)) {
tty_save();
tty_noecho();
diff --git a/ider.c b/ider.c
index 439d312..a9d5826 100644
--- a/ider.c
+++ b/ider.c
@@ -95,30 +95,18 @@ static int ider_read_data(struct redir *r, unsigned int seqno,
unsigned char device, bool use_dma,
unsigned long lba, unsigned int count)
{
- unsigned int offset = 0, lba_size = r->lba_size;
- off_t mmap_offset = lba * lba_size;
- bool last_lba = false;
- int ret = 0;
+ off_t mmap_offset = lba << r->lba_shift;
+ size_t mmap_len = count << r->lba_shift;
+ unsigned char *lba_ptr =
+ (unsigned char *)r->mmap_buf + mmap_offset;
if (!count)
return ider_packet_sense(r, seqno, device, 0x00, 0x00, 0x00);
if (mmap_offset >= r->mmap_size)
return ider_packet_sense(r, seqno, device, 0x05, 0x21, 0x00);
- while (offset < count) {
- off_t lba_offset = offset * lba_size;
- unsigned char *lba_ptr =
- (unsigned char *)r->mmap_buf + mmap_offset + lba_offset;
- if (mmap_offset + lba_offset + lba_size >= r->mmap_size) {
- lba_size = r->mmap_size - mmap_offset - lba_offset;
- last_lba = true;
- }
- ret = ider_data_to_host(r, seqno, device, lba_ptr,
- lba_size, last_lba, use_dma);
- if (ret < 0)
- break;
- offset++;
- }
- return ret;
+
+ return ider_data_to_host(r, seqno, device, lba_ptr,
+ mmap_len, true, use_dma);
}
unsigned char ider_mode_page_01_floppy[] = {
@@ -212,7 +200,7 @@ int ider_handle_command(struct redir *r, unsigned int seqno,
uint32_t lba, mode_len;
unsigned int count;
- if (!r->mmap_size)
+ if (!r->mmap_size || device != r->device)
/* NOT READY, MEDIUM NOT PRESENT */
return ider_packet_sense(r, seqno, device, 0x02, 0x3a, 0x0);
@@ -237,11 +225,7 @@ int ider_handle_command(struct redir *r, unsigned int seqno,
return ider_data_to_host(r, seqno, device, resp, 4, true, use_dma);
case MODE_SENSE_10:
mode_len = ((unsigned int)cdb[7] << 8) | (unsigned int)(cdb[8]);
- if (device == 0xa0) {
- lba = 0;
- } else {
- lba = (r->mmap_size >> 11);
- }
+ lba = (r->mmap_size >> r->lba_shift);
fprintf(stderr, "seqno %u: mode sense pg %02x len %u\n",
seqno, cdb[2], mode_len);
switch (cdb[2] & 0x3f) {
@@ -291,11 +275,7 @@ int ider_handle_command(struct redir *r, unsigned int seqno,
return ider_data_to_host(r, seqno, device,
mode_sense, mode_len, true, use_dma);
case READ_CAPACITY:
- if (device == 0xa0) {
- /* NOT READY, MEDIUM NOT PRESENT */
- return ider_packet_sense(r, seqno, device, 0x02, 0x3a, 0x0);
- }
- lba = (r->mmap_size >> 11) - 1;
+ lba = (r->mmap_size >> r->lba_shift) - 1;
resp[0] = (lba >> 24) & 0xff;
resp[1] = (lba >> 16) & 0xff;
resp[2] = (lba >> 8) & 0xff;
@@ -308,16 +288,15 @@ int ider_handle_command(struct redir *r, unsigned int seqno,
seqno, lba, r->lba_size);
return ider_data_to_host(r, seqno, device, resp, 8, true, use_dma);
case READ_TOC:
+ if (device == 0xa0) {
+ /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */
+ return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00);
#if 0
- {
+ } else {
unsigned int resp_len;
unsigned char format;
bool msf;
- if (device == 0xa0) {
- /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */
- return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00);
- }
resp_len = cdb[7];
format = cdb[2] & 0x0f;
msf = cdb[1] & 0x02;
@@ -363,15 +342,15 @@ int ider_handle_command(struct redir *r, unsigned int seqno,
}
return ider_data_to_host(r, seqno, device,
resp, resp_len, true, use_dma);
- }
- break;
#else
- /* Not supported */
- fprintf(stderr, "seqno %u: read toc (not implemented)\n",
- seqno);
- /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */
- return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00);
+ /* Not supported */
+ fprintf(stderr, "seqno %u: read toc (not implemented)\n",
+ seqno);
+ /* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */
+ return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00);
#endif
+ }
+ break;
case 0x46: /* GET CONFIGURATION, missing from scsi.h */
fprintf(stderr, "seqno %u: device %02x get configuration (n/i)\n",
seqno, device);
@@ -384,10 +363,6 @@ int ider_handle_command(struct redir *r, unsigned int seqno,
/* ILLEGAL REQUEST, INVALID COMMAND OPERATION CODE */
return ider_packet_sense(r, seqno, device, 0x05, 0x20, 0x00);
case READ_10:
- if (device == 0xa0) {
- /* NOT READY, MEDIUM NOT PRESENT */
- return ider_packet_sense(r, seqno, device, 0x02, 0x3a, 0x0);
- }
lba = (unsigned int)cdb[2] << 24 |
(unsigned int)cdb[3] << 16 |
(unsigned int)cdb[4] << 8 |
diff --git a/redir.h b/redir.h
index 5cb93d2..4b76e1e 100644
--- a/redir.h
+++ b/redir.h
@@ -35,8 +35,10 @@ struct redir {
/* ide-redirection */
unsigned char filename[256];
unsigned int lba_size;
+ unsigned int lba_shift;
void *mmap_buf;
ssize_t mmap_size;
+ unsigned char device;
unsigned int tx_bufsize;
unsigned int rx_bufsize;
unsigned int enable_options;