lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20170712232213.GE95735@google.com>
Date:   Wed, 12 Jul 2017 16:22:13 -0700
From:   Matthias Kaehlcke <mka@...omium.org>
To:     Josh Poimboeuf <jpoimboe@...hat.com>
Cc:     Chris J Arges <chris.j.arges@...onical.com>,
        Borislav Petkov <bp@...e.de>,
        Thomas Gleixner <tglx@...utronix.de>,
        Ingo Molnar <mingo@...hat.com>,
        "H . Peter Anvin" <hpa@...or.com>, x86@...nel.org,
        linux-kernel@...r.kernel.org,
        Douglas Anderson <dianders@...omium.org>,
        Michael Davidson <md@...gle.com>,
        Greg Hackmann <ghackmann@...gle.com>,
        Nick Desaulniers <ndesaulniers@...gle.com>,
        Stephen Hines <srhines@...gle.com>,
        Kees Cook <keescook@...omium.org>,
        Arnd Bergmann <arnd@...db.de>, Bernhard.Rosenkranzer@...aro.org
Subject: Re: [PATCH] Revert "x86/uaccess: Add stack frame output operand in
 get_user() inline asm"

El Wed, Jul 12, 2017 at 05:36:30PM -0500 Josh Poimboeuf ha dit:

> On Wed, Jul 12, 2017 at 05:35:47PM -0500, Josh Poimboeuf wrote:
> > On Wed, Jul 12, 2017 at 03:20:40PM -0700, Matthias Kaehlcke wrote:
> > > > This is admittedly an awkward way of achieving this goal, but it's the
> > > > only way I know how to do it with GCC.
> > > > 
> > > > What extra instruction does clang add?
> > > 
> > > I was looking at the get_user() call in drm_mode_setcrtc(). The code
> > > generated by clang without the patch is:
> > > 
> > >                         if (get_user(out_id, &set_connectors_ptr[i])) {
> > > ffffffff81386955:       4a 8d 04 bd 00 00 00    lea    0x0(,%r15,4),%rax
> > > ffffffff8138695c:       00 
> > > ffffffff8138695d:       49 03 06                add    (%r14),%rax
> > > ffffffff81386960:       e8 2b a5 f0 ff          callq  ffffffff81290e90 <__get_user_4>
> > > 
> > > And with the patch:
> > > 
> > >                         if (get_user(out_id, &set_connectors_ptr[i])) {
> > > ffffffff81386a56:       4a 8d 04 bd 00 00 00    lea    0x0(,%r15,4),%rax
> > > ffffffff81386a5d:       00 
> > > ffffffff81386a5e:       49 03 06                add    (%r14),%rax
> > > ffffffff81386a61:       48 8b 64 24 28          mov    0x28(%rsp),%rsp
> > > ffffffff81386a66:       e8 15 a5 f0 ff          callq
> > > ffffffff81290f80 <__get_user_4>
> > 
> > Hm, that seems odd.  Can you sure the disassembly for the whole
> > function?
> 
> Er, share :-)

Sure, please find below the disassemblies with and without the
patch. The exact extra instruction differs from the one above, the
disassembly above is from a debug session with some 'random' kernel
version (bisect), the ones below from a v4.12ish kernel. At the bottom
you also find a log of a double faults observed with the patch.

If you are interested in building the kernel with clang yourself I can
provide instructions, it is fairly painless nowadays as long as you
have a recent version of clang (a somewhat older version should also
do for this issue with some extra kernel patches).

With f05058c4d652:

ffffffff81367550 <drm_mode_setcrtc>:
 * Returns:
 * Zero on success, negative errno on failure.
 */
int drm_mode_setcrtc(struct drm_device *dev, void *data,
		     struct drm_file *file_priv)
{
ffffffff81367550:	e8 db 71 2e 00       	callq  ffffffff8164e730 <__fentry__>
ffffffff81367555:	55                   	push   %rbp
ffffffff81367556:	48 89 e5             	mov    %rsp,%rbp
ffffffff81367559:	41 57                	push   %r15
ffffffff8136755b:	41 56                	push   %r14
ffffffff8136755d:	41 55                	push   %r13
ffffffff8136755f:	41 54                	push   %r12
ffffffff81367561:	53                   	push   %rbx
ffffffff81367562:	48 81 ec c0 00 00 00 	sub    $0xc0,%rsp
ffffffff81367569:	49 89 f6             	mov    %rsi,%r14
ffffffff8136756c:	48 89 fb             	mov    %rdi,%rbx
#define DRM_SWITCH_POWER_DYNAMIC_OFF 3

static __inline__ int drm_core_check_feature(struct drm_device *dev,
					     int feature)
{
	return ((dev->driver->driver_features & feature) ? 1 : 0);
ffffffff8136756f:	48 8b 43 20          	mov    0x20(%rbx),%rax
	uint32_t __user *set_connectors_ptr;
	struct drm_modeset_acquire_ctx ctx;
	int ret;
	int i;

	if (!drm_core_check_feature(dev, DRIVER_MODESET))
ffffffff81367573:	f6 80 81 01 00 00 20 	testb  $0x20,0x181(%rax)
ffffffff8136757a:	75 09                	jne    ffffffff81367585 <drm_mode_setcrtc+0x35>
ffffffff8136757c:	6a ea                	pushq  $0xffffffffffffffea
ffffffff8136757e:	41 5c                	pop    %r12
ffffffff81367580:	e9 d5 04 00 00       	jmpq   ffffffff81367a5a <drm_mode_setcrtc+0x50a>
ffffffff81367585:	6a de                	pushq  $0xffffffffffffffde
ffffffff81367587:	41 5c                	pop    %r12

	/*
	 * Universal plane src offsets are only 16.16, prevent havoc for
	 * drivers using universal plane code internally.
	 */
	if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
ffffffff81367589:	41 81 7e 14 ff ff 00 	cmpl   $0xffff,0x14(%r14)
ffffffff81367590:	00 
ffffffff81367591:	0f 87 c3 04 00 00    	ja     ffffffff81367a5a <drm_mode_setcrtc+0x50a>
ffffffff81367597:	41 81 7e 18 ff ff 00 	cmpl   $0xffff,0x18(%r14)
ffffffff8136759e:	00 
ffffffff8136759f:	0f 87 b5 04 00 00    	ja     ffffffff81367a5a <drm_mode_setcrtc+0x50a>
		return -ERANGE;

	crtc = drm_crtc_find(dev, crtc_req->crtc_id);
ffffffff813675a5:	41 8b 76 0c          	mov    0xc(%r14),%esi
ffffffff813675a9:	48 89 df             	mov    %rbx,%rdi
ffffffff813675ac:	e8 15 fe ff ff       	callq  ffffffff813673c6 <drm_crtc_find>
ffffffff813675b1:	49 89 c5             	mov    %rax,%r13
	if (!crtc) {
ffffffff813675b4:	4d 85 ed             	test   %r13,%r13
ffffffff813675b7:	0f 84 7d 04 00 00    	je     ffffffff81367a3a <drm_mode_setcrtc+0x4ea>
ffffffff813675bd:	48 89 5d b0          	mov    %rbx,-0x50(%rbp)
		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
		return -ENOENT;
	}
	DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
ffffffff813675c1:	41 8b 4d 78          	mov    0x78(%r13),%ecx
ffffffff813675c5:	4d 8b 45 20          	mov    0x20(%r13),%r8
ffffffff813675c9:	6a 04                	pushq  $0x4
ffffffff813675cb:	5e                   	pop    %rsi
ffffffff813675cc:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff813675d3:	48 c7 c2 e8 55 9b 81 	mov    $0xffffffff819b55e8,%rdx
ffffffff813675da:	31 c0                	xor    %eax,%eax
ffffffff813675dc:	e8 45 c6 ff ff       	callq  ffffffff81363c26 <drm_printk>

	mutex_lock(&crtc->dev->mode_config.mutex);
ffffffff813675e1:	49 8b 7d 00          	mov    0x0(%r13),%rdi
ffffffff813675e5:	48 81 c7 b0 02 00 00 	add    $0x2b0,%rdi
ffffffff813675ec:	e8 b2 3c 2e 00       	callq  ffffffff8164b2a3 <mutex_lock>
ffffffff813675f1:	48 8d 9d 38 ff ff ff 	lea    -0xc8(%rbp),%rbx
	drm_modeset_acquire_init(&ctx, 0);
ffffffff813675f8:	31 f6                	xor    %esi,%esi
ffffffff813675fa:	48 89 df             	mov    %rbx,%rdi
ffffffff813675fd:	e8 ef 7d 00 00       	callq  ffffffff8136f3f1 <drm_modeset_acquire_init>
ffffffff81367602:	49 8d 46 24          	lea    0x24(%r14),%rax
ffffffff81367606:	48 89 45 a0          	mov    %rax,-0x60(%rbp)
ffffffff8136760a:	31 c0                	xor    %eax,%eax
ffffffff8136760c:	48 89 45 c0          	mov    %rax,-0x40(%rbp)
ffffffff81367610:	31 c0                	xor    %eax,%eax
ffffffff81367612:	48 89 45 d0          	mov    %rax,-0x30(%rbp)
ffffffff81367616:	31 c0                	xor    %eax,%eax
ffffffff81367618:	48 89 45 c8          	mov    %rax,-0x38(%rbp)
ffffffff8136761c:	45 31 ff             	xor    %r15d,%r15d
ffffffff8136761f:	48 89 45 a8          	mov    %rax,-0x58(%rbp)
ffffffff81367623:	4c 89 6d b8          	mov    %r13,-0x48(%rbp)
ffffffff81367627:	e9 0a 03 00 00       	jmpq   ffffffff81367936 <drm_mode_setcrtc+0x3e6>
ffffffff8136762c:	48 8d 9d 38 ff ff ff 	lea    -0xc8(%rbp),%rbx
		}
	}
	kfree(connector_set);
	drm_mode_destroy(dev, mode);
	if (ret == -EDEADLK) {
		drm_modeset_backoff(&ctx);
ffffffff81367633:	48 89 df             	mov    %rbx,%rdi
ffffffff81367636:	e8 88 7e 00 00       	callq  ffffffff8136f4c3 <drm_modeset_backoff>
ffffffff8136763b:	e9 f6 02 00 00       	jmpq   ffffffff81367936 <drm_mode_setcrtc+0x3e6>
		goto out;
	if (crtc_req->mode_valid) {
		/* If we have a mode we need a framebuffer. */
		/* If we pass -1, set the mode with the currently bound fb */
		if (crtc_req->fb_id == -1) {
			if (!crtc->primary->fb) {
ffffffff81367640:	49 8b 85 98 00 00 00 	mov    0x98(%r13),%rax
ffffffff81367647:	48 8b 98 b0 00 00 00 	mov    0xb0(%rax),%rbx
ffffffff8136764e:	48 85 db             	test   %rbx,%rbx
ffffffff81367651:	0f 84 19 01 00 00    	je     ffffffff81367770 <drm_mode_setcrtc+0x220>
 *
 * This function increments the framebuffer's reference count.
 */
static inline void drm_framebuffer_get(struct drm_framebuffer *fb)
{
	drm_mode_object_get(&fb->base);
ffffffff81367657:	48 8d 7b 18          	lea    0x18(%rbx),%rdi
ffffffff8136765b:	e8 97 de 00 00       	callq  ffffffff813754f7 <drm_mode_object_get>
ffffffff81367660:	48 89 5d d0          	mov    %rbx,-0x30(%rbp)
ffffffff81367664:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff81367668:	48 8b 5d b0          	mov    -0x50(%rbp),%rbx
				ret = -ENOENT;
				goto out;
			}
		}

		mode = drm_mode_create(dev);
ffffffff8136766c:	48 89 df             	mov    %rbx,%rdi
ffffffff8136766f:	e8 32 08 00 00       	callq  ffffffff81367ea6 <drm_mode_create>
		if (!mode) {
ffffffff81367674:	48 85 c0             	test   %rax,%rax
ffffffff81367677:	74 38                	je     ffffffff813676b1 <drm_mode_setcrtc+0x161>
ffffffff81367679:	48 89 c1             	mov    %rax,%rcx
			ret = -ENOMEM;
			goto out;
		}

		ret = drm_mode_convert_umode(mode, &crtc_req->mode);
ffffffff8136767c:	48 89 4d c0          	mov    %rcx,-0x40(%rbp)
ffffffff81367680:	48 89 c7             	mov    %rax,%rdi
ffffffff81367683:	48 8b 75 a0          	mov    -0x60(%rbp),%rsi
ffffffff81367687:	e8 3a 1b 00 00       	callq  ffffffff813691c6 <drm_mode_convert_umode>
ffffffff8136768c:	41 89 c4             	mov    %eax,%r12d
		if (ret) {
ffffffff8136768f:	45 85 e4             	test   %r12d,%r12d
ffffffff81367692:	74 2c                	je     ffffffff813676c0 <drm_mode_setcrtc+0x170>
			DRM_DEBUG_KMS("Invalid mode\n");
ffffffff81367694:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff8136769b:	48 c7 c2 1c 7b 9b 81 	mov    $0xffffffff819b7b1c,%rdx
ffffffff813676a2:	31 c0                	xor    %eax,%eax
ffffffff813676a4:	6a 04                	pushq  $0x4
ffffffff813676a6:	5e                   	pop    %rsi
ffffffff813676a7:	e8 7a c5 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff813676ac:	e9 a0 02 00 00       	jmpq   ffffffff81367951 <drm_mode_setcrtc+0x401>
ffffffff813676b1:	31 c0                	xor    %eax,%eax
ffffffff813676b3:	48 89 45 c0          	mov    %rax,-0x40(%rbp)
ffffffff813676b7:	6a f4                	pushq  $0xfffffffffffffff4
ffffffff813676b9:	41 5c                	pop    %r12
ffffffff813676bb:	e9 91 02 00 00       	jmpq   ffffffff81367951 <drm_mode_setcrtc+0x401>
		 * Drivers not implementing the universal planes API use a
		 * default formats list provided by the DRM core which doesn't
		 * match real hardware capabilities. Skip the check in that
		 * case.
		 */
		if (!crtc->primary->format_default) {
ffffffff813676c0:	49 8b bd 98 00 00 00 	mov    0x98(%r13),%rdi
ffffffff813676c7:	80 bf a4 00 00 00 00 	cmpb   $0x0,0xa4(%rdi)
ffffffff813676ce:	0f 84 cf 00 00 00    	je     ffffffff813677a3 <drm_mode_setcrtc+0x253>
				                                  &format_name));
				goto out;
			}
		}

		ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y,
ffffffff813676d4:	41 8b 76 14          	mov    0x14(%r14),%esi
ffffffff813676d8:	41 8b 56 18          	mov    0x18(%r14),%edx
ffffffff813676dc:	4c 89 ef             	mov    %r13,%rdi
ffffffff813676df:	48 8b 4d c0          	mov    -0x40(%rbp),%rcx
ffffffff813676e3:	4c 8b 45 d0          	mov    -0x30(%rbp),%r8
ffffffff813676e7:	e8 de fd ff ff       	callq  ffffffff813674ca <drm_crtc_check_viewport>
ffffffff813676ec:	41 89 c4             	mov    %eax,%r12d
					      mode, fb);
		if (ret)
ffffffff813676ef:	45 85 e4             	test   %r12d,%r12d
ffffffff813676f2:	0f 85 59 02 00 00    	jne    ffffffff81367951 <drm_mode_setcrtc+0x401>
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff813676f8:	41 8b 4e 08          	mov    0x8(%r14),%ecx
ffffffff813676fc:	48 8b 45 c0          	mov    -0x40(%rbp),%rax
ffffffff81367700:	48 85 c0             	test   %rax,%rax
ffffffff81367703:	74 1e                	je     ffffffff81367723 <drm_mode_setcrtc+0x1d3>
ffffffff81367705:	85 c9                	test   %ecx,%ecx
ffffffff81367707:	75 1a                	jne    ffffffff81367723 <drm_mode_setcrtc+0x1d3>
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
ffffffff81367709:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff81367710:	48 c7 c2 43 7b 9b 81 	mov    $0xffffffff819b7b43,%rdx
ffffffff81367717:	31 c0                	xor    %eax,%eax
ffffffff81367719:	6a 04                	pushq  $0x4
ffffffff8136771b:	5e                   	pop    %rsi
ffffffff8136771c:	e8 05 c5 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff81367721:	eb 44                	jmp    ffffffff81367767 <drm_mode_setcrtc+0x217>
		if (ret)
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff81367723:	48 85 c0             	test   %rax,%rax
ffffffff81367726:	0f 95 c0             	setne  %al
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
		ret = -EINVAL;
		goto out;
	}

	if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
ffffffff81367729:	48 83 7d d0 00       	cmpq   $0x0,-0x30(%rbp)
ffffffff8136772e:	0f 95 c2             	setne  %dl
		if (ret)
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff81367731:	85 c9                	test   %ecx,%ecx
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
		ret = -EINVAL;
		goto out;
	}

	if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
ffffffff81367733:	74 1e                	je     ffffffff81367753 <drm_mode_setcrtc+0x203>
ffffffff81367735:	20 d0                	and    %dl,%al
ffffffff81367737:	75 1a                	jne    ffffffff81367753 <drm_mode_setcrtc+0x203>
		DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n",
ffffffff81367739:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff81367740:	48 c7 c2 67 7b 9b 81 	mov    $0xffffffff819b7b67,%rdx
ffffffff81367747:	31 c0                	xor    %eax,%eax
ffffffff81367749:	6a 04                	pushq  $0x4
ffffffff8136774b:	5e                   	pop    %rsi
ffffffff8136774c:	e8 d5 c4 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff81367751:	eb 14                	jmp    ffffffff81367767 <drm_mode_setcrtc+0x217>
		if (ret)
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff81367753:	85 c9                	test   %ecx,%ecx
			  crtc_req->count_connectors);
		ret = -EINVAL;
		goto out;
	}

	if (crtc_req->count_connectors > 0) {
ffffffff81367755:	74 3e                	je     ffffffff81367795 <drm_mode_setcrtc+0x245>
		u32 out_id;

		/* Avoid unbounded kernel memory allocation */
		if (crtc_req->count_connectors > config->num_connector) {
ffffffff81367757:	48 8b 45 b0          	mov    -0x50(%rbp),%rax
ffffffff8136775b:	3b 88 10 04 00 00    	cmp    0x410(%rax),%ecx
ffffffff81367761:	0f 86 8d 00 00 00    	jbe    ffffffff813677f4 <drm_mode_setcrtc+0x2a4>
ffffffff81367767:	6a ea                	pushq  $0xffffffffffffffea
ffffffff81367769:	41 5c                	pop    %r12
ffffffff8136776b:	e9 da 01 00 00       	jmpq   ffffffff8136794a <drm_mode_setcrtc+0x3fa>
	if (crtc_req->mode_valid) {
		/* If we have a mode we need a framebuffer. */
		/* If we pass -1, set the mode with the currently bound fb */
		if (crtc_req->fb_id == -1) {
			if (!crtc->primary->fb) {
				DRM_DEBUG_KMS("CRTC doesn't have current FB\n");
ffffffff81367770:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff81367777:	48 c7 c2 ed 7a 9b 81 	mov    $0xffffffff819b7aed,%rdx
ffffffff8136777e:	31 c0                	xor    %eax,%eax
ffffffff81367780:	6a 04                	pushq  $0x4
ffffffff81367782:	5e                   	pop    %rsi
ffffffff81367783:	e8 9e c4 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff81367788:	6a ea                	pushq  $0xffffffffffffffea
ffffffff8136778a:	41 5c                	pop    %r12
ffffffff8136778c:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff81367790:	e9 b5 01 00 00       	jmpq   ffffffff8136794a <drm_mode_setcrtc+0x3fa>
ffffffff81367795:	31 d2                	xor    %edx,%edx
ffffffff81367797:	48 8d b5 38 ff ff ff 	lea    -0xc8(%rbp),%rsi
ffffffff8136779e:	e9 46 01 00 00       	jmpq   ffffffff813678e9 <drm_mode_setcrtc+0x399>
		 * match real hardware capabilities. Skip the check in that
		 * case.
		 */
		if (!crtc->primary->format_default) {
			ret = drm_plane_check_pixel_format(crtc->primary,
							   fb->format->format);
ffffffff813677a3:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff813677a7:	48 8b 40 38          	mov    0x38(%rax),%rax
ffffffff813677ab:	8b 30                	mov    (%rax),%esi
		 * default formats list provided by the DRM core which doesn't
		 * match real hardware capabilities. Skip the check in that
		 * case.
		 */
		if (!crtc->primary->format_default) {
			ret = drm_plane_check_pixel_format(crtc->primary,
ffffffff813677ad:	e8 40 f4 00 00       	callq  ffffffff81376bf2 <drm_plane_check_pixel_format>
ffffffff813677b2:	41 89 c4             	mov    %eax,%r12d
							   fb->format->format);
			if (ret) {
ffffffff813677b5:	45 85 e4             	test   %r12d,%r12d
ffffffff813677b8:	0f 84 16 ff ff ff    	je     ffffffff813676d4 <drm_mode_setcrtc+0x184>
				struct drm_format_name_buf format_name;
				DRM_DEBUG_KMS("Invalid pixel format %s\n",
ffffffff813677be:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff813677c2:	48 8b 40 38          	mov    0x38(%rax),%rax
ffffffff813677c6:	8b 38                	mov    (%rax),%edi
ffffffff813677c8:	48 8d b5 18 ff ff ff 	lea    -0xe8(%rbp),%rsi
ffffffff813677cf:	e8 c7 03 00 00       	callq  ffffffff81367b9b <drm_get_format_name>
ffffffff813677d4:	48 89 c1             	mov    %rax,%rcx
ffffffff813677d7:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff813677de:	48 c7 c2 2a 7b 9b 81 	mov    $0xffffffff819b7b2a,%rdx
ffffffff813677e5:	31 c0                	xor    %eax,%eax
ffffffff813677e7:	6a 04                	pushq  $0x4
ffffffff813677e9:	5e                   	pop    %rsi
ffffffff813677ea:	e8 37 c4 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff813677ef:	e9 5d 01 00 00       	jmpq   ffffffff81367951 <drm_mode_setcrtc+0x401>
{
	if (size != 0 && n > SIZE_MAX / size)
		return NULL;
	if (__builtin_constant_p(n) && __builtin_constant_p(size))
		return kmalloc(n * size, flags);
	return __kmalloc(n * size, flags);
ffffffff813677f4:	48 c1 e1 03          	shl    $0x3,%rcx
ffffffff813677f8:	be c0 00 40 01       	mov    $0x14000c0,%esi
ffffffff813677fd:	48 89 cf             	mov    %rcx,%rdi
ffffffff81367800:	e8 85 78 dd ff       	callq  ffffffff8113f08a <__kmalloc>
		}

		connector_set = kmalloc_array(crtc_req->count_connectors,
					      sizeof(struct drm_connector *),
					      GFP_KERNEL);
		if (!connector_set) {
ffffffff81367805:	48 85 c0             	test   %rax,%rax
ffffffff81367808:	48 8d b5 38 ff ff ff 	lea    -0xc8(%rbp),%rsi
ffffffff8136780f:	0f 84 c2 00 00 00    	je     ffffffff813678d7 <drm_mode_setcrtc+0x387>
ffffffff81367815:	31 db                	xor    %ebx,%ebx
ffffffff81367817:	48 89 c2             	mov    %rax,%rdx
ffffffff8136781a:	48 89 55 c8          	mov    %rdx,-0x38(%rbp)
ffffffff8136781e:	eb 35                	jmp    ffffffff81367855 <drm_mode_setcrtc+0x305>
				DRM_DEBUG_KMS("Connector id %d unknown\n",
						out_id);
				ret = -ENOENT;
				goto out;
			}
			DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
ffffffff81367820:	41 8b 4d 28          	mov    0x28(%r13),%ecx
ffffffff81367824:	4d 8b 45 48          	mov    0x48(%r13),%r8
ffffffff81367828:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff8136782f:	48 c7 c2 94 57 9b 81 	mov    $0xffffffff819b5794,%rdx
ffffffff81367836:	31 c0                	xor    %eax,%eax
ffffffff81367838:	6a 04                	pushq  $0x4
ffffffff8136783a:	5e                   	pop    %rsi
ffffffff8136783b:	e8 e6 c3 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff81367840:	48 8b 45 c8          	mov    -0x38(%rbp),%rax
					connector->base.id,
					connector->name);

			connector_set[i] = connector;
ffffffff81367844:	4e 89 2c f8          	mov    %r13,(%rax,%r15,8)
		if (!connector_set) {
			ret = -ENOMEM;
			goto out;
		}

		for (i = 0; i < crtc_req->count_connectors; i++) {
ffffffff81367848:	ff c3                	inc    %ebx
ffffffff8136784a:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff8136784e:	48 8d b5 38 ff ff ff 	lea    -0xc8(%rbp),%rsi
ffffffff81367855:	41 8b 56 08          	mov    0x8(%r14),%edx
ffffffff81367859:	39 d3                	cmp    %edx,%ebx
ffffffff8136785b:	0f 83 85 00 00 00    	jae    ffffffff813678e6 <drm_mode_setcrtc+0x396>
			connector_set[i] = NULL;
ffffffff81367861:	4c 63 fb             	movslq %ebx,%r15
ffffffff81367864:	4a 83 24 f8 00       	andq   $0x0,(%rax,%r15,8)
			set_connectors_ptr = (uint32_t __user *)(unsigned long)crtc_req->set_connectors_ptr;
			if (get_user(out_id, &set_connectors_ptr[i])) {
ffffffff81367869:	4a 8d 04 bd 00 00 00 	lea    0x0(,%r15,4),%rax
ffffffff81367870:	00 
ffffffff81367871:	49 03 06             	add    (%r14),%rax
ffffffff81367874:	48 8b 65 a8          	mov    -0x58(%rbp),%rsp
ffffffff81367878:	e8 73 26 f1 ff       	callq  ffffffff81279ef0 <__get_user_4>
ffffffff8136787d:	49 89 d4             	mov    %rdx,%r12
ffffffff81367880:	48 89 65 a8          	mov    %rsp,-0x58(%rbp)
ffffffff81367884:	85 c0                	test   %eax,%eax
ffffffff81367886:	0f 85 a0 00 00 00    	jne    ffffffff8136792c <drm_mode_setcrtc+0x3dc>
 */
static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev,
		uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR);
ffffffff8136788c:	ba c0 c0 c0 c0       	mov    $0xc0c0c0c0,%edx
ffffffff81367891:	48 8b 7d b0          	mov    -0x50(%rbp),%rdi
ffffffff81367895:	44 89 e6             	mov    %r12d,%esi
ffffffff81367898:	e8 f7 db 00 00       	callq  ffffffff81375494 <drm_mode_object_find>
ffffffff8136789d:	49 89 c5             	mov    %rax,%r13
	return mo ? obj_to_connector(mo) : NULL;
ffffffff813678a0:	4d 85 ed             	test   %r13,%r13
				ret = -EFAULT;
				goto out;
			}

			connector = drm_connector_lookup(dev, out_id);
			if (!connector) {
ffffffff813678a3:	74 0a                	je     ffffffff813678af <drm_mode_setcrtc+0x35f>
ffffffff813678a5:	49 83 c5 d8          	add    $0xffffffffffffffd8,%r13
ffffffff813678a9:	0f 85 71 ff ff ff    	jne    ffffffff81367820 <drm_mode_setcrtc+0x2d0>
				DRM_DEBUG_KMS("Connector id %d unknown\n",
ffffffff813678af:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff813678b6:	48 c7 c2 95 7b 9b 81 	mov    $0xffffffff819b7b95,%rdx
ffffffff813678bd:	31 c0                	xor    %eax,%eax
ffffffff813678bf:	6a 04                	pushq  $0x4
ffffffff813678c1:	5e                   	pop    %rsi
ffffffff813678c2:	44 89 e1             	mov    %r12d,%ecx
ffffffff813678c5:	e8 5c c3 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff813678ca:	6a fe                	pushq  $0xfffffffffffffffe
ffffffff813678cc:	41 5c                	pop    %r12
ffffffff813678ce:	4c 8b 7d c8          	mov    -0x38(%rbp),%r15
ffffffff813678d2:	e9 b5 fe ff ff       	jmpq   ffffffff8136778c <drm_mode_setcrtc+0x23c>
		if (crtc_req->count_connectors > config->num_connector) {
			ret = -EINVAL;
			goto out;
		}

		connector_set = kmalloc_array(crtc_req->count_connectors,
ffffffff813678d7:	49 89 c7             	mov    %rax,%r15
ffffffff813678da:	6a f4                	pushq  $0xfffffffffffffff4
ffffffff813678dc:	41 5c                	pop    %r12
ffffffff813678de:	31 c0                	xor    %eax,%eax
ffffffff813678e0:	48 89 45 c8          	mov    %rax,-0x38(%rbp)
ffffffff813678e4:	eb 64                	jmp    ffffffff8136794a <drm_mode_setcrtc+0x3fa>
ffffffff813678e6:	49 89 c7             	mov    %rax,%r15

			connector_set[i] = connector;
		}
	}

	set.crtc = crtc;
ffffffff813678e9:	4c 89 ad 78 ff ff ff 	mov    %r13,-0x88(%rbp)
	set.x = crtc_req->x;
ffffffff813678f0:	41 8b 4e 14          	mov    0x14(%r14),%ecx
ffffffff813678f4:	89 4d 88             	mov    %ecx,-0x78(%rbp)
	set.y = crtc_req->y;
ffffffff813678f7:	41 8b 4e 18          	mov    0x18(%r14),%ecx
ffffffff813678fb:	89 4d 8c             	mov    %ecx,-0x74(%rbp)
	set.mode = mode;
ffffffff813678fe:	48 8b 45 c0          	mov    -0x40(%rbp),%rax
ffffffff81367902:	48 89 45 80          	mov    %rax,-0x80(%rbp)
	set.connectors = connector_set;
ffffffff81367906:	4c 89 7d 90          	mov    %r15,-0x70(%rbp)
	set.num_connectors = crtc_req->count_connectors;
ffffffff8136790a:	89 d0                	mov    %edx,%eax
ffffffff8136790c:	48 89 45 98          	mov    %rax,-0x68(%rbp)
	set.fb = fb;
ffffffff81367910:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff81367914:	48 89 85 70 ff ff ff 	mov    %rax,-0x90(%rbp)
	ret = __drm_mode_set_config_internal(&set, &ctx);
ffffffff8136791b:	48 8d bd 70 ff ff ff 	lea    -0x90(%rbp),%rdi
ffffffff81367922:	e8 bf fa ff ff       	callq  ffffffff813673e6 <__drm_mode_set_config_internal>
ffffffff81367927:	41 89 c4             	mov    %eax,%r12d
ffffffff8136792a:	eb 1e                	jmp    ffffffff8136794a <drm_mode_setcrtc+0x3fa>
ffffffff8136792c:	6a f2                	pushq  $0xfffffffffffffff2
ffffffff8136792e:	41 5c                	pop    %r12
ffffffff81367930:	4c 8b 7d c8          	mov    -0x38(%rbp),%r15
ffffffff81367934:	eb 14                	jmp    ffffffff8136794a <drm_mode_setcrtc+0x3fa>
	DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);

	mutex_lock(&crtc->dev->mode_config.mutex);
	drm_modeset_acquire_init(&ctx, 0);
retry:
	ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx);
ffffffff81367936:	49 8b 7d 00          	mov    0x0(%r13),%rdi
ffffffff8136793a:	48 89 de             	mov    %rbx,%rsi
ffffffff8136793d:	e8 08 7b 00 00       	callq  ffffffff8136f44a <drm_modeset_lock_all_ctx>
ffffffff81367942:	41 89 c4             	mov    %eax,%r12d
	if (ret)
ffffffff81367945:	45 85 e4             	test   %r12d,%r12d
ffffffff81367948:	74 16                	je     ffffffff81367960 <drm_mode_setcrtc+0x410>
	set.num_connectors = crtc_req->count_connectors;
	set.fb = fb;
	ret = __drm_mode_set_config_internal(&set, &ctx);

out:
	if (fb)
ffffffff8136794a:	48 83 7d d0 00       	cmpq   $0x0,-0x30(%rbp)
ffffffff8136794f:	74 6b                	je     ffffffff813679bc <drm_mode_setcrtc+0x46c>
 * This function decrements the framebuffer's reference count and frees the
 * framebuffer if the reference count drops to zero.
 */
static inline void drm_framebuffer_put(struct drm_framebuffer *fb)
{
	drm_mode_object_put(&fb->base);
ffffffff81367951:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff81367955:	48 8d 78 18          	lea    0x18(%rax),%rdi
ffffffff81367959:	e8 46 db 00 00       	callq  ffffffff813754a4 <drm_mode_object_put>
ffffffff8136795e:	eb 62                	jmp    ffffffff813679c2 <drm_mode_setcrtc+0x472>
	drm_modeset_acquire_init(&ctx, 0);
retry:
	ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx);
	if (ret)
		goto out;
	if (crtc_req->mode_valid) {
ffffffff81367960:	41 83 7e 20 00       	cmpl   $0x0,0x20(%r14)
ffffffff81367965:	0f 84 8d fd ff ff    	je     ffffffff813676f8 <drm_mode_setcrtc+0x1a8>
		/* If we have a mode we need a framebuffer. */
		/* If we pass -1, set the mode with the currently bound fb */
		if (crtc_req->fb_id == -1) {
ffffffff8136796b:	41 8b 76 10          	mov    0x10(%r14),%esi
ffffffff8136796f:	83 fe ff             	cmp    $0xffffffff,%esi
ffffffff81367972:	0f 84 c8 fc ff ff    	je     ffffffff81367640 <drm_mode_setcrtc+0xf0>
ffffffff81367978:	48 8b 5d b0          	mov    -0x50(%rbp),%rbx
			}
			fb = crtc->primary->fb;
			/* Make refcounting symmetric with the lookup path. */
			drm_framebuffer_get(fb);
		} else {
			fb = drm_framebuffer_lookup(dev, crtc_req->fb_id);
ffffffff8136797c:	48 89 df             	mov    %rbx,%rdi
ffffffff8136797f:	e8 a3 b3 00 00       	callq  ffffffff81372d27 <drm_framebuffer_lookup>
ffffffff81367984:	48 89 c1             	mov    %rax,%rcx
			if (!fb) {
ffffffff81367987:	48 89 4d d0          	mov    %rcx,-0x30(%rbp)
ffffffff8136798b:	48 85 c0             	test   %rax,%rax
ffffffff8136798e:	0f 85 d8 fc ff ff    	jne    ffffffff8136766c <drm_mode_setcrtc+0x11c>
				DRM_DEBUG_KMS("Unknown FB ID%d\n",
ffffffff81367994:	41 8b 4e 10          	mov    0x10(%r14),%ecx
ffffffff81367998:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff8136799f:	48 c7 c2 0b 7b 9b 81 	mov    $0xffffffff819b7b0b,%rdx
ffffffff813679a6:	31 c0                	xor    %eax,%eax
ffffffff813679a8:	6a 04                	pushq  $0x4
ffffffff813679aa:	5e                   	pop    %rsi
ffffffff813679ab:	e8 76 c2 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff813679b0:	31 c0                	xor    %eax,%eax
ffffffff813679b2:	48 89 45 d0          	mov    %rax,-0x30(%rbp)
ffffffff813679b6:	6a fe                	pushq  $0xfffffffffffffffe
ffffffff813679b8:	41 5c                	pop    %r12
ffffffff813679ba:	eb 06                	jmp    ffffffff813679c2 <drm_mode_setcrtc+0x472>
ffffffff813679bc:	31 c0                	xor    %eax,%eax
ffffffff813679be:	48 89 45 d0          	mov    %rax,-0x30(%rbp)

out:
	if (fb)
		drm_framebuffer_put(fb);

	if (connector_set) {
ffffffff813679c2:	4d 85 ff             	test   %r15,%r15
ffffffff813679c5:	74 27                	je     ffffffff813679ee <drm_mode_setcrtc+0x49e>
ffffffff813679c7:	31 db                	xor    %ebx,%ebx
ffffffff813679c9:	eb 17                	jmp    ffffffff813679e2 <drm_mode_setcrtc+0x492>
		for (i = 0; i < crtc_req->count_connectors; i++) {
			if (connector_set[i])
ffffffff813679cb:	48 63 c3             	movslq %ebx,%rax
ffffffff813679ce:	49 8b 3c c7          	mov    (%r15,%rax,8),%rdi
ffffffff813679d2:	48 85 ff             	test   %rdi,%rdi
ffffffff813679d5:	74 09                	je     ffffffff813679e0 <drm_mode_setcrtc+0x490>
 * This function decrements the connector's reference count and frees the
 * object if the reference count drops to zero.
 */
static inline void drm_connector_put(struct drm_connector *connector)
{
	drm_mode_object_put(&connector->base);
ffffffff813679d7:	48 83 c7 28          	add    $0x28,%rdi
ffffffff813679db:	e8 c4 da 00 00       	callq  ffffffff813754a4 <drm_mode_object_put>
out:
	if (fb)
		drm_framebuffer_put(fb);

	if (connector_set) {
		for (i = 0; i < crtc_req->count_connectors; i++) {
ffffffff813679e0:	ff c3                	inc    %ebx
ffffffff813679e2:	41 3b 5e 08          	cmp    0x8(%r14),%ebx
ffffffff813679e6:	72 e3                	jb     ffffffff813679cb <drm_mode_setcrtc+0x47b>
ffffffff813679e8:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff813679ec:	eb 03                	jmp    ffffffff813679f1 <drm_mode_setcrtc+0x4a1>
ffffffff813679ee:	45 31 ff             	xor    %r15d,%r15d
			if (connector_set[i])
				drm_connector_put(connector_set[i]);
		}
	}
	kfree(connector_set);
ffffffff813679f1:	48 8b 7d c8          	mov    -0x38(%rbp),%rdi
ffffffff813679f5:	e8 55 78 dd ff       	callq  ffffffff8113f24f <kfree>
	drm_mode_destroy(dev, mode);
ffffffff813679fa:	48 8b 7d b0          	mov    -0x50(%rbp),%rdi
ffffffff813679fe:	48 8b 75 c0          	mov    -0x40(%rbp),%rsi
ffffffff81367a02:	e8 ef 04 00 00       	callq  ffffffff81367ef6 <drm_mode_destroy>
	if (ret == -EDEADLK) {
ffffffff81367a07:	41 83 fc dd          	cmp    $0xffffffdd,%r12d
ffffffff81367a0b:	0f 84 1b fc ff ff    	je     ffffffff8136762c <drm_mode_setcrtc+0xdc>
ffffffff81367a11:	4c 8d b5 38 ff ff ff 	lea    -0xc8(%rbp),%r14
		drm_modeset_backoff(&ctx);
		goto retry;
	}
	drm_modeset_drop_locks(&ctx);
ffffffff81367a18:	4c 89 f7             	mov    %r14,%rdi
ffffffff81367a1b:	e8 62 7b 00 00       	callq  ffffffff8136f582 <drm_modeset_drop_locks>
	drm_modeset_acquire_fini(&ctx);
ffffffff81367a20:	4c 89 f7             	mov    %r14,%rdi
ffffffff81367a23:	e8 ad 7a 00 00       	callq  ffffffff8136f4d5 <drm_modeset_acquire_fini>
	mutex_unlock(&crtc->dev->mode_config.mutex);
ffffffff81367a28:	49 8b 7d 00          	mov    0x0(%r13),%rdi
ffffffff81367a2c:	48 81 c7 b0 02 00 00 	add    $0x2b0,%rdi
ffffffff81367a33:	e8 b0 38 2e 00       	callq  ffffffff8164b2e8 <mutex_unlock>
ffffffff81367a38:	eb 20                	jmp    ffffffff81367a5a <drm_mode_setcrtc+0x50a>
	if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
		return -ERANGE;

	crtc = drm_crtc_find(dev, crtc_req->crtc_id);
	if (!crtc) {
		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
ffffffff81367a3a:	41 8b 4e 0c          	mov    0xc(%r14),%ecx
ffffffff81367a3e:	6a 04                	pushq  $0x4
ffffffff81367a40:	5e                   	pop    %rsi
ffffffff81367a41:	48 c7 c7 5d 82 95 81 	mov    $0xffffffff8195825d,%rdi
ffffffff81367a48:	48 c7 c2 d9 7a 9b 81 	mov    $0xffffffff819b7ad9,%rdx
ffffffff81367a4f:	31 c0                	xor    %eax,%eax
ffffffff81367a51:	e8 d0 c1 ff ff       	callq  ffffffff81363c26 <drm_printk>
ffffffff81367a56:	6a fe                	pushq  $0xfffffffffffffffe
ffffffff81367a58:	41 5c                	pop    %r12
	drm_modeset_drop_locks(&ctx);
	drm_modeset_acquire_fini(&ctx);
	mutex_unlock(&crtc->dev->mode_config.mutex);

	return ret;
}
ffffffff81367a5a:	44 89 e0             	mov    %r12d,%eax
ffffffff81367a5d:	48 81 c4 c0 00 00 00 	add    $0xc0,%rsp
ffffffff81367a64:	5b                   	pop    %rbx
ffffffff81367a65:	41 5c                	pop    %r12
ffffffff81367a67:	41 5d                	pop    %r13
ffffffff81367a69:	41 5e                	pop    %r14
ffffffff81367a6b:	41 5f                	pop    %r15
ffffffff81367a6d:	5d                   	pop    %rbp
ffffffff81367a6e:	c3                   	retq

============================================================

Without f05058c4d652:

ffffffff8136744c <drm_mode_setcrtc>:
 * Returns:
 * Zero on success, negative errno on failure.
 */
int drm_mode_setcrtc(struct drm_device *dev, void *data,
		     struct drm_file *file_priv)
{
ffffffff8136744c:	e8 1f 71 2e 00       	callq  ffffffff8164e570 <__fentry__>
ffffffff81367451:	55                   	push   %rbp
ffffffff81367452:	48 89 e5             	mov    %rsp,%rbp
ffffffff81367455:	41 57                	push   %r15
ffffffff81367457:	41 56                	push   %r14
ffffffff81367459:	41 55                	push   %r13
ffffffff8136745b:	41 54                	push   %r12
ffffffff8136745d:	53                   	push   %rbx
ffffffff8136745e:	48 81 ec b8 00 00 00 	sub    $0xb8,%rsp
ffffffff81367465:	49 89 f6             	mov    %rsi,%r14
ffffffff81367468:	48 89 fb             	mov    %rdi,%rbx
#define DRM_SWITCH_POWER_DYNAMIC_OFF 3

static __inline__ int drm_core_check_feature(struct drm_device *dev,
					     int feature)
{
	return ((dev->driver->driver_features & feature) ? 1 : 0);
ffffffff8136746b:	48 8b 43 20          	mov    0x20(%rbx),%rax
	uint32_t __user *set_connectors_ptr;
	struct drm_modeset_acquire_ctx ctx;
	int ret;
	int i;

	if (!drm_core_check_feature(dev, DRIVER_MODESET))
ffffffff8136746f:	f6 80 81 01 00 00 20 	testb  $0x20,0x181(%rax)
ffffffff81367476:	75 09                	jne    ffffffff81367481 <drm_mode_setcrtc+0x35>
ffffffff81367478:	6a ea                	pushq  $0xffffffffffffffea
ffffffff8136747a:	41 5c                	pop    %r12
ffffffff8136747c:	e9 be 04 00 00       	jmpq   ffffffff8136793f <drm_mode_setcrtc+0x4f3>
ffffffff81367481:	6a de                	pushq  $0xffffffffffffffde
ffffffff81367483:	41 5c                	pop    %r12

	/*
	 * Universal plane src offsets are only 16.16, prevent havoc for
	 * drivers using universal plane code internally.
	 */
	if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
ffffffff81367485:	41 81 7e 14 ff ff 00 	cmpl   $0xffff,0x14(%r14)
ffffffff8136748c:	00 
ffffffff8136748d:	0f 87 ac 04 00 00    	ja     ffffffff8136793f <drm_mode_setcrtc+0x4f3>
ffffffff81367493:	41 81 7e 18 ff ff 00 	cmpl   $0xffff,0x18(%r14)
ffffffff8136749a:	00 
ffffffff8136749b:	0f 87 9e 04 00 00    	ja     ffffffff8136793f <drm_mode_setcrtc+0x4f3>
		return -ERANGE;

	crtc = drm_crtc_find(dev, crtc_req->crtc_id);
ffffffff813674a1:	41 8b 76 0c          	mov    0xc(%r14),%esi
ffffffff813674a5:	48 89 df             	mov    %rbx,%rdi
ffffffff813674a8:	e8 15 fe ff ff       	callq  ffffffff813672c2 <drm_crtc_find>
ffffffff813674ad:	49 89 c5             	mov    %rax,%r13
	if (!crtc) {
ffffffff813674b0:	4d 85 ed             	test   %r13,%r13
ffffffff813674b3:	0f 84 66 04 00 00    	je     ffffffff8136791f <drm_mode_setcrtc+0x4d3>
ffffffff813674b9:	48 89 5d b0          	mov    %rbx,-0x50(%rbp)
		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
		return -ENOENT;
	}
	DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
ffffffff813674bd:	41 8b 4d 78          	mov    0x78(%r13),%ecx
ffffffff813674c1:	4d 8b 45 20          	mov    0x20(%r13),%r8
ffffffff813674c5:	6a 04                	pushq  $0x4
ffffffff813674c7:	5e                   	pop    %rsi
ffffffff813674c8:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff813674cf:	48 c7 c2 d8 55 9b 81 	mov    $0xffffffff819b55d8,%rdx
ffffffff813674d6:	31 c0                	xor    %eax,%eax
ffffffff813674d8:	e8 45 c6 ff ff       	callq  ffffffff81363b22 <drm_printk>

	mutex_lock(&crtc->dev->mode_config.mutex);
ffffffff813674dd:	49 8b 7d 00          	mov    0x0(%r13),%rdi
ffffffff813674e1:	48 81 c7 b0 02 00 00 	add    $0x2b0,%rdi
ffffffff813674e8:	e8 e6 3b 2e 00       	callq  ffffffff8164b0d3 <mutex_lock>
ffffffff813674ed:	48 8d 9d 40 ff ff ff 	lea    -0xc0(%rbp),%rbx
	drm_modeset_acquire_init(&ctx, 0);
ffffffff813674f4:	31 f6                	xor    %esi,%esi
ffffffff813674f6:	48 89 df             	mov    %rbx,%rdi
ffffffff813674f9:	e8 d8 7d 00 00       	callq  ffffffff8136f2d6 <drm_modeset_acquire_init>
ffffffff813674fe:	49 8d 46 24          	lea    0x24(%r14),%rax
ffffffff81367502:	48 89 45 a8          	mov    %rax,-0x58(%rbp)
ffffffff81367506:	31 c0                	xor    %eax,%eax
ffffffff81367508:	48 89 45 c0          	mov    %rax,-0x40(%rbp)
ffffffff8136750c:	31 c0                	xor    %eax,%eax
ffffffff8136750e:	48 89 45 d0          	mov    %rax,-0x30(%rbp)
ffffffff81367512:	31 c0                	xor    %eax,%eax
ffffffff81367514:	48 89 45 c8          	mov    %rax,-0x38(%rbp)
ffffffff81367518:	45 31 ff             	xor    %r15d,%r15d
ffffffff8136751b:	4c 89 6d b8          	mov    %r13,-0x48(%rbp)
ffffffff8136751f:	e9 f7 02 00 00       	jmpq   ffffffff8136781b <drm_mode_setcrtc+0x3cf>
ffffffff81367524:	48 8d 9d 40 ff ff ff 	lea    -0xc0(%rbp),%rbx
		}
	}
	kfree(connector_set);
	drm_mode_destroy(dev, mode);
	if (ret == -EDEADLK) {
		drm_modeset_backoff(&ctx);
ffffffff8136752b:	48 89 df             	mov    %rbx,%rdi
ffffffff8136752e:	e8 75 7e 00 00       	callq  ffffffff8136f3a8 <drm_modeset_backoff>
ffffffff81367533:	e9 e3 02 00 00       	jmpq   ffffffff8136781b <drm_mode_setcrtc+0x3cf>
		goto out;
	if (crtc_req->mode_valid) {
		/* If we have a mode we need a framebuffer. */
		/* If we pass -1, set the mode with the currently bound fb */
		if (crtc_req->fb_id == -1) {
			if (!crtc->primary->fb) {
ffffffff81367538:	49 8b 85 98 00 00 00 	mov    0x98(%r13),%rax
ffffffff8136753f:	48 8b 98 b0 00 00 00 	mov    0xb0(%rax),%rbx
ffffffff81367546:	48 85 db             	test   %rbx,%rbx
ffffffff81367549:	0f 84 19 01 00 00    	je     ffffffff81367668 <drm_mode_setcrtc+0x21c>
 *
 * This function increments the framebuffer's reference count.
 */
static inline void drm_framebuffer_get(struct drm_framebuffer *fb)
{
	drm_mode_object_get(&fb->base);
ffffffff8136754f:	48 8d 7b 18          	lea    0x18(%rbx),%rdi
ffffffff81367553:	e8 45 de 00 00       	callq  ffffffff8137539d <drm_mode_object_get>
ffffffff81367558:	48 89 5d d0          	mov    %rbx,-0x30(%rbp)
ffffffff8136755c:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff81367560:	48 8b 5d b0          	mov    -0x50(%rbp),%rbx
				ret = -ENOENT;
				goto out;
			}
		}

		mode = drm_mode_create(dev);
ffffffff81367564:	48 89 df             	mov    %rbx,%rdi
ffffffff81367567:	e8 1f 08 00 00       	callq  ffffffff81367d8b <drm_mode_create>
		if (!mode) {
ffffffff8136756c:	48 85 c0             	test   %rax,%rax
ffffffff8136756f:	74 38                	je     ffffffff813675a9 <drm_mode_setcrtc+0x15d>
ffffffff81367571:	48 89 c1             	mov    %rax,%rcx
			ret = -ENOMEM;
			goto out;
		}

		ret = drm_mode_convert_umode(mode, &crtc_req->mode);
ffffffff81367574:	48 89 4d c0          	mov    %rcx,-0x40(%rbp)
ffffffff81367578:	48 89 c7             	mov    %rax,%rdi
ffffffff8136757b:	48 8b 75 a8          	mov    -0x58(%rbp),%rsi
ffffffff8136757f:	e8 27 1b 00 00       	callq  ffffffff813690ab <drm_mode_convert_umode>
ffffffff81367584:	41 89 c4             	mov    %eax,%r12d
		if (ret) {
ffffffff81367587:	45 85 e4             	test   %r12d,%r12d
ffffffff8136758a:	74 2c                	je     ffffffff813675b8 <drm_mode_setcrtc+0x16c>
			DRM_DEBUG_KMS("Invalid mode\n");
ffffffff8136758c:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff81367593:	48 c7 c2 0c 7b 9b 81 	mov    $0xffffffff819b7b0c,%rdx
ffffffff8136759a:	31 c0                	xor    %eax,%eax
ffffffff8136759c:	6a 04                	pushq  $0x4
ffffffff8136759e:	5e                   	pop    %rsi
ffffffff8136759f:	e8 7e c5 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff813675a4:	e9 8d 02 00 00       	jmpq   ffffffff81367836 <drm_mode_setcrtc+0x3ea>
ffffffff813675a9:	31 c0                	xor    %eax,%eax
ffffffff813675ab:	48 89 45 c0          	mov    %rax,-0x40(%rbp)
ffffffff813675af:	6a f4                	pushq  $0xfffffffffffffff4
ffffffff813675b1:	41 5c                	pop    %r12
ffffffff813675b3:	e9 7e 02 00 00       	jmpq   ffffffff81367836 <drm_mode_setcrtc+0x3ea>
		 * Drivers not implementing the universal planes API use a
		 * default formats list provided by the DRM core which doesn't
		 * match real hardware capabilities. Skip the check in that
		 * case.
		 */
		if (!crtc->primary->format_default) {
ffffffff813675b8:	49 8b bd 98 00 00 00 	mov    0x98(%r13),%rdi
ffffffff813675bf:	80 bf a4 00 00 00 00 	cmpb   $0x0,0xa4(%rdi)
ffffffff813675c6:	0f 84 cf 00 00 00    	je     ffffffff8136769b <drm_mode_setcrtc+0x24f>
				                                  &format_name));
				goto out;
			}
		}

		ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y,
ffffffff813675cc:	41 8b 76 14          	mov    0x14(%r14),%esi
ffffffff813675d0:	41 8b 56 18          	mov    0x18(%r14),%edx
ffffffff813675d4:	4c 89 ef             	mov    %r13,%rdi
ffffffff813675d7:	48 8b 4d c0          	mov    -0x40(%rbp),%rcx
ffffffff813675db:	4c 8b 45 d0          	mov    -0x30(%rbp),%r8
ffffffff813675df:	e8 e2 fd ff ff       	callq  ffffffff813673c6 <drm_crtc_check_viewport>
ffffffff813675e4:	41 89 c4             	mov    %eax,%r12d
					      mode, fb);
		if (ret)
ffffffff813675e7:	45 85 e4             	test   %r12d,%r12d
ffffffff813675ea:	0f 85 46 02 00 00    	jne    ffffffff81367836 <drm_mode_setcrtc+0x3ea>
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff813675f0:	41 8b 4e 08          	mov    0x8(%r14),%ecx
ffffffff813675f4:	48 8b 45 c0          	mov    -0x40(%rbp),%rax
ffffffff813675f8:	48 85 c0             	test   %rax,%rax
ffffffff813675fb:	74 1e                	je     ffffffff8136761b <drm_mode_setcrtc+0x1cf>
ffffffff813675fd:	85 c9                	test   %ecx,%ecx
ffffffff813675ff:	75 1a                	jne    ffffffff8136761b <drm_mode_setcrtc+0x1cf>
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
ffffffff81367601:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff81367608:	48 c7 c2 33 7b 9b 81 	mov    $0xffffffff819b7b33,%rdx
ffffffff8136760f:	31 c0                	xor    %eax,%eax
ffffffff81367611:	6a 04                	pushq  $0x4
ffffffff81367613:	5e                   	pop    %rsi
ffffffff81367614:	e8 09 c5 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff81367619:	eb 44                	jmp    ffffffff8136765f <drm_mode_setcrtc+0x213>
		if (ret)
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff8136761b:	48 85 c0             	test   %rax,%rax
ffffffff8136761e:	0f 95 c0             	setne  %al
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
		ret = -EINVAL;
		goto out;
	}

	if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
ffffffff81367621:	48 83 7d d0 00       	cmpq   $0x0,-0x30(%rbp)
ffffffff81367626:	0f 95 c2             	setne  %dl
		if (ret)
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff81367629:	85 c9                	test   %ecx,%ecx
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
		ret = -EINVAL;
		goto out;
	}

	if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
ffffffff8136762b:	74 1e                	je     ffffffff8136764b <drm_mode_setcrtc+0x1ff>
ffffffff8136762d:	20 d0                	and    %dl,%al
ffffffff8136762f:	75 1a                	jne    ffffffff8136764b <drm_mode_setcrtc+0x1ff>
		DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n",
ffffffff81367631:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff81367638:	48 c7 c2 57 7b 9b 81 	mov    $0xffffffff819b7b57,%rdx
ffffffff8136763f:	31 c0                	xor    %eax,%eax
ffffffff81367641:	6a 04                	pushq  $0x4
ffffffff81367643:	5e                   	pop    %rsi
ffffffff81367644:	e8 d9 c4 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff81367649:	eb 14                	jmp    ffffffff8136765f <drm_mode_setcrtc+0x213>
		if (ret)
			goto out;

	}

	if (crtc_req->count_connectors == 0 && mode) {
ffffffff8136764b:	85 c9                	test   %ecx,%ecx
			  crtc_req->count_connectors);
		ret = -EINVAL;
		goto out;
	}

	if (crtc_req->count_connectors > 0) {
ffffffff8136764d:	74 3e                	je     ffffffff8136768d <drm_mode_setcrtc+0x241>
		u32 out_id;

		/* Avoid unbounded kernel memory allocation */
		if (crtc_req->count_connectors > config->num_connector) {
ffffffff8136764f:	48 8b 45 b0          	mov    -0x50(%rbp),%rax
ffffffff81367653:	3b 88 10 04 00 00    	cmp    0x410(%rax),%ecx
ffffffff81367659:	0f 86 8d 00 00 00    	jbe    ffffffff813676ec <drm_mode_setcrtc+0x2a0>
ffffffff8136765f:	6a ea                	pushq  $0xffffffffffffffea
ffffffff81367661:	41 5c                	pop    %r12
ffffffff81367663:	e9 c7 01 00 00       	jmpq   ffffffff8136782f <drm_mode_setcrtc+0x3e3>
	if (crtc_req->mode_valid) {
		/* If we have a mode we need a framebuffer. */
		/* If we pass -1, set the mode with the currently bound fb */
		if (crtc_req->fb_id == -1) {
			if (!crtc->primary->fb) {
				DRM_DEBUG_KMS("CRTC doesn't have current FB\n");
ffffffff81367668:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff8136766f:	48 c7 c2 dd 7a 9b 81 	mov    $0xffffffff819b7add,%rdx
ffffffff81367676:	31 c0                	xor    %eax,%eax
ffffffff81367678:	6a 04                	pushq  $0x4
ffffffff8136767a:	5e                   	pop    %rsi
ffffffff8136767b:	e8 a2 c4 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff81367680:	6a ea                	pushq  $0xffffffffffffffea
ffffffff81367682:	41 5c                	pop    %r12
ffffffff81367684:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff81367688:	e9 a2 01 00 00       	jmpq   ffffffff8136782f <drm_mode_setcrtc+0x3e3>
ffffffff8136768d:	31 d2                	xor    %edx,%edx
ffffffff8136768f:	48 8d b5 40 ff ff ff 	lea    -0xc0(%rbp),%rsi
ffffffff81367696:	e9 36 01 00 00       	jmpq   ffffffff813677d1 <drm_mode_setcrtc+0x385>
		 * match real hardware capabilities. Skip the check in that
		 * case.
		 */
		if (!crtc->primary->format_default) {
			ret = drm_plane_check_pixel_format(crtc->primary,
							   fb->format->format);
ffffffff8136769b:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff8136769f:	48 8b 40 38          	mov    0x38(%rax),%rax
ffffffff813676a3:	8b 30                	mov    (%rax),%esi
		 * default formats list provided by the DRM core which doesn't
		 * match real hardware capabilities. Skip the check in that
		 * case.
		 */
		if (!crtc->primary->format_default) {
			ret = drm_plane_check_pixel_format(crtc->primary,
ffffffff813676a5:	e8 ee f3 00 00       	callq  ffffffff81376a98 <drm_plane_check_pixel_format>
ffffffff813676aa:	41 89 c4             	mov    %eax,%r12d
							   fb->format->format);
			if (ret) {
ffffffff813676ad:	45 85 e4             	test   %r12d,%r12d
ffffffff813676b0:	0f 84 16 ff ff ff    	je     ffffffff813675cc <drm_mode_setcrtc+0x180>
				struct drm_format_name_buf format_name;
				DRM_DEBUG_KMS("Invalid pixel format %s\n",
ffffffff813676b6:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff813676ba:	48 8b 40 38          	mov    0x38(%rax),%rax
ffffffff813676be:	8b 38                	mov    (%rax),%edi
ffffffff813676c0:	48 8d b5 20 ff ff ff 	lea    -0xe0(%rbp),%rsi
ffffffff813676c7:	e8 b4 03 00 00       	callq  ffffffff81367a80 <drm_get_format_name>
ffffffff813676cc:	48 89 c1             	mov    %rax,%rcx
ffffffff813676cf:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff813676d6:	48 c7 c2 1a 7b 9b 81 	mov    $0xffffffff819b7b1a,%rdx
ffffffff813676dd:	31 c0                	xor    %eax,%eax
ffffffff813676df:	6a 04                	pushq  $0x4
ffffffff813676e1:	5e                   	pop    %rsi
ffffffff813676e2:	e8 3b c4 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff813676e7:	e9 4a 01 00 00       	jmpq   ffffffff81367836 <drm_mode_setcrtc+0x3ea>
{
	if (size != 0 && n > SIZE_MAX / size)
		return NULL;
	if (__builtin_constant_p(n) && __builtin_constant_p(size))
		return kmalloc(n * size, flags);
	return __kmalloc(n * size, flags);
ffffffff813676ec:	48 c1 e1 03          	shl    $0x3,%rcx
ffffffff813676f0:	be c0 00 40 01       	mov    $0x14000c0,%esi
ffffffff813676f5:	48 89 cf             	mov    %rcx,%rdi
ffffffff813676f8:	e8 cc 78 dd ff       	callq  ffffffff8113efc9 <__kmalloc>
		}

		connector_set = kmalloc_array(crtc_req->count_connectors,
					      sizeof(struct drm_connector *),
					      GFP_KERNEL);
		if (!connector_set) {
ffffffff813676fd:	48 85 c0             	test   %rax,%rax
ffffffff81367700:	48 8d b5 40 ff ff ff 	lea    -0xc0(%rbp),%rsi
ffffffff81367707:	0f 84 b2 00 00 00    	je     ffffffff813677bf <drm_mode_setcrtc+0x373>
ffffffff8136770d:	31 db                	xor    %ebx,%ebx
ffffffff8136770f:	48 89 c2             	mov    %rax,%rdx
ffffffff81367712:	48 89 55 c8          	mov    %rdx,-0x38(%rbp)
ffffffff81367716:	eb 35                	jmp    ffffffff8136774d <drm_mode_setcrtc+0x301>
				DRM_DEBUG_KMS("Connector id %d unknown\n",
						out_id);
				ret = -ENOENT;
				goto out;
			}
			DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
ffffffff81367718:	41 8b 4d 28          	mov    0x28(%r13),%ecx
ffffffff8136771c:	4d 8b 45 48          	mov    0x48(%r13),%r8
ffffffff81367720:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff81367727:	48 c7 c2 84 57 9b 81 	mov    $0xffffffff819b5784,%rdx
ffffffff8136772e:	31 c0                	xor    %eax,%eax
ffffffff81367730:	6a 04                	pushq  $0x4
ffffffff81367732:	5e                   	pop    %rsi
ffffffff81367733:	e8 ea c3 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff81367738:	48 8b 45 c8          	mov    -0x38(%rbp),%rax
					connector->base.id,
					connector->name);

			connector_set[i] = connector;
ffffffff8136773c:	4e 89 2c f8          	mov    %r13,(%rax,%r15,8)
		if (!connector_set) {
			ret = -ENOMEM;
			goto out;
		}

		for (i = 0; i < crtc_req->count_connectors; i++) {
ffffffff81367740:	ff c3                	inc    %ebx
ffffffff81367742:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff81367746:	48 8d b5 40 ff ff ff 	lea    -0xc0(%rbp),%rsi
ffffffff8136774d:	41 8b 56 08          	mov    0x8(%r14),%edx
ffffffff81367751:	39 d3                	cmp    %edx,%ebx
ffffffff81367753:	73 79                	jae    ffffffff813677ce <drm_mode_setcrtc+0x382>
			connector_set[i] = NULL;
ffffffff81367755:	4c 63 fb             	movslq %ebx,%r15
ffffffff81367758:	4a 83 24 f8 00       	andq   $0x0,(%rax,%r15,8)
			set_connectors_ptr = (uint32_t __user *)(unsigned long)crtc_req->set_connectors_ptr;
			if (get_user(out_id, &set_connectors_ptr[i])) {
ffffffff8136775d:	4a 8d 04 bd 00 00 00 	lea    0x0(,%r15,4),%rax
ffffffff81367764:	00 
ffffffff81367765:	49 03 06             	add    (%r14),%rax
ffffffff81367768:	e8 83 26 f1 ff       	callq  ffffffff81279df0 <__get_user_4>
ffffffff8136776d:	49 89 d4             	mov    %rdx,%r12
ffffffff81367770:	85 c0                	test   %eax,%eax
ffffffff81367772:	0f 85 99 00 00 00    	jne    ffffffff81367811 <drm_mode_setcrtc+0x3c5>
 */
static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev,
		uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR);
ffffffff81367778:	ba c0 c0 c0 c0       	mov    $0xc0c0c0c0,%edx
ffffffff8136777d:	48 8b 7d b0          	mov    -0x50(%rbp),%rdi
ffffffff81367781:	44 89 e6             	mov    %r12d,%esi
ffffffff81367784:	e8 b1 db 00 00       	callq  ffffffff8137533a <drm_mode_object_find>
ffffffff81367789:	49 89 c5             	mov    %rax,%r13
	return mo ? obj_to_connector(mo) : NULL;
ffffffff8136778c:	4d 85 ed             	test   %r13,%r13
				ret = -EFAULT;
				goto out;
			}

			connector = drm_connector_lookup(dev, out_id);
			if (!connector) {
ffffffff8136778f:	74 06                	je     ffffffff81367797 <drm_mode_setcrtc+0x34b>
ffffffff81367791:	49 83 c5 d8          	add    $0xffffffffffffffd8,%r13
ffffffff81367795:	75 81                	jne    ffffffff81367718 <drm_mode_setcrtc+0x2cc>
				DRM_DEBUG_KMS("Connector id %d unknown\n",
ffffffff81367797:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff8136779e:	48 c7 c2 85 7b 9b 81 	mov    $0xffffffff819b7b85,%rdx
ffffffff813677a5:	31 c0                	xor    %eax,%eax
ffffffff813677a7:	6a 04                	pushq  $0x4
ffffffff813677a9:	5e                   	pop    %rsi
ffffffff813677aa:	44 89 e1             	mov    %r12d,%ecx
ffffffff813677ad:	e8 70 c3 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff813677b2:	6a fe                	pushq  $0xfffffffffffffffe
ffffffff813677b4:	41 5c                	pop    %r12
ffffffff813677b6:	4c 8b 7d c8          	mov    -0x38(%rbp),%r15
ffffffff813677ba:	e9 c5 fe ff ff       	jmpq   ffffffff81367684 <drm_mode_setcrtc+0x238>
		if (crtc_req->count_connectors > config->num_connector) {
			ret = -EINVAL;
			goto out;
		}

		connector_set = kmalloc_array(crtc_req->count_connectors,
ffffffff813677bf:	49 89 c7             	mov    %rax,%r15
ffffffff813677c2:	6a f4                	pushq  $0xfffffffffffffff4
ffffffff813677c4:	41 5c                	pop    %r12
ffffffff813677c6:	31 c0                	xor    %eax,%eax
ffffffff813677c8:	48 89 45 c8          	mov    %rax,-0x38(%rbp)
ffffffff813677cc:	eb 61                	jmp    ffffffff8136782f <drm_mode_setcrtc+0x3e3>
ffffffff813677ce:	49 89 c7             	mov    %rax,%r15

			connector_set[i] = connector;
		}
	}

	set.crtc = crtc;
ffffffff813677d1:	4c 89 6d 80          	mov    %r13,-0x80(%rbp)
	set.x = crtc_req->x;
ffffffff813677d5:	41 8b 4e 14          	mov    0x14(%r14),%ecx
ffffffff813677d9:	89 4d 90             	mov    %ecx,-0x70(%rbp)
	set.y = crtc_req->y;
ffffffff813677dc:	41 8b 4e 18          	mov    0x18(%r14),%ecx
ffffffff813677e0:	89 4d 94             	mov    %ecx,-0x6c(%rbp)
	set.mode = mode;
ffffffff813677e3:	48 8b 45 c0          	mov    -0x40(%rbp),%rax
ffffffff813677e7:	48 89 45 88          	mov    %rax,-0x78(%rbp)
	set.connectors = connector_set;
ffffffff813677eb:	4c 89 7d 98          	mov    %r15,-0x68(%rbp)
	set.num_connectors = crtc_req->count_connectors;
ffffffff813677ef:	89 d0                	mov    %edx,%eax
ffffffff813677f1:	48 89 45 a0          	mov    %rax,-0x60(%rbp)
	set.fb = fb;
ffffffff813677f5:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff813677f9:	48 89 85 78 ff ff ff 	mov    %rax,-0x88(%rbp)
	ret = __drm_mode_set_config_internal(&set, &ctx);
ffffffff81367800:	48 8d bd 78 ff ff ff 	lea    -0x88(%rbp),%rdi
ffffffff81367807:	e8 d6 fa ff ff       	callq  ffffffff813672e2 <__drm_mode_set_config_internal>
ffffffff8136780c:	41 89 c4             	mov    %eax,%r12d
ffffffff8136780f:	eb 1e                	jmp    ffffffff8136782f <drm_mode_setcrtc+0x3e3>
ffffffff81367811:	6a f2                	pushq  $0xfffffffffffffff2
ffffffff81367813:	41 5c                	pop    %r12
ffffffff81367815:	4c 8b 7d c8          	mov    -0x38(%rbp),%r15
ffffffff81367819:	eb 14                	jmp    ffffffff8136782f <drm_mode_setcrtc+0x3e3>
	DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);

	mutex_lock(&crtc->dev->mode_config.mutex);
	drm_modeset_acquire_init(&ctx, 0);
retry:
	ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx);
ffffffff8136781b:	49 8b 7d 00          	mov    0x0(%r13),%rdi
ffffffff8136781f:	48 89 de             	mov    %rbx,%rsi
ffffffff81367822:	e8 08 7b 00 00       	callq  ffffffff8136f32f <drm_modeset_lock_all_ctx>
ffffffff81367827:	41 89 c4             	mov    %eax,%r12d
	if (ret)
ffffffff8136782a:	45 85 e4             	test   %r12d,%r12d
ffffffff8136782d:	74 16                	je     ffffffff81367845 <drm_mode_setcrtc+0x3f9>
	set.num_connectors = crtc_req->count_connectors;
	set.fb = fb;
	ret = __drm_mode_set_config_internal(&set, &ctx);

out:
	if (fb)
ffffffff8136782f:	48 83 7d d0 00       	cmpq   $0x0,-0x30(%rbp)
ffffffff81367834:	74 6b                	je     ffffffff813678a1 <drm_mode_setcrtc+0x455>
 * This function decrements the framebuffer's reference count and frees the
 * framebuffer if the reference count drops to zero.
 */
static inline void drm_framebuffer_put(struct drm_framebuffer *fb)
{
	drm_mode_object_put(&fb->base);
ffffffff81367836:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
ffffffff8136783a:	48 8d 78 18          	lea    0x18(%rax),%rdi
ffffffff8136783e:	e8 07 db 00 00       	callq  ffffffff8137534a <drm_mode_object_put>
ffffffff81367843:	eb 62                	jmp    ffffffff813678a7 <drm_mode_setcrtc+0x45b>
	drm_modeset_acquire_init(&ctx, 0);
retry:
	ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx);
	if (ret)
		goto out;
	if (crtc_req->mode_valid) {
ffffffff81367845:	41 83 7e 20 00       	cmpl   $0x0,0x20(%r14)
ffffffff8136784a:	0f 84 a0 fd ff ff    	je     ffffffff813675f0 <drm_mode_setcrtc+0x1a4>
		/* If we have a mode we need a framebuffer. */
		/* If we pass -1, set the mode with the currently bound fb */
		if (crtc_req->fb_id == -1) {
ffffffff81367850:	41 8b 76 10          	mov    0x10(%r14),%esi
ffffffff81367854:	83 fe ff             	cmp    $0xffffffff,%esi
ffffffff81367857:	0f 84 db fc ff ff    	je     ffffffff81367538 <drm_mode_setcrtc+0xec>
ffffffff8136785d:	48 8b 5d b0          	mov    -0x50(%rbp),%rbx
			}
			fb = crtc->primary->fb;
			/* Make refcounting symmetric with the lookup path. */
			drm_framebuffer_get(fb);
		} else {
			fb = drm_framebuffer_lookup(dev, crtc_req->fb_id);
ffffffff81367861:	48 89 df             	mov    %rbx,%rdi
ffffffff81367864:	e8 64 b3 00 00       	callq  ffffffff81372bcd <drm_framebuffer_lookup>
ffffffff81367869:	48 89 c1             	mov    %rax,%rcx
			if (!fb) {
ffffffff8136786c:	48 89 4d d0          	mov    %rcx,-0x30(%rbp)
ffffffff81367870:	48 85 c0             	test   %rax,%rax
ffffffff81367873:	0f 85 eb fc ff ff    	jne    ffffffff81367564 <drm_mode_setcrtc+0x118>
				DRM_DEBUG_KMS("Unknown FB ID%d\n",
ffffffff81367879:	41 8b 4e 10          	mov    0x10(%r14),%ecx
ffffffff8136787d:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff81367884:	48 c7 c2 fb 7a 9b 81 	mov    $0xffffffff819b7afb,%rdx
ffffffff8136788b:	31 c0                	xor    %eax,%eax
ffffffff8136788d:	6a 04                	pushq  $0x4
ffffffff8136788f:	5e                   	pop    %rsi
ffffffff81367890:	e8 8d c2 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff81367895:	31 c0                	xor    %eax,%eax
ffffffff81367897:	48 89 45 d0          	mov    %rax,-0x30(%rbp)
ffffffff8136789b:	6a fe                	pushq  $0xfffffffffffffffe
ffffffff8136789d:	41 5c                	pop    %r12
ffffffff8136789f:	eb 06                	jmp    ffffffff813678a7 <drm_mode_setcrtc+0x45b>
ffffffff813678a1:	31 c0                	xor    %eax,%eax
ffffffff813678a3:	48 89 45 d0          	mov    %rax,-0x30(%rbp)

out:
	if (fb)
		drm_framebuffer_put(fb);

	if (connector_set) {
ffffffff813678a7:	4d 85 ff             	test   %r15,%r15
ffffffff813678aa:	74 27                	je     ffffffff813678d3 <drm_mode_setcrtc+0x487>
ffffffff813678ac:	31 db                	xor    %ebx,%ebx
ffffffff813678ae:	eb 17                	jmp    ffffffff813678c7 <drm_mode_setcrtc+0x47b>
		for (i = 0; i < crtc_req->count_connectors; i++) {
			if (connector_set[i])
ffffffff813678b0:	48 63 c3             	movslq %ebx,%rax
ffffffff813678b3:	49 8b 3c c7          	mov    (%r15,%rax,8),%rdi
ffffffff813678b7:	48 85 ff             	test   %rdi,%rdi
ffffffff813678ba:	74 09                	je     ffffffff813678c5 <drm_mode_setcrtc+0x479>
 * This function decrements the connector's reference count and frees the
 * object if the reference count drops to zero.
 */
static inline void drm_connector_put(struct drm_connector *connector)
{
	drm_mode_object_put(&connector->base);
ffffffff813678bc:	48 83 c7 28          	add    $0x28,%rdi
ffffffff813678c0:	e8 85 da 00 00       	callq  ffffffff8137534a <drm_mode_object_put>
out:
	if (fb)
		drm_framebuffer_put(fb);

	if (connector_set) {
		for (i = 0; i < crtc_req->count_connectors; i++) {
ffffffff813678c5:	ff c3                	inc    %ebx
ffffffff813678c7:	41 3b 5e 08          	cmp    0x8(%r14),%ebx
ffffffff813678cb:	72 e3                	jb     ffffffff813678b0 <drm_mode_setcrtc+0x464>
ffffffff813678cd:	4c 8b 6d b8          	mov    -0x48(%rbp),%r13
ffffffff813678d1:	eb 03                	jmp    ffffffff813678d6 <drm_mode_setcrtc+0x48a>
ffffffff813678d3:	45 31 ff             	xor    %r15d,%r15d
			if (connector_set[i])
				drm_connector_put(connector_set[i]);
		}
	}
	kfree(connector_set);
ffffffff813678d6:	48 8b 7d c8          	mov    -0x38(%rbp),%rdi
ffffffff813678da:	e8 af 78 dd ff       	callq  ffffffff8113f18e <kfree>
	drm_mode_destroy(dev, mode);
ffffffff813678df:	48 8b 7d b0          	mov    -0x50(%rbp),%rdi
ffffffff813678e3:	48 8b 75 c0          	mov    -0x40(%rbp),%rsi
ffffffff813678e7:	e8 ef 04 00 00       	callq  ffffffff81367ddb <drm_mode_destroy>
	if (ret == -EDEADLK) {
ffffffff813678ec:	41 83 fc dd          	cmp    $0xffffffdd,%r12d
ffffffff813678f0:	0f 84 2e fc ff ff    	je     ffffffff81367524 <drm_mode_setcrtc+0xd8>
ffffffff813678f6:	4c 8d b5 40 ff ff ff 	lea    -0xc0(%rbp),%r14
		drm_modeset_backoff(&ctx);
		goto retry;
	}
	drm_modeset_drop_locks(&ctx);
ffffffff813678fd:	4c 89 f7             	mov    %r14,%rdi
ffffffff81367900:	e8 62 7b 00 00       	callq  ffffffff8136f467 <drm_modeset_drop_locks>
	drm_modeset_acquire_fini(&ctx);
ffffffff81367905:	4c 89 f7             	mov    %r14,%rdi
ffffffff81367908:	e8 ad 7a 00 00       	callq  ffffffff8136f3ba <drm_modeset_acquire_fini>
	mutex_unlock(&crtc->dev->mode_config.mutex);
ffffffff8136790d:	49 8b 7d 00          	mov    0x0(%r13),%rdi
ffffffff81367911:	48 81 c7 b0 02 00 00 	add    $0x2b0,%rdi
ffffffff81367918:	e8 fb 37 2e 00       	callq  ffffffff8164b118 <mutex_unlock>
ffffffff8136791d:	eb 20                	jmp    ffffffff8136793f <drm_mode_setcrtc+0x4f3>
	if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
		return -ERANGE;

	crtc = drm_crtc_find(dev, crtc_req->crtc_id);
	if (!crtc) {
		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
ffffffff8136791f:	41 8b 4e 0c          	mov    0xc(%r14),%ecx
ffffffff81367923:	6a 04                	pushq  $0x4
ffffffff81367925:	5e                   	pop    %rsi
ffffffff81367926:	48 c7 c7 4d 82 95 81 	mov    $0xffffffff8195824d,%rdi
ffffffff8136792d:	48 c7 c2 c9 7a 9b 81 	mov    $0xffffffff819b7ac9,%rdx
ffffffff81367934:	31 c0                	xor    %eax,%eax
ffffffff81367936:	e8 e7 c1 ff ff       	callq  ffffffff81363b22 <drm_printk>
ffffffff8136793b:	6a fe                	pushq  $0xfffffffffffffffe
ffffffff8136793d:	41 5c                	pop    %r12
	drm_modeset_drop_locks(&ctx);
	drm_modeset_acquire_fini(&ctx);
	mutex_unlock(&crtc->dev->mode_config.mutex);

	return ret;
}
ffffffff8136793f:	44 89 e0             	mov    %r12d,%eax
ffffffff81367942:	48 81 c4 b8 00 00 00 	add    $0xb8,%rsp
ffffffff81367949:	5b                   	pop    %rbx
ffffffff8136794a:	41 5c                	pop    %r12
ffffffff8136794c:	41 5d                	pop    %r13
ffffffff8136794e:	41 5e                	pop    %r14
ffffffff81367950:	41 5f                	pop    %r15
ffffffff81367952:	5d                   	pop    %rbp
ffffffff81367953:	c3                   	retq

============================================================

Double fault with f05058c4d652:

[    3.798722] PANIC: double fault, error_code: 0x0
[    3.807387] CPU: 1 PID: 605 Comm: frecon Not tainted 4.12.0-00023-g711d82c128ff #107
[    3.816040] Hardware name: GOOGLE Squawks, BIOS Google_Squawks.5216.152.76 03/04/2016
[    3.824792] task: ffff880075b92f00 task.stack: ffffc90000d6c000
[    3.829599] EXT4-fs (mmcblk0p1): re-mounted. Opts: commit=600,data=ordered
[    3.839092] RIP: 0010:drm_mode_setcrtc+0x328/0x51f
[    3.844443] RSP: 0018:0000000000000000 EFLAGS: 00010206
[    3.850280] RAX: 0000559e707c4d60 RBX: 0000000000000000 RCX: 0000000000000008
[    3.858253] RDX: 0000000000000001 RSI: ffffc90000d6fcc8 RDI: ffffffff81367805
[    3.866225] RBP: ffffc90000d6fd90 R08: 00000000014000c0 R09: 0000000000000308
[    3.874199] R10: 0000000000000300 R11: 0000000000000556 R12: 0000000000000000
[    3.882163] R13: ffff880077a25000 R14: ffffc90000d6fdd0 R15: 0000000000000000
[    3.890136] FS:  00007fb2dbd62740(0000) GS:ffff88007ad00000(0000) knlGS:0000000000000000
[    3.899177] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    3.905595] CR2: fffffffffffffff8 CR3: 000000007596b000 CR4: 00000000001006e0
[    3.913568] Call Trace:
[    3.916296] Code: b8 48 8d b5 38 ff ff ff 41 8b 56 08 39 d3 0f 83 85 00 00 00 4c 63 fb 4a 83 24 f8 00 4a 8d 04 bd 00 00 00 00 49 03 06 48 8b 65 a8 <e8> 73 26 f1 ff 49 89 d4 48 89 65 a8 85 c0 0f 85 a0 00 00 00 ba 
[    3.937440] Kernel panic - not syncing: Machine halted.
[    3.943268] CPU: 1 PID: 605 Comm: frecon Not tainted 4.12.0-00023-g711d82c128ff #107
[    3.951921] Hardware name: GOOGLE Squawks, BIOS Google_Squawks.5216.152.76 03/04/2016
[    3.960671] Call Trace:
[    3.963398]  <#DF>
[    3.965637]  __dump_stack+0x19/0x1b
[    3.969531]  dump_stack+0x42/0x60
[    3.969541] PANIC: double fault, error_code: 0x0
[    3.969545] CPU: 0 PID: 719 Comm: rsyslogd Not tainted 4.12.0-00023-g711d82c128ff #107
[    3.969546] Hardware name: GOOGLE Squawks, BIOS Google_Squawks.5216.152.76 03/04/2016
[    3.969548] task: ffff880075210000 task.stack: ffffc90000554000
[    3.969554] RIP: 0010:SyS_setgroups+0x6b/0xd4
[    3.969556] RSP: 0018:ffffffff8106360d EFLAGS: 00010297
[    3.969558] RAX: 0000558afd6664e0 RBX: 0000000000000000 RCX: 0000000000000001
[    3.969559] RDX: 000000000000000c RSI: 0000000000000000 RDI: ffffffff8106360d
[    3.969560] RBP: ffffc90000557f48 R08: ffffffffffffffea R09: ffffc90000557e50
[    3.969562] R10: 00007fb4acc1d0d0 R11: ffff880075210000 R12: 0000558afd6664e0
[    3.969563] R13: 00007fb4acdf9780 R14: fffffffffffffff2 R15: ffff880076d13f50
[    3.969565] FS:  00007fb4acdf9780(0000) GS:ffff88007ac00000(0000) knlGS:0000000000000000
[    3.969566] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    3.969568] CR2: ffffffff810635f8 CR3: 00000000751fb000 CR4: 00000000001006f0
[    3.969569] Call Trace:
[    3.969571] Code: 5d c3 89 df e8 9c fd ff ff 49 89 c7 4d 85 ff 74 5b 41 8b 4f 04 31 f6 6a f2 41 5e 6a ea 41 58 eb 22 48 63 de 49 8d 04 9c 48 89 fc <e8> 7c 66 21 00 85 c0 75 41 83 fa ff 74 39 48 89 e7 41 89 54 9f 
[    4.100376]  panic+0xf0/0x23e
[    4.103688]  df_debug+0x31/0x31
[    4.107193]  do_double_fault+0xd8/0xfb
[    4.111379]  double_fault+0x22/0x30
[    4.115274] RIP: 0010:drm_mode_setcrtc+0x328/0x51f
[    4.120624] RSP: 0018:0000000000000000 EFLAGS: 00010206
[    4.126451] RAX: 0000559e707c4d60 RBX: 0000000000000000 RCX: 0000000000000008
[    4.134424] RDX: 0000000000000001 RSI: ffffc90000d6fcc8 RDI: ffffffff81367805
[    4.142397] RBP: ffffc90000d6fd90 R08: 00000000014000c0 R09: 0000000000000308
[    4.150369] R10: 0000000000000300 R11: 0000000000000556 R12: 0000000000000000
[    4.158341] R13: ffff880077a25000 R14: ffffc90000d6fdd0 R15: 0000000000000000
[    4.166316]  ? drm_mode_setcrtc+0x2b5/0x51f
[    4.170988] WARNING: kernel stack regs at ffff88007ad05f58 in frecon:605 has bad 'bp' value ffffc90000d6fd90
[    4.170990] unwind stack type:0 next_sp:          (null) mask:0x10 graph_idx:0
[    4.170993] ffff88007ad05d40: ffff88007ad05e20 (0xffff88007ad05e20)
[    4.170995] ffff88007ad05d48: ffffffff810184b0 (show_trace_log_lvl+0x163/0x23a)
[    4.170996] ffff88007ad05d50: 0000000000000000 ...
[    4.170998] ffff88007ad05d58: ffff88007ad05000 (0xffff88007ad05000)
[    4.170999] ffff88007ad05d60: ffff88007ad06000 (0xffff88007ad06000)
[    4.171000] ffff88007ad05d68: 0000000000000000 ...
[    4.171001] ffff88007ad05d70: 0000000000000010 (0x10)
[    4.171003] ffff88007ad05d78: ffff880075b92f00 (0xffff880075b92f00)
[    4.171004] ffff88007ad05d80: 0000010100000000 (0x10100000000)
[    4.171005] ffff88007ad05d88: 0000000000000000 ...
[    4.171006] ffff88007ad05d90: ffff88007ad05d40 (0xffff88007ad05d40)
[    4.171008] ffff88007ad05d98: ffff88007ad05f58 (0xffff88007ad05f58)
[    4.171010] ffff88007ad05da0: ffffffff81367878 (drm_mode_setcrtc+0x328/0x51f)
[    4.171011] ffff88007ad05da8: 0000000000000004 (0x4)
[    4.171013] ffff88007ad05db0: ffff88007ad05000 (0xffff88007ad05000)
[    4.171014] ffff88007ad05db8: ffff88007ad06000 (0xffff88007ad06000)
[    4.171015] ffff88007ad05dc0: 0000000000000000 ...
[    4.171016] ffff88007ad05dc8: 0000000000000010 (0x10)
[    4.171018] ffff88007ad05dd0: ffff88007ad05f58 (0xffff88007ad05f58)
[    4.171019] ffff88007ad05dd8: ffff880075b92f00 (0xffff880075b92f00)
[    4.171020] ffff88007ad05de0: ffffffff8195ba29 (0xffffffff8195ba29)
[    4.171022] ffff88007ad05de8: 0000000081e70fc0 (0x81e70fc0)
[    4.171023] ffff88007ad05df0: ffffffff8195b9f9 (0xffffffff8195b9f9)
[    4.171024] ffff88007ad05df8: 0000000000000086 (0x86)
[    4.171025] ffff88007ad05e00: 0000000000000000 ...
[    4.171027] ffff88007ad05e08: ffff880077a25000 (0xffff880077a25000)
[    4.171028] ffff88007ad05e10: ffff88007ad05f00 (0xffff88007ad05f00)
[    4.171029] ffff88007ad05e18: ffff880075b92f00 (0xffff880075b92f00)
[    4.171031] ffff88007ad05e20: ffff88007ad05e30 (0xffff88007ad05e30)
[    4.171033] ffff88007ad05e28: ffffffff81018647 (show_stack+0x45/0x47)
[    4.171034] ffff88007ad05e30: ffff88007ad05e40 (0xffff88007ad05e40)
[    4.171038] ffff88007ad05e38: ffffffff8126f18f (__dump_stack+0x19/0x1b)
[    4.171039] ffff88007ad05e40: ffff88007ad05e70 (0xffff88007ad05e70)
[    4.171042] ffff88007ad05e48: ffffffff8126f158 (dump_stack+0x42/0x60)
[    4.171043] ffff88007ad05e50: 0000000000000086 (0x86)
[    4.171044] ffff88007ad05e58: 0000000000000000 ...
[    4.171045] ffff88007ad05e60: 0000000200000000 (0x200000000)
[    4.171046] ffff88007ad05e68: ffffffff819641ff (0xffffffff819641ff)
[    4.171048] ffff88007ad05e70: ffff88007ad05f08 (0xffff88007ad05f08)
[    4.171050] ffff88007ad05e78: ffffffff81047bea (panic+0xf0/0x23e)
[    4.171051] ffff88007ad05e80: ffff88007ad05e90 (0xffff88007ad05e90)
[    4.171052] ffff88007ad05e88: 000000007596b000 (0x7596b000)
[    4.171054] ffff88007ad05e90: 00000000001006e0 (0x1006e0)
[    4.171055] ffff88007ad05e98: 0000000000000002 (0x2)
[    4.171056] ffff88007ad05ea0: 0000000000000000 ...
[    4.171057] ffff88007ad05ea8: ffffffff81c42180 (0xffffffff81c42180)
[    4.171058] ffff88007ad05eb0: 0000000200000000 (0x200000000)
[    4.171060] ffff88007ad05eb8: 00000000ffff0a30 (0xffff0a30)
[    4.171061] ffff88007ad05ec0: 0000003000000008 (0x3000000008)
[    4.171062] ffff88007ad05ec8: ffff88007ad05f18 (0xffff88007ad05f18)
[    4.171064] ffff88007ad05ed0: ffff88007ad05e90 (0xffff88007ad05e90)
[    4.171065] ffff88007ad05ed8: ba00000000000024 (0xba00000000000024)
[    4.171066] ffff88007ad05ee0: ffff88007ad05f58 (0xffff88007ad05f58)
[    4.171067] ffff88007ad05ee8: 0000000000000000 ...
[    4.171069] ffff88007ad05ef0: ffff880077a25000 (0xffff880077a25000)
[    4.171070] ffff88007ad05ef8: ffff88007ad05f58 (0xffff88007ad05f58)
[    4.171071] ffff88007ad05f00: ffff880075b92f00 (0xffff880075b92f00)
[    4.171073] ffff88007ad05f08: ffff88007ad05f20 (0xffff88007ad05f20)
[    4.171075] ffff88007ad05f10: ffffffff81037185 (df_debug+0x31/0x31)
[    4.171075] ffff88007ad05f18: 0000000000000000 ...
[    4.171077] ffff88007ad05f20: ffff88007ad05f48 (0xffff88007ad05f48)
[    4.171079] ffff88007ad05f28: ffffffff81016626 (do_double_fault+0xd8/0xfb)
[    4.171080] ffff88007ad05f30: 0000000000000001 (0x1)
[    4.171082] ffff88007ad05f38: ffffc90000d6fdd0 (0xffffc90000d6fdd0)
[    4.171082] ffff88007ad05f40: 0000000000000000 ...
[    4.171084] ffff88007ad05f48: ffff88007ad05f59 (0xffff88007ad05f59)
[    4.171086] ffff88007ad05f50: ffffffff8164df72 (double_fault+0x22/0x30)
[    4.171087] ffff88007ad05f58: 0000000000000000 ...
[    4.171088] ffff88007ad05f60: ffffc90000d6fdd0 (0xffffc90000d6fdd0)
[    4.171090] ffff88007ad05f68: ffff880077a25000 (0xffff880077a25000)
[    4.171091] ffff88007ad05f70: 0000000000000000 ...
[    4.171092] ffff88007ad05f78: ffffc90000d6fd90 (0xffffc90000d6fd90)
[    4.171093] ffff88007ad05f80: 0000000000000000 ...
[    4.171094] ffff88007ad05f88: 0000000000000556 (0x556)
[    4.171095] ffff88007ad05f90: 0000000000000300 (0x300)
[    4.171096] ffff88007ad05f98: 0000000000000308 (0x308)
[    4.171098] ffff88007ad05fa0: 00000000014000c0 (0x14000c0)
[    4.171099] ffff88007ad05fa8: 0000559e707c4d60 (0x559e707c4d60)
[    4.171100] ffff88007ad05fb0: 0000000000000008 (0x8)
[    4.171101] ffff88007ad05fb8: 0000000000000001 (0x1)
[    4.171103] ffff88007ad05fc0: ffffc90000d6fcc8 (0xffffc90000d6fcc8)
[    4.171105] ffff88007ad05fc8: ffffffff81367805 (drm_mode_setcrtc+0x2b5/0x51f)
[    4.171107] ffff88007ad05fd0: ffffffffffffffff (0xffffffffffffffff)
[    4.171109] ffff88007ad05fd8: ffffffff81367878 (drm_mode_setcrtc+0x328/0x51f)
[    4.171110] ffff88007ad05fe0: 0000000000000010 (0x10)
[    4.171111] ffff88007ad05fe8: 0000000000010206 (0x10206)
[    4.171112] ffff88007ad05ff0: 0000000000000000 ...
[    4.171114] ffff88007ad05ff8: 0000000000000018 (0x18)
[    4.171115]  </#DF>
[    5.819749] Shutting down cpus with NMI
[    5.824035] Kernel Offset: disabled
[    5.827930] ACPI MEMORY or I/O RESET_REG.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ