#define spufs_cntl_mmap NULL
 #endif /* !SPUFS_MMAP_4K */
 
-static int spufs_cntl_open(struct inode *inode, struct file *file)
+static u64 spufs_cntl_get(void *data)
 {
-       struct spufs_inode_info *i = SPUFS_I(inode);
-       struct spu_context *ctx = i->i_ctx;
+       struct spu_context *ctx = data;
+       u64 val;
 
-       file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
-       ctx->cntl = inode->i_mapping;
-       return 0;
+       spu_acquire(ctx);
+       val = ctx->ops->status_read(ctx);
+       spu_release(ctx);
+
+       return val;
 }
 
-static ssize_t
-spufs_cntl_read(struct file *file, char __user *buffer,
-               size_t size, loff_t *pos)
+static void spufs_cntl_set(void *data, u64 val)
 {
-       /* FIXME: read from spu status */
-       return -EINVAL;
+       struct spu_context *ctx = data;
+
+       spu_acquire(ctx);
+       ctx->ops->runcntl_write(ctx, val);
+       spu_release(ctx);
 }
 
-static ssize_t
-spufs_cntl_write(struct file *file, const char __user *buffer,
-                size_t size, loff_t *pos)
+static int spufs_cntl_open(struct inode *inode, struct file *file)
 {
-       /* FIXME: write to runctl bit */
-       return -EINVAL;
+       struct spufs_inode_info *i = SPUFS_I(inode);
+       struct spu_context *ctx = i->i_ctx;
+
+       file->private_data = ctx;
+       file->f_mapping = inode->i_mapping;
+       ctx->cntl = inode->i_mapping;
+       return simple_attr_open(inode, file, spufs_cntl_get,
+                                       spufs_cntl_set, "0x%08lx");
 }
 
 static struct file_operations spufs_cntl_fops = {
        .open = spufs_cntl_open,
-       .read = spufs_cntl_read,
-       .write = spufs_cntl_write,
+       .read = simple_attr_read,
+       .write = simple_attr_write,
        .mmap = spufs_cntl_mmap,
 };