GNU Linux-libre 5.4.274-gnu1
[releases.git] / arch / x86 / boot / compressed / head_64.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  linux/boot/head.S
4  *
5  *  Copyright (C) 1991, 1992, 1993  Linus Torvalds
6  */
7
8 /*
9  *  head.S contains the 32-bit startup code.
10  *
11  * NOTE!!! Startup happens at absolute address 0x00001000, which is also where
12  * the page directory will exist. The startup code will be overwritten by
13  * the page directory. [According to comments etc elsewhere on a compressed
14  * kernel it will end up at 0x1000 + 1Mb I hope so as I assume this. - AC]
15  *
16  * Page 0 is deliberately kept safe, since System Management Mode code in 
17  * laptops may need to access the BIOS data stored there.  This is also
18  * useful for future device drivers that either access the BIOS via VM86 
19  * mode.
20  */
21
22 /*
23  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
24  */
25         .code32
26         .text
27
28 #include <linux/init.h>
29 #include <linux/linkage.h>
30 #include <asm/segment.h>
31 #include <asm/boot.h>
32 #include <asm/msr.h>
33 #include <asm/processor-flags.h>
34 #include <asm/asm-offsets.h>
35 #include <asm/bootparam.h>
36 #include "pgtable.h"
37
38 /*
39  * Locally defined symbols should be marked hidden:
40  */
41         .hidden _bss
42         .hidden _ebss
43         .hidden _got
44         .hidden _egot
45         .hidden _end
46
47         __HEAD
48         .code32
49 ENTRY(startup_32)
50         /*
51          * 32bit entry is 0 and it is ABI so immutable!
52          * If we come here directly from a bootloader,
53          * kernel(text+data+bss+brk) ramdisk, zero_page, command line
54          * all need to be under the 4G limit.
55          */
56         cld
57         /*
58          * Test KEEP_SEGMENTS flag to see if the bootloader is asking
59          * us to not reload segments
60          */
61         testb $KEEP_SEGMENTS, BP_loadflags(%esi)
62         jnz 1f
63
64         cli
65         movl    $(__BOOT_DS), %eax
66         movl    %eax, %ds
67         movl    %eax, %es
68         movl    %eax, %ss
69 1:
70
71 /*
72  * Calculate the delta between where we were compiled to run
73  * at and where we were actually loaded at.  This can only be done
74  * with a short local call on x86.  Nothing  else will tell us what
75  * address we are running at.  The reserved chunk of the real-mode
76  * data at 0x1e4 (defined as a scratch field) are used as the stack
77  * for this calculation. Only 4 bytes are needed.
78  */
79         leal    (BP_scratch+4)(%esi), %esp
80         call    1f
81 1:      popl    %ebp
82         subl    $1b, %ebp
83
84 /* setup a stack and make sure cpu supports long mode. */
85         movl    $boot_stack_end, %eax
86         addl    %ebp, %eax
87         movl    %eax, %esp
88
89         call    verify_cpu
90         testl   %eax, %eax
91         jnz     .Lno_longmode
92
93 /*
94  * Compute the delta between where we were compiled to run at
95  * and where the code will actually run at.
96  *
97  * %ebp contains the address we are loaded at by the boot loader and %ebx
98  * contains the address where we should move the kernel image temporarily
99  * for safe in-place decompression.
100  */
101
102 #ifdef CONFIG_RELOCATABLE
103         movl    %ebp, %ebx
104         movl    BP_kernel_alignment(%esi), %eax
105         decl    %eax
106         addl    %eax, %ebx
107         notl    %eax
108         andl    %eax, %ebx
109         cmpl    $LOAD_PHYSICAL_ADDR, %ebx
110         jae     1f
111 #endif
112         movl    $LOAD_PHYSICAL_ADDR, %ebx
113 1:
114
115         /* Target address to relocate to for decompression */
116         movl    BP_init_size(%esi), %eax
117         subl    $_end, %eax
118         addl    %eax, %ebx
119
120 /*
121  * Prepare for entering 64 bit mode
122  */
123
124         /* Load new GDT with the 64bit segments using 32bit descriptor */
125         addl    %ebp, gdt+2(%ebp)
126         lgdt    gdt(%ebp)
127
128         /* Enable PAE mode */
129         movl    %cr4, %eax
130         orl     $X86_CR4_PAE, %eax
131         movl    %eax, %cr4
132
133  /*
134   * Build early 4G boot pagetable
135   */
136         /*
137          * If SEV is active then set the encryption mask in the page tables.
138          * This will insure that when the kernel is copied and decompressed
139          * it will be done so encrypted.
140          */
141         call    get_sev_encryption_bit
142         xorl    %edx, %edx
143         testl   %eax, %eax
144         jz      1f
145         subl    $32, %eax       /* Encryption bit is always above bit 31 */
146         bts     %eax, %edx      /* Set encryption mask for page tables */
147 1:
148
149         /* Initialize Page tables to 0 */
150         leal    pgtable(%ebx), %edi
151         xorl    %eax, %eax
152         movl    $(BOOT_INIT_PGT_SIZE/4), %ecx
153         rep     stosl
154
155         /* Build Level 4 */
156         leal    pgtable + 0(%ebx), %edi
157         leal    0x1007 (%edi), %eax
158         movl    %eax, 0(%edi)
159         addl    %edx, 4(%edi)
160
161         /* Build Level 3 */
162         leal    pgtable + 0x1000(%ebx), %edi
163         leal    0x1007(%edi), %eax
164         movl    $4, %ecx
165 1:      movl    %eax, 0x00(%edi)
166         addl    %edx, 0x04(%edi)
167         addl    $0x00001000, %eax
168         addl    $8, %edi
169         decl    %ecx
170         jnz     1b
171
172         /* Build Level 2 */
173         leal    pgtable + 0x2000(%ebx), %edi
174         movl    $0x00000183, %eax
175         movl    $2048, %ecx
176 1:      movl    %eax, 0(%edi)
177         addl    %edx, 4(%edi)
178         addl    $0x00200000, %eax
179         addl    $8, %edi
180         decl    %ecx
181         jnz     1b
182
183         /* Enable the boot page tables */
184         leal    pgtable(%ebx), %eax
185         movl    %eax, %cr3
186
187         /* Enable Long mode in EFER (Extended Feature Enable Register) */
188         movl    $MSR_EFER, %ecx
189         rdmsr
190         btsl    $_EFER_LME, %eax
191         wrmsr
192
193         /* After gdt is loaded */
194         xorl    %eax, %eax
195         lldt    %ax
196         movl    $__BOOT_TSS, %eax
197         ltr     %ax
198
199         /*
200          * Setup for the jump to 64bit mode
201          *
202          * When the jump is performend we will be in long mode but
203          * in 32bit compatibility mode with EFER.LME = 1, CS.L = 0, CS.D = 1
204          * (and in turn EFER.LMA = 1).  To jump into 64bit mode we use
205          * the new gdt/idt that has __KERNEL_CS with CS.L = 1.
206          * We place all of the values on our mini stack so lret can
207          * used to perform that far jump.
208          */
209         pushl   $__KERNEL_CS
210         leal    startup_64(%ebp), %eax
211 #ifdef CONFIG_EFI_MIXED
212         movl    efi32_config(%ebp), %ebx
213         cmp     $0, %ebx
214         jz      1f
215         leal    handover_entry(%ebp), %eax
216 1:
217 #endif
218         pushl   %eax
219
220         /* Enter paged protected Mode, activating Long Mode */
221         movl    $(X86_CR0_PG | X86_CR0_PE), %eax /* Enable Paging and Protected mode */
222         movl    %eax, %cr0
223
224         /* Jump from 32bit compatibility mode into 64bit mode. */
225         lret
226 ENDPROC(startup_32)
227
228 #ifdef CONFIG_EFI_MIXED
229         .org 0x190
230 ENTRY(efi32_stub_entry)
231         add     $0x4, %esp              /* Discard return address */
232         popl    %ecx
233         popl    %edx
234         popl    %esi
235
236         leal    (BP_scratch+4)(%esi), %esp
237         call    1f
238 1:      pop     %ebp
239         subl    $1b, %ebp
240
241         movl    %ecx, efi32_config(%ebp)
242         movl    %edx, efi32_config+8(%ebp)
243         sgdtl   efi32_boot_gdt(%ebp)
244
245         leal    efi32_config(%ebp), %eax
246         movl    %eax, efi_config(%ebp)
247
248         /* Disable paging */
249         movl    %cr0, %eax
250         btrl    $X86_CR0_PG_BIT, %eax
251         movl    %eax, %cr0
252
253         jmp     startup_32
254 ENDPROC(efi32_stub_entry)
255 #endif
256
257         .code64
258         .org 0x200
259 ENTRY(startup_64)
260         /*
261          * 64bit entry is 0x200 and it is ABI so immutable!
262          * We come here either from startup_32 or directly from a
263          * 64bit bootloader.
264          * If we come here from a bootloader, kernel(text+data+bss+brk),
265          * ramdisk, zero_page, command line could be above 4G.
266          * We depend on an identity mapped page table being provided
267          * that maps our entire kernel(text+data+bss+brk), zero page
268          * and command line.
269          */
270
271         /* Setup data segments. */
272         xorl    %eax, %eax
273         movl    %eax, %ds
274         movl    %eax, %es
275         movl    %eax, %ss
276         movl    %eax, %fs
277         movl    %eax, %gs
278
279         /*
280          * Compute the decompressed kernel start address.  It is where
281          * we were loaded at aligned to a 2M boundary. %rbp contains the
282          * decompressed kernel start address.
283          *
284          * If it is a relocatable kernel then decompress and run the kernel
285          * from load address aligned to 2MB addr, otherwise decompress and
286          * run the kernel from LOAD_PHYSICAL_ADDR
287          *
288          * We cannot rely on the calculation done in 32-bit mode, since we
289          * may have been invoked via the 64-bit entry point.
290          */
291
292         /* Start with the delta to where the kernel will run at. */
293 #ifdef CONFIG_RELOCATABLE
294         leaq    startup_32(%rip) /* - $startup_32 */, %rbp
295         movl    BP_kernel_alignment(%rsi), %eax
296         decl    %eax
297         addq    %rax, %rbp
298         notq    %rax
299         andq    %rax, %rbp
300         cmpq    $LOAD_PHYSICAL_ADDR, %rbp
301         jae     1f
302 #endif
303         movq    $LOAD_PHYSICAL_ADDR, %rbp
304 1:
305
306         /* Target address to relocate to for decompression */
307         movl    BP_init_size(%rsi), %ebx
308         subl    $_end, %ebx
309         addq    %rbp, %rbx
310
311         /* Set up the stack */
312         leaq    boot_stack_end(%rbx), %rsp
313
314         /*
315          * paging_prepare() and cleanup_trampoline() below can have GOT
316          * references. Adjust the table with address we are running at.
317          *
318          * Zero RAX for adjust_got: the GOT was not adjusted before;
319          * there's no adjustment to undo.
320          */
321         xorq    %rax, %rax
322
323         /*
324          * Calculate the address the binary is loaded at and use it as
325          * a GOT adjustment.
326          */
327         call    1f
328 1:      popq    %rdi
329         subq    $1b, %rdi
330
331         call    .Ladjust_got
332
333         /*
334          * At this point we are in long mode with 4-level paging enabled,
335          * but we might want to enable 5-level paging or vice versa.
336          *
337          * The problem is that we cannot do it directly. Setting or clearing
338          * CR4.LA57 in long mode would trigger #GP. So we need to switch off
339          * long mode and paging first.
340          *
341          * We also need a trampoline in lower memory to switch over from
342          * 4- to 5-level paging for cases when the bootloader puts the kernel
343          * above 4G, but didn't enable 5-level paging for us.
344          *
345          * The same trampoline can be used to switch from 5- to 4-level paging
346          * mode, like when starting 4-level paging kernel via kexec() when
347          * original kernel worked in 5-level paging mode.
348          *
349          * For the trampoline, we need the top page table to reside in lower
350          * memory as we don't have a way to load 64-bit values into CR3 in
351          * 32-bit mode.
352          *
353          * We go though the trampoline even if we don't have to: if we're
354          * already in a desired paging mode. This way the trampoline code gets
355          * tested on every boot.
356          */
357
358         /* Make sure we have GDT with 32-bit code segment */
359         leaq    gdt(%rip), %rax
360         movq    %rax, gdt64+2(%rip)
361         lgdt    gdt64(%rip)
362
363         /*
364          * paging_prepare() sets up the trampoline and checks if we need to
365          * enable 5-level paging.
366          *
367          * paging_prepare() returns a two-quadword structure which lands
368          * into RDX:RAX:
369          *   - Address of the trampoline is returned in RAX.
370          *   - Non zero RDX means trampoline needs to enable 5-level
371          *     paging.
372          *
373          * RSI holds real mode data and needs to be preserved across
374          * this function call.
375          */
376         pushq   %rsi
377         movq    %rsi, %rdi              /* real mode address */
378         call    paging_prepare
379         popq    %rsi
380
381         /* Save the trampoline address in RCX */
382         movq    %rax, %rcx
383
384         /* Set up 32-bit addressable stack */
385         leaq    TRAMPOLINE_32BIT_STACK_END(%rcx), %rsp
386
387         /*
388          * Preserve live 64-bit registers on the stack: this is necessary
389          * because the architecture does not guarantee that GPRs will retain
390          * their full 64-bit values across a 32-bit mode switch.
391          */
392         pushq   %rbp
393         pushq   %rbx
394         pushq   %rsi
395
396         /*
397          * Push the 64-bit address of trampoline_return() onto the new stack.
398          * It will be used by the trampoline to return to the main code. Due to
399          * the 32-bit mode switch, it cannot be kept it in a register either.
400          */
401         leaq    trampoline_return(%rip), %rdi
402         pushq   %rdi
403
404         /* Switch to compatibility mode (CS.L = 0 CS.D = 1) via far return */
405         pushq   $__KERNEL32_CS
406         leaq    TRAMPOLINE_32BIT_CODE_OFFSET(%rax), %rax
407         pushq   %rax
408         lretq
409 trampoline_return:
410         /* Restore live 64-bit registers */
411         popq    %rsi
412         popq    %rbx
413         popq    %rbp
414
415         /* Restore the stack, the 32-bit trampoline uses its own stack */
416         leaq    boot_stack_end(%rbx), %rsp
417
418         /*
419          * cleanup_trampoline() would restore trampoline memory.
420          *
421          * RDI is address of the page table to use instead of page table
422          * in trampoline memory (if required).
423          *
424          * RSI holds real mode data and needs to be preserved across
425          * this function call.
426          */
427         pushq   %rsi
428         leaq    top_pgtable(%rbx), %rdi
429         call    cleanup_trampoline
430         popq    %rsi
431
432         /* Zero EFLAGS */
433         pushq   $0
434         popfq
435
436         /*
437          * Previously we've adjusted the GOT with address the binary was
438          * loaded at. Now we need to re-adjust for relocation address.
439          *
440          * Calculate the address the binary is loaded at, so that we can
441          * undo the previous GOT adjustment.
442          */
443         call    1f
444 1:      popq    %rax
445         subq    $1b, %rax
446
447         /* The new adjustment is the relocation address */
448         movq    %rbx, %rdi
449         call    .Ladjust_got
450
451 /*
452  * Copy the compressed kernel to the end of our buffer
453  * where decompression in place becomes safe.
454  */
455         pushq   %rsi
456         leaq    (_bss-8)(%rip), %rsi
457         leaq    (_bss-8)(%rbx), %rdi
458         movq    $_bss /* - $startup_32 */, %rcx
459         shrq    $3, %rcx
460         std
461         rep     movsq
462         cld
463         popq    %rsi
464
465 /*
466  * Jump to the relocated address.
467  */
468         leaq    .Lrelocated(%rbx), %rax
469         jmp     *%rax
470
471 #ifdef CONFIG_EFI_STUB
472
473 /* The entry point for the PE/COFF executable is efi_pe_entry. */
474 ENTRY(efi_pe_entry)
475         movq    %rcx, efi64_config(%rip)        /* Handle */
476         movq    %rdx, efi64_config+8(%rip) /* EFI System table pointer */
477
478         leaq    efi64_config(%rip), %rax
479         movq    %rax, efi_config(%rip)
480
481         call    1f
482 1:      popq    %rbp
483         subq    $1b, %rbp
484
485         /*
486          * Relocate efi_config->call().
487          */
488         addq    %rbp, efi64_config+40(%rip)
489
490         movq    %rax, %rdi
491         call    make_boot_params
492         cmpq    $0,%rax
493         je      fail
494         mov     %rax, %rsi
495         leaq    startup_32(%rip), %rax
496         movl    %eax, BP_code32_start(%rsi)
497         jmp     2f              /* Skip the relocation */
498
499 handover_entry:
500         call    1f
501 1:      popq    %rbp
502         subq    $1b, %rbp
503
504         /*
505          * Relocate efi_config->call().
506          */
507         movq    efi_config(%rip), %rax
508         addq    %rbp, 40(%rax)
509 2:
510         movq    efi_config(%rip), %rdi
511         call    efi_main
512         movq    %rax,%rsi
513         cmpq    $0,%rax
514         jne     2f
515 fail:
516         /* EFI init failed, so hang. */
517         hlt
518         jmp     fail
519 2:
520         movl    BP_code32_start(%esi), %eax
521         leaq    startup_64(%rax), %rax
522         jmp     *%rax
523 ENDPROC(efi_pe_entry)
524
525         .org 0x390
526 ENTRY(efi64_stub_entry)
527         movq    %rdi, efi64_config(%rip)        /* Handle */
528         movq    %rsi, efi64_config+8(%rip) /* EFI System table pointer */
529
530         leaq    efi64_config(%rip), %rax
531         movq    %rax, efi_config(%rip)
532
533         movq    %rdx, %rsi
534         jmp     handover_entry
535 ENDPROC(efi64_stub_entry)
536 #endif
537
538         .text
539 SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
540
541 /*
542  * Clear BSS (stack is currently empty)
543  */
544         xorl    %eax, %eax
545         leaq    _bss(%rip), %rdi
546         leaq    _ebss(%rip), %rcx
547         subq    %rdi, %rcx
548         shrq    $3, %rcx
549         rep     stosq
550
551 /*
552  * Do the extraction, and jump to the new kernel..
553  */
554         pushq   %rsi                    /* Save the real mode argument */
555         movq    %rsi, %rdi              /* real mode address */
556         leaq    boot_heap(%rip), %rsi   /* malloc area for uncompression */
557         leaq    input_data(%rip), %rdx  /* input_data */
558         movl    $z_input_len, %ecx      /* input_len */
559         movq    %rbp, %r8               /* output target address */
560         movq    $z_output_len, %r9      /* decompressed length, end of relocs */
561         call    extract_kernel          /* returns kernel location in %rax */
562         popq    %rsi
563
564 /*
565  * Jump to the decompressed kernel.
566  */
567         jmp     *%rax
568 SYM_FUNC_END(.Lrelocated)
569
570 /*
571  * Adjust the global offset table
572  *
573  * RAX is the previous adjustment of the table to undo (use 0 if it's the
574  * first time we touch GOT).
575  * RDI is the new adjustment to apply.
576  */
577 .Ladjust_got:
578         /* Walk through the GOT adding the address to the entries */
579         leaq    _got(%rip), %rdx
580         leaq    _egot(%rip), %rcx
581 1:
582         cmpq    %rcx, %rdx
583         jae     2f
584         subq    %rax, (%rdx)    /* Undo previous adjustment */
585         addq    %rdi, (%rdx)    /* Apply the new adjustment */
586         addq    $8, %rdx
587         jmp     1b
588 2:
589         ret
590
591         .code32
592 /*
593  * This is the 32-bit trampoline that will be copied over to low memory.
594  *
595  * Return address is at the top of the stack (might be above 4G).
596  * ECX contains the base address of the trampoline memory.
597  * Non zero RDX means trampoline needs to enable 5-level paging.
598  */
599 ENTRY(trampoline_32bit_src)
600         /* Set up data and stack segments */
601         movl    $__KERNEL_DS, %eax
602         movl    %eax, %ds
603         movl    %eax, %ss
604
605         /* Disable paging */
606         movl    %cr0, %eax
607         btrl    $X86_CR0_PG_BIT, %eax
608         movl    %eax, %cr0
609
610         /* Check what paging mode we want to be in after the trampoline */
611         cmpl    $0, %edx
612         jz      1f
613
614         /* We want 5-level paging: don't touch CR3 if it already points to 5-level page tables */
615         movl    %cr4, %eax
616         testl   $X86_CR4_LA57, %eax
617         jnz     3f
618         jmp     2f
619 1:
620         /* We want 4-level paging: don't touch CR3 if it already points to 4-level page tables */
621         movl    %cr4, %eax
622         testl   $X86_CR4_LA57, %eax
623         jz      3f
624 2:
625         /* Point CR3 to the trampoline's new top level page table */
626         leal    TRAMPOLINE_32BIT_PGTABLE_OFFSET(%ecx), %eax
627         movl    %eax, %cr3
628 3:
629         /* Set EFER.LME=1 as a precaution in case hypervsior pulls the rug */
630         pushl   %ecx
631         pushl   %edx
632         movl    $MSR_EFER, %ecx
633         rdmsr
634         btsl    $_EFER_LME, %eax
635         wrmsr
636         popl    %edx
637         popl    %ecx
638
639         /* Enable PAE and LA57 (if required) paging modes */
640         movl    $X86_CR4_PAE, %eax
641         cmpl    $0, %edx
642         jz      1f
643         orl     $X86_CR4_LA57, %eax
644 1:
645         movl    %eax, %cr4
646
647         /* Calculate address of paging_enabled() once we are executing in the trampoline */
648         leal    .Lpaging_enabled - trampoline_32bit_src + TRAMPOLINE_32BIT_CODE_OFFSET(%ecx), %eax
649
650         /* Prepare the stack for far return to Long Mode */
651         pushl   $__KERNEL_CS
652         pushl   %eax
653
654         /* Enable paging again */
655         movl    $(X86_CR0_PG | X86_CR0_PE), %eax
656         movl    %eax, %cr0
657
658         lret
659
660         .code64
661 SYM_FUNC_START_LOCAL_NOALIGN(.Lpaging_enabled)
662         /* Return from the trampoline */
663         retq
664 SYM_FUNC_END(.Lpaging_enabled)
665
666         /*
667          * The trampoline code has a size limit.
668          * Make sure we fail to compile if the trampoline code grows
669          * beyond TRAMPOLINE_32BIT_CODE_SIZE bytes.
670          */
671         .org    trampoline_32bit_src + TRAMPOLINE_32BIT_CODE_SIZE
672
673         .code32
674 SYM_FUNC_START_LOCAL_NOALIGN(.Lno_longmode)
675         /* This isn't an x86-64 CPU, so hang intentionally, we cannot continue */
676 1:
677         hlt
678         jmp     1b
679 SYM_FUNC_END(.Lno_longmode)
680
681 #include "../../kernel/verify_cpu.S"
682
683         .data
684 gdt64:
685         .word   gdt_end - gdt
686         .quad   0
687         .balign 8
688 gdt:
689         .word   gdt_end - gdt
690         .long   gdt
691         .word   0
692         .quad   0x00cf9a000000ffff      /* __KERNEL32_CS */
693         .quad   0x00af9a000000ffff      /* __KERNEL_CS */
694         .quad   0x00cf92000000ffff      /* __KERNEL_DS */
695         .quad   0x0080890000000000      /* TS descriptor */
696         .quad   0x0000000000000000      /* TS continued */
697 gdt_end:
698
699 #ifdef CONFIG_EFI_STUB
700 efi_config:
701         .quad   0
702
703 #ifdef CONFIG_EFI_MIXED
704         .global efi32_config
705 efi32_config:
706         .fill   5,8,0
707         .quad   efi64_thunk
708         .byte   0
709 #endif
710
711         .global efi64_config
712 efi64_config:
713         .fill   5,8,0
714         .quad   efi_call
715         .byte   1
716 #endif /* CONFIG_EFI_STUB */
717
718 /*
719  * Stack and heap for uncompression
720  */
721         .bss
722         .balign 4
723 boot_heap:
724         .fill BOOT_HEAP_SIZE, 1, 0
725 boot_stack:
726         .fill BOOT_STACK_SIZE, 1, 0
727 boot_stack_end:
728
729 /*
730  * Space for page tables (not in .bss so not zeroed)
731  */
732         .section ".pgtable","a",@nobits
733         .balign 4096
734 pgtable:
735         .fill BOOT_PGT_SIZE, 1, 0
736
737 /*
738  * The page table is going to be used instead of page table in the trampoline
739  * memory.
740  */
741 top_pgtable:
742         .fill PAGE_SIZE, 1, 0