So it turns out to be a bit easier than I thought:
<?php
if ($post->post_parent) {
$ancestors=get_post_ancestors($post->ID);
$root=count($ancestors)-1;
$parent = $ancestors[$root];
} else {
$parent = $post->ID;
}
?>
<?php $args = array(
'depth' => 0,
'date_format' => get_option('date_format'),
'child_of' => $parent,
'title_li' => __(''),
'sort_column' => 'menu_order, post_title'
); ?>
<ul>
<?php wp_list_pages( $args ); ?>
</ul>