Index: uspace/srv/bd/gxe_bd/gxe_bd.c
===================================================================
--- uspace/srv/bd/gxe_bd/gxe_bd.c	(revision 6b2f4c1c0a2202f8f14c3257f709fba1a3251431)
+++ uspace/srv/bd/gxe_bd/gxe_bd.c	(revision 84adbf0de4924a0d5eb7352c86b917f907efae6f)
@@ -59,4 +59,8 @@
 };
 
+enum {
+	MAX_DISKS	= 2
+};
+
 typedef struct {
 	uint32_t offset_lo;
@@ -86,5 +90,5 @@
 static gxe_bd_t *dev;
 
-static uint32_t disk_id = 0;
+static dev_handle_t dev_handle[MAX_DISKS];
 
 static atomic_t dev_futex = FUTEX_INITIALIZER;
@@ -92,7 +96,10 @@
 static int gxe_bd_init(void);
 static void gxe_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
-static int gx_bd_rdwr(ipcarg_t method, off_t offset, off_t size, void *buf);
-static int gxe_bd_read_block(uint64_t offset, size_t size, void *buf);
-static int gxe_bd_write_block(uint64_t offset, size_t size, const void *buf);
+static int gx_bd_rdwr(int disk_id, ipcarg_t method, off_t offset, off_t size,
+    void *buf);
+static int gxe_bd_read_block(int disk_id, uint64_t offset, size_t size,
+    void *buf);
+static int gxe_bd_write_block(int disk_id, uint64_t offset, size_t size,
+    const void *buf);
 
 int main(int argc, char **argv)
@@ -112,7 +119,7 @@
 static int gxe_bd_init(void)
 {
-	dev_handle_t dev_handle;
 	void *vaddr;
-	int rc;
+	int rc, i;
+	char name[16];
 
 	rc = devmap_driver_register(NAME, gxe_bd_connection);
@@ -130,9 +137,13 @@
 	dev = vaddr;
 
-	rc = devmap_device_register("disk0", &dev_handle);
-	if (rc != EOK) {
-		devmap_hangup_phone(DEVMAP_DRIVER);
-		printf(NAME ": Unable to register device.\n");
-		return rc;
+	for (i = 0; i < MAX_DISKS; i++) {
+		snprintf(name, 16, "disk%d", i);
+		rc = devmap_device_register(name, &dev_handle[i]);
+		if (rc != EOK) {
+			devmap_hangup_phone(DEVMAP_DRIVER);
+			printf(NAME ": Unable to register device %s.\n",
+				name);
+			return rc;
+		}
 	}
 
@@ -146,8 +157,24 @@
 	ipc_call_t call;
 	ipcarg_t method;
+	dev_handle_t dh;
 	int flags;
 	int retval;
 	off_t idx;
 	off_t size;
+	int disk_id, i;
+
+	/* Get the device handle. */
+	dh = IPC_GET_ARG1(*icall);
+
+	/* Determine which disk device is the client connecting to. */
+	disk_id = -1;
+	for (i = 0; i < MAX_DISKS; i++)
+		if (dev_handle[i] == dh)
+			disk_id = i;
+
+	if (disk_id < 0) {
+		ipc_answer_0(iid, EINVAL);
+		return;
+	}
 
 	/* Answer the IPC_M_CONNECT_ME_TO call. */
@@ -183,5 +210,6 @@
 				break;
 			}
-			retval = gx_bd_rdwr(method, idx * size, size, fs_va);
+			retval = gx_bd_rdwr(disk_id, method, idx * size,
+			    size, fs_va);
 			break;
 		default:
@@ -193,5 +221,6 @@
 }
 
-static int gx_bd_rdwr(ipcarg_t method, off_t offset, off_t size, void *buf)
+static int gx_bd_rdwr(int disk_id, ipcarg_t method, off_t offset, off_t size,
+    void *buf)
 {
 	int rc;
@@ -202,7 +231,7 @@
 
 		if (method == BD_READ_BLOCK)
-			rc = gxe_bd_read_block(offset, now, buf);
+			rc = gxe_bd_read_block(disk_id, offset, now, buf);
 		else
-			rc = gxe_bd_write_block(offset, now, buf);
+			rc = gxe_bd_write_block(disk_id, offset, now, buf);
 
 		if (rc != EOK)
@@ -221,5 +250,6 @@
 }
 
-static int gxe_bd_read_block(uint64_t offset, size_t size, void *buf)
+static int gxe_bd_read_block(int disk_id, uint64_t offset, size_t size,
+    void *buf)
 {
 	uint32_t status;
@@ -246,9 +276,9 @@
 }
 
-static int gxe_bd_write_block(uint64_t offset, size_t size, const void *buf)
+static int gxe_bd_write_block(int disk_id, uint64_t offset, size_t size,
+    const void *buf)
 {
 	uint32_t status;
 	size_t i;
-	uint32_t w;
 
 	for (i = 0; i < size; i++) {
