summaryrefslogtreecommitdiff
path: root/src/dev
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2017-09-25 17:53:57 -0700
committerGabe Black <gabeblack@google.com>2017-09-26 23:47:24 +0000
commit5a27a68c736eb1d295e52e0d5cdd106942ffd6f2 (patch)
tree5fbadbd4252ed27a1c47a2a615033c21992135a9 /src/dev
parent9747cacf97d952ef597328c2c442700d951e26f6 (diff)
downloadgem5-5a27a68c736eb1d295e52e0d5cdd106942ffd6f2.tar.xz
dev: Make the IDE controller handle NULL simobject pointers.
Only panic if there are disks which would actually be connected to it beyond its limit. Also skip past disks which are set to NULL. This is useful since it lets you set up disks on different ports of the controller instead of filling them contiguously. Change-Id: I92f1316d3ad6931e25bfffeb34fb2603c0b95ce7 Reviewed-on: https://gem5-review.googlesource.com/4848 Maintainer: Gabe Black <gabeblack@google.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/dev')
-rw-r--r--src/dev/storage/ide_ctrl.cc32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/dev/storage/ide_ctrl.cc b/src/dev/storage/ide_ctrl.cc
index 6d507269f..d1c9f7d73 100644
--- a/src/dev/storage/ide_ctrl.cc
+++ b/src/dev/storage/ide_ctrl.cc
@@ -102,23 +102,31 @@ IdeController::IdeController(Params *p)
ioEnabled(false), bmEnabled(false),
ioShift(p->io_shift), ctrlOffset(p->ctrl_offset)
{
- if (params()->disks.size() > 4)
- panic("IDE controllers support a maximum of 4 devices attached!\n");
// Assign the disks to channels
- int numDisks = params()->disks.size();
- if (numDisks > 0)
- primary.master = params()->disks[0];
- if (numDisks > 1)
- primary.slave = params()->disks[1];
- if (numDisks > 2)
- secondary.master = params()->disks[2];
- if (numDisks > 3)
- secondary.slave = params()->disks[3];
-
for (int i = 0; i < params()->disks.size(); i++) {
+ if (!params()->disks[i])
+ continue;
+ switch (i) {
+ case 0:
+ primary.master = params()->disks[0];
+ break;
+ case 1:
+ primary.slave = params()->disks[1];
+ break;
+ case 2:
+ secondary.master = params()->disks[2];
+ break;
+ case 3:
+ secondary.slave = params()->disks[3];
+ break;
+ default:
+ panic("IDE controllers support a maximum "
+ "of 4 devices attached!\n");
+ }
params()->disks[i]->setController(this);
}
+
primary.select(false);
secondary.select(false);