Home | History | Annotate | Download | only in servicemanager
      1 /* Copyright 2008 The Android Open Source Project
      2  */
      3 
      4 #include <inttypes.h>
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 #include <errno.h>
      8 #include <unistd.h>
      9 #include <fcntl.h>
     10 #include <sys/mman.h>
     11 
     12 #include "binder.h"
     13 
     14 #define MAX_BIO_SIZE (1 << 30)
     15 
     16 #define TRACE 0
     17 
     18 #define LOG_TAG "Binder"
     19 #include <cutils/log.h>
     20 
     21 void bio_init_from_txn(struct binder_io *io, struct binder_transaction_data *txn);
     22 
     23 #if TRACE
     24 void hexdump(void *_data, size_t len)
     25 {
     26     unsigned char *data = _data;
     27     size_t count;
     28 
     29     for (count = 0; count < len; count++) {
     30         if ((count & 15) == 0)
     31             fprintf(stderr,"%04zu:", count);
     32         fprintf(stderr," %02x %c", *data,
     33                 (*data < 32) || (*data > 126) ? '.' : *data);
     34         data++;
     35         if ((count & 15) == 15)
     36             fprintf(stderr,"\n");
     37     }
     38     if ((count & 15) != 0)
     39         fprintf(stderr,"\n");
     40 }
     41 
     42 void binder_dump_txn(struct binder_transaction_data *txn)
     43 {
     44     struct flat_binder_object *obj;
     45     binder_size_t *offs = (binder_size_t *)(uintptr_t)txn->data.ptr.offsets;
     46     size_t count = txn->offsets_size / sizeof(binder_size_t);
     47 
     48     fprintf(stderr,"  target %016"PRIx64"  cookie %016"PRIx64"  code %08x  flags %08x\n",
     49             (uint64_t)txn->target.ptr, (uint64_t)txn->cookie, txn->code, txn->flags);
     50     fprintf(stderr,"  pid %8d  uid %8d  data %"PRIu64"  offs %"PRIu64"\n",
     51             txn->sender_pid, txn->sender_euid, (uint64_t)txn->data_size, (uint64_t)txn->offsets_size);
     52     hexdump((void *)(uintptr_t)txn->data.ptr.buffer, txn->data_size);
     53     while (count--) {
     54         obj = (struct flat_binder_object *) (((char*)(uintptr_t)txn->data.ptr.buffer) + *offs++);
     55         fprintf(stderr,"  - type %08x  flags %08x  ptr %016"PRIx64"  cookie %016"PRIx64"\n",
     56                 obj->type, obj->flags, (uint64_t)obj->binder, (uint64_t)obj->cookie);
     57     }
     58 }
     59 
     60 #define NAME(n) case n: return #n
     61 const char *cmd_name(uint32_t cmd)
     62 {
     63     switch(cmd) {
     64         NAME(BR_NOOP);
     65         NAME(BR_TRANSACTION_COMPLETE);
     66         NAME(BR_INCREFS);
     67         NAME(BR_ACQUIRE);
     68         NAME(BR_RELEASE);
     69         NAME(BR_DECREFS);
     70         NAME(BR_TRANSACTION);
     71         NAME(BR_REPLY);
     72         NAME(BR_FAILED_REPLY);
     73         NAME(BR_DEAD_REPLY);
     74         NAME(BR_DEAD_BINDER);
     75     default: return "???";
     76     }
     77 }
     78 #else
     79 #define hexdump(a,b) do{} while (0)
     80 #define binder_dump_txn(txn)  do{} while (0)
     81 #endif
     82 
     83 #define BIO_F_SHARED    0x01  /* needs to be buffer freed */
     84 #define BIO_F_OVERFLOW  0x02  /* ran out of space */
     85 #define BIO_F_IOERROR   0x04
     86 #define BIO_F_MALLOCED  0x08  /* needs to be free()'d */
     87 
     88 struct binder_state
     89 {
     90     int fd;
     91     void *mapped;
     92     size_t mapsize;
     93 };
     94 
     95 struct binder_state *binder_open(size_t mapsize)
     96 {
     97     struct binder_state *bs;
     98     struct binder_version vers;
     99 
    100     bs = malloc(sizeof(*bs));
    101     if (!bs) {
    102         errno = ENOMEM;
    103         return NULL;
    104     }
    105 
    106     bs->fd = open("/dev/binder", O_RDWR);
    107     if (bs->fd < 0) {
    108         fprintf(stderr,"binder: cannot open device (%s)\n",
    109                 strerror(errno));
    110         goto fail_open;
    111     }
    112 
    113     if ((ioctl(bs->fd, BINDER_VERSION, &vers) == -1) ||
    114         (vers.protocol_version != BINDER_CURRENT_PROTOCOL_VERSION)) {
    115         fprintf(stderr, "binder: driver version differs from user space\n");
    116         goto fail_open;
    117     }
    118 
    119     bs->mapsize = mapsize;
    120     bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
    121     if (bs->mapped == MAP_FAILED) {
    122         fprintf(stderr,"binder: cannot map device (%s)\n",
    123                 strerror(errno));
    124         goto fail_map;
    125     }
    126 
    127     return bs;
    128 
    129 fail_map:
    130     close(bs->fd);
    131 fail_open:
    132     free(bs);
    133     return NULL;
    134 }
    135 
    136 void binder_close(struct binder_state *bs)
    137 {
    138     munmap(bs->mapped, bs->mapsize);
    139     close(bs->fd);
    140     free(bs);
    141 }
    142 
    143 int binder_become_context_manager(struct binder_state *bs)
    144 {
    145     return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
    146 }
    147 
    148 int binder_write(struct binder_state *bs, void *data, size_t len)
    149 {
    150     struct binder_write_read bwr;
    151     int res;
    152 
    153     bwr.write_size = len;
    154     bwr.write_consumed = 0;
    155     bwr.write_buffer = (uintptr_t) data;
    156     bwr.read_size = 0;
    157     bwr.read_consumed = 0;
    158     bwr.read_buffer = 0;
    159     res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
    160     if (res < 0) {
    161         fprintf(stderr,"binder_write: ioctl failed (%s)\n",
    162                 strerror(errno));
    163     }
    164     return res;
    165 }
    166 
    167 void binder_send_reply(struct binder_state *bs,
    168                        struct binder_io *reply,
    169                        binder_uintptr_t buffer_to_free,
    170                        int status)
    171 {
    172     struct {
    173         uint32_t cmd_free;
    174         binder_uintptr_t buffer;
    175         uint32_t cmd_reply;
    176         struct binder_transaction_data txn;
    177     } __attribute__((packed)) data;
    178 
    179     data.cmd_free = BC_FREE_BUFFER;
    180     data.buffer = buffer_to_free;
    181     data.cmd_reply = BC_REPLY;
    182     data.txn.target.ptr = 0;
    183     data.txn.cookie = 0;
    184     data.txn.code = 0;
    185     if (status) {
    186         data.txn.flags = TF_STATUS_CODE;
    187         data.txn.data_size = sizeof(int);
    188         data.txn.offsets_size = 0;
    189         data.txn.data.ptr.buffer = (uintptr_t)&status;
    190         data.txn.data.ptr.offsets = 0;
    191     } else {
    192         data.txn.flags = 0;
    193         data.txn.data_size = reply->data - reply->data0;
    194         data.txn.offsets_size = ((char*) reply->offs) - ((char*) reply->offs0);
    195         data.txn.data.ptr.buffer = (uintptr_t)reply->data0;
    196         data.txn.data.ptr.offsets = (uintptr_t)reply->offs0;
    197     }
    198     binder_write(bs, &data, sizeof(data));
    199 }
    200 
    201 int binder_parse(struct binder_state *bs, struct binder_io *bio,
    202                  uintptr_t ptr, size_t size, binder_handler func)
    203 {
    204     int r = 1;
    205     uintptr_t end = ptr + (uintptr_t) size;
    206 
    207     while (ptr < end) {
    208         uint32_t cmd = *(uint32_t *) ptr;
    209         ptr += sizeof(uint32_t);
    210 #if TRACE
    211         fprintf(stderr,"%s:\n", cmd_name(cmd));
    212 #endif
    213         switch(cmd) {
    214         case BR_NOOP:
    215             break;
    216         case BR_TRANSACTION_COMPLETE:
    217             break;
    218         case BR_INCREFS:
    219         case BR_ACQUIRE:
    220         case BR_RELEASE:
    221         case BR_DECREFS:
    222 #if TRACE
    223             fprintf(stderr,"  %p, %p\n", (void *)ptr, (void *)(ptr + sizeof(void *)));
    224 #endif
    225             ptr += sizeof(struct binder_ptr_cookie);
    226             break;
    227         case BR_TRANSACTION: {
    228             struct binder_transaction_data *txn = (struct binder_transaction_data *) ptr;
    229             if ((end - ptr) < sizeof(*txn)) {
    230                 ALOGE("parse: txn too small!\n");
    231                 return -1;
    232             }
    233             binder_dump_txn(txn);
    234             if (func) {
    235                 unsigned rdata[256/4];
    236                 struct binder_io msg;
    237                 struct binder_io reply;
    238                 int res;
    239 
    240                 bio_init(&reply, rdata, sizeof(rdata), 4);
    241                 bio_init_from_txn(&msg, txn);
    242                 res = func(bs, txn, &msg, &reply);
    243                 binder_send_reply(bs, &reply, txn->data.ptr.buffer, res);
    244             }
    245             ptr += sizeof(*txn);
    246             break;
    247         }
    248         case BR_REPLY: {
    249             struct binder_transaction_data *txn = (struct binder_transaction_data *) ptr;
    250             if ((end - ptr) < sizeof(*txn)) {
    251                 ALOGE("parse: reply too small!\n");
    252                 return -1;
    253             }
    254             binder_dump_txn(txn);
    255             if (bio) {
    256                 bio_init_from_txn(bio, txn);
    257                 bio = 0;
    258             } else {
    259                 /* todo FREE BUFFER */
    260             }
    261             ptr += sizeof(*txn);
    262             r = 0;
    263             break;
    264         }
    265         case BR_DEAD_BINDER: {
    266             struct binder_death *death = (struct binder_death *)(uintptr_t) *(binder_uintptr_t *)ptr;
    267             ptr += sizeof(binder_uintptr_t);
    268             death->func(bs, death->ptr);
    269             break;
    270         }
    271         case BR_FAILED_REPLY:
    272             r = -1;
    273             break;
    274         case BR_DEAD_REPLY:
    275             r = -1;
    276             break;
    277         default:
    278             ALOGE("parse: OOPS %d\n", cmd);
    279             return -1;
    280         }
    281     }
    282 
    283     return r;
    284 }
    285 
    286 void binder_acquire(struct binder_state *bs, uint32_t target)
    287 {
    288     uint32_t cmd[2];
    289     cmd[0] = BC_ACQUIRE;
    290     cmd[1] = target;
    291     binder_write(bs, cmd, sizeof(cmd));
    292 }
    293 
    294 void binder_release(struct binder_state *bs, uint32_t target)
    295 {
    296     uint32_t cmd[2];
    297     cmd[0] = BC_RELEASE;
    298     cmd[1] = target;
    299     binder_write(bs, cmd, sizeof(cmd));
    300 }
    301 
    302 void binder_link_to_death(struct binder_state *bs, uint32_t target, struct binder_death *death)
    303 {
    304     struct {
    305         uint32_t cmd;
    306         struct binder_handle_cookie payload;
    307     } __attribute__((packed)) data;
    308 
    309     data.cmd = BC_REQUEST_DEATH_NOTIFICATION;
    310     data.payload.handle = target;
    311     data.payload.cookie = (uintptr_t) death;
    312     binder_write(bs, &data, sizeof(data));
    313 }
    314 
    315 int binder_call(struct binder_state *bs,
    316                 struct binder_io *msg, struct binder_io *reply,
    317                 uint32_t target, uint32_t code)
    318 {
    319     int res;
    320     struct binder_write_read bwr;
    321     struct {
    322         uint32_t cmd;
    323         struct binder_transaction_data txn;
    324     } __attribute__((packed)) writebuf;
    325     unsigned readbuf[32];
    326 
    327     if (msg->flags & BIO_F_OVERFLOW) {
    328         fprintf(stderr,"binder: txn buffer overflow\n");
    329         goto fail;
    330     }
    331 
    332     writebuf.cmd = BC_TRANSACTION;
    333     writebuf.txn.target.handle = target;
    334     writebuf.txn.code = code;
    335     writebuf.txn.flags = 0;
    336     writebuf.txn.data_size = msg->data - msg->data0;
    337     writebuf.txn.offsets_size = ((char*) msg->offs) - ((char*) msg->offs0);
    338     writebuf.txn.data.ptr.buffer = (uintptr_t)msg->data0;
    339     writebuf.txn.data.ptr.offsets = (uintptr_t)msg->offs0;
    340 
    341     bwr.write_size = sizeof(writebuf);
    342     bwr.write_consumed = 0;
    343     bwr.write_buffer = (uintptr_t) &writebuf;
    344 
    345     hexdump(msg->data0, msg->data - msg->data0);
    346     for (;;) {
    347         bwr.read_size = sizeof(readbuf);
    348         bwr.read_consumed = 0;
    349         bwr.read_buffer = (uintptr_t) readbuf;
    350 
    351         res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
    352 
    353         if (res < 0) {
    354             fprintf(stderr,"binder: ioctl failed (%s)\n", strerror(errno));
    355             goto fail;
    356         }
    357 
    358         res = binder_parse(bs, reply, (uintptr_t) readbuf, bwr.read_consumed, 0);
    359         if (res == 0) return 0;
    360         if (res < 0) goto fail;
    361     }
    362 
    363 fail:
    364     memset(reply, 0, sizeof(*reply));
    365     reply->flags |= BIO_F_IOERROR;
    366     return -1;
    367 }
    368 
    369 void binder_loop(struct binder_state *bs, binder_handler func)
    370 {
    371     int res;
    372     struct binder_write_read bwr;
    373     uint32_t readbuf[32];
    374 
    375     bwr.write_size = 0;
    376     bwr.write_consumed = 0;
    377     bwr.write_buffer = 0;
    378 
    379     readbuf[0] = BC_ENTER_LOOPER;
    380     binder_write(bs, readbuf, sizeof(uint32_t));
    381 
    382     for (;;) {
    383         bwr.read_size = sizeof(readbuf);
    384         bwr.read_consumed = 0;
    385         bwr.read_buffer = (uintptr_t) readbuf;
    386 
    387         res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
    388 
    389         if (res < 0) {
    390             ALOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));
    391             break;
    392         }
    393 
    394         res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func);
    395         if (res == 0) {
    396             ALOGE("binder_loop: unexpected reply?!\n");
    397             break;
    398         }
    399         if (res < 0) {
    400             ALOGE("binder_loop: io error %d %s\n", res, strerror(errno));
    401             break;
    402         }
    403     }
    404 }
    405 
    406 void bio_init_from_txn(struct binder_io *bio, struct binder_transaction_data *txn)
    407 {
    408     bio->data = bio->data0 = (char *)(intptr_t)txn->data.ptr.buffer;
    409     bio->offs = bio->offs0 = (binder_size_t *)(intptr_t)txn->data.ptr.offsets;
    410     bio->data_avail = txn->data_size;
    411     bio->offs_avail = txn->offsets_size / sizeof(size_t);
    412     bio->flags = BIO_F_SHARED;
    413 }
    414 
    415 void bio_init(struct binder_io *bio, void *data,
    416               size_t maxdata, size_t maxoffs)
    417 {
    418     size_t n = maxoffs * sizeof(size_t);
    419 
    420     if (n > maxdata) {
    421         bio->flags = BIO_F_OVERFLOW;
    422         bio->data_avail = 0;
    423         bio->offs_avail = 0;
    424         return;
    425     }
    426 
    427     bio->data = bio->data0 = (char *) data + n;
    428     bio->offs = bio->offs0 = data;
    429     bio->data_avail = maxdata - n;
    430     bio->offs_avail = maxoffs;
    431     bio->flags = 0;
    432 }
    433 
    434 static void *bio_alloc(struct binder_io *bio, size_t size)
    435 {
    436     size = (size + 3) & (~3);
    437     if (size > bio->data_avail) {
    438         bio->flags |= BIO_F_OVERFLOW;
    439         return NULL;
    440     } else {
    441         void *ptr = bio->data;
    442         bio->data += size;
    443         bio->data_avail -= size;
    444         return ptr;
    445     }
    446 }
    447 
    448 void binder_done(struct binder_state *bs,
    449                  struct binder_io *msg,
    450                  struct binder_io *reply)
    451 {
    452     struct {
    453         uint32_t cmd;
    454         uintptr_t buffer;
    455     } __attribute__((packed)) data;
    456 
    457     if (reply->flags & BIO_F_SHARED) {
    458         data.cmd = BC_FREE_BUFFER;
    459         data.buffer = (uintptr_t) reply->data0;
    460         binder_write(bs, &data, sizeof(data));
    461         reply->flags = 0;
    462     }
    463 }
    464 
    465 static struct flat_binder_object *bio_alloc_obj(struct binder_io *bio)
    466 {
    467     struct flat_binder_object *obj;
    468 
    469     obj = bio_alloc(bio, sizeof(*obj));
    470 
    471     if (obj && bio->offs_avail) {
    472         bio->offs_avail--;
    473         *bio->offs++ = ((char*) obj) - ((char*) bio->data0);
    474         return obj;
    475     }
    476 
    477     bio->flags |= BIO_F_OVERFLOW;
    478     return NULL;
    479 }
    480 
    481 void bio_put_uint32(struct binder_io *bio, uint32_t n)
    482 {
    483     uint32_t *ptr = bio_alloc(bio, sizeof(n));
    484     if (ptr)
    485         *ptr = n;
    486 }
    487 
    488 void bio_put_obj(struct binder_io *bio, void *ptr)
    489 {
    490     struct flat_binder_object *obj;
    491 
    492     obj = bio_alloc_obj(bio);
    493     if (!obj)
    494         return;
    495 
    496     obj->flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
    497     obj->type = BINDER_TYPE_BINDER;
    498     obj->binder = (uintptr_t)ptr;
    499     obj->cookie = 0;
    500 }
    501 
    502 void bio_put_ref(struct binder_io *bio, uint32_t handle)
    503 {
    504     struct flat_binder_object *obj;
    505 
    506     if (handle)
    507         obj = bio_alloc_obj(bio);
    508     else
    509         obj = bio_alloc(bio, sizeof(*obj));
    510 
    511     if (!obj)
    512         return;
    513 
    514     obj->flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
    515     obj->type = BINDER_TYPE_HANDLE;
    516     obj->handle = handle;
    517     obj->cookie = 0;
    518 }
    519 
    520 void bio_put_string16(struct binder_io *bio, const uint16_t *str)
    521 {
    522     size_t len;
    523     uint16_t *ptr;
    524 
    525     if (!str) {
    526         bio_put_uint32(bio, 0xffffffff);
    527         return;
    528     }
    529 
    530     len = 0;
    531     while (str[len]) len++;
    532 
    533     if (len >= (MAX_BIO_SIZE / sizeof(uint16_t))) {
    534         bio_put_uint32(bio, 0xffffffff);
    535         return;
    536     }
    537 
    538     /* Note: The payload will carry 32bit size instead of size_t */
    539     bio_put_uint32(bio, (uint32_t) len);
    540     len = (len + 1) * sizeof(uint16_t);
    541     ptr = bio_alloc(bio, len);
    542     if (ptr)
    543         memcpy(ptr, str, len);
    544 }
    545 
    546 void bio_put_string16_x(struct binder_io *bio, const char *_str)
    547 {
    548     unsigned char *str = (unsigned char*) _str;
    549     size_t len;
    550     uint16_t *ptr;
    551 
    552     if (!str) {
    553         bio_put_uint32(bio, 0xffffffff);
    554         return;
    555     }
    556 
    557     len = strlen(_str);
    558 
    559     if (len >= (MAX_BIO_SIZE / sizeof(uint16_t))) {
    560         bio_put_uint32(bio, 0xffffffff);
    561         return;
    562     }
    563 
    564     /* Note: The payload will carry 32bit size instead of size_t */
    565     bio_put_uint32(bio, len);
    566     ptr = bio_alloc(bio, (len + 1) * sizeof(uint16_t));
    567     if (!ptr)
    568         return;
    569 
    570     while (*str)
    571         *ptr++ = *str++;
    572     *ptr++ = 0;
    573 }
    574 
    575 static void *bio_get(struct binder_io *bio, size_t size)
    576 {
    577     size = (size + 3) & (~3);
    578 
    579     if (bio->data_avail < size){
    580         bio->data_avail = 0;
    581         bio->flags |= BIO_F_OVERFLOW;
    582         return NULL;
    583     }  else {
    584         void *ptr = bio->data;
    585         bio->data += size;
    586         bio->data_avail -= size;
    587         return ptr;
    588     }
    589 }
    590 
    591 uint32_t bio_get_uint32(struct binder_io *bio)
    592 {
    593     uint32_t *ptr = bio_get(bio, sizeof(*ptr));
    594     return ptr ? *ptr : 0;
    595 }
    596 
    597 uint16_t *bio_get_string16(struct binder_io *bio, size_t *sz)
    598 {
    599     size_t len;
    600 
    601     /* Note: The payload will carry 32bit size instead of size_t */
    602     len = (size_t) bio_get_uint32(bio);
    603     if (sz)
    604         *sz = len;
    605     return bio_get(bio, (len + 1) * sizeof(uint16_t));
    606 }
    607 
    608 static struct flat_binder_object *_bio_get_obj(struct binder_io *bio)
    609 {
    610     size_t n;
    611     size_t off = bio->data - bio->data0;
    612 
    613     /* TODO: be smarter about this? */
    614     for (n = 0; n < bio->offs_avail; n++) {
    615         if (bio->offs[n] == off)
    616             return bio_get(bio, sizeof(struct flat_binder_object));
    617     }
    618 
    619     bio->data_avail = 0;
    620     bio->flags |= BIO_F_OVERFLOW;
    621     return NULL;
    622 }
    623 
    624 uint32_t bio_get_ref(struct binder_io *bio)
    625 {
    626     struct flat_binder_object *obj;
    627 
    628     obj = _bio_get_obj(bio);
    629     if (!obj)
    630         return 0;
    631 
    632     if (obj->type == BINDER_TYPE_HANDLE)
    633         return obj->handle;
    634 
    635     return 0;
    636 }
    637