Index: uspace/lib/block/libblock.c
===================================================================
--- uspace/lib/block/libblock.c	(revision 86ffa27f45682aa2a5736f665f400ad262ce5baf)
+++ uspace/lib/block/libblock.c	(revision 4046b2f4166ca5db3b550a1346cc8476a4ab39c9)
@@ -93,4 +93,5 @@
 static int get_block_size(async_sess_t *, size_t *);
 static int get_num_blocks(async_sess_t *, aoff64_t *);
+static int read_toc(async_sess_t *, uint8_t);
 static aoff64_t ba_ltop(devcon_t *, aoff64_t);
 
@@ -891,4 +892,30 @@
 }
 
+/** Get TOC from device.
+ *
+ * @param service_id Service ID of the block device.
+ * @param session    Starting session.
+ * @param data       Buffer to read TOC into.
+ *
+ * @return EOK on success.
+ * @return Error code on failure.
+ *
+ */
+int block_get_toc(service_id_t service_id, uint8_t session, void *data)
+{
+	devcon_t *devcon = devcon_search(service_id);
+	assert(devcon);
+	
+	fibril_mutex_lock(&devcon->comm_area_lock);
+	
+	int rc = read_toc(devcon->sess, session);
+	if (rc == EOK)
+		memcpy(buf, devcon->comm_area, devcon->pblock_size);
+	
+	fibril_mutex_unlock(&devcon->comm_area_lock);
+	
+	return rc;
+}
+
 /** Read blocks from block device.
  *
@@ -981,4 +1008,14 @@
 }
 
+/** Get TOC from block device. */
+static int read_toc(async_sess_t *sess, uint8_t session)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+	int rc = async_req_1_0(exch, BD_READ_TOC, session);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
 /** Convert logical block address to physical block address. */
 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba)
Index: uspace/lib/block/libblock.h
===================================================================
--- uspace/lib/block/libblock.h	(revision 86ffa27f45682aa2a5736f665f400ad262ce5baf)
+++ uspace/lib/block/libblock.h	(revision 4046b2f4166ca5db3b550a1346cc8476a4ab39c9)
@@ -114,4 +114,5 @@
 extern int block_get_bsize(service_id_t, size_t *);
 extern int block_get_nblocks(service_id_t, aoff64_t *);
+extern int block_get_toc(service_id_t, uint8_t, void *);
 extern int block_read_direct(service_id_t, aoff64_t, size_t, void *);
 extern int block_read_bytes_direct(service_id_t, aoff64_t, size_t, void *);
